Tantangan
Program atau fungsi Anda akan menerima input string tunggal dari STDIN atau parameter fungsi. Anda dapat berasumsi bahwa input hanya akan berisi karakter alfabet (a-zA-Z), spasi, dan pemberhentian penuh. Input tidak peka huruf besar kecil, jadi Anda harus memperlakukan 'a' persis sama dengan Anda memperlakukan 'A'.
Untuk setiap karakter dalam string, Anda akan menampilkan representasi bangunan sesuai spesifikasi berikut.
Setiap bangunan harus memiliki atap, yang ditandai dengan garis bawah pada baris atas, kemudian garis miring, spasi, garis miring terbalik pada baris kedua.
_
/ \
Anda kemudian akan memiliki sejumlah lantai, cocok dengan nomor huruf (a = 1, b = 2, c = 3 dll) yang diwakili oleh dinding (|) di setiap sisi dan ruang di tengah. Lantai bawah (dan hanya lantai bawah) harus memiliki fondasi, yang merupakan garis bawah antara dinding. Seperti ini...
|_|
Jadi misalnya, 'b' akan terlihat seperti ini
_
/ \
| |
|_|
Sekarang, kita tahu bahwa bangunan yang sangat tinggi, sempit tidak dapat berdiri dan harus melebar di pangkalan, sehingga tidak ada bangunan yang dapat berdiri lebih dari tiga lantai tanpa dukungan tambahan. Jadi setiap tiga level (tidak kurang) Anda harus menambahkan 'pelebaran layer'. Lapisan pelebaran terdiri dari garis miring dan garis miring terbalik tepat di atas dinding bagian di bawahnya, dan bagian di bawah ini harus dua ruang lebih luas dari bagian di atas. Lapisan tambahan tidak dihitung terhadap ketinggian bangunan.
Bangunan tidak boleh tumpang tindih tetapi tidak boleh memiliki ruang yang tidak perlu di antara mereka, dan tanah selalu datar sehingga semua bangunan harus memiliki dasar pada tingkat yang sama.
Misalnya, 'abcdefga' akan terlihat seperti ini.
_
/ \
_ | |
_ / \ | |
_ / \ | | | |
/ \ | | | | / \
_ | | | | | | | |
_ / \ | | | | / \ | |
_ / \| | | | / \| | | | _
/ \| || |/ \| || |/ \/ \
|_||_||_||___||___||___||_____||_|
Spasi dalam input string harus diwakili oleh spasi ganda.
Pemberhentian penuh pada input string harus diwakili oleh puing-puing seperti ini.
/\/\
Contoh lebih lanjut
Input = Hello world.
Output =
_
/ \
| |
| |
| |
/ \
| |
| | _
| | / \
/ \ | |
| | | |
_ | | _ | |
/ \ | | / \ / \
| | / \ | | | |
| | | | | | | |
_ _ | | | | | | | | _
/ \ / \ / \ | | / \ / \ / \
| | | | | | / \ | | | | | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
_ / \ / \ / \ | | / \ / \ / \
/ \ | | | | | | / \ | | | | | |
| | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | |
| | _ / \ / \ / \ | | / \ / \ / \
/ \ / \ | | | | | | / \ | | | | | | _
| | | | | | | | | | | | | | | | | | / \
| | | | | | | | | | | | | | | | | | | |
| | | | / \/ \/ \ | | / \/ \/ \ | |
/ \/ \| || || | / \| || || | | |
| || || || || | | || || || |/ \
|_____||___||_______||_______||_________| |_______________||_________||___________||_______||___|/\/\
Input = lorem ipsum
_
/ \
_ | |
/ \ | |
_ | | | |
/ \ | | / \
| | _ | | | |
| | / \ / \ | |
_ | | | | | | | |
/ \ / \ | | | | / \
| | | | _ | | | | | | _
| | | | / \ / \ / \ | | / \
_ | | | | | | | | | | | | | |
/ \ / \ / \ | | | | | | / \ | |
| | | | | | | | | | | | | | | |
| | | | | | / \ / \ / \ | | / \
| | | | | | | | _ | | | | | | | |
/ \ / \ / \ | | / \ | | | | / \ | |
| | | | | | | | | | | | | | | | | |
| | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | |
/ \ / \ / \ _ | | / \ | | | | / \ | |
| | | | | | / \ | | | | | | | | | | | |
| | | | | | | | / \ | | / \ / \ | | / \
| | | | | | | | | | | | | | | | | | | |
/ \/ \/ \ | | | | / \ | | | | / \ | |
| || || |/ \ | | | | | | | | | | | |
| || || || |/ \ | |/ \/ \| |/ \
|_______||_________||___________||___||_________| |_____||___________||_____________||_____________||_________|
Input = a.a.a.x.x.x.a.a.a
_ _ _
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
| | | | | |
| | | | | |
| | | | | |
/ \ / \ / \
_ _ _ | | | | | | _ _ _
/ \ / \ / \ | | | | | | / \ / \ / \
|_|/\/\|_|/\/\|_|/\/\|_______________|/\/\|_______________|/\/\|_______________|/\/\|_|/\/\|_|/\/\|_|
Aturan
- Tentu saja ini golf kode, skor terendah dalam byte menang
- Aturan celah standar berlaku
- Sejumlah baris kosong tambahan sebelum atau setelah output diizinkan
- Anda dapat memilih untuk output seluruh hasil dalam satu string atau menawarkan output sebagai array di mana setiap elemen mewakili satu baris output, atau kirim ke STDOUT
Catatan
Ini adalah posting pertama saya ke PPCG, jadi silakan saja. Sudah melalui kotak pasir. Setiap poin negatif atau perbaikan yang mungkin, silakan posting sebagai komentar dan saya akan melakukan apa yang saya bisa
[a,z]
dan[A,Z]
untuk[1,26]
sepertinya persyaratan sia-sia. Akan jauh lebih baik menggunakan daftar integer sebagai input (setelah0
menjadi input untuk puing-puing). Juga, memposting tantangan Anda setelah berada di Sandbox hanya selama 21 jam , tanpa menunggu untuk mendapatkan suara atau umpan balik dari lebih dari satu pengguna, tidak dihitung karena telah "melalui kotak pasir". Disarankan untuk meninggalkan tantangan di Sandbox setidaknya selama 48-72 jam, untuk memberi orang banyak waktu untuk meninjaunya.[a,z]
,[1.26]
bagian yang disebutkan Mego. Pilihan opsional sering kali merupakan yang terbaik (kecuali jika itu adalah bagian penting dari tantangan (tidak ada di sini)Jawaban:
JavaScript (ES6),
330326...315309 byteMembangun seni ASCII secara rekursif, dimulai dengan lantai dasar dan menerapkan beberapa ekspresi reguler antara setiap tahap:
Bagaimana itu bekerja
1) Lantai bawah
Kami mulai dengan menerjemahkan string input ke lantai bawah seperti:
dimana:
y
adalah alias yang lebih pendek untuk backslash (yang membutuhkan pelarian)0
,1
atau2
) tepat sebelum urutan_
adalah dinding kiri bangunan. Ini mewakili jumlah dinding yang harus ditempatkan di atasnya sebelum 'pelebaran lapisan' berikutnya._
adalah dinding kanan bangunan dan selalu ditetapkan0
.2) Ekspresi reguler diterapkan antara setiap tahap
Proses rekursif terdiri dari menerapkan 9 penggantian di lantai sebelumnya, menggunakan ekspresi reguler berikut:
/\/y/g
=>" "
(hapus puing-puing)/_/g
=>"x"
(ganti fondasi atau bagian atas bangunan dengan balok padat)/\/xy/g
=>" _ "
(ganti layer pelebaran terakhir dengan bagian atas bangunan)/1/g
=>"3"
(ganti sementara1
dengan3
- lihat langkah terakhir)/2/g
=>"1"
(ganti2
dengan1
)/\/xx(x+)y/g
=>" 2$10 "
(ganti layer pelebaran dengan dinding baru yang lebih sempit)/0(x+)0/g
=>"/$1y"
(ganti bagian atas dinding dengan lapisan pelebaran)/3/g
=>"0"
(ganti3
dengan0
)Misalnya, berikut adalah transformasi berturut-turut dari
2___0
(lantai bawah yang dihasilkan oleh a'f'
):NB : Bagian atas gedung kemudian diganti dengan a
x
. Ini tidak ditunjukkan pada diagram di atas.3) Ekspresi reguler diterapkan pada hasil akhir
Rekursi berhenti ketika tidak ada lagi yang bisa diganti, yang berarti bahwa kita berada di atas puncak gedung tertinggi.
Kita sekarang perlu membersihkan semuanya dengan beberapa ekspresi reguler:
/\d/g
=>"|"
(ganti digit dengan pipa)/x/g
=>" "
(ganti blok padat dengan spasi)/y/g
=>"\"
(gantiy
dengan garis miring terbalik)Contohnya:
Demo
Kontributor:
4 byte disimpan berkat Hedi
8 byte disimpan berkat Tidak, Charles
sumber
.charCodeAt()
.new
dinew RegExp(e,'g')
y
itu yang tidak memerlukan pelarian untuk tebasan depan Anda. 2. jika Anda menggunakan_
untuk lantai dasar, Anda masih dapat membedakan atas dengan regex:/_ /
.PHP,
386376367364362358356 bytependekatan pertama; mungkin masih bisa golf.
PHP,
366362361360357 bytependekatan serupa dengan subfungsi:
gangguan untuk pendekatan kedua
+16 byte jika baris baru tidak diizinkan:
Ganti
echo"$o[$y]\n;
denganif($s=rtrim($o[$y]))echo"$s\n";
.-3 byte untuk sembarang
;<=>?[\]^_{|}~
puing: Ganti 1)($n=31&ord($c))
dengan$n
, 2)$n=28,$w='.'!=$c
dengan($n=31&ord($c))<27
dan 3)4
dengan($n=28)/7
.Lain -8 untuk
>
,^
atau~
sebagai puing-puing: Undo 3)sumber
if(!$n){$o[$y++].=str_pad(_,$w," ",2);}
-2 Bytes untuk kurungfor($y=36;$y--;)echo"$o[$y]\n";
; tapi saya punya pendekatan baru yang menyimpan 2 byte lainnya.use
hanya berfungsi untuk fungsi anonim. itu akan menghemat 2 byte; tapi saya harus menyimpan fungsi itu dalam variabel$a=
alih-alih memberinya nama (+3 byte) dan menambahkan$
ke masing-masing dari empat panggilan.Pyth,
9379 byteCobalah online. Suite uji.
Penjelasan
Saya menyembunyikannya secara default karena terlalu lama.
Tampilkan cuplikan kode
sumber
Perl,
147146 byteTermasuk +1 untuk
-p
Jalankan dengan input pada STDIN, mis
citysky.pl
:Bekerja seperti yang ditunjukkan, tetapi ganti
\xhh
lolos dengan nilai literal mereka untuk mendapatkan skor yang diklaim. Anda dapat melakukannya menggunakan perintah ini:Saya belum benar-benar menjelajahi pendekatan lain, jadi ini mungkin sangat bisa dikalahkan ...
sumber
Haskell, 289 byte
sumber
Ruby, 245
Anda mengizinkan baris baru tambahan sebanyak yang Anda inginkan, jadi saya mengambil kebebasan dengan itu. Selain itu, prosesnya adalah sebagai berikut:
a
.a[0]
/\/\
kea[0]
c.upcase.ord + (c.upcase.ord-1)/3
)a
:a[t]+=w*(a[0].size-a[t].size)
h
, pusat a_
| |
atau/ \
lebar yang tepat (1+2*((h-t)/4
), tergantung pada apakahh-t%4==0
"|___|"
lebar kanan kea[0]
a.reverse
Saya yakin saya bisa membuatnya lebih kecil jika saya menghitung matematika untuk menghindari
reverse
sumber
PHP, 297 byte
Versi yang lebih mudah dibaca:
sumber