Mavi ördek, kırmızı ördek, gri ördek


48

Bu yüzden, geçen hafta Duck, Duck, Goose oynamak için bir meydan okuma yayınladım . Bu, bir dizi Minnesotalının bölgesel “Gri Ördek” değişimi hakkında yorumda bulunmasına yol açtı .

İşte kurallar:

Bu renk listesini kullanarak:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Bu kuralları takip etmek için bir program yazın:

  1. Bu renklerden birini seçin ve 'ördek' kelimesine hazırlayın ve sonucu yeni bir satıra yazdırın.
  2. Renk 'Gri' değilse, 1. adımı tekrarlayın.
  3. Eğer renk 'Gray' ise, programınızı sonlandırın.

Uyulması gereken kurallar:

  • Program sürekli aynı sayıda satır yazdırmamalıdır.
  • 'Gri ördek' ile başlayabilir, ancak tutarlı bir şekilde yapmamalı.
  • Her satırda tam olarak bir ördek bulunmalı ve boş satır çıkılmamalıdır.
  • Bir renk ve bir ördek arasında en az bir boşluk olmalıdır.
  • Önemli çıktıdan önce ve sonra beyaz boşluk önemli değildir.
  • Çıktının durumu önemli değil.
  • Renkler tekrar edilebilir.
  • Çıktının her seferinde her rengi içermesi gerekmez, ancak kodunuzun her rengi çıkarması mümkün olmalıdır.
  • Yukarıdaki dizinin dışında hiçbir renk dahil edilemez.
  • Cevabınızda ya gri ya da gri kabul edilebilir.
  • Renkler tutarlı bir şekilde aynı sırada olmamalıdır.
  • En kısa programı hedefleyin. En az sayıda bayt kazanır.

Örnek çıktı:

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

@Mike Hill'e ilk önce beni bu varyasyona karşı uyardığı için teşekkürler.


Çıktıların dağılımına ilişkin herhangi bir kural var mı? Çünkü gri olmayan renklerden rastgele sayıda seçerek geçerli çıktılar üretebiliyorum, ardından bir Greykez yazdırıyordum (böylece hepsini seçip alıp almadığımı kontrol etmek zorunda kalmayacağım Grey).
Martin Ender

@MartinEnder Bu iyi. "Renkler tutarlı bir şekilde aynı sırada olmamalıdır." önemli, ama sonunda ayrı ayrı gri seçmeni durduracak hiçbir şey yok.
AJFaraday

3
Alternatif yazım "gri" izin verilir mi?
12Me21

@ 12Me21 Meraklı, tho. Bunun teknik bir nedeni var mı? Ya da sadece estetik olanı?
AJFaraday

2
Çok alçakgönüllü görüşüme göre, çok önemli bir ördek rengini kaçırıyorsunuz. Mavi yakın ama yeterince kesin değil.
kobaltduck

Yanıtlar:


6

05AB1E , 42 40 bayt

Outgolfer Erik sayesinde 2 bayt kurtarıldı

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

Çevrimiçi deneyin!


3
Bu okunamayan golf dillerinin çoğunu fark ettim. İnsan tarafından okunabilen bir formdan bir derleyici var mı?
AJFaraday

@AJFaraday: Farkında olduğumdan değil. Bunlardan hangisinin olduğunu bildiğim tek golf dili Kömür.
Emigna

1
İpinizi daha da sıkıştırabilirsiniz, indöyle ëß!
Outgolfer Erik

1
Gs2'de bir tane de var. Ancak bu dil bugünlerde çok fazla kullanılmıyor.
özyinelemeli


46

LuaLaTeX, 220 211 karakter

komut:

lualatex -interaction nonstopmode

En kısa değil, en hayalperest olan. Göre @ skillmon çözeltisi

görüntü tanımını buraya girin

\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
Aman tanrım! Bu sadece en iyi şey! Günümü sen yaptın, Alex.
AJFaraday

@AJFaraday orada kullanmak gerçekten şaşırtıcı bir fikir tikzducks:)
Skillmon

6
+1 ve böyle uzun bir paket adı seçtiğim için özür dilerim!

@Sam, benim özümseme olsun
AlexG

8
Merhaba bayım. TeX.sx gibi diğer teknik topluluklardan kesinlikle tanımadığım kişi . Bu cevap Anatidae familyasındaki bazı kuşları kapsadığı için , onu kaldırarak onaylama zorunluluğu getirmeye mecbur olduğumu hissediyorum. :)
Paulo Cereda

26

6502 makine kodu (C64), 124 bayt

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

Çevrimiçi demo - Kullanımı:SYS49152.

ekran görüntüsü


Açıklama (yorumların sökülmesi):

         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

Özür dilerim, demonuz ördekle ilgili herhangi bir içerik vermiyor gibi görünüyor.
AJFaraday

1
@AJFaraday lütfen "kullanım" bölümüne dikkat edin ... çalıştırması gereken komuttur sys 49152.
Felix Palmen

Tamam, bu benim günümü yaptı :)
AJFaraday

1
Bu harikaydı. Bir süredir c64 derlemesi yazdım.
lsd

2
@ Lsd: burada aynı! ilk programım C64'teki 6502 meclisiydi, çünkü yeni aldım ve bir arkadaşım 6502 kitabını "bir oyun yaz!" göreviyle verdi. Beni bir şeyler yazmaya başlatacak! (harika bir yol! Sadece okumak için değil, aslında bir şeyler yazmak için harika bir motivasyon oldu). 192 baytlık (iirc) bir "Yılan" programı yazdı (a, imo, zekice bir çift endeks ile başın ve yılanın pozisyonunun kuyruğunu işaret etti) koçun geri kalanı, duvarları kurmayı unuttuğum herhangi bir "@" üzerinde büyüyordu ^^
Olivier Dulac


10

Taksi , 1995 bayt

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

Çevrimiçi deneyin!

Bu kodun% 47'sinin sadece 1'den 8'e kadar rastgele bir tamsayı seçtiğine dikkat çekmek gerektiğini düşünüyorum.
Ayrıca, Taksi o kadar ayrıntılıdır ki, daha duck\nsonra birleştirmek yerine her bir renkten sonra zor kodlamanın daha kısa olmasını sağlar .
İşte un golfed versiyonu:

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

Okumak eğlenceliydi.
Makotosan

Golly, bu ezoterik! Nasıl çalıştığını anlamaya başlayamam. Çok eğlenceli, tho :)
AJFaraday


8

Java (OpenJDK 9) , 133 bayt

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

Çevrimiçi deneyin!

açıklamalar

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 bayt

2 bayt tasarruf için Dom Hastings sayesinde , Kirill L. 1 bayt ve Asone Tuhid 1 bayt!

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

Çevrimiçi deneyin!


()Kodun çevresini kaldırabilir ve dizini saklamak $.yerine kullanırsanız s, stamamen oluşturmaktan kaçınabilirsiniz (çünkü $.satır numarasına önceden başlatılmıştır!) GreyListenin sonuna taşınmanız ve $.<7bunun yerine kontrol etmeniz gerekir. rağmen. Umarım yardımcı olur!
Dom Hastings

@DomHastings Teşekkürler! Kurtulmak için bir yol arıyordum s=1ve $.mükemmeldi!
Cristian Lupascu

Ben de bir süre sonra alanı kaldırabileceğinizi düşünüyorum, Ruby bundan şikayet etmez.
Kirill L.

@KirillL. Bu doğru, teşekkürler! Daha önce sahiptim while s...ve yer gerekliydi. Değiştirdikten sonra bu fırsatı görmedik siçin $..
Cristian Lupascu 19:18


7

İşlem Flashpoint kodlama dili, 133 bayt

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}

İle ara:

hint call f

Örnek çıktı:

İlk başta, bir amaç, “Gri Ördek” hattında bitmek zorunda kalmadan, sadece farklı miktarlarda satırlar çıktısını almaktı. Bu yanlış yorumlamanın ardından biraz daha ilginç bir kod parçası üretildi:

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 bayt

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

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

Dom Hastings'e -3 bayt için teşekkürler.

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

Çevrimiçi deneyin!


1
İçinde saklıyorsanız $_, sadece olabilir until/y/sonunda için -3!
Dom Hastings



4

Octave , 114 112 bayt

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

Çevrimiçi deneyin!

112 ve 118 bayt arasında bir sürü farklı seçenek var ... Bazıları başlangıçta bir indeks başlatır ve her döngü için rastgele bir sayı kadar azaltır ve 0 olana kadar bekler . Diğerleri bazı parantez ve benzeri şeylerden kaçınmak printfyerine kullanılır disp.


Küçük soru: Oktavda ve Excel'de olduğu gibi bir sembol var mı, çünkü kodu daha da kısaltmanın mümkün olduğunu düşünüyorum.
Michthan

1
Ne yazık ki, hayır ... Dizeler köşeli parantezler (veya gibi kullanarak fonksiyonları içine birleştirilmiş gerekir catve horzcatTeşekkür olsa :).
Stewie Griffin

4

PHP , 133 125 111 108 97 92 bayt

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

Çevrimiçi deneyin!

@Olivier Grégoire sayesinde -8 bayt

@Manatwork sayesinde -3 bayt

@Dom Hastings sayesinde -11 bayt


2
Renk dize ve test, değişim ise Greyhiç Xo alışık değil çünkü. 6 bayt kazanacaksınız.
Olivier Grégoire

@ OlivierGrégoire Ah doğru. Bunun için teşekkürler :)
Davіd

1
Ters forhiçbir parantez ihtiyacı bireyin durumunu: x!=$b=$a[array_rand($a)]. Btw, önünde bir ?>gerek yok, bir ifadeyi sonlandırır ;.
saat 19:30 'da

@ manatwork Ohh, güzel! Şimdi cevabımı güncelleyeceğim!
Davіd

2
Sen dahil ederek birkaç bayt kaydedebilir xhiç kullanılarak $b=$a..koşulu olarak ve kullanma rand(0,7)yerine array_rand. Yeni çizgiyi ?>ve arasında da kaldırabilirsiniz Grey duck. Ayrıca TIO bağlantınız hala tam etiketliyse, -d short_open_tag=onbu çalışmayı elde etmek için bayraklara ekleyebilirsiniz ! :)
Dom Hastings


4

bash, 96 bayt

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

@ DigitalTrauma'ya teşekkürler.


Bunu golf oynamak için birçok fırsat - bash golf ipuçlarına göz
Digital Trauma,

@DigitalTrauma Acelem vardı, ama GNU coreutils'in olmadığı saf bir Bash çözümü istedim. 112'den 105 bayta küçültebilirim.
rexkogitans

Evet, saf bash cevaplarını da seviyorum. İşte başka bir 10 bayt kapalı
Digital Trauma

Ben elimden >0, ancak, sol ${#a}yerine 8.
rexkogitans

Neden ${#a}yerine tutmaya ihtiyacınız var 8? Bu kod-golf - farklı sayıda renk için değiştirilecek kod genelleştirilebilirliğine gerek yoktur. Yapmanız gereken tek şey, en küçük bayt sayısındaki spesifikasyona uymak.
Dijital Travma


3

AWK , 114 bayt

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

Çevrimiçi deneyin!

açıklama

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

Bunun "some" girişi gerektirdiğini unutmayın. Giriş boş olabilir. Girdi ihtiyacını önlemek için ilk satırı ile hazırlayın.BEGIN


3

PowerShell , 94 bayt

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

Çevrimiçi deneyin!

$rEşittir kadar döngüler Grey. Döngünün içinde, -splityeni satırlardaki hazır bilgi dizesi, Randombunlardan birini seçer , sonra rengi artı olarak yazdırır Duck(teknik olarak, boru hattında bırakılır ve bir sonraki döngü yinelemesinde boru hattı temizliği Write-Outputgerçekleşir). GreyAsla seçilmemenin teorik olarak mümkün olduğunu ve döngünün kesintisiz devam etmesinin mümkün olduğunu unutmayın; ancak bu neredeyse hiçbir zaman (olasılık anlamında) gerçekleşmeyecektir.


3

R , 101 bayt

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

Çevrimiçi deneyin!

@ User2390246'nın bu zorluğa verdiği cevabdan büyük ölçüde ilham alındı . İki rastgele kaynağa ihtiyacımız var: Renklerin sırasını değiştirme ve gri olmayan ördek renklerini örnekleme. sampleOranı parametresi, bir üstel dağılımı ile verilen rastgele boyutta rasgele örnek alacak 1bir tamsayı olarak kısaltılır. Üstel bir dağılımın maalesef kullanılması , örneğin en azından olma ihtimali exp(-8)veya civarında 0.0003354olabileceği anlamına gelir 8, bu nedenle örneklememiz gerekir replace=T.


sonra \n1 için gerçek bir yeni
hat

ayrıca vb colors()[c(26,254,498,552,640,652)]yerine biraz tasarruf yapabilirsiniz scan(..)vb yerine yaklaşık 83
gelmelidir

@MickyT ......... Gibi tüm güzel grafikler hakkında hatırlamak için R'nin grafiklerini kullanmıyorum colors()! Bunlar güzel cevaplar, sanırım kendi cevabınız olarak göndermelisiniz, çünkü renkleri almanın daha az zarif yolu.
Giuseppe

tamam o zaman, birkaç küçük değişiklik ile
göndereceğim

3

Python 2 , 138 133 120 117 116 bayt

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

Çevrimiçi deneyin!

@EriktheOutgolfer'dan fikirlerle çok daha iyi. Teşekkürler!

@Ovs sayesinde -3 tane daha

-1 Havalı yeni bir numara öğrenmek için @Rod sayesinde öğrendik :-)


3

Retina , 69 68 bayt

Leo'ya 1 byte kaydettiğin için teşekkürler.

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

Çevrimiçi deneyin!

açıklama

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

.Program sonunda örtük çıktıları bastırır (aksi takdirde iki gri ördek alırız). /y/^{Tüm programı, çalışma dizgisinde bulunmadığı sürece devam eden bir döngü içinde sarar y. Bu satırın geri kalanı, çalışma dizesini tüm renklerin satır beslemeli olarak ayrılmış listesine ayarlar.

" duck¶">G?`

Çalışma dizisinden rastgele bir çizgi çiziyoruz (ve bu nedenle rastgele bir renk). Ve sonucu izler duckve bir satır başı ile basıyoruz.


3

MATL , 68 64 bayt

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

Çevrimiçi deneyin!

açıklama

`                         % 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 bayt

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

@ElPedro!
-1 by me
-1 byBbbler!

Çevrimiçi deneyin!


Gray'i öne doğru hareket ettirebilir ve d!=c[0]bir bayt saklamak zorunda kalabilir misiniz?
ElPedro

print(d,'duck')Bir bayt kaydetmek için Varsayılan sınırlayıcı bir boşluktur.
Bubbler

3

Java (JDK 10) , 287 bayt

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)

Çevrimiçi deneyin!

Benim ilk kodlayıcım! Açıkçası rekabetçi değil, sadece katılmak için yeterince Java (şu anda CS200'de) öğrenmiş olmaktan mutlu.


2

Kotlin , 122 bayt

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

Çevrimiçi deneyin!


1
Kotlin'de rastgele bir tamsayı değeri elde etmek için oradaki kullanıcılara yardımcı olabilir, Aşağıdakileri kullanabilirsiniz: (0..7) .shuffled () [0] Şundan daha kısa: (Math.random () * 8) .toInt ()
Makotosan

2

MS-SQL, 158 bayt

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

Büyük ölçüde Razvan'ın mükemmel cevabına dayanıyor , ancak STRING_SPLITMS-SQL 2016 ve sonraki sürümlere özgü işlevi kullanıyor . Ayrıca GOTObir WHILEdöngü yerine kullanır .

biçimlendirilmiş:

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 bayt

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
Güzel çeşitlilik. Önce boşluğu kaldırabilirsiniz BEGIN.
BradC

2

Python 2 , 98 bayt

Bak ma ithalat yok!

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

(Renkler duckarasında ve soruya izin verilen şekilde fazladan boşluklar basar )

Çevrimiçi deneyin!

Bir oldukça zayıf yalancı rasgele sayı üreteci bir nesne ID'si ile tohumlanmış , 0 (ama spec uygun görünüyor) arka arkaya, bir tam sayı elde edilmesini xde, [0,7] , bu dizin içinde karakterlerin bir listesini dilim kullanılan aradaki boşluğu zorlayan, tuple ile birlikte basılan renk adını almak için adım 8'e basın duck. Zaman xsıfır olur Greybasılır ve modulo yanında girişinin değerlendirilmesi sıfır bölme girişiminde rasgele sayı üreteci hataları göre ( v=1/x,vbirinci eleman ile yeni tuple yapmak için güvenilir 1/x= 1/0)


Aynı şekilde Python 3’te 100’dür.

v=0
while 1:x=id(v)%17%8;print("GVIYORGBrinererleodladeuyliln ee egog n  towe"[x::8],"duck");v=1/x,v
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.