Писец Кашитум


23

Введение

Кактусы бывают разных размеров, форм и цветов. Тем не менее, самым знаковым кактусом и обязательным элементом в каждом западном регионе должен быть сагуаро . Важными особенностями являются его размер и руки, которые определили стереотипный внешний вид кактуса.

Ваша задача - принести сагуаро в мир ASCII. Однако, как и в реальном мире, ни один saguaro не похож на другой, поэтому ваша программа должна иметь возможность генерировать saguaros с различными конфигурациями рук.

Пример сагуаро

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

Характеристики

У сагуаро всегда есть основание и верх, с переменным количеством ствола между ними. У частей стебля не может быть рук, рука справа, одна слева или две руки.

Модели роста Saguaro представлены в виде входного списка, содержащего двухбитовые значения. 00означает отсутствие рук, 01руку справа, 10руку слева и 11две руки (все в двоичном виде). Длина списка ввода определяет высоту saguaro.

Разделы Saguaro выглядят следующим образом. Части кактуса окружены октоторпами, #для ясности, которые не должны быть напечатаны.
Высота сагуаро всегда равна 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]
     _     
    / \    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    

  • Нет тела, некоторые называют это молодым кактусом. Входные данные:[]
     _     
    / \    
    | |    
    | |    


Могу ли я принять входные данные в качестве количества частей, а затем каждой части номер отдельно? (например, 1-й тест-кейс 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. с использованием тестовых случаев OP это не удается.
Брайан Х.

@BrianH .: Цитировать спецификацию на входе: « Она может быть предоставлена ​​в любом разумном формате »
Shaggy

1
но в нем говорится: «вход состоит из списка двухбитовых значений (0, 1, 2, 3 в десятичном виде)». прямо перед этим ... (кстати, я не понизил голосование или что-нибудь еще, это безумно умно, просто в соответствии с моей интерпретацией правил входные данные не совпадают)
Брайан Х.


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
Мех, я попытаюсь победить тебя, хотя сомневаюсь в этом.
Волшебная Урна Осьминога

@MagicOctopusUrn: Удачи! Надеюсь, вы
справитесь

Моя единственная хорошая идея, чтобы победить это, была подавлена ​​примерно 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)+и удалению закрытия }этого для петли , а также.
Кевин Круйссен,

У вас есть «руки» неправильный путь «вокруг для 1и 2.
Лохматый

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.