Pato azul, pato vermelho, pato cinza


48

Então, na semana passada, eu postei um desafio para jogar Duck, Duck, Goose . Isso levou vários Minnesotanos a comentar sobre sua variação regional do 'pato cinza' .

Então, aqui estão as regras:

Usando esta lista de cores:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Escreva um programa para seguir estas regras:

  1. Selecione uma dessas cores, acrescente-a à palavra 'pato' e imprima o resultado em uma nova linha.
  2. Se a cor não for "Cinza", repita a etapa 1.
  3. Se a cor era "Cinza", encerre seu programa.

Regras que devem ser seguidas:

  • O programa não deve imprimir consistentemente o mesmo número de linhas.
  • Pode começar no 'pato cinzento', mas não deve ser consistente.
  • Deve haver exatamente um pato em cada linha e nenhuma linha vazia é emitida.
  • Deve haver pelo menos um espaço entre uma cor e um pato.
  • O espaço em branco antes e depois da saída significativa não importa.
  • O caso da saída não importa.
  • As cores podem ser repetidas.
  • A saída não precisa conter todas as cores todas as vezes, mas deve ser possível que seu código produza todas as cores.
  • Nenhuma cor fora da matriz acima pode ser incluída.
  • Cinza ou cinza são aceitáveis ​​em sua resposta.
  • As cores não devem estar consistentemente na mesma ordem.
  • Apontar para o programa mais curto. O menor número de bytes vence.

Exemplo de saída:

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

Obrigado a Mike Hill por me alertar sobre essa variação.


Alguma regra sobre a distribuição dos resultados? Como eu poderia gerar saídas válidas escolhendo cores não cinza várias vezes, seguidas pela impressão Greyuma vez (para que eu não precisasse escolher todas elas e verificar se selecionei Grey).
Martin Ender

@MartinEnder Tudo bem. "As cores não devem estar sempre na mesma ordem." importa, mas não há nada para impedir que você escolha cinza separadamente no final.
Agradeço o seu contato

3
A ortografia alternativa "cinza" é permitida?
precisa

@ 12Me21 Curioso, tho. Existe uma razão técnica para isso? Ou apenas uma estética?
AJFaraday

2
Na minha opinião não tão humilde, falta uma cor de pato extremamente importante. O azul está próximo, mas não é preciso o suficiente.
Cobaltduck 20/0318

Respostas:


6

05AB1E , 42 40 bytes

Economizou 2 bytes graças a Erik the Outgolfer

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

Experimente online!


3
Eu notei muitas dessas linguagens de golfe ilegíveis. Existe um compilador de alguma forma mais legível por humanos?
AJFaraday

@AJFaraday: Não que eu saiba. A única linguagem de golfe que conheço e uma delas é o carvão vegetal.
Emigna 19/03/19

1
Você pode comprimir sua string ainda mais, indé ëß!
Erik the Outgolfer

1
GS2 tem um também. Mas essa linguagem não é muito usada atualmente.
recursivo

1
@ Simón: A página de código
05AB1E

46

LuaLaTeX, 220 211 caracteres

comando:

lualatex -interaction nonstopmode

Não é o mais curto, mas o mais extravagante. Baseado na solução de @ skillmon

insira a descrição da imagem aqui

\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
Deus do céu! Esta é apenas a melhor coisa! Você fez o meu dia, Alex.
AJFaraday

@AJFaraday fato incrível idéia usar tikzduckslá :)
Skillmon

6
+1 e minhas desculpas por escolher um nome de pacote tão longo!

@sam, você começa a minha absolvição
AlexG

8
Olá sr. pessoa que eu definitivamente não sei de outras comunidades como técnicos TeX.sx . Como esta resposta cobre alguns pássaros da família Anatidae , sinto-me compelido a fornecer um sinal de aprovação ao fazer o voto positivo. :)
Paulo Cereda 21/03

26

Código da 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

Demonstração Online - Uso:SYS49152.

captura de tela


Explicação (desmontagem comentada):

         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

Sinto muito, sua demo não parece exibir nenhum conteúdo relacionado a patos.
AJFaraday

1
@AJFaraday observe a parte "use" ... o comando para executá-la é sys 49152.
Felix Palmen

Ok, isso fez o meu dia :)
AJFaraday

1
Isso foi demais. Já faz um tempo desde que escrevi a montagem c64.
Lsd

2
@lsd: o mesmo aqui! meu primeiro programa foi a montagem 6502 em um C64, porque acabei de obtê-la e um amigo me deu o livro 6502 com a tarefa "escrever um jogo!" para me estimular a escrever alguma coisa! (ótima maneira! foi um grande motivador não apenas ler, mas realmente escrever algo). escreveu um programa "Snake" de 192 bytes (iirc) (com um índice duplo inteligente, imo, apontando para a cabeça e a cauda da posição da cobra) ... primeira tentativa: passou pela borda inferior, 'comendo' o resto do carneiro, crescendo em qualquer "@", como eu esqueci de montar as paredes ^^
Olivier Dulac


10

Táxi , 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".

Experimente online!

Eu acho que vale a pena notar que 47% desse código está apenas escolhendo um número inteiro aleatório de 1 a 8.
Além disso, o Taxi é tão detalhado que é muito mais curto codificar a duck\ncor após cada cor do que concatená-la mais tarde.
Aqui está a versão sem golfe:

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

Foi divertido ler isso.
Makotosan

Golly, isso é esotérico! Não consigo começar a entender como isso funciona. Muita diversão, tho :)
AJFaraday

Isto parece relacionado a 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");}

Experimente online!

Explicações

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

Ruby , 93 91 90 89 87 86 85 bytes

Obrigado a Dom Hastings por economizar 2 bytes, Kirill L. 1 byte e Asone Tuhid 1 byte!

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

Experimente online!


Você pode remover ()em torno do código e se você usar $., em vez de sarmazenar o índice, você pode evitar a criação scompletamente (uma vez que $.é pré-inicializado para o número da linha!) Você vai precisar se deslocar Greypara o fim da lista e verifique se $.<7, em vez Apesar. Espero que ajude!
Dom Hastings

@DomHastings Thanks! Eu estava procurando uma maneira de me livrar s=1e $.era perfeito!
Cristian Lupascu 19/03/19

Eu acho que você também pode remover o espaço depois de um tempo, Ruby não parece reclamar disso.
21418 Kirill L.

@KirillL. Está certo, obrigado! Eu já tinha while s...e o espaço era necessário. Não viu essa oportunidade depois de mudar spara $..
Cristian Lupascu 19/03/19


7

Linguagem de script da operação 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}

Ligue para:

hint call f

Exemplo de saída:

No começo, de alguma maneira, interpretei mal o desafio, como se o objetivo fosse apenas produzir uma quantidade variável de linhas, não necessariamente terminando na linha "pato cinza". Após essa interpretação incorreta, produzimos um código um pouco mais 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 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


5

Ruby , 84 81 bytes

Agradecimentos a Dom Hastings por -3 bytes.

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

Experimente online!


1
Se você armazenar $_, você pode apenas ter until/y/no final para -3!
Dom Hastings

5

PHP, 89 bytes

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

Corra com -nrou experimente online .



4

Oitava , 114 112 bytes

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

Experimente online!

Existem várias opções diferentes entre 112 e 118 bytes ... Algumas inicializam um índice no início e o decrementam por um número aleatório para cada loop e aguardam até que seja 0 . Outros usam em printfvez de dispevitar alguns suportes e assim por diante.


Pequena pergunta: Existe um símbolo na oitava que faça o mesmo que o & no Excel, porque acho que é possível reduzir ainda mais o código.
Michthan

1
Infelizmente, não ... Cordas devem ser concatenados dentro de colchetes (ou usando funções como cate horzcatGraças embora :).
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

Experimente online!

-8 bytes graças a @Olivier Grégoire

-3 bytes graças a @manatwork

-11 bytes graças a @Dom Hastings


2
Na sequência de cores e no teste, mude Greypara X, pois não é usado. Você ganhará 6 bytes.
Olivier Grégoire

@ OlivierGrégoire Oh verdade. Obrigado por isso :) #
194 Davïd

1
Reverter a forcondição de não precisar de parênteses: x!=$b=$a[array_rand($a)]. BTW, ?>encerra uma declaração, não há necessidade ;na frente dela.
Manatwork 19/0318

@manatwork Ohh, que bom! Vou atualizar minha resposta agora!
197 David

2
Você pode salvar mais alguns bytes, não incluindo xe usando $b=$a..como condição e usando em rand(0,7)vez de array_rand. Você pode remover a nova linha entre ?>e Grey ducktambém. Além disso, seu link TIO ainda possui tags completas. Você pode adicionar -d short_open_tag=onsinalizadores para que isso funcione! :)
Dom Hastings


4

bash, 96 bytes

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

Graças a @DigitalTrauma.


Muitas oportunidades para jogar golfe - confira as dicas de golfe
Digital Trauma

@DigitalTrauma Eu estava com pressa, mas queria uma solução Bash pura sem coreutils GNU. Eu poderia diminuir de 112 para 105 bytes.
Rexkogitans 19/0318

Sim, eu também gosto das respostas puramente básicas. Aqui estão mais 10 bytes de desconto
Digital Trauma

Tirei a roupa >0, no entanto, saí em ${#a}vez de 8.
Rexkogitans 20/0318

Por que você precisa manter em ${#a}vez de 8? Isso é código-golfe - não há necessidade de generalizar o seu código para ser modificado para um número diferente de cores. Tudo o que você precisa fazer é atender às especificações no menor número de bytes.
Digital Trauma

3

JavaScript, 104 bytes

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

Experimente online


1
FWIW, eu tinha essa variante , mas também estou preso em 104 bytes.
Arnauld

Pena que não podemos usar new Datepara o RNG aqui.
Shaggy

3

AWK , 114 bytes

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

Experimente online!

Explicação

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

Observe que isso requer entrada "alguns". A entrada pode estar vazia. Para evitar a necessidade de entrada, acrescente a primeira linha comBEGIN


3

PowerShell , 94 bytes

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

Experimente online!

Loops até que $rseja igual a Grey. Dentro do loop, -splita string literal nas novas linhas, escolhe uma Randomdelas e depois imprime a cor mais Duck(tecnicamente, é deixada no pipeline e a limpeza do pipeline na próxima iteração do loop faz Write-Outputcom que isso aconteça). Observe que teoricamente é possível Greynunca ser escolhido, e o loop continua infinitamente, mas isso quase nunca (no sentido de probabilidade) acontecerá.


3

R , 101 bytes

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

Experimente online!

Fortemente inspirado pela resposta de @ user2390246 ao desafio relacionado. Precisamos de duas fontes de aleatoriedade: alterando a ordem das cores e amostrando as cores de pato não cinza. Ele samplecoletará uma amostra aleatória de tamanho aleatório fornecida por uma distribuição exponencial com o parâmetro rate 1, truncado para um número inteiro. Infelizmente, o uso de uma distribuição exponencial significa que há uma probabilidade de que a amostra seja no mínimo exp(-8)ou ao redor 0.0003354dela 8, então temos que fazer a amostra replace=T.


você pode substituir então \npor uma nova linha real para 1
MickyT

também você pode economizar um pouco usando colors()[c(26,254,498,552,640,652)]no lugar do scan(..)etc, devem descer para cerca de 83
MickyT

@MickyT ......... Eu não uso os gráficos de R o suficiente para lembrar de todos os bons gráficos incorporados como colors()! Esses são alguns bons golfe, que eu acho que você deveria postar como sua própria resposta, já que essa é a maneira menos elegante de obter as cores.
Giuseppe

ok então, eu vou postar com algumas pequenas mudanças #
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'

Experimente online!

Muito melhor com algumas idéias de @EriktheOutgolfer. Obrigado!

-3 mais com agradecimentos a @ovs

-1 com agradecimentos a @Rod por um novo truque aprendido :-)


3

Retina , 69 68 bytes

Agradecemos a Leo por economizar 1 byte.

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

Experimente online!

Explicação

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

.suprime a saída implícita no final do programa (caso contrário, teríamos dois patos cinza). /y/^{quebra o programa inteiro em um loop que continua enquanto a sequência de trabalho não contiver a y. O restante dessa linha define a sequência de trabalho como uma lista separada por avanço de linha de todas as cores.

" duck¶">G?`

Cumprimentamos uma linha aleatória da string de trabalho (e, portanto, uma cor aleatória). E imprimimos o resultado com avanço ducke avanço de linha.


3

MATL , 68 64 bytes

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

Experimente online!

Explicação

`                         % 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 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 mim
-1 por @Bubbler!

Experimente online!


Você pode mover Gray para frente e d!=c[0]salvar um byte?
ElPedro

print(d,'duck')para salvar um byte. O delimitador padrão é um espaço.
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)

Experimente online!

Meu primeiro codegolf! Obviamente não é competitivo, apenas feliz por ter aprendido Java o suficiente (atualmente no CS200) para poder participar.


2

Kotlin , 122 bytes

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

Experimente online!


1
Pode ser útil para alguém lá fora, para obter um valor inteiro aleatório no Kotlin. Você pode usar o seguinte: (0..7) .shuffled () [0] Menor 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

Baseado amplamente na excelente resposta de Razvan , mas usando a STRING_SPLITfunção específica do MS-SQL 2016 e posterior. Também usa um em GOTOvez de um WHILEloop.

Formatado:

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

1
Boa variação. Você pode remover o espaço antes BEGIN.
BradC

2

Python 2 , 98 bytes

Olhe ma não importa!

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

(Imprime espaços extras entre as cores e duckconforme permitido na pergunta)

Experimente online!

Um gerador de números pseudo-aleatórios bastante pobre, semeado com o ID do objeto 0 (mas parece se encaixar na especificação) que gera repetidamente um número inteiro x, em [0,7], que é usado para dividir uma lista de caracteres desse índice em etapas de 8 para obter o nome da cor que é impressa junto com ducka tupla, forçando um espaço intermediário. Quando xtorna-se zero Greyé impresso e a avaliação da próxima entrada para os erros do gerador de números aleatórios baseados em módulo tentando dividir por zero ( v=1/x,vtenta fazer uma nova tupla com o primeiro elemento 1/x= 1/0)


Da mesma maneira é 100 no Python 3 com

v=0
while 1:x=id(v)%17%8;print("GVIYORGBrinererleodladeuyliln ee egog n  towe"[x::8],"duck");v=1/x,v
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.