Fizzcuzz? Что это такое?
Fizzbuzz это классическое упражнение, которое вы могли бы получить в интервью:
- Мы получаем список номеров от 1 до N.
- Когда число делится на
3
мы меняем ценность на"Fizz"
Отказ - Когда число делится на
5
мы меняем ценность на"Buzz"
Отказ - Если мы сможем разделить номер как
3
и5
мы показываем"Fizzbuzz"
Отказ - Если ни одно из вышеперечисленного не применяется, мы просто держим номер.
Так… Что такое вызов, то тогда?
Я пытался сделать его более сложным для меня, поэтому я решил сделать самую маленькую версию этого алгоритма, который я мог бы в JavaScript. Это один (длиной 64 символов):
[...Array(100)].map((_,i)=>(++i%3?"":"Fizz")+(i%5?"":"Buzz")||i)
Заботиться, чтобы объяснить?
Конечно, вот тот же код с комментариями:
// We use spread over a newly created array of 100 elements // without the spread `map` doesn't work because the array is empty... [...Array(100)] // Then we map over it... .map( // We ignore the first element `_` which is undefined, and use the index `i` (_, i) => // First we do ++i because we start in `1` not `0`. // We use a ternary so if ++i is divisible by 3 "Fizz", if not empty string. (++i % 3 ? "" : "Fizz") + // Same as above, but this time with 5 and "Buzz". (i % 5 ? "" : "Buzz") || // At this point we have either "Fizz", "Buzz", // both concatenated "FizzBuzz", or an empty string, which is falsy. // So if we have that falsy value, we go to the index value. i );
Другие идеи
Если вы не заботитесь о начале со значения 1
Тогда вы можете удалить ++
сделать его еще меньше:
[...Array(100)].map((_,i)=>(i%3?"":"Fizz")+(i%5?"":"Buzz")||i)
Я также пробовал другие варианты, но всегда больше. Это использует распространение с Array.prototype.keys.
Поэтому нам не нужно использовать индекс, и мы можем использовать значение элементов:
[...Array(100).keys()].map(i=>(++i%3?"":"Fizz")+(i%5?"":"Buzz")||i)
Может быть, используя Array.rom
? Нет, это также больше: ‘(
Array.from(Array(100),(_,i)=>(++i%3?"":"Fizz")+(i%5?"":"Buzz")||i)
Я также пытался использовать это бесполезное _
Атрибут, как это:
[...Array(100)].map((z="zz",i)=>(++i%3?"":"Fi"+z)+(i%5?"":"Bu"+z)||i)
Или даже используя неприятные декларативные вещи, как это:
i=0,o=[];while(i++<100)o.push((i%3?"":"Fizz")+(i%5?"":"Buzz")||i)
Но это всегда в конечном итоге будет больше … Итак, вот вызов для вас:
Можете ли вы сделать это еще меньше?
Так что да, это проблема. Мне было интересно, есть ли небольшие версии этого алгоритма, который мы можем достичь в JS. Если у вас есть идеи, оставьте их в разделе «Комментарий» ниже.
У нас есть победитель (длиной 62 символа)! (09 августа, 2021)
@SIDDHARTHSHYNIBEN сделал эту версию, которая короче моей, теперь посмотрим, сможете ли вы побить его:
a=[];for(i=0;++i<101;a.push(i%5?f||i:f+"Buzz"))f=i%3?"":"Fizz"
Расширенная версия для людей, желающих понять эту версию:
// We create a global variable `a` with an empty array on it: a = []; for ( // other global variable `i` is created with a value of 0: i = 0; // We loop while i is lower than 101 adding 1 to i each time: ++i < 101; // Per loop we push i to the array `a`, or the value of `f` + "Buzz" a.push(i % 5 ? f || i : f + "Buzz") ) // `f` is yet another global variable, this time with the "Fizz" part: f = i % 3 ? "" : "Fizz";
Новый Challenger (длиной 61 символа)! (05 сентября, 2021)
С помощью синтаксиса выделения:
a=[i=1];while(i<100)a[i++]=(i%3?"":"Fizz")+(i%5?"":"Buzz")||i
Расширенная версия для людей, желающих понять эту версию:
// We create a global variable `a` a = [ // This time we assign 1 to a global `i` inside the array `a`, // so we initialize with the value 1 in index 0 i = 1 ]; // We use `while` this time while (i < 100) // And instead of using `push` we assign the `i++` value per loop a[i++] = // This logic is pretty similar to the original algorithm shown above (i % 3 ? "" : "Fizz") + (i % 5 ? "" : "Buzz") || i;
Оригинал: “https://dev.to/lukeshiru/shortest-fizzbuzz-4goa”