Входные данные:
Положительное целое число n, состоящее из цифр в диапазоне 0-9 .
Вызов:
Если d является старшей цифрой в целом числе, предположим, что основание числа d + 1 . Например, если целое число равно 1256, то вы должны предположить, что оно находится в base-7 , если это 10110, то вы должны предположить, что это base-2 (двоичное), а если это 159, то это десятичное число.
Теперь делайте следующее до тех пор, пока не достигнете 1: достичь целого числа от 10 до 10 или 2 2: достичь целого числа из одной цифры.
- Преобразовать целое число из base- (d + 1) в base-10
- Найдите основание этого нового целого числа (опять же, base- (d + 1), где d - самая большая цифра в новом числе)
- Переходите к шагу 1 .
Примеры:
Предположим, что ввод n = 413574 . Наибольшая цифра d = 7 , так что это основание-8 (восьмеричное). Переведите это в десятичное число и получите 137084 . Наибольшая цифра d = 8 , так что это основание-9 . Переведите это в десятичное число и получите 83911 . Наибольшая цифра - 9 , так что это десятичное число, и мы остановимся. Выход должен быть 83911 .
Предположим, что ввод n = 13552 . Наибольшая цифра d = 5 , так что это base-6 . Переведите это в десятичное число и получите 2156 . Наибольшая цифра d = 6 , так что это основание-7 . Переведите это в десятичное число и получите 776 . Наибольшая цифра d = 7 , так что это основание-8 . Переведите это в десятичное число и получите 510 . Наибольшая цифра d = 5, так что это base-6 . Переведите это в десятичное число и получите 186 . Самая высокая цифра - 8 , поэтому это база-9 . Переведите это в десятичное число и получите 159 . Самая высокая цифра 9 , так что это десятичное число, и мы остановимся. Выход должен быть 159 .
Предположим, что ввод n = 17 . Это даст нам 15 , затем 11 , затем 3 , которые мы выведем, так как это одна цифра.
Тестовые случаи:
5
5
17
3
999
999
87654321 (base-9 -> 42374116 in decimal -> base-7 -> 90419978 in decimal)
9041998
41253 (5505 -> 1265 -> 488 -> 404 -> 104 -> 29)
29
Заметки:
- Стандартные правила, касающиеся ввода / вывода, лазеек и т. Д. Вы можете принять ввод как строку
- Пояснения приветствуются
- Вы можете использовать встроенные команды преобразования базы
- Решения, в которых не используются встроенные функции преобразования базовых кодов языка (если они существуют), приветствуются, даже если они оказываются намного дольше, чем очевидный подход с использованием встроенных функций.
Видимо, это OEIS A091047 .
источник
Ответы:
Mathematica, 56 байт
Попробуйте онлайн!(Используя математику.)
Я решил проверить, как выглядит последовательность:
А вот график количества шагов, необходимых для поиска результата:
(Нажмите для увеличения версий. См. Историю изменений для графиков только до n = 1000. )
Выглядит как очень интересная смесь крупномасштабной структуры и мелкого хаоса. Интересно, что случилось с более широкими промежутками около 30 000 и 60 000?
источник
9
, поэтому они уже находятся в базе 10. Но для 30k и 60k кажется, что числа с 8 или даже 7 (должны были бы проверьте) вместо того, чтобы эти 9 всегда становились основанием 10 не более чем за один шаг.Java 8,
17216616315215114013811611499 байтПринимает вход как
String
.-64 байта благодаря @ OlivierGrégoire . И тут я подумал, что мои первые 172 были не так уж плохи ..;)
Попробуй это здесь.
Объяснение:
источник
s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}
. Также я удалил большинство своих комментариев, так как они сейчас совершенно неактуальны (b
это база, вашаa
; иs
номер, над которым мы работаем).Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));
(88), но я новичок в коде гольф. Это отрывок, верно? Есть ли способ объявить это как метод без необходимости добавлятьpublic String c(String s)
?public
, но я боюсь, что вам действительно придется использоватьString c(String s){}
для рекурсивных вызовов, даже в Java 8. Когда вы создаете лямбда- выражениеjava.util.function.Function<String, String> c=s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c.apply(""+b.valueOf(s,b));}
или интерфейс, использующийinterface N{String c(String s);}N n = s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:n.c(""+b.valueOf(s,b));};
его, вы получите « самостоятельную ссылку в инициализаторе». ошибка »в обоих случаях. Но тем не менее очень хороший подход!Pyth, 9 байт
Тестирование
Объяснение:
источник
Q
иQ
я понял.u
без третьего ввода применяется до повторения, тогда как с третьим вводом применяется фиксированное число раз.u
Лямбда имеетG
иH
, но вам не нужно использоватьH
.G
наH
имела бы тот же результат ... Кстати, неявная переменная естьG
?G
, да.H
отсчитывает от 0 с каждой итерацией, поэтому он совершенно другой. Я не совсем уверен, о чем ты говоришь. Вот пример программы , чтобы показать вам , что происходит: pyth.herokuapp.com/...JavaScript (ES6),
63 57 5453 байтаСохранено 8 байтов благодаря Shaggy и Dom Hastings
источник
+a>9||b<9
реверсной троицы.f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Python 3 ,
91 78 76 7573 байта@Emigna сбрил 5 байтов. @FelipeNardiBatista сохранил 1 байт. @ RomanGräf сэкономил 2 байта
Попробуйте онлайн!
объяснение
источник
05AB1E ,
105 байт5 байтов сохранено благодаря волшебной урне осьминога
Поскольку при больших объемах ввода это происходит очень медленно, я оставляю старую гораздо более быструю версию для тестирования. Алгоритм такой же, отличается только количество итераций.
Попробуйте онлайн!
объяснение
источник
тFZ>ö§
? Видя, как количество итераций ( как видно здесь ) кажется плато? Если вы хотите получить техническую информацию, скорость, с которой возрастают итерации, вероятно, является логарифмической ... Так что вы можете просто использовать что-то вроде:DFZ>ö§
и заявить, что он не будет работать слишком долгоn
. ИЛИ, может быть, даже:T.n>FZ>ö§
для непосредственного расчета количества итераций какlog_10(n)
.F§Z>ö
должна сработать.§
.§
,Z
возьмем старшее число в стеке вместо старшего числа в числе на вершине стека.APL (Dyalog) ,
2016 байтовПринимает и возвращает строку
(
…)⍣≡
Применять следующую функцию, пока два последовательных термина не будут идентичны:⍎¨
выполнить каждый символ (превращает строку в список чисел)(
…)
Примените к этому следующую молчаливую функцию:⌈/
найти максимум аргумента1+
добавить один⊢⊥⍨
оценить аргумент в этой базе⍕
формат (stringify, при подготовке к другому применению внешней функции)Попробуйте онлайн!
источник
Рубин ,
6056 байтПопробуйте онлайн!
источник
Mathematica, 52 байта
Чистая функция, принимающая неотрицательное целое число в качестве входных данных и возвращающая неотрицательное целое число. Использует ту же основную механику,
FromDigits[s=IntegerDigits@#,Max@s+1]
что и ответ Jenny_mathy , но используетFixedPoint
итерацию.источник
Perl 6 , 49 байт
Попробуй это
Expanded:
источник
PHP , 71 байт
Попробуйте онлайн!
источник
Пип , 17 байт
Принимает ввод в качестве аргумента командной строки. Попробуйте онлайн!
объяснение
Это было весело - я должен был вытащить операторы сравнения цепочек.
Мы хотим зациклить, пока число не станет одной цифрой ИЛИ не содержит 9. Эквивалентно, мы хотим зациклить, пока число состоит из нескольких цифр И не содержит 9. Эквивалентно, зациклить, пока число больше 9 И максимальная цифра не равна менее чем 9:
a>9>MXa
.источник
Python 2 ,
60595653 байтаСэкономили 4 байта благодаря Фелипе Нарди Батиста
Сэкономили 3 байта благодаря овам
Попробуйте онлайн!
Использование рекурсивной лямбды, сравнение результата базового преобразования с предыдущей итерацией.
источник
x==y and x or ...
какx
никогда0
(база 1). или даже(x==y)*x or ...
x and x==y or ...
, но это не сработало, но я не слишком хорошоC #,
257244243244233222 байтаНу, C # всегда занимает много байтов, но это просто смешно. Ни одна из встроенных программ не может обработать произвольную базу, поэтому мне пришлось рассчитывать конверсию самостоятельно. Ungolfed:
источник
Mathematica, 92 байта
источник
Javascript (ES6) с функцией 0 стрелки, 74 байта
источник
f('11')
после функции? Если я не пропущу что-то, что выглядит только как использование, а не как часть представления. Если это так, вы должны вынуть его из раздела кода и вставить в свое объяснение (когда вы добавляете его) и обновить количество байтов до 67.К4 , 19 байт
Решение:
Примеры:
Объяснение:
Используйте
/:
встроенные для преобразования базы.источник
Котлин , 97 байт
украшенный
Тест
TIO
TryItOnline
источник
Japt , 25 байт
Попробуйте онлайн!
источник
Желе , 9 байт
Попробуйте онлайн!
источник
C
159157 байтисточник
Scala , 119 байт
Попробуйте онлайн!
Scala , 119 байт
Попробуйте онлайн!
Оба метода работают одинаково, но в первом я помещаю
x.length-1
переменную, а во втором - нет.источник