Синя качка, червона качка, сіра качка


48

Отже, минулого тижня я поставив перед собою завдання зіграти на качку, качку, гусь . Це призвело до того, що ряд штатів Міннесота коментує свою регіональну варіацію "Сіра качка" .

Отже ось правила:

Використовуючи цей список кольорів:

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
На мою не дуже скромну думку, вам не вистачає одного надзвичайно важливого кольору качки. Синій близько, але недостатньо точний.
кобальтдук

Відповіді:


6

05AB1E , 42 40 байт

Збережено 2 байти завдяки Еріку Переверхувача

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

Спробуйте в Інтернеті!


3
Я помітив багато цих нечитаних мов для гольфу. Чи є компілятор із якоїсь більш читаної людини форми?
AJFaraday

@AJFaraday: Не те, про що я знаю. Єдиною мовою гольфу, яку я знаю, є одна з них - вугілля.
Емінья

1
Ви можете стиснути рядок далі, indє ëß!
Ерік Аутгольфер

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) (з, іммо, розумним подвійним покажчиком, що вказує на голову і на хвіст положення змії) ... спершу спробуйте: вона збільшила масштаб повз нижнього краю, "поїдаючи" в решта барана, що росте на будь-якому "@", коли я забув встановити стіни ^^
Олів'є Дулак


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.
Крім того, Taxi настільки багатослівний, що його важче кодувати 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".

Це було весело читати.
Макотосан

Голлі, це езотерика! Я не можу почати розуміти, як це працює. Багато розваг,
тхо

Здається, це стосується Фетланг
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 байт

Завдяки Дому Гастінгсу за збереження 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, тому що я думаю, що можна скоротити код ще далі.
Міхтан

1
На жаль, ні ... Рядки повинні бути об'єднані у квадратні дужки (або з використанням таких функцій, як catі horzcat. Хоча дякую :)
Стюі Гріффін

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)]. BTW, ?>припиняє заяву, ;перед нею немає потреби .
манатура

@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 Я поспішав, але хотів чистого рішення Баша без ядер GNU. Я міг би скоротити її від 112 до 105 байт.
rexkogitans

Так, мені також подобаються відповіді на суворість. Ось ще 10 байт відключено
Digital Trauma

Я роздягнувся >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(технічно це залишається на конвеєрі, а очищення конвеєра на наступній ітерації циклу спричиняє 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, усіченої до цілого числа. На жаль, використання експоненціального розподілу, на жаль, означає, що існує ймовірність того, що вибірка буде принаймні exp(-8)чи приблизно 0.0003354такою 8, тому ми маємо робити вибірку replace=T.


ви можете замінити \nфактичну нову лінію для 1
MickyT

також ви можете трохи заощадити, використовуючи colors()[c(26,254,498,552,640,652)]замість того, що scan(..)інше повинно зійти приблизно до 83
MickyT

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

гаразд, я опублікую це з парою невеликих змін
MickyT

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/^{загортає всю програму в цикл, який триває до тих пір, поки робоча рядок не містить a 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')щоб зберегти байт. Типовим роздільником є ​​пробіл.
Бубон

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)

Спробуйте в Інтернеті!

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


2

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

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

Спробуйте в Інтернеті!


1
Може бути корисним комусь там, щоб отримати значення випадкового цілого числа в Котліні, Ви можете використовувати наступне: (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.