Quack the Angry Duck


56

Ninguém sabe ao certo o que o emoticon >:Upretende representar, mas muitos estudiosos acreditam que ele se parece com um pato bravo . Vamos assumir que é o caso.

Tarefa

Dado um número inteiro n entre 0 e 3 inclusive, imprima ou retorne

quack

se n = 0,

>:U

se n = 1,

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

se n = 2, ou

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

Você pode assumir que a entrada sempre será válida. Não deve haver espaço à esquerda na saída, mas qualquer quantidade de espaço à direita é boa. Os patos (com a possível exceção de @cobaltduck) não toleram brechas. O menor código em bytes vence.


90
Primeiro eu estava pensando "hein, o que é um pato?". Felizmente, você forneceu um link para a página da Wikipedia.
Adnan

6
"Os patos não toleram brechas". Mas você é um pássaro, não um pato, isso significa que podemos usar brechas? : P
Downgoat 25/02

6
@Downgoat Nope. Também essa edição foi totalmente desnecessária, então eu a revirei.
Alex A.

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

7
"Os patos não toleram brechas". Isso, meu amigo, é um estereótipo perigoso. Se eu não soubesse suas intenções, posso me ofender.
Cobaltduck

Respostas:


19

CJam, 108 90 85 bytes

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

Observe que alguns caracteres não são imprimíveis. Experimente online!

fundo

As duas primeiras saídas são incompressíveis no CJam.

A compactação da última saída é simples. Depois de eliminar todos os feeds de linha, podemos dividir a sequência resultante nas ocorrências de >:Ue calcular o comprimento de cada sequência de espaços resultante.

Isso resulta na matriz

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

que podemos armazenar eficientemente convertendo-o da base 22 para a base 269, produzindo os dígitos

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

Como cada dígito é menor que 256 , podemos armazená-lo como um único byte.

Por fim, compactar a terceira saída fica mais fácil se transpormos linhas e colunas:

 > > 
  >  

 : : 

UUUU 
    U
    U
    U
UUUU

Contando mais uma vez os espaços entre caracteres que não são espaços em branco, obtemos a matriz

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

que se torna

[115 159 99 84 166 123 36 236 6]

quando transcodificado da base 22 para a base 269.

Como funciona

"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
Eu gosto do extra :Dentre as duas cordas.
Zgarb

7
@Zgarb Ele apaziguou o grande senhor dos patos. O pato agora sorri.
Alex A.

7
Examinei a página pensando: "172 ... 162 ... 182 ... eu posso vencer todos esses. Espere, 90? Oh, é Dennis, o Imbatível ..."
ETHproductions

22

Java, 303 286 bytes

Guardado 17 bytes graças a @VoteToClose!

Na verdade, não era para ser o mais curto, eu apenas pensei que seria divertido tentar em Java.

Cria uma lista de variáveis ​​de sequência que representam sequências comuns, cria uma matriz de todas as saídas e imprime a correta.

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

Esta é a minha primeira resposta neste site. Por favor, diga-me se fiz algo errado.


2
Parece bem! Bom primeiro post e bem-vindo ao PPCG!
Conor O'Brien

@AlexA. Obrigado por me informar, eu consertei.
FlyingPiMonster 26/02

2
@ kittycat3141 Parece ótimo. Ótima solução e obrigado por participar do meu desafio! :)
Alex A.

Parece que D+Ae C+Baparece com freqüência suficiente para ser jogado mais em 2 novas variáveis. Também tenho a menor sensação de que usando uma matriz com um loop pode ajudar, mas eu ainda não descobri como ainda ...
Addison Crump

9

05AB1E , 162 159 157 bytes

Código

Droga, muito tempo, mas é pelo menos uma coisa:

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

Experimente online!


Explicação

A primeira parte do código existe de ">:U"V, que define Ypara essa sequência. Depois disso, apenas verificamos se a entrada é igual a 3. Isso é feito na I3Qiparte. Se igual, imprimimos a pega gigante:

N = 3

Começa pela primeira vez, com ð16×apenas 16 caracteres de espaço. Depois disso, há um número 7166b. Isso cobre a ">:U "parte, com uma pequena ajuda da Retina :). Eu usei esse script para converter a string em um número binário. Depois disso, chegamos à 1ð:0Y:parte, que substitui todos 1por um caractere de espaço e todos 0por Y, que foi definido como >:U. Depois disso, Dduplicamos essa string, armazenamos-a Xusando Ue Join na pilha. Nós pop-lo usando ,, que imprime a seqüência completa com uma nova linha. Todos os outros depois disso são todos baseados no mesmo princípio. A instrução if termina no segundo }.

A conversão completa pode ser encontrada aqui .

N = 2

Agora verificamos se a entrada é igual a 2. Isso é feito na ¹2Qiparte. Depois disso, se for igual, pressionamos o caractere de espaço 4 vezes usando ð4×. Depois disso, empurramos a " U U"corda e a armazenamos usando ©(ideia descaradamente roubada de Jelly: p). Novamente colocamos Jna pilha e imprimimos isso com uma nova linha. Depois disso, empurramos a "> :"string, recuperamos o " U U"uso ®, Jcolocamos na pilha e Dduplicamos essa string e imprimimos ambas na mesma linha.

Teste curto, o que isso fará " > "?®,:?

Depois de imprimir a string acima, obtemos a duplicata da segunda linha da face e a imprimimos (já que é a mesma da segunda linha).

A última parte abordada neste 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

Este é mais fácil de explicar:

¹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

Explicação plz? : P
Addison Crump

@VoteToClose Done :)
Adnan

"tempo demais"? Veja minha resposta :-P
Luis Mendo

2
Até que os pegas grasnem. Pelo visto.
Alex A.

8

Vitsy , 172 171 159 bytes

Oh puxa. Se eu queria algo que demonstrasse o poder dos métodos, entendi.

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

Experimente Online!

Como isso funciona é chamando vários métodos por si só. A explicação está abaixo:

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

Esse código é ridículo. Sua forma detalhada é:

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 bytes

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>

Explicação

Usa minha compactação go-to com JavaScript: codificação de comprimento de execução. Os dígitos 1para 9mapear para muitos espaços, 0mapeiam para a cara de pato bravo e qualquer outro caractere permanece o mesmo.


11
Muito impressionante para um idioma que não seja golfe, mas as linhas logo acima e abaixo do centro para n = 3 parecem estar ausentes.
ETHproductions

@ETHproductions Opa, não sei o que aconteceu lá. Corrigido agora.
user81655

7

Japt, 116 105 102 99 96 bytes

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

Contém um não imprimível. Teste online!

Como funciona

As duas primeiras seqüências de caracteres não são compactadas. O terceiro é compactado simplesmente substituindo cada execução de espaços por seu comprimento e depois " U3U"por "z". O último é mais complexo:

  1. Substitua cada execução de 2 a 9 espaços pelo seu comprimento.
  2. Substitua >:Upor 1.
  3. Substitua 191\npor 4. ( 4não é usado em nenhum outro lugar da string.)
  4. Mapeie cada código de byte válido ( 10- 255ou 0A- FF) para o caractere com esse código de char.

A sequência resultante tem apenas 21 19 bytes, mas a descompressão ocupa outros 31 29.

Após descompactar as strings, simplesmente colocamos o item na posição U, na entrada. (A matriz é organizada [0,3,2,1]porque há um erro que faz a contagem do final da matriz em vez do início.)

[                      // 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 bytes

101 bytes salvos graças ao @Adnan!

Isso usa números decimais para codificar índices 0... 3para os quatro caracteres dos casos 2 e 3. Talvez os números decimais possam ser compactados usando a codificação base-64, mas charlatão!

Para o caso 3, é usado um truque muito bom sugerido por @Adnan: defina seqüências binárias para codificar cada linha, onde 0e 1corresponda ao espaço e >:Urespectivamente.

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

Experimente online!


3
Que tal o último caso, usando isso , substituindo os 1espaços com e 0pela >:Usequência. Não sei se isso ajudaria.
Adnan

@Adnan Essa é uma boa ideia!
Luis Mendo

5
@Adnan 101 bytes salvos: -O
Luis Mendo

Isso é incrível! Resposta muito boa! :)
Adnan,

5

Goma de canela, 76 bytes

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.

Não concorrente desde que o Cinnamon Gum foi criado após esse desafio.

Experimente online.

Explicação

O primeiro byte lespecifica o modo: nesse caso, ele diz ao Cinnamon Gum para entrar no modo de tabela de pesquisa. O chiclete de canela descomprime o restante da corda (que foi compactada zopfli --deflate) para isso:

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

Em seguida, ele se divide ;, coloca cada par de valores-chave (com &como delimitador) em um dicionário e gera dictionary[input].


5

JavaScript ES6, 232 223 203 188 bytes

Economizou 29 44 bytes graças 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]

Teste!


certamente pode ser atob'd ... se não, poderia a 1e 0s ser feito em um número trinário?
Downgoat

11
@Downgoat btoaing e trinary ambos são mais longos.
Conor O'Brien

Velha resposta, mas você pode salvar como 15 bytes, alterando r+g+g+g+ra g+g+g+re ajustando a string em conformidade.
ETHproductions

0

GML, 265 bytes

Uma porta da excelente resposta de @ kittycat3141, com a sugestão de avançar ainda mais com duas novas variáveis ​​(que chamei de G e H) de @VoteToClose. Também consegui reduzi-lo ainda mais com a sintaxe relativamente flexível da 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]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.