Fizzbuzz python geeksforgeek

Gần đây mình có đọc một bài viết khá thú vị được viết cách đây 13 năm của Imran Ghory - đối tác của Blossom Capital. Trong bài viết anh ấy có nói rằng đã từng chứng kiến ​​nhiều người được phỏng vấn bằng cấp cải tiến về khoa học máy tính, IT,. những người này mặc dù có tầm hiểu biết sâu rộng trong ngành, nắm rõ hết các lý thuyết nhưng lại có rất ít kinh nghiệm về viết mã thực tế. Việc tuyển dụng Dev là một công việc không hề đơn giản, mình không nghĩ đến việc hỏi những câu hỏi phức tạp, lằng nhằng, yêu cầu suy nghĩ quá nhiều thời gian là một cách hay để tuyển người, cũng như là việc phủi tay để . Để giải quyết vấn đề này thì ông Imran đã đưa ra một bài kiểm tra đơn giản để chắc chắn rằng những người đang tìm kiếm nó có thể là sự thật hay không, có ý nghĩa đúng không?

Hãy viết đoạn mã để có thể chơi trò chơi của trẻ con tên là Fizz Buzz

Fizz Buzz là trò chơi gì ?

Fizz Buzz (không rõ tên văn phòng của công ty mình được lấy từ đây hay không. v ) là một trò chơi cực kỳ đơn giản, trong trò chơi này, một nhóm trẻ ngồi trong một nhóm và đếm từng số theo thứ tự (1,2,3,4,. ) , if that number is multiple of ba, instead because read number, we will say "Fizz", or year, then must say is "Buzz". Nếu một số là bội số của cả ba và năm thì phải nói là "Fizz-Buzz". Kết quả chuỗi sẽ là

1, 2, Fizz, 4, Ù, Fizz, 7,. 14 , FizzBuzz , 16

Đơn giản mà, đúng không ?

Bài toán này trong buổi phỏng vấn sẽ có dạng sau

Viết chương trình in ra các số từ 1 đến 100. Nhưng đối với bội số của ba in "Fizz" thay vì số và đối với bội số của năm in "Buzz". Đối với các số là bội số của cả ba và năm, hãy in “FizzBuzz”

cỏ khô

Viết chương trình theo các số từ 1 đến 100. Nhưng đối với bội số của 3 thì ra "Fizz" và cho bội số của 5 thì ra Buzz thay vì số hiện tại. Đối chiếu với các số là bội số của cả 3 và 5 thì trong "FizzBuzz"

Một bài đơn giản nên chắc chắn rằng bất kỳ ai tham gia phỏng vấn đều có thể vượt qua bài này đúng không?

Fizzbuzz python geeksforgeek

Đây là một bài kiểm tra cực kỳ hay vì một vài lý do sau

Đầu tiên là bài kiểm tra này có CỰC KÌ nhiều cách để tiếp cận và giải quyết vấn đề. Tẹo mình sẽ hiển thị thử một vài cách, và chắc chắn rằng các bạn đang đọc cũng có thể viết được cả chồng cách nhau. Cách mọi người tiếp cận vấn đề và cách họ xử lý vấn đề sẽ cung cấp cho quá trình phỏng vấn một cái nhìn rõ nhất về cách tư duy cũng như kiểu lập trình của từng người. Họ sẽ cố nhồi tất cả logic vào đoạn mã cho nó chạy rồi sau đó mới bắt đầu sửa lỗi và chỉnh sửa lại mã (như mình vẫn hay làm (dab)) hay họ sẽ lên kế hoạch trước và tính toán những vấn đề có

Bên cạnh đó, FizzBuzz còn chứa đựng một vấn đề khá khó khăn để có thể hiện vẻ đẹp tinh khiết trong code, đó là phải kiểm tra nhiều điều kiện. Nếu số hiện tại chia hết cho 3 thì làm 1 việc A, nếu chia hết cho 5 thì làm việc B, nếu chia hết cho cả hai thì làm lại việc C, còn lại thì làm một việc khác

Fizzbuzz python geeksforgeek

Mã thối

Ở đây mình sẽ dùng JavaScript cho dễ hiểu nhé

Việc đầu tiên mình sẽ làm là viết một vòng lặp chạy 100 lần

for (var i = 1; i <= 100; i++) {
    // đoạn code trong này sẽ chạy 100 lần. 
    // qua mỗi vòng lặp i sẽ được tăng lên 1.
    // truyền thống là dùng biến i trong vòng lặp, mình cũng chả hiểu sao, chắc là viết tắt của index :v
}

Sau đó chúng ta cần sử dụng cái gì đó để xuất ra kết quả. Trong JavaScript thì chúng ta có thể sử dụng

1
2
3
4
...
99
100
2 để xuất kết quả ra bảng điều khiển, trong các ngôn ngữ khác hoặc hiển thị ở trang web thì bạn có thể sử dụng bất cứ điều gì để xuất ra cũng được. To in the value of
1
2
3
4
...
99
100
3, we will write as after

for (var i = 1; i <= 100; i++) {
    console.log(i)
}

Chạy thử thì đoạn mã của chúng ta sẽ có đầu ra

1
2
3
4
...
99
100

Theo đề bài thì chúng ta phải cho Fizz hoặc Buzz hiển thị khi không có điều kiện. Do đó chúng ta sẽ nhét chúng vào câu lệnh

1
2
3
4
...
99
100
4 nhé

for (var i = 1; i <= 100; i++) {
  if (i % 3 == 0) { // nếu i chia hết cho 3
    console.log('Fizz'); // thì in Fizz
  }
  
  if (i % 5 == 0) { // nếu i chia hết cho 5
    console.log('Buzz'); // thì in Buzz
  }

  if ((i % 3 != 0) && (i % 5 != 0)) { // nếu không chia hết cho cả 3 và 5
    console.log(i); // thì in giá trị của i
  }
}

đầu ra

1
2
Fizz
4
Buzz
...
14
Fizz // ở 15 thì lại không in ra FizzBuzz mà lại là Fizz rồi mới Buzz
Buzz // Hai dòng khác nhau, cho nên sai rồi nhé :v
16
...

Sai rồi thì sửa thôi, nào cùng rạch thêm một ngăn xếp điều kiện nữa nhé

________số 8

Mã hủy kinh khủng. < , code it it it repeat as this main is the first icon of code lo lắng. Qúa cồng kềnh, khó đọc khó duy trì mặc dù nó đã đáp ứng được yêu cầu bài toán

Chúng ta refactor lại chút nhé

thử tái cấu trúc

Chúng ta có thể sử dụng đến cụm câu lệnh

1
2
3
4
...
99
100
5 để thu gọn lại nhé

1
2
3
4
...
99
100
0

Cách này ngắn hơn nhiều, tuy nhiên mình vẫn chưa ưng lắm. Nếu bây giờ có yêu cầu muốn thay đổi từ 5 -> 7 thì sao ? . Mình sẽ luôn nhớ là phải sửa tất cả các số 5, đối với đoạn mã nhỏ thế này thì không phải là vấn đề, tuy nhiên với một hệ thống lớn hơn thì việc thay đổi như thế này là một việc không hề được khuyến khích . Lý tưởng nhất thì bạn không nên lặp lại một điều kiện nhiều lần, hay đơn giản là DRY (Don't Repeat Yourself)

Vậy thì chúng ta nên làm như thế nào ?

Cách của mình

Đây là cách mà mình làm

Đầu tiên mình sẽ tạo ra một biến

1
2
3
4
...
99
100
6 chỉ chứa một chuỗi trống, biến này sẽ được sử dụng để chứa giá trị cần xuất

1
2
3
4
...
99
100
2

Sau đó mình kiểm tra điều kiện nếu chia hết cho 3 thì mình thêm 'Fizz' vào chuỗi

1
2
3
4
...
99
100
6, tương tự với điều kiện chia hết cho 5. Đây là hai điều kiện riêng biệt, nên khi chúng giống nhau, tức là chia hết cho cả 3 và 5 thì sẽ có chuỗi 'FizzBuzz'

1
2
3
4
...
99
100
4

Và cuối cùng mình sẽ không kiểm tra lại giá trị của

1
2
3
4
...
99
100
3 nữa mà mình sẽ kiểm tra xem đầu ra có trống không thì trả về
1
2
3
4
...
99
100
3, không thì trả về
1
2
3
4
...
99
100
6

1
2
3
4
...
99
100
8

Đoạn mã này hoàn toàn có thể sử dụng được với mọi con số khác mà bạn có thể nghĩ tới. Thêm 7, 10, 11,. đều được hết, chỉ việc copy câu lệnh

1
2
3
4
...
99
100
4 thôi, chứ nếu làm theo kiểu
for (var i = 1; i <= 100; i++) {
  if (i % 3 == 0) { // nếu i chia hết cho 3
    console.log('Fizz'); // thì in Fizz
  }
  
  if (i % 5 == 0) { // nếu i chia hết cho 5
    console.log('Buzz'); // thì in Buzz
  }

  if ((i % 3 != 0) && (i % 5 != 0)) { // nếu không chia hết cho cả 3 và 5
    console.log(i); // thì in giá trị của i
  }
}
2 thì đúng là ác mộng

for (var i = 1; i <= 100; i++) {
    console.log(i)
}
0

Mình biết là vẫn sẽ có nhiều cách còn đỉnh hơn nhiều, khi còn dùng một dòng cơ. Nếu các bạn có cách nào thì thoải mái comment bên dưới nhé (cúi đầu)

Tổng kết

Theo mình nghĩ thì vẫn có nhiều công ty trên thế giới vẫn dùng cách này để phỏng vấn và tuyển dụng. Bên cạnh đó còn rất nhiều bài toán dạng như thế này, thứ không được học ở lớp hay trên mạng mà chủ yếu dựa vào cách tiếp cận và giải quyết vấn đề của cá nhân bạn

Mình vẫn thuộc thể loại thấm mẫm rồi vét hết logic vào code, sau đấy mới refactor lại cho đến khi cảm thấy đủ ổn (dab). Nhưng tốt nhất đừng code thối quá, anh Dev duy trì code của em sẽ lắm đấy đấy

Cảm ơn các bạn đã đọc. Bạn có giải pháp nào hay hơn thì cứ thoải mái comment để chia sẻ nhé (cúi đầu)

Bài viết của Imran Ghory. https. // imranontech. com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/