30/09/2018, 16:25

FizzBuzz: nấc thang lên thiên đường của lập trình viên

VinaCode – 28 Jan 15

FizzBuzz: nấc thang lên thiên đường của lập trình viên

Bài viết được dịch từ blog Coding Horror Lời bàn của Vinacode: Sau khi Jeff Atwood viết bài “Tại sao nhiều lập trình viên lại không biết… code” thì đã tạo ra một “làn sóng” …


Sau khi Jeff Atwood viết bài “Tại sao nhiều lập trình viên lại không biết… code” thì đã tạo ra một “làn sóng” tranh luận tại chính blog Coding Horror và trên các mạng xã hội như Digg, và Reddit. Đã có hàng ngàn giải pháp được viết ra cho bài toán FizzBuzz, trong đó có rất nhiều phần code được viết rất vội vàng nhằm chứng tỏ khả năng của mình. Còn quan điểm của Jeff thì sao?

Bạn hãy đọc tiếp bài viết ở đây nhé: http://bit.ly/1DeWdAP

viết 18:39 ngày 30/09/2018

Bài toán FizzBuzz đơn giản nhưng là nấc thang đầu để học TDD và refactor code.

Nguyễn Minh Dũng viết 18:37 ngày 30/09/2018

Update cái đề bài

Write a program that prints the integers from 1 to 100.
But for multiples of three print “Fizz” instead of the number, and for the multiples of five print “Buzz”.
For numbers which are multiples of both three and five print “FizzBuzz”.

Bài này dễ, nhưng mà hay Thực ra Đạt dính trap bài này. Hôm trước ngồi code tay thì Đạt nghĩ và viết ra ngay như thế này

for(int i = 1; i <= 100; ++i) {
    if ( i % 3 == 0) {
        if ( i % 5 == 0 )
            printf("FizzBuzz\n");
        else
            printf("Fizz\n");
    } else if ( i % 5 == 0 ) {
        printf("Buzz\n");
    } else {
        printf("%d\n", i);
    }
}

Nhưng thực tế đây là cách giải tồi, bởi vì đây là một bài toán đơn giản. Nhưng giải thuật lại phức tạp một cách không cần thiết.

Như thế này cũng giải quyết được vấn đề, mà code đơn giản hơn nhiều.

for(int i = 1; i <= 100; ++i) {
    if (i % 3 == 0 && i % 5 == 0) {
        printf("FizzBuzz\n");
    } else if ( i % 3 == 0 ) {
        printf("Fizz\n");
    } else if ( i % 5 == 0 ) {
        printf("Buzz\n");
    } else {
        printf("%d\n", i);
    }
}

good is better than best

Khiem Nguyen viết 18:36 ngày 30/09/2018

đồn rằng ai mà luyện đc hết đống mã FizzBuzz này sẽ được tôn làm code lâm cao thủ

http://rosettacode.org/wiki/FizzBuzz

Tran Huan viết 18:42 ngày 30/09/2018

Tạm thời nghĩ ra như vầy, đủ ngon lành chưa anh em

#include <iostream> 
#include <sstream>

using namespace std;

int main()
{
	for (int i = 1; i <= 100; ++i)
	{
		stringstream s;
		
		if (i % 3 == 0)
			s << "Fizz";
		if (i % 5 == 0)
			s << "Buzz";
		
		if (s.str().empty())
			s << i;

			cout << s.str() << endl;
		}

		return 0;
}

Thành Phạm viết 18:27 ngày 30/09/2018

OMG

 print '\n'.join("Fizz"*(i%3==0)+"Buzz"*(i%5==0) for i in xrange(1,101)) 

Code của Bác Gnouc Python VIệt Nam

Nguyễn Minh Dũng viết 18:36 ngày 30/09/2018

Update, như vầy gọn hơn

for(int i = 1; i <= 100; ++i) {
    if (i % 15 == 0) {
        printf("FizzBuzz\n");
    } else if ( i % 3 == 0 ) {
        printf("Fizz\n");
    } else if ( i % 5 == 0 ) {
        printf("Buzz\n");
    } else {
        printf("%d\n", i);
    }
}
Tran Huan viết 18:40 ngày 30/09/2018

Code này có ai chạy thử trên python chưa, thấy hình như thiếu.

Mình thấy có người đưa ra giải pháp thế này:

python -c "print '\n'.join(['Fizz'*(x % 3 == 2) + 'Buzz'*(x % 5 == 4) or str(x + 1) for x in range(100)])"
Thành Phạm viết 18:31 ngày 30/09/2018

Thấy cũng cãi nhau tranh luận bên đó, bảo không đọc kĩ đề gì đó, để em xem lại

Em chạy thử nó ra thế này:(có thêm tí số vào cho dễ theo dõi)

print '\n'.join("%d: Fizz" %i*(i%3==0)+"%d Buzz" %i *(i%5==0) for i in xrange(1,101))




3: Fizz

5 Buzz
6: Fizz


9: Fizz
10 Buzz

12: Fizz


15: Fizz15 Buzz


18: Fizz

20 Buzz
21: Fizz


24: Fizz
25 Buzz

27: Fizz


30: Fizz30 Buzz


33: Fizz

35 Buzz
36: Fizz


39: Fizz
40 Buzz

42: Fizz


45: Fizz45 Buzz


48: Fizz

50 Buzz
51: Fizz


54: Fizz
55 Buzz

57: Fizz


60: Fizz60 Buzz


63: Fizz

65 Buzz
66: Fizz


69: Fizz
70 Buzz

72: Fizz


75: Fizz75 Buzz


78: Fizz

80 Buzz
81: Fizz


84: Fizz
85 Buzz

87: Fizz


90: Fizz90 Buzz


93: Fizz

95 Buzz
96: Fizz


99: Fizz
100 Buzz

Code này em cũng không hiểu lắm , vì chưa đọc tài liệu về kiểu code gọn gọn như này lần nào

Đây là kết quả của code của anh @tranhuanltv

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
Tran Huan viết 18:29 ngày 30/09/2018

Code chôm trên mạng chứ không phải code của mình hehe

Thành Phạm viết 18:27 ngày 30/09/2018

Khả năng 2 code đều chạy tốt ạ, không biết bên C viết gọn lại được thế này không(em nhớ là có cách viết gọn dùng ? với : mà). Nhưng mà khả năng là code kiểu này chắc để nghịch thôi, code thật thế này dễ bị thằng review code nó cho ăn dép lắm

Code chôm trên mạng chứ không phải code của mình hehe

Hehe kệ vậy cứ để vậy cho oách

Nguyễn Minh Dũng viết 18:37 ngày 30/09/2018

Bài này đơn giản, nhưng cái quan trọng là code sao cho nó rõ ràng. Nói chung đây là một bài kiểm tra lúc phỏng vấn khá hay

Tran Huan viết 18:31 ngày 30/09/2018

Em thích cách thứ 2 mà anh đạt đưa ra hơn vì nó

  1. Dễ đọc và hiểu
  2. Speed
Thành Phạm viết 18:28 ngày 30/09/2018

Bài này đơn giản, nhưng cái quan trọng là code sao cho nó rõ ràng. Nói chung đây là một bài kiểm tra lúc phỏng vấn khá hay


Nói chung là đơn giản thật, nhưng mà lúc phỏng vấn, run run đơ đơ khả năng là viết xong rồi mà vẫn soi đi soi lại sợ nhầm (chắc là cũng không cho máy để test nữa )=>thời gian viết code lâu=>LOẠI

Em thích cách thứ 2 mà anh đạt đưa ra hơn vì nó 1. Dễ đọc và hiểu2. Speed

Nhưng cách bên python kia nhìn ngầu thấy mồ , 1 line and done !

Nguyễn Minh Dũng viết 18:32 ngày 30/09/2018

Bài này code chừng 2 phút chớ mấy. Không khó, cái quan trọng là như Huân nói

  1. Dễ đọc và hiểu
  2. Speed
Tran Huan viết 18:26 ngày 30/09/2018

Nhưng cách bên python kia nhìn ngầu thấy mồ sunglasses, 1 line and done !

Hehe nếu chỉ muốn “ngầu” thì vậy là ngon lành rồi. Nhưng mà professional thì chưa

Thành Phạm viết 18:36 ngày 30/09/2018

Em nghĩ FizzBuzz chắc chưa đủ để thể hiện độ pro, phải có dự án vào mới thấy đâu là pro, còn bài này chỉ để nhặt mấy ông gà gà ra thôi

Nguyễn Minh Dũng viết 18:35 ngày 30/09/2018

Không phải lúc nào hoặc ai cũng có pet project nên đây cũng là một cách để test. Nhiều bạn mới ra trường ko có pet project lắm ^^

Toan Tran viết 18:36 ngày 30/09/2018

TDD và refactor code là gì vậy anh.

Huỳnh Đình Thân viết 18:39 ngày 30/09/2018

Em nghĩ độ phức tạp của hai giải thuật trên là như nhau,sao bác bảo cái sau đơn giản hơn cái trước nhỉ, có chăng là viết ít dòng hơn??
Một điều nữa là mới đọc đề phải nghĩ đến cái đoạn code thứ 2 trước chứ mình là mình k nghĩ ra nổi cái dài dòng như đoạn thứ nhất.

Tran Huan viết 18:41 ngày 30/09/2018

TDD: Test Driven Development (Tạm hiểu là phương pháp lập trình bằng cách viết Unit Test trước khi code)
Refactoring Code (Tạm hiểu là dọn dẹp mã nguồn lại cho trong sáng, dễ hiểu, không dư thừa, …)

Bài liên quan
0