Вы разрабатываете некоторый код для генерации идентификационных номеров. Политика требует, чтобы никакие идентификационные номера не включали последовательность цифр 666 .
Создайте функцию (или эквивалент вашего языка), которая принимает положительный целочисленный параметр и возвращает следующее целое число, которое не включает 666, когда это целое число выражено в десятичном виде. (60606 в порядке, 66600 - нет.)
Ваш код не должен использовать цикл, который добавляет один, пока не найдет результат, который соответствует правилам.
f(1) returns 2.
f(665) returns 667.
f(665999999) returns 667000000 without having looped a million times.
(Following examples added since the question was first posed.)
f(666666666) also returns 667000000.
f(66600) returns 66700.
f(456667) returns 456670.
ОБНОВЛЕНИЕ:
Замена 666 на 667 не будет работать, если на входе более одного 666.
66700
.Ответы:
Python, без манипуляций со строками
Работает путем нахождения степеней 10,
p
где появляется 666, и добавленияp - n % p
кn
которым заменяется666xxxxx
на66700000
.источник
m /= 10
наm //= 10
. Если вы этого не сделаете, то m станет плавающей точкой, и условиеm % 1000 == 666
будет постоянно ложным, а остальные «666» в n остаются без изменений.JavaScript (обновлен для работы со всеми тестами)
Малоизвестная истина заключается в том, что на самом деле существует четыре
6
s, но один из них предал других и превратился в кодовую форму, чтобы искоренить их измировыхцифр чисел. Вот эта предательская шестерка:Вот объяснение. Сначала украсьте код и удалите ненужные вещи, такие как
''+'string'
и((code))
:Преобразуйте странные нотации (например,
~indexOf
и['replace']
) в более распространенные:А теперь просто поймите, что алгоритм работает так:
Если на входе уже есть 666,
иначе,
Старая версия (не работает
666666666
) :Чтобы понять это, давайте сначала украсим это:
Теперь давайте удалим ненужные вещи, такие как
'' + string
и'str' + 'ing'
, удалим ненужнуюs
переменную и изменим странность, например,-~![]
на1
:'l ength'['replace'](/ /g,'')
это просто"length"
:И
"undefined"[0]
есть"u"
, и"u".length
есть1
:Теперь мы закончили! Это должно быть довольно легко понять сейчас.
источник
666666666
666666666
, и шрифт6
~1
для!= -1
это очень круто.~a.indexOf('b')
генерирует правильный JS, попробуйте это на livecript.net!Applescript
Этот сайт не имеет достаточно ответов Applescript. Давай прогоним некоторых демонов!
Выход журнала:
Я хотел бы получить некоторые из более сильных цитат из Экзорциста в этом, но это сделало бы это опубликованным решительно NSFW. Вместо этого вы можете прочитать страницу IMDB.
источник
Perl
Вы сказали, что мы не должны увеличивать цикл. Я вообще не использую математические операторы! Вот чистый подход к подстановке регулярных выражений (нет гарантий, что это безопасно для вашего здравого смысла).
Первые три замены увеличивают число на единицу. Однажды я сам решил эту проблему, но она включала замену, которую нужно было повторять до тех пор, пока не было выполнено никаких замен, поэтому вместо этого я использовал подход Эндрю Чонга .
Четвертая подстановка превращает все цифры после a
666
в нули. Окончательная замена превращает оставшиеся666
в667
.В качестве бонуса это будет работать с несколькими целыми числами на входе, если они разделены нецифровыми символами.
источник
LiveScript
Это сгибание правил. Видите ли, вы сказали, что я не должен использовать цикл, который добавляет один, пока не найдет правильный результат. Поэтому я вычитаю минус один вместо этого!
Гольф-версия в
534845 байтов для развлечения:Спасибо user1737909 за помощь в игре в гольф.
тесты
Требуется Node.js с
LiveScript
модулем npm или совместимой библиотекой assert.источник
Рубин
Это (я думаю) первый ответ, который работает для 666666666. (За исключением хитрого вычитания -1 ответ.;))
Сейчас я спешу; объяснение будет добавлено позже.
Обновление : гораздо более эффективная версия (я полагаю, почти постоянная среда выполнения):
источник
PowerShell
источник
J
Наконец, хорошее использование для
E.
!По сути, мы находим первую позицию, в которой аргумент имеет полную
666
, и заменяем эту подстроку и все после на66700000...
до конца.Объяснил подробно:
":@>:
- Увеличить на единицу и преобразовать в строку.'666'&E.
- Создайте вектор логических значений, истинный в каждом месте, где в строке начинается «666».i.1:
- Найти индекс первого истинного в векторе, иначе вернуть длину вектора.#@[-]
- Длина строки (которая также является длиной вектора) минус результатi.
.'667'{.!.'0'~
- Возьмите подстроку «667» с длиной этого результата, добавив справа «0», если необходимо.{.~
- Возьмите подстроку с длиной исходного результата изi.
.,
- Добавить два вместе.В использовании:
И так как это не кодовый гольф, его не нужно увлекать игрой в ад с безумными оптимизациями. Все побеждают!
источник
C #
148137 символовБыл в состоянии сбрить несколько символов благодаря @recursive
Ungolfed:
Скрипка: http://dotnetfiddle.net/XB83bf
источник
Int32
может быть заменен наint
.питон
источник
Perl
Встроенный код, который изменяет содержимое внутри
$_
, довольно стандартная идеология в Perl. Может использоваться вместе с-p
флагом следующим образом:источник
J
Нет строк, петель или условных выражений:
Как и в случае с картонной коробкой, это делит число на группы из трех цифр путем деления на степени десяти. Он использует индекс первого вхождения 666, чтобы округлить число соответствующим образом.
источник
Хаскель (70 знаков)
Вот простая реализация в Haskell.
map digitToInt . show
для преобразования возможно злой идентификатор в список цифр.purge
сопоставляет шаблон зла и заменяет его хорошим эквивалентом.foldl' ((+).(*10)) 0
сокращает список цифр до одногоInteger
.Посмотрим, работает ли это!
Выглядит неплохо. И просто для удовольствия игра в гольф.
источник
Ява
Разве этого недостаточно, чтобы сделать это?
источник
String.valueOf(currentId + 1)
.return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
р
Замена 666 на 667 работ.
Результаты
источник
3 разных ответа JavaScript:
1. JavaScript (ECMAScript 6)
Преобразует число в строку, затем выполняет итерацию по каждому символу до тех пор, пока не найдет,
666
не изменит последнее значение6
на a7
и не выведет0
все последующие символы.2. JavaScript (ECMAScript 6 Draft)
Рекурсивная функция без манипуляции со строками:
Или более многословно:
тесты:
3. JavaScript
Используя регулярные выражения:
Или (то же самое, но с использованием ECMAScript 6)
источник
6.667
так что технически он все еще там. Не думаю, что это может помочь, хотя.1e20
примерно на порядок выше, что JavaScript (по крайней мере, в FireFox) будет печатать как целое число, не прибегая к научной нотации.AWK
дает
редактировать: 2-е решение
доходность
источник
awk
индексирует строки на основе 1.f(665) returns 667
как он запрашивает «следующее целое число, которое не включает 666»awk
ish и б) минимизирует использование строковых функций.Python:
Или же:
источник
666666
в667667
а667000
?Ява
Использование рекурсивной функции для нахождения крайнего левого 666 и расчета того, сколько нужно откорректировать число при повторном выводе стека вызовов.
источник
f(666666666) -> 667000000
popularity-contest
неcode-golf
.партия
Простая итеративная обработка строк.
Он начинается с первых трех символов числа (в виде строки) и продолжается до конца, пока не найдет 666, затем заменит 666 на 667 и вернется к длине строки, добавляя нули.
Все тесты дают правильные результаты.
источник
Perl, 45 байт
Единственное регулярное выражение с флагом / e выполняет всю работу здесь:
источник
SQL
Чтобы быть точным, SQL Server 2012 Transact-SQL.
источник
питон
источник
Юля
Результаты REPL
источник
C #
Я делаю это правильно
источник
УВА
В бою:
результат:
источник
C ++
Я знаю, что это не код-гольф, но (а) некоторые люди предположили, что это хороший вызов для гольфа, и (б) это мой первый ответ на вызов в гольф, я подумал, что это будет весело, и если я это сделаю это здесь, я не появляюсь в реальной проблеме гольфа для того, чтобы быть ужасным игроком в гольф. ИКС)
По сути, замена '666' на '667' работает, если вы делаете это для первого экземпляра числа, а затем выписываете конечные 0.
Гольф (
175155 символов):Ungolfed:
источник
x+=c=='6'?1:0
, вы можете сойти с рукx+=c=='6'
. Хотя не пробовал.std::
ранееstringstream
. Это не компилируется без этого.x+=c=='6'
сокращение, а также посмотрю на это с помощью цифр int, а не sstream-символов ...Рубин
источник
perl, 36 просто саб, без байтов
Более короткая версия, чем мое последнее решение, с использованием сочетания операций арифметики и регулярных выражений.
источник
С
Хорошо - без проверки границ и слишком много пробелов, но это не гольф. Также забавно немного форматировать в "while (d -> 0)".
источник