Niebieska kaczka, czerwona kaczka, szara kaczka

48

W zeszłym tygodniu opublikowałem wyzwanie, aby zagrać w Duck, Duck, Goose . Doprowadziło to do tego, że wielu minnesotańczyków komentowało swoją regionalną odmianę „szarej kaczki” .

Oto zasady:

Korzystanie z tej listy kolorów:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Napisz program, który będzie przestrzegał następujących zasad:

  1. Wybierz jeden z tych kolorów i dodaj go do słowa „kaczka” i wydrukuj wynik w nowej linii.
  2. Jeśli kolor nie był „Szary”, powtórz krok 1.
  3. Jeśli kolor był szary, zakończ swój program.

Zasady, których należy przestrzegać:

  • Program nie powinien konsekwentnie drukować tej samej liczby linii.
  • Może zaczynać się od „szarej kaczki”, ale nie powinien robić konsekwentnie.
  • W każdym wierszu powinna znajdować się dokładnie jedna kaczka i nie są generowane żadne puste wiersze.
  • Między kolorem a kaczką powinna znajdować się przynajmniej jedna spacja.
  • Biała przestrzeń przed i po znaczącym wyniku nie ma znaczenia.
  • Przypadek wyjścia nie ma znaczenia.
  • Kolory można powtarzać.
  • Dane wyjściowe nie muszą zawierać każdego koloru za każdym razem, ale musi być możliwe, że Twój kod wyświetli każdy kolor.
  • Nie można uwzględnić kolorów spoza powyższej tablicy.
  • W odpowiedzi można zaakceptować szary lub szary.
  • Kolory nie powinny być konsekwentnie w tej samej kolejności.
  • Cel najkrótszego programu. Najmniejsza liczba bajtów wygrywa.

Przykładowe dane wyjściowe:

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

Dzięki @Mike Hill za pierwsze powiadomienie mnie o tej odmianie.

AJFaraday
źródło
Jakieś zasady dotyczące podziału wyników? Ponieważ mogłem wygenerować prawidłowe dane wyjściowe, wybierając losowo liczbę kolorów innych niż szary, a następnie drukując Greyjeden raz (więc nie musiałbym wybierać spośród wszystkich i sprawdzać, czy wybrałem Grey).
Martin Ender
@MartinEnder W porządku. „Kolory nie powinny być zawsze w tej samej kolejności”. ma znaczenie, ale nie ma nic, co powstrzyma cię przed wybraniem szarości osobno na końcu.
AJFaraday,
3
Czy dozwolona jest pisownia alternatywna „szara”?
maja
@ 12Me21 Curious, tho. Czy jest tego techniczny powód? A może tylko estetyczny?
AJFaraday,
2
Moim niezbyt skromnym zdaniem brakuje jednego niezwykle ważnego koloru kaczki. Niebieski jest bliski, ale nie dość precyzyjny.
cobaltduck

Odpowiedzi:

6

05AB1E , 42 40 bajtów

Zaoszczędzono 2 bajty dzięki Erikowi Outgolfer

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

Wypróbuj online!

Emigna
źródło
3
Zauważyłem wiele z tych nieczytelnych języków golfowych. Czy istnieje kompilator w bardziej czytelnej dla człowieka formie?
AJFaraday,
@AJFaraday: Nie jestem tego świadomy. Jedynym znanym mi golfem, który ma jeden z nich, jest węgiel drzewny.
Emigna
1
Możesz jeszcze bardziej skompresować łańcuch, indjest ëß!
Erik the Outgolfer
1
Gs2 ma również jeden. Ale ten język nie jest obecnie używany tak często.
rekurencyjny
1
@ Simón: Strona kodowa
05AB1E
46

LuaLaTeX, 220 211 znaków

Komenda:

lualatex -interaction nonstopmode

Nie najkrótszy, ale najbardziej wymyślny. Na podstawie rozwiązania @ skillmon

wprowadź opis zdjęcia tutaj

\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
AlexG
źródło
9
Wielkie nieba! To jest po prostu najlepsza rzecz! Zrobiłeś mi dzień, Alex.
AJFaraday
@AJFaraday rzeczywiście niesamowity pomysł, aby tikzduckstam użyć :)
Skillmon
6
+1 i przepraszam za wybranie tak długiej nazwy pakietu!
@sam, dostaniesz moją rozgrzeszenie
AlexG
8
Dzień dobry panie. Osoba, która na pewno nie wiem od innych społeczności technicznych, takich jak TeX.sx . Ponieważ ta odpowiedź obejmuje niektóre ptaki z rodziny kaczkowatych , czuję się zmuszona do okazania dowodu uznania poprzez jej poprawienie. :)
Paulo Cereda
26

Kod maszynowy 6502 (C64), 124 bajty

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

Online demo - Zastosowanie:SYS49152.

zrzut ekranu


Objaśnienie (skomentowany demontaż):

         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
Felix Palmen
źródło
Przepraszam, twoje demo nie wydaje żadnych treści związanych z kaczką.
AJFaraday,
1
@AJFaraday zwróć uwagę na część „użycie” ... polecenie do uruchomienia to sys 49152.
Felix Palmen
Okej, to sprawiło, że mój dzień :)
AJFaraday
1
To było niesamowite. Minęło trochę czasu, odkąd napisałem asembler c64.
lsd
2
@lsd: to samo tutaj! moim pierwszym programem był montaż 6502 na C64, ponieważ właśnie go dostałem, a przyjaciel dał mi książkę 6502 z zadaniem „napisać grę!” zachęcić mnie do napisania czegoś! (świetny sposób! To był świetny motywator, aby nie tylko czytać, ale nawet coś pisać). napisał 192 bajtowy (iirc) program „Wąż” (z, imo, sprytnym podwójnym indeksem wskazującym na głowę i na ogon pozycji węża) ... pierwsza próba: powiększyła się poza dolną krawędź, „jedząc” w reszta barana rośnie na dowolnym „@”, ponieważ zapomniałem ustawić ściany ^^
Olivier Dulac
12

Perl 5 , 79 bajtów

say$_=(Grey,Red,Orange,Yellow,Green,Blue,Indigo,Violet)[rand 8]." duck"until/y/

Wypróbuj online!

Dom Hastings
źródło
10

Taxi , 1995 bajtów

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

Wypróbuj online!

Myślę, że warto zauważyć, że 47% tego kodu po prostu wybiera losową liczbę całkowitą od 1 do 8.
Poza tym Taxi jest tak gadatliwa, że ​​kodowanie duck\npo każdym kolorze jest znacznie krótsze niż konkatenacja go później.
Oto wersja bez gry w golfa:

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".
Inżynier Toast
źródło
Fajnie było czytać.
Makotosan
Golly, to ezoteryczne! Nie mogę zrozumieć, jak to działa. Dużo zabawy, choć :)
AJFaraday
Wydaje się, że jest to związane z Fetlang
Skillmon
8

Java (OpenJDK 9) , 133 bajty

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");}

Wypróbuj online!

Objaśnienia

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.
}
Olivier Grégoire
źródło
8

Rubinowy , 93 91 90 89 87 86 85 bajtów

Dzięki Dom Hastings za zapisanie 2 bajtów, Kirill L. 1 bajt i Asone Tuhid 1 bajt!

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

Wypróbuj online!

Cristian Lupascu
źródło
Możesz usunąć ()cały kod, a jeśli użyjesz $.zamiast sdo przechowywania indeksu, możesz scałkowicie uniknąć tworzenia (ponieważ $.jest on wstępnie zainicjowany na numer linii!) Musisz przejść Greyna koniec listy i $.<7zamiast tego sprawdzić chociaż. Mam nadzieję, że to pomaga!
Dom Hastings
@DomHastings Thanks! Szukałem sposobu na pozbycie się s=1i $.byłem idealny!
Cristian Lupascu,
Myślę, że po pewnym czasie możesz również usunąć miejsce, Ruby nie wydaje się na to narzekać.
Kirill L.
@KirillL. Zgadza się, dzięki! Wcześniej miałem while s...i miejsce było potrzebne. Nie widziałem tej możliwości po zmianie sna $..
Cristian Lupascu,
7

Operacyjny język skryptowy Flashpoint , 133 bajty

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}

Zadzwoń z:

hint call f

Przykładowe dane wyjściowe:

Na początku jakoś źle odczytałem wyzwanie, tak jakby celem było po prostu wyprowadzenie różnej liczby linii, niekoniecznie kończących się na linii „Grey duck”. W wyniku tej niepoprawnej interpretacji powstał nieco bardziej interesujący fragment kodu:

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}
Steadybox
źródło
7

pdfTeX, 231 220 219 209 207 bajtów

\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 bajtów

\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
Skillmon
źródło
5

Brachylog , 68 bajtów

"Grey","
Red
Orange
Yellow
Green
Blue
Indigo
Violet"ṇṛS," duck"ẉS¬?↰

Wypróbuj online!

Erik the Outgolfer
źródło
5

Rubinowy , 84 81 bajtów

Dzięki Dom Hastings za -3 bajty.

puts$_=%w[Red Orange Yellow Green Blue Indigo Violet Grey].sample+" duck"until/y/

Wypróbuj online!

Kirill L.
źródło
1
Jeśli się zapiszesz $_, możesz po prostu mieć until/y/na końcu -3!
Dom Hastings,
5

PHP, 89 bajtów

do echo[Grey,Red,Orange,Yellow,Green,Blue,Indigo,Violet][$i=rand()%8]," Duck
";while($i);

Uruchom -nrlub wypróbuj online .

Tytus
źródło
4

> <> , 107 bajtów

x<>" duck"a>
x<^"deR"
x<^"egnarO"
x<^"wolleY"
x<^"neerG"
x<^"eulB"
x<^"ogidnI"
x<^"teloiV"
x"Grey duck"r>o|

Wypróbuj online!

Sok
źródło
4

Oktawa , 114 112 bajtów

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

Wypróbuj online!

Istnieje wiele różnych opcji, które zawierają od 112 do 118 bajtów ... Niektóre inicjują indeks na początku i zmniejszają go o losową liczbę dla każdej pętli i czekają, aż wyniesie 0 . Inni używają printfzamiast dispunikać nawiasów i tak dalej.

Stewie Griffin
źródło
Małe pytanie: czy w oktawie jest symbol, który robi to samo co & w programie Excel, ponieważ myślę, że można jeszcze bardziej skrócić kod.
Michthan,
1
Niestety, nie ... Łańcuchy muszą być konkatenowane w nawiasach kwadratowych (lub przy użyciu funkcji takich jak cati horzcat. Dzięki jednak :)
Stewie Griffin
4

PHP , 133 125 111 108 97 92 bajtów

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

Wypróbuj online!

-8 bajtów dzięki @Olivier Grégoire

-3 bajty dzięki @manatwork

-11 bajtów dzięki @Dom Hastings

Davіd
źródło
2
W łańcuchu kolorów i teście zmień Greyna X, ponieważ nie jest używany. Zyskasz 6 bajtów.
Olivier Grégoire,
@ OlivierGrégoire Oh true. Dzięki za to :)
Davіd
1
Odwrócić for„s warunek nie potrzebują nawias: x!=$b=$a[array_rand($a)]. BTW, ?>kończy wypowiedź, nie ma potrzeby ;przed nią.
manatwork
@manatwork Ohh, nice! Zaktualizuję teraz swoją odpowiedź!
Davіd
2
Możesz zaoszczędzić jeszcze kilka bajtów, nie włączając go xwcale i nie wykorzystując $b=$a..jako warunku i używając rand(0,7)zamiast array_rand. Możesz usunąć nową linię między ?>i Grey duck. Również twój link TIO nadal miał pełne tagi, możesz dodać -d short_open_tag=ondo flag, aby to działało! :)
Dom Hastings
4

Narzędzia Bash + GNU, 72

shuf -e {Red,Orange,Yellow,Green,Blue,Indigo,Violet,Grey}\ Duck|sed /y/q

Wypróbuj online .

Cyfrowa trauma
źródło
4

bash, 96 bajtów

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

Dzięki @DigitalTrauma.

rexkogitans
źródło
Wiele możliwości gry w golfa - zapoznaj się ze wskazówkami do gry w golfa
Digital Trauma
@DigitalTrauma spieszyłem się, ale chciałem czystego rozwiązania Bash bez rdzeni GNU. Mógłbym go zmniejszyć z 112 do 105 bajtów.
rexkogitans
Tak, lubię też odpowiedzi z czystym uderzeniem. Oto kolejne 10 bajtów
Digital Trauma
Rozebrałem się >0jednak, ${#a}zamiast tego wyszedłem 8.
rexkogitans
Dlaczego musisz zachować ${#a}zamiast 8? To jest golf golfowy - nie ma potrzeby, aby kod był uogólniony, aby można go było modyfikować dla innej liczby kolorów. Wszystko, co musisz zrobić, to spełnić specyfikację w najmniejszej liczbie bajtów.
Digital Trauma
3

JavaScript, 104 bajty

f=_=>`grey,red,orange,yellow,green,blue,indigo,violet`.split`,`[n=Math.random()*8|0]+` duck
${n?f():``}`

Wypróbuj online

Kudłaty
źródło
1
FWIW, miałem ten wariant , ale utknąłem również na 104 bajtach.
Arnauld,
Szkoda, że ​​nie możemy tutaj użyć new DateRNG.
Shaggy
3

AWK , 114 bajtów

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

Wypróbuj online!

Wyjaśnienie

{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
}

Zauważ, że wymaga to „trochę” danych wejściowych. Dane wejściowe mogą być puste. Aby uniknąć konieczności wprowadzania danych, wstaw pierwszy wiersz za pomocąBEGIN

Robert Benson
źródło
3

PowerShell , 94 bajty

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

Wypróbuj online!

Pętle, aż $rbędzie równa Grey. Wewnątrz pętli -splits jest dosłowny ciąg znaków nowej linii, wybiera Randomjeden z nich, a następnie drukuje kolor plus Duck(technicznie rzecz biorąc, pozostaje on w potoku, a czyszczenie potoku w następnej iteracji następnej pętli powoduje Write-Output). Zauważ, że teoretycznie możliwe jest, Greyże nigdy nie zostanie wybrany, a pętla będzie kontynuowana w nieskończoność, ale to prawie nigdy (w sensie prawdopodobieństwa) nastąpi.

AdmBorkBork
źródło
3

R , 101 bajtów

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

Wypróbuj online!

Mocno zainspirowany odpowiedzią @ user2390246 na powiązane wyzwanie. Potrzebujemy dwóch źródeł losowości: zmiany kolejności kolorów i próbkowania kolorów innych niż szara kaczka. sampleZajmie losowej próbie losowej wielkości podanej przez wykładniczy z parametrem szybkości 1, z dokładnością do całkowitej. Korzystanie z wykładniczej rozrzutności niestety oznacza, że ​​istnieje prawdopodobieństwo, że próbka będzie w exp(-8)okolicy lub w jej pobliżu , więc musimy próbować .0.00033548replace=T

Giuseppe
źródło
możesz wtedy zastąpić \nrzeczywistą nową linią dla 1
MickyT
również możesz sporo zaoszczędzić używając colors()[c(26,254,498,552,640,652)]zamiast tego scan(..)itp. powinno sprowadzić się do około 83
MickyT
@MickyT ......... Nie używam wystarczająco grafiki R, aby pamiętać o wszystkich fajnych wbudowanych grafikach, takich jak colors()! To są fajne gry w golfa, które moim zdaniem powinieneś opublikować jako własną odpowiedź, ponieważ jest to mniej elegancki sposób uzyskiwania kolorów.
Giuseppe,
ok, więc opublikuję kilka drobnych zmian
MickyT
3

Python 2 , 138 133 120 117 116 bajtów

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

Wypróbuj online!

Znacznie lepiej z kilkoma pomysłami @EriktheOutgolfer. Dzięki!

-3 więcej dzięki dzięki @ovs

-1 z podziękowaniami dla @Rod za nową sztuczkę nauczył się :-)

ElPedro
źródło
3

Retina , 69 68 bajtów

Dzięki Leo za oszczędność 1 bajtu.

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

Wypróbuj online!

Wyjaśnienie

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

.tłumi niejawne dane wyjściowe na końcu programu (w przeciwnym razie otrzymalibyśmy dwie szare kaczki). /y/^{opakowuje cały program w pętlę, która trwa tak długo, jak długo łańcuch roboczy nie zawiera y. Reszta tej linii ustawia łańcuch roboczy na listę wszystkich kolorów oddzieloną od linii.

" duck¶">G?`

Przeciągamy losową linię z działającego ciągu (a zatem losowy kolor). I drukujemy wynik za pomocą trailing ducki linefeed.

Martin Ender
źródło
3

MATL , 68 64 bajtów

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

Wypróbuj online!

Wyjaśnienie

`                         % 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
Luis Mendo
źródło
3

Python 3, 130 , 128 , 127 , 126 , 125 bajtów

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 autor: @ElPedro!
-1 przeze mnie
-1 przez @Bubbler!

Wypróbuj online!

Rick Rongen
źródło
Czy możesz przesunąć Graya na przód i d!=c[0]zapisać bajt?
ElPedro
print(d,'duck')aby zapisać bajt. Domyślnym ogranicznikiem jest spacja.
Bubbler
3

Java (JDK 10) , 287 bajtów

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)

Wypróbuj online!

Mój pierwszy codegolf! Oczywiście nie konkuruje, po prostu cieszę się, że nauczyłem się wystarczająco dużo Java (obecnie w CS200), aby móc wziąć udział.

Chris Decker
źródło
2

Kotlin , 122 bajty

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

Wypróbuj online!

Makotosan
źródło
1
Może być pomocne dla kogoś tam, aby uzyskać losową liczbę całkowitą w Kotlinie, możesz użyć następujących poleceń: (0..7) .shuffled () [0] Krótszy niż: (Math.random () * 8) .toInt ()
Makotosan,
2

MS-SQL, 158 bajtów

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

Oparty w dużej mierze na doskonałej odpowiedzi Razvana , ale przy użyciu STRING_SPLITfunkcji specyficznej dla MS-SQL 2016 i późniejszych. Używa również GOTOzamiast WHILEpętli.

Sformatowany:

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
BradC
źródło
2

T-SQL , 195 185 184 bajtów

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
Razvan Socol
źródło
1
Niezła odmiana. Możesz wcześniej usunąć spację BEGIN.
BradC,
2

Python 2 , 98 bajtów

Spójrz, nie ma importu!

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

(Drukuje dodatkowe spacje między kolorami i duckdozwolone w pytaniu)

Wypróbuj online!

Dość słaby generator liczb pseudolosowych obsadzony identyfikatorem obiektu 0 (ale wydaje się pasować do specyfikacji), który wielokrotnie zwraca liczbę całkowitą x, w [0,7], która jest używana do wycinania listy znaków z tego indeksu w kroki 8, aby uzyskać nazwę koloru, która jest drukowana wraz z duckkrotką, wymuszając odstęp między nimi. Kiedy xstaje się zero, Greydrukowane jest oszacowanie następnego wejścia do błędów generatora liczb losowych opartych na modulo, które próbują podzielić przez zero ( v=1/x,vpróbuje zrobić nową krotkę z pierwszym elementem 1/x=1/0 )


Ten sam sposób to 100 w Pythonie 3 z

v=0
while 1:x=id(v)%17%8;print("GVIYORGBrinererleodladeuyliln ee egog n  towe"[x::8],"duck");v=1/x,v
Jonathan Allan
źródło