Мой друг только что опубликовал эту старомодную статью: Почему программисты не могут программировать? В нем Джефф Этвуд обсуждает использование FizzBuzz в качестве теста программирования для соискателей-разработчиков. Он посоветовал мне, наверное, сделать несколько интересных вариаций на эту тему. Так что я вытащил свою копию LiveCode и попробовал. Вот несколько решений:

function fizzbuzz n
    repeat with i = 1 to n
        if i mod 15 is 0 then put "fizz buzz" & cr after R
        else if i mod 3 is 0 then put "fizz" & cr after R
        else if i mod 5 is 0 then put "buzz" & cr after R
        else put i & cr after R
    end repeat
    return R
end fizzbuzz

Это довольно простое решение, для выполнения которого требуется всего 4 строки кода внутри цикла repeat. Он проверяет mod 15 с избыточностью с 3 и 5.

function fizzbuzz n
    repeat with i = 1 to n
        if i mod 3 is 0 then
            if i mod 5 is 0
            then put "fizz buzz" & cr after R
            else put "fizz" & cr after R
        else if i mod 5 is 0 then put "buzz" & cr after R
        else put i & cr after R
    end repeat
    return R
end fizzbuzz

Еще одна простая реализация. он требует 6 строк кода внутри цикла повтора, но позволяет избежать избыточных мод-тестов.

function fizzbuzz n
    repeat with i = 1 to n
        if i mod 3 is 0 then put "fizz " after R
        if i mod 5 is 0 then put "buzz " after R
        if char -1 of R is space
        then put cr into char -1 of R
        else put i & cr after R
    end repeat
    return R
end fizzbuzz

Третье приземленное решение. 5 строк и довольно чистые, но проверка последнего символа возвращаемой строки бесполезна и уродлива.

А теперь перейдем к интересным решениям.

function fizzbuzz n
    repeat with i = 1 to n
        put item 1 + i mod 15 of \
          format("fizz buzz,%s,%s,fizz,%s,buzz,fizz,%s,%s,fizz,buzz,%s,fizz,%s,%s",i,i,i,i,i,i,i,i) & cr after R
    end repeat
    return R
end fizzbuzz

Несмотря на перенос строки (\ wraps здесь только для отображения), это одна строка с функцией форматирования внутри цикла повторения. Формат создает строку из 15 элементов, которые соответствуют повторяющемуся циклу из 15 элементов выводимых элементов в fizzbuzz, а затем использует индексный модуль 15 для выбора среди них. Его преимущество состоит в том, что он представляет собой одну строку, но эта строка несколько сложна, особенно если разработчик недостаточно разбирается в команде форматирования, и она неэффективна, поскольку генерирует 15 элементов для каждого элемента списка возврата.

function fizzbuzz n
    repeat with i = 1 to n
        put (word ((i mod 3) + 3) div 2 \
          to 2 - ((i mod 5) + 4) div 5 of "fizz buzz") \
          & (word 1 to (i mod 3) * (i mod 5) of i) & cr after R
    end repeat
    return R
end fizzbuzz

Это однострочное решение (опять же, \ wraps здесь только для отображения), которое позволяет избежать использования функции форматирования, которая обычно не используется в сообществе LiveCode, за счет некоторых действительно мучительных арифметических операций и выражений фрагментов.

function fizzbuzz n
    repeat with i = 1 to n step 15
        put format("%s\n%s\nfizz\n%s\nbuzz\nfizz\n%s\n%s\nfizz\nbuzz\n%s\nfizz\n%s\n%s\nfizz buzz\n",i,i+1,i+3,i+6,i+7,i+10,i+12,i+13) after R
    end repeat
    return line 1 to n of R
end fizzbuzz

Это снова однострочное решение с функцией форматирования. У этого есть преимущество перед предыдущим решением на основе формата в том, что он генерирует 15 записей за раз, поэтому он намного более эффективен. Однако это, вероятно, не легче понять, и у него есть недостаток, заключающийся в том, что он генерирует число, кратное 15; он должен усечь сгенерированное решение перед его возвратом, чтобы вернуть точно запрошенное количество строк.

Итак, что из этого лучше?

Это дизайн продукта / менеджмент входит в картину. Основываясь на краткости или смекалке, лучше всего подойдет одно из трех последних решений. Даже с соответствующими комментариями / документацией они потребовали бы от разработчика потратить время на их понимание, прежде чем он сможет устранять неполадки или изменять их. Пятый, в частности, было интересно написать, но он был бы предметом множества ругательств, если бы кому-то (включая меня!) Пришлось бы изменить его в будущем.

Совершенно очевидно, что одно из первых трех решений является лучшим. Их будет намного легче понять и поддерживать в будущем. Из этих трех я склоняюсь к первому решению. Единственный недостаток, который он имеет, - это избыточное вычисление по модулю, что является небольшой платой за гораздо более четкую структуру самого кода.

Все, что имеет пользователя, имеет интерфейс с этим пользователем. В данном случае этот интерфейс представляет собой структуру и формат самого кода. Он полностью технический и представляет собой просто текст, но очевидно, что дизайн для удобства использования имеет значение даже здесь.

Всегда думайте о своем клиенте! Даже если это твое будущее.