Vịt xanh, vịt đỏ, vịt xám


48

Vì vậy, tuần trước tôi đã đăng một thử thách để chơi Vịt, Vịt, Ngỗng . Điều này dẫn đến một số Minnesotans bình luận về biến thể 'Vịt xám' trong khu vực của họ .

Vì vậy, đây là các quy tắc:

Sử dụng danh sách màu này:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

Viết chương trình tuân theo các quy tắc sau:

  1. Chọn một trong những màu này và thêm nó vào từ 'vịt' và in kết quả sang một dòng mới.
  2. Nếu màu không phải là 'Xám', hãy lặp lại bước 1.
  3. Nếu màu là 'Xám', hãy kết thúc chương trình của bạn.

Các quy tắc phải được tuân theo:

  • Chương trình không nên in nhất quán cùng một số dòng.
  • Nó có thể bắt đầu trên 'Vịt xám', nhưng không nên làm một cách nhất quán.
  • Cần có chính xác một con vịt trên mỗi dòng và không có dòng trống nào được xuất ra.
  • Nên có ít nhất một khoảng trống giữa một màu và một con vịt.
  • Khoảng trắng trước và sau đầu ra đáng kể không thành vấn đề.
  • Các trường hợp đầu ra không quan trọng.
  • Màu sắc có thể được lặp đi lặp lại.
  • Đầu ra không phải chứa mọi màu mỗi lần, nhưng phải có khả năng mã của bạn sẽ xuất ra mọi màu.
  • Không có màu bên ngoài mảng trên có thể được bao gồm.
  • Màu xám hoặc màu xám được chấp nhận trong câu trả lời của bạn.
  • Màu sắc không nhất quán phải theo cùng một thứ tự.
  • Nhằm mục đích cho chương trình ngắn nhất. Số byte nhỏ nhất sẽ thắng.

Ví dụ đầu ra:

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

Cảm ơn @Mike Hill đã lần đầu tiên cảnh báo tôi về biến thể này.


Bất kỳ quy tắc về phân phối trên kết quả? Bởi vì tôi có thể tạo đầu ra hợp lệ bằng cách chọn từ các màu không xám một số lần ngẫu nhiên, sau đó in Greymột lần (vì vậy tôi sẽ không phải chọn từ tất cả chúng và kiểm tra xem tôi đã chọn chưa Grey).
Martin Ender

@MartinEnder Điều đó tốt. "Màu sắc không nhất quán phải theo cùng một thứ tự." vấn đề, nhưng không có gì ngăn bạn chọn màu xám riêng ở cuối.
AJFaraday

3
Là chính tả thay thế "màu xám" được phép?
12Me21

@ 12Me21 Tò mò, tho. Có một lý do kỹ thuật cho điều đó? Hay chỉ là một thẩm mỹ?
AJFaraday

2
Theo ý kiến ​​không hề khiêm tốn của tôi, bạn đang thiếu một màu vịt cực kỳ quan trọng. Màu xanh là gần, nhưng không đủ chính xác.
cobaltduck

Câu trả lời:


6

05AB1E , 42 40 byte

Đã lưu 2 byte nhờ Erik the Outgolfer

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

Hãy thử trực tuyến!


3
Tôi đã nhận thấy rất nhiều ngôn ngữ chơi golf không thể đọc được này. Có một trình biên dịch từ một số hình thức dễ đọc hơn con người?
AJFaraday

@AJFaraday: Không phải tôi biết. Ngôn ngữ chơi golf duy nhất tôi biết có một trong số đó là Than.
Emigna

1
Bạn có thể nén chuỗi của bạn hơn nữa, indëß!
Erik the Outgolfer 19/03/18

1
Gs2 cũng có một cái. Nhưng ngôn ngữ đó không được sử dụng nhiều trong những ngày này.
đệ quy

1
@ Simón: Trang mã
05AB1E

46

LuaLaTeX, 220 211 ký tự

chỉ huy:

lualatex -interaction nonstopmode

Không phải là ngắn nhất, nhưng là fanciest. Dựa trên giải pháp của @ skillmon

nhập mô tả hình ảnh ở đây

\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
Trời đất ơi! Đây chỉ là điều tốt nhất! Bạn đã làm cho ngày của tôi, Alex.
AJFaraday

@AJFaraday thực sự là ý tưởng tuyệt vời để sử dụng tikzducksở đó :)
Skillmon 20/03/18

6
+1 và lời xin lỗi của tôi vì đã chọn tên gói dài như vậy!

@sam, bạn nhận được sự
vắng mặt

8
Chào ông. người chắc chắn tôi không biết từ cộng đồng kỹ thuật khác như TeX.sx . Vì câu trả lời này bao gồm một số loài chim trong họ Anatidae , tôi cảm thấy bắt buộc phải cung cấp mã thông báo bằng cách nâng cao nó. :)
Paulo Cereda

26

Mã máy 6502 (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

Bản demo trực tuyến - Cách sử dụng :SYS49152.

ảnh chụp màn hình


Giải thích (nhận xét tháo gỡ):

         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

Tôi xin lỗi, bản demo của bạn dường như không xuất ra bất kỳ nội dung nào liên quan đến vịt.
AJFaraday

1
@AJFaraday vui lòng lưu ý phần "sử dụng" ... lệnh để chạy nó sys 49152.
Felix Palmen

Được rồi, điều đó đã làm cho ngày của tôi :)
AJFaraday

1
Điều đó thật tuyệt. Đã được một thời gian kể từ khi tôi viết hội đồng c64.
lsd

2
@lsd: giống nhau đây! chương trình đầu tiên của tôi là 6502 lắp ráp trên C64, vì tôi vừa nhận được nó và một người bạn đã đưa cho tôi cuốn sách 6502 với nhiệm vụ "viết một trò chơi!" để jumsptart tôi viết một cái gì đó! (cách tuyệt vời! đó là một động lực tuyệt vời để không chỉ đọc, mà thực sự viết một cái gì đó). đã viết một chương trình "Rắn" 192 byte (iirc) (với chỉ số kép thông minh, imo, chỉ vào đầu & đến đuôi của vị trí của con rắn) ... trước tiên hãy thử: nó phóng to qua cạnh dưới, 'ăn' vào phần còn lại của ram, phát triển trên bất kỳ "@" nào, vì tôi đã quên thiết lập các bức tường ^^
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".

Hãy thử trực tuyến!

Tôi nghĩ rằng đáng chú ý rằng 47% mã này chỉ là chọn một số nguyên ngẫu nhiên từ 1 đến 8.
Ngoài ra, Taxi rất dài dòng đến mức ngắn hơn để mã cứng duck\nsau mỗi màu thay vì nối nó sau.
Đây là phiên bản không chơi gôn:

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

Đó là niềm vui để đọc.
Makotosan

Golly, đó là bí truyền! Tôi không thể bắt đầu hiểu làm thế nào nó hoạt động. Rất nhiều niềm vui, tho :)
AJFaraday 20/03/18

Điều này dường như liên quan đến Fetlang
Skillmon 21/03/18

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

Hãy thử trực tuyến!

Giải thích

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 byte

Cảm ơn Dom Hastings đã lưu 2 byte, Kirill L. 1 byte và Asone Tuhid 1 byte!

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

Hãy thử trực tuyến!


Bạn có thể xóa ()xung quanh mã và nếu bạn sử dụng $.thay vì slưu trữ chỉ mục, bạn có thể tránh tạo shoàn toàn (vì $.được khởi tạo trước cho số dòng!) Bạn sẽ cần di chuyển Greyđến cuối danh sách và $.<7thay vào đó kiểm tra Tuy nhiên. Mong rằng sẽ giúp!
Dom Hastings

@DomHastings Cảm ơn! Tôi đang tìm cách để thoát khỏi s=1$.hoàn hảo!
Cristian Lupascu

Tôi nghĩ rằng bạn cũng có thể xóa không gian sau một thời gian, Ruby dường như không phàn nàn về điều đó.
Kirill L.

@KirillL. Đúng vậy, cảm ơn! Trước đây tôi đã có while s...và không gian là cần thiết. Không thấy cơ hội này sau khi đổi ssang $..
Cristian Lupascu


7

Hoạt động ngôn ngữ kịch bản 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}

Gọi với:

hint call f

Ví dụ đầu ra:

Lúc đầu, bằng cách nào đó, tôi đã hiểu sai về thách thức như thể mục tiêu là chỉ xuất ra một số lượng dòng khác nhau, không nhất thiết phải kết thúc tại dòng "Vịt xám". Theo cách giải thích không chính xác đó đã tạo ra một đoạn mã thú vị hơn một chút:

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

Chạy với -nrhoặc thử trực tuyến .



4

Octave , 114 112 byte

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

Hãy thử trực tuyến!

Có một loạt các tùy chọn khác nhau nằm trong khoảng từ 112 đến 118 byte ... Một số khởi tạo một chỉ mục khi bắt đầu và giảm nó theo một số ngẫu nhiên cho mỗi vòng lặp và đợi cho đến khi 0 . Những người khác sử dụng printfthay vì dispđể tránh một số dấu ngoặc và như vậy.


Câu hỏi nhỏ: Có biểu tượng nào trong quãng tám hoạt động giống như & trong Excel không, vì tôi nghĩ có thể rút ngắn mã hơn nữa.
Michthan

1
Thật không may, không ... Chuỗi phải được nối trong dấu ngoặc vuông (hoặc sử dụng các hàm như cathorzcat. Cảm ơn mặc dù :)
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

Hãy thử trực tuyến!

-8 byte nhờ @Olivier Grégoire

-3 byte nhờ @manatwork

-11 byte nhờ @Dom Hastings


2
Trong chuỗi màu và kiểm tra, thay đổi Greythành X, vì nó không được sử dụng. Bạn sẽ đạt được 6 byte.
Olivier Grégoire

@ OlivierGrégoire Ôi thật. Cảm ơn vì điều đó :)
Davіd 19/03/18

1
Đảo ngược forđiều kiện để không cần dấu ngoặc đơn : x!=$b=$a[array_rand($a)]. BTW, ?>chấm dứt một tuyên bố, không cần ;ở phía trước của nó.
manatwork

@manatwork ơi, đẹp quá! Tôi sẽ cập nhật câu trả lời của tôi bây giờ!
Davіd

2
Bạn có thể lưu thêm một vài byte bằng cách không bao gồm xtất cả và sử dụng $b=$a..làm điều kiện và sử dụng rand(0,7)thay vì array_rand. Bạn có thể loại bỏ dòng mới giữa ?>Grey duckquá. Ngoài ra, liên kết TIO của bạn vẫn có các thẻ đầy đủ, bạn có thể thêm -d short_open_tag=onvào các cờ để hoạt động! :)
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;}

Cảm ơn @DigitalTrauma.


Rất nhiều cơ hội để chơi gôn này - hãy xem các mẹo chơi golf bash
Chấn thương kỹ thuật số

@DigitalTrauma Tôi đã vội, nhưng tôi muốn một giải pháp Bash thuần túy không có lõi GNU. Tôi có thể thu nhỏ nó từ 112 đến 105 byte.
rexkogitans

Đúng, tôi cũng thích câu trả lời thuần túy. Dưới đây là 10 byte nữa
Chấn thương kỹ thuật số

Tôi lột đồ >0, tuy nhiên, tôi rời đi ${#a}thay vì 8.
rexkogitans 20/03/18

Tại sao bạn cần phải giữ ${#a}thay vì 8? Đây là mã golf - không cần phải cung cấp khả năng khái quát mã của bạn để được sửa đổi cho một số màu khác nhau. Tất cả những gì bạn cần làm là đáp ứng thông số kỹ thuật với số lượng byte nhỏ nhất.
Chấn thương kỹ thuật số


3

AWK , 114 byte

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

Hãy thử trực tuyến!

Giải trình

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

Lưu ý rằng điều này đòi hỏi đầu vào "một số". Đầu vào có thể trống. Để tránh sự cần thiết phải nhập trước dòng đầu tiên vớiBEGIN


3

PowerShell , 94 byte

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

Hãy thử trực tuyến!

Vòng lặp cho đến khi $rbằng Grey. Trong vòng lặp, -splitchuỗi ký tự trên dòng mới, chọn một chuỗi Random, sau đó in ra màu cộng Duck(về mặt kỹ thuật, nó còn lại trên đường ống và dọn sạch đường ống trên vòng lặp tiếp theo gây ra sự Write-Outputcố). Lưu ý rằng về mặt lý thuyết có thể Greykhông bao giờ được chọn và vòng lặp sẽ tiếp tục vô tận, nhưng điều này gần như không bao giờ (theo nghĩa xác suất) sẽ xảy ra.


3

R , 101 byte

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

Hãy thử trực tuyến!

Lấy cảm hứng mạnh mẽ từ câu trả lời của @ user2390246 cho thử thách liên quan. Chúng ta cần hai nguồn ngẫu nhiên: Thay đổi thứ tự các màu và lấy mẫu màu vịt không xám. Các samplesẽ mất một mẫu ngẫu nhiên kích thước ngẫu nhiên đưa ra bởi một phân phối mũ với tham số tỷ lệ 1, bỏ bớt một số nguyên. Không may sử dụng phân phối theo cấp số nhân có nghĩa là có xác suất exp(-8)hoặc xung quanh 0.0003354 mẫu đó sẽ ít nhất 8, vì vậy chúng tôi phải lấy mẫu với replace=T.


sau đó bạn có thể thay thế \nbằng một dòng mới thực sự cho 1
MickyT

ngoài ra, bạn có thể tiết kiệm khá nhiều bằng cách sử dụng colors()[c(26,254,498,552,640,652)]thay cho scan(..)vv, nên giảm xuống còn khoảng 83
MickyT

@MickyT ......... Tôi không sử dụng đồ họa của R đủ để nhớ về tất cả các nội dung đồ họa đẹp như thế colors()! Đó là một số golf tốt, mà tôi nghĩ bạn nên đăng như câu trả lời của riêng bạn, vì đây là cách kém thanh lịch để có được màu sắc.
Giuseppe

được rồi, tôi sẽ đăng nó lên với một vài thay đổi nhỏ
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'

Hãy thử trực tuyến!

Tốt hơn nhiều với một số ý tưởng từ @EriktheOutgolfer. Cảm ơn!

-3 nhiều hơn nhờ có @ovs

-1 với lời cảm ơn @Rod cho một mẹo mới thú vị đã học :-)


3

Võng mạc , 69 68 byte

Cảm ơn Leo vì đã tiết kiệm 1 byte.

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

Hãy thử trực tuyến!

Giải trình

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

.triệt tiêu đầu ra ngầm ở cuối chương trình (nếu không, chúng tôi sẽ nhận được hai con vịt xám). /y/^{kết thúc toàn bộ chương trình trong một vòng lặp tiếp tục miễn là chuỗi làm việc không chứa a y. Phần còn lại của dòng đó đặt chuỗi làm việc thành một danh sách tất cả các màu được phân tách bằng nguồn cấp.

" duck¶">G?`

Chúng tôi grep một dòng ngẫu nhiên từ chuỗi làm việc (và do đó là một màu ngẫu nhiên). Và chúng tôi in kết quả với một dấu vết duckvà một nguồn cấp dữ liệu.


3

MATL , 68 64 byte

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

Hãy thử trực tuyến!

Giải trình

`                         % 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 bởi @ElPedro!
-1 bởi tôi
-1 bởi @Bubbler!

Hãy thử trực tuyến!


Bạn có thể di chuyển Gray lên phía trước và phải d!=c[0]lưu một byte không?
ElPedro

print(d,'duck')để lưu một byte. Dấu phân cách mặc định là một khoảng trắng.
Bong bóng

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)

Hãy thử trực tuyến!

Codegolf đầu tiên của tôi! Rõ ràng là không cạnh tranh, chỉ vui khi đã học đủ Java (hiện đang ở CS200) để có thể tham gia.


2

Kotlin , 122 byte

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

Hãy thử trực tuyến!


1
Có thể hữu ích cho ai đó ngoài kia, để có được một giá trị số nguyên ngẫu nhiên trong Kotlin, Bạn có thể sử dụng như sau: (0..7) .shuffled () [0] Ngắn hơn: (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

Dựa phần lớn vào câu trả lời xuất sắc của Razvan , nhưng sử dụng STRING_SPLITchức năng dành riêng cho MS-SQL 2016 trở lên. Cũng sử dụng GOTOthay vì một WHILEvòng lặp.

Định dạng:

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
Biến thể đẹp. Bạn có thể loại bỏ không gian trước BEGIN.
BradC

2

Python 2 , 98 byte

Nhìn ma không nhập!

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

(In thêm khoảng trắng giữa các màu và ducknhư được phép trong câu hỏi)

Hãy thử trực tuyến!

Một trình tạo số giả ngẫu nhiên khá kém được gieo với id đối tượng là 0 (nhưng nó có vẻ phù hợp với thông số kỹ thuật) liên tục mang lại một số nguyên x, trong [0,7] được sử dụng để cắt một danh sách các ký tự từ chỉ mục đó trong các bước của 8 để có được tên màu được in cùng với duckmột tuple, buộc một khoảng trắng ở giữa. Khi xtrở thành số 0 Greyđược in và việc đánh giá đầu vào tiếp theo cho các lỗi tạo số ngẫu nhiên dựa trên modulo cố gắng chia cho 0 ( v=1/x,vcố gắng tạo một bộ dữ liệu mới với phần tử đầu tiên 1/x= 1/0)


Cách tương tự là 100 trong Python 3 với

v=0
while 1:x=id(v)%17%8;print("GVIYORGBrinererleodladeuyliln ee egog n  towe"[x::8],"duck");v=1/x,v
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.