System liczb czynnikowych , zwany również silnikiem, jest mieszanym systemem liczbowym. Silnia określają wartość miejsca liczby.
W tym systemie najbardziej prawą cyfrą może być 0 lub 1, drugą prawą cyfrą może być 0, 1 lub 2 itd. Oznacza to, że n
cyfrowa liczba czynnikowa może mieć maksymalną wartość (n + 1)!
.
Na przykład, aby przekonwertować liczbę czynnikową 24201
na dziesiętną, wykonaj następujące czynności:
2 * 5! = 240
4 * 4! = 96
2 * 3! = 12
0 * 2! = 0
1 * 1! = 1
240 + 96 + 12 + 0 + 1 = 349
Stąd liczba czynnikowa 24201
jest 349
podstawą 10
.
Aby przekonwertować liczbę dziesiętną ( 349
na przykład) na liczbę czynnikową, wykonaj następujące czynności:
Weź największą silnię mniejszą niż liczba. W tym przypadku jest to 120
lub 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
Stąd 349
podstawą 10
jest liczba czynnikowa 24201
.
Twoim zadaniem jest stworzenie najkrótszego programu lub funkcji, która konwertuje liczbę wejściową na drugą bazę.
Dane wejściowe będą ciągiem reprezentującym nieujemną liczbę całkowitą. Liczba czynnikowa będzie poprzedzona znakiem !
(np. !24201
), Podczas gdy liczba dziesiętna nie będzie poprzedzona niczym. Możesz założyć, że maksymalne dane wejściowe będą 10! - 1
- 3628799
dziesiętne i 987654321
czynnikowe. Oznacza to, że litery nie będą pojawiać się na wejściu / wyjściu czynnikowym.
Program nie musi !
dodawać wyniku do wartości faktograficznej i może generować ciąg znaków lub liczbę całkowitą. Dane wejściowe mogą mieć dowolny rozsądny format.
Przypadki testowe:
Input: 1234
Output: 141120
Input: 746
Output: 101010
Input: !54321
Output: 719
Input: !30311
Output: 381
źródło
⍴⍵∩'!'
z'!'∊⍵
zapisać charakter.~'!'
się∩⎕D
zapisać charakter.Python 2.7 (
163157152)Bardziej czytelna wersja:
Awaria:
źródło
'!'==i[0]
z'!'in i
, i może korzystaća=x=1
. Ponadto nie potrzebujesz nawiasów wokół instrukcji exec.(len(i)-1)
się~-len(i)
.(a,b)['!'in i]
i udało mi się ogolić 6 znaków. Nie jest tak czytelny, jak to było ... link do pastebinGolfScript (
48 4443 znaków)To jest samodzielny program. Konwersja czynnikowa => dziesiętna jest dość wolna, ponieważ wykonuje wyszukiwanie przy użyciu konwersji dziesiętnej => zamiast bezpośredniej konwersji podstawowej.
Format wejściowy pozwala na bardzo krótki przełącznik trybu:
.~
kopiuje ciąg wejściowy i ocenia go, więc jeśli dane wejściowe to tylko liczba, to np."1234" 1234
Na stosie, a jeśli zaczyna się od!
(logicznie nie, z żadnym niepustym string jest prawdą) kończymy np.0 30311
na stosie. Zatem wartość na dole stosu jest prawdziwa dla dziesiętnej => czynnikiadyczny i fałsz dla czynnikowej => dziesiętny.źródło
PHP <7,1
178 171 170 168 164 155 147 144 138 126123 123 bajtówUruchom jako potok
-r
lub przetestuj go online .podrzędna: podstawa czynnikowa jest ponownie wykorzystywana (zwiększana / zmniejszana w pętlach)dziesiętne 0 zwraca pusty ciąg zamiast(obie inne odpowiedzi PHP też.)0
.Jeśli jest to niedopuszczalne, dodaj +5 dla dodatkowego przypadku.bez golfa:
porzucone pomysły na golfa:
$b<=$x
->$b<$x
(-1)rozbija czyste silniki dziesiętne (tj. Te, które dają liczbę silni z tylko jedną cyfrą niezerową). Cierpi na to rozwiązanie JMPC; HamZa nie.
floor($x/$b)
->(int)($x/$b)
może być nieco szybsze, ale rzutowanie tekstu poprzedza podział, więc potrzebuję nawiasów i nie zyskuję bajtu.
$x/$b|0
Zrób sztuczkęPętla de facto -> dec jest podobna do znalezienia silni w dec -> fakt. Ten sam przyrost, ciało nie ma znaczenia, ale niestety różne ustawienia wstępne i różne warunki postu. Dang; mogłem tam zagrać w golfa -21.YAY znalazłem rozwiązanie. Grałem trochę w golfa, ale odciąłem kolejne -4 (nr: -9) i zamknąłem wszystkie błędy / luki.
Czy jest jeszcze większy potencjał ... czy skończyłem grać w golfa?
źródło
+$r
zamiast$r|0
zapisać jeden bajt. To samo dlaif($x|0)
JavaScript (ES 6)
139 137 122 113111wypróbowałem inne podejście, używając magii tablic; ale skończyło się na
174172 bajtach z tym:Więc właśnie wziąłem mój kod PHP i przetłumaczyłem go. Mógłby usunąć wszystkie
$
i kilka;
, ale konieczność zainicjowania Varsa pochłonęła niektóre z tych korzyści. Udało się jednak golfowi uzyskać obie odpowiedzi nieco dalej.grał w golfa
bez golfa
pakiet testowy
źródło
.split('')
=>.split``
f=
. Ponadto możer+=(x/(b/=j--)|0)
byćr+=x/(b/=j--)|0
?Perl 6 ,
666560 bajtów-1 bajt dzięki Jo King
Wypróbuj online!
źródło
GolfScript, 69 znaków
Pobiera dane ze STDIN jak zwykle i drukuje wynik. Test online .
źródło
Haskell, 221 znaków
Code Golf
Stosowanie
Nieskluczony kod
źródło
Mathematica
213 177175Liczba czynnikowa jest zawijana
f[]
, niezależnie od tego, czy jest to wejście, czy wyjście.Stosowanie
Konwersja silni na liczbę dziesiętną .
QuotientRemainder[n,j!]
rekurencyjnie działa na cyfry liczby silni od lewej do prawej, zmniejszając sięj
z każdym krokiem.QuotientRemainder[349, 5!]
, na przykład zwroty{2, 109}
i tak dalej.Konwersja liczby dziesiętnej na silnią . Przesuwając się od prawej do lewej, funkcja czysta
# (p++)! &
mnoży każdą cyfrę#
przez odpowiednią silnię.źródło
Python, 128 znaków
Uruchomienie zajmuje około pół godziny, ale jest niewielkie:
Tworzy listę wszystkich <= 9-cyfrowych liczb czynnikowych w kolejności numerycznej, a następnie wykonuje wyszukiwanie lub indeks do konwersji.
Jeśli chcesz przetestować, wystarczy wymienić
10**9
z10**6
i ograniczać się do 6-cyfrowych numerów o zmiennej liczbie argumentów.Mógłbym technicznie uratować postać, używając
range(10**9)
zamiastxrange(10**9)
. Nie próbuj tego w domu.źródło
d+2
ifor
PHP
231214204Najnowsza odpowiedź
Stara odpowiedź
Przykład
Wydajność
źródło
foreach(range())
można ją zastąpić prostąfor
pętlą (-9). Jednak podoba mi się ten pomysł.24
powinien wrócić,1000
ale wraca400
. naprawić:g(++$p)<$x
->g(++$p)<=$x
(+1)for
konstrukcji:,
powinien wynosić;
3) Mam kolejne 7 zmian oszczędzających 20 bajtów na tym kodzie. Chcę je?if
warunek, a następnie użyj my sexy type cast to int (-6) Nie wpłynie to na wynik dziesiętny 0! e) pozostałyfor
konstrukt można przepisać bardzo ładniewhile(++$t<$c=strlen($x))
: przyrost przed ciałem -> $ t nie wymaga inicjalizacji (-6)JELLY, 5 bajtów
Wyjaśnienie
* Galaretka jest młodsza niż wiek pytania, dlatego moja odpowiedź nie jest konkurencyjna.
źródło
V
iṾ
.)Galaretka , 15 bajtów
Wypróbuj online!
Jak to działa
Dlaczego
*)
działa¬
jest logicznie elementarne NIE. Gdy podano jedną liczbę całkowitą, staje się ona pojedynczym zerem, co jest fałszem. Jednak po podaniu łańcucha każdy element (znak) jest zamieniany na zero, a cały wynik jest tablicą zer, co jest prawdą.Zero jako liczba całkowita jest szczególnym przypadkiem. Przechodzi przez ścieżkę „silnia -> liczba całkowita”, ale nadal daje zero, co jest poprawne.
Bez wbudowanej silni podstawy, 25 bajtów
Wypróbuj online!
Jak to działa
źródło
K, 102
Zdecydowanie można to poprawić.
źródło
D (159 znaków)
Bez golfa iz punktem wejścia do programu
Wszystkie argumenty wiersza poleceń są drukowane jako
<original> -> <converted>
. W rzeczywistości zaimplementowany jest tylko przecinek dziesiętny do faktadycznyx
. Odwrotnie, po prostu wywołujex
wszystkie liczby dziesiętne (0 .. *), aż wynik będzie równy wartości wejściowej. Największe wejście zajmuje ~ 3 sekund (! 987654321).Plik wykonywalny online: http://dpaste.dzfl.pl/46e425f9
źródło
string n
nachar[]n
jeden bajt (wiem, że się tu spóźniłem).if(n[0]<48){while(r.text.x<n[1..$].to!int)r++;}
możnaif(n[0]<48)while(r.text.x<n[1..$].to!int)r++;
zaoszczędzić dwa bajty.VBA 225
Dzięki Tytusowi za pomoc! Wciąż szukam golfa.
źródło
b
wartości liczbowej zamiast porównywania pierwszego znaku?If Not IsNumeric(b) Then
ale wymaga to więcej znaków. Teraz nie wszedłem i nie sprawdziłem ponownie całego kodu; może być nieco lepszy sposób na zrobienie tego zIsNumeric
ogólnym. - Korekta, tutaj jest niewielka poprawa. Dzięki!For d=9To 1Step-1
iFact(d)
->For d=0To 8
iFact(9-d)
kolejne dwa, jeśli to zrobisz,For d=2To e
iFact(e-d+1)*Mid(b,d,1)
PHP , 124 bajty
Wypróbuj online!
Rozszerzony
źródło
Perl 6 , 150 bajtów
źródło
APL (NARS), 36 znaków, 72 bajty
wydaje się, że 10⊥ (9..2) ⊤ jest lepsze niż funkcja rekurencyjna, dzięki Howardowi dla innego rozwiązania APL, które pokazuje, że ... (nawet jeśli nie rozumiem w 100%). Wprowadź liczby bez „!” <10 !. Test:
źródło