Zadanie
Biorąc pod uwagę liczbę naturalną jako dane wejściowe, Twoim zadaniem jest wyprowadzenie wartości prawdziwej lub falsey na podstawie tego, czy dane wejściowe są silnikiem dowolnej liczby naturalnej. Możesz założyć, że liczba wejściowa zawsze będzie się mieścić w zakresie liczb obsługiwanych przez Twój język, ale nie wolno nadużywać rodzimych typów liczb w celu trywializacji problemu .
Wkład
Otrzymasz liczbę naturalną (typu Integer
lub podobną).
Możesz przyjmować dane wejściowe w dowolny sposób, z wyjątkiem zakładania, że będą to predefiniowane zmienne. Odczytywanie z pliku, konsoli, okna dialogowego ( prompt
), pola wprowadzania itp. Jest dozwolone. Dozwolony jest również argument wejściowy jako funkcja!
Wydajność
Twój program powinien wypisywać prawdziwą lub falsey wartość na podstawie tego, czy liczba wejściowa jest silnią dowolnej liczby naturalnej.
Upewnij się, że twoje wartości true / falsey są spójne dla wszystkich danych wejściowych, tj. Jeśli używasz pary 1 i 0 do oznaczenia odpowiednio wartości true i falsey, wówczas twój program musi wyprowadzić 1 dla wszystkich danych wejściowych, które powinny mieć wartości true i 0 dla wszystkie dane wejściowe, które powinny mieć wartości falsey.
Możesz pobierać dane wyjściowe w dowolny sposób, z wyjątkiem zapisywania ich w zmiennej. Zapis do pliku, konsoli, ekranu itp. Jest dozwolony. Funkcja return
jest również dozwolona!
Twój program nie może generować błędów dla żadnych danych wejściowych!
Przypadki testowe
Input Output
1 Truthy (0! or 1!)
2 Truthy (2!)
3 Falsey
4 Falsey
5 Falsey
6 Truthy (3!)
7 Falsey
8 Falsey
24 Truthy (4!)
120 Truthy (5!)
Zwycięskie kryterium
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach!
1
?Odpowiedzi:
Brachylog , 1 bajt
Wypróbuj online!
Wyjaśnienie
ḟ
jest wbudowanym, który zapewnia następującą zależność: jego wynik jest silnią jego danych wejściowych. Po prostu dajemy mu ustaloną moc wyjściową i sprawdzamy, czy suces, czy nie, przy zmiennym wejściu.źródło
true.
jest to stwierdzenie, atrue
nie jest)Galaretka , 3 bajty
Wypróbuj online!
1 za tak, 0 za nie.
Jak to działa
źródło
Galaretka , 4 bajty
Nie jest to najkrótsza odpowiedź na żelki, ale jest raczej wydajna.
Wypróbuj online!
Jak to działa
źródło
ECMAScript regex
733+690+158119118(117🐌)bajtówMoje zainteresowanie regexem rozbudziło nowe życie po ponad 4,5 roku bezczynności. W związku z tym szukałem bardziej naturalnych zestawów liczb i funkcji, które pasowałyby do jednoargumentowych wyrażeń regularnych ECMAScript, wznowiłem ulepszanie mojego silnika wyrażeń regularnych i zacząłem odświeżyć również na PCRE.
Fascynuje mnie obca konstrukcja funkcji matematycznych w wyrażeniu regularnym ECMAScript. Do problemów należy podchodzić z zupełnie innej perspektywy i aż do nadejścia kluczowej wiedzy nie wiadomo, czy można je w ogóle rozwiązać. Wymusza rzucenie znacznie szerszej siatki w celu znalezienia właściwości matematycznych, które można by wykorzystać do rozwiązania konkretnego problemu.
Dopasowywanie liczb czynnikowych było problemem, o którym nawet nie pomyślałem w 2014 r. - lub gdybym tylko chwilowo odrzucił to jako zbyt mało prawdopodobne, aby było to możliwe. Ale w zeszłym miesiącu zdałem sobie sprawę, że można to zrobić.
Podobnie jak w przypadku innych postów z wyrażeniami regularnymi ECMA, dam ostrzeżenie: zdecydowanie zalecam naukę rozwiązywania pojedynczych problemów matematycznych w wyrażeniach regularnych ECMAScript. To była dla mnie fascynująca podróż i nie chcę zepsuć jej nikomu, kto mógłby potencjalnie chcieć spróbować samemu, szczególnie tym, którzy interesują się teorią liczb. W tym wcześniejszym poście znajduje się lista zalecanych problemów oznaczonych spoilerem do rozwiązania jeden po drugim.
Więc nie czytaj dalej, jeśli nie chcesz, aby zepsuła Ci się jakaś zaawansowana magia wyrażeń regularnych . Jeśli chcesz spróbować samodzielnie odkryć tę magię, zdecydowanie polecam zacząć od rozwiązania niektórych problemów z wyrażeniem regularnym ECMAScript, jak opisano w linku powyżej.
To był mój pomysł:
Po tym, jak dusiłem go przez chwilę i w międzyczasie skonstruowałem kilka wyrażeń regularnych, podjąłem się zadania napisania wyrażenia regularnego. Zajęło to kilka godzin, ale skończyło się ładnie. Jako dodatkowy bonus algorytm może zwrócić odwrotność silni jako dopasowanie. Nie można było tego uniknąć; z samej natury tego, w jaki sposób należy go wdrożyć w ECMA, konieczne jest odgadnięcie, czym jest odwrotna silnia, zanim zrobi się cokolwiek innego.
Minusem było to, że ten algorytm stworzył bardzo długi regex ... ale byłem zadowolony, że ostatecznie wymagał techniki stosowanej w moim regexie mnożenia 651 bajtów (tej, która okazała się przestarzała, ponieważ inna metoda stworzyła 50 bajt regex). Miałem nadzieję, że pojawi się problem wymagający tej sztuczki: działanie na dwóch liczbach, które są potęgami tej samej bazy, w pętli, poprzez ich jednoznaczne połączenie i rozdzielenie ich przy każdej iteracji.
Ale ze względu na trudność i długość tego algorytmu zastosowałem molekularne wyczekiwanie (formy
(?*...)
) do jego wdrożenia. Jest to funkcja nie w ECMAScript ani żadnym innym głównym mechanizmie regex, ale ta, którą zaimplementowałem w moim silniku . Bez przechwytywania wewnątrz molekularnego spojrzenia, jest funkcjonalnie równoważny atomowemu spojrzeniu naprzód, ale przy przechwytywaniu może być bardzo potężny. Silnik wróci do poprzedniej wersji i można go użyć do ustalenia wartości, która przechodzi przez wszystkie możliwości (do późniejszego testowania) bez zużywania znaków z danych wejściowych. Korzystanie z nich może zapewnić znacznie czystszą implementację. (Za wyglądem o zmiennej długości ma co najmniej tyle samo mocy, co molekularne spojrzenie w przód, ale ten ostatni sprawia, że bardziej proste i eleganckie wdrożenia).Tak więc długości 733 i 690 bajtów w rzeczywistości nie reprezentują inkarnacji rozwiązania zgodnych z ECMAScript - stąd „+” po nich; z pewnością możliwe jest przeniesienie tego algorytmu do czystego ECMAScript (co znacznie zwiększyłoby jego długość), ale nie poradziłem sobie z tym ... ponieważ myślałem o znacznie prostszym i bardziej zwartym algorytmie! Taki, który można łatwo wdrożyć bez uprzedzeń molekularnych. Jest także znacznie szybszy.
Ten nowy, podobnie jak poprzedni, musi odgadnąć odwrotną silnię, przechodząc przez wszystkie możliwości i testując je pod kątem dopasowania. Dzieli N przez 2, aby zrobić miejsce na pracę, którą musi wykonać, a następnie tworzy pętlę, w której wielokrotnie dzieli dane wejściowe przez dzielnik, który zaczyna się od 3 i zwiększa za każdym razem. (Jako takie, 1! I 2! Nie mogą być dopasowane przez główny algorytm i muszą być traktowane osobno.) Dzielnik jest śledzony przez dodanie go do bieżącego ilorazu; te dwie liczby można jednoznacznie rozdzielić, ponieważ przy założeniu M! == N, bieżący iloraz będzie nadal podzielny przez M, dopóki nie wyniesie M.
Uwielbiam więc to, że problem mógł zostać zredukowany do jeszcze mniejszej złożoności niż mój zoptymalizowany golfowo regex Fibonacciego , ale wzdycham z rozczarowaniem, że moja technika multipleksowania mocy tej samej bazy będzie musiała poczekać na inny problem to faktycznie tego wymaga, ponieważ ten nie. To historia mojego algorytmu mnożenia 651 bajtów, który został zastąpiony przez 50-bajtowy!
Edycja: Udało mi się upuścić 1 bajt (119 → 118), używając sztuczki znalezionej przez Grimy'ego, która może dodatkowo skrócić podział w przypadku, gdy iloraz gwarantowany jest większy lub równy dzielnikowi.
Bez zbędnych ceregieli, oto regex:
Wersja prawda / fałsz (118 bajtów):
^((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\3$|^xx?$
Wypróbuj online!
Zwraca odwrotną silnię lub brak dopasowania (124 bajty):
^(?=((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\3$)\3|^xx?$
Wypróbuj online!
Zwraca odwrotną silnię lub brak dopasowania w ECMAScript +
\K
(120 bajtów):^((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\K\3$|^xx?$
I wersja z odstępami z komentarzami:
Pełna historia moich optymalizacji golfowych tych wyrażeń regularnych znajduje się na github:
regex dla dopasowania liczb silniowych - metoda porównywania wielokrotności, z molekularnym lookahead.txt
regex dla dopasowania silni liczb.txt (ta pokazana powyżej)
((x*)x*)
((x*)+)
((x+)+)
\2
Mechanizm wyrażeń regularnych .NET nie emuluje tego zachowania w trybie ECMAScript, a zatem 117 wyrażeń regularnych działa:
Wypróbuj online! (wersja spowolnienia wykładniczego z silnikiem regex .NET + emulacja ECMAScript)
źródło
JavaScript (ES6),
302928 bajtówOczekuje dodatniej liczby całkowitej. Zwraca
-1
za fałsz i-2
za prawdę.Uwaga : Ta funkcja obsługuje dość duże dane wejściowe (powinieneś to przeczytać jako: „dość duży dla JS”). Powinien działać bezpiecznie do 2 53 - 1 . Na pewno zawiedzie, zaczynając od N = 121 645 100,408,831,992 , przy czym dane wejściowe są zaokrąglane do 19! = 121 645 100 408 832 000 z powodu kodowania IEEE-754. Nie mogą być inne fałszywie dodatnich wyników przed 121,645,100,408,831,991 powodu błędów zaokrągleń, ale nie wiem na pewno.
źródło
~
na końcu.Python 3 ,
3938 bajtówFunkcji rekurencyjnej przy całkowitej,
n
wracając wartość logiczną inversley reprezentującą wynik (truthy:False
, falsey:True
)Wypróbuj online!
Wielokrotnie dzieli
n
przezi
, z początkową wartością1
, aż reszta będzie mniejsza lub równa,1
a następnie przetestuje, czy ta reszta jest mniejsza niż1
, tylko silnia zakończy się resztą równą1
i<
będzie bajtem krótszym niż==
.źródło
1
wszystkie czynniki, z wyjątkiem1
których zwracaTrue
.Java 8, 46 bajtów
Jest to oparte na wpisie Romana Gräfa, z którego udało mi się zrzucić kilkanaście bajtów. Sugerowałbym to tam, ale nie mam jeszcze wystarczającej reputacji, aby komentować! Mój zmodyfikowany kod biegacza testowego:
źródło
Siatkówka ,
5038 bajtów12 bajtów zaoszczędzonych dzięki @Neil, łącząc skrócenie pętli i pozbycie się
;
Wypróbuj online!
Dane wyjściowe
1
dla wartości true i0
false..+
dopasowuje cały numer1¶$&$*
zamieniając go na1
następującą po nim nową linię, a dopasowanie konwertowane na unarnePozostały program dzieli liczbę jednostkową w dolnym wierszu przez sukcesywne zwiększanie liczb całkowitych dodatnich, śledzony w górnym wierszu, podczas gdy jest to możliwe.
+`
zapętlić, aż łańcuch pozostanie taki sam^(1+)¶(\1)+$
dopasuj górną linię wiele1
si wielokrotność wielu1
s w dolnej linii i zamień ją na1$1¶$#2$*
górna linia wiele1
s z inną1
, to znaczy zwiększenie liczby reprezentowanej przez górną linię o 1, po której następuje nowa linia i liczba dopasowań górnej linii w dolnym wierszu (tj. liczba dopasowań drugiej grupy przechwytywania ) wiele1
s, to znaczy dzielenie dolnej liczby przez górną liczbęGdy nie będzie to już możliwe,
¶.$
podaj liczbę dopasowań tego wyrażenia regularnego, tj. czy istnieje samotny1
w dolnej linii, co dzieje się tylko wtedy, gdy liczba jest silniaJeśli zamiast wartości true / falsy dozwolone jest no-crash / crash, mogę uzyskać
3634 bajtów.Jest to zgodne z tym samym podejściem, ale łączy
$*
linie trzecią i czwartą. Trzecia linia dalej jest częścią tej samej pętli,{
jest skrótem od tego,+(
gdzie(
grupuje pozostałe linie w pętli. Czynniki kończą się w programie wyłamującym się z pętli, podczas gdy czynniki nie-czynnikowe utkną w pętli na zawsze, dopóki Retina nie zgłosi wyjątku przepełnienia spowodowanego przez ostatnią awarię wymiany, tym samym posiadając dno w jedności zamiast w systemie dziesiętnym, i pierwszą zamianę pętli konwertuje dolną linię z dziesiętnej na unarną, więc szybko się wysadza.źródło
1
go tak, jak to sugeruje, gdy$*
jest na końcu zamiany.$*
z pozostałymi dwiema liniami.05AB1E , 4 bajty
Wypróbuj online!
Wyjaśnienie
źródło
L
usuwane? Ponadto,Å!
daje listę silnia mniejsza lub równa wejścia.D
tutaj. Dobry chwytÅ!
. Zawsze zapominam o poleceniach z listy. Nie zapisuje żadnych bajtów, ale na pewno jest bardziej wydajny.C ++,
10210092 bajtówPętle przez wszystkie wartości od
0
don
i oblicza silnię, a następnie sprawdza, czy jest równan
.Dzięki Christoph! (zapisane 8 bajtów)
źródło
int a(int n){int i=n,j=0;for(;i;)j|=lround(exp(lgamma(i--+1)))==n;return j;}
.lround
ilgamma
są już w C ++ 11, więc może po prostu#include<cmath>
. Może jeszcze bardziej poprawisz moje sugestie :)Haskell ,
4326 bajtówWypróbuj online!
źródło
f n=elem n$scanl1(*)[1..n]
jest absurdalnie nieefektywny, ale krótszy.40430
bez zauważalnej zwłoki.divMod
przez[1..]
kolejno, aż do osiągnięcia zerowego pozostałą z ilorazu 1 (silnia) lub pozostający niezerową (non-czynnikowej), ale nie wydaje się być dobrym rozwiązaniem. Znalazłam to słodkie rozwiązanie 46-znakowy, ale:f|let x%n=mod n x==0&&(x+1)%div n x||n==1=(1%)
.Haskell , 38 bajtów
Wypróbuj online! Przykładowe zastosowania:
(2#) 24
. ZwracaTrue
lubFalse
.To najkrótszy możliwy, jaki udało mi się uzyskać, jednocześnie będąc bardzo wydajnym. Nawet dla liczb tak dużych jak
wynik jest natychmiast podawany. Rozwiązanie działa, dzieląc dane wejściowe
n
,m = 2,3,4,5,...
dopóki wynik nie będzie jeden lubn
nie będzie można go podzielićm
.Tutaj
n!
znajdziesz krótsze, ale nieefektywne, 26-bajtowe rozwiązanie obliczające dane wejściowe, które nie są silnikami .źródło
MATL , 5 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Fouriera ,
4039 bajtówWypróbuj na FourIDE!
Zasadniczo mnoży liczbę N przez rosnącą liczbę, aż N będzie równa (wyjście 1) lub większa niż (wyjście 0) wejście.
Objaśnienie Pseudokod:
źródło
Japt ,
86 bajtówWypróbuj online!
Daje to 0 dla false i 1 dla true.
Wyjaśnienie
źródło
aU ¦J
nax¥U
(mapujX
doX==U
i sumuj), chociaż to nie zadziała w TIO.2
ponieważ posiadało
tylko daje[0,1]
. Oto poprawka z oszczędnością 1 bajtu.Perl 5, 31 bajtów
Dane wejściowe są pobierane przez STDIN, dane wyjściowe są przekazywane za pomocą kodu wyjścia (1 dla silnia, 0 dla bez silnia).
Dane wejściowe są dzielone przez kolejne liczby całkowite, aż będzie to 1 lub jakaś ułamek mniejszy niż jeden, co zostanie obcięte w wyniku.
źródło
Perl 6 , 29 bajtów
Sprawdź to
Rozszerzony:
źródło
{$_∈[\*] 1..$_}
. Innym interesującym podejściem jest2>*.polymod(1..*).sum
.setlX , 32 bajty
Tworzy funkcję o nazwie, w
f
której wykorzystujesz potencjalną silnię jako parametr.Działa z dowolną wielkością całkowitą, ale jest dość nieefektywna.
(tak przy okazji: to mój pierwszy udział w łamigłówce programistycznej)
źródło
C (gcc), 33 bajty
Zauważ, że niektórzy autorzy definiują „liczbę naturalną” jako liczbę całkowitą dodatnią . Dlatego nie obchodzi mnie to, że
f(0)
powoduje nieskończoną rekurencję.źródło
R ,
2822 bajtówWypróbuj online!
źródło
C # (.NET Core) , 68 bajtów
Wypróbuj online!
Nie jest to najkrótsze rozwiązanie, ale działa z naprawdę dużymi liczbami. Łącze TIO zawiera przykład z
10000!
.Oto krótsza wersja, która używa,
int
która ma maksymalną wartość 2147483647 .C # (.NET Core) , 45 bajtów
Wypróbuj online!
Podziękowania dla @KevinCruijssen za grę w golfa w sumie 3 bajty z obu odpowiedzi!
źródło
&&
Można golfed się&
i spływu;
nie musi być liczona dla funkcji lambda. Czy nie możeulong k=2
byćuint k=2
w 50-bajtowej odpowiedzi?&
walce z przeciwnikiem&&
. Myślałem, że mam przepełnienie stosu, ale wydaje się, że to mimo wszystko działa.ulong
ma 64 bity, auint
32. Wygląda na to, że inni używają,int
więc może użyję tego w krótkiej wersji. Jeśli chodzi o trailing;
, są to pełne funkcje, a nie lambda, więc myślę, że muszę je uwzględnić?/
i%
pomiędzyulong
iuint
, ale nieulong
iint
. Nie wiedziałem o tym :)double
zaczniesz widzieć zaokrąglanie w pewnym momencie - na przykład 24! i 120! zawieść. ChoćSystem.Numerics.BigInteger
ma największą precyzję,int
jest najkrótszą odpowiedzią :)&&
operatora zwarcia . Ale to jest golf golfowy;) Cieszę się, że podoba ci się ten10000!
przykład!C ++ (clang), 51 bajtów
Rekurencja wygrywa w miarę gry w golfa.
51 bajtów, zero to prawda:
int f(int n,int i=2){return n<2?!n:n%i|f(n/i,i+1);}
Poświęca to dość dużą prędkość za 1 bajt oszczędności. Wymień
|
się||
zrobić to szybko, ze względu na oceny zwarciowej logiczną OR.Wypróbuj online!(51-bajtowa wersja wolna)
Wypróbuj online! (52 bajtowa wersja szybka)
Wolna wersja gry bez golfa:
Szybka wersja bez golfisty:
Istnieje wiele sposobów na zmianę tego.
52 bajty, niezerowa jest prawda:
int f(int n,int i=2){return n<2?n:n%i?0:f(n/i,i+1);}
Wypróbuj online!
52 bajty, zero to prawda:
int f(int n,int i=2){return!n?1:n%i?n-1:f(n/i,i+1);}
Wypróbuj online!
Zanim uciekłem się do rekurencji, próbowałem stworzyć kilka wersji iteracyjnych i były one bliskie.
54 bajty, niezerowa jest prawda:
int f(int n){for(int i=2;n>1;)n=n%i?0:n/i++;return n;}
Wypróbuj online!
54 bajty, zero jest prawdą (na podstawie przesłania Javy 8 Romana Gräfa ):
int f(int n){int a=1,i=0;for(;a<n;a*=++i);return a-n;}
Wypróbuj online!
Teraz, na dole beczki, wersje rekurencyjne bez
n==0
obsługi (uważam, że są one nieprawidłowe, ponieważ 0 jest liczbą naturalną, a każda definicja, w której nie uwzględnia „liczb naturalnych” o bardzo ograniczonym użyciu). W poniższych wersjach nieskończona rekurencjaf(0)
albo wyzwala segfault z powodu przepełnienia stosu, albo kompilatory optymalizujące go do iteracji, zapętlają się w nieskończoność:48 bajtów, zero to prawda:
int f(int n,int i=2){return n%i?n-1:f(n/i,i+1);}
Wypróbuj online!
48 bajtów, zero to prawda (na podstawie przesłania Hagena von Eitzena 33 bajtów C (gcc) ):
int f(int n,int e=0){return n%++e?n-1:f(n/e,e);}
Wypróbuj online!
źródło
Mathematica, 20 bajtów
inna wersja do testowania dużych liczb (patrz komentarze)
testy do 1000!
źródło
Range[#]
goRange@#
:)!Range@#!~FreeQ~#&
.Cubix , 24 bajty
Wypróbuj online
Cubified
Zaczynamy od pchnięcia
1
,I
nput,1
na stos. Będą to odpowiednio nasz indeks, nasz cel i nasz akumulator.Następnie zapętlamy. Przy każdej iteracji odejmujemy akumulator od wejścia. Jeśli wynik jest 0, skończymy, więc naciskać
1
,O
utput i Wyjdź. Jeśli jest negatywny0
,O
zaszliśmy za daleko, więc wypychamy, wypowiadamy się i wychodzimy. W przeciwnym razie widzimyźródło
Neim , 8 bajtów
Wyjaśnienie:
Spróbuj!
Neim , 3 bajty (niekonkurujące)
Niekonkurencyjne, ponieważ token zawiera i token czynnikowy zostały dodane po wykonaniu wyzwania.
Wyjaśnienie:
Spróbuj!
źródło
> <> ,
2422 bajtów-2 bajty dzięki @Aaron
Próbuję nowego języka (ponieważ wygasła moja licencja Mathematica…)
Wypróbuj online lub na stronie placu zabaw dla ryb
Zakłada, że numer wejściowy jest już na stosie , i zwraca 0 lub 1. Działa poprzez pomnożenie razem pierwszych n liczb, aż przestanie być mniejszy niż wejściowy, a następnie wypisanie 1, jeśli jest równy wejściowemu, i 0, jeśli nie t.
źródło
v>\n<^
w\\n/
; patrz tutajAPL (Dyalog Unicode) , 5
67bajtówZagrał w bajt, zmieniając
×/
na!
dzięki Erik the OutgolferWypróbuj online!
Wyjaśnienie
źródło
N∊×\⍳N←⎕
Jak to się bierze za argument?n
Nigdzie nie widzę . Czy to jest coś specyficznego dla Dyalogu?(⊢∊(×/⍳)) right_argument
jak widać w łączu TIO. I⊢
odnosi się do właściwego argumentu.⊢∊×\ä⍳
. „Prawidłowym” (ale dłuższym) rozwiązaniem byłoby0=1|!⍣¯1
; „Czy odwrotna silnia jest liczbą całkowitą?”JavaScript (ES6), 71 bajtów
Pobiera to dane wejściowe jako argument funkcji i
alert
dane wyjściowe. Wyjścia0
dla falsey i1
dla truthy.Wyjaśnienie
Program składa się z dwóch funkcji
f
orazg
.f
jest rekurencyjną funkcją obliczeniową ig
jest główną funkcją programu.g
zakłada jeden argumentn
. Definiuje domyślny argumentr
o wartości 0 i kolejny domyślny argument o wartości0
. Następnie iteruje wszystkie liczby całkowite od 0 don
, i w każdej iteracji sprawdza, czyf
zastosowana funkcjai
(bieżący indeks) jest równan
, tj. Czyn
jest silniai
. Jeśli tak się dzieje,r
wartość jest ustawiana na 1. Na końcu funkcji,r
jestalert
ed.Test Snippet
( Uwaga: Wyjścia fragment wiadomości z wykorzystaniem
console.log()
jako nikt jak też wiele z tych brzydkiealert()
s. )źródło
QBIC ,
2119 bajtówWyjaśnienie
Poprzednio
Wyjaśnienie:
źródło
Java 8, 59 bajtów
Kod testowy
źródło