Nie mylić z Znajdź silnię!
Wprowadzenie
Silnia liczby całkowitej n
można obliczyć przez
Jest to stosunkowo łatwe i nic nowego. Jednak silnie można rozszerzyć do podwójnych silni , tak że
o parzystych numerach, a
dla liczb nieparzystych. Ale nie ograniczamy się do podwójnych silni. Na przykład
i
lub
w zależności od wartości wyjściowej.
Podsumowując:
gdzie
Lub, w prostym języku angielskim:Kilkakrotnie odejmij liczbę czynnikową od liczby podstawowej i pomnóż wszystkie uzyskane liczby całkowite dodatnie.
Wyzwanie
Napisz funkcję, która obliczy każdy rodzaj powtarzanej silni dla dowolnej nieujemnej liczby całkowitej.
Wkład
Zarówno
- Ciąg zawierający nieujemną liczbę całkowitą dziesiętną, po której następuje 1 lub więcej wykrzykników. Np
"6!"
lub"9!!"
lub"40!!!!!!!!!!!!!!!!!!!!"
.
lub
- Te same wartości reprezentowane przez dwie liczby całkowite: jedną nieujemną wartość bazową i jedną wartość dodatnią reprezentującą liczbę czynnikową. Można to zrobić zgodnie z dowolnym formatem z domyślnych reguł we / wy.
Wydajność
Wynik wspomnianych obliczeń.
Uwagi na temat wyzwania
0!
równa się1
z definicji. Twój kod musi to uwzględniać.- Silnia liczba jest ograniczona poza tego zakresu, można w nich produkcji, co. Poza tym
0!
, co jest jedynym wyjątkiem od tej reguły.
Przykłady
Input Output
3!!! 3
0! 1
6! 720
9!! 945
10!!!!!!!! 20
40!!!!!!!!!!!!!!!!!!!! 800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41697106428257280000000000000000
Wypróbuj z nieogoloną implementacją Pythona: Wypróbuj online!
Uwagi ogólne
- To jest golf golfowy , więc wygrywa odpowiedź wykorzystująca najmniej bajtów w każdym języku.
- Obowiązują standardowe reguły , reguły we / wy i reguły luk .
- Dołącz link Wypróbuj online, aby pokazać, że Twój kod działa.
- Motywuj swoją odpowiedź wyjaśnieniem swojego kodu.
0!
ale uwagi dotyczące wyzwania mówią, że liczba czynnikowa będzie mniejsza lub równa wartości podstawowej.3!!!!!!!
nie powinno być niezdefiniowane - powinno po prostu dać odpowiedź3
. Jest taki sam jak1!!=1
(nieokreślony). Również twoja specyfikacja wejściowa mówi, że zawsze będzie co najmniej jeden!
, więc pierwszy przykład3
nie pasuje do specyfikacji.(3!)!
zamiast to usuwając terminy z silni. To mylące imię; Przyszedłem, zakładając, że będzie ona wielokrotnie stosować funkcję czynnikową w łańcuchu i musiałem uważnie przeczytać, aby zobaczyć, co to właściwie jest. Na szczęście pytanie wyjaśnia to jasno. Lepszą nazwą może być silnia krokowa, silnia krokowa lub coś takiego.Odpowiedzi:
R , 33 bajty
Wypróbuj online!
Obsługujen = 0 przez dodanie logicznej negacji n .
źródło
ArnoldC ,
702 698634 bajtówWypróbuj online!
Przetłumaczone na pseudokod:
Uwaga: ArnoldC ma tylko jeden typ danych: 16-bitowa liczba całkowita ze znakiem. Dlatego nie mogę przetestować
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
sprawy.źródło
c
Zmienna faktycznie przechowuje wartość porównania pomiędzyn
i0
.Galaretka , 4 bajty
Wypróbuj online!
RṚ
m
P
.źródło
RṚ
), then withm
it keeps everyP
. Just the straightforward approach. Edit: I added this explanation in the answer.r1mP
.APL (Dyalog Extended), 7 bytesSBCS
Anonymous tacit prefix function. Takes
[n,b]
as argument.Try it online!
1¨
one for each element of the argument;[1,1]
-\
cumulative difference;[n,n-b]
…
range using second element of left argument as indicator of step, e.g.[9,7]
continues with5
×/
productźródło
Haskell, 21 bytes
Try it online!
Combining the built-in product function with stepped range enumeration beats what I could code up recursively (even with flawr saving a byte).
22 bytes
Try it online!
Here's a solution taking input in string format like
9!!
, which I think is more interesting.42 bytes
Try it online!
źródło
n%a|n<1=1|m<-n-a=n*m%a
Pyth, 6 bytes
These are all equivalent 6-byters:
Try it online! (
*F:Q1E
)Or, 11 bytes, taking input as a string:
Test suite.
źródło
JavaScript (ES6), 21 bajtów
Pobiera dane wejściowe jako
(k)(n)
.Wypróbuj online!
Lub 24 bajty do obsługi BigInts.
JavaScript (ES6), 55 bajtów
Pobiera dane wejściowe jako ciąg znaków, używając formatu opisanego w wyzwaniu.
Wypróbuj online!
źródło
Biała spacja , 91 bajtów
Litery
S
(spacja),T
(tab) iN
(nowa linia) dodane tylko jako wyróżnienia.[..._some_action]
dodano tylko jako wyjaśnienie.Wypróbuj online (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).
Objaśnienie w pseudo-kodzie:
źródło
Python 2 , 29 bajtów
Wypróbuj online!
źródło
Perl 6 , 22 bajtów
Wypróbuj online!
Anonymous codeblock that returns the product of the range starting from the first input, decreasing by the second until it is below
1
, excluding the last number. This works for0
, since the base case of a the reduce by product is 1, so the output is 1.źródło
05AB1E ,
1087 bajtówWejście jako dwa oddzielne wejścia: pierwsze wejście jest
base
; drugie wejście jestfactorial
.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
-2 bajty dzięki @ Mr.Xcoder .
-1 bajt dzięki @JonathanAllan .
Wyjaśnienie:
Oryginalna odpowiedź 10 bajtów :
Wejście jako dwa oddzielne wejścia: pierwsze wejście jest
base
; drugie wejście jestfactorial
.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
LR²ιнP
( Wypróbuj online! ) Działa dla każdego przypadku testowego, z wyjątkiem 0.LR²ιн0KP
na 8 bajtów?0K
powinno być niepotrzebne, ponieważ0!
jest to nieprawidłowe wejście specyfikacji (nawet jeśli zostało to uwzględnione w przykładach) - skomentowałem to.0!
jest w domenie wejściowejݦRXιнP
zapisuje bajt.kod maszynowy x86-64, 12 bajtów
Ten sam kod maszynowy robi to samo w trybie 32-bitowym, a dla 16-bitowych liczb całkowitych w trybie 16-bitowym.
Jest to funkcja, wymagalne z args
n=RCX
,k=ESI
. 32-bitowa wartość zwracana wEAX
.Można wywoływać z C za pomocą konwencji wywoływania Systemu x86-64 System V z fałszywymi argumentami, aby wprowadzić prawdziwe argumenty do odpowiednich rejestrów.
uint32_t factk(int, uint32_t k, int, uint64_t n);
Nie mogłem po prostu użyć systemu Windows x64, ponieważ 1-operandmul
blokuje RDX i nie chcemy, aby prefiksy REX miały dostęp do R8 / R9.n
nie może zawierać śmieci w wysokich 32 bitach, więc JRCXZ działa, ale poza tym wszystko jest 32-bitowe.Lista NASM (adres względny, kod maszynowy, źródło)
0xc = 12 bajtów
Lub 10 bajtów, jeśli nie musieliśmy obsługiwać
n=0
specjalnego przypadku, pomijającjrcxz
.Dla standardowego silnia użyłbyś
loop
zamiast sub / ja do zapisania 2 bajtów, ale poza tym dokładnie ten sam kod.Testuj dzwoniącego, który przechodzi
argc
jakok
zn
zakodowanym na stałe.źródło
APL (Dyalog Unicode) , 11 bajtów SBCS
Anonimowa funkcja ukrytej poprawki. Przyjmuje
n
jako prawy argument ib
lewy argument.Wypróbuj online!
×∘⍳
pomnóżb
przez ɩ ntegers od 1 don
⊢-
odejmij to odn
⊢,
prependn
1⌈
maksymalnie jeden i każdy z nich×/
produktźródło
Rubin , 25 bajtów
Wypróbuj online!
źródło
Wolfram Language (Mathematica) ,
2221 bajtówWypróbuj online!
-1 dzięki attinat:
Times --> 1##&
Objaśnienie: użyj,
Range
aby utworzyć listę wartości{n, n-k, n-2k, n-3k, ...}
, zatrzymując się przed zejściem poniżej 1 (tj. Zatrzymując się dokładnie w prawo). Następnie pomnóż wszystkie liczby na tej liście przezTimes
(lub1##&
).źródło
1##&
zamiastTimes
Java 10, 44 bajty
Pobiera silnię jako pierwsze wejście, podstawa jako drugie.
Wypróbuj online.
Powyższe nie działa w przypadku największego przypadku testowego ze względu na ograniczony zakres liczb całkowitych (32 bity). Aby to naprawić, możemy użyć
BigIntegers
, któryprzypadkowojestdokładnie dwa razy większy - 8879 bajtów :-9 bajtów dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
Japt , 8 bajtów
Spróbuj
-1 dzięki EoI wskazującemu, jak głupi może być Kudłaty Kudłaty!
źródło
kT
można zastąpićf
na 1 bajtC (gcc) , 41 bajtów
Wypróbuj online!
źródło
r;f(n,k){for(r=1;n>0;n-=k)r*=n;n=r;}
dla C (gcc)MathGolf ,
76 bajtówWypróbuj online!
Znaleziono sprytny sposób na obsługę 0! bez zmiany innych przypadków testowych. Pobiera dane wejściowe jako
k n
(odwrotna kolejność), co pomaga w domyślnym poppingu.Wyjaśnienie
źródło
Attache ,
2119 bajtówWypróbuj online! Dość bezpośrednie wdrożenie rekurencyjne. (Uwaga:
true
jest zasadniczo1
, ponieważ można go używać w operacjach arytmetycznych jako1
.) Jest to jeden z niewielu programów, które napisałem dla tej witryny, w których użycie operatora Unicode zapisuje bajty (a dokładniej 1).Alternatywy
20 bajtów:
${x<y or x*$[x-y,y]}
21 bajtów:
Prod@${{_%y=x%y}\1:x}
27 bajtów:
${x*[`1,$][x>y][x-y,y]∨1}
27 bajtów:
${If[x>y,x*$[x-y,y],_or 1]}
27 bajtów:
${x*[`1,$][x>y][x-y,y]or 1}
29 bajtów:
${If[x>y,x*$[x-y,y],_+not _]}
źródło
Rdza ,
927361 bajtówWłaśnie zaczynam uczyć się rdzy, więc jestem pewien, że może być krótsza. Będzie się aktualizować w miarę nauki. Wartość zwracana powinna wynosić
i128
w celu obliczenia ostatniego testu.Edycja: Rekursja jest krótsza.
Wypróbuj online!
Możesz dodać własny test lub edytować jeden z już istniejących.
źródło
Q ,
59 57 5553 bajtówwyjaśnienie:
tutaj jest także wersja w k (ta sama logika),
4241 bajtówźródło
Physica , 22 bajty
Wypróbuj online!
26 bajtów
Ponowne uczenie się, jak używać własnego „języka” \ o / ... Gdybym wiedział, jak napisać parser 2 lata temu, byłoby to 20 bajtów :(
lub
Wypróbuj online!
źródło
Siatkówka , 66 bajtów
Wypróbuj online!Link zawiera szybsze przypadki testowe. Liczby Maulsa bez wykrzykników. Wyjaśnienie:
Naprawić
0!
.Konwertować
n
na unary i dodaj separator.Wielokrotnie odejmuj
k
odn
czasun>k
i zbieraj wyniki.wymienić
k
z1
(dziesiętnie).Pomnóż kolejno każdą wartość pośrednią, przeliczając na dziesiętne.
źródło
Japt , 8 bajtów
Spróbuj
źródło
JavaScript (Node.js) , 35 bajtów
Wypróbuj online!
źródło
Dalej (gforth) , 50 bajtów
Wypróbuj online!
Objaśnienie kodu
źródło
Perl 5
-Mbigint -p
, 45 bajtówWypróbuj online!
źródło
Stax , 6 bajtów
Uruchom i debuguj
Wymaga danych wejściowych w formularzu
{count} {base}
.źródło
Gaia , 6 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako
n
,k
więc dane wejściowe3 4
byłyby3!!!!
.źródło