Mirage ของคนฉลาด


29

กาลครั้งหนึ่งฉันได้อ่านคำถาม / คำตอบนี้เกี่ยวกับ Quora

มีโปรแกรมเมอร์ที่มีองศาวิทยาศาสตร์คอมพิวเตอร์ซึ่งไม่สามารถผ่านการทดสอบ FizzBuzz ได้หรือไม่

รหัสนี้เป็นคำตอบที่ชัดเจน

for i in range(1, 100):
    if i % 3 == 0 and i % 5 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i

แน่นอนว่าFizzBuzzได้รับการตีกอล์ฟให้ตาย แต่นั่นไม่ใช่สิ่งที่คำถามนี้เกี่ยวกับ ในความเห็นมีคนพูดว่าคำตอบที่ชัดเจนนี้ดีมากเพราะมันง่ายที่จะเพิ่มเงื่อนไขพิเศษเช่นพิมพ์ "Jazz" สำหรับทวีคูณของ 4 (ฉันไม่เห็นด้วยการขยายแบบแผนนี้ต้องใช้ O (2 ** n ) บรรทัดของรหัส)

ความท้าทายของคุณคือการเขียน FizzJazzBuzz เวอร์ชันที่สวยที่สุดตามที่เพื่อนของคุณตัดสิน

บางสิ่งสำหรับผู้ลงคะแนนที่จะต้องพิจารณา:

  1. แห้ง
  2. ประสิทธิภาพของการดำเนินการแบ่ง / โมดูลัส

คำตอบหลายข้อใน Quora ใช้ Python แต่ไม่มีข้อ จำกัด ด้านภาษาเช่นนี้

ฉันจะยอมรับคำตอบด้วยคะแนนมากที่สุดหนึ่งเดือนจากนี้

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

1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz
popularity-contest  code-challenge  word  popularity-contest  string  grid  language-design  code-golf  source-layout  math  fastest-algorithm  assembly  code-golf  json  code-golf  arithmetic  array-manipulation  code-golf  ascii-art  code-golf  crossword  code-golf  string  restricted-complexity  code-golf  ascii-art  kolmogorov-complexity  code-golf  string  decision-problem  balanced-string  syntax  code-golf  grid  puzzle-solver  hexagonal-grid  code-golf  math  number  sequence  code-golf  string  decision-problem  code-golf  cryptography  king-of-the-hill  code-challenge  fastest-code  code-golf  number  code-golf  code-golf  string  code-golf  cryptography  king-of-the-hill  java  code-golf  number-theory  base-conversion  code-golf  code-golf  array-manipulation  code-golf  array-manipulation  sorting  code-challenge  restricted-source  quine  code-golf  tips  python  king-of-the-hill  code-golf  source-layout  fractal  code-golf  tips  game  king-of-the-hill  path-finding  grid  code-golf  kolmogorov-complexity  natural-language  code-golf  tips  python  code-golf  number  arithmetic  sequence  array-manipulation  code-golf  number  combinatorics  random  integer-partitions  code-golf  string  code-golf  vim  comment  code-golf  combinatorics  counting  code-challenge  rosetta-stone  code-golf  combinatorics  sequence  subsequence  code-golf  code-challenge  restricted-source  primes  printable-ascii  popularity-contest  graphical-output  image-processing 

1
สัญลักษณ์แสดงหัวข้อย่อยที่สองของคุณค่อนข้างคลุมเครือ ... อะไรทำให้การแบ่งมีประสิทธิภาพ เหตุใดจึงมีความสำคัญต่อความท้าทาย
Sanchises

@sanchises ยังคงมีแพลตฟอร์มอยู่โดยเฉพาะไมโครคอนโทรลเลอร์ที่มีราคาแพงมาก (ในรอบ / เวลา) การดำเนินการหาร คำตอบอย่างน้อยหนึ่งคำตอบด้านล่างนี้หลีกเลี่ยงการหาร / โมดูลัสทั้งหมด - แต่อาจเจ็บการอ่านได้ มันเป็นสิ่งที่ผู้มีสิทธิเลือกตั้งจะต้องพิจารณา
gnibbler

1
@sanchises ไม่คลุมเครือเลย IMHO จุดไม่ได้ใช้การหาร / โมดูลัสเลย คุณสามารถทำได้เพียงแค่เก็บตัวแปรไว้สำหรับแต่ละ n = (3,4,5 ... ) แล้วทำการตั้งใหม่ในเวลาที่มันไม่ตรงและพิมพ์คำและเพิ่มขึ้นเมื่อไม่ได้ ส่วนที่แห้งสามารถทำฟังก์ชั่น / วิธีการรับ (n, คำ) และทำให้ "การบำรุงรักษา" ของการเพิ่มคำง่าย ๆ
jean

1
มีความเกี่ยวข้องสูง: themonadreader.files.wordpress.com/2014/04/fizzbuzz.pdf
Hjulle

คำตอบ:


101

รุ่นที่สวยที่สุดคุณพูดว่า? จากนั้นมาลองอันนี้ใน ...

ภาษาของเช็คสเปียร์

The Marvelously Insane FizzBuzzJazz Program.

Lady Capulet, an old bossy woman that loves to count.
The Archbishop of Canterbury, an old fart who adores to spit out letters.


          Act I: The only one of them.

          Scene I: The Archbishop of Canterbury is a bastard.

[Enter The Archbishop of Canterbury and Lady Capulet]

The Archbishop of Canterbury:
 You are nothing!

          Scene II: Count, Lady Capulet, count.

The Archbishop of Canterbury:
 You are as beautiful as the sum of yourself and a cat!

Lady Capulet:
 Am I worse than the square of the product of the sum of a warm gentle flower and a rose
 and my pretty angel?

The Archbishop of Canterbury:
 If not, let us proceed to Scene VIII.

          Scene III: Fizzing to no end!

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and the sum of a happy cow and a
 chihuahua as good as nothing?

Lady Capulet:
 If not, let us proceed to Scene IV. Thou art as handsome as the sum of the sum of
 the sweetest reddest prettiest warm gentle peaceful fair rose and a happy proud kindgom
 and a big roman. Speak thy mind!

 Thou art as fair as the sum of thyself and a honest delicious cute blossoming peaceful
 hamster. Thou art as cunning as the sum of the sum of an embroidered King and a horse
 and thyself. Speak thy mind!

 Thou art as amazing as the sum of the sum of a good happy proud rich hero and a hair and
 thyself! Speak thy mind.

 Speak your mind!

          Scene IV: Milady, there is jazz in thy robe.

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and a proud noble kingdom as good as
 nothing?

Lady Capulet:
 If not, let us proceed to Scene V. You are as charming as the sum of the sum of a noble
 cunning gentle embroidered brave mighty King and a big warm chihuahua and an amazing
 pony! Speak your mind!

 You are as prompt as the sum of yourself and a big black sweet animal. You are as noble
 as the sum of the sum of a gentle trustworthy lantern and yourself and a hog. Speak your
 mind!

 You are as bold as the sum of the sum of yourself and a good delicious healthy sweet
 horse and my smooth cute embroidered purse. You are as peaceful as the sum of a flower
 and yourself. Speak your mind.

 Speak your mind!

          Scene V: Buzz me up, Scotty!

The Archbishop of Canterbury:
 Is the remainder of the quotient between yourself and the sum of a gentle happy cow and a
 chihuahua as good as nothing?

Lady Capulet:
 If not, let us proceed to Scene VI. Thou art as handsome as the sum of the sweetest
 reddest prettiest warm gentle peaceful fair rose and a small town. Speak your mind!

 You are as prompt as the sum of yourself and a big healthy peaceful fair rich kingdom.
 You are as loving as the sum of the sum of an embroidered King and a horse and thyself.
 You are as amazing as the sum of yourself and a cute fine smooth sweet hamster. Speak
 your mind!

 You are as prompt as the sum of the sum of yourself and an amazing cunning Lord and a
 hair. Speak your mind.

 Speak your mind!

The Archbishop of Canterbury:
 Let us proceed to Scene VII.

          Scene VI: Output or die!

The Archbishop of Canterbury:
 Open your heart!

          Scene VII: Oh, to jump the line.

Lady Capulet:
 You are as handsome as the sum of a proud noble rich kingdom and a rural town. Speak your
 mind! You are as gentle as the sum of the sum of yourself and a green mistletoe and my
 father. Speak your mind!

The Archbishop of Canterbury:
 We must return to Scene II.

          Scene VIII: Goodbye, cruel world!

[Exeunt]

ดังนั้นหลังจากที่ฉันต่อสู้กับ SPL ที่นี่ฉันรู้สึกว่าฉันต้องทำอย่างน้อยหนึ่งอย่างกับมันในความท้าทายใด ๆ และนี่คือมัน

ดังนั้นทั้งหมดนี้คืออะไร

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

ดังนั้นขอให้พระมหากษัตริย์ของการแปลบางส่วนไปยังสิ่งเล็ก ๆ น้อย ๆ น้อยgibberishy

Act I, Scene I

Begin Lady Capulet = 0;

Act I ค่อนข้างตรงไปตรงมา: เราเริ่มต้นตัวแปรของเราด้วย 0

Act I, Scene II

Lady Capulet += 1; if(Lady Capulet < Math.pow((2*2*1+1)*(2*1),2)) continue; else goto Scene VIII;

เราเพิ่มมูลค่าของ Lady Capulet และเปรียบเทียบกับ 100 (ใช่ประโยคทั้งหมดนั้นทำหน้าที่เพียงเพื่อรับหมายเลข 100); ถ้ามันไม่เล็กเราก็ข้ามไปที่ Scene VIII (ตอนจบ); มิฉะนั้นเราจะไปยังฉากต่อไป

Act I, Scene III

if(Lady Capulet % (2+1) == 0) continue; else goto Scene IV; The Archbishop of Canterbury = 2*2*2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);

ก่อนอื่นเรามาดูว่าโมดูลัสของการหารด้วย 3 เป็น 0 หรือไม่ ถ้าไม่ใช่เราก็ข้ามไปที่ซีน IV; ถ้าเป็นเช่นนั้นเราจะเริ่มดำเนินการทางคณิตศาสตร์และจัดเก็บไว้ใน Archieperson และส่งออกในรูปแบบตัวอักษรเมื่อเราพบสิ่งที่เรากำลังมองหา Fizzใช่ในท้ายที่สุดความคิดที่จะได้รับ

Act I, ฉากที่สี่

if(Lady Capulet % (2*2) == 0) continue; else goto Scene V; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*1; The Archbishop of Canterbury += 2*2*1+(-1); System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*1+2*2*2*1; The Archbishop of Canterbury += 1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury);

การตรวจสอบก่อนว่าโมดูลัสส่วนที่ 4 เป็น 0 Jazzแล้วยังคงเป็นสถานที่เกิดเหตุเช่นเดียวกับก่อนสำหรับ

Act I, ฉาก V

if(Lady Capulet % (2*2+1) == 0) continue; else goto Scene VI; The Archbishop of Canterbury = 2*2*2*2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2*2*2*2*1; The Archbishop of Canterbury += 2*1+1; The Archbishop of Canterbury += 2*2*2*2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*2+1; System.out.print((char)The Archbishop of Canterbury); System.out.print((char)The Archbishop of Canterbury); goto Scene VII;

ฟังก์ชั่นเหมือนก่อนหน้านี้สองการตรวจสอบถ้าโมดูลัสของการแบ่งผลตอบแทน 5 0 แล้วพยายามที่จะเขียนBuzz; ความแตกต่างเพียงอย่างเดียวคือในที่สุดเราก็ข้ามฉาก

Act I, ฉากที่หก

System.out.print(Lady Capulet);

ในการเข้าถึงฉากนี้หมายเลขที่เลดี้คาปูเลทสันนิษฐานว่าจะต้องไม่ใช่ Fizz หรือ Jazz หรือ Buzz; ดังนั้นเราจะแสดงมันในรูปแบบตัวเลข

Act I, Scene VII

The Archbishop of Canterbury = 2*2*2*1+2*1; System.out.print((char)The Archbishop of Canterbury); The Archbishop of Canterbury += 2*1+1; System.out.print((char)The Archbishop of Canterbury); goto Scene II;

ดังนั้นนี่เป็นวิธีเดียวที่ฉันพบเพื่อข้ามไปยังบรรทัดถัดไป: เอาท์พุทแรก CR และ LF; จากนั้นเรากลับไปที่ Scene II เพื่อให้เราสามารถดำเนินการโปรแกรมต่อได้

Act I, Scene VIII

End.

ตรงไปตรงมาพอสมควร

ฉันยังคงพยายามดูว่าฉันสามารถแสดงการทำงานแบบออนไลน์ได้หรือไม่ แต่ฉันไม่สามารถหาคอมไพเลอร์ออนไลน์ได้ - โปรแกรมที่ฉันรู้ว่าทำงานร่วมกันไม่ได้กับโปรแกรมใด ๆ ยกเว้นโปรแกรมที่โหลดแล้วหรืออาจมีบางอย่าง ปัญหาเกี่ยวกับส่วนต่อประสานระหว่างแป้นพิมพ์และเก้าอี้ ...

อัปเดต 1:

หลังจากความคิดเห็นของชาว Mathan ฉันได้แก้ไขลำดับฉากของ Jazz และ Buzz มันจะต้องทำ


1
ดูเหมือนว่าฉันมีปัญหา DNS ขออภัยสำหรับการเตือนที่ผิดพลาด
Rainbolt

17
สิ่งหนึ่งที่น่าสงสัยว่าทำไมเช็คสเปียร์ไม่เคยได้รับโค้ดกอล์ฟ
Sanchises

5
ฉันหวังว่า Scenes III, IV และ V จะสอดคล้องกับ Fizz, Jazz และ Buzz ตามลำดับ ยังทำเสร็จอย่างสวยงาม!
mathmandan

1
@ มาทมันดันประณาม ช่างเป็นโอกาสที่สูญเปล่าที่จะทำสิ่งที่ยอดเยี่ยม ประณาม!!
Rodolfo Dias

1
มันมหัศจรรย์ แต่ฉันดูเหมือนจะสังเกตเห็นข้อผิดพลาด ฉันคิดว่ามันจะส่งออกหมายเลขถ้าไม่ใช่ Buzz ไม่ว่าจะเป็น Fizz หรือ Jazz ฉันไม่ได้ใช้มัน แต่ฉันไม่สามารถหาเช็คได้ บางทีคุณสามารถตรวจสอบในตอนท้ายว่าอาร์คบิชอปเป็นzและตั้งเขาก่อนทุกวง
matega

45

> <> (ปลา)

1 > :9b*)?; 0& v
               \ :3%?v "Fizz" r}oooo &1+& \
               /     <                    /
               \ :4%?v "Jazz" r}oooo &1+& \
               /     <                    /
               \ :5%?v "Buzz" r}oooo &1+& \
               /     <                    /
               \   &?v :n                 \
  ^  +1 oa           <                    /

> <> เป็นภาษาการเขียนโปรแกรม 2D ที่คำแนะนำเป็นตัวอักษรเดี่ยวและตัวชี้คำสั่ง (IP) สามารถเลื่อนขึ้นลงซ้ายหรือขวาขึ้นอยู่กับลูกศร^>v<และมิเรอ/\ร์ มันไม่มีตัวแปรหรือสายอักขระดังนั้นการทำซ้ำตัวเองก็ยากขึ้นเล็กน้อย แต่ฉันคิดว่ามันดีในทางของตัวเอง

เราผลักดัน1และเริ่มห่วง :9b*)?;การตรวจสอบถ้าจำนวนมากกว่า 99 ( 9b* = 9*11) ;และถ้าเป็นเช่นนั้นหยุดโปรแกรม มิฉะนั้นใส่ 0 ลงในทะเบียนและย้ายลงvไปในส่วนที่เป็นคลื่น

:3%?ตรวจสอบหมายเลข modulo 3. ถ้ามันไม่ใช่ศูนย์แล้วเราไปลงแถวและเลื่อนไปทางซ้ายv <มิฉะนั้นเราจะข้ามลูกศรลงและดัน"Fizz"พิมพ์ ( r}oooo) และเพิ่มการลงทะเบียน ( &1+&) ก่อนที่จะกระเด้งออกมาจากกระจกติดผนังด้านขวาเพื่อเลื่อนลงเป็นแถว ไม่ว่าจะเป็นวิธีใดก็ตามเราจะเลื่อนไปทางซ้ายตามแถวที่สามจนกว่าเราจะกระเด็นกระจกมองข้างซ้าย จากนั้นเราก็ทำซ้ำและJazzBuzz

นี้ต่อไปจนกว่าเส้นที่ 7 ที่จะตรวจสอบการลงทะเบียน&ค่า 's ถ้าไม่ใช่ศูนย์เราก็ลงไป มิฉะนั้นเราจะพิมพ์ตัวเลขเองnก่อนจะลง

ในที่สุดao(จำไว้ว่าเรากำลังจะย้ายไปทางซ้ายทันที!) พิมพ์บรรทัดใหม่ของ ASCII และ1+เพิ่มจำนวนก่อนที่เราจะขึ้นไป^และวนซ้ำ>อีกครั้ง

(ตอนนี้เรารอคำตอบที่สวยงาม Piet ... )


3
นี่คือสิ่งที่สวยงาม สิ่งนี้ควรเข้าสู่หอเกียรติยศเพื่อหาคำตอบ> <>
Joshpbarron

2
ดวงตาของฉันกระโดดไปที่: 3
EMBLEM

ภาษานั้นไม่ได้รับรางวัลการอ่าน แต่มันค่อนข้างเรียบร้อย
William T Froggard

40

LOLCODE

สง่างาม? Nope ประสิทธิภาพสูงหรือไม่ ไม่อย่างแน่นอน. สวย? คุณก็รู้ว่าสิ่งที่พวกเขาพูดว่า: ความงามอยู่ในสายตาของคนดู

HAI
I HAS A kitty ITZ 1
IM IN YR house UPPIN YR kitty TIL BOTH SAEM kitty AN 100

    BTW, computin yr mods
    I HAS A d00d ITZ NOT MOD OF kitty AN 3
    I HAS A doge ITZ NOT MOD OF kitty AN 4
    I HAS A bro ITZ NOT MOD OF kitty AN 5

    ANY OF d00d bro doge MKAY, O RLY?
    YA RLY
        d00d, O RLY?
        YA RLY
            VISIBLE "Fizz"!
        OIC
        doge, O RLY?
        YA RLY
            VISIBLE "Jazz"! BTW, wow such jazz
        OIC
        bro, O RLY?
        YA RLY
            VISIBLE "Buzz"!
        OIC
    NO WAI
        VISIBLE kitty!
    OIC

    VISIBLE ""
IM OUTTA YR house
KTHXBYE

คำอธิบายบางอย่าง:

โปรแกรม LOLCODE เริ่มต้นด้วยและจบลงด้วยการHAIKTHXBYE

I HAS A <variable> ITZ <value>ตัวแปรที่มีการพิมพ์แบบไดนามิกและที่ได้รับมอบหมายโดยใช้ <variable> R <value>เมื่อกำหนดตัวแปรนอกจากนี้ยังสามารถใช้ที่ได้รับมอบหมาย

มีการตั้งชื่อลูปใน LOLCODE ไวยากรณ์คือ:

IM IN YR <loop> UPPIN YR <index> TIL BOTH SAEM <index> AN <end>
    <stuff to do>
IM OUTTA YR <loop>

นี่เป็นเพียงอินเทอร์เน็ตพูดถึง "วนซ้ำจนกว่า i = end" ใน LOLCODE 1.2 ตัวแปรการจัดทำดัชนีจะต้องเริ่มต้นก่อนลูป นี่คือวงชื่อ "บ้าน" เพราะมันทำให้การอ่านการเริ่มต้นเสียงห่วงตลก

VISIBLEพิมพ์ไปยัง stdout โดยค่าเริ่มต้นบรรทัดใหม่จะถูกต่อท้าย แต่การเพิ่มการ!ปราบปรามการขึ้นบรรทัดใหม่

เงื่อนไขที่ระบุไว้มีดังนี้:

<condition>, O RLY?
YA RLY
    <code to execute if condition is true>
NO WAI
    <code to execute if condition is false>
OIC

เงื่อนไขต้องเป็นนิพจน์ที่ประเมินค่าบูลีนหรือบูลีน ใน LOLCODE ประเภทบูลีนจะถูกเรียกใช้TROOFและมีค่าWIN(true) และFAIL(false)

BTWความคิดเห็นบรรทัดเดียวเริ่มต้นด้วย

ไม่รอบรู้ในภาษาของ Internet Internet? เพียงแจ้งให้เราทราบและฉันจะให้คำอธิบายเพิ่มเติมอย่างมีความสุข


3
ยิ่งใหญ่ นี่เป็นเรื่องเหลือเชื่อ ฉันยังคงหัวเราะ
rpax

@rpax: ยอดเยี่ยม ... ทุกอย่างเป็นไปตามแผน ...
อเล็กซ์ A.

33

Python3

lst = [('Fizz', 3),
       ('Jazz', 4),
       ('Buzz', 5),
       ]

for i in range(1, 101):  
    print(*[w for w, m in lst if i % m == 0] or [i], sep='')

ในบรรดาคำตอบยอดนิยมในปัจจุบันนี้เป็นเพียงคนเดียวที่มีรูปแบบใด ๆ ของEfficiency of division/modulus operations
aross

@aross คุณหมายถึงอะไร คำตอบทั้งหมดที่ฉันเห็นมีการใช้งานมากที่สุดในจำนวนการดำเนินการหาร / โมดูลัสเท่ากัน
Hjulle

จริงๆ? คำตอบอื่น ๆ ทั้งหมดใช้ตัวดำเนินการโมดูลัสสำหรับแต่ละ(3, 4, 5)ข้อ ซ้ำสามครั้ง นี่เป็นคำตอบเดียวที่มีเพียงตัวดำเนินการโมดูลัสเดียว
aross

1
ฉันเพิ่งอ่านความคิดเห็นเกี่ยวกับคำถาม ฉันเดาว่าฉันตีความประโยคที่ยกมาผิด ควรมีการอ้างอิงถึงDRYแทน นอกจากนี้คำตอบนี้ประกอบด้วยโดย OP
aross

31

Piet

ดูใหญ่ขึ้น"แหล่งที่มา" จริง

ฉันตัดสินใจลองเล่นกับPietและดูว่าฉันสามารถสร้างโค้ดได้สวยขนาดไหน ฉันพยายามที่จะไม่ทำซ้ำอะไรที่นี่ถึงแม้ว่าจะซื่อสัตย์ฉันจะต้องทำซ้ำการคำนวณ mod อย่างไรก็ตามแต่ละ mod ที่แตกต่าง (n% 3, n% 4 และ n% 5) นั้นจะทำงานเพียงครั้งเดียวต่อการวนซ้ำของรหัส

ภาพที่มีขนาดเล็กเป็นแหล่งที่เหมาะสมและสามารถอัปโหลดและเรียกใช้ที่นี่

สนุก!


4
"มีโปรแกรมเมอร์ที่มีองศาวิทยาศาสตร์คอมพิวเตอร์ที่ไม่สามารถผ่านการทดสอบ FizzBuzz ใน Piet ได้หรือไม่"
Sanchises

26

มาติกา

ใน Mathematica คุณสามารถกำหนดและโอเวอร์โหลดฟังก์ชั่นสำหรับพารามิเตอร์ที่เฉพาะเจาะจงมาก (ไม่เพียง แต่ตามประเภท แต่ยังตามเงื่อนไขตรรกะโดยพลการ) มานิยามฟังก์ชั่นกันหน่อย:

Fizz[n_, s___] := {n, s}
Fizz[n_ /; Divisible[n, 3], s___] := {n, "Fizz" <> s}
Jazz[n_, s___] := {n, s}
Jazz[n_ /; Divisible[n, 4], s___] := {n, "Jazz" <> s}
Buzz[n_, s___] := {n, s}
Buzz[n_ /; Divisible[n, 5], s___] := {n, "Buzz" <> s}
DoThe[n_] := n
DoThe[_, s_] := s

และตอนนี้โปรแกรมจริงเป็นเพียง

DoThe @@@ Fizz @@@ Jazz @@@ Buzz /@ Range[100] // TableForm

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

addFunction[f_, divisor_] := (
  f[n_, s___] := {n, s};
  f[n_ /; Divisible[n, divisor], s___] := {n, ToString[f] <> s}
)
addFunction[Fizz, 3];
addFunction[Jazz, 4];
addFunction[Buzz, 5];
DoThe[n_] := n
DoThe[_, s_] := s

DoThe @@@ Fizz @@@ Jazz @@@ Buzz /@ Range[100] // TableForm

ตอนนี้สิ่งที่คุณต้องทำคือเพิ่มaddFunctionสายอื่นและเพิ่มสายใหม่ของคุณ**zzในบรรทัดสุดท้าย


13
DoThe @@@ Time @@@ Warp @@@ Again /@ Range[100] // TableForm
Sp3000

10
มันเป็นJMPทางซ้าย!
MikeTheLiar

"สิ่งที่คุณต้องทำคือเพิ่มการเรียกใช้ addFunction อีกครั้ง" ... และเพิ่มฟังก์ชั่นใหม่ในบรรทัดสุดท้าย?
Sparr

@ Sparr โอ้ใช่แล้วมันเป็นความจริง
Martin Ender

22

Haskell

พวกคุณไม่ได้ถือ DRY อย่างจริงจัง มีรูปแบบที่ชัดเจนซึ่งสามารถแยกออกได้ในลำดับ "Fizz Jazz Buzz"

import Control.Applicative

-- All words end with "zz" and the numbers are in a sequence
fizzes = zip [3..] $ (++ replicate 2 'z') <$> words "Fi Ja Bu"

main = putStrLn . unlines $ fizzIt <$> [1..99]

-- Point free style with reader monad ((->) a) to minimize
-- unnecessary repetition of variable names
fizzIt = nonFizzy =<< fizzy

-- Show the number if no fizziness was found. Partially point free
-- with respect to n. But xs is needed to prevent the error:
-- "Equations for ‘nonFizzy’ have different numbers of arguments"
nonFizzy "" = show
nonFizzy xs = const xs

-- (Ab)use the list monad for concatenating the strings

fizzy i = snd =<< filter ((==0).mod i.fst) fizzes
-- Could also be written as:
-- > fizzy i = concat [ str | (n,str) <- fizzes, i`mod`n==0]
-- but that would be way too readable, and not pointless (ahem, point free) enough. ;)

รหัสนี้ยังสามารถขยายได้อย่างง่ายดาย ในการแก้ปัญหา "Fizz Jazz Buzz Tizz" สิ่งที่คุณต้องทำคือเพิ่มเข้าไปTiหลังจากBuในสตริง นี่เป็นสิ่งที่น้อยกว่าสิ่งที่ต้องการในโซลูชันอื่น ๆ


5
ถ้าคุณต้องแก้ปัญหา Fizz-Jazz-Buzz-Sausage
Anko

@Anko ฉันอาจจะทำอะไรเช่นนี้หรือเพียงแค่ย้อนกลับไปfizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"] fizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage"
Hjulle

3
replicate 2 zมันยืดออกเล็กน้อย . .
Soham Chowdhury

3
@octatoan ฉันไม่สามารถต้านทานได้ ;)
Hjulle

16

Excel VBA

             Sub scopeeeeeeeeeeeeeeee()
                     '   ||
               For u = 1 To 100
   If u Mod 3 = 0 Then yell = "Fizz"
If u Mod 4 = 0 Then yell = yell & "Jazz" '---------------------------------------------|
If u Mod 5 = 0 Then yell = yell & "Buzz" '---------------------------------------------|
            'made in USA
            If yell = "" Then yell = u
             Debug.Print yell      '\\
             yell = ""              '\\
            Next                     '\\
           End Sub                    '\\

มันอาจฟังดูโง่ แต่มันเป็นปืนไรเฟิล 2 มิติ!


ครึ่งหนึ่งของมัน !!!!
เครื่องมือเพิ่มประสิทธิภาพ

2
นอกจากนี้ยังเป็นเรื่องตลก - "หากคุณโหมด 3"
เครื่องมือเพิ่มประสิทธิภาพ

ขอขอบคุณ!! ฉันไม่ได้คาดหวังว่าจะมีคนตระหนักถึงโหมด u 3 อย่างรวดเร็ว
Alex

ฉันไม่เข้าใจว่าทำไมครึ่งหนึ่งของมัน!
Alex

Sniper เป็นเพียงครึ่งเดียว ขอบเขตมักจะอยู่ตรงกลางของสไนเปอร์
เครื่องมือเพิ่มประสิทธิภาพ

15

ชวา

void fizzy(int limit){
    String[] output = new String[limit];
    Arrays.fill(output,"");

    List<SimpleEntry<Integer,String>> tests = new ArrayList<SimpleEntry<Integer,String>>();
    tests.add(newEntry(3,"Fizz"));      
    tests.add(newEntry(4,"Jazz"));      
    tests.add(newEntry(5,"Buzz"));      

    for(SimpleEntry<Integer,String> test : tests)
        for(int i=test.getKey();i<limit;i+=test.getKey())
            output[i] += test.getValue();           

    for(int i=1;i<limit;i++)
        System.out.println(output[i].length()<1 ? i : output[i]);
}   

SimpleEntry<Integer,String> newEntry(int key, String value){
    return new SimpleEntry<Integer,String>(key,value);
}

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

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

นั่นไม่ได้หมายความว่าอัลกอริทึมโดยรวมนั้นมีประสิทธิภาพมากที่สุด (ไม่ใช่) แต่ฉันคิดว่ามันกระทบกับสัญลักษณ์แสดงหัวข้อย่อยได้ดี


2
มันจะไม่เป็นจาวาถ้าคุณไม่ได้กำหนดคลาส : D
Adrian Leonhard

ฉันต้องการคำตอบ Java และฉันชอบวิธีนี้ แต่ฉันรู้สึกว่าการฝังโค้ดใน for-statement เป็นสิ่งที่ไม่จำเป็น Java ที่สวยงามสามารถอ่านได้ Java!
Alex Pritchard

@AlexPritchard ฉันคิดว่าผลข้างเคียงของการตีกอล์ฟ จะแก้ไขเมื่ออยู่ที่พีซี :)
Geobits

11

แจ้ง 7

ข้อมูล 7 เป็นภาษาการเขียนโปรแกรมตามกฎที่ออกแบบมาสำหรับนิยายเชิงโต้ตอบ เป็นที่น่าสังเกตว่าการเป็นหนึ่งในภาษาโปรแกรมภาษาธรรมชาติที่ประสบความสำเร็จมากที่สุด ดูตัวอย่าง7 ภาษาสำหรับตัวอย่างอื่น ๆ และเกร็ดความรู้เล็กน้อย

The number printing rules are a number based rulebook.

Definition: a number is fizzy if the remainder after dividing it by 3 is 0.
Definition: a number is jazzy if the remainder after dividing it by 4 is 0.
Definition: a number is buzzy if the remainder after dividing it by 5 is 0.

A number printing rule for a fizzy number:
    say "Fizz";

A number printing rule for a jazzy number:
    say "Jazz";

A number printing rule for a buzzy number:
    say "Buzz";

A number printing rule for a number (called N):
    unless a paragraph break is pending:
        say N;
    say conditional paragraph break;

To print a series of numbers from (min - a number) to (max - a number):
    repeat with N running from min to max:
        follow the number printing rules for N;

รหัสนี้มีความได้เปรียบที่แต่ละกฎ FizzBuzz เป็นอิสระอย่างสมบูรณ์: สามารถเพิ่มกฎเพิ่มเติมได้ทุกเมื่อโดยไม่จำเป็นต้องเปลี่ยนกรอบงานทั่วไป น่าเสียดายที่มันซ้ำซากเล็กน้อยโดยเฉพาะอย่างยิ่งกับวลีนิยาม ฉันสามารถกำหนดโอเปอเรเตอร์% ได้ แต่จากนั้นจะไม่ใช่ภาษาอังกฤษ ;)

รหัสนี้สามารถทำงานออนไลน์โดยใช้ Playfic


7

Dyalog APL

∇FizzJazzBuzz;list;items;names
   items ← ⍳100    
   list  ← ↑('Fizz' 3) ('Jazz' 4) ('Buzz' 5)   

   names ← (,/ ↑(↓0=⍉list[;2]∘.|items) /¨ ⊂list[;1]) ~¨ ' '
   ⎕← ↑,/↑names ,¨ (∊0=⍴¨names) ⍴¨ ⊂¨⍕¨items
∇
  • DRY: ไม่มีรหัสสองเท่า
  • ง่ายต่อการเปลี่ยนแปลงเงื่อนไข: ชื่อจะถูกนำมาจากรายการตามลำดับต่อตัวหารด้วยการเปลี่ยนแปลงที่น้อยที่สุดที่จำเป็น
  • ง่ายต่อการเปลี่ยนช่วง: itemsสามารถเปลี่ยนเป็นรายการตัวเลขโดยพลการ
  • มีประสิทธิภาพ: ใช้อัลกอริธึมที่อิงกับลิสต์แบบขนานที่ประกอบไปด้วยไพรเมอร์ฟรีข้างเคียงเท่านั้น
  • การไหลของรหัสอย่างง่าย: ไม่เพียง แต่จะไม่มีข้ามไปแล้วก็ไม่มีในขณะที่ s หรือถ้าอย่างใดอย่างหนึ่ง รหัสเป็นเส้นตรงอย่างสมบูรณ์
  • จัดหางานของคุณ: ทุกคนแทบจะไม่สามารถทำงานได้ ...

คุณค่าของ⎕MLและ⎕IOคืออะไร?
FUZxxl

พวกเขาทั้งคู่1ซึ่งเป็นค่าเริ่มต้น
marinus

7

C #

for(int i = 1; i <= 99; i++){
    string s = "";
    if (i % 3 == 0) s += "Fizz";
    if (i % 4 == 0) s += "Jazz";
    if (i % 5 == 0) s += "Buzz";
    System.Console.WriteLine(s == "" ? "" + i : s);
}

ตรวจสอบ mod สร้างสตริงพิมพ์หมายเลขว่างเปล่าหรือสตริงถ้าไม่ ไม่มีการซ้ำ จำเป็นต้องเพิ่มเงื่อนไขและเอาท์พุทสำหรับความต้องการใหม่เท่านั้น


2
"ไม่ซ้ำ" (ตกลงอย่างน้อยขนาดรหัสจะเพิ่มขึ้นเป็นเส้นตรงพร้อมกับคำเพิ่มเติม)
Anko

ฉันใช้ความท้าทายที่จะไม่ทำซ้ำอีกต่อไปด้วยคำตอบ C # ของฉัน แต่เสียสละความยืดหยุ่นใด ๆ ฉันคิดว่าผลลัพธ์ที่ดีที่สุดคือโครงสร้างข้อมูลที่เกี่ยวข้องกับจำนวนและคำ
sydan

@Anko ไม่แน่ใจว่าสิ่งที่คุณได้รับไม่มีฟังก์ชั่นซ้ำแล้วซ้ำอีก ฉันไม่ได้ทำสิ่งเดียวกันสองครั้งในรหัส
rapjr11

@ rapjr11 การตรวจสอบรหัสi- - %บางครั้งหลายครั้งเช่นเดียวกับการผนวกsหลายครั้ง (ไวยากรณ์จำนวนมากซ้ำซ้อนเช่นกัน แต่นั่นอาจเป็นความผิดของ C #)
Anko

7

Python 2.7

ฉันพยายามทำให้บทกวี ...

ฉันไม่เก่งบทกวีรัก ...

of = 1
my_love = 100
youre = "ever"

#You are
for ever in range(of, my_love) :
    never = "out my mind"
    for I,am in[#audibly
                (3, "Fizzing"),
                (4, "Jazzing"),
                #and
                (5, "Buzzing")]:
        if( ever % I ==0):# near you
            never += am #I lonely.
    #because
    youre = ever #in my mind.
    if( youre, never == ever,"out my mind" ):
        never += str(youre) #(I gave up with this line...)
    #then our foot-
    print"""s will"""( never [11:3])# part. 

มันจะดีขึ้นมากหากไม่มีค่าคงที่เริ่มต้น: P


โฆษณา แต่นี่ใช้ไม่ได้กับฉันใน Python 2.7.9 มันบอกว่า: TypeError: 'str' object is not callable.
Alex A.

หืมมมม ...
เอ่อ

5

Java พร้อมคลาส

อัลกอริทึม:

public static void main(String... args) {

    List<Condition> conditions = new ArrayList<Condition>();
    conditions.add(new TerminatingCondition(100));
    conditions.add(new ModuloCondition(3, "Fizz"));
    conditions.add(new ModuloCondition(4, "Jazz"));
    conditions.add(new ModuloCondition(5, "Buzz"));
    conditions.add(new EchoCondition());

    while (true) {
        for (Condition c : conditions){
            c.apply();
        }
    }

}

ชั้นเรียน:

interface Condition {
    void apply();
}

static class ModuloCondition implements Condition {
    int modulo, count = 0;
    String message;
    ModuloCondition(int modulo, String message){
        this.modulo = modulo;
        this.message = message;
    }
    public void apply() {
        count++;
        if (count == modulo) {
            out.append(message);
            count = 0;
        }
    }
}

static class TerminatingCondition implements Condition {
    int limit, count = 0;
    TerminatingCondition(int limit) {
        this.limit = limit;
    }
    public void apply() {
        count++;
        if (count > limit) {
            System.exit(0);
        }
    }
}

static class EchoCondition implements Condition {
    int count = 0, lastOutCount = 0;
    public void apply() {
        count++;
        out.println((lastOutCount == out.count) ? String.valueOf(count) : "");
        lastOutCount = out.count;
    }
}

static class Out {
    int count = 0;
    void append(String s) {
        System.out.append(s);
        count++;
    }
    void println(String s){
        append(s + System.lineSeparator());
    }
}

static Out out = new Out();

2
+1 คุณได้บันทึกจิตวิญญาณของการเขียนโปรแกรม Java ด้วย FizzBuzzJazz 70 บรรทัดนี้อย่างแท้จริง เป็นแบบเชิงวัตถุและเขียนในสไตล์ที่ชัดเจนไม่มีตัวย่อและสามารถอ่านได้ นานมาก. แต่อ่านง่ายมาก ; ^)
DLosc

4

MATLAB / ระดับแปดเสียง

แน่นอนว่าการเขียนลูปของคุณเองเป็นเรื่องสนุกสำหรับโปรแกรมเมอร์ แต่ทุกคนรู้ว่าการติดตามการจัดทำดัชนีน่าเบื่อจริง ๆ (ผู้ที่ไม่ได้เขียนfor(j=i;j<n;i++)ในวงซ้อนกันอย่างน้อยหนึ่งครั้งในชีวิตของพวกเขา?)

MATLAB มีทางออก จริงๆแล้วรหัสนี้ไม่ได้มีประสิทธิภาพมากที่สุดและแน่นอนว่าไม่ใช่รหัสกอล์ฟ แต่มันก็เป็นการแสดงให้เห็นถึงฟังก์ชั่นที่น่าสนใจของ MATLAB Octave เป็นรุ่น GNU ของ MATLAB อย่างไรก็ตามมันไม่เหมาะสำหรับ code-golf เนื่องจากค่อนข้างเข้มงวดกับประเภทของตัวแปรซึ่งเป็นอันตรายสำหรับ code-golf

แก้ไข: จนกว่าจะมีการเน้นไวยากรณ์สำหรับ MATLAB ใน SE ฉันกำลังโพสต์เวอร์ชันที่มีความคิดเห็นน้อยมากเพราะอย่างอื่นมันเป็นเพียงบล็อกที่น่ากลัวขนาดใหญ่ของข้อความธรรมดา

function out = fizzjazzbuzz(n)
    %Initialization
    numberlist=1:n;
    fizz=cell(1,100);
    jazz=fizz;buzz=jazz;

    %Complex loops - no, wait, easy logical indexing.
    fizz(~mod(numberlist,3))={'Fizz'}; 
    jazz(~mod(numberlist,4))={'Jazz'};
    buzz(~mod(numberlist,5))={'Buzz'};
    out=strcat(fizz,buzz,jazz);
    %Fill with numbers
    out(cellfun(@isempty,out))=num2cell(numberlist(cellfun(@isempty,out)));

    %Pretty output (although the default printing is perfectly acceptable)
    out=cellfun(@num2str,out,'UniformOutput',0);
    strjoin(out,sprintf('\n'));
end

2
for(j=i;j<n;i++)? คำถามของฉันคือผู้ที่ไม่เขียนนี้ "อย่างน้อยหนึ่งครั้งในชีวิตของพวกเขา"? หากคุณเป็นเช่นนั้นฉันมีของใหม่ที่ไม่ดีสำหรับคุณ ...
Bogdan Alexandru

1
@BogdanAlexandru คุณไม่เคยในชีวิตของคุณเพิ่มตัวแปรผิดในการforวนซ้ำ (เช่นเมื่อทำรังวนซ้ำ)? คุณเป็นคนที่มีรหัสรวบรวมประสบความสำเร็จทุกครั้งหรือไม่ ถ้าคุณเป็นฉันมีข่าวพระเจ้าสำหรับคุณ ...
Sanchises

2
ฉันไม่ได้พูดเกี่ยวกับการเพิ่มตัวแปรผิดรหัสของฉันไม่ได้เขียนโดยพระเจ้า ฉันกำลังพูดถึงสไตล์การเขียนโค้ดนั้นมันผิดพลาดได้ง่ายมาก jชื่อตัวแปรท้องถิ่นห่วงเป็นเรื่องปกติ แต่iชื่อคือการปฏิบัติที่เลวร้ายมากและนั่นคือที่มาของความผิดพลาดของคุณ มันไม่ได้ตั้งใจโดยบังเอิญ :)
Bogdan Alexandru

@BogdanAlexandru อ่าใช่ฉันเห็นด้วย; เหตุผลที่ฉันยังคงใช้รูปแบบของการวนซ้ำนี้ก็คือเมื่อใช้งานที่ได้รับมอบหมาย (ฉันเป็นนักเรียนปริญญาโท) ฉันควรใช้สัญกรณ์ดัชนีที่อาจารย์ใช้ในคำถามแทนที่จะสร้างความสับสนให้กับชายชราผู้น่าสงสารโดยใช้ตัวฉันเอง
Sanchises

1
ไม่มีปัญหาในการตั้งชื่อตัวอักษรหนึ่งตัวเพื่อจัดทำดัชนีของลูป แต่ตัวแปรอื่น ๆ ควรมีชื่อที่มีความหมายมากกว่า
Bogdan Alexandru

4

หลาม

from collections import defaultdict

lst = [(3, 'Fizz'),
       (5, 'Buzz'),
       (4, 'Jazz')]

word_list = defaultdict(list)

for d, w in sorted(lst):
    for i in range(d, 100, d):
        word_list[i].append(w)

for i in range(1, 100):
    print(''.join(word_list[i]) or i)

นี่เป็นวิธีที่ยาวเกินไป วิธีการแก้ปัญหาของ gnibbler ดีกว่ามาก (แม้ว่าการแทนที่*..., sep=''ด้วย''.joinจะสวยงามกว่า)

แต่มันค่อนข้างมีประสิทธิภาพในแง่ของการแบ่งงาน / โมดูลัส


1
ทำไมคุณใช้sorted(lst)ทำไมไม่เพียงแค่วางมันตามลำดับที่คุณต้องการเมื่อคุณกำหนดมัน
mbomb007

หรือเรียงลำดับไว้ก่อนที่จะวนซ้ำ lst.sort()
Davidmh


4

Haskell

inp = [(3, "Fizz"), (4, "Jazz"), (5, "Buzz")]

mkList (n, str) = cycle $ replicate (n-1) "" ++ [str]

merge lists = (head =<< lists) : merge (map tail lists)

checkFJB "" n = show n
checkFJB s  _ = s

fjb = zipWith checkFJB (merge $ map mkList inp) [1..]

print100fjb = mapM_ putStrLn $ take 100 fjb

วิธีการแก้ปัญหาอื่นโดยไม่ต้องหารหรือโมดูลัส fjbสร้างรายการ Fizzes, Jazzes, Buzzes และ / หรือตัวเลขที่ไม่มีที่สิ้นสุด takeจำนวนเงินที่คุณต้องการตามที่เห็นprint100fjbซึ่งพิมพ์องค์ประกอบแรก 100


4

SQL (MySQL)

SELECT COALESCE(GROUP_CONCAT(FizzJazzBuzz.str ORDER BY FizzJazzBuzz.n SEPARATOR ''), I.id)
FROM I
    LEFT JOIN (
        SELECT 3 n,'Fizz' str
        UNION SELECT 4, 'Jazz'
        UNION SELECT 5, 'Buzz'
    ) FizzJazzBuzz ON I.id MOD FizzJazzBuzz.n = 0
GROUP BY I.id
ORDER BY I.id;

โดยที่ฉันเป็นตารางที่มีหนึ่งคอลัมน์ (id INT) ที่มีจำนวนเต็ม 100 ตัว

ฉันไม่รู้จักรสชาติ SQL ที่สามารถสร้างตารางที่ฉันง่ายหรือสามารถใช้ VALUES เป็นแบบสอบถามย่อยซึ่งสามารถทำให้ดีขึ้นและสมบูรณ์มากขึ้น


1
คุณสามารถใช้ตัวแปรใน mysql SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
หั่นบาง ๆ

@slicedtoad SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100ก็ใช้ได้เช่นกัน แต่ถ้า 100 เปลี่ยนเป็น 10,000 ทั้งคู่จะเสีย
jimmy23013

1
เพียงเข้าร่วมด้วยตนเองถ้าคุณต้องการแถวมากขึ้น
หั่นบาง ๆ จนถึง

เท่าที่ฉันรู้ MySQL เป็นภาษา SQL เท่านั้นที่ไม่มีตัวเลือกตัวสร้างแถวอย่างง่าย ส่วนใหญ่สามารถใช้นิพจน์ตารางแบบเรียกซ้ำโดยทั่วไป
Ben

@Ben แต่วิธีการเวียนเกิดไม่ได้ดูดีเสมอไป ฉันจะไม่แก้ไขคำตอบของฉันโดยเปลี่ยนภาษาเพราะมีคำตอบของ Oracle SQL อยู่แล้ว
jimmy23013

3

ทับทิม

1.upto(100) do |i|

  rules = { 3 => 'Fizz', 4 => 'Jazz', 5 => 'Buzz' }

  print(i) unless rules.select! { |n,s| i.modulo(n) > 0 or print(s) }

  puts

end

3

JavaScript


อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุด แต่ฉันคิดว่ามันง่ายและน่ารัก <3

(function fizzBuzz(iter){
    var str = '';
    

    if(!(iter % 3)) str += 'Fizz'
    if(!(iter % 4)) str += 'Jazz'
    if(!(iter % 5)) str += 'Buzz'


    console.log(str || iter)


    if(iter >= 100) return

    
    fizzBuzz(++iter)
})(1)


Moar DRY และ effin น่าเกลียด: C

(function fizzBuzz(iter){
    var 
        str,
        fijabu = ['Fi','Ja','Bu']
    ;
    

    (function isMod(_str,val){

        if(!(iter % val)) _str += fijabu[val-3] + 'zz'


        if(val >= 5) return str = _str


        isMod(_str,++val)
    })('',3)


    console.log(str || iter)


    if(iter >= 100) return

    
    fizzBuzz(++iter)
})(1)


8
ทำไมต้องเว้นวรรคสองครั้ง?
Anko

อนุสัญญาส่วนตัว ฉันคิดว่ามันอ่านดีกว่า
soundyogi


ฉันทำมันเฉพาะในโครงการส่วนบุคคลและเพื่อความสนุกสนาน ทีมส่วนใหญ่ไม่ชอบ
soundyogi

2

JavaScript

แห้ง ... ;)

(function FizzJazzBuzz(iter) {
    var output = ["Fi", "Ja", "Bu"];
    var str = "";

    output.map(function(v,i,a) {
        if(!(iter%(i+3))) str += output[i] + "zz";
    });

    console.log(str || iter);

    if(iter < 100) FizzJazzBuzz(++iter);

    return;
})(1);

2

โง่ที่สุด C #

ครึ่งสั้น ๆ ก็คือ 'อย่าทำซ้ำตัวเอง' ดังนั้นฉันก็เลยทำอย่างนั้นเท่าที่ฉันจะทำได้ด้วย C # และมันก็พัฒนาไปสู่การตีกอล์ฟโดยไม่ตั้งใจ นี่คือกอล์ฟครั้งแรกของฉันและฉันทำมันใน C # โง่ฉันรู้ แต่นี่คือผล:

Golfed ( 240 232 230 ตัวอักษร):

namespace System{using Diagnostics;using i=Int32;using s=String;class P{static void Main(){s[] z=new s[]{"Fi","Ja","Bu"};for(i a=1;a<100;a++){s l="";for(i b=3;b<6;b++)if(a%b==0)l+=z[b-3]+"zz";Trace.WriteLine((l!="")?l:a+"");}}}}

Ungolfed:

namespace System
{
   using Diagnostics;
   using i = Int32;
   using s = String;
   class P 
   { 
      static void Main() 
      {
         s[] z = new s[] { "Fi","Ja","Bu" }; 
         for(i a = 1;a < 100;a++) 
         { 
            s l = ""; 
            for(i b = 3;b < 6;b++)
               if(a % b == 0)
                  l += z[b - 3] + "zz"; 
            Trace.WriteLine((l != "") ? l : a+""); 
         } 
      } 
   }
}

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

มีข้อ จำกัด บางอย่างที่นี่:

  • รหัสสันนิษฐานว่าทุกคำจะลงท้ายด้วย 'zz'
  • รหัสสันนิษฐานว่าโมดูลัสจะเกิดขึ้นอย่างต่อเนื่อง (3,4,5,6 ... )
  • รหัสยังคงชอบการขาดหรือเล่นซ้ำมากกว่าการตีกอล์ฟจริงมีการเพิ่มตัวอักษรมากขึ้นเพื่อหลีกเลี่ยงการเล่นซ้ำ

2

Python 2

ฉันต้องการเขียนคำตอบสำหรับเรื่องนี้ใน Python ที่เป็นระเบียบเรียบร้อยซึ่งจะแสดงคุณสมบัติของภาษาให้สอดคล้องกับหลักการ DRY และสามารถอ่านได้อย่างเป็นธรรม

group = range(100)
rules = [('fizz', group[::3]), ('jazz', group[::4]), ('buzz', group[::5])]
for number in group[1:]:
    labelset = ''
    for label, matches in rules:
        if number in matches:
            labelset += label
    print labelset if labelset else number

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


ทำไมไม่ใช้set(group[...])ในกฎ?
gnibbler

ฉันจะไปเพื่อความสง่างามมากกว่าความเร็ว การใช้ set () จะเร็วขึ้นในการใช้งานจริงแน่นอน
Logic Knight

2

Python 2.7, 111 ไบต์

นี่เป็นผลงานชิ้นแรกของฉัน ฉันพยายามใช้เทคนิค codegolfing Python (การสอดแทรกสตริงการเข้าถึงดัชนี tuple แทนif) หากคุณมีข้อเสนอแนะโปรดแบ่งปัน!

for i in range(1,101):
 p=""
 for x in 3,4,5:
  if not(i%x):p+="FJBiauzzzzzz"[x-3::3]
 print((p,i)[not len(p)])

ผลผลิต:

1
2
Fizz
Jazz
Buzz
Fizz
7
Jazz
Fizz
Buzz
11
FizzJazz
13
14
FizzBuzz
Jazz
17
Fizz
19
JazzBuzz
Fizz
22
23
FizzJazz
Buzz
26
Fizz
Jazz
29
FizzBuzz
31
Jazz
Fizz
34
Buzz
FizzJazz
37
38
Fizz
JazzBuzz
41
Fizz
43
Jazz
FizzBuzz
46
47
FizzJazz
49
Buzz
Fizz
Jazz
53
Fizz
Buzz
Jazz
Fizz
58
59
FizzJazzBuzz
61
62
Fizz
Jazz
Buzz
Fizz
67
Jazz
Fizz
Buzz
71
FizzJazz
73
74
FizzBuzz
Jazz
77
Fizz
79
JazzBuzz
Fizz
82
83
FizzJazz
Buzz
86
Fizz
Jazz
89
FizzBuzz
91
Jazz
Fizz
94
Buzz
FizzJazz
97
98
Fizz
JazzBuzz

ฉันยังไม่สามารถใช้หลักการ DRY ได้อย่างเต็มที่เนื่องจากมีสองforลูป อาจมีวิธีที่ชาญฉลาดกว่าที่จะทำ!


ฉันอาจใช้ tuple ในforคำสั่งแรก จะอัปเดตเมื่อฉันสามารถ!
Nepho

โอเคมันทำงานกับตัวแปรสองตัวในลูปเดียวกัน แต่ฉันไปจาก 111 ไบต์เป็น 145: gist.github.com/Neph0/ddc7a5ad04aa083d44af5cab3f90550f
Nepho

1

ไป

FizzJazzBuzzer พร้อมกัน

package main

import (
    "fmt"
    "sort"
    "sync"
)

var hooks map[int]string = map[int]string{
    3: "Fizz",
    4: "Jazz",
    5: "Buzz"}

type candidate struct {
    num     int
    message string
}

func FizzJazzBuzzer(hooks map[int]string) (chan<- int, *sync.WaitGroup) {
    var wg *sync.WaitGroup = new(sync.WaitGroup)
    final := func(c chan candidate) {
        for i := range c {
            if i.message == "" {
                fmt.Println(i.num)
            } else {
                fmt.Println(i.message)
            }
            wg.Done()
        }
    }
    prev := make(chan candidate)
    go final(prev)
    var keys []int = make([]int, 0)
    for k := range hooks {
        keys = append(keys, k)
    }
    sort.Sort(sort.Reverse(sort.IntSlice(keys)))
    for _, mod := range keys {
        c := make(chan candidate)
        s := hooks[mod]
        go (func(in chan candidate, next chan candidate, mod int, s string) {
            for i := range in {
                if i.num%mod == 0 {
                    i.message += s
                }
                next <- i
            }
        })(c, prev, mod, s)
        prev = c
    }
    in := make(chan int)
    go (func(in <-chan int) {
        for i := range in {
            prev <- candidate{i, ""}
        }
    })(in)
    return in, wg
}

func main() {
    in, wg := FizzJazzBuzzer(hooks)
    for i := 1; i < 20; i++ {
        wg.Add(1)
        in <- i
    }
    wg.Wait()
}

ลองที่นี่: http://play.golang.org/p/lxaZF_oOax

ใช้เพียงหนึ่งโมดูลัสต่อการตรวจสอบหมายเลขและสามารถขยายไปยังหมายเลขใด ๆ ก็ได้ ...

คุณต้องทำการเปลี่ยนแปลง 3 สถานที่ต่าง ๆ เพื่อขยายสิ่งนี้ในhooksแผนที่FizzJazzBuzzerชื่อฟังก์ชันและแน่นอนการเรียกใช้FizzJazzBuzzerฟังก์ชัน


1

R

สิ่งนี้จะสร้างฟังก์ชั่นที่อนุญาตให้ผู้ใช้ระบุคู่คำและตัวหาร (และเลือกจำนวนสูงสุดโดยที่ 100 เป็นค่าเริ่มต้น) ฟังก์ชันสร้างเวกเตอร์จาก 1 ถึงจำนวนสูงสุดจากนั้นแทนที่ตัวเลขใด ๆ ที่ตำแหน่ง "fizzbuzz" ด้วย "" และในที่สุดก็วางแต่ละคำที่ตำแหน่งที่ต้องการ ฟังก์ชั่นสั่งซื้อรายการจากหมายเลขต่ำสุดถึงสูงสุดเพื่อให้หมายเลขต่ำสุดจะเป็นส่วนแรกของ "fizzbuzz" เสมอ ตำแหน่งจะถูกคำนวณโดยใช้seqเพื่อสร้างเวกเตอร์เริ่มต้นที่จำนวนที่กำหนดและเพิ่มขึ้นทีละจำนวนนั้นจนกว่าจะถึงจำนวนที่ต้องการสูงสุด

fizzbuzzer = function(max.num=100, ...){

input = list(...)
input = input[order(unlist(input))] #reorder input list by number
words = names(input)

#vector containing the result
output = seq_len(max.num)

#remove numbers at positions to contain a "fizzbuzz"
sapply(input, function(x) output[seq(x, max.num, x)] <<- "")

#add words at required points
sapply(seq_len(length(input)), function(i) output[seq(input[[i]], max.num, input[[i]])] <<- paste0(output[seq(input[[i]], max.num, input[[i]])], words[i]))

return(output)
}    

ฉันไม่คิดว่ามันสวยงามมาก แต่ใช้งานง่ายด้วยพารามิเตอร์ที่แตกต่างกัน

ตัวอย่างการใช้งาน:

fizzbuzzer(fizz=3, buzz=5)
fizzbuzzer(fizz=3, buzz=5, jazz=4)
fizzbuzzer(max.num=10000, golf=10, stack=100, code=1, exchange=1000)

ผลลัพธ์ของfizzbuzzer(fizz=3, buzz=5)คือ:

[1] "1"        "2"        "fizz"     "4"        "buzz"     "fizz"    
[7] "7"        "8"        "fizz"     "buzz"     "11"       "fizz"    
[13] "13"       "14"       "fizzbuzz" "16"       "17"       "fizz"    
[19] "19"       "buzz"     "fizz"     "22"       "23"       "fizz"    
[25] "buzz"     "26"       "fizz"     "28"       "29"       "fizzbuzz"
[31] "31"       "32"       "fizz"     "34"       "buzz"     "fizz"    
[37] "37"       "38"       "fizz"     "buzz"     "41"       "fizz"    
[43] "43"       "44"       "fizzbuzz" "46"       "47"       "fizz"    
[49] "49"       "buzz"     "fizz"     "52"       "53"       "fizz"    
[55] "buzz"     "56"       "fizz"     "58"       "59"       "fizzbuzz"
[61] "61"       "62"       "fizz"     "64"       "buzz"     "fizz"    
[67] "67"       "68"       "fizz"     "buzz"     "71"       "fizz"    
[73] "73"       "74"       "fizzbuzz" "76"       "77"       "fizz"    
[79] "79"       "buzz"     "fizz"     "82"       "83"       "fizz"    
[85] "buzz"     "86"       "fizz"     "88"       "89"       "fizzbuzz"
[91] "91"       "92"       "fizz"     "94"       "buzz"     "fizz"    
[97] "97"       "98"       "fizz"     "buzz"    

(ตัวเลขในวงเล็บเหลี่ยมเป็นดัชนีของเวกเตอร์ที่ฟังก์ชันส่งออก)


1

Haskell

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

-- Don't repeat `transpose` from `Data.List`
import Data.List (transpose)

-- The desired problem
lst = [(3, "Fizz"), (4, "Jazz"), (5, "Buzz")]

-- Map a function over both sides of a tuple.
-- We could also get this from importing Bifunctor (bimap), bit it's not in the core libraries
bimap f g (x, y) = (f x, g y)

-- Make infinite lists with the word occuring only once every n items, starting with the first
fizzify = map (cycle . uncurry take . bimap id (:repeat ""))

-- Reorganize the lists so there's a single infinite list, smash the words together, and drop the first set.
fjb = tail . map concat . transpose . fizzify

-- The following two functions avoid repeating work building the lists
-- Computes the least common multiple of a list of numbers
lcms = foldr lcm 1

-- fjbLcm is just a more efficient version of fjb; they can be used interchangably
fjbLcm lst = cycle . take (lcms . map fst $ lst) . fjb $ lst

-- show the number if there aren't any words
result = zipWith (\x y -> if null x then show y else x) (fjbLcm lst) [1..100]

main = print result

ใส่fjbLcmกับfjbไม่ตรงกับสิ่งเดียวกันกับเลขคณิตไม่ใช้ยกเว้นในและ[1..100]take


นี่เป็นสิ่งเดียวกับโซลูชันของ Nimiซึ่งฉันไม่ได้สังเกตมาก่อน
Cirdec

1

Python2

อัปเดต:เวอร์ชันใหม่ไม่ได้ใช้การดำเนินการดัดแปลงหรือการหารใด ๆ

word_dict = {3: 'Fizz', 4: 'Jazz', 5: 'Buzz'}

def fizz_jazz_buzz(n, d):
    counters = {k: k for k in d}
    for i in xrange(1, n + 1):
        u = ''
        for k in d:
            if counters[k] == i:
                u += d[k]
                counters[k] += k
        print u or i

fizz_jazz_buzz(100, word_dict)

หากคุณต้องการเพิ่มคำอื่นในการทดสอบเพียงแค่ใส่คู่ของคีย์ / ค่าลงในพจนานุกรม word_dict:

word_dict[7] = 'Razz'
fizz_jazz_buzz(100, word_dict)

หากคุณต้องการที่จะกำจัดของคำเพียงลบมัน (ใช้del) ''หรือหรือตั้งค่าให้

del word_dict[3]
fizz_jazz_buzz(100, word_dict)

ดูคำตอบของ Python ของGnibblerและJakubeซึ่งโพสต์ก่อนหน้าฉัน


1

C #

การบำรุงรักษา:เพียงแค่เพิ่มหนึ่งบรรทัดต่อองค์ประกอบที่
ฉันทำซ้ำมากกว่าแต่ละองค์ประกอบในพจนานุกรมเพื่อตรวจสอบว่ามันเป็นตัวหารของตัวเลขปัจจุบันและเพิ่มไปยังสตริงถ้ามันเป็น
เมื่อเสร็จแล้วให้พิมพ์สตริงเว้นแต่ว่ามันจะยังคงเป็นโมฆะ (ใช้ตัวดำเนินการรวมกันเป็นโมฆะ) ซึ่งในกรณีนี้จะพิมพ์ตัวเลขพร้อมกับสตริงว่างเพื่อให้เป็นสตริง (ฉันสามารถใช้ toString แต่ฉันเดาว่าเป็นตัวเลือกส่วนบุคคล)

Dictionary<int, string> dict = new Dictionary<int, string>()
{
    {3, "Fizz"},
    {4, "Jazz"},
    {5, "Buzz"}
};
for (int i = 0; i < 100; i++)
{
    string msg = null;
    foreach (var pair in dict)
        if (i % pair.Key == 0)
            msg += pair.Value;
    Console.WriteLine(msg ?? i + "");
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.