Quack the Angry Duck

56

Tidak ada yang cukup yakin apa yang >:Udimaksudkan untuk mewakili emoticon , tetapi banyak sarjana percaya itu terlihat seperti bebek yang marah . Mari kita asumsikan itu masalahnya.

Tugas

Diberikan bilangan bulat n antara 0 dan 3 inklusif, cetak atau kembalikan

quack

jika n = 0,

>:U

jika n = 1,

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

jika n = 2, atau

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

jika n = 3.

Anda dapat berasumsi bahwa input akan selalu valid. Seharusnya tidak ada ruang utama dalam output, tetapi jumlah ruang trailing apa pun baik-baik saja. Bebek (dengan kemungkinan pengecualian @cobaltduck) tidak memiliki toleransi untuk celah. Kode terpendek dalam byte menang.

Alex A.
sumber
90
Pertama saya berpikir "ya, apa itu bebek?". Untungnya Anda telah memberikan tautan ke halaman wikipedia.
Adnan
6
"Bebek tidak memiliki toleransi terhadap celah." Tapi kau bukan burung bebek, apakah itu berarti kita bisa menggunakan celah? : P
Downgoat
6
@Downgoat Tidak. Juga edit itu sama sekali tidak perlu jadi saya memutar kembali.
Alex A.
6
@Downgoat s /: P />: U /
ETHproduksi
7
"Bebek tidak memiliki toleransi terhadap celah." Itu, teman saya, adalah stereotip yang berbahaya. Jika saya tidak tahu niat Anda, saya mungkin tersinggung.
cobaltduck

Jawaban:

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*

Perhatikan bahwa beberapa karakter tidak dapat dicetak. Cobalah online!

Latar Belakang

Dua output pertama tidak dapat dimampatkan di CJam.

Mengompresi output terakhir sangat mudah. Setelah melepaskan semua linefeed, kita dapat membagi string yang dihasilkan pada kejadian >:U, dan menghitung panjang setiap string spasi yang dihasilkan.

Itu menghasilkan 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]

yang dapat kita simpan secara efisien dengan mengubahnya dari basis 22 ke basis 269, menghasilkan digit

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

Karena setiap digit kurang dari 256 , kita dapat menyimpannya sebagai satu byte.

Akhirnya, mengompresi output ketiga menjadi lebih mudah jika kita memindahkan garis dan kolom:

 > > 
  >  

 : : 

UUUU 
    U
    U
    U
UUUU

Menghitung sekali lagi spasi antara karakter non-spasi, kita mendapatkan array

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

yang menjadi

[115 159 99 84 166 123 36 236 6]

ketika ditranskodekan dari basis 22 ke basis 269.

Bagaimana itu bekerja

"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
sumber
2
Saya suka ekstra :Dantara dua string.
Zgarb
7
@Zgarb Dia telah meredakan tuan bebek yang hebat. Bebek itu sekarang tersenyum.
Alex A.
7
Saya membaca halaman sambil berpikir, "172 ... 162 ... 182 ... Saya bisa mengalahkan semua itu. Tunggu, 90? Oh, ini Dennis the Unbeatable ..."
ETHproductions
22

Java, 303 286 byte

Disimpan 17 byte berkat @VoteToClose!

Sebenarnya tidak dimaksudkan sebagai yang terpendek, saya hanya berpikir akan menyenangkan untuk mencoba di Jawa.

Membuat daftar variabel string yang mewakili string umum, lalu membuat array dari semua output, lalu mencetak yang benar.

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

Tidak Disatukan:

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

Ini adalah jawaban pertama saya di situs ini, jadi tolong beri tahu saya jika saya melakukan sesuatu yang salah.

FlyingPiMonster
sumber
2
Terlihat baik! Posting pertama yang bagus, dan selamat datang di PPCG!
Conor O'Brien
@AlexA. Terima kasih telah memberi tahu saya, saya memperbaikinya.
FlyingPiMonster
2
@ kittycat3141 Terlihat bagus. Solusi yang bagus dan terima kasih telah berpartisipasi dalam tantangan saya! :)
Alex A.
Tampaknya D+Adan C+Bmuncul cukup sering untuk ditayangkan lebih lanjut menjadi 2 variabel baru. Saya juga merasa bahwa menggunakan array dengan for loop mungkin bisa membantu, tapi saya belum tahu caranya ...
Addison Crump
9

05AB1E , 162 159 157 byte

Kode

Sial, terlalu lama, tapi setidaknya itu sesuatu:

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

Cobalah online!


Penjelasan

Bagian pertama dari kode ada ">:U"V, yang mengatur Ystring itu. Setelah itu, kami hanya memeriksa apakah input sama dengan 3. Itu dilakukan di I3Qibagian. Jika sama, kami mencetak murai raksasa:

N = 3

Pertama dimulai dengan ð16×yang hanya mendorong 16 karakter luar angkasa. Setelah itu, ada nomor 7166b. Ini mencakup ">:U "bagian itu, dengan sedikit bantuan dari Retina :). Saya menggunakan skrip ini untuk mengkonversi string ke angka biner. Setelah itu, kita sampai pada 1ð:0Y:bagian, yang menggantikan setiap 1karakter spasi dan setiap 0dengan Y, yang telah ditetapkan >:U. Setelah itu, kita Dmenggandakan string ini, menyimpannya dalam Xmenggunakan Udan Jmenumpuk. Kami menghapus ini menggunakan ,, yang mencetak string penuh dengan baris baru. Semua yang lain setelah itu semua didasarkan pada prinsip yang sama. Pernyataan if berakhir pada detik }.

Konversi penuh dapat ditemukan di sini .

N = 2

Kami sekarang memeriksa apakah input sama dengan 2. Ini dilakukan pada ¹2Qibagian tersebut. Setelah itu, jika sama, kami mendorong karakter spasi 4 kali menggunakan ð4×. Setelah itu, kami mendorong " U U"string dan menyimpannya menggunakan ©(ide secara terang-terangan dicuri dari Jelly: p). Kami kembali Jmenumpuk dan mencetak ini dengan baris baru. Setelah itu, kami mendorong "> :"tali, mengambil " U U"menggunakan ®, Join stack dan Duplicate string ini dan mencetak kedua ini pada baris yang sama.

Kuis singkat, apa yang akan ini lakukan: " > "?®,?

Setelah mencetak string di atas, kita mendapatkan duplikat dari garis kedua wajah, dan mencetak ini (karena itu sama dengan baris ke-2).

Bagian terakhir yang dicakup oleh kasus ini adalah:

ð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

Yang ini lebih mudah untuk dijelaskan:

¹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
sumber
Plz penjelasan? : P
Addison Crump
@VoteToClose Done :)
Adnan
"terlalu lama"? Lihat jawaban saya :-P
Luis Mendo
2
TIL yang duri duri. Tampaknya.
Alex A.
8

Vitsy , 172 171 159 byte

Ya ampun. Jika saya ingin sesuatu untuk memamerkan kekuatan metode, saya mendapatkannya.

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

Cobalah secara Online!

Cara kerjanya adalah dengan memanggil berbagai metode. Penjelasannya di bawah ini:

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

Kode ini konyol. Bentuk verbose adalah:

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

Penjelasan

Menggunakan kompresi masuk-ke ​​saya dengan JavaScript: enkode run-length. Angka-angka 1untuk 9memetakan ke banyak ruang, 0peta ke wajah bebek yang marah, dan karakter lain tetap sama.

pengguna81655
sumber
1
Sangat mengesankan untuk bahasa non-golf, tetapi baris tepat di atas dan di bawah pusat untuk n = 3 tampaknya hilang.
ETHproduk
@ ETProduksi Ups, tidak yakin apa yang terjadi di sana. Diperbaiki sekarang
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

Berisi yang tidak patut dicetak. Uji secara online!

Bagaimana itu bekerja

Dua string pertama tidak dikompresi sama sekali. Yang ketiga dikompres hanya dengan mengganti setiap spasi dengan panjangnya, lalu " U3U"dengan"z" . Yang terakhir lebih kompleks:

  1. Ganti setiap proses 2-9 spasi dengan panjangnya.
  2. Ganti >:Udengan1 .
  3. Ganti 191\ndengan 4. (4 tidak digunakan di bagian lain dalam string.)
  4. Petakan setiap kode byte yang valid ( 10- 255, atau 0A- FF) ke karakter dengan kode karakter tersebut.

String yang dihasilkan hanya sepanjang 21 19 byte, tetapi dekompresi membutuhkan 31 lainnya 29 lainnya.

Setelah mendekompresi string, kita cukup mengambil item pada posisi U, input. (Array diatur [0,3,2,1]karena ada bug yang membuatnya dihitung dari akhir array bukan dari awal.)

[                      // 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.)
Produksi ETH
sumber
5

MATL , 283 182 byte

101 byte disimpan berkat @Adnan!

Ini menggunakan angka desimal untuk menyandikan indeks 0...3 ke empat karakter untuk kasus 2 dan 3. Angka desimal mungkin dapat dikompresi menggunakan pengkodean basis-64, tetapi dukun!

Untuk kasus 3, trik yang sangat bagus yang disarankan oleh @Adnan digunakan: mendefinisikan urutan biner untuk menyandikan setiap baris, di mana 0dan 1sesuai dengan ruang dan >:Umasing - masing.

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

Cobalah online!

Luis Mendo
sumber
3
Bagaimana dengan kasus terakhir, menggunakan ini , mengganti 1spasi dengan dan 0dengan >:Ustring. Saya tidak tahu apakah itu akan membantu.
Adnan
@ Adnan Itu ide yang bagus!
Luis Mendo
5
@Adnan 101 byte disimpan: -O
Luis Mendo
Itu menakjubkan! Jawaban yang sangat bagus! :)
Adnan
5

Cinnamon Gum, 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-bersaing sejak Cinnamon Gum dibuat setelah tantangan ini.

Cobalah online.

Penjelasan

Byte pertama lmenentukan mode: dalam hal ini memberitahu Cinnamon Gum untuk masuk ke mode tabel pencarian. Cinnamon Gum kemudian mendekompres sisa string (yang telah dikompresi dengan zopfli --deflate) menjadi ini:

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

Kemudian dibagi ;, menempatkan setiap pasangan nilai kunci (dengan &sebagai pembatas) dalam kamus, dan output dictionary[input].

sebuah spaghetto
sumber
5

JavaScript ES6, 232 223 203 188 byte

Disimpan 29 44 byte berkat produk 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]

Uji itu!

Conor O'Brien
sumber
pasti dapat atob'd ... jika tidak, bisa 1dan 0s dibuat menjadi nomor trinary?
Downgoat
1
@Downgoat btoaing dan trinary keduanya lebih panjang.
Conor O'Brien
Jawabannya tua, tapi Anda bisa menghemat seperti 15 byte dengan mengubah r+g+g+g+rke g+g+g+rdan menyesuaikan string sesuai.
ETHproduksi
0

GML, 265 byte

Port jawaban @ kittycat3141 yang sangat baik, dengan saran untuk golf lebih lanjut dengan dua variabel baru (yang saya beri nama G dan H) oleh @VoteToClose. Saya juga berhasil mempersingkat lebih lanjut dengan sintaks GML yang relatif longgar.

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
sumber