Недавно мой коллега прислал мне следующий фрагмент JavaScript в шутку:
let butScript = (nrOfButs) => {
for(var i = 0; i < nrOfButs; i++){
if(i % 3 == 0){
console.log("Yeah")
}
if(i % 2 == 0){
console.log("But")
}
if(i % 3 == 1){
console.log("No")
}
}
}
Поскольку код был написан в рабочее время, очевидно, это была огромная трата ресурсов компании. Чтобы предотвратить подобные случаи в будущем, мы должны минимизировать потери рабочего времени. И поскольку общеизвестно, что более короткие программы пишутся быстрее, мы должны сделать этот код максимально коротким!
вход
Одно неотрицательное целое число. Вы не должны обрабатывать ошибочные данные.
Выход
Ваша программа должна выдавать результат, идентичный приведенному выше сценарию. Вы должны вывести одно слово на строку, и количество слов должно соответствовать исходному сценарию.
Допустимо включать непропускаемые символы пробела в конце каждой строки (но не в начале), поскольку они невидимы. Один дополнительный символ новой строки допустим в самом конце вывода.
Примеры
Input: 0
Output:
Input: 1
Output:
Yeah
But
Input: 2
Output:
Yeah
But
No
Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
nrOfButs
переменная довольно плохо названа и вводит в заблуждение. Хороший простой вызов в любом случае.if
падение падения и продолжить в текущем цикле, если их условие было выполнено.Ответы:
Excel, 78 байт
Предполагается ввод в ячейку A1, и что форматирование Wordwrap включено для ячейки. Используйте Alt + Enter, чтобы добавить перевод строки внутри строки и отметить пробел. Только обрабатывает ввод до 3570 из-за ограничения функции REPT (удачи, хотя получаю клетку такой высокой высоты).
Перепечатка, с периодами для пробелов
Как это работает: шаблон повторяется каждые 6 чисел:
Каждый из них может быть выражен 9 символами, поэтому строка состоит из 54 символов (9 * 6), а затем повторяется настолько, насколько позволяет Excel. Затем он принимает левые 9 * (количество входных) символов в качестве вывода.
Перевод строки для «но и никого» ставится после пробела, так что «Да» для № 6, № 12 (и т. Д.) Форматируется слева, а не справа, и чтобы в каждую 6-ю строку не добавлялся пустой перевод строки. для этого пункта.
источник
JavaScript (ES6),
5957 байтПопробуйте онлайн!
Как?
Мы используем рекурсивную функцию, которая идет от до а не от до .1 0 n - 1N 1 0 n - 1
В результате тесты отключены на по сравнению с эталонным кодом:1
Это позволяет нам хранить более простой случай в качестве первой записи нашего массива поиска, где мы можем определить : переменную, содержащую либо пустую строку, либо.сn ≡ 0( мод3 ) s
"But\n"
Две другие записи определены как
"Yeah\n" + s
иs + "No\n"
соответственно.Примечание: итерируя от до , мы могли бы точно так же определить в первой записи, но это стоило бы две дополнительные скобки .0 летn - 1 0 s
комментарии
источник
LOLCODE , 257 байтов
Попробуйте онлайн!
источник
VISIBLE "But"
программа к отсутствию брюк?Пробелы ,
315304300277276 байтБлагодаря @JoKing за -11 байт (сокращение количества используемых меток с 8 до 7) и -24 байт (изменение общего потока программы и уменьшение количества используемых меток в процессе).
Буквы
S
(пробел),T
(табуляция) иN
(новая строка) добавляются только как подсветка.[..._some_action]
добавлено только для пояснения.Попробуйте онлайн (только с необработанными пробелами, вкладками и новыми строками).
Пробельные символы определенно не являются подходящим языком для этой задачи. В Whitespace оба цикла и операторы if создаются с метками и переходами к меткам, и, поскольку они не являются случаями if-elseif-else, а являются множественными случаями if,
это означает, что я придется каждый раз возвращаться назад, делая его довольно длинным,это означает, что мне придется немного изменить проверки, чтобы пропустить некоторые отпечатки (спасибо @JoKing ).Объяснение в псевдокоде:
Дополнительное объяснение:
Как правило, он переходит от ввода к нулю, нажимая на новую строку, и слово переворачивается (поэтому в порядке "\ noN", "\ ntuB", "\ nhaeY" вместо "Да \ n", "Но \ n" "," Нет \ n "). И после того, как ввод зацикливается на 0 и все символы находятся в стеке, он будет печатать эти символы в обратном порядке (поэтому правильный порядок вывода).
Однако, более подробно: хотя нам нужно печатать слова в диапазоне
(input, 0]
,[input, 0)
вместо этого в цикле будет цикл . По этойif(i%3 == 2)
причине мы можем использовать проверку для «\ noN» (или фактическиif(i%3 != 2)
пропустить нажатие «\ noN»), и мы используем проверкуif(i%2 != 1)
для «\ ntuB» (или фактическиif(i%2 == 0)
пропустить нажатие «\ ntuB») ). Только после этих двух проверок мы уменьшаем итерациюi
на 1. Затем выполняем проверку,if(i%3 == 0)
нажимая «\ nhaeY», как в примере кода JS в описании вызова. Пропуск с проверками if-not вместо перехода к метке и возврата с метки с сохраненными if-проверками 23 байта.Кроме того, в пробелах символьные значения хранятся в стеке в качестве значений Юникода (то есть
10
для новых строк,65
для «A»,97
для «a» и т. Д.). Поскольку для печати символов мне уже нужно циклически перемещаться по стеку, я также могу использовать подсказку для пробелов, чтобы уменьшить количество байтов, добавив константу к числовым значениям, прежде чем печатать их в виде символов.В
104
данном случае эта константа генерируется с помощью этой Java-программы, которую я также использовал, чтобы сыграть еще один мой ответ в Whitespace . Это также причина, почему эта часть кода:имеет значения
-94
для новой строки,7
для 'o' и-26
для 'N'. Поскольку добавление константы104
правильно дать наши ценности Юникода10
,111
и78
для этих символов соответственно.источник
if i modulo-3 != 1 jump to next if else push NO
i
доif(i is 0) call PRINT
истины, но другая - проверятьi
перед вычитанием и пропускать отпечатки. Довольно умный на самом деле. Будем продолжать его реализацию.Python 3 ,
8582 байтаПопробуйте онлайн!
Python 3 ,
7976 байтПорт Keeta «s ответ Excel .
Попробуйте онлайн!
источник
Perl 6 ,
6350 байтПопробуйте онлайн!
Блок анонимного кода, который принимает число и возвращает список строк
Объяснение:
источник
C (gcc) , 75 байтов
Попробуйте онлайн!
C (gcc) , 60 + 11 = 71 байт (с использованием
-D$=||puts(
)Попробуйте онлайн!
источник
05AB1E (наследие) ,
272524 байтаСохранено 1 байт благодаря Кевину Круйссену .
Попробуйте онлайн!
объяснение
источник
×
, не думал об этом!Θ
теперь то, что вы больше не используете×
, так какÏ
будете смотреть только на1
s, поэтому он игнорирует2
(и,0
конечно,).Python 2 , 73 байта
Попробуйте онлайн!
источник
Python 2 ,
979592908381 байтПопробуйте онлайн!
-2 байта, благодаря овсу
Python 3 ,
92908583 байтаПопробуйте онлайн!
-4 байта, благодаря овс
-4 байта, спасибо Джо Кингу
источник
len(w)<3
->'N'in w
, 81 байт :len(w)%2
->(w<'N')
Холст , 27 байт
Попробуй это здесь!
источник
Groovy (функция), 79 байтов
С момента первоначальной отправки моего ответа я просмотрел некоторые исторические дискуссии о том, что представляет собой подходящий ответ. Поскольку кажется общепринятым предоставлять в Java только метод (включая декларации возвращаемого типа и параметров), вот более короткий метод Groovy, ответом которого является возвращаемое значение метода. Использование
def
означает, что возвращаемый тип выводится.В отличие от исходного ответа ниже, который повторяется от 0 до n-1, этот вызывает себя от n до 1, но уменьшает ввод для остальной части строки в рекурсивном вызове.
Попробуйте онлайн!
Groovy (программа), 87 байт
Groovy скрипты не требуют определенного общего импорта, так что это может быть программой печати ответа на STDOUT Java без необходимости объявлять
System.out.
до тогоprint
. Он также предоставляет некоторые распространенные служебные методы, такие как этот,toLong()
что позволяет нам достаточно разумно анализировать входной аргумент.По сути, ответ Java 10, но с использованием более короткого синтаксиса цикла Groovy и способности оценивать правдивые утверждения.
Попробуйте онлайн!
источник
Сетчатка 0.8.2 , 45 байт
Попробуйте онлайн! Объяснение:
Преобразовать ввод в унарный.
Для каждого целого числа
0...n-1
сгенерируйте три строки текста, по одной для каждого слова, каждая сi
1
s перед ним, за исключениемNo
, у которого есть два дополнительных1
s, так что мы вычисляем,(i+2)%3==0
что эквивалентноi%3==1
.Удалить пары
1
s передB
s.Удалите
1
s в группах по три везде.Удалить все строки, которые все еще имеют
1
.источник
11No¶
как рассчитать(i+2)%3==0
(так что все три - проверки if==0
), это выглядит настолько очевидным, но я бы сам не подумал об этом, так что это на самом деле довольно изобретательно. +1 от меня, хороший ответ!Java 10,
10099 байт-1 байт благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
++i%3>1
скорее всего сэкономит вам байтPowershell,
7574726766 байт-1 байт благодаря TessellatingHeckler
Тестовый сценарий и объяснение:
Выход:
Простой скрипт, 72 байта:
источник
======
. Он генерируетYeah,But,No
только строки. Тестовый скрипт показывает разделитель для более удобного чтения только результатов.(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
Haskell , 71 байт
Попробуйте онлайн!
объяснение
Довольно просто, сохранил два байта, используя
[1..n]
вместо них[0..n-1]
и скорректировав оставшиеся: Оператор(?)
test принимает четыре аргумента, возвращая пустой список или предоставленную строку в виде одиночного значения, если результат верен.Выражая четвертый аргумент,
(?)
мы можем использовать(<>)
конкатенацию результатов каждой функции, а именно:источник
C # (интерактивный компилятор Visual C #) ,
10599949689 байтПопробуйте онлайн!
источник
x++%3==1?
может быть++x%3>1?
. Кто-то другой просто дал мне подсказку по моему ответу на Java, но то же самое относится и к вашему ответу на C #. :)Пип ,
373533 байта(Обратите внимание на пробел после
But
.) Принимает ввод в качестве аргумента командной строки. Попробуйте онлайн!объяснение
Это объяснение для предыдущей версии - см. Ниже список изменений
Вдохновлен Perl 6 Джо Кинга . Мы строим этот список:
и вывести первые его
a
элементы с помощью циклического индексирования.Обновление: я понял, что мне не нужно использовать замену, чтобы изменить 0/1/2 на строки - я могу использовать эти числа для непосредственного индексирования в списке. Чтобы сделать это, мы должны убедиться, что многозначные числа разбиты на списки их цифр (в противном случае мы будем выбирать индекс 10 вместо индексов 1 и 0). К счастью, использование произвольно вложенного списка в качестве индекса в Pip работает, как и ожидалось, давая (вложенный) список результатов. Для ввода 3 мы получаем эту последовательность данных (где
_
представляет новую строку):Как и прежде, окончательный результат объединяется и печатается автоматически.
источник
Атташе , 48 байт
Попробуйте онлайн!
объяснение
источник
C (gcc) ,
7771747269 байтЗдесь уже есть лучший ответ на C, но этот рекурсивный, и мне потребовалось некоторое время, чтобы разобраться, поэтому я публикую его.
До 69 байтов благодаря @ceilingcat и @JonathanFrech
(Я никогда не думаю использовать n- ~ -i вместо n-i + 1)
Попробуйте онлайн!
источник
j
спасло вам два байта.n-~-i
эквивалентноn-i+1
- нетi<n+1
- и поэтому фактически не сохраняет никаких байтов ...Руби, 69
7274БОчень простой ответ, проверяющий более короткий, рекурсивный метод прямо сейчас.
Сохранено два байта благодаря @BWO :)
Сохранены еще три байта с использованием символов вместо строк
источник
Python 3, 93 байта
Это не совсем лучшее решение, но это мое мнение.
Попробуйте онлайн!
источник
R 65 байт
В связи с тем , что мы тиражированием немного испорчена программой (она пропускает каждый четвертую «но» - он должен был использовать
%4 == 1
и%4 == 3
вместо%3
условий), мы должны использовать неудобный вызовc
и работать в базе семь. Тем не менее, он короче, чем LOLCODE ...(Я надеялся, что (3,1,2,3,2,1,2) или подобная перестановка может
lh
где-то появиться в наборе данных, но это не похоже на это)источник
sed -E ,
179150 байтСамым сложным было не построить список, а проанализировать десятичное число.
2 байта могут быть сохранены, если перевод строки в конце не требуется:
c\
→d
.Все еще требует оптимизации.
Попробуйте онлайн .
объяснение
источник
Чисто , 116 байт
Попробуйте онлайн!
источник
F #,
108106 байтПопробуйте онлайн!
-2 байта изменяются с
i=0 to p-1
наi=1 to p
и корректируются по модулю. Кроме того, довольно просто.источник
v
функция распечатает все.i=1 to p
(и корректирующие модули, естественно). Обратные диапазоны пусты. :)PHP,
6568 байтЗапустите как трубу с
-nR
или попробуйте онлайн .источник
VBA (Excel),
105, 101,99 байтИзменить: -4 байта от Keeta! Спасибо!
Редактировать 2: -2 байта от Chronocidal! Woot! (Понял, что тестовые случаи работали только на 10. Исправлено сейчас)
Да, в этот раз Excel победил VBA. Без разницы. (Мы идем за тобой)
^ Это вставляется в окно Immediate и выводит в окно отладки
Ungolfed
источник
&
IIf(..)
Желе , 22 байта
Монадическая ссылка, выдающая список строк (что, по-видимому, разрешено в комментариях)
Попробуйте онлайн! (нижний колонтитул вызывает Link используя
Ç
и соединяется с использованием новых строк,Y
поскольку неявная печать в Jelly разбивает все вместе, если это возможно)Как?
Теперь обратите внимание, что первые шесть значений:
Таким образом, в результирующем списке строк эти значения должны быть повторены (или усечены) до длины,
n
объединенной вместе.Теперь обратите внимание, что набор мощности
"Yeah", "But", "No"
:Таким образом, каждый период представляет собой эти 1-индексированные значения набора мощности
"Yeah", "But", "No"
:Код создает этот список, формирует его по длине
n
, индексирует в power-set, а затем удаляет внутренние списки (что также удаляет пустые строки, поскольку строки являются списками в Jelly) ...источник
Python 2 ,
939283 байтаПопробуйте онлайн!
Огромные 9 байтов сохранены благодаря @Jonathan Frech
источник
('','Yeah\n')[x%3<1]
эквивалентно"Yeah\n"*(x%3<1)
.