Перетворити в систему числення факторіїв і з неї


27

Системний номер Факторіал , званий також 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

Відповіді:


10

APL, 39 37 символів

{A B←(9⍴10)(⌽1+⍳9)⌽⍨'!'∊⍵⋄A⊥B⊤⍎⍵~'!'}

Приклади:

      {A B←(9⍴10)(⌽1+⍳9)⌽⍨'!'∊⍵⋄A⊥B⊤⍎⍵~'!'}'1234'
141120
      {A B←(9⍴10)(⌽1+⍳9)⌽⍨'!'∊⍵⋄A⊥B⊤⍎⍵~'!'}'!54321'
719

1
Я думаю , що можна замінити ⍴⍵∩'!'з , '!'∊⍵щоб зберегти характер.
Нестабільність

@ Нестабільність Так можна. Я також знайшов ще один.
Говард

11
IMO, що має слово "pwn" у вашому сценарії, цілком вартує додаткового символу.
ejrb

1
Я згоден з ejrb. Ви б зламали це, будь ласка?
Тіт

1
Замініть ~'!'на, ∩⎕Dщоб зберегти персонаж.
Адам

9

Python 2.7 ( 163 157 152)

i=raw_input()
exec("b='';a=362880;j=int(i);x=9;"+'b+=`j//a`;j%=a;a/=x;x-=1;'*9,"a=x=1;b=0;"+'b+=a*int(i[-x]);x+=1;a*=x;'*~-len(i))['!'in i]
print int(b)

Більш прочитана версія:

i=raw_input()
if'!'in i:a=x=1;b=0;c='b+=a*int(i[-x]);x+=1;a*=x;'*~-len(i)
else:b='';a=362880;j=int(i);x=9;c='b+=`j//a`;j%=a;a/=x;x-=1;'*9
exec c;print int(b)

Зламатися:

Factoradic -> Decimal, when i is in the form !(number)
a=1   #Factorial value (multiplied every iteration)
x=1   #Index value
b=0   #Output
iterate ~-len(i) times:    #PSEUDOCODE! bitwisenot(a) = ~a = -a-1
    b+=a*int(i[-x])        #add the value of the xth last character in the factoradic #
    x+=1                   #Increment x
    a*=x                   #Set a to x!, (x-1)! * x = x!

Decimal -> Factoradic
b=''                       #Output
a=362880                   #Factorial value, set to 9! here
j=int(i)                   #Integer value of the input
x=9                        #Index value
iterate 9 times:           #PSEUDOCODE! This block is in an exec() loop
    b+=`j/a`               #Add floor(j/a) to b
    j%=a                   #Take out all multiples of a in j
    a/=x                   #Set a to (x-1)!, x! / x = (x-1)!
    x-=1                   #Decrement x

1
Приємне рішення. Я думаю , ви можете замінити '!'==i[0]з '!'in i, і можете використовувати a=x=1. Крім того, вам не потрібні дужки навколо оператора exec.
grc

1
Ви також можете замінити (len(i)-1)на ~-len(i).
Нестабільність

@ Нестабільність, grc: Дякую! Я повинен навчитися своїх
розрядних

1
Хороша відповідь, я взяв на себе зусилля, намагаючись замінити оператор if (a,b)['!'in i]і зміг погладити 6 символів. Це не так читабельно, як це було, хоч ... посилання на
пастібін

@erjb: Дякую за пропозицію! Я використав 2 кортежі з кодом як рядок, який відповідає функції exec, яка зберігає ще два символи :)
beary605

8

GolfScript ( 48 44 43 символи)

.~\{1{):?\.?%\?/@}9*{*+}+9*}:^{:N,{^N=}?}if

Це автономна програма. Перетворення factoriadic => відбувається досить повільно, оскільки воно здійснює пошук, використовуючи десяткове => факторіадичне перетворення, а не пряме базове перетворення.

Формат введення дозволяє перемикати дуже короткий режим: .~копіює рядок введення та оцінює його, тому якщо вхід є лише числом, яке ми закінчуємо, наприклад, "1234" 1234на стеку, і якщо він починається з !(логічно, ні, з будь-яким не порожнім) рядок є truthy) ми закінчуємо, наприклад, 0 30311на стеці. Тоді значення в нижній частині стека є truthy для десяткової => факторіадичної та хибною для factoriadic => десяткової.


4

PHP <7,1 178 171 170 168 164 155 147 144 138 126 123 байт

for($b=$j=1,$i=strlen($x=$argn);+$x?$b<=$x:--$i;$b*=++$j)$r+=$x[$i]*$b;if(+$x)for(;$j>1;$x%=$b)$r.=$x/($b/=$j--)|0;echo+$r;

Запустити як трубу з -rабо випробувати його в Інтернеті .

  • не потрібно розширення
  • немає підп потрібна функція: факторна база використовується повторно (збільшується / зменшується в циклі)
  • чиста ціла та рядкова арифметика, повинна працювати навіть у php 3 (і досі працює у php 7):
  • decimal 0 повертає порожній рядок замість 0. (обидва інші відповіді PHP теж роблять.) Якщо це неприпустимо, додайте +5 для додаткового випадку.

неозорений:

// two loops in one: compute the decimal number from a factorial
// or find the first factorial larger than a decimal $x
// the latter inits $r with '0': $i=strlen -> $x[$i]=='' -> (int)$x[$i]==$x[$i]*$b==0
// $b is the current digit´s base; $j is the bases´ latest factor
for($b=$j=1,$i=strlen($x=$argn);+$x?$b<=$x:--$i;$b*=++$j)
    $r+=$x[$i]*$b;
// and now for dec->fact ...
if(+$x)
    for(;$j>1;$x%=$b)
        // both $b and $j are one step too far in the first iteration;
        // -> decrement must precede the actual loop body
        // -> can be merged into the digit calculation -> all braces golfed
        $r.=$x/($b/=$j--)|0;
        // now: go on with the remainder (see loop head)
echo+$r; // final type cast removes leading zeros (from the first loop)
    // and fixes the '0' result (no operations at all on that input!)

покинуті ідеї гольфу:

  • $b<=$x-> $b<$x(-1)
    розбиває чисті десяткові факториали (тобто ті, що призводять до фактичного числа лише з однією ненульовою цифрою). Рішення JMPC страждає від цього; ХамЗа ні.
  • floor($x/$b)-> (int)($x/$b)
    може бути трохи швидше, але кастинг типу передує поділу, тому мені потрібні дужки та не набирають байт.
    $x/$b|0робить трюк
  • Цикл насправді-> dec схожий на факторіал-знаходження у dec-> факт. Приріст одного тіла не має значення, але, на жаль, відрізняється попередньою задачею та різною умовою поста. Данг; міг там пограти в гольф -21.
    ТАК Я знайшов рішення. Взяв зовсім небагато гольфу, але рубав ще -4 (ні: -9) і закрив усі помилки / лазівки.

Більше потенціалу ... чи я займаюся гольфом?


@ JörgHülsermann Дякую за підказку.
Тит

1
+$rзамість того, щоб $r|0зберегти один байт. Те саме дляif($x|0)
Йорг Гюльсерманн

3

JavaScript (ES 6) 139 137 122 113 111

спробував інший підхід, використовуючи якусь магію масиву; але я закінчився 174 172 байтами:

f=x=>{if('!'==x[0]){a=x.split``.reverse();i=b=1;r=0;a.pop();a.map(d=>{r+=d*b;b*=++i})}else{t=[];for(i=b=1;b<=x;b*=++i){t.unshift(b)}r='';t.map(b=>{r+=x/b|0;x%=b})}return r}

Тому я просто взяв свій PHP-код і переклав його. Можна було видалити всі $s та декілька ;, але необхідність ініціалізації vars з'їла частину цієї вигоди. Хоча вдалося пограти в гольф і відповіді трохи далі, хоча.

гольф

f=x=>{for(r=0,b=j=1,i=x.length;x|0?b<=x:--i;b*=++j)r+=x[i]*b;if(x|0)for(r='';j>1;x%=b)r+=x/(b/=j--)|0;return r}
  • перша версія повертає '' для десяткової 0; додати +2, щоб виправити
  • друга версія вимагає рядкового введення
  • як тестовані в Firefox, Edge та Opera

неозорий

f=x=>
{
    for(r=0,b=j=1,i=x.length;x|0?b<=x:--i;b*=++j)
        r+=x[i]*b;
    if(x|0)
        for(r='';j>1;x%=b)
            r+=x/(b/=j--)|0;
    return r
}

тестовий набір

<table id=out border=1><tr><th>dec</th><th>result<th>expected</th><th>ok?</th></tr></table>
<script>
    addR=(r,s)=>{var d=document.createElement('td');d.appendChild(document.createTextNode(s));r.appendChild(d)}
    test=(x,e)=>{var y=f(x),r=document.createElement('tr');addR(r,x);addR(r,y);addR(r,e);addR(r,e==y?'Y':'N');document.getElementById('out').appendChild(r)}
    samples={'349':'24201','1234':'141120','746':'101010','719':'54321','381':'30311','24':'1000','0':'0'};
    for(d in samples){test(d,samples[d]);test('!'+samples[d],d)}
</script>

1
ES5 не містить позначення стрілки IIRC. А якщо ви збираєтесь використовувати ES6, то .split('')=>.split``
Zacharý

@ Zacharý Gna Я мав би зазначити, у якому браузері я тестував його ... можливо, Firefox чи Opera. Так ES 6?
Тит

Так, позначення стрілки - ES6.
Zacharý

1
О, це мене зловило, я вважав, що код коду вгорі - це ваше рішення! Незважаючи на це, я не думаю, що потрібно говорити f=. Також, може r+=(x/(b/=j--)|0)бути r+=x/(b/=j--)|0?
Zacharý


1

GolfScript, 69 символів

10,1>{1$*}*](.0=33={1>01/-1%0\{~@(@*@+}/\}{~\-1%{1$<},{1$1$/@@%}/}if;

Здійснює введення даних STDIN як завжди і друкує результат. Інтернет-тест .


1

Haskell, 221 символів

Код гольф

m v@(a:b)|a=='!'=(sum.zipWith(*)g.map(read.(:[])).reverse) b|True=(fst.until((<0).fst.snd)(\(s,(i,b))->(s*10+b`quot`f i,(i-1,b`rem`f i))).(\n->(0,((1+).last.takeWhile((n>=).f)$[1..], n))).read) v;g=scanl1(*)[1..];f=(g!!)

Використання

$ ghci factorial.hs
ghci> m "1234"
 141120
ghci> m "!54321"
 719

Невикористаний код

parse v@(a:b) | a == '!' = to b
              | otherwise = from v

to = sum . zipWith (*) factorials . map (read . (:[])) . reverse

from = fst . until finished next . boostrap . read
    where finished = ((<0) . fst . snd)
          next (s,(i,r)) = (s * 10 + r `quot` factorial i, (i-1 ,r `rem` factorial i))
          bootstrap n = (0, (lastFact n, n))
          lastFact n = (1+) . last . takeWhile ((n>=) . factorial) $ [1..]

factorials = scanl1 (*) [1..]

factorial = (factorials!!)

На сьогоднішній день найбільш читабельний запис. Haskell FTW!
Soham Chowdhury

1

Mathematica 213 177 175

Факторний номер загорнутий f[], будь то вхід чи вихід.

g@{n_,j_,r_}:=If[j==0,FromDigits@r,g@{q=QuotientRemainder[n,j!];q[[2]],j-1,Append[r,q[[1]]]}]
z@n_:=If[!IntegerQ@n, g[{n[[1]],9,{}}], f@Tr@(p=1;# (p++)!&/@Reverse@IntegerDigits@n)]

Використання

z[24201]

f [349]

z[f[349]]

24201 рік

Перетворення факторіалу в десяткове число . QuotientRemainder[n,j!]рекурсивно діє на цифри фабричного номера зліва направо, зменшуючись jна кожному кроці. QuotientRemainder[349, 5!], наприклад, повертає {2, 109}тощо.

Перетворення десяткової у фактичну кількість . Переміщення праворуч ліворуч, чиста функція # (p++)! &, множує кожну цифру, #відповідною факторною формою.


1

Пітон, 128 символів

На це потрібно близько півгодини, але це мало:

A=[`x`for x in xrange(10**9)if all(x/10**d%10<d+2 for d in range(9))]
i=raw_input()
print A.index(i[1:])if'!'in i else A[int(i)]

Він будує список усіх <= 9-значних факторадикальних чисел у числовому порядку, потім здійснює пошук або індекс для перетворення.

Якщо ви хочете протестувати, просто замініть 10**9 на10**6 і обмежувати себе 6-значні числа змінного числа.

Я міг технічно зберегти персонажа, використовуючи range(10**9)замість цього xrange(10**9). Не спробуйте цього вдома.


Між d+2for
місцями

1

PHP 231 214 204

Найновіша відповідь

function g($x){return $x?$x*g($x-1):1;}function f($x,$e){if($x[0]=="!"){for($t=1;$t<$c=strlen($x);$t++){$e+=$x[$t]*g($c-$t);}}else{while(g(++$p)<=$x);while(--$p){$e.=floor($x/g($p));$x%=g($p);}}return$e;}

Стара відповідь

 function f($n){if($n[0]=="!"){$n=str_split($n);$c=count($n);$f=$y=1;while($c-->1){$e+=($f*$n[$c]);$f*=++$y;}return$e;}else{for($i=$c=1;$i<$n;$i*=$c){$r[$c++]=$i;}foreach(array_reverse($r)as$t){$e.=floor($n/$t);$n=$n%$t;}return$e;}}

Приклад

echo f('349')."\n"
    .f('!24201')."\n"
    .f('1234')."\n"
    .f('746')."\n"
    .f('!54321')."\n"
    .f('!30311');

Вихідні дані

24201
349
141120
101010
719
381

2
Я рахую 212 для нової відповіді, а не 214. $ e не потребує ініціалізації (-6), і foreach(range())можна замінити простим forциклом (-9). Ідея мені подобається.
Тит

2
неправильний результат для чистих фабрикантів. 24повинен повернутися, 1000але повертається 400. виправити: g(++$p)<$x-> g(++$p)<=$x(+1)
Тит

@Titus Дякую за обидва відповіді! Я оновив свою відповідь. Я вдячний, що ти допомагаєш мені покращити мою відповідь, коли твій здається набагато вищим.
JPMC

1
1) Я рахую на 2 менше, ніж ви, знову ж таки: 204, а не 206. Чи включаєте ви перерив рядка Windows у свій байт? 2) синтаксична помилка в forконструкції: ,повинна бути ;3) У мене є ще 7 змін, заощаджуючи 20 байт на цьому коді. Хочете їх?
Тит

2
Ну, це насправді лише 5 змін, але одна з них має три частини. а) застарілий другий аргумент для f () (-3) б) застарілий пробіл у функції g (-1) в) застарілі дужки у справжній гілці (-4) г) підміняти справжні та помилкові гілки, перевернути ifумову, а потім використовувати мій сексуальний тип, поданий до int (-6) Це не вплине на результат десяткової 0! д) решту forконструкції можна переписати дуже приємно while(++$t<$c=strlen($x)): приріст перед тілом -> $ t не потребує ініціалізації (-6)
Тит

1

JELLY, 5 байт

Æ!ŒṘ€

Пояснення

Æ!ŒṘ€
Æ!     -Convert to factoriadic (list form)
  ŒṘ€  -Construct string

* Jelly молодший за вік питання, тому моя відповідь є неконкурентною.


1
Ласкаво просимо до PPCG! Я думаю, що Джеллі молодший за цей виклик, тому ви повинні позначити свою відповідь як неконкурентну.
Лайконі

О, я не усвідомлював, що це правило. Зроблю.
DaggerOfMesogrecia

Чи не відповіді на цей виклик означали працювати обома способами? Це, здається, працює одним способом; ви можете виправити це. (На окремій примітці, якщо ви перетворюєте між цілими числами і рядками в Jelly, зазвичай не можна використовувати деяку комбінацію Vі .)

1

Желе , 15 байт

ḊV€;0Æ¡µÆ!ṖḌƊ¬?

Спробуйте в Інтернеті!

Як це працює

ḊV€;0Æ¡µÆ!ṖḌƊ¬?     Main link (monad). Input: integer or string
             ¬?  *) If the given input is a string, run 1); otherwise run 2)

ḊV€;0Æ¡  1) Factorial base -> integer
ḊV€         Remove "!" and map each char to number
   ;0       Append zero (this is needed to run the built-in correctly)
     Æ¡     Built-in conversion

Æ!ṖḌ  2) Integer -> factorial base
Æ!       Built-in conversion
  ṖḌ     Remove a zero at the end, and convert to decimal

Чому *)працює

¬є елементарно логічним НЕ. Коли йому дано одне ціле число, воно стає одиничним нулем, що є помилковим. Однак, коли дається рядок, кожен елемент (символ) повертається до нуля, а весь результат - це масив нулів, що відповідає дійсності.

Нуль як ціле число - це особливий випадок. Він проходить маршрут "factorial -> integer", але все одно дає нуль, що є правильним.

Без вбудованої факторної бази, 25 байт

⁵R!µ³%Ḋ:ṖUḌ
⁵R!ḋḊUV€ƊµÇ¬?

Спробуйте в Інтернеті!

Як це працює

⁵R!µ³%Ḋ:ṖUḌ  Aux. link (monad). Integer -> factorial base
⁵R!µ         Set (1..10)! as left argument
    ³%Ḋ:Ṗ    Compute each digit: (input % (2..10)!) // (1..9)!
         UḌ  Reverse and convert the digit array to decimal

⁵R!ḋḊUV€ƊµÇ¬?  Main link (monad).
         怪?  If the input is a string, apply the left chain;
               otherwise, apply the aux. link above
⁵R!            (1..10)!
   ḋ           Dot product with...
    ḊUV€Ɗ      Remove "!", reverse, map each character to digit

0

К, 102

"I"$,/$*:'|:'{{(x-y*g),g:_(x:*x)%y:*/1+!y}\[x,0n;|1+!{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]]}

Однозначно можна покращити.

k)"I"$,/$*:'|:'{{,[;g]x-y*g:_(x:*x)%y:*/1+!y}\[(x;0n);|1+!{{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]}x]} 349
24201
k)"I"$,/$*:'|:'{{,[;g]x-y*g:_(x:*x)%y:*/1+!y}\[(x;0n);|1+!{{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]}x]} 746
101010
k)"I"$,/$*:'|:'{{,[;g]x-y*g:_(x:*x)%y:*/1+!y}\[(x;0n);|1+!{{$[(x>(*/1+!y))&x<*/1+!y+1;y;.z.s[x;1+y]]}[x;0]}x]} 1234
141120

0

D (159 символів)

int x(string n){import std.conv;int r,i=9,f=9*'鶀',d;if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}else{d=n.to!int;while(i){r=r*10+d/f;d%=f;f/=i--;}}return r;}

Безлічі та з точкою входу до програми

Всі аргументи командного рядка друкуються як <original> -> <converted>. Насправді реалізовано лише десятковий до фактичний x. В інший бік просто дзвінки xз усіма десятковими числами (0 .. *), поки результат не дорівнює вводу. На це потрібно ~ 3 секунди для найбільшого входу (! 987654321).

Виконана онлайн версія: http://dpaste.dzfl.pl/46e425f9

void main(string[] args) {
    import std.stdio;
    foreach (arg; args[1 .. $]) {
        writefln("%s -> %s", arg, x(arg));
    }
}

int x(string n) {
    import std.conv;
    int r, i=9, f=9*'鶀', d;  // 鶀's Unicode index equals 8*7*6*5*4*3*2*1

    // If the first character value is less than 48 ('0') it should be a '!'.
    if (n[0] < 48) {
        // Call x with different input (0..*) until it matches our n.
        // r.text.x is rewritten as x(text(r)).
        while (r.text.x < n[1..$].to!int) r++;
    } else {
        d = n.to!int;
        // Try d / 9!, d / 8!, etc. just as in the problem description.
        while (i) {
            r = r*10 + d/f;
            d %= f;
            f /= i--;
        }
    }
    return r;
}

Я думаю, що можна змінити, string nщоб char[]nзберегти один байт (я знаю, я тут запізнююся).
Zacharý

Крім того, я думаю, що це 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++;для збереження двох байтів.
Zacharý

0

VBA 225

Дякуємо Тіту за допомогу! Ще шукаю гольфу ще трохи.

Sub a(b)
Set w=WorksheetFunction
e=Len(b)
If IsNumeric(b) Then
i=0
For d=0To 8
h=w.Fact(9-d)
g=b Mod h
If g<b+i Then
i=1
f=f &Int(b/h)
b=g
End If
Next
Else
For d=2To e
f=f+w.Fact(e-d-1)*Mid(b,d,1)
Next
End If
MsgBox f
End Sub

Я не знаю VBA, але чи є спосіб перевірити bчислове значення замість порівняння першого символу?
Тит

@Titus Існує числовий чек, і еквівалент тут буде:, 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)
Тит

Чи можна записати тип, переданий Int, іншим способом?
Тит

@Titus Подивись на тебе, бігаючи кола навколо мене. :) Я зараз налаштовую ... Щодо Int (), я не думаю, що існує простіший (менший) метод, ні.
Гаффі

0

PHP , 124 байти

for($f=1;("$">$a=$argn)&&~$c=strrev($a)[$n];)$r+=$c*$f*=++$n;for(;$a>=$f*=++$i;);for(;~-$i;$a%=$f)$r.=0|$a/$f/=$i--;echo+$r;

Спробуйте в Інтернеті!

Розширений

for($f=1;("$">$a=$argn)&&~$c=strrev($a)[$n];) # runs in case of "!" at the beginning
  $r+=$c*$f*=++$n; #reverse string multiply with the next factorial "!"*$f=0
for(;$a>=$f*=++$i;); # runs not in case of "!" at the beginning string comparing. search the factorial that is higher as input value
for(;~-$i;$a%=$f) # runs only when the second loop had runs
  $r.=0|$a/$f/=$i--; # concat the value of the division with the highest factorial used
echo+$r; # Output result

0

Perl 6 , 150 байт

{/^\!/??([+] [Z*] .comb.skip.reverse,[\*] 1..*)!!(reduce
->\a,\b{a[0]~a[1] div b,a[1]%b},("",+$_),|(first
*[*-1]>$_,[\,] [\*] 1..*).reverse[1..*])[0]}

0

APL (NARS), 36 символів, 72 байти

{⍵⊆⎕D:10⊥(9..2)⊤⍎⍵⋄t+.×⌽!⍳≢t←⍎¨,1↓⍵}

здається, що 10⊥ (9..2) ⊤ краще, ніж рекурсивна функція, завдяки Говарду за інше рішення APL, яке показує, що ... (навіть якщо я не розумію на 100%). Введіть для цифр без "!" <10 !. Тест:

  u←{⍵⊆⎕D:10⊥(9..2)⊤⍎⍵⋄t+.×⌽!⍳≢t←⍎¨,1↓⍵}    
  u¨'1234' '746' '!54321' '!30311' '!24201'    
141120 101010 719 381 349 
  u '0'
0
  u '!0'
0
  u '9'
111
  u '!111'
9
  u '!9'
9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.