Blaue Ente, rote Ente, graue Ente

48

Letzte Woche habe ich eine Challenge gepostet, um Duck, Duck, Goose zu spielen . Dies führte zu einer Reihe von Minnesotanern, die sich zu ihrer regionalen 'Grey Duck'-Variante äußerten .

Also hier sind die Regeln:

Mit dieser Liste von Farben:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Schreiben Sie ein Programm, um diese Regeln zu befolgen:

  1. Wählen Sie eine dieser Farben aus, stellen Sie sie vor das Wort "Ente" und drucken Sie das Ergebnis in eine neue Zeile.
  2. Wenn die Farbe nicht "Grau" war, wiederholen Sie Schritt 1.
  3. Wenn die Farbe 'Grau' war, beenden Sie Ihr Programm.

Regeln, die befolgt werden müssen:

  • Das Programm sollte nicht konsistent die gleiche Anzahl von Zeilen drucken.
  • Es kann auf "Grey Duck" beginnen, sollte aber nicht konsequent tun.
  • Es sollte genau eine Ente auf jeder Zeile sein und es werden keine Leerzeilen ausgegeben.
  • Es sollte mindestens ein Leerzeichen zwischen einer Farbe und einer Ente sein.
  • Leerraum vor und nach der signifikanten Ausgabe spielt keine Rolle.
  • Der Fall der Ausgabe spielt keine Rolle.
  • Farben können wiederholt werden.
  • Die Ausgabe muss nicht jedes Mal jede Farbe enthalten, aber es muss möglich sein, dass Ihr Code jede Farbe ausgibt.
  • Es können keine Farben außerhalb des obigen Arrays enthalten sein.
  • Entweder grau oder grau sind in Ihrer Antwort akzeptabel.
  • Farben sollten nicht konsistent in derselben Reihenfolge sein.
  • Streben Sie das kürzeste Programm an. Die kleinste Anzahl von Bytes gewinnt.

Beispielausgabe:

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

Vielen Dank an @Mike Hill, der mich zum ersten Mal auf diese Variante aufmerksam gemacht hat.

AJFaraday
quelle
Gibt es Regeln für die Verteilung der Ergebnisse? Weil ich gültige Ausgaben generieren konnte, indem ich mehrmals aus nicht-grauen Farben auswählte und anschließend Greyeinmal druckte (damit ich nicht aus allen Farben auswählen und prüfen musste, ob ich ausgewählt hatte Grey).
Martin Ender
@ MartinEnder Das ist in Ordnung. "Farben sollten nicht immer in derselben Reihenfolge sein." Es ist wichtig, aber es gibt nichts, was Sie davon abhält, am Ende Grau separat auszuwählen.
AJFaraday
3
Ist die alternative Schreibweise "grau" erlaubt?
12. Mai,
@ 12Me21 Neugierig, tho. Gibt es dafür einen technischen Grund? Oder nur eine ästhetische?
AJFaraday
2
Meiner nicht ganz einfachen Meinung nach fehlt Ihnen eine äußerst wichtige Entenfarbe. Blau ist nah, aber nicht präzise genug.
Cobaltduck

Antworten:

6

05AB1E , 42 40 Bytes

Dank Erik the Outgolfer 2 Bytes gespart

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

Probieren Sie es online!

Emigna
quelle
3
Ich habe viele dieser unlesbaren Golfsprachen bemerkt. Gibt es einen Compiler aus einer besser lesbaren Form?
AJFaraday
@ AjFaraday: Nicht, dass ich wüsste. Die einzige Golfsprache, die ich kenne, ist Charcoal.
Emigna
1
Sie können Ihre Zeichenfolge weiter komprimieren, indist ëß!
Erik der Outgolfer
1
Gs2 hat auch einen. Aber diese Sprache wird heutzutage nicht mehr so ​​oft verwendet.
rekursive
1
@ Simón: Die 05AB1E-Codepage
Emigna
46

LuaLaTeX, 220 211 Zeichen

Befehl:

lualatex -interaction nonstopmode

Nicht die kürzeste, aber die ausgefallenste. Basierend auf der @ skillmon-Lösung

Bildbeschreibung hier eingeben

\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
quelle
9
Du lieber Himmel! Das ist einfach das Beste! Du hast meinen Tag gemacht, Alex.
AJFaraday
@ AjFaraday in der Tat erstaunliche Idee, tikzducksdort zu verwenden :)
Skillmon
6
+1 und ich entschuldige mich für die Wahl eines so langen Paketnamens!
@sam, du bekommst meine Absolution
AlexG
8
Hallo Herr. Person, die ich definitiv nicht aus anderen technischen Communities wie TeX.sx kenne . Da diese Antwort einige Vögel der Familie Anatidae betrifft, fühle ich mich gezwungen, ein Zeichen der Zustimmung zu geben, indem ich sie bestätige. :)
Paulo Cereda
26

6502 Maschinencode (C64), 124 Bytes

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 - Verbrauch:SYS49152.

Bildschirmfoto


Erklärung (kommentierte Demontage):

         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
quelle
Es tut mir leid, Ihre Demo scheint keine entenbezogenen Inhalte auszugeben.
AJFaraday
1
@AJFaraday beachte bitte den "usage" Teil ... der Befehl um es auszuführen ist sys 49152.
Felix Palmen
Okay, das war mein Tag :)
AJFaraday
1
Das war wunderbar. Es ist schon eine Weile her, dass ich C64-Assembly geschrieben habe.
LSD
2
@ lsd: das gleiche hier! Mein allererstes Programm war 6502 Assembly auf einem C64, weil ich es gerade bekommen habe und ein Freund mir das 6502 Buch mit der Aufgabe "Schreib ein Spiel!" gab. um mich dazu zu bringen, etwas zu schreiben! (Tolle Art und Weise! Es war ein toller Ansporn, nicht nur zu lesen, sondern tatsächlich etwas zu schreiben.) schrieb ein 192 Bytes (iirc) "Snake" Programm (mit einem, imo, cleveren Doppelindex, der auf den Kopf und den Schwanz der Schlangenposition zeigt) der Rest des Widders wächst auf einem "@", da ich vergessen habe, die Wände einzurichten ^^
Olivier Dulac
12

Perl 5 , 79 Bytes

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

Probieren Sie es online!

Dom Hastings
quelle
10

Taxi , 1995 Bytes

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

Probieren Sie es online!

Ich denke, es ist erwähnenswert, dass 47% dieses Codes nur eine zufällige Ganzzahl von 1 bis 8
auswählen . Außerdem ist Taxi so ausführlich, dass es viel kürzer ist, das duck\nNach jeder Farbe hart zu codieren, als es später zu verketten.
Hier ist die Version ohne Golf:

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".
Ingenieur Toast
quelle
Das hat Spaß gemacht zu lesen.
Makotosan
Golly, das ist esoterisch! Ich kann nicht verstehen, wie es funktioniert. Viel Spaß, tho :)
AJFaraday
Dies scheint im Zusammenhang mit Fetlang
Skillmon
8

Java (OpenJDK 9) , 133 Byte

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

Probieren Sie es online!

Erklärungen

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
quelle
8

Ruby , 93 91 90 89 87 86 85 Bytes

Dank an Dom Hastings für das Speichern von 2 Bytes, Kirill L. 1 Byte und Asone Tuhid 1 Byte!

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

Probieren Sie es online!

Cristian Lupascu
quelle
Sie können ()den Code entfernen , und wenn Sie $.anstelle des sSpeicherns den Index verwenden, können Sie vermeiden, einen Index zu erstellen s(da er $.auf die Zeilennummer vorinitialisiert ist!). Sie müssen zum GreyEnde der Liste gehen und $.<7stattdessen nachsehen obwohl. Ich hoffe, das hilft!
Dom Hastings
@DomHastings Danke! Ich war auf der Suche nach einem Weg, um loszuwerden s=1und $.war perfekt!
Cristian Lupascu
Ich denke, Sie können auch nach einer Weile Leerzeichen entfernen, Ruby scheint sich darüber nicht zu beschweren.
Kirill L.
@KirillL. Das stimmt, danke! Ich hatte zuvor while s...und der Raum wurde benötigt. Ich habe diese Gelegenheit nach dem Wechsel szu nicht gesehen $..
Cristian Lupascu
7

Operation Flashpoint- Skriptsprache, 133 Byte

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}

Rufen Sie an mit:

hint call f

Beispielausgabe:

Zuerst habe ich die Herausforderung irgendwie falsch verstanden, als ob das Ziel darin bestand, nur eine unterschiedliche Anzahl von Zeilen auszugeben, die nicht unbedingt an der "Gray duck" -Linie enden müssen. Nach dieser falschen Interpretation entstand ein etwas interessanteres Stück Code:

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

pdfTeX, 231 220 219 209 207 Bytes

\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 Bytes

\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
quelle
5

Brachylog , 68 Bytes

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

Probieren Sie es online!

Erik der Outgolfer
quelle
5

Ruby , 84 81 Bytes

Danke an Dom Hastings für -3 Bytes.

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

Probieren Sie es online!

Kirill L.
quelle
1
Wenn Sie in speichern $_, können Sie nur until/y/am Ende für -3 haben!
Dom Hastings
5

PHP, 89 Bytes

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

Laufen Sie mit -nroder versuchen Sie es online .

Titus
quelle
4

Oktave , 114 112 Bytes

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

Probieren Sie es online!

Es gibt eine Reihe verschiedener Optionen, die alle zwischen 112 und 118 Byte liegen ... Einige initialisieren einen Index am Anfang und dekrementieren ihn für jede Schleife um eine Zufallszahl und warten, bis er 0 ist . Andere verwenden printfstattdessen dispeinige Klammern und so weiter zu vermeiden.

Stewie Griffin
quelle
Kleine Frage: Gibt es ein Symbol in der Oktave, das dasselbe wie & in Excel macht, weil ich denke, dass es möglich ist, den Code dann noch weiter zu verkürzen.
Michthan
1
Leider nein ... Strings müssen in eckigen Klammern verkettet werden (oder mit Funktionen wie catund horzcat. Trotzdem danke :)
Stewie Griffin
4

PHP , 133 125 111 108 97 92 Bytes

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

Probieren Sie es online!

-8 Bytes dank @Olivier Grégoire

-3 Bytes dank @manatwork

-11 Bytes dank @Dom Hastings

Davіd
quelle
2
Ändern Sie Greyin der Farbfolge und im Test zu X, da sie nicht verwendet wird. Sie erhalten 6 Bytes.
Olivier Grégoire
@ OlivierGrégoire Oh wahr. Vielen Dank dafür :)
Davіd
1
Kehren Sie die for‚s Zustand keine Klammer müssen: x!=$b=$a[array_rand($a)]. Übrigens, ?>beendet eine Aussage, die nicht ;davor stehen muss.
Manatwork
@manatwork Ohh, schön! Ich werde meine Antwort jetzt aktualisieren!
Davіd
2
Sie können ein paar weitere Bytes einsparen, indem Sie überhaupt nicht einschließen xund $b=$a..als Bedingung und rand(0,7)anstelle von verwenden array_rand. Sie können den Zeilenumbruch zwischen ?>und Grey duckauch entfernen . Auch Ihr TIO-Link hatte noch volle Tags. Sie können -d short_open_tag=onFlags hinzufügen , damit das funktioniert! :)
Dom Hastings
4

Bash + GNU-Dienstprogramme, 72

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

Probieren Sie es online aus .

Digitales Trauma
quelle
4

Bash, 96 Bytes

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

Vielen Dank an @DigitalTrauma.

rexkogitans
quelle
Viele Möglichkeiten zum Golfen - lesen Sie die Bash-Golftipps
Digital Trauma
@DigitalTrauma Ich hatte es eilig, aber ich wollte eine reine Bash-Lösung ohne GNU-Coreutils. Ich könnte es von 112 auf 105 Bytes verkleinern.
Rexkogitans
Ja, ich mag auch die puren Antworten. Hier sind noch 10 Bytes übrig
Digitales Trauma
Ich >0zog mich jedoch aus und ging ${#a}stattdessen 8.
Rexkogitans
Warum müssen Sie ${#a}statt behalten 8? Dies ist Code-Golf - Sie müssen Ihren Code nicht verallgemeinern, um ihn für eine andere Anzahl von Farben zu modifizieren. Alles, was Sie tun müssen, ist die Spezifikation in der kleinsten Anzahl von Bytes zu erfüllen.
Digital Trauma
3

JavaScript, 104 Byte

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

Probieren Sie es online aus

Zottelig
quelle
1
FWIW, ich hatte diese Variante , aber ich stecke auch bei 104 Bytes fest.
Arnauld
Schade, dass wir hier nicht new Datefür das RNG verwenden können.
Shaggy
3

AWK , 114 Bytes

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

Probieren Sie es online!

Erläuterung

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

Beachten Sie, dass hierfür einige Eingaben erforderlich sind. Die Eingabe kann leer sein. Um unnötige Eingaben zu vermeiden, muss die erste Zeile mit vorangestellt werdenBEGIN

Robert Benson
quelle
3

PowerShell , 94 Byte

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

Probieren Sie es online!

Schleifen bis $rist gleich Grey. -splitWenn sich innerhalb der Schleife die Literalzeichenfolge in Zeilenumbrüchen befindet, wird Randomeine davon ausgewählt und dann das Farbplus ausgedruckt Duck(technisch gesehen verbleibt sie in der Pipeline, und die Pipeline-Bereinigung bei der nächsten Schleifeniteration bewirkt, dass ein Write-Outputpassiert). Es ist zu beachten, dass es theoretisch möglich ist Grey, niemals ausgewählt zu werden und die Schleife unendlich fortzusetzen, aber dies wird (im Sinne der Wahrscheinlichkeit) so gut wie nie passieren.

AdmBorkBork
quelle
3

R 101 Bytes

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

Probieren Sie es online!

Stark inspiriert von der Antwort von @ user2390246 auf die damit verbundene Herausforderung. Wir brauchen zwei Zufallsquellen: Ändern der Reihenfolge der Farben und Abtasten der nichtgrauen Entenfarben. Es samplewird eine Zufallsstichprobe mit einer Zufallsgröße genommen, die durch eine Exponentialverteilung mit einem Ratenparameter angegeben wird 1, der auf eine ganze Zahl gekürzt wird. Unglücklicherweise eine exponentielle distrubtion Verwendung bedeutet , dass es eine Wahrscheinlichkeit exp(-8)oder rund , 0.0003354 dass die Probe zumindest sein wird 8, so dass wir , um Probe haben mit replace=T.

Giuseppe
quelle
Sie können dann \nmit einem tatsächlichen Newline für 1
MickyT
man kann auch einiges sparen, indem man colors()[c(26,254,498,552,640,652)]anstelle von scan(..)etc. auf ca. 83 kommen sollte
MickyT
@ MickyT ......... Ich benutze Rs Grafiken nicht genug, um mich an all die netten eingebauten Grafiken zu erinnern colors()! Das sind ein paar nette Golfer, die Sie meiner Meinung nach als Ihre eigene Antwort posten sollten, da dies die weniger elegante Art ist, die Farben zu erhalten.
Giuseppe
ok dann werde ich es mit ein paar kleinen Änderungen veröffentlichen
MickyT
3

Python 2 , 138 133 120 117 116 Bytes

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

Probieren Sie es online!

Viel besser mit ein paar Ideen von @EriktheOutgolfer. Vielen Dank!

-3 mehr dank @ovs

-1 danke an @Rod für einen coolen neuen Trick gelernt :-)

ElPedro
quelle
3

Retina , 69 68 Bytes

Danke an Leo für das Speichern von 1 Byte.

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

Probieren Sie es online!

Erläuterung

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

.Unterdrückt die implizite Ausgabe am Ende des Programms (sonst würden wir zwei graue Enten bekommen). /y/^{Umschließt das gesamte Programm in einer Schleife, die fortgesetzt wird, solange der Arbeitsstring kein a enthält y. Der Rest dieser Zeile setzt die Arbeitszeichenfolge auf eine durch Zeilenvorschub getrennte Liste aller Farben.

" duck¶">G?`

Wir sehen eine zufällige Zeile von der Arbeitszeichenfolge (und daher eine zufällige Farbe). Und wir drucken das Ergebnis mit einem Trailing duckund einem Linefeed.

Martin Ender
quelle
3

MATL , 68 64 Bytes

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

Probieren Sie es online!

Erläuterung

`                         % 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
quelle
3

Python 3, 130 , 128 , 127 , 126 , 125 Bytes

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 von @ElPedro!
-1 von mir
-1 von @Bubbler!

Probieren Sie es online!

Rick Rongen
quelle
Kannst du Gray nach vorne bringen und musst d!=c[0]ein Byte speichern?
ElPedro
print(d,'duck')ein Byte speichern. Das Standardtrennzeichen ist ein Leerzeichen.
Bubbler
3

Java (JDK 10) , 287 Byte

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)

Probieren Sie es online!

Mein allererster Codegolf! Offensichtlich nicht wettbewerbsfähig, nur froh genug Java gelernt zu haben (derzeit in CS200), um teilnehmen zu können.

Chris Decker
quelle
2

Kotlin , 122 Bytes

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

Probieren Sie es online!

Makotosan
quelle
1
Könnte für jemanden da draußen hilfreich sein, um einen zufälligen ganzzahligen Wert in Kotlin zu erhalten. Sie können Folgendes verwenden: (0..7) .shuffled () [0] Kürzere als: (Math.random () * 8) .toInt ()
Makotosan
2

MS-SQL, 158 Bytes

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

Basiert größtenteils auf Razvans hervorragender Antwort , verwendet jedoch die STRING_SPLITFunktion, die für MS-SQL 2016 und höher spezifisch ist. Verwendet auch eine GOTOanstelle einer WHILESchleife.

Formatiert:

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
quelle
2

T-SQL , 195 185 184 Bytes

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
quelle
1
Schöne Abwechslung. Sie können das Leerzeichen vorher entfernen BEGIN.
BradC
2

Python 2 , 98 Bytes

Schau ma keine Importe!

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

(Druckt zusätzliche Leerzeichen zwischen den Farben und duck wie in der Frage erlaubt)

Probieren Sie es online!

Ein ziemlich schlechter Pseudozufallszahlengenerator, der mit der Objekt-ID 0 ausgesät ist (aber zur Spezifikation zu passen scheint) und wiederholt eine Ganzzahl xin [0,7] liefert, mit der eine Liste von Zeichen aus diesem Index in Scheiben geschnitten wird Schritte von 8 , um den Farbnamen zu erhalten, der zusammen mit duckals Tupel gedruckt wird, wobei ein Leerzeichen dazwischen erzwungen wird. Wenn xNull Greywird gedruckt und die Auswertung der nächsten Eingabe in den Modulo-basierten Zufallszahlengenerator versucht, durch Null zu teilen ( v=1/x,vversucht, ein neues Tupel mit dem ersten Element zu erstellen 1/x= 1/0)


Genauso ist 100 in Python 3 mit

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