FizzBuzz настолько прост, держу пари, что вы можете сделать это задом наперед. В этом задании вам дадут длину строки FizzBuzz и вы должны дать положительное целое число, которое произвело эту строку.
Описание
Чтобы разбить это, строка FizzBuzz для n
генерируется следующим алгоритмом.
Начните с пустой строки и для каждого i=1..n
(включительно):
- Если
i
делится на3
и5
, добавьтеFizzBuzz
к строке. - Если
i
просто делится на3
добавлениеFizz
. - Если
i
просто делится на5
добавлениеBuzz
. - Если
i
не делится ни на один, добавьте десятичное представлениеi
.
Так, например, FizzBuzz(15)
это следующее:
12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz
Вам дадут Length(FizzBuzz(n))
и должны определить n
. Вы можете предположить, что вход положительный и всегда будет длиной некоторой строки FizzBuzz.
правила
Ваше решение может представлять собой законченную программу или определение функции на любом стандартно приемлемом языке. Ваша программа / функция может принимать аргументы и возвращать ответы любым общепринятым способом . Стандартные лазейки запрещены.
Вы можете предположить, что входные данные являются положительными и допустимыми (описывает длину некоторой строки FizzBuzz) и меньше, чем наибольшее целое число, изначально представленное на вашем языке.
Это кодовый гольф, поэтому выигрывает самый короткий счетчик байтов.
Примеры
Вот несколько примеров
Length(FizzBuzz(n)) -> n
1 -> 1
6 -> 3
15 -> 6
313 -> 100
3677 -> 1001
редактировать
Исправлен последний контрольный пример. Спасибо @SteadyBox.
Ответы:
Желе ,
1614 байтов2 байта сохранены с использованием новейших языковых функций
)
дляµ€
иÄ
для+\
Попробуйте онлайн! или посмотрите тестовые случаи .
Как?
Формирует список длин каждого элемента от
1
входных данных, уменьшает их путем сложения и затем находит в списке единичный индекс входных данных. (Это также означает, что неверный ввод приводит к0
«нет в списке»).источник
C
8178 байт68 байт, если вы не против преобразования
double
и обратно:источник
return i;
, потому что это стандартно принятый способ вывода в коде гольф, тогда как изменение только глобальной переменной - нет. Я подумал об использованииlog10(i)+1
, но я подумал, что это может вызвать некоторые проблемы из-за преобразования в удвоение и обратно (напримерpow(i)
, не является надежным с целыми числами). Теперь кажется, что он работает хорошо для всех положительных значений, которыеint
может представлять, поэтому я, вероятно, мог бы использовать его. (При значениях, превышающих простоеint
, иногда происходит сбой, но это не имеет значения.)n
в качестве указателя, а затем просто изменить значение, на которое он указывает в конце, но это потребовало бы больше кода на сайте вызова для того, чтобы иметь возможность напечатать значение, так что он чувствует немного как измена для меня.MATL ,
312827 байтПопробуйте онлайн!
объяснение
источник
Mathematica, 67 байт
Это быстрее и короче, чем мое первоначальное решение:
или моя отчаянная попытка сократить его:
объяснение
Стандартный
For
цикл , который с шагомn
до тех пор ,s := Length(FizzBuzz(n))
пока по меньшей мере , равен входу#
. Единственный интересный момент - как я вычисляю длину(n+1)
четвертого члена последовательности FizzBuzzисточник
MATL,
31 3028 байтИспользует ту же идею, что и решение Jonathan Allen's Jelly.
Попробуйте это на matl.suever.net !
источник
Java 8,
10097 байтGolfed:
Ungolfed:
Выход:
источник
JavaScript (ES6),
6257 байтКонтрольные примеры
Показать фрагмент кода
источник
(!(++k%3)+!(k%5)<<2||`${k}`.length)
.Javascript (ES6), 56 байт
источник
Python 3, 78 байт
Рекурсивная функция. Потребуется увеличение предела рекурсии для любого результата выше 1000.
Объяснение:
источник
Python, 93 байта
источник
к, 33 байта
Краткое (python-ish) объяснение:
Пример использования kmac 2016.06.28:
источник
постоянный ток ,
7670 байтПопробуйте онлайн!
источник
Руби,
6966 байтПервоначально, я избегал вложенной трехкомпонентного оператора чудовищности и получил до 69 байт:
источник
Java 8,
9593 байтаЭто оптимизированная версия ответа @ Snowman
источник
Groovy, 76 байт
def f(n){i=0;for(s='';s.size()<n;)s+=++i%15<1?"1"*8:i%5<1||i%3<1?"1"*4:i;i;}
По большей части совпадает с ответом @ Snowman , но использует некоторую магию / различия Groovy для сокращения количества байтов.
источник
Perl 6 ,
5552 байтаПопробуйте онлайн!
Как это устроено
источник
Japt , 20 байт
Попытайся
источник
Perl 5
-p
, 48 байтПопробуйте онлайн!
источник
C (gcc) , 68 байтов,
stdout
спамПопробуйте онлайн!
C (gcc) , 74 байта
Попробуйте онлайн!
источник
05AB1E , 17 байт
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник