Pato azul, pato rojo, pato gris

48

Entonces, la semana pasada publiqué un desafío para jugar a Duck, Duck, Goose . Esto llevó a que varios habitantes de Minnesota comentaran sobre su variación regional de 'pato gris' .

Así que aquí están las reglas:

Usando esta lista de colores:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Escriba un programa para seguir estas reglas:

  1. Seleccione uno de estos colores y añádalo a la palabra 'pato' e imprima el resultado en una nueva línea.
  2. Si el color no era 'Gris', repita el paso 1.
  3. Si el color era 'Gris', finalice su programa.

Reglas que deben seguirse:

  • El programa no debe imprimir constantemente el mismo número de líneas.
  • Puede comenzar en 'Pato gris', pero no debería hacerlo de manera consistente.
  • Debe haber exactamente un pato en cada línea y no se emiten líneas vacías.
  • Debe haber al menos un espacio entre un color y un pato.
  • El espacio en blanco antes y después del resultado significativo no importa.
  • El caso de la salida no importa.
  • Los colores se pueden repetir.
  • La salida no tiene que contener todos los colores cada vez, pero debe ser posible que su código genere todos los colores.
  • No se pueden incluir colores fuera de la matriz anterior.
  • Gris o gris son aceptables en su respuesta.
  • Los colores no deben estar consistentemente en el mismo orden.
  • Apunta al programa más corto. El menor número de bytes gana.

Salida de ejemplo:

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

Gracias a @Mike Hill por alertarme por primera vez de esta variación.

AJFaraday
fuente
¿Alguna regla sobre la distribución de resultados? Porque podría generar resultados válidos seleccionando colores no grises un número aleatorio de veces, seguido de imprimir Greyuna vez (para no tener que elegir de todos ellos y verificar si he elegido Grey).
Martin Ender
@ MartinEnder Eso está bien. "Los colores no deberían estar consistentemente en el mismo orden". importa, pero no hay nada que te impida elegir gris por separado al final.
AJFaraday
3
¿Se permite la ortografía alternativa "gris"?
12Me21
@ 12Me21 Curioso, aunque. ¿Hay alguna razón técnica para eso? ¿O solo una estética?
AJFaraday
2
En mi opinión no tan humilde, te falta un color de pato extremadamente importante. El azul está cerca, pero no lo suficientemente preciso.
cobaltduck

Respuestas:

6

05AB1E , 42 40 bytes

Guardado 2 bytes gracias a Erik the Outgolfer

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

Pruébalo en línea!

Emigna
fuente
3
He notado muchos de estos idiomas de golf ilegibles. ¿Hay un compilador de alguna forma más legible?
AJFaraday
@AJFaraday: No que yo sepa. El único idioma de golf que conozco que tiene uno de esos es el carbón.
Emigna
1
Puede comprimir su cadena aún más, indes ëß!
Erik the Outgolfer
1
Gs2 tiene uno también. Pero ese idioma no se usa tanto en estos días.
recursivo el
1
@ Simón: la página de códigos
05AB1E
46

LuaLaTeX, 220 211 caracteres

mando:

lualatex -interaction nonstopmode

No el más corto, sino el más elegante. Basado en la solución de @ skillmon

ingrese la descripción de la imagen aquí

\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
fuente
99
¡Cielos! ¡Esto es lo mejor! Me alegraste el día, Alex.
AJFaraday
@AJFaraday, de hecho, una idea increíble para usar tikzducksallí :)
Skillmon
66
¡+1 y mis disculpas por elegir un nombre de paquete tan largo!
@sam, obtienes mi absolución
AlexG
8
Hola señor. persona que definitivamente no sé de otras comunidades técnicas como TeX.sx . Dado que esta respuesta cubre algunas aves de la familia Anatidae , me siento obligado a proporcionar una muestra de aprobación votando. :)
Paulo Cereda
26

Código de máquina 6502 (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

Demo en línea - Uso:SYS49152.

captura de pantalla


Explicación (desmontaje comentado):

         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
fuente
Lo siento, su demo no parece mostrar ningún contenido relacionado con el pato.
AJFaraday
1
@AJFaraday, tenga en cuenta la parte de "uso" ... el comando para ejecutarlo es sys 49152.
Felix Palmen
Bien, eso me
alegró el
1
Eso fue asombroso. Ha pasado un tiempo desde que escribí el ensamblaje c64.
lsd
2
@lsd: ¡lo mismo aquí! mi primer programa fue el ensamblaje 6502 en un C64, porque lo acabo de recibir y un amigo me regaló el libro 6502 con la tarea "¡escribir un juego!" para comenzar a escribir algo! (¡genial! Fue un gran motivador no solo leer, sino también escribir algo). escribió un programa "Snake" de 192 bytes (iirc) (con un índice doble inteligente, imo, apuntando a la cabeza y a la cola de la posición de la serpiente) ... primer intento: pasó por el borde inferior, 'comiendo' en el resto del carnero, creciendo en cualquier "@", ya que olvidé poner las paredes ^^
Olivier Dulac
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".

Pruébalo en línea!

Creo que vale la pena señalar que el 47% de este código es solo elegir un número entero aleatorio del 1 al 8.
Además, Taxi es tan detallado que es mucho más corto codificar el código duck\ndespués de cada color en lugar de concatenarlo más tarde.
Aquí está la versión sin 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".
Tostadas de ingeniero
fuente
Eso fue divertido de leer.
Makotosan
¡Golly, eso es esotérico! No puedo comenzar a entender cómo funciona. Mucha diversión, aunque :)
AJFaraday
Esto parece relacionado con Fetlang
Skillmon
8

Java (OpenJDK 9) , 133 bytes

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

Pruébalo en línea!

Explicaciones

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

Ruby , 93 91 90 89 87 86 85 bytes

¡Gracias a Dom Hastings por guardar 2 bytes, Kirill L. 1 byte y Asone Tuhid 1 byte!

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

Pruébalo en línea!

Cristian Lupascu
fuente
Puede eliminar ()todo el código y si se utiliza $.en lugar de salmacenar el índice, se puede evitar la creación spor completo (ya que $.es pre-inicializado al número de línea!) Tendrá que desplazarse Greyhasta el final de la lista y comprobar si hay $.<7lugar aunque. ¡Espero que ayude!
Dom Hastings
@DomHastings Gracias! ¡Estaba buscando una manera de deshacerme s=1y $.era perfecto!
Cristian Lupascu
Creo que también puedes eliminar el espacio después de un tiempo, Ruby no parece quejarse de eso.
Kirill L.
@KirillL. Así es, gracias! Anteriormente tenía while s...y se necesitaba el espacio. No vi esta oportunidad después de cambiar sa $..
Cristian Lupascu
7

Lenguaje de script Operation Flashpoint , 133 bytes

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}

Llamar con:

hint call f

Salida de ejemplo:

Al principio, de alguna manera leí mal el desafío como si el objetivo fuera simplemente generar una cantidad variable de líneas, no necesariamente terminando en la línea "Pato gris". Después de esa interpretación incorrecta, se produjo un código un poco más interesante:

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
fuente
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
fuente
5

Ruby , 84 81 bytes

Gracias a Dom Hastings por -3 bytes.

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

Pruébalo en línea!

Kirill L.
fuente
1
Si almacena $_, ¡puede tener until/y/al final por -3!
Dom Hastings
5

PHP, 89 bytes

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

Ejecutar -nro probarlo en línea .

Titus
fuente
4

> <> , 107 bytes

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

Pruébalo en línea!

Sok
fuente
4

Octava , 114 112 bytes

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

Pruébalo en línea!

Hay un montón de opciones diferentes que están todas entre 112 y 118 bytes ... Algunos inicializan un índice al principio y lo disminuyen por un número aleatorio para cada ciclo, y esperan hasta que sea 0 . Otros lo usan en printflugar de dispevitar algunos corchetes, etc.

Stewie Griffin
fuente
Pequeña pregunta: ¿Hay un símbolo en octava que haga lo mismo que & en Excel, porque creo que es posible acortar aún más el código?
Michthan
1
Desafortunadamente, no ... Las cadenas se deben concatenar dentro de corchetes (o usando funciones como caty horzcat. Gracias aunque :)
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

Pruébalo en línea!

-8 bytes gracias a @Olivier Grégoire

-3 bytes gracias a @manatwork

-11 bytes gracias a @Dom Hastings

David
fuente
2
En la cadena de color y la prueba, cambie Greya X, ya que no se usa. Ganarás 6 bytes.
Olivier Grégoire
@ OlivierGrégoire Oh cierto. Gracias por eso :)
Davіd
1
Revertir la forcondición de 's a necesitar sin paréntesis: x!=$b=$a[array_rand($a)]. Por cierto, ?>termina una declaración, no es necesario ;delante de ella.
manatwork
@manatwork Ohh, bien! ¡Actualizaré mi respuesta ahora!
Davіd
2
Puede guardar algunos bytes más al no incluirlos xy usarlos $b=$a..como condición y usar en rand(0,7)lugar de array_rand. Puede eliminar la nueva línea entre ?>y Grey ducktambién. Además, su enlace TIO todavía tenía etiquetas completas, ¡puede agregarlas -d short_open_tag=ona las banderas para que funcione! :)
Dom Hastings
4

Bash + GNU utilidades, 72

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

Pruébalo en línea .

Trauma digital
fuente
4

bash, 96 bytes

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

Gracias a @DigitalTrauma.

rexkogitans
fuente
Un montón de oportunidades para jugar al golf: echa un vistazo a los consejos de bash golfing
Digital Trauma
@ DigitalTrauma Tenía prisa, pero quería una solución Bash pura sin coreutils de GNU. Podría reducirlo de 112 a 105 bytes.
rexkogitans
Sí, también me gustan las respuestas de puro golpe. Aquí hay otros 10 bytes de descuento
Digital Trauma
Me desnudé >0, sin embargo, me fui en ${#a}lugar de 8.
rexkogitans
¿Por qué necesitas mantener en ${#a}lugar de 8? Este es el código de golf: no es necesario que su código pueda generalizarse para que se modifique para un número diferente de colores. Todo lo que necesita hacer es cumplir con la especificación en el menor número de bytes.
Trauma digital
3

JavaScript, 104 bytes

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

Pruébalo en línea

Lanudo
fuente
1
FWIW, tenía esta variante , pero también estoy atascado en 104 bytes.
Arnauld
Es una pena que no podamos usar new Datepara el RNG aquí.
Shaggy
3

AWK , 114 bytes

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

Pruébalo en línea!

Explicación

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

Tenga en cuenta que esto requiere "alguna" entrada. La entrada puede estar vacía. Para evitar la necesidad de entrada, añada la primera línea conBEGIN

Robert Benson
fuente
3

PowerShell , 94 bytes

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

Pruébalo en línea!

Bucles hasta que $rsea ​​igual a Grey. Dentro del bucle, -splits la cadena literal en las nuevas líneas, elige una de Randomellas, luego imprime el color más Duck(técnicamente, se deja en la tubería y la limpieza de la tubería en la siguiente iteración del bucle hace Write-Outputque suceda). Tenga en cuenta que es teóricamente posible Greyque nunca se elija, y que el ciclo continúe infinitamente, pero esto casi nunca (en el sentido de probabilidad) sucederá.

AdmBorkBork
fuente
3

R , 101 bytes

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

Pruébalo en línea!

Muy inspirado por la respuesta de @ user2390246 al desafío relacionado. Necesitamos dos fuentes de aleatoriedad: cambiar el orden de los colores y muestrear los colores de pato no gris. El sampletomará una muestra aleatoria de tamaño aleatorio dada por una distribución exponencial con parámetro de velocidad 1, truncado a un entero. El uso de un distrubtion exponencial lamentablemente significa que hay una probabilidad de exp(-8)o alrededor de 0.0003354 que la muestra será por lo menos 8, por lo que tenemos que muestra con replace=T.

Giuseppe
fuente
puede reemplazar entonces \ncon una nueva línea real para 1
MickyT
también puede ahorrar bastante usando colors()[c(26,254,498,552,640,652)]en lugar de scan(..)etc., debería reducirse a aproximadamente 83
MickyT
@MickyT ......... ¡No utilizo los gráficos de R lo suficiente como para recordar todos los buenos gráficos incorporados colors()! Esos son algunos buenos campos de golf, que creo que deberías publicar como tu propia respuesta, ya que esta es la forma menos elegante de obtener los colores.
Giuseppe
ok entonces, lo publicaré con un par de pequeños cambios
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'

Pruébalo en línea!

Mucho mejor con algunas ideas de @EriktheOutgolfer. ¡Gracias!

-3 más gracias a @ovs

-1 con gracias a @Rod por un nuevo y genial truco aprendido :-)

ElPedro
fuente
3

Retina , 69 68 bytes

Gracias a Leo por guardar 1 byte.

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

Pruébalo en línea!

Explicación

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

.suprime la salida implícita al final del programa (de lo contrario, obtendríamos dos patos grises). /y/^{envuelve todo el programa en un bucle que continúa mientras la cadena de trabajo no contenga a y. El resto de esa línea establece la cadena de trabajo en una lista separada por saltos de línea de todos los colores.

" duck¶">G?`

Seleccionamos una línea aleatoria de la cadena de trabajo (y, por lo tanto, un color aleatorio). E imprimimos el resultado con un final ducky un salto de línea.

Martin Ender
fuente
3

MATL , 68 64 bytes

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

Pruébalo en línea!

Explicación

`                         % 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
fuente
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 por @ElPedro!
-1 por mí
-1 por @Bubbler!

Pruébalo en línea!

Rick Rongen
fuente
¿Puedes mover a Gray al frente y tener d!=c[0]que guardar un byte?
ElPedro
print(d,'duck')para guardar un byte El delimitador predeterminado es un espacio.
Bubbler
3

Java (JDK 10) , 287 bytes

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)

Pruébalo en línea!

Mi primer codegolf! Obviamente no es competitivo, simplemente feliz de haber aprendido suficiente Java (actualmente en CS200) para poder participar.

Chris Decker
fuente
2

Kotlin , 122 bytes

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

Pruébalo en línea!

Makotosan
fuente
1
Puede ser útil para alguien por ahí, para obtener un valor entero aleatorio en Kotlin, puede usar lo siguiente: (0..7). Shuffled () [0] Más corto que: (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

Basado en gran medida en la excelente respuesta de Razvan , pero utilizando la STRING_SPLITfunción específica de MS-SQL 2016 y posterior. También usa un en GOTOlugar de un WHILEbucle.

Formateado:

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
fuente
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
fuente
1
Buena variación Puedes eliminar el espacio antes BEGIN.
BradC
2

Python 2 , 98 bytes

Mira ma no hay importaciones!

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

(Imprime espacios adicionales entre los colores y ducksegún lo permitido en la pregunta)

Pruébalo en línea!

Un generador de números pseudoaleatorios bastante pobre sembrado con la identificación del objeto de 0 (pero parece ajustarse a la especificación) que produce repetidamente un número entero x, en [0,7] que se utiliza para cortar una lista de caracteres de ese índice en pasos de 8 para obtener el nombre del color que se imprime junto con duckuna tupla, forzando un espacio intermedio. Cuando se xconvierte en cero Greyse imprime y la evaluación de la siguiente entrada al módulo genera errores de generador de números aleatorios que intentan dividir por cero ( v=1/x,vintenta hacer una nueva tupla con el primer elemento 1/x= 1/0)


La misma manera es 100 en Python 3 con

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