เป็ดสีน้ำเงินเป็ดแดงเป็ดสีเทา


48

ดังนั้นสัปดาห์สุดท้ายที่ผมโพสต์ความท้าทายในการเล่นเป็ด, เป็ด, ห่าน นำเรื่องนี้ไปยังหมายเลขของ Minnesotans แสดงความคิดเห็นเกี่ยวกับภูมิภาคของพวกเขา'เป็ดสีเทา' รูปแบบ

ดังนั้นนี่คือกฎ:

ใช้รายการสีนี้:

Red
Orange
Yellow
Green
Blue
Indigo
Violet
Gray

เขียนโปรแกรมเพื่อปฏิบัติตามกฎเหล่านี้:

  1. เลือกสีใดสีหนึ่งเหล่านี้และเติมลงในคำว่า 'เป็ด' แล้วพิมพ์ผลลัพธ์ลงในบรรทัดใหม่
  2. หากสีไม่ใช่ 'สีเทา' ให้ทำซ้ำขั้นตอนที่ 1
  3. หากสีเป็น 'สีเทา' ให้ปิดโปรแกรมของคุณ

กฎที่ต้องปฏิบัติตาม:

  • โปรแกรมไม่ควรพิมพ์จำนวนบรรทัดที่เท่ากัน
  • มันสามารถเริ่มต้นที่ 'เป็ดสีเทา' แต่ไม่ควรทำอย่างสม่ำเสมอ
  • ควรมีเป็ดตัวเดียวในแต่ละบรรทัดและไม่มีบรรทัดว่าง
  • ควรมีอย่างน้อยหนึ่งช่องว่างระหว่างสีและเป็ด
  • พื้นที่สีขาวก่อนและหลังการส่งออกที่สำคัญไม่สำคัญ
  • กรณีของการส่งออกไม่สำคัญ
  • สามารถทำซ้ำสีได้
  • ผลลัพธ์ไม่จำเป็นต้องมีทุกสีทุกครั้ง แต่ต้องเป็นไปได้ที่รหัสของคุณจะออกทุกสี
  • ไม่สามารถรวมสีภายนอกอาเรย์ด้านบนได้
  • คำตอบของคุณเป็นสีเทาหรือสีเทา
  • สีไม่ควรอยู่ในลำดับเดียวกันเสมอไป
  • ตั้งเป้าหมายโปรแกรมที่สั้นที่สุด จำนวนไบต์ที่น้อยที่สุดชนะ

ตัวอย่างผลลัพธ์:

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

ขอบคุณ @Mike Hill สำหรับการแจ้งเตือนฉันครั้งแรกกับการเปลี่ยนแปลงนี้


มีกฎใดบ้างเกี่ยวกับการแจกแจงผลลัพธ์ เพราะฉันสามารถสร้างผลลัพธ์ที่ถูกต้องโดยเลือกจากสีที่ไม่ใช่สีเทาเป็นจำนวนครั้งสุ่มตามด้วยการพิมพ์Greyครั้งเดียว (ดังนั้นฉันจะไม่ต้องเลือกจากพวกเขาทั้งหมดและตรวจสอบว่าฉันได้เลือกGrey)
Martin Ender

@MartinEnder ไม่เป็นไร "สีไม่ควรอยู่ในลำดับเดียวกันเสมอไป" สำคัญ แต่ไม่มีอะไรจะหยุดคุณเลือกสีเทาแยกในตอนท้าย
AJFaraday

3
อนุญาตให้ใช้การสะกดแบบ "สีเทา" แทนได้หรือไม่
12Me21

@ 12Me21 อยากรู้อยากเห็น มีเหตุผลทางเทคนิคหรือไม่? หรือเพียงแค่ความงาม?
AJFaraday

2
ในความเห็นที่ไม่สุภาพของฉันคุณขาดสีเป็ดที่สำคัญมากตัวหนึ่ง สีน้ำเงินอยู่ใกล้ แต่ไม่แม่นยำพอ
cobaltduck

คำตอบ:


6

05AB1E , 42 40 ไบต์

บันทึก 2 ไบต์ด้วยErik the Outgolfer

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

ลองออนไลน์!


3
ฉันสังเกตเห็นภาษากอล์ฟที่อ่านไม่ได้เหล่านี้มากมาย มีคอมไพเลอร์จากรูปแบบที่มนุษย์อ่านได้อีกหรือไม่?
AJFaraday

@AJFaraday: ไม่ใช่ว่าฉันรู้ ภาษากอล์ฟเดียวที่ฉันรู้ซึ่งมีหนึ่งในนั้นคือถ่าน
Emigna

1
คุณสามารถบีบอัดสายของคุณต่อไปindคือëß!
Erik the Outgolfer

1
Gs2 มีหนึ่งเช่นกัน แต่ภาษานั้นไม่ได้ใช้มากในทุกวันนี้
เรียกซ้ำ


46

LuaLaTeX, 220 211 ตัวอักษร

คำสั่ง:

lualatex -interaction nonstopmode

ไม่ใช่คนที่สั้นที่สุด แต่เป็นคนที่เพ้อฝันที่สุด ขึ้นอยู่กับโซลูชันของ @ skillmon

ป้อนคำอธิบายรูปภาพที่นี่

\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
สวรรค์ดี! นี่เป็นเพียงสิ่งที่ดีที่สุด! คุณทำให้วันของฉันอเล็กซ์
AJFaraday

@AJFaraday ความคิดที่น่าทึ่งจริง ๆ ที่จะใช้ที่tikzducksนั่น :)
Skillmon

6
+1 และฉันขอโทษที่เลือกชื่อแพ็คเกจที่ยาวเหยียด!

@ Sam คุณจะได้รับการอภัยโทษของฉัน
AlexG

8
สวัสดีนาย คนที่ผมไม่ทราบว่าจากชุมชนด้านเทคนิคอื่น ๆ เช่นTeX.sx เนื่องจากคำตอบนี้ครอบคลุมนกบางตัวในครอบครัวAnatidaeฉันรู้สึกว่าถูกบังคับให้แสดงความเห็นชอบโดยการถอนมันออกไป :)
Paulo Cereda

26

รหัสเครื่อง 6502 (C64), 124 ไบต์

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

สาธิตออนไลน์ - SYS49152การใช้งาน:

ภาพหน้าจอ


คำอธิบาย (ความคิดเห็นการถอดแยกชิ้นส่วน):

         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

ขออภัยการสาธิตของคุณดูเหมือนจะไม่แสดงเนื้อหาใด ๆ ที่เกี่ยวข้องกับเป็ด
AJFaraday

1
@AJFaraday กรุณาแจ้งให้ทราบล่วงหน้า "การใช้งาน" เป็นส่วนหนึ่ง ... sys 49152คำสั่งเพื่อเรียกใช้มันเป็น
เฟลิกซ์ Palmen

โอเคนั่นทำให้วันของฉัน :)
AJFaraday

1
มันยอดเยี่ยมมาก เป็นเวลานานแล้วที่ฉันได้เขียนชุดประกอบ c64
lsd

2
@lsd: เหมือนกันที่นี่! โปรแกรมแรกของฉันคือการประกอบ 6502 ใน C64 เพราะฉันเพิ่งได้รับและเพื่อนให้หนังสือ 6502 กับฉันด้วยงาน "เขียนเกม!" เพื่อ jumsptart ให้ฉันเขียนบางสิ่ง! (เป็นวิธีที่ยอดเยี่ยมมันเป็นแรงกระตุ้นที่ยอดเยี่ยมที่ไม่เพียง แต่อ่าน แต่เขียนอะไรบางอย่างจริงๆ) เขียนโปรแกรม "Snake" 192 bytes (iirc) (ด้วย, imo, double index ที่ฉลาดชี้ไปที่หัว & ไปที่ส่วนท้ายของตำแหน่งงู) ... ลองแรก: มันซูมผ่านขอบด้านล่าง, 'กิน' เข้า ส่วนที่เหลือของ ram เพิ่มขึ้นใน "@" ใด ๆ ในขณะที่ฉันลืมที่จะตั้งค่าผนัง ^^
Olivier Dulac


10

แท็กซี่ , 1995 ไบต์

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

ลองออนไลน์!

ฉันคิดว่ามันคุ้มค่าที่จะสังเกตว่า 47% ของรหัสนี้เป็นเพียงการเลือกเลขจำนวนเต็มแบบสุ่มจาก 1 ถึง 8
นอกจากนี้ Taxi ยังมีความชัดเจนว่ารหัสสั้นกว่าในduck\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".

สนุกกับการอ่าน
Makotosan

Golly นั่นเป็นความลับ! ฉันไม่สามารถเริ่มเข้าใจวิธีการทำงาน ความสนุกสนานมากมายสรรพสินค้า :)
AJFaraday

ดูเหมือนว่าจะเกี่ยวข้องกับFetlang
Skillmon

8

Java (OpenJDK 9) , 133 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

ขอบคุณDom Hastingsสำหรับการบันทึก 2 ไบต์, Kirill L. 1 ไบต์และAsone Tuhid 1 ไบต์!

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

ลองออนไลน์!


คุณสามารถลบ()รหัสและถ้าคุณใช้$.แทนsการเก็บดัชนีคุณสามารถหลีกเลี่ยงการสร้างsทั้งหมด (เนื่องจาก$.ถูกกำหนดค่าเริ่มต้นไว้ที่หมายเลขบรรทัด!) คุณจะต้องย้ายGreyไปที่ส่วนท้ายของรายการและตรวจสอบ$.<7แทน แม้ หวังว่าจะช่วย!
Dom Hastings

@ DomHastings ขอบคุณ! ฉันกำลังมองหาวิธีที่จะกำจัดs=1และ$.ก็สมบูรณ์แบบ!
Cristian Lupascu

ฉันคิดว่าคุณสามารถลบที่ว่างหลังจากนั้นในขณะที่ Ruby ไม่ได้บ่นเกี่ยวกับเรื่องนั้น
Kirill L.

@KirillL ถูกต้องแล้วขอบคุณ! ก่อนหน้านี้ฉันมีwhile s...และจำเป็นต้องใช้พื้นที่ ไม่เห็นโอกาสนี้หลังจากเปลี่ยนไปs $.
Cristian Lupascu


7

ภาษาสคริปต์การทำงานของ Flashpoint 133 ไบต์

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}

โทรด้วย:

hint call f

ตัวอย่างผลลัพธ์:

ในตอนแรกฉันเข้าใจผิดอย่างท้าทายราวกับว่าเป้าหมายคือการส่งออกจำนวนบรรทัดที่แตกต่างกันไม่จำเป็นต้องจบที่บรรทัด "เป็ดสีเทา" หลังจากการตีความที่ไม่ถูกต้องได้สร้างโค้ดที่น่าสนใจขึ้นอีกเล็กน้อย:

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 ไบต์

\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 ไบต์

\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 ไบต์

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

ทำงานด้วย-nrหรือลองออนไลน์



4

อ็อกเทฟ , 114 112 ไบต์

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

ลองออนไลน์!

มีพวงของตัวเลือกที่แตกต่างกันที่มีทั้งหมดระหว่าง 112 และ 118 ไบต์มี ... บางคนเริ่มต้นดัชนีในการเริ่มต้นและ decrements ได้โดยจำนวนสุ่มสำหรับแต่ละวงและรอจนกว่าจะถึง0 คนอื่นใช้printfแทนdispเพื่อหลีกเลี่ยงวงเล็บบางอย่างและอื่น ๆ


คำถามเล็ก ๆ : มีสัญลักษณ์ในระดับแปดเสียงที่เหมือนกับ & ใน Excel เพราะฉันคิดว่ามันเป็นไปได้ที่จะย่อรหัสให้สั้นลงไปอีก
Michthan

1
น่าเสียดายที่ไม่มี ... ต้องต่อสายอักขระภายในวงเล็บเหลี่ยม (หรือใช้ฟังก์ชันเช่นcatและhorzcatขอบคุณแม้ว่า :)
Stewie Griffin

4

PHP , 133 125 111 108 97 92 ไบต์

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

ลองออนไลน์!

-8 ไบต์ขอบคุณ@Olivier Grégoire

-3 ไบต์ขอบคุณ@manatwork

-11 ไบต์ขอบคุณ@Dom Hastings


2
ในสตริงสีและการทดสอบเปลี่ยนGreyเป็นXเนื่องจากไม่ได้ใช้ คุณจะได้ 6 ไบต์
Olivier Grégoire

@ OlivierGrégoireโอ้จริง ขอบคุณสำหรับ :) ว่า
Davіd

1
กลับforสภาพ 's x!=$b=$a[array_rand($a)]ต้องไม่มีวงเล็บ: BTW ?>ยกเลิกคำสั่งไม่จำเป็นต้อง;อยู่ตรงหน้า
จัดการ

@ การทำงานโอ้ดีมาก! ฉันจะอัปเดตคำตอบของฉันตอนนี้!
ดาวิด

2
คุณสามารถบันทึกอีกไม่กี่ไบต์โดยไม่รวมถึงการxที่ทุกคนและใช้$b=$a..เป็นเงื่อนไขและใช้แทนrand(0,7) array_randคุณสามารถลบบรรทัดใหม่ระหว่าง?>และGrey duckเกินไป นอกจากนี้ลิงค์ TIO ของคุณยังมีแท็กเต็มรูปแบบคุณสามารถเพิ่ม-d short_open_tag=onการตั้งค่าสถานะเพื่อให้ใช้งานได้! :)
Dom Hastings


4

ทุบตี, 96 ไบต์

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

ขอบคุณ @DigitalTrauma


โอกาสมากมายในการเล่นกอล์ฟ - ตรวจสอบเคล็ดลับการตีกอล์ฟ
Digital Trauma

@ DigitalTrauma ฉันรีบ แต่ฉันต้องการวิธีทุบตีบริสุทธิ์ที่ไม่มี coreutils ของ GNU ฉันสามารถหดจาก 112 เป็น 105 ไบต์
rexkogitans

ใช่ฉันชอบคำตอบที่ไร้เดียงสาเหมือนกัน นี่คืออีก 10 ไบต์
Digital Trauma

ฉันปล้น>0แต่ฉันซ้ายแทน${#a} 8
rexkogitans

ทำไมคุณจะต้องให้${#a}แทน8? นี่คือรหัสกอล์ฟ - ไม่จำเป็นต้องให้รหัสทั่วไปของคุณสามารถแก้ไขได้สำหรับสีที่ต่างกัน สิ่งที่คุณต้องทำคือทำตามข้อกำหนดในจำนวนไบต์ที่น้อยที่สุด
บาดเจ็บทางดิจิตอล

3

JavaScript, 104 ไบต์

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

ลองออนไลน์


1
FWIW ฉันมีตัวแปรนี้แต่ฉันติดอยู่ที่ 104 ไบต์เช่นกัน
Arnauld

ความอัปยศที่เราไม่สามารถใช้new Dateกับ RNG ได้ที่นี่
Shaggy

3

AWK , 114 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

โปรดทราบว่าต้องใช้อินพุต "บางส่วน" อินพุตสามารถว่างได้ เพื่อหลีกเลี่ยงความจำเป็นในการป้อนข้อมูลเสริมบรรทัดแรกด้วยBEGIN


3

PowerShell , 94 ไบต์

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

ลองออนไลน์!

ลูปจนกว่าจะมีค่าเท่ากับ$r Greyภายในลูปนั้น-splitคือสตริงตัวอักษรในการขึ้นบรรทัดใหม่เลือกสตริงRandomนั้นจากนั้นพิมพ์สีบวกDuck(ในทางเทคนิคมันจะอยู่ในไพพ์ไลน์และการล้างไพพ์ไลน์ในการวนซ้ำถัดไปทำให้เกิด a Write-Output) โปรดทราบว่ามันเป็นไปได้ในทางทฤษฎีที่Greyจะไม่ถูกเลือกและวนรอบจะดำเนินต่อไปอย่างไม่สิ้นสุด แต่สิ่งนี้แทบจะไม่เกิดขึ้นเลย


3

R , 101 ไบต์

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

ลองออนไลน์!

แรงบันดาลใจอย่างหนักโดย@ user2390246 คำตอบของความท้าทายที่เกี่ยวข้อง เราต้องการแหล่งที่มาของการสุ่มสองแหล่ง: การเปลี่ยนลำดับของสีและการสุ่มตัวอย่างสีเป็ดที่ไม่ใช่สีเทา sampleจะใช้ตัวอย่างที่สุ่มจากขนาดสุ่มได้รับจากการกระจายชี้แจงกับพารามิเตอร์อัตรา1, ตัดทอนเป็นจำนวนเต็ม ใช้ distrubtion ชี้แจงหมายความว่ามีความน่าจะเป็นของexp(-8)หรือรอบ ๆ0.0003354 ที่กลุ่มตัวอย่างจะมีอย่างน้อยเพื่อให้เรามีตัวอย่างด้วย8replace=T


คุณสามารถแทนที่\nด้วยบรรทัดใหม่จริงสำหรับ 1
MickyT

นอกจากนี้คุณสามารถบันทึกค่อนข้างใช้colors()[c(26,254,498,552,640,652)]แทนscan(..)ฯลฯ ควรลงมาประมาณ 83
MickyT

@MickyT ......... ฉันไม่ได้ใช้กราฟิกของ R เพียงพอที่จะจำเกี่ยวกับกราฟิกที่ดีทั้งหมดที่มีอยู่ภายในcolors()! นี่เป็นสนามกอล์ฟที่ดีซึ่งฉันคิดว่าคุณควรโพสต์เป็นคำตอบของคุณเองเนื่องจากนี่เป็นวิธีที่ไม่สวยงามในการรับสีสัน
Giuseppe

ตกลงแล้วฉันจะโพสต์มันด้วยการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ สองอย่าง
MickyT

3

Python 2 , 138 133 120 117 116 ไบต์

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

ลองออนไลน์!

ดีขึ้นมากด้วยความคิดบางอย่างจาก @EriktheOutgolfer ขอบคุณ!

-3 เพิ่มขึ้นด้วย @ovs

-1 ด้วยขอบคุณ @Rod สำหรับเคล็ดลับใหม่ ๆ ที่ได้เรียนรู้ :-)


3

เรติน่า69 69ไบต์

ขอบคุณ Leo ที่ช่วยประหยัด 1 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

.ระงับเอาต์พุตโดยปริยายเมื่อสิ้นสุดโปรแกรม (ไม่เช่นนั้นเราจะได้เป็ดสีเทาสองตัว) ตัดโปรแกรมทั้งหมดในวงซึ่งยังคงเป็นเวลานานเป็นสตริงที่ทำงานไม่ได้มี/y/^{ yส่วนที่เหลือของบรรทัดนั้นตั้งค่าสตริงการทำงานเป็นรายการที่คั่นด้วย linefeed สีทั้งหมด

" duck¶">G?`

เรา grep สายสุ่มจากสตริงการทำงาน (และดังนั้นจึงเป็นสีแบบสุ่ม) และเราพิมพ์ผลลัพธ์ด้วยการลาก duckและการป้อนบรรทัด


3

MATL , 68 64 ไบต์

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

ลองออนไลน์!

คำอธิบาย

`                         % 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 ไบต์

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 โดย @ElPedro!
-1 โดยฉัน
-1 โดย @Bubbler!

ลองออนไลน์!


คุณสามารถย้ายสีเทาไปข้างหน้าและต้องd!=c[0]บันทึกไบต์ได้หรือไม่?
ElPedro

print(d,'duck')เพื่อบันทึกไบต์ ตัวคั่นเริ่มต้นคือช่องว่าง
Bubbler

3

Java (JDK 10) , 287 ไบต์

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)

ลองออนไลน์!

codegolf แรกของฉัน! เห็นได้ชัดว่าไม่สามารถแข่งขันได้มีความสุขที่ได้เรียนรู้ Java เพียงพอ (ปัจจุบันใน CS200) เพื่อให้สามารถเข้าร่วมได้


2

Kotlin , 122 ไบต์

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

ลองออนไลน์!


1
อาจมีประโยชน์กับใครบางคนที่นั่นเพื่อรับค่าจำนวนเต็มแบบสุ่มใน Kotlin คุณสามารถใช้สิ่งต่อไปนี้: (0..7) .shuffled () [0] สั้นกว่า: (Math.random () * 8) .toInt ()
Makotosan

2

MS-SQL, 158 ไบต์

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

ขึ้นอยู่กับคำตอบที่ยอดเยี่ยมของ Razvan เป็นส่วนใหญ่แต่ใช้STRING_SPLITฟังก์ชั่นเฉพาะ MS-SQL 2016 และใหม่กว่า ยังใช้GOTOแทนการWHILEวนรอบ

จัดรูปแบบ:

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 ไบต์

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
รูปแบบที่ดี BEGINคุณสามารถลบพื้นที่ก่อน
BradC

2

Python 2 , 98 ไบต์

ดูไม่มีการนำเข้า!

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

(พิมพ์ช่องว่างพิเศษระหว่างสีและduckตามที่อนุญาตในคำถาม)

ลองออนไลน์!

ตัวสร้างตัวเลขสุ่มหลอกที่น่าสงสารน่าสงสารที่มีรหัสวัตถุเป็น0 (แต่ดูเหมือนว่าพอดีกับข้อมูลจำเพาะ) ซึ่งให้ผลเป็นจำนวนเต็มซ้ำ ๆ กันxใน[0,7]ซึ่งใช้ในการแบ่งรายชื่อตัวละครจากดัชนีใน ขั้นตอนที่8เพื่อรับชื่อสีที่พิมพ์พร้อมกับduckสิ่งอันดับเป็นแรงผลักดันให้เว้นวรรคระหว่าง เมื่อxกลายเป็นศูนย์Greyจะถูกพิมพ์และการประเมินผลของอินพุตถัดไปกับข้อผิดพลาดของตัวสร้างตัวเลขแบบโมดูโลที่พยายามหารด้วยศูนย์ ( v=1/x,vพยายามที่จะสร้าง tuple ใหม่ด้วยองค์ประกอบแรก1/x= 1/0)


วิธีเดียวกันคือ 100 ใน Python 3 ด้วย

v=0
while 1:x=id(v)%17%8;print("GVIYORGBrinererleodladeuyliln ee egog n  towe"[x::8],"duck");v=1/x,v
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.