Mirage của người thông minh


29

Ngày xửa ngày xưa, tôi đang đọc câu hỏi / câu trả lời này trên Quora

Có những lập trình viên thực sự có trình độ khoa học máy tính không thể vượt qua bài kiểm tra FizzBuzz

Mã này được đưa ra như là câu trả lời rõ ràng

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

Tất nhiên FizzBuzz đã bị đánh golf đến chết, nhưng đó không phải là câu hỏi này. Bạn thấy, trong các bình luận, có người đề cập rằng câu trả lời rõ ràng này rất hay vì dễ dàng thêm các điều kiện bổ sung như in "Jazz" cho bội số của 4. (Tôi không đồng ý. Mở rộng chương trình này yêu cầu O (2 ** n ) dòng mã.)

Thử thách của bạn là viết phiên bản FizzJazzBuzz đẹp nhất theo đánh giá của các đồng nghiệp.

Một số điều để cử tri xem xét:

  1. KHÔ
  2. Hiệu quả của các hoạt động phân chia / mô đun

Nhiều câu trả lời trên Quora đã sử dụng Python, nhưng không có giới hạn ngôn ngữ như vậy ở đây.

Tôi sẽ chấp nhận câu trả lời có nhiều phiếu nhất một tháng kể từ bây giờ

Đầu ra mẫu:

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
Điểm đạn thứ hai của bạn hơi mơ hồ ... Điều gì làm cho một bộ phận hiệu quả? Tại sao điều đó quan trọng cho thử thách?
Sanchise

@sanchise, vẫn tồn tại các nền tảng, đặc biệt là vi điều khiển, có các hoạt động phân chia rất tốn kém (theo chu kỳ / thời gian). Ít nhất một trong những câu trả lời dưới đây tránh sự phân chia / mô đun hoàn toàn - nhưng có thể làm tổn thương khả năng đọc. Đó là một cái gì đó để cử tri xem xét.
gnibbler

1
@sanchises không mơ hồ chút nào IMHO điểm không sử dụng phép chia / mô đun. Bạn có thể làm điều đó chỉ bằng cách giữ một biến cho mỗi n = (3,4,5 ...) và đặt lại nó tại thời điểm nó không khớp và in một từ và tăng dần khi không. Phần Dry có thể thực hiện chức năng / phương thức nhận (n, word) và do đó "bảo trì" thêm nhiều từ một cách dễ dàng
jean


Câu trả lời:


101

Phiên bản đẹp nhất, bạn nói gì? Sau đó, hãy thử cái này trong ...

Ngôn ngữ lập trình Shakespeare

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]

Vì vậy, sau cuộc đấu tranh của tôi với SPL ở đây , tôi cảm thấy như mình phải thực hiện ít nhất một lần đệ trình với nó trong bất kỳ thử thách nào. Và đây là nó.

Vì vậy, những gì sau đó tất cả?

Vì vậy, trước tiên, chúng tôi tuyên bố các biến chúng tôi sẽ sử dụng trong suốt chương trình, phải xuất phát từ các vở kịch của Shakespeare. Chán ngấy Romeo, Juliet, Ophelia và Othello, tôi đã đi lên với Tổng Giám mục CanterburyLady Capulet . Các mô tả của họ, cũng như các tiêu đề của Công vụ / Cảnh, bị người phân tích cú pháp coi thường, vì vậy bạn có thể đặt ở đó khá nhiều thứ bạn thích.

Vì vậy, chúng ta hãy làm cho một số vua dịch sang một cái gì đó ít nói lắp bắp hơn .

Act I, Cảnh I

Begin Lady Capulet = 0;

Act I khá đơn giản: chúng tôi khởi tạo biến của mình bằng 0.

Act I, Cảnh II

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

Chúng tôi tăng giá trị của Lady Capulet và so sánh nó với 100 (vâng, toàn bộ câu đó chỉ phục vụ để lấy số 100); nếu nó không nhỏ hơn, chúng ta nhảy đến Cảnh VIII (phần cuối); mặt khác, chúng ta tiếp tục đến Cảnh tiếp theo.

Act I, Cảnh 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);

Đầu tiên, chúng ta thấy nếu mô-đun chia cho 3 là 0; nếu không, chúng ta nhảy sang Cảnh IV; nếu đúng như vậy, chúng ta bắt đầu thực hiện các phép toán số học và lưu trữ chúng trên Archieperson, xuất chúng dưới dạng ký tự một khi chúng ta tìm thấy thứ chúng ta đang tìm kiếm. Vâng, cuối cùng, ý tưởng là để có được Fizz.

Act I, Cảnh IV

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

Đầu tiên kiểm tra xem mô-đun của phép chia bằng 4 có bằng 0 không, sau đó tiếp tục như cảnh trước đó, cho Jazz.

Act I, Cảnh 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;

Các chức năng như hai phần trước, kiểm tra xem mô đun của phép chia 5 có trả về 0 không, sau đó thử viết Buzz; sự khác biệt duy nhất là, cuối cùng, chúng ta bỏ qua một Cảnh.

Act I, Cảnh VI

System.out.print(Lady Capulet);

Để đạt được Cảnh này, số được giả định bởi Lady Capulet không phải là Fizz hay Jazz hay Buzz; vì vậy, chúng tôi xuất nó dưới dạng số.

Act I, Cảnh 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;

Vì vậy, đây là cách duy nhất tôi tìm thấy để nhảy sang dòng tiếp theo: đầu ra, đầu tiên, CR, sau đó là LF; sau đó, chúng tôi trở lại Cảnh II, để chúng tôi có thể tiếp tục với chương trình.

Act I, Cảnh VIII

End.

Nói thẳng là đủ.

Tôi vẫn đang cố gắng xem liệu tôi có thể hiển thị chương trình này đang chạy trực tuyến hay không, nhưng tôi không thể tìm thấy trình biên dịch trực tuyến - chương trình tôi biết dường như không kết hợp tốt với bất kỳ chương trình nào ngoại trừ chương trình đã được tải, hoặc có thể có một số loại vấn đề với giao diện giữa bàn phím và ghế ...

Cập nhật 1:

Sau lời nhận xét của mathmandan, tôi đã chỉnh sửa thứ tự các cảnh của Jazz và Buzz. Nó phải được thực hiện.


1
Có vẻ như tôi có vấn đề về DNS. Xin lỗi cho các báo động giả.
Rainbolt

17
Người ta tự hỏi tại sao Shakespeare không bao giờ bị đánh gôn.
Chiếm

5
Tôi đã hy vọng rằng Cảnh III, IV và V sẽ tương ứng với Fizz, Jazz và Buzz. Tuy nhiên, được thực hiện đẹp!
mathmandan

1
@mathmandan Chết tiệt. Thật là một cơ hội lãng phí để làm một cái gì đó tuyệt vời. CHỈ TRÍCH!!
Rodolfo Dias

1
Nó là tuyệt vời, nhưng tôi dường như đã nhận thấy một lỗi. Tôi nghĩ rằng nó xuất ra số nếu đó không phải là Buzz, bất kể đó là Fizz hay Jazz. Tôi đã không chạy nó, nhưng dường như tôi không thể tìm thấy kiểm tra cho việc này. Có lẽ bạn có thể kiểm tra cuối cùng nếu Tổng Giám mục là một zvà đặt lại anh ta trước mỗi vòng lặp.
chiến lược

45

> <> (Cá)

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           <                    /

> <> là ngôn ngữ lập trình 2D trong đó các lệnh là ký tự đơn và con trỏ lệnh (IP) có thể di chuyển lên, xuống, sang trái hoặc phải, tùy thuộc vào mũi tên ^>v<và gương /\. Nó không có biến hoặc chuỗi nên việc không lặp lại chính mình khó hơn một chút, nhưng tôi nghĩ nó tốt theo cách riêng của nó.

Chúng tôi đẩy 1và bắt đầu vòng lặp. :9b*)?;kiểm tra xem số đó có lớn hơn 99 ( 9b* = 9*11) không và nếu có thì chương trình sẽ dừng lại ;. Nếu không, đặt 0 vào thanh ghi và di chuyển xuống vphần lượn sóng.

:3%?kiểm tra số modulo 3. Nếu nó khác 0, thì chúng ta đi xuống vmột hàng và di chuyển sang trái <. Mặt khác, chúng ta bỏ qua mũi tên xuống và đẩy "Fizz", in nó ( r}oooo) và tăng thanh ghi ( &1+&) trước khi bật ra khỏi gương tường bên phải để đi xuống một hàng. Dù bằng cách nào, chúng ta cuối cùng di chuyển sang trái dọc theo hàng thứ ba, cho đến khi chúng ta bật ra khỏi gương tường bên trái. Sau đó, chúng tôi lặp lại cho JazzBuzz.

Điều này tiếp tục cho đến dòng thứ 7, kiểm tra &giá trị của thanh ghi. Nếu nó khác, thì chúng ta sẽ đi xuống. Nếu không, chúng tôi tự in số ntrước khi đi xuống.

Cuối cùng, ao(hãy nhớ rằng chúng ta đang di chuyển sang trái ngay bây giờ!) In một dòng mới ASCII và 1+tăng số, trước khi chúng ta đi lên ^và thực hiện lại vòng lặp >.

(Bây giờ chúng tôi chờ câu trả lời thẩm mỹ của Piet ...)


3
Thật là đẹp Điều này sẽ đi vào hội trường của sự nổi tiếng cho> <> câu trả lời.
Joshpbarron

2
Mắt tôi lập tức nhảy lên: 3.
EMBLEM

Chà, ngôn ngữ đó sẽ không giành được bất kỳ giải thưởng dễ đọc nào, nhưng nó khá gọn gàng.
William T Froggard

40

LOLCODE

Thanh lịch? Không. Hiệu quả? Chắc chắn không phải. Đẹp? Vâng, bạn biết những gì họ nói: vẻ đẹp là trong mắt của kẻ si tình.

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

Một số giải thích:

Các chương trình LOLCODE bắt đầu HAIvà kết thúc bằng KTHXBYE.

Các biến được gõ động và được chỉ định sử dụng I HAS A <variable> ITZ <value>. Sau khi xác định, các biến cũng có thể được chỉ định bằng cách sử dụng <variable> R <value>.

Vòng lặp trong LOLCODE được đặt tên. Cú pháp là:

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

Đây chỉ là Internet nói cho "vòng lặp cho đến khi i = end". Trong LOLCODE 1.2, biến lập chỉ mục cần được khởi tạo trước vòng lặp. Ở đây, vòng lặp được đặt tên là "house" bởi vì nó làm cho việc đọc khởi tạo vòng lặp nghe có vẻ hài hước.

VISIBLEin ra thiết bị xuất chuẩn. Theo mặc định, một dòng mới được nối thêm, nhưng việc thêm !ngăn chặn dòng mới.

Các điều kiện được quy định như sau:

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

Các điều kiện phải là biểu thức đánh giá giá trị boolean hoặc boolean. Trong LOLCODE, loại boolean được gọi TROOFvà nó có các giá trị WIN(true) và FAIL(false).

Nhận xét một dòng bắt đầu bằng BTW.

Không thành thạo ngôn ngữ của Internetz? Chỉ cần cho tôi biết và tôi sẽ vui vẻ cung cấp giải thích thêm.


3
Tuyệt quá. Điều này thật phi thường. Tôi vẫn đang cười
rpax

@rpax: Tuyệt vời ... Tất cả đều diễn ra theo kế hoạch ...
Alex 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='')

Trong số các câu trả lời hàng đầu hiện tại, đây là câu trả lời duy nhất có bất kỳ hình thức nàoEfficiency of division/modulus operations
từ

@aross Ý bạn là gì? Tất cả các câu trả lời tôi đã thấy sử dụng nhiều nhất là cùng một số phép toán chia / mô đun như bài toán này.
Hjulle 15/03/2015

Có thật không? Tất cả các câu trả lời khác sử dụng một toán tử mô đun cho mỗi (3, 4, 5). Đó là ba lần nhân đôi. Đây là câu trả lời hàng đầu duy nhất chỉ có một toán tử mô đun duy nhất.
vào

1
Tôi chỉ đọc những bình luận về câu hỏi. Tôi đoán tôi đã giải thích sai câu trích dẫn. Nên đã đề cập DRYthay thế. Hơn nữa, câu trả lời này được sáng tác bởi OP.
vào

31

Thành phố

Cái nhìn lớn hơn"Nguồn" thực tế

Tôi quyết định thử và chơi với Piet và xem tôi có thể tạo ra một mã đẹp đến mức nào. Tôi cố gắng không lặp lại bất cứ điều gì ở đây, mặc dù thành thật mà nói tôi phải lặp lại các tính toán mod. Tuy nhiên, mỗi mod riêng biệt (n% 3, n% 4 và n% 5) chỉ được chạy một lần cho mỗi lần lặp mã.

Hình ảnh nhỏ hơn là nguồn thích hợp và có thể được tải lên và chạy ở đây .

Thưởng thức!


4
"Có những lập trình viên thực sự có trình độ khoa học máy tính không thể vượt qua bài kiểm tra FizzBuzz ở Piet không?"
Sanchise

26

Toán học

Trong Mathematica bạn có thể định nghĩa và nạp chồng các hàm cho các tham số rất cụ thể (không chỉ theo loại, mà còn bởi các điều kiện logic tùy ý). Hãy xác định một vài chức năng:

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

Và bây giờ chương trình thực tế chỉ là

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

Bây giờ, mặc dù ở trên chỉ phát triển tuyến tính với số lượng ước, nhưng nó vẫn không RẤT NHIỀU. Nhưng chúng ta thực sự có thể sử dụng các biến làm tên trong các định nghĩa này. Vì vậy, chúng ta thực sự có thể viết một hàm tạo ra các định nghĩa hàm này:

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

Bây giờ tất cả những gì bạn phải làm là thêm một addFunctioncuộc gọi khác và thêm cuộc gọi mới của bạn **zzvào dòng cuối cùng.


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

10
Nó chỉ là một JMPbên trái!
MikeTheLiar

"Tất cả những gì bạn phải làm là thêm một lệnh gọi addFactor khác." ... và thêm chức năng mới vào dòng cuối cùng?
Sparr

@Sparr oh yeah đúng vậy
Martin Ender

22

Haskell

Các bạn không nghiêm túc với DRY. Có những mô hình rõ ràng có thể được đưa ra trong chuỗi "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. ;)

Mã này cũng dễ dàng mở rộng. Để giải quyết vấn đề "Fizz Jazz Buzz Tizz", tất cả những gì bạn cần làm là thêm Tivào sau Buchuỗi. Điều này ít hơn nhiều so với những gì cần thiết trong bất kỳ giải pháp nào khác.


5
Điều gì sẽ xảy ra nếu bạn phải giải quyết vấn đề Fizz-Jazz-Buzz-Xúc xích?
Anko

@Anko Tôi có thể làm một cái gì đó như thế này fizzes = zip [3..] $ ((++ replicate 2 'z') <$> words "Fi Ja Bu") ++ ["Sausage"], hoặc chỉ trở lại fizzes = zip [3..] $ words "Fizz Jazz Buzz Sausage".
Hjulle

3
replicate 2 zđang kéo dài nó một chút. . .
Soham Chowdhury

3
@octatoan Tôi không thể cưỡng lại. ;)
Hjulle

16

VBA Excel

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

Nghe có vẻ ngu ngốc, nhưng đó là súng bắn tỉa 2D!


Một nửa của nó.!!!!
Tối ưu hóa

2
Ngoài ra, điều này thật buồn cười - "Nếu bạn ở chế độ 3"
Trình tối ưu hóa

Cảm ơn bạn!! Tôi không mong đợi ai đó nhận ra phần 3 của chế độ u nhanh đến vậy
Alex

Tôi không hiểu tại sao một nửa!
Alex

Sniper chỉ là một nửa. Phạm vi thường ở giữa bắn tỉa.
Tối ưu hóa

15

Java

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

Vì vậy, hầu hết Java không được coi là "đẹp", nhưng đó là sự chủ quan điên rồ nên tôi đã làm theo hướng dẫn trong câu hỏi:

  • Đừng lặp lại chính mình: Không vấn đề gì. Bạn chỉ cần thêm một dòng cho mỗi số. Tôi thậm chí đã tạo một hàm trợ giúp để bạn không phải gõ nhiều khi bạn làm (Java đôi khi có thể hơi dài dòng, nếu bạn không biết).
  • Hiệu quả của các hoạt động phân chia / mô đun: Hiệu quả hoàn hảo, vì không có mô đun hoặc phân chia nào cả.

Điều đó không có nghĩa là thuật toán nói chung là hiệu quả nhất (không phải vậy), nhưng tôi nghĩ rằng nó đạt điểm cao.


2
Sẽ không phải là Java nếu bạn không định nghĩa một lớp. : D
Adrian Leonhard

Tôi muốn thích một câu trả lời Java và tôi thích cách tiếp cận này, nhưng tôi cảm thấy việc nhúng mã vào các câu lệnh for là không cần thiết. Java đẹp là Java dễ đọc!
Alex Pritchard

@AlexPritchard Tôi cho rằng đó là tác dụng phụ của việc đánh gôn. Sẽ khắc phục khi ở PC :)
Geobits 8/03/2015

11

Thông báo 7

Thông tin 7 là một ngôn ngữ lập trình dựa trên quy tắc được thiết kế cho tiểu thuyết tương tác. Điều đáng chú ý là một trong những ngôn ngữ lập trình dựa trên ngôn ngữ tự nhiên thành công nhất. Xem phần giới thiệu ngôn ngữ Inform 7 để biết các ví dụ khác và một vài câu đố nhỏ.

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;

Mã này có lợi thế là mỗi quy tắc FizzBuzz hoàn toàn độc lập: các quy tắc bổ sung có thể được thêm vào bất kỳ lúc nào mà không cần thay đổi khung chung. Thật không may, nó là một chút lặp đi lặp lại, đặc biệt là với các cụm từ định nghĩa. Tôi có thể định nghĩa toán tử%, nhưng sau đó sẽ không phải là tiếng Anh. ;)

Mã này có thể được chạy trực tuyến bằng Playfic .


7

Thuốc nhuộm 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: không có mã kép
  • Dễ dàng thay đổi điều kiện: các tên được lấy từ một danh sách, theo thứ tự, theo ước số, với sự thay đổi tối thiểu cần thiết
  • Dễ dàng thay đổi phạm vi: itemscó thể thay đổi thành một danh sách các số tùy ý
  • Hiệu quả: sử dụng thuật toán dựa trên danh sách song song dễ dàng chỉ bao gồm các nguyên hàm tự do tác dụng phụ.
  • Simple dòng mã: không chỉ là không có goto s, không có trong khi s hoặc nếu s một trong hai. Mã này là hoàn toàn tuyến tính.
  • Đảm bảo công việc của bạn: hầu như không ai khác có thể làm việc với nó ...

Các giá trị của ⎕MLvà là ⎕IOgì?
FUZxxl

Họ là cả hai 1, đó là mặc định.
bến tàu

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

Kiểm tra mod, xây dựng chuỗi, in số nếu trống hoặc chuỗi nếu không. Không lặp lại. Chỉ cần thêm điều kiện & đầu ra cho các yêu cầu mới.


2
"Không lặp lại"? (OK, ít nhất là kích thước mã tăng trưởng tuyến tính với các từ bổ sung.)
Anko

Tôi đã thực hiện thử thách không lặp lại thêm một chút với câu trả lời C # của mình, nhưng đã hy sinh bất kỳ sự linh hoạt nào khi nói đến con số nào để điều chỉnh. Tôi nghĩ rằng kết quả tốt nhất sẽ là một cơ sở hạ tầng liên quan đến số lượng và từ.
sydan

@Anko Không chắc chắn những gì bạn đang nhận được, không có chức năng được lặp lại. Tôi không làm điều tương tự hai lần ở bất cứ đâu trong mã.
rapjr11

@ rapjr11 Mã kiểm tra i- một cái gì đó %nhiều lần, cũng như nối thêm snhiều lần. (Rất nhiều cú pháp cũng lặp đi lặp lại, nhưng đó có thể là lỗi của C #.)
Anko

7

Python 2.7

Tôi đã cố gắng làm cho nó trở nên thi vị ...

Tôi không giỏi làm thơ tình ...

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. 

Nó cũng sẽ tốt hơn rất nhiều nếu không có các hằng số ban đầu: P


Sáng tạo, nhưng điều này không chạy với tôi trong Python 2.7.9. Nó nói : TypeError: 'str' object is not callable.
Alex A.

Hmmmm ... Chết tiệt ... Không hoàn toàn chắc chắn tôi đã bỏ lỡ điều đó như thế nào: /
JamJar00 18/03/2015

5

Java với các lớp

Thuật toán:

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

}

Các lớp học:

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, bạn đã thực sự nắm bắt được tinh thần của mã hóa Java với FizzBuzzJazz 70 dòng này. Nó hướng đối tượng và được viết theo phong cách rõ ràng, không viết tắt, dễ đọc. Rất dài. Nhưng rất dễ đọc. ; ^)
DLosc

4

MATLAB / Octave

Tất nhiên, viết các vòng lặp của riêng bạn là niềm vui cho các lập trình viên, nhưng mọi người đều biết việc theo dõi lập chỉ mục thực sự tẻ nhạt như thế nào (người chưa viết for(j=i;j<n;i++) trong một vòng lặp lồng nhau ít nhất một lần trong đời?)

MATLAB có giải pháp. Thực sự, mã này không phải là mã hiệu quả nhất và chắc chắn không phải là mã, nhưng tất cả đều là một cách thể hiện tốt các chức năng thú vị hơn của MATLAB. Octave là phiên bản GNU của MATLAB; tuy nhiên nó không phù hợp với môn đánh gôn vì nó hơi nghiêm ngặt hơn với các loại biến khác nhau, gây bất lợi cho môn đánh gôn.

EDIT: cho đến khi đánh dấu cú pháp cho MATLAB tồn tại trên SE, tôi đang đăng một phiên bản với rất ít bình luận, bởi vì nó chỉ là một khối văn bản đơn giản đáng sợ.

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++)? Câu hỏi của tôi là: ai đã viết điều này "ít nhất một lần trong đời"? Nếu bạn đã làm, tôi có tin xấu mới cho bạn ...
Bogdan Alexandru

1
@BogdanAlexandru Bạn chưa bao giờ trong đời vô tình tăng sai biến trong một forvòng lặp (ví dụ như khi các vòng lặp lồng nhau)? Bạn có phải là người có mã biên dịch thành công mỗi lần đầu tiên? Nếu là bạn, tôi có tin thần cho bạn ...
Sanchise

2
Tôi không nói về việc tăng sai biến, mã của tôi không được viết bằng thần. Tôi đang nói về phong cách mã hóa đó, bản thân nó rất dễ bị lỗi. Các jtên cho một biến địa phương vòng lặp là tốt, nhưng itên là thực tế rất xấu và đó là nguồn gốc của sai lầm của bạn. Nó không hoàn toàn vô tình :)
Bogdan Alexandru

@BogdanAlexandru À đúng rồi, tôi khá đồng ý; lý do tôi vẫn sử dụng kiểu vòng lặp này là khi thực hiện các bài tập đã cho (Tôi là sinh viên thạc sĩ); Tôi thà sử dụng ký hiệu chỉ số được sử dụng bởi giáo sư trong câu hỏi, hơn là gây nhầm lẫn cho ông già nghèo bằng cách sử dụng của riêng tôi.
Sanchise 7/03/2015

1
Không có vấn đề gì khi đặt một tên chữ cái cho các chỉ mục của một vòng lặp, nhưng các biến khác sẽ có tên có ý nghĩa hơn.
Bogdan Alexandru

4

Con trăn

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)

Điều này tất nhiên là quá dài. giải pháp của gnibbler's tốt hơn nhiều. (mặc dù thay thế *..., sep=''bằng''.join sẽ đẹp hơn)

Nhưng điều này là khá hiệu quả về mặt hoạt động phân chia / mô đun.


1
Tại sao bạn sử dụng sorted(lst), tại sao không đặt nó theo thứ tự bạn cần khi bạn xác định nó?
mbomb007

Hoặc sắp xếp nó vào vị trí trước vòng lặp. lst.sort()
Davidmh

4

Hồng ngọc

100.times do |n|
  l = [nil, 'Fizz', 'Jazz', 'Buzz'].select.with_index{|x, i| x && (n % (i+2)) == 0 }
  puts l.empty? ? n : l * ''
end

Hình như đây là bội số của 2,3 và 4?
gnibbler

@gnibbler Rất tiếc, đúng vậy. Đã sửa.
Doorknob

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

Một giải pháp khác mà không cần phân chia hoặc mô đun. fjbtạo một danh sách vô tận các Fizzes, Jazzes, Buzzes và / hoặc số. takebất kỳ số tiền nào bạn muốn, như đã thấy trong print100fjbđó in 100 phần tử đầu tiên.


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;

trong đó tôi là một bảng có một cột (id INT) chứa 100 số nguyên.

Tôi không biết hương vị SQL có thể tạo bảng tôi dễ dàng hoặc có thể sử dụng GIÁ TRỊ làm truy vấn con, điều này có thể làm cho nó tốt hơn và đầy đủ hơn.


1
Bạn có thể sử dụng các biến trong mysql. SELECT @i:= (@i + 1) FROM mysql.help_relation, (SELECT @i:=0) v WHERE @i < 100;
sledtoad 6/03/2015

@slicedtoad SELECT DISTINCT help_keyword_id FROM mysql.help_relation WHERE help_keyword_id>0 AND help_keyword_id<=100cũng hoạt động. Nhưng nếu 100 được đổi thành 10000, cả hai sẽ bị hỏng.
jimmy23013

1
Chỉ cần tự tham gia nếu bạn cần nhiều hàng hơn.
sledtoad 7/03/2015

Theo như tôi biết thì MySQL là phương ngữ SQL duy nhất không có tùy chọn tạo hàng dễ dàng. Hầu hết chỉ có thể sử dụng một biểu thức bảng đệ quy chung.
Ben

@Ben Nhưng cách đệ quy không phải lúc nào cũng tốt. Tôi sẽ không sửa câu trả lời của mình bằng cách thay đổi phương ngữ vì đã có câu trả lời của SQL SQL.
jimmy23013

3

Hồng ngọc

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


Có lẽ không phải là cách hiệu quả nhất, nhưng tôi nghĩ nó đơn giản và đẹp <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 và effin xấu xí: 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
Tại sao khoảng cách đôi?
Anko

Công ước cá nhân. Tôi nghĩ nó đẹp hơn để đọc.
soundyogi 10/03/2015


Tôi làm điều đó chỉ trong các dự án cá nhân và cho vui. Hầu hết các đội không thích nó.
soundyogi

2

JavaScript

DRYish ...;)

(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

Hoàn toàn ngu ngốc C #

Một nửa tóm tắt là 'ĐỪNG SỬA CHỮA CỦA BẠN' vì vậy tôi đã hiểu điều đó theo nghĩa đen nhất có thể với C # và điều đó đã vô tình tiến tới việc đánh gôn. Đây là môn đánh gôn đầu tiên của tôi và tôi đã làm nó trong C #, thật ngu ngốc tôi biết nhưng đây là kết quả:

Chơi gôn ( 240 232 230 ký tự):

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

Ung dung:

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

Mục đích là để rút ngắn bất kỳ thứ gì tôi phải sử dụng nhiều hơn một lần và nói chung để giữ mã ngắn trong khi tạo ra một chương trình C # hoàn chỉnh. Đối với điều này, bạn sẽ cần sử dụng VisualStudio và đặt đối tượng StartUp thành 'P', bạn cũng sẽ cần tìm đầu ra trong cửa sổ đầu ra gỡ lỗi.

Có một số hạn chế nghiêm trọng ở đây:

  • Mã này giả định rằng tất cả các từ sẽ kết thúc bằng 'zz'
  • Mã này giả định rằng mô đun sẽ xảy ra liên tiếp (3,4,5,6 ...)
  • Mã vẫn ủng hộ việc thiếu hoặc lặp lại so với việc đánh gôn thực sự, thêm nhiều ký tự để tránh một số lần lặp lại

2

Con trăn 2

Tôi muốn viết một câu trả lời cho điều này bằng một số Python gọn gàng sẽ thể hiện các tính năng của ngôn ngữ, tuân thủ nguyên tắc DRY và khá dễ đọc.

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

Ví dụ nhỏ này cho thấy cắt lát, intoán tử và cú pháp ternary dài dòng nhưng dễ hiểu. Nó hoàn toàn không sử dụng toán tử modulo. Nó không được thiết kế để đạt hiệu quả trong thời gian chạy, nhưng đó không phải là mục tiêu. Nó được thiết kế ngắn gọn, dễ hiểu và có thể bảo trì.


Tại sao không sử dụng set(group[...])trong các quy tắc?
gnibbler 11/03/2015

Tôi đã đi cho sự thanh lịch hơn là tốc độ. Tất nhiên, sử dụng set () sẽ nhanh hơn trong các ứng dụng thực tế.
Hiệp sĩ logic

2

Python 2.7, 111 byte

Đây là đóng góp đầu tiên của tôi. Tôi đã thử áp dụng một số thủ thuật mã hóa Python (chuỗi xen kẽ, truy cập chỉ mục tuple thay vì if). Nếu bạn có bất kỳ đề nghị, xin vui lòng chia sẻ chúng!

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

Đầu ra:

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

Tôi cũng không thể áp dụng đầy đủ nguyên tắc DRY, vì có hai forvòng. Có lẽ có một cách thông minh hơn để làm điều đó!


Tôi có lẽ cũng có thể sử dụng một tuple trong forcâu lệnh đầu tiên . Sẽ cập nhật khi tôi có thể!
Nepho

Được rồi, do đó, nó hoạt động với hai biến trong cùng một vòng lặp, nhưng tôi đi từ 111 byte đến 145: gist.github.com/Neph0/ddc7a5ad04aa083d44af5cab3f90550f
Nepho

1

Đi

FizzJazzBuzzer đồng thời

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()
}

Dùng thử tại đây: http://play.golang.org/p/lxaZF_oOax

Nó chỉ sử dụng một mô-đun cho mỗi số được kiểm tra và có thể được mở rộng tùy ý thành bất kỳ số nào, cũng ... số.

Bạn chỉ phải thực hiện thay đổi 3 địa điểm khác nhau để mở rộng điều này, trong hooksbản đồ, FizzJazzBuzzertên hàm và tất nhiên là gọi đến FizzJazzBuzzerhàm.


1

R

Điều này tạo ra một chức năng cho phép người dùng chỉ định các cặp từ và ước số (và tùy chọn một số lượng tối đa, với 100 là mặc định). Hàm tạo một vectơ từ 1 đến số tối đa, sau đó thay thế bất kỳ số nào tại các vị trí "fizzbuzz" bằng "", và cuối cùng dán từng từ ở vị trí mong muốn. Hàm sắp xếp danh sách từ số thấp nhất đến số cao nhất để số thấp nhất sẽ luôn là phần đầu tiên của "fizzbuzz". Các vị trí được tính toán bằng cách sử dụng seqđể tạo một vectơ bắt đầu từ một số đã cho và tăng dần theo số đó cho đến khi đạt được số lượng tối đa mong muốn.

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

Tôi không nghĩ nó rất đẹp, nhưng nó dễ sử dụng lại với các thông số khác nhau.

ví dụ sử dụng:

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

Đầu ra của fizzbuzzer(fizz=3, buzz=5)là:

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

(các số trong ngoặc vuông là chỉ số của vectơ đầu ra của hàm)


1

Haskell

Không có số học mô-đun được sử dụng, ngoại trừ trong tính toán bội số ít phổ biến nhất để tránh lặp lại các công việc không cần thiết. Việc nối chuỗi chỉ cần được thực hiện 60 lần, bất kể chúng ta đặt giới hạn trên là gì.

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

Thay thế fjbLcmbằng fjbchính xác điều tương tự, không có số học được sử dụng ngoại trừ trong [1..100]take.


Điều này về cơ bản giống như giải pháp của Nimi , điều mà trước đây tôi không nhận thấy.
Cirdec

1

Python2

Cập nhật: Phiên bản mới không sử dụng bất kỳ hoạt động mod hoặc phân chia.

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)

Nếu bạn muốn thêm một từ khác vào bài kiểm tra, chỉ cần ném cặp khóa / giá trị vào từ điển word_dict:

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

Nếu bạn muốn loại bỏ một từ, chỉ cần xóa nó (sử dụng del) hoặc đặt từ đó thành ''.

del word_dict[3]
fizz_jazz_buzz(100, word_dict)

Xem thêm câu trả lời Python của GnibblerJakube , được đăng trước tôi.


1

C #

Khả năng bảo trì: Chỉ cần thêm một dòng cho mỗi phần tử
tôi lặp qua từng phần tử trong từ điển, để kiểm tra xem đó có phải là số chia của số hiện tại không và thêm vào chuỗi nếu có.
Sau khi hoàn tất, hãy in chuỗi, trừ khi nó vẫn là null (sử dụng toán tử hợp nhất null), trong trường hợp này in số cộng với một chuỗi rỗng để biến nó thành một chuỗi. (Tôi có thể sử dụng toString, nhưng tôi đoán đó là lựa chọn cá nhân)

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