Системный номер Факториал , называемый также factoradic, смешанная система счисления с номером. Факториалы определяют стоимость места числа.
В этой системе крайняя правая цифра может быть 0 или 1, вторая правая цифра может быть 0, 1 или 2 и т. Д. Это означает, что n
цифра факторадического числа может иметь максимальное значение (n + 1)!
.
Например, чтобы преобразовать фактическое число 24201
в десятичное, вы должны сделать это:
2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349
Следовательно, фактическое число 24201
является 349
базовым 10
.
Чтобы преобразовать десятичное число ( 349
в качестве примера) в факторическое число, вы должны сделать это:
Возьмите самый большой факториал меньше, чем число. В этом случае это 120
или 5!
.
349 / 5! = 2 r 109
109 / 4! = 4 r 13
13 / 3! = 2 r 1
1 / 2! = 0 r 1
1 / 1! = 1 r 0
Следовательно, 349
база 10
- фактическое число 24201
.
Ваша задача - создать самую короткую программу или функцию, которая преобразует входной номер в другую базу.
Входными данными будет строковое представление неотрицательного целого числа. Фактическому числу будет предшествовать !
(например, !24201
), в то время как десятичному числу ничего не будет предшествовать. Вы можете предположить, что максимальный ввод будет 10! - 1
- 3628799
в десятичной и 987654321
фактической. Это означает, что буквы не будут отображаться при фактическом вводе / выводе.
Программа не должна добавлять !
перед факторическим выводом и может выводить строку или целое число. Ввод может быть в любом разумном формате.
Тестовые случаи:
Input: 1234
Output: 141120
Input: 746
Output: 101010
Input: !54321
Output: 719
Input: !30311
Output: 381
источник
⍴⍵∩'!'
с ,'!'∊⍵
чтобы сохранить характер.~'!'
на,∩⎕D
чтобы сохранить символ.Python 2,7 (
163157152)Более читаемая версия:
Сломать:
источник
'!'==i[0]
с'!'in i
, и можете использоватьa=x=1
. Кроме того, вам не нужны скобки вокруг оператора exec.(len(i)-1)
на~-len(i)
.(a,b)['!'in i]
и сумел сбрить 6 символов. Это не так читабельно, как это было, хотя ... ссылка дляGolfScript (
48 4443 символов)Это отдельная программа. Десятичное преобразование factoriadic => является довольно медленным, потому что оно выполняет поиск с использованием десятичного => факториального преобразования, а не прямого базового преобразования.
Входной формат допускает очень короткое переключение режимов:
.~
копирует входную строку и оценивает ее, поэтому, если ввод - это просто число, которое мы заканчиваем, например,"1234" 1234
в стеке, и если оно начинается с!
(не логично, с любым непустым значением) строка, являющаяся правдивой) мы в конечном итоге, например,0 30311
в стеке. Тогда значение в нижней части стека истинно для десятичного => факториального и ложно для факторного => десятичного.источник
PHP <7,1
178 171 170 168 164 155 147 144 138 126123 байтаЗапустите как трубу с
-r
или проверьте это онлайн .субафункция необходимо: факториал база повторного использования (incresed / уменьшается в петлях)десятичное 0 возвращает пустую строку вместо(оба других ответа PHP делают тоже.)0
.Если это недопустимо, добавьте +5 для дополнительного случая.ungolfed:
заброшенные идеи игры в гольф:
$b<=$x
->$b<$x
(-1)сломает чистые десятичные факториалы (то есть те, которые приводят к факториальному числу только с одной ненулевой цифрой). Решение JMPC страдает от этого; ХамЗа нет.
floor($x/$b)
->(int)($x/$b)
может быть немного быстрее, но приведение типов предшествует делению, поэтому мне нужны скобки, а не байт.
$x/$b|0
делает трюкЦикл по факту -> dec подобен факториалу в dec-> факте. Тот же прирост, тело не имеет значения, но, к сожалению, другие предустановки и другое состояние поста. Dang; мог бы сыграть в гольф -21 там.Я нашел решение. Взял совсем немного игры в гольф, но отрубил еще -4 (нет: -9) и закрыл все жучки / лазейки.
Есть еще потенциал ... или я сделал гольф?
источник
+$r
вместо$r|0
сохранения одного байта. То же самое дляif($x|0)
JavaScript (ES 6)
139 137 122 113111попробовал другой подход с использованием некоторой магии массива; но в итоге я получил
174172 байта:Поэтому я просто взял свой PHP-код и перевел его. Может удалить все
$
s и несколько;
, но необходимость инициализации переменных израсходовала часть этой выгоды. Хотя оба умудрились сыграть в гольф, все же немного ниже.golfed
ungolfed
тестирование
источник
.split('')
=>.split``
f=
. Кроме того, можетr+=(x/(b/=j--)|0)
бытьr+=x/(b/=j--)|0
?Perl 6 ,
666560 байт-1 байт благодаря Джо Кингу
Попробуйте онлайн!
источник
GolfScript, 69 символов
Принимает ввод из STDIN как обычно и печатает результат. Интернет тест .
источник
Haskell, 221 символ
Код Гольф
использование
Код без правил
источник
Mathematica
213 177175Факториальное число включается
f[]
, независимо от того, является ли оно входным или выходным.использование
Преобразование факториала в десятичное число .
QuotientRemainder[n,j!]
рекурсивно действует на цифры факторного числа слева направо, уменьшаясьj
на каждом шаге.QuotientRemainder[349, 5!]
например, возвращает{2, 109}
и так далее.Преобразование десятичного числа в факториальное число . Перемещение справа налево, чистая функция,
# (p++)! &
умножает каждую цифру#
на соответствующий факториал.источник
Питон, 128 символов
Это займет около получаса, но это мало:
Он строит список всех фактических чисел <= 9 цифр в числовом порядке, а затем выполняет поиск или индекс для преобразования.
Если вы хотите проверить, просто заменить
10**9
с10**6
и ограничивать себя 6-значные числа переменного числа.Я мог бы технически сохранить персонажа, используя
range(10**9)
вместоxrange(10**9)
. Не пытайтесь делать это дома.источник
d+2
иfor
PHP
231214204Самый новый ответ
Старый ответ
пример
Выход
источник
foreach(range())
может быть заменен простымfor
циклом (-9). Мне нравится идея, хотя.24
должен вернуться,1000
но возвращается400
. исправить:g(++$p)<$x
->g(++$p)<=$x
(+1)for
конструкции:,
должно быть;
3) у меня есть еще 7 изменений, сохраняющих 20 байтов в этом коде. Хотите их?if
условие, затем используйте мой сексуальный тип приведен к int (-6) Это не повлияет на результат десятичного 0! д) оставшаясяfor
конструкция может быть переписана с очень хорошимwhile(++$t<$c=strlen($x))
: приращение перед телом -> $ t не нуждается в инициализации (-6)Желе, 5 байт
объяснение
* Желе моложе возраста вопроса, поэтому мой ответ неконкурентен.
источник
V
иṾ
.)Желе , 15 байт
Попробуйте онлайн!
Как это работает
Почему
*)
работает¬
поэлементно логично НЕ. Когда задано одно целое число, оно становится единичным нулем, что ложно. Однако, когда задана строка, каждый элемент (символ) превращается в ноль, и весь результат представляет собой массив нулей, который является истинным.Ноль как целое число - это особый случай. Он проходит по маршруту "factorial -> integer", но все равно дает ноль, который является правильным.
Без встроенной факториальной базы, 25 байт
Попробуйте онлайн!
Как это работает
источник
К, 102
Определенно может быть улучшено.
источник
D (159 символов)
Неуправляемый и с точкой входа в программу
Все аргументы командной строки выводятся как
<original> -> <converted>
. Только десятичные к фактическим фактически осуществлены вx
. И наоборот, просто вызываетx
все десятичные числа (0 .. *), пока результат не станет равным входному значению. Это займет ~ 3 секунды для самого большого ввода (! 987654321).Исполняемая онлайн-версия: http://dpaste.dzfl.pl/46e425f9
источник
string n
чтобыchar[]n
сохранить один байт (я знаю, что я опоздал здесь).if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}
можноif(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
сэкономить два байта.VBA 225
Спасибо Титу за помощь! Все еще ищу в гольф еще.
источник
b
числовое значение вместо сравнения первого символа?If Not IsNumeric(b) Then
но это займет больше символов. Я не пошел и не пересмотрел весь код; может быть немного лучший способ сделать это вIsNumeric
целом. - Исправление, здесь есть небольшое улучшение. Благодарность!For d=9To 1Step-1
иFact(d)
->For d=0To 8
иFact(9-d)
еще два, если вы это сделаетеFor d=2To e
иFact(e-d+1)*Mid(b,d,1)
PHP , 124 байта
Попробуйте онлайн!
расширенный
источник
Perl 6 , 150 байт
источник
APL (NARS), 36 символов, 72 байта
кажется, что 10⊥ (9..2) better лучше, чем рекурсивная функция, благодаря Говарду за другое решение APL, которое показывает, что ... (даже если я не понимаю 100%). Ввод для чисел без '!' <10 !. Тест:
источник