Quack the Angry Duck

56

Nikt nie jest pewien, co ma reprezentować emotikon >:U, ale wielu uczonych uważa, że ​​wygląda jak wściekła kaczka . Załóżmy, że tak jest.

Zadanie

Biorąc pod uwagę liczbę całkowitą n od 0 do 3 włącznie, wydrukuj lub zwróć

quack

jeśli n = 0,

>:U

jeśli n = 1,

     U   U
>  : U   U
 >   U   U
>  : U   U
      UUU

jeśli n = 2 lub

                  >:U         >:U
>:U               >:U         >:U
   >:U       >:U  >:U         >:U
      >:U         >:U         >:U
         >:U      >:U         >:U
      >:U         >:U         >:U
   >:U       >:U  >:U         >:U
>:U               >:U         >:U
                     >:U>:U>:U

jeśli n = 3.

Możesz założyć, że dane wejściowe będą zawsze prawidłowe. Wyjście nie powinno zawierać wiodącej przestrzeni, ale dowolna ilość końcowego miejsca jest w porządku. Kaczki (z możliwym wyjątkiem @cobaltduck) nie tolerują luk. Najkrótszy kod w bajtach wygrywa.

Alex A.
źródło
90
Najpierw myślałem „hę, co to jest kaczka?”. Na szczęście podałeś link do strony wikipedii.
Adnan
6
„Kaczki nie tolerują luk”. Ale jesteś ptakiem, a nie kaczką, czy to oznacza, że ​​możemy korzystać z luk? : P
Downgoat
6
@Downgoat Nope. Również ta edycja była całkowicie niepotrzebna, więc wycofałem ją.
Alex A.,
6
@Downgoat s /: P />: U /
ETHproductions
7
„Kaczki nie tolerują luk”. To, mój przyjacielu, jest niebezpieczny stereotyp. Gdybym nie znał twoich zamiarów, mógłbym się obrazić.
cobaltduck

Odpowiedzi:

19

CJam, 108 90 85 bajtów

"quack"">:U":D"scT¦{$ì"{269b22bSf*D}:F~[ZYB].*s.+s5/"ÿ3nÜïS{JÐø¦yûn"F*33/z]ri=zN*

Pamiętaj, że niektórych znaków nie można wydrukować. Wypróbuj online!

tło

Pierwsze dwa wyjścia są nieściśliwe w CJam.

Kompresowanie ostatniego wyjścia jest proste. Po usunięciu wszystkich linii, możemy podzielić powstały ciąg w wystąpieniach >:Ui obliczyć długość każdego wynikowego ciągu spacji.

To powoduje tablicę

[18 9 0 15 9 3 7 2 9 6 9 9 9 6 9 6 9 9 3 7 2 9 0 15 9 21 0 0 0]

które możemy skutecznie przechowywać, przekształcając je z bazy 22 w bazę 269, uzyskując cyfry

[255 12 51 110 220 239 83 123 74 208 248 166 121 251 110 17]

Ponieważ każda cyfra jest mniejsza niż 256 , możemy ją zapisać jako pojedynczy bajt.

Wreszcie kompresowanie trzeciego wyjścia staje się łatwiejsze, jeśli transponujemy linie i kolumny:

 > > 
  >  

 : : 

UUUU 
    U
    U
    U
UUUU

Licząc jeszcze raz spacje między znakami spacjami, otrzymujemy tablicę

[1 1 3 8 1 6 0 0 0 5 4 4 0 0 0 0 0]

który staje się

[115 159 99 84 166 123 36 236 6]

po transkodowaniu z bazy 22 do bazy 269.

Jak to działa

"quack"   e# Push the first output.

">:U":D   e# Push the second output, and save it in D.

e# Push [115 159 99 84 166 123 36 236 6] as bytes.

"scT¦{$ì"

{         e# Define a code block:
  269b22b e#   Transcode from base 269 to base 22.
  Sf*     e#   Replace each digit with a string of that many spaces.
  D       e#   Push D.
}         e#
:F~       e# Save the block in F. Execute it.
[ZYB]     e# Push [3 2 11].
.*        e# Vectorized repeat; push [">>>" "::" "UUUUUUUUUUU"].
s         e# Flatten the array of strings.
.+        e# Append the nth character to the nth string of spaces.
s5/       e# Flatten and split into chunks of length 5.

e# Push [255 12 51 110 220 239 83 123 74 208 248 166 121 251 110 17] as bytes.

"ÿ3nÜïS{JÐø¦yûn"

F         e# Execute F.
*         e# Join the resulting array of strings of spaces, separating by ">:U".
33/       e# Split into chunks of length 33.
z         e# Zip; transpose rows with columns.

]         e# Wrap the entire stack in an array.
ri        e# Read a token from STDIN and interpret it as an integer.
=         e# Retrieve the element at the corresponding index.
z         e# Zip; transpose rows with columns or map "string" to ["string"].
N*        e# Join, separating by linefeeds.
Dennis
źródło
2
Podoba mi się dodatek :Dmiędzy dwoma strunami.
Zgarb
7
@Zgarb Uspokoił wielkiego kaczego władcę. Kaczka się teraz uśmiecha.
Alex A.
7
Przeszedłem przez stronę, myśląc: „172 ... 162 ... 182… Mogę je wszystkie pokonać. Czekaj, 90? Och, to Dennis Niepokonany ...”
ETHprodukcje
22

Java, 303 286 bajtów

Zaoszczędź 17 bajtów dzięki @VoteToClose!

Właściwie to nie miał być najkrótszy, po prostu pomyślałem, że fajnie byłoby spróbować w Javie.

Tworzy listę zmiennych łańcuchowych reprezentujących wspólne łańcuchy, następnie tworzy tablicę wszystkich danych wyjściowych, a następnie drukuje właściwy.

String a(int y){String n="\n",d=">:U",A=" ",B=A+A,C=B+B,D=C+C,a="U"+B+" U"+n,G=D+A,H=C+B,c=d+G+d+n,E=B+A,F=C+E;String[]z={"quack",d,C+A+a+">"+B+": "+a+" >"+E+a+">"+B+": "+a+C+B+"UUU",D+D+B+c+d+D+F+c+B+A+d+F+d+B+c+H+d+G+c+G+d+H+c+H+d+G+c+E+d+F+d+B+c+d+D+F+c+D+D+C+A+d+d+d};return z[y];}

Nie golfowany:

String a(int y) {
    String n = "\n", d = ">:U", A = " ", B = A + A, C = B + B, D = C + C,
            a = "U" + B + " U" + n, G = D + A, H = C + B, c = d + G + d + n,
            E = B + A, F = C + E;
    String[] z = { "quack", d, C + A + a + ">" + B + ": " + a + " >" + E + a + ">" + B + ": " + a + C + B + "UUU", D + D + B + c + d + D + F + c + B + A + d + F + d + B + c + H + d + G + c + G + d + H + c + H + d + G + c + E + d + F + d + B + c + d + D + F + c + D + D + C + A + d + d + d };
    return z[y];
}

To jest moja pierwsza odpowiedź na tej stronie, więc powiedz mi, czy zrobiłem coś złego.

FlyingPiMonster
źródło
2
To wygląda dobrze! Miły pierwszy post i witamy w PPCG!
Conor O'Brien
@AlexA. Dzięki za poinformowanie mnie, naprawiłem to.
FlyingPiMonster
2
@ kittycat3141 Wygląda świetnie. Ładne rozwiązanie i dziękuję za udział w moim wyzwaniu! :)
Alex A.
Wydaje się, że D+Ai C+Bpojawia się na tyle często, że można w nim zagrać w 2 nowe zmienne. Odnoszę też najmniejsze wrażenie, że użycie tablicy z pętlą for może pomóc, ale jeszcze nie zorientowałem się, jak ...
Addison Crump
9

05AB1E , 162 159 157 bajtów

Kod

Cholera, zbyt długo, ale to przynajmniej coś:

">:U"VI3Qið16×7166b1ð:0Y:DUJ,Yð13×JD?X,3838b1ð:0Y:D?X,16255b1ð:0Y:D?X,16367b1ð:0Y:4F?X,}ð21×Y3×J,}¹2Qið4×" U   U"©J,">  :"®JD," >  "?®,,ð6×'U3×J,}¹iY,}"quack

Wypróbuj online!


Wyjaśnienie

Istnieje pierwsza część kodu ">:U"V, która ustawia Yten ciąg. Następnie sprawdzamy, czy dane wejściowe są równe 3. Jest to wykonywane na I3Qiczęści. Jeśli są równe, drukujemy gigantyczną srokę:

N = 3

Najpierw zaczyna się od ð16×tego, że popycha tylko 16 znaków spacji. Potem jest liczba 7166b. To dotyczy tej ">:U "części, z niewielką pomocą Retina :). Użyłem tego skryptu, aby przekonwertować ciąg na liczbę binarną. Następnie przechodzimy do 1ð:0Y:części, która zastępuje każdą 1spacją i każdą 0z Yustawioną na >:U. Po tym, Duplicate ten ciąg, należy go przechowywać w Xużyciu Ui JOIN stosie. Wstawiamy to za pomocą ,, która wypisuje pełny ciąg z nową linią. Wszystkie pozostałe później oparte są na tym samym podmiocie. Instrukcja if kończy się na sekundę }.

Pełną konwersję można znaleźć tutaj .

N = 2

Sprawdzamy teraz, czy dane wejściowe są równe 2. Odbywa się to na ¹2Qiczęści. Następnie, jeśli są równe, naciskamy znak spacji 4 razy za pomocą ð4×. Następnie popychamy " U U"sznurek i przechowujemy go za pomocą ©(pomysł rażąco skradziony z Jelly: p). Ponownie Jpowiększamy stos i drukujemy go z nową linią. Następnie popychamy "> :"ciąg, pobieramy za " U U"pomocą ®, umieszczamy Jna stosie i Dstosujemy ten ciąg i drukujemy oba w tym samym wierszu.

Krótki quiz, co to zrobi " > "?®,:?

Po wydrukowaniu powyższego ciągu otrzymujemy duplikat drugiej linii twarzy i wydrukujemy ją (ponieważ jest taka sama jak druga linia).

Ostatnia część objęta tą sprawą to:

ð6×'U3×J,

ð6×        # Push the space character × 6
   'U3×    # Push the "U" character three times
       J,  # Join and print pop with a newline

N = 1

Ten jest łatwiejszy do wyjaśnienia:

¹1QiY

¹1Qi   # Check if the input is equal to 1
    Y  # Push the magpie face
       # This is then implicitly printed

N = 0

¹0Qi"quack

¹0Qi        # Check if the input is equal to 0
    "quack  # Weird sound what magpies make
            # Implicitly printed
Adnan
źródło
Wyjaśnienie plz? : P
Addison Crump
@VoteToClose Gotowe :)
Adnan
"zbyt długo"? Zobacz moją odpowiedź:
Luis Mendo,
2
DO tego kwakania sroki. Widocznie.
Alex A.,
8

Vitsy , 172 171 159 bajtów

Och Jezu. Jeśli chciałem, żeby coś pochwalić potęgę metod, mam to.

' 'V1+m
'kcauq'Z
'U:>'Z
58m5m6m'   > 'Z5m6m'UUU'68m
f3+bm9mamcm98m2m6bmcmam9mf6+8m3\[2m]
a'U   U'Z
' :  >'Z5m
Z2m98ma2m
\VZ
2mfbm
VVVZ2m78m2mVV7m
8m7m
68m2m9bm

Wypróbuj online!

Działa to poprzez wywoływanie różnych metod w całym samym sobie. Wyjaśnienie znajduje się poniżej:

' 'V1+m
' 'V      Save character literal ' ' as a permanent variable.
    1+    Add one to the top item of the stack (input + 1)
      m   Go to that index of code.

'kcauq'Z
'kcauq'   Push 'quack' to the stack.
       Z  Output everything in the stack as a char.

'U:>'Z
'U:>'Z    Ouput ">:U" with the same method as the previous line.

Now on to some more... interesting lines.

58m5m6m'   > 'Z5m6m'UUU'68m
5              Push space, push 4
 8m            Call the 8th line index.
               As we will soon see, the 8th line index duplicates the space
               the number of times specified by the number just before the call 
               (4 in this case)
   5m          Call the 5th line index.
               The 5th line index outputs the 'U   U' and a newline.
     6m        Call the 6th line index.
               The 6th line index outputs '>  : U   U' and a newline.
'   > 'Z       Output ' >   '.
        5m6m   Same method calls as before.
'UUU'          Push 'UUU'.
     68m       Push 6, then call the 8th line index. This gives us the correct padding.

f3+bm9mamcm98m2m6bmcmam9mf6+8m3\[2m]
f3+              Push 18.
   bm            Call the 11th line index.
                 The 11th line index calls the 8th line index (which we've already seen
                 in action) and then the 7th line index, which you can find and explanation
                 for below (it does a lot)
     9m          Call the 9th line index.
                 The 9th line index outputs '>:U               >:U         >:U' (explanation lower)
       am        Call the 10th line index.
                 ...I'm gonna stop explaining these and just tell you to go to the lines now. :P
         cm      Call the 12th line index.
9                Push space, push 9.
 8m              Call the 8th line index (explained below and before).
   2m            Call the 2nd line index.
     6           Push 6.
      bm         Call the 11th line index. We've finished up to '>:U      >:U         >:U' now.
cm               You guessed it! Call the 12th line index. (explanation below)
  am             Call the 10th line index. (explanation below)
    9m           Call the 9th line index. (explanation below)
f6+              Push space, push 19 21.
   8m            Call the 8th line index. (explanation below)
     3\[2m]      Call the 2nd line index thrice.

All of the rest of these methods are supporting methods now.

a'U   U'Z       Output 'U   U' followed by a newline.

' :  >'Z5m      Output '>  : U   U' followed by a newline.

Z2m98ma2m
Z               Output everything currently in the stack.
 2m             Call the 2nd line index.
   9            Push space, push 8.
    8m          Call the 8th line index. (explained below)
      a         Push a newline to the stack.
       2m       Call the 2nd line index.
                This handles the biggest angry duck face's faces showing the eyebrows and eyes.

\VZ
\V    Push space as many times as the top item specifies.
  Z   Output everything in the stack.

2mfbm
2m      Call the 2nd line index.
  f     Push space, push 14.
   bm   Go to the 11th line index.
        This handles the mouth and some parts of the eyebrows of the biggest duck face.

VVVZ2m78m2mVV7m
VVVZ              Output 3 spaces (and whatever was pushed before it)
    2m            Call the 2nd line index.
      7           Push space, push 6.
       8m         Call the 8th line index. (explained... above)
         2m       Call the 2nd line index.
           VV     Push 2 spaces.
             7m   Call the 7th line index.

8m7m     This is pretty damn self-explanatory if you've read this far.

68m2m9bm
6            Push space, push 5.
 8m          Call the 8th line index.
   2m        Call the 2nd line index.
     9       Push space, push 9.
      bm     Call the 11th line index.

Ten kod jest niedorzeczny. Jego pełna forma to:

toggle single quote;
 ;
toggle single quote;
save top as permanent variable;
push 1;
add top two;
goto top method;
:toggle single quote;
k;
push 12;
push 10;
flatten top two stacks;
q;
toggle single quote;
output stack as chars;
:toggle single quote;
U;
clone current stack;
go forward;
toggle single quote;
output stack as chars;
:push 5;
push 8;
goto top method;
push 5;
goto top method;
push 6;
goto top method;
toggle single quote;
 ;
 ;
 ;
go forward;
 ;
toggle single quote;
output stack as chars;
push 5;
goto top method;
push 6;
goto top method;
toggle single quote;
U;
U;
U;
toggle single quote;
push 6;
push 8;
goto top method;
:push 15;
push 3;
add top two;
push 11;
goto top method;
push 9;
goto top method;
push 10;
goto top method;
push 12;
goto top method;
push 9;
push 8;
goto top method;
push 2;
goto top method;
push 6;
push 11;
goto top method;
push 12;
goto top method;
push 10;
goto top method;
push 9;
goto top method;
push 15;
push 6;
add top two;
push 8;
goto top method;
push 3;
repeat next instruction set top times;
begin recursive area;
push 2;
goto top method;
end recursive area;
:push 10;
toggle single quote;
U;
 ;
 ;
 ;
U;
toggle single quote;
output stack as chars;
:toggle single quote;
 ;
clone current stack;
 ;
 ;
go forward;
toggle single quote;
output stack as chars;
push 5;
goto top method;
:output stack as chars;
push 2;
goto top method;
push 9;
push 8;
goto top method;
push 10;
push 2;
goto top method;
:repeat next instruction set top times;
save top as permanent variable;
output stack as chars;
:push 2;
goto top method;
push 15;
push 11;
goto top method;
:save top as permanent variable;
save top as permanent variable;
save top as permanent variable;
output stack as chars;
push 2;
goto top method;
push 7;
push 8;
goto top method;
push 2;
goto top method;
save top as permanent variable;
save top as permanent variable;
push 7;
goto top method;
:push 8;
goto top method;
push 7;
goto top method;
:push 6;
push 8;
goto top method;
push 2;
goto top method;
push 9;
push 11;
goto top method;
Addison Crump
źródło
7

JavaScript (ES6), 163 bajty

var solution =

n=>["quack",d=">:U",`5U3U
>2:1U3U
1>3U3U
>2:1U3U
6UUU`,`99090
096090
30702090
609090
906090
609090
30702090
096090
993000`][n].replace(/\d/g,c=>+c?" ".repeat(c):d)
<input type="number" oninput="R.textContent=solution(+this.value)"><pre id="R"></pre>

Wyjaśnienie

Wykorzystuje moją kompresję z JavaScriptem: kodowanie run-length. Cyfry 1na 9mapie do tylu pól, 0mapy do twarzy wściekłej kaczki i każda inna postać pozostaje taka sama.

użytkownik 81655
źródło
1
Bardzo imponujące jak na język nie golfowy, ale wydaje się, że brakuje rzędów tuż powyżej i poniżej środka dla n = 3.
ETHprodukcje
@ETHproductions Ups, nie jestem pewien, co się tam stało. Naprawiono teraz.
user81655
7

Japt, 116 105 102 99 96 bajtów

["quack""c)`+«öÂ[@=^Gñ`1]o2"mc r'4#¿+R "4z>2:z >2z>2:z6UUU"rz" U3U
" '1]®r'1">:U" r"%d"_SpZ}ÃgU

Zawiera niedrukowalne. Przetestuj online!

Jak to działa

Pierwsze dwa ciągi nie są w ogóle skompresowane. Trzeci jest skompresowany przez zastąpienie każdego ciągu spacji jego długością, a następnie " U3U"przez "z". Ostatni jest bardziej złożony:

  1. Zastąp każdy ciąg 2-9 spacji jego długością.
  2. Wymień >:Usię 1.
  3. Wymień 191\nsię 4. ( 4nie jest używany nigdzie indziej w ciągu).
  4. Zamapuj każdy prawidłowy kod bajtowy ( 10- 255lub 0A- FF) na znak z tym kodem znaków.

Wynikowy ciąg ma tylko 21 19 bajtów długości, ale dekompresja zajmuje kolejne 31 29.

Po zdekompresowaniu ciągów, po prostu bierzemy pozycję w pozycji U, wejście. (Tablica jest ułożona, [0,3,2,1]ponieważ występuje błąd, który powoduje, że liczy się od końca tablicy zamiast od początku.)

[                      // Create an array of the following:
  "quack"              //  "quack".

  "c)`+«öÂ[@=^Gñ`1]o2" //  Take this string (contains an unprintable).
                       //  Map each char to its char code.
                       //  This produces "994196431712461949164619431712419649931112".
  r'4#¿+R              //  Replace each "4" with the char code of "¿" (191) + a newline.

  "4z>2:z >2z>2:z6UUU" //  Take this string.
  rz" U3U\n"           //  Replace each "z" with " U3U\n".

  '1                   //  "1".
]
®              Ã       // Map each item by this function:
r'1">:U"               //  Replace each "1" with ">:U".
r"%d"_SpZ}             //  Replace each remaining digit Z with Z spaces.

gU                     // Get the item at index -U, wrapping. 
                       // (This should just be U, but there's a bug which negates it.)
ETHprodukcje
źródło
5

MATL , 283 182 bajtów

101 bajtów zapisanych dzięki @Adnan!

To używa liczb dziesiętnych do kodowania indeksów 0... 3do czterech znaków w przypadkach 2 i 3. Liczby dziesiętne mogą być prawdopodobnie skompresowane przy użyciu kodowania base-64, ale kwak!

W przypadku 3 zastosowano bardzo fajną sztuczkę sugerowaną przez @Adnan: zdefiniuj sekwencje binarne, aby zakodować każdy wiersz, gdzie 0i 1odpowiednio odpowiednio do spacji >:U.

~?'quack'}G1=?'>:U'}G2=?' :>U'12336 8466480h2109488h8466480h4032h4YA47-)}268697600 67174401h16795656h67174464h67174912h67174464h16795656h67174401h14680064h"@BP48+]Xh49'>:U'YX48 32YXc

Wypróbuj online!

Luis Mendo
źródło
3
Jak o na tym ostatnim przypadku, za pomocą tego , zastępując 1ze spacjami i 0ze >:Usznurkiem. Nie wiem czy to by pomogło.
Adnan
@Adnan To dobry pomysł!
Luis Mendo,
5
@Adnan 101 bajtów zapisanych: -O
Luis Mendo
To jest niesamowite! Bardzo miła odpowiedź! :)
Adnan
5

Guma cynamonowa, 76 bajtów

0000000: 6c33 502b 2c4d 4cce b636 54b3 b30a b536  l3P+,ML..6T....6
0000010: 5253 0081 5010 e6b2 5350 b082 3215 ecb0  RS..P...SP..2...
0000020: 8a42 1487 865a 1bab 2960 00a0 79c8 6c2e  .B...Z..)`..y.l.
0000030: 2026 a002 4221 0430 55c0 5938 cd40 9720   &..B!.0U.Y8.@. 
0000040: 6c06 6177 90e9 17ac 4102 4100            l.aw....A.A.

Nie konkuruje, ponieważ guma cynamonowa powstała po tym wyzwaniu.

Wypróbuj online.

Wyjaśnienie

Pierwszy bajt lokreśla tryb: w tym przypadku informuje gumę cynamonową o przejściu do trybu tabeli przeglądowej. Następnie guma cynamonowa dekompresuje resztę łańcucha (który został skompresowany zopfli --deflate) do tego:

0&quack;1&>:U;2&     U   U
>  : U   U
 >   U   U
>  : U   U
      UUU;3&                  >:U         >:U
>:U               >:U         >:U
   >:U       >:U  >:U         >:U
      >:U         >:U         >:U
         >:U      >:U         >:U
      >:U         >:U         >:U
   >:U       >:U  >:U         >:U
>:U               >:U         >:U
                     >:U>:U>:U

Następnie dzieli się według ;, umieszcza każdą parę klucz-wartość (z &ogranicznikiem) w słowniku i wysyła dictionary[input].

spaghetto
źródło
5

JavaScript ES6, 232 223 203 188 bajtów

Zaoszczędzono 29 44 bajtów dzięki produktom ETH!

n=>[`quack`,r=`>:U`,`     U   U
>  : U   U
 >   U   U
>  : U   U
      UUU`,`00022
10022
0100 1  12
00122
20012
00122
0100 1  12
10022
0000211`.replace(/\d/g,N=>[g=`   `,r,g+g+g+r][N])][n]

Przetestuj to!

Conor O'Brien
źródło
na pewno można to zrobić ... jeśli nie, to 1czy 0można przekształcić je w liczbę trójkową?
Downgoat
1
@Downgoat btoaing i trynowe oba są dłuższe.
Conor O'Brien
Stare odpowiedź, ale jak można zaoszczędzić 15 bajtów, zmieniając r+g+g+g+rsię g+g+g+ri dostosowując odpowiednio ciąg.
ETHproductions
0

GML, 265 bajtów

Port doskonałej odpowiedzi @ kittycat3141, z sugestią, aby dalej grać w golfa za pomocą dwóch nowych zmiennych (które nazwałem G i H) autorstwa @VoteToClose. Udało mi się także go skrócić dzięki stosunkowo luźnej składni GML.

d=">:U"A=" "B=A+A;C=B+B;D=C+C;G=D+A;H=C+B;a="U"+B+" U"+"#"c=d+G+d+"#"E=B+A;F=C+E;x[0]="quack"x[1]=d;x[2]=C+A+a+">"+B+": "+a+" >"+E+a+">"+B+": "+a+H+"UUU"x[3]=D+D+B+c+d+D+F+c+B+A+d+F+d+B+c+H+d+G+c+G+d+H+c+H+d+G+c+E+d+F+d+B+c+d+D+F+c+D+D+C+A+d+d+d;return x[argument0]
Timtech
źródło