Рубрики
Без рубрики

Самый короткий блестящий

Fizzcuzz? Что это такое? Fizzbuzz – это классическое упражнение, которое вы могли бы получить в интервью: … Теги с JavaScript, Challenge.

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”