Bebek biru, bebek merah, bebek abu-abu

48

Jadi, minggu lalu saya memposting tantangan untuk bermain Bebek, Bebek, Angsa . Hal ini menyebabkan sejumlah warga Minnesotan berkomentar tentang variasi 'bebek bebek' regional mereka .

Jadi, inilah aturannya:

Menggunakan daftar warna ini:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Tulis program untuk mengikuti aturan ini:

  1. Pilih salah satu dari warna-warna ini, dan tambahkan ke kata 'bebek' dan cetak hasilnya ke baris baru.
  2. Jika warnanya bukan 'Abu-abu', ulangi langkah 1.
  3. Jika warnanya 'Abu-abu', akhiri program Anda.

Aturan yang harus diikuti:

  • Program tidak harus secara konsisten mencetak jumlah baris yang sama.
  • Itu bisa dimulai dari 'Grey duck', tetapi tidak harus dilakukan secara konsisten.
  • Harus ada tepat satu bebek di setiap baris dan tidak ada garis kosong yang dihasilkan.
  • Harus ada setidaknya satu ruang antara warna dan bebek.
  • Ruang putih sebelum dan sesudah output yang signifikan tidak masalah.
  • Kasus output tidak masalah.
  • Warna bisa diulang.
  • Output tidak harus mengandung setiap warna setiap waktu, tetapi harus memungkinkan bahwa kode Anda akan menampilkan setiap warna.
  • Tidak ada warna di luar array di atas yang dapat dimasukkan.
  • Abu-abu atau abu-abu dapat diterima dalam jawaban Anda.
  • Warna tidak harus konsisten dalam urutan yang sama.
  • Bertujuan untuk program terpendek. Jumlah byte terkecil menang.

Contoh output:

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

Terima kasih kepada @Mike Hill karena telah mengingatkan saya pada variasi ini.

AJFaraday
sumber
Adakah aturan tentang distribusi hasil? Karena saya bisa menghasilkan output yang valid dengan memilih dari warna-warna non-abu-abu beberapa kali secara acak, diikuti dengan mencetak Greysatu kali (jadi saya tidak harus memilih dari semuanya dan memeriksa apakah saya sudah memilih Grey).
Martin Ender
@ MartinEnder Tidak apa-apa. "Warna seharusnya tidak secara konsisten berada dalam urutan yang sama." penting, tetapi tidak ada yang menghentikan Anda memilih abu-abu secara terpisah di akhir.
AJFaraday
3
Apakah ejaan alternatif "abu-abu" diperbolehkan?
12Me21
@ 12Me21 Penasaran, tho. Apakah ada alasan teknis untuk itu? Atau hanya yang estetis?
AJFaraday
2
Menurut pendapat saya yang tidak terlalu rendah hati, Anda kehilangan satu warna bebek yang sangat penting. Biru dekat, tetapi tidak cukup tepat.
cobaltduck

Jawaban:

6

05AB1E , 42 40 byte

Disimpan 2 byte berkat Erik the Outgolfer

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

Cobalah online!

Emigna
sumber
3
Saya perhatikan banyak bahasa golf yang tidak bisa dibaca ini. Apakah ada kompiler dari beberapa bentuk yang lebih dapat dibaca manusia?
AJFaraday
@AJFaraday: Bukannya saya sadar. Satu-satunya bahasa golf yang saya tahu memiliki salah satunya adalah Charcoal.
Emigna
1
Anda dapat memampatkan string Anda lebih jauh, indadalah ëß!
Erik the Outgolfer
1
GS2 memiliki satu juga. Tetapi bahasa itu tidak banyak digunakan akhir-akhir ini.
rekursif
1
@ Simón: Halaman kode
05AB1E
46

LuaLaTeX, 220 211 karakter

perintah:

lualatex -interaction nonstopmode

Bukan yang terpendek, tapi yang paling keren. Berdasarkan solusi @ skillmon

masukkan deskripsi gambar di sini

\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
sumber
9
Astaga! Ini adalah hal terbaik! Anda telah membuat hari saya, Alex.
AJFaraday
@AJFaraday memang ide yang luar biasa untuk digunakan di tikzduckssana :)
Skillmon
6
+1 dan permintaan maaf saya karena memilih nama paket yang begitu panjang!
@sam, dapatkan absolusi saya
AlexG
8
Halo mr. orang yang saya pasti tidak tahu dari komunitas teknis lain seperti TeX.sx . Karena jawaban ini mencakup beberapa burung di keluarga Anatidae , saya merasa terdorong untuk memberikan tanda persetujuan dengan mengangkatnya. :)
Paulo Cereda
26

6502 kode mesin (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

Secara online demo - Penggunaan:SYS49152.

tangkapan layar


Penjelasan (dikomentari pembongkaran):

         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
sumber
Maaf, demo Anda sepertinya tidak menghasilkan konten yang terkait dengan bebek.
AJFaraday
1
@ AJFaraday tolong perhatikan bagian "penggunaan" ... perintah untuk menjalankannya adalah sys 49152.
Felix Palmen
Oke, itu membuat hari saya :)
AJFaraday
1
Itu luar biasa. Sudah lama sejak saya menulis perakitan C64.
lsd
2
@ ls: sama di sini! Program pertama saya adalah 6502 perakitan pada C64, karena saya baru saja mendapatkannya dan seorang teman memberi saya buku 6502 dengan tugas "menulis permainan!" untuk membuat saya mulai menulis sesuatu! (Cara yang bagus! itu adalah motivator yang hebat untuk tidak hanya membaca, tetapi juga menulis sesuatu) menulis program "Snake" 192 bytes (iirc) (dengan indeks ganda, imo, pandai yang menunjuk ke kepala & ke ekor posisi ular) ... pertama coba: ia diperbesar melewati tepi bawah, 'makan' ke sisa domba jantan itu, tumbuh di atas "@" apa pun, karena saya lupa memasang dinding ^^
Olivier Dulac
12

Perl 5 , 79 byte

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

Cobalah online!

Dom Hastings
sumber
10

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

Cobalah online!

Saya pikir perlu dicatat bahwa 47% dari kode ini hanya memilih bilangan bulat acak dari 1 menjadi 8.
Juga, Taksi sangat bertele-tele sehingga jauh lebih pendek daripada kode yang sulit duck\nsetelah setiap warna daripada menyatukannya nanti.
Ini versi un-golfed:

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".
Toast insinyur
sumber
Itu menyenangkan untuk dibaca.
Makotosan
Astaga, itu esoteris! Saya tidak bisa mulai mengerti cara kerjanya. Sangat menyenangkan, ya :)
AJFaraday
Ini sepertinya terkait dengan Fetlang
Skillmon
8

Java (OpenJDK 9) , 133 byte

v->{for(int x=9;x>0;)System.out.println("Grey,Red,Orange,Yellow,Green,Blue,Indigo,Violet".split(",")[x+=Math.random()*8-x]+" duck");}

Cobalah online!

Penjelasan

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

Ruby , 93 91 90 89 87 86 85 byte

Terima kasih kepada Dom Hastings untuk menghemat 2 byte, Kirill L. 1 byte dan Asone Tuhid 1 byte!

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

Cobalah online!

Cristian Lupascu
sumber
Anda dapat menghapus ()sekitar kode dan jika Anda menggunakan $.alih-alih suntuk menyimpan indeks, Anda dapat menghindari membuat ssama sekali (karena $.sudah diinisialisasi ke nomor baris!) Anda harus pindah Greyke akhir daftar dan memeriksa sebagai $.<7gantinya meskipun. Semoga itu bisa membantu!
Dom Hastings
@HomHastings Terima kasih! Saya sedang mencari cara untuk menyingkirkan s=1dan $.sempurna!
Cristian Lupascu
Saya pikir Anda juga dapat menghapus ruang setelah beberapa saat, Ruby sepertinya tidak mengeluh tentang itu.
Kirill L.
@ KirillL. Benar, terima kasih! Saya sebelumnya punya while s...dan ruang yang dibutuhkan. Tidak melihat peluang ini setelah berubah smenjadi $..
Cristian Lupascu
7

Pengoperasian Bahasa skrip 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}

Telepon dengan:

hint call f

Contoh output:

Pada awalnya saya entah bagaimana salah membaca tantangan seolah-olah tujuannya adalah hanya menghasilkan jumlah baris yang bervariasi, tidak harus berakhir pada garis "Bebek abu-abu". Mengikuti interpretasi yang salah menghasilkan sepotong kode yang sedikit lebih menarik:

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
sumber
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
Skillmon
sumber
5

Brachylog , 68 byte

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

Cobalah online!

Erik the Outgolfer
sumber
5

Ruby , 84 81 byte

Terima kasih kepada Dom Hastings untuk -3 byte.

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

Cobalah online!

Kirill L.
sumber
1
Jika Anda menyimpannya $_, Anda bisa memiliki until/y/di akhir untuk -3!
Dom Hastings
5

PHP, 89 byte

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

Jalankan dengan -nratau coba online .

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

Cobalah online!

Sok
sumber
4

Oktaf , 114 112 byte

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

Cobalah online!

Ada banyak opsi berbeda yang semuanya antara 112 dan 118 byte ... Beberapa menginisialisasi indeks di awal dan menguranginya dengan angka acak untuk setiap loop, dan menunggu sampai 0 . Yang lain menggunakan printfalih-alih dispmenghindari tanda kurung dan sebagainya.

Stewie Griffin
sumber
Pertanyaan kecil: Apakah ada simbol dalam oktaf yang melakukan hal yang sama dengan & di Excel, karena saya pikir mungkin untuk mempersingkat kode lebih jauh lagi.
Michthan
1
Sayangnya, tidak ada ... String harus digabungkan di dalam tanda kurung siku (atau menggunakan fungsi seperti catdan horzcat. Terima kasih :)
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

Cobalah online!

-8 byte terima kasih kepada @Olivier Grégoire

-3 byte terima kasih kepada @manatwork

-11 byte terima kasih kepada @Dom Hastings

David
sumber
2
Dalam string warna dan tes, ubah Greyke X, karena tidak digunakan. Anda akan mendapatkan 6 byte.
Olivier Grégoire
@ OlivierGrégoire Oh benar. Terima kasih untuk itu :)
David
1
Membalikkan forkondisi 's untuk tidak perlu kurung: x!=$b=$a[array_rand($a)]. BTW, ?>mengakhiri pernyataan, tidak perlu ;di depannya.
manatwork
@manatwork Ohh, bagus! Saya akan memperbarui jawaban saya sekarang!
Davіd
2
Anda dapat menyimpan beberapa byte lagi dengan tidak memasukkan xsama sekali dan menggunakan $b=$a..sebagai kondisi dan menggunakan rand(0,7)bukan array_rand. Anda dapat menghapus baris baru di antara ?>dan Grey duckjuga. Juga tautan TIO Anda masih memiliki tag lengkap, Anda dapat menambahkan -d short_open_tag=onke flag agar berfungsi! :)
Dom Hastings
4

Utilitas Bash + GNU, 72

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

Cobalah online .

Trauma Digital
sumber
4

bash, 96 byte

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

Terima kasih kepada @DigitalTrauma.

rexkogitans
sumber
Banyak peluang untuk bermain golf ini - lihat tips bermain golf
Digital Trauma
@DigitalTrauma Saya sedang terburu-buru, tapi saya ingin solusi Bash murni tanpa / tanpa GNU coreutils. Saya bisa mengecilkannya dari 112 hingga 105 byte.
rexkogitans
Ya, saya juga menyukai jawaban murni-bash. Berikut ini 10 byte lagi
Digital Trauma
Saya ditelanjangi >0, namun, saya meninggalkan ${#a}bukannya 8.
rexkogitans
Mengapa Anda perlu menjaga ${#a}bukan 8? Ini adalah kode-golf - tidak perlu memberikan generalisabilitas kode Anda untuk dimodifikasi untuk jumlah warna yang berbeda. Yang perlu Anda lakukan adalah memenuhi spesifikasi dalam jumlah terkecil byte.
Digital Trauma
3

JavaScript, 104 byte

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

Cobalah online

Shaggy
sumber
1
FWIW, saya punya varian ini , tapi saya juga terjebak pada 104 byte.
Arnauld
Sayang sekali kita tidak dapat menggunakan new Dateuntuk RNG di sini.
Shaggy
3

AWK , 114 byte

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

Cobalah online!

Penjelasan

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

Perhatikan bahwa ini membutuhkan input "beberapa". Masukan bisa kosong. Untuk menghindari kebutuhan input, tambahkan baris pertama denganBEGIN

Robert Benson
sumber
3

PowerShell , 94 byte

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

Cobalah online!

Loop sampai $rsama dengan Grey. Di dalam loop, -splits string literal pada baris baru, memilih Randomsatu daripadanya, kemudian mencetak warna plus Duck(secara teknis, itu tersisa di pipa dan pembersihan pipa pada iterasi loop berikutnya menyebabkan terjadinya Write-Output). Perhatikan bahwa secara teori dimungkinkan untuk Greytidak pernah dipilih, dan loop untuk melanjutkan tanpa batas, tetapi ini hampir tidak pernah (dalam arti probabilitas) akan terjadi.

AdmBorkBork
sumber
3

R , 101 byte

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

Cobalah online!

Sangat terinspirasi oleh jawaban @ user2390246 untuk tantangan terkait. Kami membutuhkan dua sumber keacakan: Mengubah urutan warna dan mengambil sampel warna bebek non-abu-abu. Ini sampleakan mengambil sampel acak ukuran acak yang diberikan oleh distribusi eksponensial dengan parameter rate 1, dipotong ke integer. Sayangnya, menggunakan distrubtion eksponensial berarti bahwa ada kemungkinan exp(-8)atau sekitar 0.0003354 bahwa sampel akan setidaknya 8, jadi kita harus sampel dengan replace=T.

Giuseppe
sumber
Anda dapat menggantinya \ndengan baris baru aktual untuk 1
MickyT
Anda juga dapat menghemat sedikit menggunakan colors()[c(26,254,498,552,640,652)]di tempat scan(..)dll. harus turun menjadi sekitar 83
MickyT
@MickyT ......... Saya tidak menggunakan grafik R cukup untuk mengingat tentang semua grafis bawaan yang bagus seperti colors()! Itu adalah beberapa golf yang bagus, yang saya pikir Anda harus posting sebagai jawaban Anda sendiri, karena ini adalah cara yang kurang elegan untuk mendapatkan warna.
Giuseppe
ok kalau begitu, saya akan mempostingnya dengan beberapa perubahan kecil
MickyT
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'

Cobalah online!

Jauh lebih baik dengan beberapa ide dari @EriktheOutgolfer. Terima kasih!

-3 lagi dengan terima kasih kepada @ovs

-1 dengan terima kasih kepada @Rod untuk trik baru yang keren :-)

ElPedro
sumber
3

Retina , 69 68 byte

Terima kasih kepada Leo karena telah menghemat 1 byte.

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

Cobalah online!

Penjelasan

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

.menekan output implisit pada akhir program (jika tidak, kita akan mendapatkan dua bebek abu-abu). /y/^{membungkus seluruh program dalam satu loop yang berlanjut selama string yang bekerja tidak mengandung a y. Sisa dari garis itu menetapkan string yang bekerja ke daftar semua warna yang dipisahkan baris-baris.

" duck¶">G?`

Kami mengambil garis acak dari string yang bekerja (dan karena itu warna acak). Dan kami mencetak hasilnya dengan trailing duckdan linefeed.

Martin Ender
sumber
3

MATL , 68 64 byte

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

Cobalah online!

Penjelasan

`                         % 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
sumber
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 oleh @ElPedro!
-1 by me
-1 oleh @Bubbler!

Cobalah online!

Rick Rongen
sumber
Bisakah Anda memindahkan Gray ke depan dan harus d!=c[0]menyimpan satu byte?
ElPedro
print(d,'duck')untuk menyimpan byte. Pembatas default adalah spasi.
Bubbler
3

Java (JDK 10) , 287 byte

Random r=new Random();int i;String c;do{i=r.nextInt(8);switch(i){case 0:c="Red";break;case 1:c="Orange";break;case 2:c="Yellow";break;case 3:c="Green";break;case 4:c="Blue";break;case 5:c="Indigo";break;case 6:c="Violet";break;default:c="Gray";}System.out.println(c+" duck");}while(i!=7)

Cobalah online!

Codegolf pertama saya! Jelas tidak kompetitif, hanya senang telah cukup belajar Java (saat ini di CS200) untuk dapat berpartisipasi.

Chris Decker
sumber
2

Kotlin , 122 byte

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

Cobalah online!

Makotosan
sumber
1
Mungkin bisa membantu seseorang di luar sana, untuk mendapatkan nilai integer acak di Kotlin, Anda dapat menggunakan yang berikut ini: (0..7) .shuffled () [0] Lebih pendek dari: (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

Sebagian besar didasarkan pada jawaban yang sangat baik dari Razvan , tetapi menggunakan STRING_SPLITfungsi yang spesifik untuk MS-SQL 2016 dan yang lebih baru. Juga menggunakan GOTObukan WHILEloop.

Diformat:

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
sumber
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
Razvan Socol
sumber
1
Variasi yang bagus. Anda dapat menghapus ruang sebelumnya BEGIN.
BradC
2

Python 2 , 98 byte

Lihat ma no import!

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

(Mencetak ruang ekstra antara warna dan ducksebagaimana diizinkan dalam pertanyaan)

Cobalah online!

Generator pseudo-acak yang cukup buruk diunggulkan dengan id objek 0 (tetapi tampaknya sesuai dengan spek) yang berulang kali menghasilkan bilangan bulat x, pada [0,7] yang digunakan untuk mengiris daftar karakter dari indeks tersebut di langkah 8 untuk mendapatkan nama warna yang dicetak bersama dengan ducktuple, memaksa spasi di antaranya. Ketika xmenjadi nol Greydicetak dan evaluasi input berikutnya ke kesalahan generator nomor acak berbasis modulo mencoba untuk membaginya dengan nol ( v=1/x,vmencoba membuat tuple baru dengan elemen pertama 1/x= 1/0)


Cara yang sama adalah 100 dengan Python 3

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