Anatra blu, anatra rossa, anatra grigia


48

Quindi, la settimana scorsa ho pubblicato una sfida per giocare a Duck, Duck, Goose . Ciò ha portato un certo numero di minnesotani a commentare la loro variazione regionale di "anatra grigia" .

Quindi ecco le regole:

Utilizzando questo elenco di colori:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Scrivi un programma per seguire queste regole:

  1. Seleziona uno di questi colori e anteponilo alla parola "anatra" e stampa il risultato su una nuova riga.
  2. Se il colore non era "Grigio", ripetere il passaggio 1.
  3. Se il colore era "Grigio", termina il programma.

Regole che devono essere seguite:

  • Il programma non deve stampare in modo coerente lo stesso numero di righe.
  • Può iniziare su "Anatra grigia", ma non dovrebbe essere coerente.
  • Dovrebbe esserci esattamente un'anatra su ogni riga e non vengono emesse righe vuote.
  • Dovrebbe esserci almeno uno spazio tra un colore e un'anatra.
  • Lo spazio bianco prima e dopo l'output significativo non ha importanza.
  • Il caso dell'output non ha importanza.
  • I colori possono essere ripetuti.
  • L'output non deve contenere ogni colore ogni volta, ma deve essere possibile che il codice emetta tutti i colori.
  • Nessun colore al di fuori dell'array sopra può essere incluso.
  • Il grigio o il grigio sono accettabili nella tua risposta.
  • I colori non devono essere costantemente nello stesso ordine.
  • Obiettivo per il programma più breve. Vince il minor numero di byte.

Esempio di output:

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

Grazie a @Mike Hill per avermi avvisato per la prima volta di questa variazione.


Qualche regola sulla distribuzione dei risultati? Perché ho potuto generare output validi scegliendo tra colori non grigi un numero casuale di volte, seguito dalla stampa Greyuna volta (quindi non avrei dovuto scegliere da tutti loro e controllare se ho scelto Grey).
Martin Ender,

@MartinEnder Va bene. "I colori non devono essere costantemente nello stesso ordine." conta, ma non c'è niente che ti impedisca di scegliere il grigio separatamente alla fine.
AJFaraday,

3
L'ortografia alternativa "grigia" è consentita?
12

@ 12Me21 Curioso, però. C'è una ragione tecnica per questo? O solo estetico?
AJFaraday,

2
Secondo la mia opinione non così modesta, ti manca un color anatra estremamente importante. Il blu è vicino, ma non abbastanza preciso.
cobaltduck,

Risposte:


6

05AB1E , 42 40 byte

Salvato 2 byte grazie a Erik the Outgolfer

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

Provalo online!


3
Ho notato molte di queste lingue golfistiche illeggibili. Esiste un compilatore da qualche forma più leggibile dall'uomo?
AJFaraday,

@AJFaraday: Non ne sono a conoscenza. L'unico linguaggio del golf che conosco che ha uno di questi è il carbone.
Emigna

1
È possibile comprimere ulteriormente la stringa, indè ëß!
Erik the Outgolfer

1
Gs2 ne ha anche uno. Ma quella lingua non è usata così tanto in questi giorni.
ricorsivo

1
@ Simón: la tabella codici
05AB1E

46

LuaLaTeX, 220 211 caratteri

comando:

lualatex -interaction nonstopmode

Non il più corto, ma il più fantasioso. Basato sulla soluzione di @ skillmon

inserisci qui la descrizione dell'immagine

\RequirePackage{tikzducks}\newcount\b\let~\def~\0{red}~\1{orange}~\2{yellow}~\3{green}~\4{blue}~\5{cyan}~\6{violet}~\7{gray}\loop\b\uniformdeviate8\tikz\duck[body=\csname\the\b\endcsname]; \ifnum\b<7\repeat\stop

9
Santo cielo! Questa è solo la cosa migliore! Mi hai reso felice, Alex.
AJFaraday,

@AJFaraday davvero un'idea fantastica da usare tikzduckslì :)
Skillmon

6
+1 e le mie scuse per aver scelto un nome di pacchetto così lungo!

@sam, ottieni la mia assoluzione
AlexG

8
Ciao sig. persona che io sicuramente non lo so da altre comunità tecnici come TeX.sx . Poiché questa risposta riguarda alcuni uccelli della famiglia Anatidae , mi sento in dovere di fornire un segno di approvazione votandolo. :)
Paulo Cereda,

26

6502 codice macchina (C64), 124 byte

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 Online - Uso:SYS49152.

immagine dello schermo


Spiegazione (smontaggio commentato):

         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

Mi dispiace, la tua demo non sembra produrre alcun contenuto relativo all'anatra.
AJFaraday,

1
@AJFaraday si prega di notare la parte "utilizzo" ... il comando per eseguirlo è sys 49152.
Felix Palmen,

Ok, questo ha reso la mia giornata :)
AJFaraday

1
È stato fantastico. È da un po 'che non scrivo un assembly c64.
lsd

2
@lsd: stesso qui! il mio primo programma è stato l'assemblaggio 6502 su un C64, perché l'ho appena ricevuto e un amico mi ha dato il libro 6502 con il compito di "scrivere un gioco!" per spingermi a scrivere qualcosa! (fantastico! È stato un grande motivatore non solo leggere, ma in realtà scrivere qualcosa). ha scritto un programma "Snake" di 192 byte (iirc) (con un doppio indice, imo, intelligente che punta verso la testa e la coda della posizione del serpente) ... primo tentativo: è passato oltre il bordo inferiore, "mangiando" il resto del montone, che cresceva su qualsiasi "@", mentre mi dimenticavo di sistemare le pareti ^^
Olivier Dulac


10

Taxi , 1995 byte

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

Provalo online!

Penso che valga la pena notare che il 47% di questo codice sta semplicemente selezionando un numero intero casuale da 1 a 8.
Inoltre, Taxi è così prolisso che è molto più breve codificare il duck\ncolore dopo ogni colore piuttosto che concatenarlo in seguito.
Ecco la versione senza 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".

È stato divertente da leggere.
Makotosan,

Golly, questo è esoterico! Non riesco a capire come funziona. Molto divertente, però :)
AJFaraday

Questo sembra legato a Fetlang
Skillmon il

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

Provalo online!

spiegazioni

v->{                              // Void-accepting void lambda function
  for(int x=9;x>0;)               //  Loop until x is zero
    System.out.println(           //   Print...
        "Grey,Red,Orange,         //       colors, "Grey" first
         Yellow,Green,Blue,       //          more colors
         Indigo,Violet"           //          more colors
        .split(",")               //       as an array
          [x+=Math.random()*8-x]  //       pick one randomly, use implicit double to int cast with "x+=<double>-x" trick
        +" duck");                //      Oh, and append " duck" to the color.
}

8

Rubino , 93 91 90 89 87 86 85 byte

Grazie a Dom Hastings per aver salvato 2 byte, Kirill L. 1 byte e Asone Tuhid 1 byte!

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

Provalo online!


Puoi rimuovere ()il codice e, se lo usi $.invece di smemorizzare l'indice, puoi evitare di crearlo del stutto (dato che $.è pre-inizializzato al numero di riga!) Dovrai spostarti Greyalla fine dell'elenco e cercare $.<7invece anche se. Spero che aiuti!
Dom Hastings,

@DomHastings Grazie! Stavo cercando un modo per sbarazzarmi di s=1ed $.era perfetto!
Cristian Lupascu,

Penso che puoi anche rimuovere lo spazio dopo un po ', Ruby non sembra lamentarsene.
Kirill L.

@KirillL. Esatto, grazie! In precedenza avevo while s...e lo spazio era necessario. Non ho visto questa opportunità dopo essere passato sa $..
Cristian Lupascu,


7

Operazione linguaggio di scripting Flashpoint , 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}

Chiama con:

hint call f

Esempio di output:

All'inizio in qualche modo ho frainteso la sfida come se l'obiettivo fosse quello di produrre solo una quantità variabile di linee, non necessariamente terminando con la linea "Anatra grigia". A seguito di questa interpretazione errata, è stato prodotto un codice leggermente più interessante:

f={s="";c=[1];c set[random 9,0];{s=s+(["Red","Orange","Yellow","Green","Blue","Indigo","Violet","Grey"]select random 7)+" duck\n"}count c;s}

7

pdfTeX, 231 220 219 209 207 byte

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

\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



5

PHP, 89 byte

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

Corri con -nro provalo online .


4

> <> , 107 byte

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

Provalo online!


4

Ottava , 114 112 byte

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

Provalo online!

Ci sono un sacco di diverse opzioni che sono tutte tra 112 e 118 byte ... Alcuni inizializzano un indice all'inizio e lo decrementano di un numero casuale per ogni ciclo, e aspettano fino a quando è 0 . Altri usano printfinvece di dispevitare alcune parentesi e così via.


Piccola domanda: c'è un simbolo in ottava che fa lo stesso di & in Excel, perché penso che sia possibile accorciare ulteriormente il codice.
Michthan,

1
Sfortunatamente, no ... Le stringhe devono essere concatenate all'interno di parentesi quadre (o usando funzioni come cate horzcat. Grazie comunque :)
Stewie Griffin

4

PHP , 133 125 111 108 97 92 byte

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

Provalo online!

-8 byte grazie a @Olivier Grégoire

-3 byte grazie a @manatwork

-11 byte grazie a @Dom Hastings


2
Nella stringa di colore e nel test, cambia Greyin X, poiché non viene utilizzato. Guadagnerai 6 byte.
Olivier Grégoire,

@ OlivierGrégoire Oh true. Grazie :)
Davіd

1
Invertire la for's condizione di aver bisogno senza parentesi: x!=$b=$a[array_rand($a)]. A proposito, ?>termina una dichiarazione, non è necessario di ;fronte ad essa.
arte

@manatwork Ohh, bello! Aggiornerò la mia risposta ora!
Davіd

2
Puoi salvare qualche altro byte non includendoli xaffatto e usando $b=$a..come condizione e usando rand(0,7)invece di array_rand. Puoi rimuovere la nuova riga tra ?>e Grey duckanche. Anche il tuo link TIO aveva ancora tag completi, puoi aggiungerlo -d short_open_tag=onai flag per farlo funzionare! :)
Dom Hastings


4

bash, 96 byte

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

Grazie a @DigitalTrauma.


Tante opportunità per giocare a golf: dai un'occhiata ai consigli di golf bash
Digital Trauma,

@DigitalTrauma Avevo fretta, ma volevo una soluzione Bash pura senza coreutils GNU. Potrei ridurlo da 112 a 105 byte.
rexkogitans,

Sì, mi piacciono anche le risposte pure-bash. Ecco altri 10 byte di sconto
Digital Trauma

Mi sono spogliato >0, tuttavia, ho lasciato ${#a}invece di 8.
rexkogitans,

Perché devi conservare ${#a}invece di 8? Questo è code-golf - non è necessario fornire la generalizzabilità del codice da modificare per un numero diverso di colori. Tutto quello che devi fare è soddisfare le specifiche nel minor numero di byte.
Trauma digitale

3

JavaScript, 104 byte

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

Provalo online


1
FWIW, ho avuto questa variante , ma sono bloccato anche a 104 byte.
Arnauld,

Peccato che non possiamo usare new Dateper l'RNG qui.
Shaggy,

3

AWK , 114 byte

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

Provalo online!

Spiegazione

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

Si noti che questo richiede "alcuni" input. L'input può essere vuoto. Per evitare la necessità di inserire anteporre la prima riga conBEGIN


3

PowerShell , 94 byte

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

Provalo online!

Passa fino a quando $rè uguale a Grey. All'interno del loop, -splits la stringa letterale su newline, ne sceglie una Random, quindi stampa il plus del colore Duck(tecnicamente, viene lasciato sulla pipeline e la pulizia della pipeline sulla successiva iterazione del loop fa sì Write-Outputche accada). Si noti che è teoricamente possibile Greyche non venga mai scelto e che il ciclo continui all'infinito, ma ciò non succederà quasi mai (nel senso della probabilità).


3

R , 101 byte

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

Provalo online!

Fortemente ispirato dalla risposta di @ user2390246 alla relativa sfida. Abbiamo bisogno di due fonti di casualità: cambiare l'ordine dei colori e campionare i colori delle anatre non grigie. L' sampleavrà un campione casuale di dimensione casuale in una distribuzione esponenziale con parametro di velocità 1, troncato a un numero intero. L'uso di una distrazione esponenziale significa purtroppo che esiste una probabilità exp(-8)o 0.0003354 almeno che il campione sarà almeno 8, quindi dobbiamo fare un campione replace=T.


puoi sostituirlo \ncon una nuova riga effettiva per 1
MickyT

inoltre puoi risparmiare parecchio usando colors()[c(26,254,498,552,640,652)]al posto del scan(..)ecc. dovrebbe scendere a circa 83
MickyT

@MickyT ......... Non uso abbastanza la grafica di R per ricordare tutte le belle grafiche come colors()! Questi sono dei bei golf, che penso che dovresti pubblicare come risposta, dato che questo è il modo meno elegante di ottenere i colori.
Giuseppe,

ok allora, lo
posterò

3

Python 2 , 138 133 120 117 116 byte

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

Provalo online!

Molto meglio con alcune idee di @EriktheOutgolfer. Grazie!

-3 in più grazie a @ovs

-1 grazie a @Rod per un nuovo fantastico trucco appreso :-)


3

Retina , 69 68 byte

Grazie a Leo per aver salvato 1 byte.

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

Provalo online!

Spiegazione

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

.sopprime l'output implicito alla fine del programma (altrimenti avremmo due anatre grigie). /y/^{avvolge l'intero programma in un ciclo che continua finché la stringa di lavoro non contiene a y. Il resto di quella riga imposta la stringa di lavoro su un elenco separato da avanzamenti di riga di tutti i colori.

" duck¶">G?`

Grep una linea casuale dalla stringa di lavoro (e quindi un colore casuale). E stampiamo il risultato con un trascinamento ducke un avanzamento riga.


3

MATL , 68 64 byte

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

Provalo online!

Spiegazione

`                         % Do...while
  'DYCI···Id;&'           %   Push this string (to be decompressed by base conversion)
  F                       %   Push false
  2Y2                     %   Push string 'abc...xyz'
  32                      %   Push 32 (ASCII for space)
  h                       %   Concatenate horizontally. Gives 'abc...xyz '
  Za                      %   Base-convert from alphabet of all printable ASCII
                          %   characters except single quote (represented by input
                          %   false) to alphabet 'abc...xyz '. Produces the string
                          %   'grey red ··· violet'
  Yb                      %   Split on space. Gives a cell array of strings
  8Yr                     %   Random integer from 1 to 8, say k
  X)                      %   Get the content of the k-th cell
  ' duck'                 %   Push this string
  h                       %   Concatenate horizontally
  7M                      %   Push k again
  q                       %   Subtract 1
                          % Implicit end. Run a new iteration if top of the stack
                          % is non-zero
                          % Implicit display

3

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

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 di @ElPedro!
-1 da me
-1 da @Bubbler!

Provalo online!


Puoi spostare Gray in primo piano e d!=c[0]salvare un byte?
ElPedro

print(d,'duck')per salvare un byte. Il delimitatore predefinito è uno spazio.
Gorgogliatore

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)

Provalo online!

Il mio primo codegolf! Ovviamente non competitivo, solo felice di aver imparato abbastanza Java (attualmente in CS200) per poter partecipare.


2

Kotlin , 122 byte

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

Provalo online!


1
Potrebbe essere utile a qualcuno là fuori, per ottenere un valore intero casuale in Kotlin, puoi usare quanto segue: (0..7) .shuffled () [0] Più corto di: (Math.random () * 8) .toInt ()
Makotosan,

2

MS-SQL, 158 byte

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

Basato in gran parte sull'eccellente risposta di Razvan , ma utilizzando la STRING_SPLITfunzione specifica di MS-SQL 2016 e versioni successive. Utilizza anche un GOTOanziché un WHILEciclo.

formattato:

DECLARE @ VARCHAR(6)
a:
    SELECT @=value FROM 
        STRING_SPLIT('Red,Orange,Yellow,Green,Blue,Indigo,Violet,Grey',',')
        ORDER BY NEWID()
    PRINT @+' duck'
IF @<>'Grey'GOTO a

2

T-SQL , 195 185 184 byte

DECLARE @ VARCHAR(9)=''WHILE @<>'Grey'BEGIN SELECT @=c FROM(VALUES('Red'),('Orange'),('Yellow'),('Green'),('Blue'),('Indigo'),('Violet'),('Grey'))v(c)ORDER BY NEWID()PRINT @+' Duck'END

1
Bella variazione. È possibile rimuovere lo spazio prima BEGIN.
BradC

2

Python 2 , 98 byte

Guarda ma nessuna importazione!

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

(Stampa spazi extra tra i colori e duckcome consentito nella domanda)

Provalo online!

Un generatore di numeri pseudo-casuali piuttosto scadente seminato con l'id oggetto di 0 (ma sembra adattarsi alla specifica) che produce ripetutamente un numero intero x, in [0,7] che viene usato per tagliare un elenco di caratteri da quell'indice in passaggi di 8 per ottenere il nome del colore che viene stampato insieme duckcome una tupla, forzando uno spazio nel mezzo. Quando xdiventa zero Greyviene stampato e la valutazione dell'ingresso successivo al generatore di numeri casuali basato su modulo errori nel tentativo di dividere per zero ( v=1/x,vtenta di creare una nuova tupla con il primo elemento 1/x= 1/0)


Allo stesso modo è 100 in 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.