Мой друг только что опубликовал эту старомодную статью: Почему программисты не могут программировать? В нем Джефф Этвуд обсуждает использование 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; он должен усечь сгенерированное решение перед его возвратом, чтобы вернуть точно запрошенное количество строк.
Итак, что из этого лучше?
Это дизайн продукта / менеджмент входит в картину. Основываясь на краткости или смекалке, лучше всего подойдет одно из трех последних решений. Даже с соответствующими комментариями / документацией они потребовали бы от разработчика потратить время на их понимание, прежде чем он сможет устранять неполадки или изменять их. Пятый, в частности, было интересно написать, но он был бы предметом множества ругательств, если бы кому-то (включая меня!) Пришлось бы изменить его в будущем.
Совершенно очевидно, что одно из первых трех решений является лучшим. Их будет намного легче понять и поддерживать в будущем. Из этих трех я склоняюсь к первому решению. Единственный недостаток, который он имеет, - это избыточное вычисление по модулю, что является небольшой платой за гораздо более четкую структуру самого кода.
Все, что имеет пользователя, имеет интерфейс с этим пользователем. В данном случае этот интерфейс представляет собой структуру и формат самого кода. Он полностью технический и представляет собой просто текст, но очевидно, что дизайн для удобства использования имеет значение даже здесь.
Всегда думайте о своем клиенте! Даже если это твое будущее.