Cùng thỏa sức sáng tạo với trò chơi fizzbuzz

Fizzbuzz là một trò chơi đếm số kinh điển của trẻ em, đếm từ 1 đến 100 nhưng số nào là bội số của 3 thì phải nói fizz thay vì đếm số đó, số nào là bộ số của 5 thì phải thay bằng từ buzz, tương tự bội của 3 và 5 thì nói fizzbuzz.

Bỗng một ngày đẹp trời ông Imran Ghory (đang là Partner tại quỹ Blossom Capital, từng làm việc tại quỹ đầu tư mạo hiểm Index Ventures) bảo rằng: tất cả tài năng của dev chỉ là lý thuyết, người làm lâu năm cũng chật vật với việc implement linked list, để biết năng lực chỉ cần giải bài toán:

In từ 1 đến 100, số nào là bộ của 3 thì in fizz, bội của 5 thì in buzz, bội của cả 3 và 5 thì in fizzbuzz.

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

Đây là cách của mình viết bằng javascript

for (let x = 1; x <= 100; x++) {
    switch (true) {
        case x % 3 == 0 && x % 5 == 0:
            console.log("fizzbuzz");
            break;
        case x % 3 == 0:
            console.log("fizz");
            break;
        case x % 5 == 0:
            console.log("buzz");
            break;
        default:
            console.log(x);
            break;
    }
}

Mình dùng switch-case bởi vì nếu cần thêm trường hợp chia hết cho 7, cho 9 thì chèn case vào giữa, code vẫn thẳng hàng, cùng cấp không sợ bị rối so với if-else. Chỉ cần quyết định chèn lên trên những case có sẵn hay chèn vào sau case cuối cùng thôi. Còn các bạn thì sao? hãy thử code bên dưới nhé!

2 Likes

Mình thì làm như vầy:

const _$_= [
{_:3,$:"fizz"},
{_:5,$:"buzz"},
{_:7,$:"foo"},
{_:11,$:"bar"},
//{_:13,$:"xxx"},
]
$_$= function(_){
    let $=""
    for(let $$ in _$_){
        $+=!(_%_$_[$$]._)?_$_[$$].$:""
    }
    return($==="")?_:$
}
$$$ = function(_,__){
    let $=""
    for(let i=_;(_<__)?i<=__:i>=__;(_<__)?++i:--i){
        $+=$_$(i)+"\n"
    }
    console.log($)
    return($$$)
}
$$$(1,100);

Hơi rối mắt một tí thôi, nhưng thích thêm thì chỉ cần thêm số cần chia hết và chuỗi cần thay thế là được.

Rối mắt quá?
const FIZZBUZZ= [
{mod:3,rep:"fizz"},
{mod:5,rep:"buzz"},
{mod:7,rep:"foo"},
{mod:11,rep:"bar"},
//{mod:13,rep:"xxx"},
]
fizzbuzz= function(i){
    let res = ""
    for(let idx in FIZZBUZZ){
        res += !(i % FIZZBUZZ[idx].mod) ? FIZZBUZZ[idx].rep : ""
    }
    return(res === "") ? i : res
}
play = function(a, b){
    let res = ""
    for(let i = a;(a < b) ? i <= b : i>= b; (a < b) ? ++i : --i){
        res += fizzbuzz(i) + "\n"
    }
    console.log(res)
    return(play)
}
play(1,100);
4 Likes

tại sao bạn đặt tên biến toàn dấu đô la, khó hiểu quá

Thích thì làm thôi. Nhưng có thể viết ngắn gọn hơn
FIZZBUZZ có thể viết gọn lại.

FIZZBUZZ = {
    3: "Fizz",
    5: "Buzz"
};

có thể viết thành

let res = Object.keys(FIZZBUZZ).reduce((previous,current) => previous += i % current  ? "" : FIZZBUZZ[current], "";
fizzbuzz= function(i){

có thể viết thành

fizzbuzz = i => 

có thể viết thành

return res  || i;

có thể viết thành Array.map.

Code cuối cùng:

const mapping = {
    3: "Fizz",
    5: "Buzz"
};
var range = (a,b ) => 
[...Array.from({ length: Math.abs(b - a) + 1}, (_, i) => a + i * (b > a ? 1 : -1))];
let m = 33, n = 7;
range(m, n).forEach(i =>{
   let s = Object.keys(mapping).reduce((previous,current) => previous += i % current  ? '' : mapping[current], '');
   console.log(s || i);
});
4 Likes

Code mình chơi codegolf:kissing: À đây là version ungolf nhé.

mapping = {2:"Foo",3:"Fizz",5:"Buzz",7:"Bar"}
for (let x = 1; x <= 100; x++) {
    let f = "";
    for (let d in mapping)
        if (x%d == 0)
            f += mapping[d]
    console.log(f||x);
}
3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?