Введение
Я не особенно знаю, откуда взялась эта тенденция. Это может быть просто мем или что-то, но это несколько популярно.
Вызов
Ваша задача сегодня - преобразовать Fizz Buzz в двоичный файл (0, 1) соответственно и преобразовать этот двоичный файл в текстовый. Довольно стандартные вещи.
Как это работает?
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzBuzzFizzBuzzFizzFizzBuzz будет переводить в 01101000 01101001, а затем переводится в "привет"
Ограничения
- Вводом является Fizz Buzz в двоичной точке зрения (см. Примеры ниже.)
- Вывод должен быть текстом.
- Вы можете предположить, что вход FizzBuzz правильный.
- Это код-гольф , выигрывают короткие байты.
вход
FizzBuzzBuzzFizzBuzzFizzFizzFizz FizzBuzzzBuzzFizzBuzzFizzFizzBuzz FizzФиззБуззФизФизФизСерзФиззБизз
Выход
"Здравствуй!"
Ответы:
C, 59 байт
Магические числа, магические числа везде!
(Кроме того, C короче, чем Python, JS, PHP и Ruby? Не слышно!)
Это функция, которая принимает строку в качестве входных данных и выводит их в STDOUT.
Прохождение
Базовая структура:
Здесь «вещи внутри» - это набор кода, за которым следует оператор
,*s++
запятой, который возвращает только значение своего второго аргумента. Следовательно, он будет проходить через строку и устанавливаться*s
для каждого символа, включая завершающий байт NUL (поскольку postfix++
возвращает предыдущее значение), перед выходом.Давайте посмотрим на остальное:
Сняв тройное и короткое замыкание
||
, это можно расширить доОткуда берутся эти магические числа? Вот двоичные представления всех задействованных символов:
Во-первых, нам нужно отделить пробел и NUL от остальных символов. Как работает этот алгоритм, он сохраняет накопитель «текущего» числа и печатает его всякий раз, когда он достигает пробела или конца строки (то есть
'\0'
). Заметив, что' '
и'\0'
являются единственными символами, которые не имеют ни одного из двух младших значащих битов, мы можем побитово И символ0b11
получить, чтобы получить ноль, если символ является пробелом или NUL и ненулевым в противном случае.Копая глубже, в первой ветке "если" у нас теперь есть персонаж, один из которых
FBizu
. Я выбрал только обновить аккумулятор наF
s иB
s, поэтому мне нужен был способ отфильтроватьizu
s. Удобно,F
и дляB
обоих установлены только второй, третий или седьмой младший значащий бит, а для всех остальных чисел установлен по меньшей мере один другой бит. На самом деле все они имеют первый или четвертый младший бит. Следовательно, мы можем поразрядно AND с0b00001001
, который равен 9, что даст 0 дляF
иB
и ненулевой в противном случае.Как только мы определили, что у нас есть
F
илиB
, мы можем сопоставить их0
и,1
соответственно, взяв их модуль 5, потому чтоF
есть70
иB
есть66
. Тогда фрагментэто просто способ сказать
который также может быть выражен как
который вставляет новый бит в наименее значимую позицию и сдвигает все остальное на 1.
"Но ждать!" Вы могли бы возразить. «Когда вы печатаете
i
, когда он возвращается к 0?» Ну,putchar
приведем свой аргумент к anunsigned char
, который просто так получается размером 8 бит. Это означает, что все, что осталось за восьмым младшим значащим битом (т.е. мусор из предыдущих итераций), отброшено, и нам не нужно об этом беспокоиться.Спасибо @ETHproductions за предложение заменить
57
на9
, сохраняя байт!источник
Желе , 9 байт
Попробуйте онлайн!
источник
Bash + coreutils,
6150 байт(-11 байт благодаря дверной ручке !)
Попробуйте онлайн!
источник
sed
с ,tr FB 01|tr -d izu
чтобы сэкономить 11 байт.Python 3 ,
16910193918581 байтПопробуйте онлайн!
Объяснение:
источник
lambda
функциейJavaScript (ES6),
8079 байтисточник
.replace(/..zz/g,
,'0b'+
и т.д.n
позволяет достичь 79. К сожалению, это требует дополнительного пространства, которое будет добавлено к входу. Следовательно, довольно дорого`${s} `
.Japt ,
26241917 байтПопробуйте онлайн!
Сохранено 2 байта благодаря @Shaggy и 2 байта благодаря @ETHproductions
объяснение
источник
})
сÃ
. Определенно можно сохранить больше, чем это, но я не могу заставить его работать на моем телефоне.ò4...q n2
сë4...n2
(ë4
то же самое , как это делаетò4
, за исключением возвращения только первый пункт, как ни странно, это , кажется, не быть документированы)Рубин,
656360 байтЭто анонимный процесс, который принимает данные и выводит их в виде строки.
источник
JavaScript (ES6),
95888581 байтПопытайся
источник
+
что корочеparseInt
+(m[0]<"F")
можно сократить доm<"F"|0
Perl 5, 33 байта
Заменяет 'F' и 'B' на входе соответственно на 0 и 1 и удаляет другие символы. Затем он использует
pack
функцию perl для преобразования этой битовой строки в символы ASCII.источник
-p0
опцию командной строки (которая сохранит вас<>=~r
для ввода и позволит вам использовать,$_=
а неprint()
). В зависимости от того, как вы хотите обрабатывать переводы строк, вам может даже не понадобиться0
. (Даже если вы хотите избежать штрафов за опцию командной строки,say
она корочеprint
.)$_=pack'B*',y/FB -z/01/dr
ваша программа снизит ваш счет до 26 байт.Python 2 ,
90838281 байт-1 байт благодаря полностью человеческому
-1 байт благодаря Martmists
-1 байт благодаря Джонатану Фреху
Попробуйте онлайн!
источник
*1 for
в*1for
*1
для преобразования из логического значения в целое число, вы можете сохранить байт, используя+
:(l<'D')*1for
может быть+(l<'D')for
.Пробел, 123 байта
Видимое представление:
Необъяснимая программа:
В реализации нет ничего особенно странного, единственная настоящая игра в гольф заключается в некотором странном повторном использовании временных файлов, а также в том, что они не заботятся о неограниченном росте стека, чтобы уменьшить количество байтов.
источник
Октава ,
595753 байтаЭто не работает на TIO, поскольку инструментарий связи не реализован. Он отлично работает, если вы копируете и вставляете его в Octave-online . Это даже не близко, чтобы работать код в MATLAB.
Удалось сохранить два байта, переставив матрицу после переворачивания, а не наоборот.
Объяснение:
Давайте начнем с середины
<code>
:Давайте назовем результирующий логический (двоичный) вектор для
t
.источник
Perl 5, 28 байт + 4 байта для флагов = 32 байта
Беги с флагами
-040pE
-040
устанавливает разделитель записей в пробел так, чтобы perl рассматривал каждую группу FizzBuzzes как отдельную строку, затем перебирал эти строки, изменяя F на 0, B на 1, удаляя все остальное, затем преобразовывая в двоичный файл и оттуда в ascii.источник
Желе , 9 байт
Попробуйте онлайн!
-3 байта благодаря Эрику Аутгольферу
источник
PHP, 67 байт
Ограничено до 8 букв
Попробуйте онлайн!
PHP, 77 байт
Попробуйте онлайн!
источник
Brain-Flak , 107 байт
Попробуйте онлайн!
+3 байта за
-c
флаг.объяснение
источник
q / kdb +,
41403733 байтаРешение:
Пример:
Объяснение:
Разбейте входную строку,
" "
чтобы получить отдельные спискиFizzBuzz...
, индексировать в каждом из этих списков по первому символу (то есть0 4 8 ... 28
). Возвращает логический список, определяемый тем, является ли каждый символ"B"
(ASCII66
). Преобразуйте эти списки в базу 10, а затем приведите результат к строке.источник
Haskell, 72 байта
Попробуйте онлайн!
Как это работает
источник
JavaScript ES6 - 98 байт
слишком много байтов, но, по крайней мере, читабельно
Определяется как функция, это 98 байт
тест:
Объяснение:
Сопоставляет буквы F и B и все остальное как группы
является функцией, которая захватывает группы, возвращает 0 для F и 1 для B или ''
c символ соответствует
F и B теперь параметры!
3-й . группа не указана в качестве параметра
F и B
undefined
соответствуют 3-й группе,B соответствуют
undefined
группе FРезультирующая строка 0100 .. и т. Д.
нарезается ломтиками по 8 байт
и обрабатывается как двоичная строка 0b
источник
s=>s.replace( ...
. Также, пожалуйста, укажите количество байтов в заголовке вашего ответа.let
анонимные функции.shortC , 35 байт
Конверсии в этой программе:
A
-int main(int argc, char **argv){
W
-while(
@
-argv
P
-putchar(
);}
Сильно основано на ответе Дверной ручки.
источник
APL (Dyalog Classic) , 17 байтов
объяснение
Попробуйте онлайн!
источник
05AB1E , 15 байтов
Попробуйте онлайн!
источник
Google Sheets, 94 байта
Я не знаком с бинарным FizzBuzz, но кажется, что они разделены пробелами, поэтому эта формула опирается на это. Логика довольно проста:
Fizz
с0
иBuzz
с1
источник
Java 8,
117115 байтЯ сомневаюсь, что вы можете сделать много необычных замен регулярных выражений в Java, как и большинство других ответов, главным образом потому, что вы ничего не можете сделать с захваченными группами захвата в Java-регулярных выражениях .. (т. Е.
"$1".charAt(...)
Или"$1".replace(...)
невозможно, например.)Объяснение:
Попробуй это здесь.
источник
J , 20 байт
Попробуйте онлайн!
источник