Casciitum Scribe


23

Вступ

Кактуси бувають різних розмірів, форм і кольорів. Однак найвідомішим кактусом і обов'язковим у всіх західних має бути сагуаро . Важливими особливостями є його розмір і руки, які визначили вигляд стереотипного кактуса.

Ваше завдання - принести сагуаро у світ ASCII. Однак - як у реальному світі - жоден сагуаро не схожий на інший, тому ваша програма повинна бути здатна генерувати сагуаро з різною конфігурацією зброї.

Приклад сагуаро

  • Введення: [0b10, 0b11]( [2, 3]у десятковій частині, довжина введення 2)
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

Технічні умови

Сагуаро завжди має основу і верх, з різною кількістю стебла між ними. Частини стебла можуть не мати руки, рука справа, одна зліва або дві руки.

Шаблони росту Сагуаро подаються у вигляді вхідного списку, що містить двобітні значення. 00означає відсутність руки, 01рука праворуч, 10рука зліва та 11дві руки (усі у двійковій). Довжина списку входів визначає висоту сагуаро.

Розділи Сагуаро виглядають наступним чином. Частини кактуса оточені октоторпами #, для наочності не слід друкувати.
Висота сагуаро завжди дорівнює 4+6*kсимволам для негативних цілих чисел 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
#    | |    #
#############

Вхідні дані

Як було сказано раніше, вхід складається із списку двобітних значень ( 0, 1, 2, 3у десятковій кількості). Він може бути наданий у будь-якому розумному форматі. Перший елемент списку відповідає найвищій стовбуровій частині saguaro, другий елемент - його другій найвищій стовбуровій частині і т. Д.
Якщо потрібно, ви можете вимагати довжини списку введення як додатковий вхід. Будь ласка, вкажіть це у своїй відповіді, якщо ви це зробите.

Вихід

Ваш вихід ASCII saguaro повинен бути побудований з використанням точних деталей стебла, як описано вище. Проміжки проміжку на рядку та нові нові лінії ігноруються; ви можете надрукувати більше, менше або стільки, скільки зазначено вище.

Правила

  • Застосовуються стандартні лазівки
  • Оскільки , кількість байтів програми повинна бути мінімальною

Тестові справи

  • Чужа людина. Вхід:[0b01, 0b00, 0b01, 0b11]
     _     
    / \    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • Чергові руки. Вхід:[0b10, 0b01, 0b10]
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |    
    | |    

  • Достаток зброї. Вхід:[0b11, 0b11]
     _     
    / \    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • Без зброї, також відомий як спис. Вхід:[0b00]
     _     
    / \    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    

  • Жодного тіла, деякі називають це молодим кактусом. Вхід:[]
     _     
    / \    
    | |    
    | |    


чи можу я взяти вхід як кількість деталей, а потім кожну частину кількість окремо? (наприклад, перший тестовий випадок 4 1 0 1 3)
dzaima

Чи можемо ми проігнорувати пробіли?
Брайан Х.

@dzaima Ви можете.
Джонатан Фрех

@BrianH. Так; проміжки пробігу ігноруються в кожному рядку.
Джонатан Фрех

Відповіді:


10

Вугілля деревне , 50 49 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

↘_\¶/

Намалюйте верх.

F²«

Петлю поперек з кожної сторони.

J¹¦²

Перейти до правої частини верху.

Fθ

Петлю над кожною частиною стебла.

¿﹪÷Iκ⁺¹ι²

Перевірте, чи є рука.

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

Якщо так, надрукуйте руку.

↓⁶

В іншому випадку просто надрукуйте вертикальну лінію.

↓²

Віддрукувавши стебло, роздрукуйте основу.

‖T

Відбийте готові намалювати іншу сторону. Після того як обидві сторони намальовані, сторони потім відбиваються назад у своє остаточне положення.


7

JavaScript (ES6), 210 байт

Я занадто довго витратив на інше рішення, перш ніж зрозумів, що є кращий шлях, який не залишив мені стільки часу, як я хотів би працювати над цим.

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

Спробуй це

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>


це в прийнятті Літерал в 00,01,10,11якості вхідних даних, а довічного входу або 0,1,2,3. використання тестових випадків ОП це не вдається.
Брайан Х.

@BrianH .: Цитуючи специфікацію виклику на вході: " Її можна дати в будь-якому розумному форматі "
Shaggy

1
але вказується, що "вхід складається з списку двобітних значень (0, 1, 2, 3 у десятковій кількості)". безпосередньо перед цим ... (btw im notvovoting or anythin; це шалено розумно, це просто те, що в моєму трактуванні правил введення не відповідає)
Brian H.


3

Python 2 , 256 253 ... 205 203 199 байт

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

Спробуйте в Інтернеті!


Як і в інших літеральних рядках, у першому рядку ви можете опустити нахил, що проходить.
Джонатан Фрех

Схоже, ви можете зберегти 18 байт, видаливши всі пробіли.
Кудлатий

for ...:\n r...\n r...-> for ...:r...;r...зберігає три байти.
Джонатан Фрех

1

PowerShell , 235 байт

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

Спробуйте в Інтернеті!

PowerShell не має mapабо zipабо реальний простий спосіб звернути назад рядки, так що ми залишилися з чим - то ще - простою заміною повторюваних секцій.

Перші два рядки приймають введення як масив цілих чисел і виводять верхню частину кактуса. Потім ми перебираємо $aі вибираємо в масив з чотирьох рядків на основі поточного значення. Ці струни залишаються на конвеєрі, а потім ми використовуємо нашу, -replaceщоб заповнити відповідні місця. Потім також кладемо дно кактуса на трубопровід.

Все збирається з конвеєра і неявне Write-Outputвідбувається під час завершення програми, вставляючи нову лінію між кожним елементом.


1

05AB1E , 76 75 байт

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

Спробуйте в Інтернеті!


1
Мех, я намагаюся побити тебе, все ж сумнівайся.
Magic Octopus Urn

@MagicOctopusUrn: Удачі! Сподіваюсь, вам це вдасться (і, можливо, перетворите це на сутичку: P)
Emigna

Моя одна гарна ідея перемогти це була розбита приблизно на 30 байт b / c команди, яку я розмістив у чаті "oasis / 05AB1E". Хороший гольф, якби я спробував зараз, він був би занадто близько.
Чарівна восьминога урна

1

Java (OpenJDK 8) , 626 566 499 466 398 312 310 308 байт

Можна покататися на тоні

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");}

Спробуйте в Інтернеті!


1
Ви можете зберегти 2 байти, змінюючи {j=e>1;k=e%2>0;n+=(k?" _ |":g)+(j?" | _,":r)+до n+=((k=e%2>0)?" _ |":g)+((j=e>1)?" | _,":r)+і видалення закриття }цього для петлі , а також.
Kevin Cruijssen

У вас "озброєння" неправильний шлях "для 1та 2.
Shaggy

0

SOGL V0.12 , 56 54 53 байт

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

Спробуйте тут!

Пояснення:

..‘                   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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.