Шарлатан


56

Никто не совсем уверен, что смайлик >:Uдолжен представлять, но многие ученые считают, что это похоже на злую утку . Давайте предположим, что это так.

задача

Учитывая целое число n от 0 до 3 включительно, выведите или верните

quack

если n = 0,

>:U

если n = 1,

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

если n = 2, или

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

если n = 3.

Вы можете предположить, что ввод всегда будет действительным. В выводе не должно быть начальных пробелов, но любое количество конечных пробелов вполне подойдет. Утки (за возможным исключением @cobaltduck) не допускают лазеек. Самый короткий код в байтах побеждает.


90
Сначала я подумал «ага, что такое утка?». К счастью, вы предоставили ссылку на страницу википедии.
Аднан

6
«Уток не допускают лазеек». Но ты птица, а не утка, значит ли это, что мы можем использовать лазейки? : P
Downgoat

6
@ Downgoat Нету. Кроме того, это редактирование было совершенно ненужным, поэтому я откатился назад.
Алекс А.

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

7
«Уток не допускают лазеек». Это, мой друг, опасный стереотип. Если бы я не знал твоих намерений, я мог бы обидеться.
cobaltduck

Ответы:


19

CJam, 108 90 85 байт

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

Обратите внимание, что некоторые символы непечатаемы. Попробуйте онлайн!

Фон

Первые два выхода несжимаемы в CJam.

Сжать последний вывод просто. Удалив все переводы строк, мы можем разделить результирующую строку при появлении >:Uи вычислить длину каждой результирующей строки пробелов.

Это приводит к массиву

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

который мы можем эффективно хранить, преобразовав его из базы 22 в базу 269, получив цифры

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

Поскольку каждая цифра меньше 256 , мы можем сохранить ее как один байт.

Наконец, сжатие третьего вывода становится проще, если мы транспонируем строки и столбцы:

 > > 
  >  

 : : 

UUUU 
    U
    U
    U
UUUU

Считая еще раз пробелы между непробельными символами, мы получаем массив

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

который становится

[115 159 99 84 166 123 36 236 6]

при транскодировании с базы 22 на базу 269.

Как это устроено

"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
Мне нравится дополнительный :Dмежду двумя строками.
Згарб

7
@Zgarb Он успокоил повелителя великих уток. Утка теперь улыбается.
Алекс А.

7
Я пролистал страницу, думая: «172 ... 162 ... 182 ... Я могу победить всех. Подожди, 90? О, это Денис
Непобедимый

22

Java, 303 286 байт

Сохранено 17 байтов благодаря @VoteToClose!

На самом деле это не самое короткое время, я просто подумал, что было бы интересно попробовать на Java.

Создает список строковых переменных, представляющих общие строки, затем создает массив всех выходных данных, а затем печатает правую.

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

Это мой первый ответ на этом сайте, поэтому, пожалуйста, скажите мне, если я сделал что-то не так.


2
Выглядит хорошо! Хороший первый пост, и добро пожаловать в PPCG!
Конор О'Брайен

@AlexA. Спасибо, что сообщили мне, я исправил это.
FlyingPiMonster

2
@ kittycat3141 Отлично выглядит. Хорошее решение и спасибо за участие в моем конкурсе! :)
Алекс А.

Оказывается , что D+Aи C+Bпоявляются достаточно часто , чтобы быть golfed дальше в 2 -х новых переменных. У меня также есть малейшее ощущение, что использование массива с циклом for может помочь, но я еще не понял, как это сделать ...
Addison Crump

9

05AB1E , 162 159 157 байт

Код

Черт возьми, слишком долго, но это по крайней мере что-то

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

Попробуйте онлайн!


объяснение

Существует первая часть кода ">:U"V, которая устанавливает Yэту строку. После этого мы просто проверяем, равен ли вход 3. Это делается на I3Qiчасти. Если равно, мы печатаем гигантскую сороку:

N = 3

Сначала начинается с ð16×16 символов пробела. После этого появляется номер 7166b. Это покрывает ">:U "часть, с небольшой помощью от Retina :). Я использовал этот скрипт для преобразования строки в двоичное число. После этого мы перейдем к 1ð:0Y:части, которая заменяет каждый 1с пробелом и каждый 0с Y, который был установлен в >:U. После этого мы Dдублируем эту строку, сохраняем ее в Xиспользовании Uи Jдобавляем в стек. Мы используем это ,, печатая полную строку с новой строкой. Все остальные после этого основаны на одном и том же принципе. Оператор if заканчивается на втором }.

Полное преобразование можно найти здесь .

N = 2

Теперь мы проверим, равен ли вход 2. Это делается на ¹2Qiчасти. После этого, если он равен, мы нажимаем пробел 4 раза, используя ð4×. После этого мы нажимаем на " U U"строку и храним ее, используя ©(идея явно украдена у Jelly: p). Мы снова Jраспаковываем стопку и печатаем ее с новой строки. После этого мы нажимаем "> :"строку, извлекаем " U U"использование ®, Jкладем в стек и Dдублируем эту строку и печатаем оба в одной строке.

Короткий тест, что это будет делать " > "?®,:?

После печати указанной выше строки мы получаем дубликат второй строки лица и печатаем его (так как он совпадает со второй строкой).

Последняя часть, охватываемая этим делом:

ð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

Это легче объяснить:

¹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

Пояснение плз? : P
Эддисон Крамп

@VoteToClose Done :)
Аднан

"слишком долго"? Смотрите мой ответ :-P
Луис Мендо

2
До тех пор, пока сороки крякают. По всей видимости.
Алекс А.

8

Витси , 172 171 159 байтов

О Боже. Если я хотел что-то, чтобы показать силу методов, я получил это.

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

Попробуйте онлайн!

Как это работает, вызывая различные методы внутри себя. Объяснение ниже:

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

Этот код смешной. Это многословная форма:

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 байта

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>

объяснение

Использует мое сжатие с JavaScript: кодирование длины строки. Цифры 1для 9сопоставления с таким количеством пробелов, 0карты с лицом сердитой утки и любой другой персонаж остаются прежними.


1
Очень впечатляет для языка без игры в гольф, но ряды, расположенные справа и снизу от центра для n = 3, по-видимому, отсутствуют.
ETHproductions

@ETHproductions Ой, не уверен, что там произошло. Исправлено сейчас.
user81655

7

Japt 116 105 102 99 96 байт

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

Содержит непечатный. Проверьте это онлайн!

Как это устроено

Первые две строки вообще не сжимаются. Третий сжимается просто путем замены каждой серии пробелов его длиной, а затем " U3U"на "z". Последний является более сложным:

  1. Замените каждый пробег 2-9 пробелов его длиной.
  2. Заменить >:Uна 1.
  3. Заменить 191\nна 4. ( 4не используется где-либо еще в строке.)
  4. Сопоставьте каждый действительный байт-код ( 10- 255или 0A- FF) с символом с этим символом.

Длина получаемой строки составляет всего 21 19 байт, но распаковка занимает еще 31 29.

После распаковки строк мы просто берем элемент в позиции U, вход. (Массив упорядочен, [0,3,2,1]потому что есть ошибка, из-за которой он считается от конца массива, а не от начала.)

[                      // 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 байта

101 байт сохранен благодаря @Adnan!

При этом используются десятичные числа для кодирования индексов 0... 3до четырех символов для случаев 2 и 3. Десятичные числа могут быть сжаты с использованием кодировки base-64, но кряк!

Для случая 3 используется очень хороший трюк, предложенный @Adnan: определить двоичные последовательности для кодирования каждой строки, где 0и 1соответствуют пробелу и >:Uсоответственно.

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

Попробуйте онлайн!


3
Как насчет в последнем случае, используя это , заменяя 1пробелы и 0с >:Uстроки. Я не знаю, поможет ли это.
Аднан

@ Adnan Это хорошая идея!
Луис Мендо

5
@Adnan 101 байт сохранено: -O
Луис Мендо

Это удивительно! Очень хороший ответ! :)
Аднан

5

Корица, 76 байт

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.

Не конкурирует, поскольку Cinnamon Gum была создана после этого испытания.

Попробуйте онлайн.

объяснение

Первый байт lопределяет режим: в этом случае он говорит Cinnamon Gum перейти в режим таблицы поиска. Cinnamon Gum затем распаковывает оставшуюся часть строки (которая была сжата zopfli --deflate) в это:

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

Затем он делится на ;, помещает каждую пару ключ-значение (с &разделителем) в словарь и выводит dictionary[input].


5

JavaScript ES6, 232 223 203 188 байт

Сохранено 29 44 байта благодаря 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]

Проверьте это!


конечно, это может быть atob'd ... если нет, можно ли сделать 1и 0с триальным числом?
Вниз

1
@ Downgoat btoaing и trinary оба длиннее.
Конор О'Брайен

Старый ответ, но вы могли бы сэкономить , как 15 байт, изменяя r+g+g+g+rк g+g+g+rи корректировке строки соответственно.
ETHпродукция

0

GML, 265 байт

Порт @ kittycat3141 - отличный ответ, с предложением поиграть в него еще с двумя новыми переменными (которые я назвал G и H) от @VoteToClose. Мне также удалось сократить его с помощью относительно свободного синтаксиса 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]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.