Эта задача основана на этом видео . Я рекомендую вам посмотреть его, прежде чем пытаться решить эту проблему.
Сначала мы определим функцию. Эта функция ( OEIS ) принимает целое число n в качестве входных данных и выводит количество букв в английском представлении n (без пробелов и дефисов). Например, «три» имеет 5 букв, поэтому 3 соответствует 5.
Как показано в видео, начиная с повторения любого числа, этот процесс в конечном итоге приведет к четверке, которая будет отображаться сама на себя.
Вот грубый ориентированный график, показывающий орбиты чисел меньше 16:
12 11
\|
15 2 6 1 10 14 13
\ \|/ / / /
7 3-/ 8--/
\| /
9 0 5--/
\ \|
\-4
Ваша задача состоит в том, чтобы определить количество шагов, которые предпримет число (или количество раз, которое эта функция должна быть применена к числу) до достижения четырех (т. Е. Уровня на изображенном направленном графе).
Формирование английских чисел
Вот краткое объяснение того, как нужно формировать английские слова для этой задачи:
Числа с первого по девятнадцатый:
один, два, три, четыре, пять, шесть, семь, восемь, девять, десять, одиннадцать, двенадцать, тринадцать, четырнадцать, пятнадцать, шестнадцать, семнадцать, восемнадцать, девятнадцать
Для чисел больше девятнадцати процесс выглядит следующим образом:
Если число имеет место сотен, начните с названия цифры в месте сотен и «сотни».
например
100 -> "onehundred"
Если остаток меньше двадцати, добавьте английское представление остатка.
например
714 -> "sevenhundredfourteen"
В противном случае, если цифра десятков не равна нулю, добавьте правильное представление:
2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety
например
470 -> "fourhundredseventy"
Наконец, если есть одна цифра, добавьте ее представление
например
681 -> "sixhundredeightyone"
Дальнейшие положения
Для чисел больше ста вы должны пропустить «и» при подсчете количества букв. Например, 577 - это «пятьсот семьдесят семь», в котором 23 буквы.
Ваша программа должна принимать все целые числа больше 0 и меньше 1000 в качестве входных данных стандартными методами.
Ваша программа должна вывести количество шагов, необходимых для стандартных методов вывода.
Это кодгольф, поэтому выигрывает решение с наименьшим количеством байтов.
Контрольные примеры
1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4
источник
Ответы:
JavaScript (ES6), 106 байт
Строки, кажется, лучший способ кодировать длину, несмотря на издержки преобразования чисел.
источник
Python, с num2words,
97 113 115 94 9392 байта+16 байт (забыли переносы , что num2words применяется , который фактически не изменяют результатов любых из тестовых примеров, хотя
23
и577
имеет дефис)+2 байта (забыл включить
f=
хотя рекурсивный)-20 байт (использование
re
)-8 байты благодаря мастеру @Wheat (использование
~
, заменитьn!=4
сn-4
, и ... одна строкой импорта> _ <)-1 байты благодаря @Cyoce (пространство с
4 and
)Просто подсчитывает количество шагов; работает и для больших и отрицательных целых чисел (
\W
находит пробелы, запятые и дефисы в результате num2words):Вот последний случай, шаг за шагом:
источник
f=
ваша лямбда-функцияimport re,num2words as r
вместо двух разных утверждений.n-4
это то же самое, чтоn!=4
num2words
естьw
,re
все ещеre
- обратите внимание, что оба модуля и функции называютсяnum2words
and 1+
может быть заменен на,and-~
чтобы сохранить один байтPyth - 54 байта
Попробую рефакторинг.
Тестовый пакет .
источник
Mathematica, 89 байт
Типичный Mathematica: встроенные функции хорошие, длинные имена функций плохие.
FixedPointList
применяет свой первый аргумент (функцию) ко второму аргументу до тех пор, пока ответ не изменится, перечисляя все результаты; результаты включают исходный ввод и две копии повторного вывода, следовательно,-2
в конце. Встроенная математикаIntegerName
пробелы и дефисы, поэтому мы должны избавиться от них вручную.Досадно,
IntegerName
но вывод содержит символ «-» (Unicode # 8208), а не обычные дефисы; вот почему это представление составляет 89 байт, а не 88. (И я не мог предшествовать приведенному выше коду с четырьмя пробелами и заставить его принимать символ Unicode - любую помощь?), так что приведенный выше код не будет работать точно правильно, если его вырезать и вставить .)источник
Python 2,7,
344216208 байт:Не использует никаких внешних библиотек в отличие от других ответов Python. Принимает ввод через
stdin
и выводит наstdout
.Repl.it со всеми тестовыми примерами!
объяснение
Сначала создается 3 словаря, каждый из которых соединяет длину представлений английского слова каждого числа с числом, которое он представляет в закрытом интервале
[1,9]
в десятках и сотнях соответственно. Например, первая запись в словареd
будет ,1:3
как1
пишетсяone
на английском языке и имеет3
письмо.Затем каждое место цифр в некотором строковом входе
x
присваивается соответствующему словарю, после чего каждое число в каждом месте сопоставляется со своим значением в соответствующем словаре. Например, предположим, что введенный номер был23
. Место20
в десятках будет соединено со словаремe
, с которым он сопоставлен6
, и3
в том месте будет соединено со словаремd
, с которым оно сопоставлено5
. Эти сопоставленные цифры затем складываются вместе, чтобы представить длину английского представления числа, которое назначаетсяx
в виде строки, и,x!='4'
пока продолжается цикл while, увеличиваяc
на1
каждый раз, чтобы представить количество шагов, предпринятых до сих пор. Следовательно,23
будет соответствовать тому общему количеству шагов.11
что, в свою очередь, соответствует тому,6
что будет превращаться в,3
а затем в5
и, наконец4
, в результате чего5
Наконец, после завершения цикла
c
выводитсяstdout
значение «Расстояние до четырех», которое в этом случае будет5
.источник
Джава,
556295 байтовСпасибо @KevinCruijssen за сохранение 261 байта
Ungolfed:
источник
s++
это невозможно дляs
... Кстати, вы можете сыграть в свой код довольно много, например:int c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}