Quack the Angry Duck


56

Nessuno è abbastanza sicuro di ciò che l'emoticon >:Uintende rappresentare, ma molti studiosi credono che assomigli ad un'anatra arrabbiata . Supponiamo che sia così.

Compito

Dato un numero intero n compreso tra 0 e 3 compreso, stampare o ritorno

quack

se n = 0,

>:U

se n = 1,

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

se n = 2 o

                  >: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

se n = 3.

Puoi presumere che l'input sarà sempre valido. Non ci dovrebbe essere spazio iniziale nell'output, ma qualsiasi quantità di spazio finale va bene. Le anatre (con la possibile eccezione di @cobaltduck) non tollerano le scappatoie. Vince il codice più breve in byte.


90
Prima pensavo "eh, cos'è un'anatra?". Fortunatamente hai fornito un link alla pagina di Wikipedia.
Adnan,

6
"Le anatre non tollerano le scappatoie." Ma tu sei un uccello, non un'anatra, significa che possiamo usare le scappatoie? : P
Downgoat,

6
@Downgoat Nope. Anche quella modifica era del tutto superflua, quindi l'ho ripristinata.
Alex A.

6
@Downgoat s /: P />: U /
ETHproductions

7
"Le anatre non tollerano le scappatoie." Quello, amico mio, è uno stereotipo pericoloso. Se non conoscessi le tue intenzioni, potrei offendermi.
Cobaltduck,

Risposte:


19

CJam, 108 90 85 byte

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

Si noti che alcuni caratteri non sono stampabili. Provalo online!

sfondo

Le prime due uscite sono incomprimibili in CJam.

La compressione dell'ultima uscita è semplice. Dopo aver rimosso tutti gli avanzamenti di riga, possiamo dividere la stringa risultante in caso di occorrenze >:Ue calcolare la lunghezza di ogni stringa di spazi risultante.

Ciò risulta nell'array

[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]

che possiamo memorizzare in modo efficiente convertendolo dalla base 22 alla base 269, ottenendo le cifre

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

Poiché ogni cifra è inferiore a 256 , possiamo memorizzarla come un singolo byte.

Infine, comprimere il terzo output diventa più semplice se trasponiamo linee e colonne:

 > > 
  >  

 : : 

UUUU 
    U
    U
    U
UUUU

Contando ancora una volta gli spazi tra caratteri non bianchi, otteniamo l'array

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

che diventa

[115 159 99 84 166 123 36 236 6]

quando transcodificato dalla base 22 alla base 269.

Come funziona

"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.

2
Mi piace il extra :Dtra le due corde.
Zgarb,

7
@Zgarb Ha placato il grande signore delle anatre. L'anatra ora sorride.
Alex A.

7
Ho esaminato la pagina pensando: "172 ... 162 ... 182 ... Posso battere tutti quelli. Aspetta, 90? Oh, è Dennis the Unbeatable ..."
ETHproductions,

22

Java, 303 286 byte

Risparmiato 17 byte grazie a @VoteToClose!

In realtà non intendevo essere il più corto, pensavo solo che sarebbe stato divertente provare in Java.

Crea un elenco di variabili stringa che rappresentano stringhe comuni, quindi crea un array di tutti gli output, quindi stampa quello giusto.

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];}

Ungolfed:

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];
}

Questa è la mia prima risposta su questo sito, quindi per favore dimmi se ho fatto qualcosa di sbagliato.


2
Sembra a posto! Bel primo post e benvenuto in PPCG!
Conor O'Brien,

@AlexA. Grazie per avermelo fatto sapere, l'ho risolto.
FlyingPiMonster il

2
@ kittycat3141 Sembra fantastico. Bella soluzione e grazie per aver partecipato alla mia sfida! :)
Alex A.

Sembra che D+Ae C+Babbastanza frequentemente per essere ulteriormente approfondito in 2 nuove variabili. Ho anche la minima sensazione che l'uso di un array con un ciclo for potrebbe essere d'aiuto, ma non ho ancora capito come ...
Addison Crump,

9

05AB1E , 162 159 157 byte

Codice

Dannazione, troppo a lungo, ma è almeno qualcosa:

">: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

Provalo online!


Spiegazione

Esiste la prima parte del codice ">:U"V, che imposta Yquella stringa. Dopodiché, controlliamo solo se l'input è uguale a 3. Ciò viene fatto nella I3Qiparte. Se uguale, stampiamo la gazza gigante:

N = 3

Si inizia con il ð16×quale spinge solo 16 caratteri spaziali. Dopo quello, c'è un numero 7166b. Questo copre la ">:U "parte, con un piccolo aiuto da Retina :). Ho usato questo script per convertire la stringa in un numero binario. Dopodiché, arriviamo alla 1ð:0Y:parte, che sostituisce ognuna 1con un carattere spazio e ogni 0con Ycui è stato impostato >:U. Successivamente, eseguiamo l' Duplicing di questa stringa, la memorizziamo Xusando Ue Jnello stack. Lo pop usando ,, che stampa l'intera stringa con una nuova riga. Tutti gli altri dopo si basano tutti sullo stesso principio. L'istruzione if termina al secondo }.

La conversione completa è disponibile qui .

N = 2

Ora controlliamo se l'ingresso è uguale a 2. Questo viene fatto nella ¹2Qiparte. Dopodiché, se uguale, spingiamo il carattere spaziale 4 volte usando ð4×. Dopodiché, spingiamo la " U U"stringa e la memorizziamo usando ©(idea palesemente rubata da Jelly: p). Di nuovo Jnella pila e stampiamo questo con una nuova riga. Dopodiché, spingiamo la "> :"stringa, recuperiamo l' " U U"utilizzo ®, Jnella pila e Dupliciamo questa stringa e stampiamo entrambi sulla stessa riga.

Breve quiz, che cosa sarà mai questo fare: " > "?®,?

Dopo aver stampato la stringa sopra, otteniamo il duplicato della seconda riga della faccia e la stampiamo (poiché è la stessa della seconda riga).

L'ultima parte coperta da questo caso è:

ð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

Questo è più facile da spiegare:

¹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

Spiegazione per favore? : P
Addison Crump,

@VotoToClose Fatto :)
Adnan,

"troppo lungo"? Vedi la mia risposta :-P
Luis Mendo il

2
TIL che le gazze ciondolano. Apparentemente.
Alex A.

8

Vitsy , 172 171 159 byte

Oh, accidenti. Se volevo qualcosa che mettesse in mostra il potere dei metodi, l'ho capito.

' '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

Provalo online!

Come funziona è chiamando vari metodi su se stesso. La spiegazione è di seguito:

' '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.

Questo codice è ridicolo. La sua forma dettagliata è:

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;

7

JavaScript (ES6), 163 byte

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>

Spiegazione

Usa la mia compressione go-to con JavaScript: codifica run-length. Le cifre 1da 9mappare a quei tanti spazi, le 0mappe alla faccia di anatra arrabbiata e qualsiasi altro personaggio rimane lo stesso.


1
Molto impressionante per un linguaggio non golfistico, ma sembrano mancare le righe sopra e sotto il centro per n = 3.
ETHproductions

@ETHproductions Spiacenti, non sono sicuro di cosa sia successo lì. Riparato ora.
user81655,

7

Japt, 116 105 102 99 96 byte

["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

Contiene un non stampabile. Provalo online!

Come funziona

Le prime due stringhe non sono affatto compresse. Il terzo viene compresso semplicemente sostituendo ogni serie di spazi con la sua lunghezza, quindi " U3U"con "z". L'ultimo è più complesso:

  1. Sostituisci ogni corsa di 2-9 spazi con la sua lunghezza.
  2. Sostituisci >:Ucon 1.
  3. Sostituisci 191\ncon 4. ( 4non viene utilizzato in nessun altro punto della stringa.)
  4. Mappa ogni codice byte valido ( 10- 255, o 0A- FF) al carattere con quel codice char.

La stringa risultante è lunga solo 21 19 byte, ma la decompressione occupa altri 31 29.

Dopo aver decompresso le stringhe, prendiamo semplicemente l'elemento in posizione U, l'input. (L'array è organizzato [0,3,2,1]perché c'è un bug che lo fa contare dalla fine dell'array invece che dall'inizio.)

[                      // 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.)

5

MATL , 283 182 byte

101 byte salvati grazie a @Adnan!

Questo utilizza numeri decimali per codificare gli indici 0... 3ai quattro caratteri per i casi 2 e 3. I numeri decimali potrebbero forse essere compressi usando la codifica base 64, ma ciarlatano!

Per il caso 3 viene utilizzato un trucco molto carino suggerito da @Adnan: definire sequenze binarie per codificare ogni riga, dove 0e 1corrispondere allo spazio e >:Urispettivamente.

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

Provalo online!


3
Che ne dici dell'ultimo caso, usando questo , sostituendo gli 1spazi con e gli spazi 0con la >:Ustringa. Non so se sarebbe di aiuto.
Adnan,

@Adnan Questa è una buona idea!
Luis Mendo,

5
@Adnan 101 byte salvati: -O
Luis Mendo,

È fantastico! Risposta molto bella! :)
Adnan,

5

Gomma alla cannella, 76 byte

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.

Non competitiva da quando Cinnamon Gum è stata creata dopo questa sfida.

Provalo online.

Spiegazione

Il primo byte lspecifica la modalità: in questo caso indica a Cinnamon Gum di accedere alla modalità tabella di ricerca. Cinnamon Gum quindi decomprime il resto della stringa (che è stata compressa con zopfli --deflate) in questo:

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

Quindi si divide ;, inserisce ogni coppia chiave-valore (con &delimitatore) in un dizionario e genera dictionary[input].


5

JavaScript ES6, 232 223 203 188 byte

Risparmiato 29 44 byte grazie a ETHproductions!

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]

Provalo!


sicuramente può essere eliminato ... in caso contrario, potrebbe 1e 0essere trasformato in un numero trinario?
Downgoat,

1
@Downgoat btoaing e trinary sono entrambi più lunghi.
Conor O'Brien,

Vecchio risposta, ma si potrebbe risparmiare come 15 byte, cambiando r+g+g+g+rper g+g+g+re regolando la stringa di conseguenza.
ETHproductions

0

GML, 265 byte

Una porta della risposta eccellente di @ kittycat3141, con il suggerimento di continuare a golf con due nuove variabili (che ho chiamato G e H) di @VoteToClose. Sono anche riuscito ad accorciarlo ulteriormente con la sintassi relativamente libera di 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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.