Синяя утка, красная утка, серая утка


48

Итак, на прошлой неделе я отправил вызов, чтобы сыграть в Duck, Duck, Goose . Это привело к тому, что ряд миннесотцев прокомментировали свои региональные вариации «серая утка» .

Итак, вот правила:

Используя этот список цветов:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Напишите программу, которая будет следовать этим правилам:

  1. Выберите один из этих цветов, добавьте его к слову «утка» и напечатайте результат в новой строке.
  2. Если цвет не был «серый», повторите шаг 1.
  3. Если цвет был «Серый», завершите свою программу.

Правила, которые необходимо соблюдать:

  • Программа не должна последовательно печатать одинаковое количество строк.
  • Это может начаться на «Серая утка», но не следует делать последовательно.
  • В каждой строке должна быть ровно одна утка, и пустые строки не выводятся.
  • Между цветом и уткой должен быть хотя бы один пробел.
  • Пустое пространство до и после значительного выхода не имеет значения.
  • Случай вывода не имеет значения.
  • Цвета могут повторяться.
  • Вывод не обязательно должен содержать каждый цвет каждый раз, но, возможно, ваш код будет выводить каждый цвет.
  • Никакие цвета вне вышеуказанного массива не могут быть включены.
  • Серый или серый приемлемы в вашем ответе.
  • Цвета не должны быть последовательно в одном и том же порядке.
  • Стремитесь к самой короткой программе. Наименьшее количество байтов побеждает.

Пример вывода:

Green duck
Orange duck
Yellow duck
Indigo duck
Yellow duck 
Gray duck

Спасибо @Mike Hill за первое предупреждение об этом варианте.


Какие-либо правила распределения по результатам? Потому что я мог генерировать действительные выходные данные, выбирая из не серых цветов случайное количество раз, а затем печатать Greyодин раз (так что мне не пришлось бы выбирать из всех них и проверять, выбрал ли я Grey).
Мартин Эндер

@MartinEnder Это нормально. «Цвета не должны быть в одном и том же порядке». имеет значение, но ничто не помешает вам выбрать серый отдельно в конце.
AJFaraday

3
Разрешено ли альтернативное написание "серый"?
12Me21

@ 12Me21 Любопытно, хотя. Есть ли техническая причина для этого? Или просто эстетический?
AJFaraday

2
По моему не столь скромному мнению, вам не хватает одного чрезвычайно важного цвета утки. Синий близок, но недостаточно точен.
cobaltduck

Ответы:


6

05AB1E , 42 40 байт

Сохранено 2 байта благодаря Эрику Аутгольферу

[“ëßigo°¯†¾›ÈŠÛˆ¨‡—°Íolet“#7ÝΩ©è'Ðœðý,®#

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


3
Я заметил много этих нечитаемых языков игры в гольф. Есть ли компилятор из более удобочитаемой формы?
AJFaraday

@AJFaraday: Не то, чтобы я знал. Единственный из известных мне языков для игры в гольф - это древесный уголь.
Эминья

1
Вы можете сжать вашу строку дальше, indесть ëß!
Эрик Outgolfer

1
У Gs2 тоже есть. Но этот язык не так часто используется в наши дни.
рекурсивный


46

LuaLaTeX, 220 211 символов

команда:

lualatex -interaction nonstopmode

Не самый короткий, но самый модный. Основано на решении @ skillmon

введите описание изображения здесь

\RequirePackage{tikzducks}\newcount\b\let~\def~\0{red}~\1{orange}~\2{yellow}~\3{green}~\4{blue}~\5{cyan}~\6{violet}~\7{gray}\loop\b\uniformdeviate8\tikz\duck[body=\csname\the\b\endcsname]; \ifnum\b<7\repeat\stop

9
Боже мой! Это просто лучшая вещь! Ты сделал мой день, Алекс.
AJFaraday

@AJFaraday действительно удивительная идея, чтобы использовать tikzducksтам :)
Skillmon

6
+1 и мои извинения за выбор такого длинного названия пакета!

@ sam, ты получил мое отпущение грехов
AlexG

8
Здавствуйте, мистер. Человек , который я определенно не знаю других технических сообществ , как TeX.sx . Поскольку этот ответ охватывает некоторых птиц семейства Anatidae , я чувствую себя обязанным предоставить знак одобрения, проголосовав за него. :)
Пауло Середа

26

6502 машинный код (C64), 124 байта

00 C0 AD 12 D0 85 02 A2 17 8E 18 D0 A5 02 F0 03 0A 90 02 49 1D 85 02 A8 CA 10
02 A2 2F BD 42 C0 D0 F6 88 D0 F3 86 FB E8 BD 42 C0 F0 06 20 16 E7 E8 D0 F5 AA
BD 73 C0 F0 06 20 16 E7 E8 D0 F5 A6 FB D0 C9 60 00 C7 52 45 59 00 D2 45 44 00
CF 52 41 4E 47 45 00 D9 45 4C 4C 4F 57 00 C7 52 45 45 4E 00 C2 4C 55 45 00 C9
4E 44 49 47 4F 00 D6 49 4F 4C 45 54 00 20 44 55 43 4B 0D 00

Интернет демо - Использование:SYS49152.

Скриншот


Пояснение (комментируется разборка):

         00 C0       .WORD $C000        ; load address
.C:c000  AD 12 D0    LDA $D012          ; current rasterline as seed
.C:c003  85 02       STA $02            ; to "random" value
.C:c005  A2 17       LDX #$17           ; cfg for upper/lower, also use as
.C:c007  8E 18 D0    STX $D018          ;    initial index into colors array
.C:c00a   .loop:
.C:c00a  A5 02       LDA $02            ; load current random val
.C:c00c  F0 03       BEQ .doEor         ; zero -> feedback
.C:c00e  0A          ASL A              ; shift left
.C:c00f  90 02       BCC .noEor         ; bit was shifted out -> no feedback
.C:c011   .doEor:
.C:c011  49 1D       EOR #$1D
.C:c013   .noEor:
.C:c013  85 02       STA $02            ; store new random val
.C:c015  A8          TAY                ; use as counter for next color string
.C:c016   .findloop:
.C:c016  CA          DEX                ; next char pos in colors (backwards)
.C:c017  10 02       BPL .xok           ; if negative ...
.C:c019  A2 2F       LDX #$2F           ;    load length of colors - 1
.C:c01b   .xok:
.C:c01b  BD 42 C0    LDA .colors,X      ; load character from colors
.C:c01e  D0 F6       BNE .findloop      ; not zero, try next character
.C:c020  88          DEY                ; decrement random counter
.C:c021  D0 F3       BNE .findloop      ; not zero, continue searching
.C:c023  86 FB       STX $FB            ; save character position
.C:c025  E8          INX                ; increment to start of color
.C:c026   .outloop:
.C:c026  BD 42 C0    LDA .colors,X      ; output loop for color string
.C:c029  F0 06       BEQ .duckout
.C:c02b  20 16 E7    JSR $E716
.C:c02e  E8          INX
.C:c02f  D0 F5       BNE .outloop
.C:c031   .duckout:
.C:c031  AA          TAX                ; A is now 0, use as char pos for duck
.C:c032   .duckoutloop:
.C:c032  BD 73 C0    LDA .duck,X        ; output loop for duck string
.C:c035  F0 06       BEQ .outdone
.C:c037  20 16 E7    JSR $E716
.C:c03a  E8          INX
.C:c03b  D0 F5       BNE .duckoutloop
.C:c03d   .outdone:
.C:c03d  A6 FB       LDX $FB            ; load saved character position
.C:c03f  D0 C9       BNE .loop          ; not zero -> continue main loop
.C:c041  60          RTS                ; zero was start of "Grey" -> done
.C:c042   .colors:
.C:c042  00 c7 52 45    .BYTE 0, "Gre"
.C:c046  59 00 d2 45    .BYTE "y", 0, "Re"
.C:c04a  44 00 cf 52    .BYTE "d", 0, "Or"
.C:c04e  41 4e 47 45    .BYTE "ange"
.C:c052  00 d9 45 4c    .BYTE 0, "Yel"
.C:c056  4c 4f 57 00    .BYTE "low", 0
.C:c05a  c7 52 45 45    .BYTE "Gree"
.C:c05e  4e 00 c2 4c    .BYTE "n", 0, "Bl"
.C:c062  55 45 00 c9    .BYTE "ue", 0, "I"
.C:c066  4e 44 49 47    .BYTE "ndig"
.C:c06a  4f 00 d6 49    .BYTE "o", 0, "Vi"
.C:c06e  4f 4c 45 54    .BYTE "olet"
.C:c072  00             .BYTE 0
.C:c073   .duck:
.C:c073  20 44 55 43    .BYTE " duc"
.C:c077  4b 0d 00       .BYTE "k", $d, 0

Извините, ваша демка, похоже, не выводит никакого контента, относящегося к уткам.
AJFaraday

1
@AJFaraday, пожалуйста, обратите внимание на часть «использование» ... команда для запуска это sys 49152.
Феликс Пальмен,

Хорошо, это сделало мой день :)
AJFaraday

1
Это было потрясающе. Прошло много времени с тех пор, как я написал сборку c64.
LSD

2
@lsd: то же самое здесь! Моей самой первой программой была сборка 6502 на C64, потому что я только что получил ее, и мой друг дал мне книгу 6502 с заданием «напиши игру!» чтобы заставить меня писать что-то! (отличный способ! это был отличный мотиватор, чтобы не просто читать, но на самом деле что-то писать). написал программу «Змея» размером 192 байта (iirc) (с умным двойным указателем, imo, указывающим на голову и хвост позиции змеи) ... первая попытка: он увеличился за нижний край, «съел» в остальная часть барана растет на любом «@», так как я забыл установить стены ^^
Оливье Дюлак


10

Такси , 1995 байт

Go to Heisenberg's:w 1 r 3 r 1 l.[a]Pickup a passenger going to Divide and Conquer.8 is waiting at Starchild Numerology.8 is waiting at Starchild Numerology.Go to Starchild Numerology:n 1 l 3 l 1 l 3 l.Pickup a passenger going to Divide and Conquer.Pickup a passenger going to Multiplication Station.Go to Divide and Conquer:w 1 r 3 r 1 r 2 r 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 l 1 l 2 l.Pickup a passenger going to What's The Difference.Pickup a passenger going to Trunkers.Go to Zoom Zoom:n.Go to Trunkers:w 3 l.Pickup a passenger going to What's The Difference.Go to What's The Difference:w 2 r 1 l.Pickup a passenger going to Multiplication Station.1 is waiting at Starchild Numerology.Go to Starchild Numerology:e 1 r 1 l 3 l.Pickup a passenger going to Addition Alley.Go to Multiplication Station:w 1 r 2 r 1 r 4 l.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 2 l 1 r 3 l 1 l.Pickup a passenger going to The Underground.'Red duck\n' is waiting at Writer's Depot.'Orange duck\n' is waiting at Writer's Depot.'Yellow duck\n' is waiting at Writer's Depot.'Green duck\n' is waiting at Writer's Depot.'Blue duck\n' is waiting at Writer's Depot.'Indigo duck\n' is waiting at Writer's Depot.'Violet duck\n' is waiting at Writer's Depot.'Grey duck' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 l.[b]Pickup a passenger going to Narrow Path Park.Go to Narrow Path Park:n 3 r 1 l 1 r.Go to The Underground:e 1 r.Switch to plan "c" if no one is waiting.Pickup a passenger going to The Underground.Go to Writer's Depot:s 2 r 1 l 2 l.Switch to plan "b".[c]Go to Narrow Path Park:n 4 l.Pickup a passenger going to Post Office.Go to Post Office:e 1 r 4 r 1 l.Go to Writer's Depot:s 1 r 1 l 2 l.Switch to plan "a" if no one is waiting.[d]Pickup a passenger going to Sunny Skies Park.Go to Sunny Skies Park:n 2 r.Go to Writer's Depot:n 1 l.Switch to plan "e" if no one is waiting.Switch to plan "d".[e]Go to Heisenberg's:n 3 r 3 r.Switch to plan "a".

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

Я думаю, что стоит отметить, что 47% этого кода просто выбирает случайное целое число от 1 до 8.
Кроме того, Такси настолько многословно, что жестко кодировать код duck\nпосле каждого цвета, а не объединять его позже.
Вот версия без гольфа:

Go to Heisenberg's: west 1st right 3rd right 1st left.

[Pick up a random INT 1-8 going to The Underground]
[a]
Pickup a passenger going to Divide and Conquer.
8 is waiting at Starchild Numerology.
8 is waiting at Starchild Numerology.
Go to Starchild Numerology: north 1st left 3rd left 1st left 3rd left.
Pickup a passenger going to Divide and Conquer.
Pickup a passenger going to Multiplication Station.
Go to Divide and Conquer: west 1st right 3rd right 1st right 2nd right 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st left 1st left 2nd left.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to Trunkers.
Go to Zoom Zoom: north.
Go to Trunkers: west 3rd left.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: west 2nd right 1st left.
Pickup a passenger going to Multiplication Station.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: east 1st right 1st left 3rd left.
Pickup a passenger going to Addition Alley.
Go to Multiplication Station: west 1st right 2nd right 1st right 4th left.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: north 2nd left 1st right 3rd left 1st left.
Pickup a passenger going to The Underground.

[Use the random INT to select a color]
'Red duck\n' is waiting at Writer's Depot.
'Orange duck\n' is waiting at Writer's Depot.
'Yellow duck\n' is waiting at Writer's Depot.
'Green duck\n' is waiting at Writer's Depot.
'Blue duck\n' is waiting at Writer's Depot.
'Indigo duck\n' is waiting at Writer's Depot.
'Violet duck\n' is waiting at Writer's Depot.
'Grey duck' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st left.
[b]
Pickup a passenger going to Narrow Path Park.
Go to Narrow Path Park: north 3rd right 1st left 1st right.
Go to The Underground: east 1st right.
Switch to plan "c" if no one is waiting.
Pickup a passenger going to The Underground.
Go to Writer's Depot: south 2nd right 1st left 2nd left.
Switch to plan "b".

[Output the selected color]
[c]
Go to Narrow Path Park: north 4th left.
Pickup a passenger going to Post Office.
Go to Post Office: east 1st right 4th right 1st left.

[If the color was grey, exit by error]
Go to Writer's Depot: south 1st right 1st left 2nd left.
Switch to plan "a" if no one is waiting.

[Get rid of the rest of the colors]
[You could throw them off a bridge but you won't get paid]
[d]
Pickup a passenger going to Sunny Skies Park.
Go to Sunny Skies Park: north 2nd right.
Go to Writer's Depot: north 1st left.
Switch to plan "e" if no one is waiting.
Switch to plan "d".

[Start over from the beginning]
[e]
Go to Heisenberg's: north 3rd right 3rd right.
Switch to plan "a".

Это было весело читать.
Макотосан

Боже, это эзотерика! Я не могу начать понимать, как это работает.
Очень

Кажется, это связано с Fetlang
Skillmon

8

Java (OpenJDK 9) , 133 байта

v->{for(int x=9;x>0;)System.out.println("Grey,Red,Orange,Yellow,Green,Blue,Indigo,Violet".split(",")[x+=Math.random()*8-x]+" duck");}

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

Пояснения

v->{                              // Void-accepting void lambda function
  for(int x=9;x>0;)               //  Loop until x is zero
    System.out.println(           //   Print...
        "Grey,Red,Orange,         //       colors, "Grey" first
         Yellow,Green,Blue,       //          more colors
         Indigo,Violet"           //          more colors
        .split(",")               //       as an array
          [x+=Math.random()*8-x]  //       pick one randomly, use implicit double to int cast with "x+=<double>-x" trick
        +" duck");                //      Oh, and append " duck" to the color.
}

8

Рубин , 93 91 90 89 87 86 85 байт

Спасибо Dom Hastings за сохранение 2 байта, Кирилла Л. 1 байт и Асона Тухида 1 байт!

puts %w(Red Orange Yellow Green Blue Indigo Violet Grey)[$.=rand(8)]+" duck"while$.<7

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


Вы можете удалить ()код вокруг, и если вы используете $.вместо того, sчтобы хранить индекс, вы можете sвообще избежать создания (так $.как он предварительно инициализирован для номера строки!). Вам нужно будет перейти Greyв конец списка и проверить $.<7вместо этого. хотя. Надеюсь, это поможет!
Дом Гастингс

@DomHastings Спасибо! Я искал способ избавиться s=1и $.был идеальным!
Кристиан Лупаску

Думаю, через некоторое время вы также можете убрать пробел, Руби, похоже, не жалуется на это.
Кирилл Л.

@KirillL. Это верно, спасибо! У меня раньше было while s...и место было нужно. Не видел этой возможности после перехода sна $..
Кристиан Лупаску,


7

Язык сценариев работы Flashpoint , 133 байта

f={s="";v=s;while{v!="grey"}do{v=["Red","Orange","Yellow","Green","Blue","Indigo","Violet","Grey"]select random 7;s=s+v+" duck\n"};s}

Звоните с:

hint call f

Пример вывода:

Сначала я как-то неправильно понял задачу, как будто цель состояла в том, чтобы просто вывести различное количество строк, не обязательно заканчивающихся линией «Серой утки». После этой неверной интерпретации получился немного более интересный фрагмент кода:

f={s="";c=[1];c set[random 9,0];{s=s+(["Red","Orange","Yellow","Green","Blue","Indigo","Violet","Grey"]select random 7)+" duck\n"}count c;s}

7

pdfTeX, 231 220 219 209 207 байт

\newcount\b\let~\def~\0{Red}~\1{Orange}~\2{Yellow}~\3{Green}~\4{Blue}~\5{Indigo}~\6{Violet}~\7{Gray}~\9{ }\newlinechar`z\loop\b\pdfuniformdeviate8\message{z\csname\the\b\endcsname\9duck}\ifnum\b<7\repeat\bye

LuaTeX, 216 206 204 байта

\newcount\b\let~\def~\0{Red}~\1{Orange}~\2{Yellow}~\3{Green}~\4{Blue}~\5{Indigo}~\6{Violet}~\7{Gray}~\9{ }\newlinechar`z\loop\b\uniformdeviate8\message{z\csname\the\b\endcsname\9duck}\ifnum\b<7\repeat\bye





4

Октава , 114 112 байт

do disp([strsplit('Red Orange Yellow Green Blue Indigo Violet'){i=randi(7)},' duck'])until i>6
disp('Grey duck')

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

Существует множество различных опций размером от 112 до 118 байт ... Некоторые инициализируют индекс в начале и уменьшают его случайным числом для каждого цикла и ждут, пока он не станет равным 0 . Другие используют printfвместо того, dispчтобы избегать некоторых скобок и так далее.


Маленький вопрос: есть ли в октаве символ, который делает то же самое, что и & в Excel, потому что я думаю, что тогда можно сократить код еще дальше.
Michthan

1
К сожалению, нет ... Строки должны быть объединены в квадратные скобки (или использовать такие функции, как catи horzcat. Спасибо, хотя :)
Stewie Griffin

4

PHP , 133 125 111 108 97 92 байта

<?for(;$b=[Red,Orange,Yellow,Green,Blue,Indigo,Violet][rand(0,7)];)echo"$b duck
"?>Grey duck

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

-8 байт благодаря @Olivier Grégoire

-3 байта благодаря @manatwork

-11 байт благодаря @Dom Hastings


2
В строке цвета и тесте измените Greyна X, так как он не используется. Вы получите 6 байтов.
Оливье Грегуар

@ OlivierGrégoire О, правда. Спасибо за это :)
Давид

1
Реверс в forсостоянии «S не нуждаются в круглых скобках: x!=$b=$a[array_rand($a)]. Кстати, ?>завершает заявление, нет необходимости ;перед ним.
Манатворк

@ manatwork О, хорошо! Я обновлю свой ответ сейчас!
Давид

2
Вы можете сохранить еще несколько байтов, вообще не включая их xи используя $b=$a..в качестве условия и используя rand(0,7)вместо array_rand. Вы можете удалить перевод строки между ?>и Grey duckтоже. Кроме того, ваша ссылка на TIO все еще содержит полные теги, вы можете добавить их -d short_open_tag=onк флагам, чтобы это работало! :)
Дом Гастингс


4

Баш, 96 байт

a=(Grey Red Orange Yellow Green Blue Indigo Violet);for((i=1;i;));{ echo ${a[i=RANDOM%8]} duck;}

Благодаря @DigitalTrauma.


Много возможностей для игры в гольф - ознакомьтесь с советами по игре в гольф
Digital Trauma

@DigitalTrauma Я спешил, но хотел чистого решения Bash без GNU coreutils. Я мог бы уменьшить его со 112 до 105 байт.
rexkogitans

Да, мне тоже нравятся ответы в чистом виде. Вот еще 10 байт
Цифровая травма

Я раздели >0, однако, я ушел ${#a}вместо 8.
rexkogitans

Почему вы должны сохранить ${#a}вместо 8? Это код-гольф - нет необходимости придавать вашему коду универсальность, чтобы его можно было модифицировать под разное количество цветов. Все, что вам нужно сделать, это соответствовать спецификации в наименьшем количестве байтов.
Цифровая травма


3

AWK , 114 байт

{srand();for(split("Red9Orange9Yellow9Green9Blue9Indigo9Violet9Grey",A,9);r<8;print A[r]" duck")r=int(8*rand()+1)}

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

объяснение

{srand();                  # Seed rand to obtain different sequence each run
for(
     split("Red9Orange9Yellow9Green9Blue9Indigo9Violet9Grey",
            A,9);          # Split on 9 to avoid using '"'s
     r<8;
     print A[r]" duck")    # Print the colored ducks
     r=int(8*rand()+1)     # AWK uses 1-indexing not 0-indexing when splitting strings into arrays
}

Обратите внимание, что это требует «некоторого» ввода. Ввод может быть пустым. Чтобы избежать необходимости ввода, добавьте в первую строкуBEGIN


3

PowerShell , 94 байта

for(;$r-ne'Grey'){$r=-split"Red
Orange
Yellow
Green
Blue
Indigo
Violet
Grey"|Random;"$r Duck"}

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

Петли пока $rне равны Grey. Внутри цикла, -splitв виде литеральной строки на новых строках, выбирает Randomодну из них, затем печатает цвет плюс Duck(технически, он остается на конвейере, и очистка конвейера на следующей итерации цикла вызывает a Write-Output). Обратите внимание, что теоретически возможно, Greyчтобы никогда не было выбрано, и цикл продолжался бесконечно, но это почти никогда (в смысле вероятности) не произойдет.


3

R 101 байт

cat(paste(c(sample(scan(,""),rexp(1),T),"gray"),"duck\n"))
Red
Orange
Yellow
Green
Blue
Indigo
Violet

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

Сильно вдохновлен ответом @ user2390246 на соответствующий вызов. Нам нужны два источника случайности: изменение порядка цветов и выборка не-серых цветов утки. sampleБудет принимать случайную выборку случайного размера заданного по экспоненциальному распределению с параметром скорости 1, усеченной до целого числа. Используя экспоненциальную distrubtion , к сожалению , означает , что существует вероятность того , exp(-8)или вокруг , 0.0003354 что образец будет по крайней мере 8, таким образом , мы должны образца replace=T.


затем вы можете заменить \nего фактическим символом новой строки для 1
MickyT

Кроме того, вы можете сэкономить немного, используя colors()[c(26,254,498,552,640,652)]вместо этого scan(..)должно быть около 83
MickyT

@MickyT ......... Я недостаточно использую графику R, чтобы помнить обо всех хороших встроенных графических функциях colors()! Это несколько хороших гольфов, которые, я думаю, вы должны опубликовать в качестве собственного ответа, поскольку это менее элегантный способ получения цветов.
Джузеппе

Хорошо, тогда я
опубликую

3

Python 2 , 138 133 120 117 116 байтов

import os
while id:id=ord(os.urandom(1))%8;print"Grey Red Orange Yellow Green Blue Indigo Violet".split()[id],'duck'

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

Гораздо лучше с некоторыми идеями от @EriktheOutgolfer. Спасибо!

-3 больше благодаря @ovs

-1 с благодарностью @Rod за новый классный трюк узнал :-)


3

Сетчатка , 69 68 байт

Спасибо Лео за сохранение 1 байта.

.^/y/{K`Red¶Orange¶Yellow¶Green¶Blue¶Indigo¶Violet¶Grey
" duck¶">?G`

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

объяснение

./y/^{K`Red¶Orange¶Yellow¶Green¶Blue¶Indigo¶Violet¶Grey

.подавляет неявный вывод в конце программы (в противном случае мы получили бы две серые утки). /y/^{оборачивает всю программу в цикл, который продолжается до тех пор, пока рабочая строка не содержит y. Остальная часть этой строки устанавливает рабочую строку в список всех цветов, разделенных переводом строки.

" duck¶">G?`

Мы извлекаем случайную строку из рабочей строки (и, следовательно, случайный цвет). И мы печатаем результат с трейлингом duckи переводом строки.


3

MATL , 68 64 байта

`'DYCIXMSQ(qm#Q$4{#is,Gh1(=lAjUSId;&'F2Y232hZaYb8YrX)' duck'h7Mq

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

объяснение

`                         % Do...while
  'DYCI···Id;&'           %   Push this string (to be decompressed by base conversion)
  F                       %   Push false
  2Y2                     %   Push string 'abc...xyz'
  32                      %   Push 32 (ASCII for space)
  h                       %   Concatenate horizontally. Gives 'abc...xyz '
  Za                      %   Base-convert from alphabet of all printable ASCII
                          %   characters except single quote (represented by input
                          %   false) to alphabet 'abc...xyz '. Produces the string
                          %   'grey red ··· violet'
  Yb                      %   Split on space. Gives a cell array of strings
  8Yr                     %   Random integer from 1 to 8, say k
  X)                      %   Get the content of the k-th cell
  ' duck'                 %   Push this string
  h                       %   Concatenate horizontally
  7M                      %   Push k again
  q                       %   Subtract 1
                          % Implicit end. Run a new iteration if top of the stack
                          % is non-zero
                          % Implicit display

3

Python 3, 130 , 128 , 127 , 126 , 125 байтов

from random import*
d,c=1,'Grey Red Orange Yellow Green Blue Indigo Violet'.split()
while d!=c[0]:d=choice(c);print(d,'duck')

-1 от @ElPedro!
-1 от меня
-1 от @Bubbler!

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


Можете ли вы переместить Грэя вперед и d!=c[0]сохранить байт?
ElPedro

print(d,'duck')сохранить байт. Разделителем по умолчанию является пробел.
Bubbler

3

Java (JDK 10) , 287 байт

Random r=new Random();int i;String c;do{i=r.nextInt(8);switch(i){case 0:c="Red";break;case 1:c="Orange";break;case 2:c="Yellow";break;case 3:c="Green";break;case 4:c="Blue";break;case 5:c="Indigo";break;case 6:c="Violet";break;default:c="Gray";}System.out.println(c+" duck");}while(i!=7)

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

Мой самый первый Codegolf! Очевидно, что он не конкурентоспособен, просто счастлив, что выучил достаточно Java (в настоящее время в CS200), чтобы иметь возможность участвовать.


2

Котлин , 122 байта

while({x:Any->println("$x duck");x!="Grey"}("Red,Orange,Yellow,Green,Blue,Indigo,Violet,Grey".split(",").shuffled()[0])){}

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


1
Может быть полезно кому-то там, чтобы получить случайное целочисленное значение в Kotlin, Вы можете использовать следующее: (0..7) .shuffled () [0] Короче: (Math.random () * 8) .toInt ()
Макотосан

2

MS-SQL, 158 байт

DECLARE @ VARCHAR(6)a:SELECT @=value FROM STRING_SPLIT('Red,Orange,Yellow,Green,Blue,Indigo,Violet,Grey',',')ORDER BY NEWID()PRINT @+' duck'IF @<>'Grey'GOTO a

Основано в основном на превосходном ответе Развана , но с использованием STRING_SPLITфункции, специфичной для MS-SQL 2016 и более поздних версий. Также использует GOTOвместо WHILEцикла.

отформатирован:

DECLARE @ VARCHAR(6)
a:
    SELECT @=value FROM 
        STRING_SPLIT('Red,Orange,Yellow,Green,Blue,Indigo,Violet,Grey',',')
        ORDER BY NEWID()
    PRINT @+' duck'
IF @<>'Grey'GOTO a

2

T-SQL , 195 185 184 байта

DECLARE @ VARCHAR(9)=''WHILE @<>'Grey'BEGIN SELECT @=c FROM(VALUES('Red'),('Orange'),('Yellow'),('Green'),('Blue'),('Indigo'),('Violet'),('Grey'))v(c)ORDER BY NEWID()PRINT @+' Duck'END

1
Отличный вариант. Вы можете удалить пространство раньше BEGIN.
BradC

2

Python 2 , 98 байт

Смотри ма нет импорта!

v=0
while 1:x=id(v)%97%8;print"GVIYORGBrinererleodladeuyliln ee egog n  towe"[x::8],"duck";v=1/x,v

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

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

Довольно плохой генератор псевдослучайных чисел, засеянный с идентификатором объекта 0 (но, похоже, он соответствует спецификации), который многократно дает целое число x, в [0,7], который используется для нарезки списка символов из этого индекса в шаги 8, чтобы получить имя цвета, которое печатается вместе с duckкортежем, заставляя пробел между ними. Когда значение xстановится равным нулю Grey, печатается и оценка следующего ввода в ошибки генератора случайных чисел на основе модуля, пытающиеся разделить на ноль ( v=1/x,vпытается создать новый кортеж с первым элементом 1/x= 1/0)


Точно так же 100 в Python 3 с

v=0
while 1:x=id(v)%17%8;print("GVIYORGBrinererleodladeuyliln ee egog n  towe"[x::8],"duck");v=1/x,v
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.