Casciitum Scribe


23

Wprowadzenie

Kaktusy występują w różnych rozmiarach, kształtach i kolorach. Jednak najbardziej charakterystycznym kaktusem i must-have w każdym westernu musi być saguaro . Ważnymi cechami są jego rozmiar i ramiona, które określają stereotypowy wygląd kaktusa.

Twoim zadaniem jest sprowadzenie saguaro do świata ASCII. Jednak - podobnie jak w prawdziwym świecie - żadne saguaro nie jest takie jak inne, więc twój program musi być w stanie generować saguaros z różnymi konfiguracjami ramion.

Przykład saguaro

  • Dane wejściowe: [0b10, 0b11]( [2, 3]dziesiętnie, długość wejściowa 2)
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

Dane techniczne

Saguaro ma zawsze podstawę i górę, a pomiędzy nimi są zmienne ilości łodygi. Części trzonu nie mogą mieć ramion, ramienia po prawej stronie, ramienia po lewej ani dwóch ramion.

Wzorce wzrostu Saguaro podano jako listę wejściową zawierającą wartości dwubitowe. 00oznacza brak ramion, 01ramię po prawej, 10ramię po lewej i 11dwa ramiona (wszystkie w układzie dwójkowym). Długość listy wejściowej określa wysokość saguaro.

Sekcje Saguaro wyglądają następująco. Części kaktusa są otoczone oktorą #, dla jasności, która nie będzie drukowana.
Wysokość saguaro jest zawsze równa 4+6*kznakom dla liczb całkowitych nieujemnych 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
#    | |    #
#############

Wkład

Jak wspomniano wcześniej, dane wejściowe składają się z listy wartości dwubitowych ( 0, 1, 2, 3dziesiętnie). Można go podać w dowolnym rozsądnym formacie. Pierwszy element listy odpowiada najwyższej części pnia saguaro, drugi element do drugiej najwyższej części pnia itp.
Jeśli chcesz, możesz wymagać długości listy danych wejściowych jako dodatkowego wejścia. Jeśli tak, proszę podać to w odpowiedzi.

Wydajność

Twój wyjściowy saguaro ASCII powinien być zbudowany przy użyciu dokładnych części trzpienia, jak opisano powyżej. Końcowe spacje na linii i końcowe nowe linie są ignorowane; możesz wydrukować więcej, mniej lub tyle, ile określono powyżej.

Zasady

  • Standardowe luki zastosowanie
  • Ponieważ jest to , liczba bajtów programu powinna być minimalna

Przypadki testowe

  • Wartość odstająca. Wkład:[0b01, 0b00, 0b01, 0b11]
     _     
    / \    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • Ramiona naprzemienne. Wkład:[0b10, 0b01, 0b10]
     _     
    / \    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |  _ 
    | | / \
    | | | |
    | |_/ /
    |  __/ 
    | /    
 _  | |    
/ \ | |    
| | | |    
\ \_| |    
 \__  |    
    \ |    
    | |    
    | |    

  • Obfitość broni. Wkład:[0b11, 0b11]
     _     
    / \    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
 _  | |  _ 
/ \ | | / \
| | | | | |
\ \_| |_/ /
 \__   __/ 
    \ /    
    | |    
    | |    

  • Żadnych ramion, zwanych także włócznią. Wkład:[0b00]
     _     
    / \    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    
    | |    

  • Żadnego ciała, niektórzy nazywają to młodym kaktusem. Wkład:[]
     _     
    / \    
    | |    
    | |    


czy mogę wziąć dane wejściowe jako liczbę części, a następnie numer każdej części osobno? (np. byłby pierwszy przypadek testowy 4 1 0 1 3)
dzaima

czy możemy zignorować końcowe spacje?
Brian H.,

@dzaima Możesz.
Jonathan Frech,

@BrianH. Tak; końcowe spacje są ignorowane w każdej linii.
Jonathan Frech,

Odpowiedzi:


10

Węgiel , 50 49 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

↘_\¶/

Narysuj górę.

F²«

Pętla po każdej stronie.

J¹¦²

Skocz na prawą stronę góry.

Fθ

Zapętlić każdą część łodygi.

¿﹪÷Iκ⁺¹ι²

Sprawdź, czy jest ramię.

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

Jeśli tak, wydrukuj ramię.

↓⁶

W przeciwnym razie po prostu wydrukuj linię pionową.

↓²

Po wydrukowaniu łodygi wydrukuj podstawę.

‖T

Odbicie gotowe do narysowania drugiej strony. Po narysowaniu obu stron, boki są następnie odbijane z powrotem do ich ostatecznej pozycji.


7

JavaScript (ES6), 210 bajtów

Spędziłem zdecydowanie za dużo czasu na innym rozwiązaniu, zanim zdałem sobie sprawę, że istnieje lepszy sposób, który nie dał mi tyle czasu, ile chciałbym nad tym popracować.

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

Spróbuj

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>


to przy przyjmowaniu literału 00,01,10,11jako danych wejściowych zamiast danych binarnych lub 0,1,2,3. użycie przypadków testowych OP nie powiedzie się.
Brian H.,

@BrianH .: Cytując specyfikację wyzwania na wejściu: „ Można ją podać w dowolnym rozsądnym formacie
Shaggy,

1
ale stwierdza, że ​​„dane wejściowe składają się z listy wartości dwubitowych (0, 1, 2, 3 w systemie dziesiętnym)”. tuż przed tym ... (przy okazji nie przegrywam ani nic, jest to niesamowicie sprytne, po prostu według mojej interpretacji zasad dane wejściowe nie pasują)
Brian H.,


3

Python 2 , 256 253 ... 205 203 199 bajtów

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

Wypróbuj online!


Podobnie jak w przypadku innych literałów łańcuchowych, w pierwszym wierszu możesz pominąć odwrotny ukośnik.
Jonathan Frech,

Wygląda na to, że możesz zaoszczędzić 18 bajtów, usuwając wszystkie spacje końcowe.
Shaggy

for ...:\n r...\n r...-> for ...:r...;r...zapisuje trzy bajty.
Jonathan Frech,

1

PowerShell , 235 bajtów

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

Wypróbuj online!

PowerShell nie ma mapani zipłatwego sposobu na odwrócenie ciągów, więc pozostaje nam coś innego - proste zastąpienie powtarzających się sekcji.

Pierwsze dwa wiersze pobierają dane wejściowe jako tablicę liczb całkowitych i wyprowadzają górę kaktusa. Następnie zapętlamy $ai wybieramy tablicę czterech ciągów w oparciu o bieżącą wartość. Te ciągi są pozostawione na rurociągu, a następnie używamy naszego -replacedo wypełnienia odpowiednich miejsc. Następnie umieszczamy również dno kaktusa na rurociągu.

Wszystko jest gromadzone z potoku i niejawne Write-Outputdzieje się po zakończeniu programu, wstawiając nowy wiersz między każdym elementem.


1

05AB1E , 76 75 bajtów

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

Wypróbuj online!


1
Meh, spróbuję cię pokonać, wątpię w to.
Magic Octopus Urn

@MagicOctopusUrn: Powodzenia! Mam nadzieję, że sobie z tym
poradzisz

Mój jedyny dobry pomysł na pokonanie tego został zmiażdżony przez około 30 bajtów b / c polecenia, które opublikowałem na czacie „oasis / 05AB1E”. Miłego golfa, gdybym spróbował teraz, byłoby to zbyt blisko.
Magic Octopus Urn

1

Java (OpenJDK 8) , 626 566 499 466 398 312 310 308 bajtów

Można grać w golfa za 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");}

Wypróbuj online!


1
Można zapisać 2 bajty, zmieniając {j=e>1;k=e%2>0;n+=(k?" _ |":g)+(j?" | _,":r)+się n+=((k=e%2>0)?" _ |":g)+((j=e>1)?" | _,":r)+i usunięciu zamknięcia }z pętli for również.
Kevin Cruijssen

Masz „zbrojenie” w niewłaściwy sposób dla 1i 2.
Shaggy

0

SOGL V0.12 , 56 54 53 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

..‘                   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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.