Juru tulis Casciitum

23

pengantar

Cacti tersedia dalam berbagai ukuran, bentuk dan warna. Namun, kaktus yang paling ikonik dan harus dimiliki di setiap negara Barat haruslah saguaro . Fitur penting adalah ukuran dan lengannya, yang telah menentukan penampilan kaktus stereotip.

Tugas Anda adalah membawa saguaro di dunia ASCII. Namun, - seperti di dunia nyata - tidak ada saguaro seperti yang lain, sehingga program Anda harus dapat menghasilkan saguaros dengan berbagai konfigurasi lengan.

Contoh saguaro

  • Input: [0b10, 0b11]( [2, 3]dalam desimal, panjang input 2)
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

Spesifikasi

Saguaro selalu memiliki dasar dan puncak, dengan jumlah variabel batang di antaranya. Bagian batang tidak memiliki lengan, lengan di kanan, satu di kiri atau dua lengan.

Pola pertumbuhan Saguaro diberikan sebagai daftar input yang berisi nilai dua-bit. 00berarti tidak ada lengan, 01lengan di sebelah kanan, 10lengan di sebelah kiri dan 11dua lengan (semuanya dalam biner). Panjang daftar input menentukan tinggi saguaro.

Bagian Saguaro terlihat seperti berikut. Bagian kaktus dikelilingi oleh octothorps #, untuk kejelasan yang tidak akan dicetak.
Tinggi saguaro selalu sama dengan 4+6*kkarakter untuk bilangan bulat tidak negatif k.

#############
#     _     # Saguaro top
#    / \    #
#############
# _  | |  _ # Stem, both arms
#/ \ | | / \# Stem id: 11
#| | | | | |#
#\ \_| |_/ /#
# \__   __/ #
#    \ /    #
#############
# _  | |    # Stem, left arm
#/ \ | |    # Stem id: 10
#| | | |    #
#\ \_| |    #
# \__  |    #
#    \ |    #
#############
#    | |  _ # Stem, right arm
#    | | / \# Stem id: 01
#    | | | |#
#    | |_/ /#
#    |  __/ #
#    | /    #
#############
#    | |    # Stem, no arms
#    | |    # Stem id: 00
#    | |    #
#    | |    #
#    | |    #
#    | |    #
#############
#    | |    # Saguaro base
#    | |    #
#############

Memasukkan

Seperti yang dikatakan sebelumnya, input terdiri dari daftar nilai dua-bit ( 0, 1, 2, 3dalam desimal). Itu dapat diberikan dalam format apa pun yang masuk akal. Elemen pertama daftar sesuai dengan bagian batang tertinggi saguaro, elemen kedua ke bagian batang tertinggi kedua, dll.
Jika Anda mau, Anda bisa memerlukan panjang daftar input sebagai input tambahan. Silakan tentukan dalam jawaban Anda jika Anda melakukannya.

Keluaran

Saguaro ASCII keluaran Anda harus dibangun menggunakan bagian-bagian batang yang tepat seperti dijelaskan di atas. Mengejar ruang pada garis dan mengikuti garis baru diabaikan; Anda dapat mencetak lebih banyak, lebih sedikit atau sebanyak yang ditentukan di atas.

Aturan

Uji kasus

  • Pencilan. Memasukkan:[0b01, 0b00, 0b01, 0b11]
     _     
    / \    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • Lengan bergantian. Memasukkan:[0b10, 0b01, 0b10]
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |    
    | |    

  • Banyaknya senjata. Memasukkan:[0b11, 0b11]
     _     
    / \    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • Tanpa lengan, juga dikenal sebagai tombak. Memasukkan:[0b00]
     _     
    / \    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    

  • Tidak ada tubuh, beberapa menyebutnya kaktus muda. Memasukkan:[]
     _     
    / \    
    | |    
    | |    

Jonathan Frech
sumber
dapatkah saya mengambil input sebagai jumlah bagian dan kemudian setiap nomor bagian secara terpisah? (mis. 4 1 0 1 3
Kaset
dapatkah kita mengabaikan spasi tambahan?
Brian H.
@ azza Anda mungkin.
Jonathan Frech
@BrianH. Iya nih; spasi tambahan diabaikan pada setiap baris.
Jonathan Frech

Jawaban:

10

Arang , 50 49 byte

↘_\¶/F²«J¹¦²Fθ¿﹪÷Iκ⁺¹ι²”{➙∧⊟≕δaL7YF¬⊕ρ↥↖_K”↓⁶↓²‖T

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

↘_\¶/

Gambarlah bagian atas.

F²«

Lingkarkan di setiap sisi.

J¹¦²

Lompat ke tepat di bawah sisi kanan atas.

Fθ

Lingkari setiap bagian batang.

¿﹪÷Iκ⁺¹ι²

Uji apakah ada lengan.

”{➙∧⊟≕δaL7YF¬⊕ρ↥↖_K”

Jika demikian cetak lengan.

↓⁶

Kalau tidak, cukup cetak garis vertikal.

↓²

Setelah mencetak batang, cetak alasnya.

‖T

Pantulkan siap untuk menggambar sisi lain. Setelah kedua sisi ditarik, kedua sisi kemudian dipantulkan kembali ke posisi akhir mereka.

Neil
sumber
7

JavaScript (ES6), 210 byte

Saya menghabiskan terlalu lama untuk solusi lain sebelum menyadari ada cara yang lebih baik, yang tidak meninggalkan saya waktu sebanyak yang saya suka untuk mengerjakan ini.

a=>`     _
    / \\`+a.map(([x,y])=>`
 1  | |  2
3 5 | | 4 6
7 7 | | 8 8
5 51| |24 4
 511${`| `[x]} ${`| `[y]}224
    ${`|\\`[x]} `.replace(/\d/g,m=>` _/\\|`[m%2?x*-~m/2:y*m/2])+`|/`[y],s=`
    | |`).join``+s+s

Cobalah

o.innerText=(f=
a=>`     _
    / \\`+a.map(([x,y])=>`
 1  | |  2
3 5 | | 4 6
7 7 | | 8 8
5 51| |24 4
 511${"| "[x]} ${"| "[y]}224
    ${"|\\"[x]} `.replace(/\d/g,m=>` _/\\|`[m%2?x*-~m/2:y*m/2])+"|/"[y],s=`
    | |`).join``+s+s
)(i.value=["11","10","01","00"]);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>

Shaggy
sumber
ini dalam mengambil literal 00,01,10,11sebagai input, bukan input biner atau 0,1,2,3. menggunakan OP test cases ini gagal.
Brian H.
@BrianH .: Mengutip spec tantangan pada input: " Ini dapat diberikan dalam format yang masuk akal "
Shaggy
1
tetapi menyatakan "input terdiri dari daftar nilai dua-bit (0, 1, 2, 3 dalam desimal)." tepat sebelum itu ... (btw saya tidak downvoting atau anythin, ini gila pintar, hanya saja menurut interpretasi saya tentang aturan input tidak cocok)
Brian H.
5

Python 2 , 189 byte

lambda l:'     _\n    / \\\n'+'\n'.join(('    |',' /|\  _   \  \|\_    __ |||| \\'[j::6])[i/2]+' '+('|','|||| /   __  /|/_ _   /  \|/'[j::6])[i%2]for i in l for j in range(6))+'\n    | |'*2

Cobalah online!

Erik the Outgolfer
sumber
3

Python 2 , 256 253 ... 205 203 199 byte

r=[('     _',''),('/','\ ')]
for a in input()+[0]:r+=zip(*[['|'*6,'_|    |_,,/|  \/  |\,,||  ||  ||,,\| _\/_ |/,,\ ____ /,,\/'[i::2].split(',')][2-i&a>0]for i in 0,1])
for l in r[:-4]:print'%5s %s'%l

Cobalah online!

TFeld
sumber
Seperti yang Anda lakukan pada string literal lainnya, pada baris pertama Anda dapat menghilangkan garis miring terbalik yang keluar.
Jonathan Frech
Sepertinya Anda bisa menghemat 18 byte dengan menghapus semua spasi tambahan.
Shaggy
for ...:\n r...\n r...-> for ...:r...;r...menghemat tiga byte.
Jonathan Frech
1

PowerShell , 235 byte

param($a)'     _
    / \'
($a|%{((,'1|'*6),('1|  _
1| / \
1|2
1|_/ /
1 __/ 
1/'),(' _ 2
/ \2
| |2
\ \_| |
 \__  |
    \ |'),(' _ 2  _
/ \2 / \
| |22
\ \_| |_/ /
 \__   __/
    \ /'))[$_]})-replace1,'    | '-replace2,' | |'
,'    | |'*2

Cobalah online!

PowerShell tidak memiliki mapatau zipatau cara yang sangat mudah untuk membalikkan string, jadi kita pergi dengan sesuatu yang lain - penggantian sederhana bagian berulang.

Dua baris pertama mengambil input sebagai array bilangan bulat dan menampilkan bagian atas kaktus. Kemudian kita loop through $adan memilih ke dalam array empat string berdasarkan pada nilai saat ini. Senar-senar itu tertinggal di pipa dan kemudian kita gunakan -replaceuntuk mengisi tempat yang sesuai. Kami kemudian meletakkan bagian bawah kaktus ke dalam pipa juga.

Semuanya dikumpulkan dari pipeline dan sebuah implisit Write-Outputterjadi pada penyelesaian program, menyisipkan baris baru di antara setiap elemen.

AdmBorkBork
sumber
1

05AB1E , 76 75 byte

„ _…/ \‚4ú»,v6F'|4ú"_ |/\"•Aö¡Èèj{^ë•5вèJ5ôNè©‚y1›èð'|®∞2äθ‚yÉèJ,}}„| 4úû=,

Cobalah online!

Emigna
sumber
1
Meh, aku mencoba untuk mengalahkanmu, meragukannya.
Magic Octopus Guci
@MagicOctopusUrn: Semoga beruntung! Harap Anda mengelolanya (dan mungkin mengubahnya menjadi pertempuran kecil: P)
Emigna
Satu ide bagus saya untuk mengalahkan ini tergencet seperti 30 byte b / c dari perintah yang saya posting di obrolan "oasis / 05AB1E". Golf yang bagus, jika saya coba sekarang pasti terlalu dekat.
Magic Octopus Guci
1

Java (OpenJDK 8) , 626 566 499 466 398 312 310 308 byte

Dapat bermain golf satu ton

a->{String r=" |,",g="    |",n="     _,    / \\,";boolean j,k;for(int e:a)n+=((k=e>1)?" _  |":g)+((j=e%2>0)?" |  _,":r)+(k?"/ \\ |":g)+(j?" | / \\,":r)+(k?"| | |":g)+(j?" | | |,":r)+(k?"\\ \\_|":g)+(j?" |_/ /,":r)+(k?" \\__ ":g)+(j?"  __/,":r)+(k?"    \\":g)+(j?" /,":r);return(n+g+r+g+r).replace(",","\n");}

Cobalah online!

Roberto Graham
sumber
1
Anda dapat menyimpan 2 byte dengan mengubah {j=e>1;k=e%2>0;n+=(k?" _ |":g)+(j?" | _,":r)+ke n+=((k=e%2>0)?" _ |":g)+((j=e>1)?" | _,":r)+dan menghapus penutupan }dari untuk loop juga.
Kevin Cruijssen
Anda memiliki "lengan" yang salah untuk 1dan 2.
Shaggy
0

SOGL V0.12 , 56 54 53 byte

5⁷yΙ‚‘∑≡`a#¾‘O.{@.2%i»¹{"⁸G‘6∙;?X"j1>ζ╔²i[n¹‘5n}┼±↔}O

Coba Di Sini!

Penjelasan:

..‘                   push the ending part - "    | |\n    | |"
   ..‘O               output the starting part - "     _ \n    / \"
       .{             input times do
         @              push a space
          .2%           push input%2
             i»         push floor(prevInput/2)
               ¹        wrap the two in an array

{                   }   for each of the two numbers
 "..‘                     push "|    " - base stem
     6∙                   multiply vertically 6 times
       ;?       }         if the current item iterating over is truthy (i.e. != 0)
         X                  remove ToS - the regular stem - from the stack 
          "..‘              push "|  _ | / \| | ||_/ / __/ /    " - stem with an arm
              5n            split it into line lengths of 5
                 ┼        add that horizontally to the space pushed earlier (or whatever it's become)
                  ±↔      reverse ToS - the stem currently - horizontally
                     O  output the array of the current part
dzaima
sumber