Canard bleu, canard rouge, canard gris

48

Ainsi, la semaine dernière, j'ai posté un défi pour jouer à Duck, Duck, Goose . Cela a conduit un certain nombre de Minnesotiens à commenter leur variation régionale du «canard gris» .

Alors voici les règles:

En utilisant cette liste de couleurs:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Ecrivez un programme pour suivre ces règles:

  1. Sélectionnez l'une de ces couleurs, ajoutez-la au mot "canard" et imprimez le résultat sur une nouvelle ligne.
  2. Si la couleur n'était pas "Gris", répétez l'étape 1.
  3. Si la couleur était "Gris", terminez votre programme.

Règles à respecter:

  • Le programme ne doit pas toujours imprimer le même nombre de lignes.
  • Il peut commencer sur «canard gris», mais ne devrait pas faire systématiquement.
  • Il devrait y avoir exactement un canard sur chaque ligne et aucune ligne vide n'est sortie.
  • Il devrait y avoir au moins un espace entre une couleur et un canard.
  • L'espace blanc avant et après la sortie significative n'a pas d'importance.
  • Le cas de la sortie n'a pas d'importance.
  • Les couleurs peuvent être répétées.
  • La sortie ne doit pas nécessairement contenir chaque couleur à chaque fois, mais il doit être possible que votre code produise chaque couleur.
  • Aucune couleur en dehors du tableau ci-dessus ne peut être incluse.
  • Le gris ou le gris sont acceptables dans votre réponse.
  • Les couleurs ne doivent pas toujours être dans le même ordre.
  • Visez le programme le plus court. Le plus petit nombre d'octets gagne.

Exemple de sortie:

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

Merci à Mike Hill de m'avoir informé de cette variation.

AJFaraday
la source
Des règles sur la distribution des résultats? Parce que je pouvais générer des sorties valables en choisissant des couleurs non grises un nombre de fois aléatoire, puis en les imprimant Greyune fois (pour ne pas avoir à les sélectionner toutes et à vérifier si elles avaient été choisies Grey).
Martin Ender
@ MartinEnder C'est bien. "Les couleurs ne doivent pas toujours être dans le même ordre." importe, mais rien ne vous empêche de choisir le gris séparément à la fin.
AJFaraday
3
L'orthographe alternative "gris" est-elle autorisée?
12
@ 12Me21 Curieux, cependant. Y a-t-il une raison technique à cela? Ou simplement esthétique?
AJFaraday
2
À mon avis pas si humble, il vous manque une couleur de canard extrêmement importante. Le bleu est proche, mais pas assez précis.
Cobaltduck

Réponses:

6

05AB1E , 42 à 40 octets

2 octets sauvés grâce à Erik the Outgolfer

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

Essayez-le en ligne!

Emigna
la source
3
J'ai remarqué beaucoup de ces langues de golf illisibles. Existe-t-il un compilateur sous une forme plus lisible par l'homme?
AJFaraday
@AJFaraday: Pas que je sache. La seule langue de golf que je connaisse qui en possède une est le charbon de bois.
Emigna
1
Vous pouvez compresser votre chaîne plus loin, indc'est ëß!
Erik l'Outgolfer
1
Gs2 en a un aussi. Mais cette langue n'est pas tellement utilisée ces jours-ci.
récursive
1
@ Simón: La page de code
05AB1E
46

LuaLaTeX, 220 211 caractères

commander:

lualatex -interaction nonstopmode

Pas le plus court, mais le plus fantaisiste. Basé sur la solution de @ skillmon

entrez la description de l'image ici

\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
la source
9
Bonté divine! C'est juste la meilleure chose! Tu as fait ma journée, Alex.
AJFaraday
@AJFaraday est en effet une idée étonnante à utiliser tikzduckslà-bas :)
Skillmon
6
+1 et mes excuses pour avoir choisi un nom de paquet aussi long!
@sam, tu reçois mon absolution
AlexG
8
Bonjour M. personne que je ne sais pas vraiment d'autres communautés techniques comme TeX.sx . Étant donné que cette réponse couvre certains oiseaux de la famille des Anatidés , je me sens obligé de donner un signe d'approbation en la votant. :)
Paulo Cereda
26

6502 code machine (C64), 124 octets

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

Démonstration en ligne - Utilisation:SYS49152.

capture d'écran


Explication (désassemblage commenté):

         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
la source
Je suis désolé, votre démo ne semble produire aucun contenu relatif au canard.
AJFaraday
1
@AJFaraday s'il vous plaît notez la partie "utilisation" ... la commande pour l'exécuter est sys 49152.
Felix Palmen
Ok, ça a fait ma journée :)
AJFaraday
1
C'était génial. Cela fait longtemps que je n'ai pas écrit assemblage c64.
LSD
2
@lsd: idem ici! mon tout premier programme était l'assemblage 6502 sur un C64, parce que je venais de le recevoir et qu'un ami m'avait donné le livre 6502 avec pour tâche "écrire un jeu!" me lancer dans écrire quelque chose! (bonne façon! c'était une excellente motivation pour ne pas simplement lire, mais écrire quelque chose). a écrit un programme "Snake" de 192 octets (avec un imo, un index double intelligent pointant vers la tête et la queue de la position du serpent) ... premier essai: il a zoomé au-delà du bord inférieur, "rongeant" le reste du bélier, croissant sur un "@", comme j'ai oublié de mettre en place les murs ^^
Olivier Dulac
12

Perl 5 , 79 octets

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

Essayez-le en ligne!

Dom Hastings
la source
10

Taxi , 1995 octets

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

Essayez-le en ligne!

Je pense qu’il est intéressant de noter que 47% de ce code ne fait que choisir un entier aléatoire compris entre 1 et 8.
En outre, Taxi est si bavard qu’il est beaucoup plus court pour coder en dur l’ duck\naprès chaque couleur plutôt que de le concaténer plus tard.
Voici la version sans 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".
Rôti d'ingénieur
la source
C'était amusant à lire.
Makotosan
Bon sang, c'est ésotérique! Je n'arrive pas à comprendre comment ça marche. Amusant, mais :)
AJFaraday
Cela semble lié à Fetlang
Skillmon
8

Java (OpenJDK 9) , 133 octets

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

Essayez-le en ligne!

Des explications

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
la source
8

Ruby , 93 91 90 89 87 86 85 octets

Merci à Dom Hastings d’ avoir économisé 2 octets, Kirill L. 1 octet et Asone Tuhid 1 octet!

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

Essayez-le en ligne!

Cristian Lupascu
la source
Vous pouvez supprimer ()le code et si vous utilisez $.plutôt que de sstocker l'index, vous pouvez éviter de créer s( $.étant pré-initialisé au numéro de ligne!), Vous devrez aller Greyà la fin de la liste et vérifier à la $.<7place bien que. J'espère que ça t'as aidé!
Dom Hastings
@DomHastings Merci! Je cherchais un moyen de m'en débarrasser s=1et $.c'était parfait!
Cristian Lupascu
Je pense que vous pouvez également supprimer l'espace après un moment, Ruby ne semble pas se plaindre à ce sujet.
Kirill L.
@KirillL. C'est vrai, merci! Je l'avais auparavant while s...et l'espace était nécessaire. Je n'ai pas vu cette opportunité après avoir changé spour $..
Cristian Lupascu
7

Langage de script Operation Flashpoint , 133 octets

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}

Appeler avec:

hint call f

Exemple de sortie:

Au début, j’ai mal interprété le défi comme si le but était de produire un nombre variable de lignes, sans nécessairement s’arrêter à la ligne "Gray canard". Suite à cette interprétation incorrecte, un code légèrement plus intéressant a été créé:

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
la source
7

pdfTeX, 231 220 219 209 207 octets

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

\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
la source
5

Brachylog , 68 octets

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

Essayez-le en ligne!

Erik le golfeur
la source
5

Ruby , 84 81 octets

Merci à Dom Hastings pour -3 octets.

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

Essayez-le en ligne!

Kirill L.
la source
1
Si vous enregistrez $_, vous pouvez avoir until/y/à la fin pour -3!
Dom Hastings
5

PHP, 89 octets

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

Courez avec -nrou essayez-le en ligne .

Titus
la source
4

Octave , 114 112 octets

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

Essayez-le en ligne!

Il y a un tas d'options différentes qui se situent toutes entre 112 et 118 octets ... Certaines initialisent un index au début, le décrémentent d'un nombre aléatoire pour chaque boucle et attendent jusqu'à ce qu'il soit à 0 . D'autres utilisent printfau lieu d' dispéviter certains crochets et ainsi de suite.

Stewie Griffin
la source
Petite question: y a-t-il un symbole dans l'octave qui fait la même chose que dans & Excel, car je pense qu'il est possible de raccourcir le code encore plus loin alors.
Michthan
1
Malheureusement, non ... Les chaînes doivent être concaténées entre crochets (ou à l'aide de fonctions telles que catet horzcat. Merci quand même :)
Stewie Griffin
4

PHP , 133 125 111 108 97 92 octets

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

Essayez-le en ligne!

-8 octets grâce à @Olivier Grégoire

-3 octets grâce à @manatwork

-11 octets grâce à @Dom Hastings

Davied
la source
2
Dans la chaîne de couleur et le test, remplacez Greyen X, car il n'est pas utilisé. Vous gagnerez 6 octets.
Olivier Grégoire
@ OlivierGrégoire Oh c'est vrai. Merci pour cela :)
David
1
Inverser la forcondition de » pas besoin entre parenthèses: x!=$b=$a[array_rand($a)]. BTW, ?>termine une déclaration, pas besoin de ;devant.
Manatwork
@manatwork Ohh, gentil! Je vais mettre à jour ma réponse maintenant!
David
2
Vous pouvez enregistrer quelques octets de plus en n'incluant pas xdu tout et en utilisant $b=$a..comme condition et en utilisant rand(0,7)au lieu de array_rand. Vous pouvez supprimer la nouvelle ligne entre ?>et Grey duckaussi. De plus, votre lien TIO avait encore des balises complètes, vous pouvez ajouter -d short_open_tag=ondes drapeaux pour que cela fonctionne! :)
Dom Hastings
4

Utilitaires Bash + GNU, 72

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

Essayez-le en ligne .

Trauma numérique
la source
4

bash, 96 octets

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

Merci à @ DigitalTrauma.

rexkogitans
la source
Consultez toutes les astuces pour jouer au golf
Digital Trauma,
@ DigitalTrauma J'étais pressé, mais je voulais une solution pure de Bash sans GNU Coreutils. Je pourrais le réduire de 112 à 105 octets.
rexkogitans
Oui, j'aime les réponses pures-bash aussi. Voici un autre 10 octets
Digital Trauma
Je me suis déshabillé >0, cependant, je suis parti ${#a}au lieu de 8.
rexkogitans
Pourquoi avez-vous besoin de garder ${#a}au lieu de 8? C'est du code-golf - il n'est pas nécessaire de donner la possibilité de généraliser votre code pour qu'il soit modifié pour un nombre différent de couleurs. Tout ce que vous avez à faire est de respecter les spécifications dans le plus petit nombre d'octets.
Traumatologie numérique
3

JavaScript, 104 octets

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

Essayez-le en ligne

Hirsute
la source
1
FWIW, j'avais cette variante , mais je suis également bloqué à 104 octets.
Arnauld
Dommage que nous ne puissions pas utiliser new Datele RNG ici.
Shaggy
3

AWK , 114 octets

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

Essayez-le en ligne!

Explication

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

Notez que cela nécessite "quelques" entrées. L'entrée peut être vide. Pour éviter le besoin d’entrée, ajoutez la première ligne en ajoutantBEGIN

Robert Benson
la source
3

PowerShell , 94 octets

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

Essayez-le en ligne!

Boucles jusqu'à $rest égal à Grey. Dans la boucle, -splitla chaîne littérale sur les nouvelles lignes, en choisit une Random, puis imprime la couleur plus Duck(techniquement, elle est laissée sur le pipeline et son nettoyage à la prochaine itération de la boucle entraîne son Write-Outputapparition). Notez qu'il est théoriquement possible Greyde ne jamais être choisi, et que la boucle continue indéfiniment, mais cela ne se produira presque jamais (dans le sens de probabilité).

AdmBorkBork
la source
3

R , 101 octets

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

Essayez-le en ligne!

Fortement inspiré par la réponse de @ user2390246 au défi connexe. Nous avons besoin de deux sources d’aléatoire: modifier l’ordre des couleurs et échantillonner les couleurs des canards non gris. Le sampleprendra un échantillon aléatoire de taille aléatoire donné par une distribution exponentielle avec un paramètre rate 1, tronqué en un entier. L' utilisation d' un distrubtion exponentielle signifie malheureusement qu'il existe une probabilité de exp(-8)ou autour 0.0003354 que l'échantillon sera au moins 8, donc nous devons échantillon replace=T.

Giuseppe
la source
vous pouvez alors remplacer \npar une nouvelle ligne réelle pour 1
MickyT
vous pouvez aussi économiser beaucoup en utilisant colors()[c(26,254,498,552,640,652)]à la place de scan(..)etc. devrait descendre à environ 83
MickyT
@MickyT ......... Je n'utilise pas assez les graphismes de R pour se souvenir de tous les graphismes sympathiques, comme colors()! Ce sont de beaux golfs, que je pense que vous devriez poster comme votre propre réponse, car c’est la manière la moins élégante d’obtenir les couleurs.
Giuseppe
ok alors, je vais le poster avec quelques petites modifications
MickyT
3

Python 2 , 138 133 120 117 116 octets

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

Essayez-le en ligne!

Beaucoup mieux avec quelques idées de @EriktheOutgolfer. Merci!

-3 plus grâce à @ovs

-1 avec merci à @Rod pour un nouveau tour cool appris :-)

ElPedro
la source
3

Retina , 69 68 octets

Merci à Leo pour avoir sauvegardé 1 octet.

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

Essayez-le en ligne!

Explication

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

.supprime les sorties implicites à la fin du programme (sinon, nous aurions deux canards gris). /y/^{encapsule le programme entier dans une boucle qui continue tant que la chaîne de travail ne contient pas y. Le reste de cette ligne définit la chaîne de travail sur une liste de toutes les couleurs, séparées par un saut de ligne.

" duck¶">G?`

Nous grepons une ligne aléatoire de la chaîne de travail (et donc une couleur aléatoire). Et nous imprimons le résultat avec une traînée ducket un saut de ligne.

Martin Ender
la source
3

MATL , 68 64 octets

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

Essayez-le en ligne!

Explication

`                         % 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
la source
3

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

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 par @ElPedro!
-1 par moi
-1 par @Bubbler!

Essayez-le en ligne!

Rick Rongen
la source
Pouvez-vous déplacer Gray à l'avant et devez d!=c[0]enregistrer un octet?
ElPedro
print(d,'duck')enregistrer un octet. Le délimiteur par défaut est un espace.
Bubbler
3

Java (JDK 10) , 287 octets

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)

Essayez-le en ligne!

Mon tout premier codegolf! Évidemment pas compétitif, juste heureux d'avoir appris assez de Java (actuellement dans CS200) pour pouvoir participer.

Chris Decker
la source
2

Kotlin , 122 octets

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

Essayez-le en ligne!

Makotosan
la source
1
Cela pourrait être utile pour obtenir une valeur entière aléatoire dans Kotlin. Vous pouvez utiliser les éléments suivants: (0..7) .shuffled () [0] Plus court que: (Math.random () * 8) .toInt ()
Makotosan
2

MS-SQL, 158 octets

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

Basé en grande partie sur l'excellente réponse de Razvan , mais en utilisant la STRING_SPLITfonction spécifique à MS-SQL 2016 et versions ultérieures. Utilise également un GOTOau lieu d'une WHILEboucle.

Formaté:

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
la source
2

T-SQL , 195 185 184 octets

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
la source
1
Belle variation. Vous pouvez supprimer l'espace avant BEGIN.
BradC
2

Python 2 , 98 octets

Regardez ma pas d'importations!

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

(Imprime des espaces supplémentaires entre les couleurs et duckcomme autorisé dans la question)

Essayez-le en ligne!

Un assez mauvais générateur de nombres pseudo-aléatoires ensemencé avec l'ID d'objet 0 (mais il semble correspondre à la spécification) qui génère à plusieurs reprises un entier x, dans [0,7], qui est utilisé pour trancher une liste de caractères de cet index dans étapes de 8 pour obtenir le nom de la couleur qui est imprimé avec duckun tuple, forçant un espace entre les deux. Quand xdevient égal à zéro Greyest imprimé et l'évaluation de la prochaine entrée dans le générateur de nombres aléatoires basé sur modulo en essayant de diviser par zéro ( v=1/x,vtente de créer un nouveau tuple avec le premier élément 1/x= 1/0)


La même manière est 100 en Python 3 avec

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