Wyzwanie polega na obliczeniu sumy cyfr silni liczby.
Przykład
Input: 10
Output: 27
10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800, a suma cyfr w liczbie 10! wynosi 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27
Można oczekiwać, że wartość wejściowa będzie liczbą całkowitą powyżej 0. Dane wyjściowe mogą być dowolnego typu, ale odpowiedź powinna znajdować się w standardowej bazie języka kodowania.
Przypadki testowe:
10 27
19 45
469 4140
985 10053
Uwaga: Niektóre języki nie obsługują dużych liczb powyżej 32-bitowych liczb całkowitych; dla tych języków nie będzie wymagane obliczanie dużych silni.
Link OEIS tutaj dzięki Martinowi Enderowi
To jest golf-golf , więc wygrywa najkrótszy kod w postaci!
code-golf
math
arithmetic
factorial
Jerzy
źródło
źródło
n>21
Odpowiedzi:
05AB1E , 3 bajty
Wypróbuj online!
źródło
Galaretka , 3 bajty
Wypróbuj online!
Czy to, czego oczekujesz:
źródło
Mathematica, 21 bajtów
źródło
[#!]
nie@#!
? (Mathematica noob)@
ma wyższy priorytet niż!
.C ++ 11, 58 bajtów
Jako nienazwana lambda modyfikująca dane wejściowe:
Jeden z nielicznych przypadków, kiedy mój kodu C ++ jest krótszy niż kod C .
Jeśli chcesz obsługiwać większe przypadki, przełącz się na C ++ 14 i użyj:
i podaj argument wywołujący z
ull
przyrostkiem.Stosowanie:
źródło
Rubinowy,
63615338 bajtówNowe podejście dzięki manatwork:
Stary:
źródło
eval
sposób:->n{eval"#{(1..n).reduce:*}".chars*?+}
.Pyth,
76 bajtówDzięki @Kade za uratowanie mi bajtu
sj.!QT
Wypróbuj online!
Po raz pierwszy używam Pytha, więc jestem pewien, że moja odpowiedź mogłaby być dość golfowa.
Wyjaśnienie:
źródło
10
jest przypisany do zmiennejT
, więc możesz to zrobićsj.!QT
:)ssM`.!
wykonuje też zadanie, również w 6 bajtach.Haskell,
4140 bajtówPrzykład użycia:
f 985
->10053
.Stwórz listę od
1
dox
, oblicz iloczyn elementów listy, przekształć go w reprezentację ciągu, zamień każdy znak na liczbę i zsumuj je.Edycja: @Angs zapisał bajt. Dzięki!
źródło
f x=sum$read.pure<$>(show$product[1..x])
zapisuje bajtPython, 54 bajty
repl.it
źródło
R,
5853 bajtówEdycja: Zapisano jeden bajt dzięki @Jonathan Carroll i kilka dzięki @Micky T.
Niestety przy 32-bitowych liczbach całkowitych działa to tylko dla
n < 22
. Pobiera dane wejściowe ze standardowego wejścia i wyjścia na standardowe wyjście.Jeśli chciałbyś większej precyzji, musiałbyś użyć biblioteki zewnętrznej, takiej jak
Rmpfr
:źródło
c(x,"")
vspaste(x)
:sum(as.integer(el(strsplit(c(factorial(scan()),""),""))))
. Zmusza wynik silni do znaku istrsplit
zwraca go jako drugą listę, więcel
nadal działa i wyodrębnia pierwsze elementy listy.prod(1:scan())
?as.double
powinno wystarczyćstrtoi
działa jak krótszy zamiennikas.double
, tak myślę.Pip , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
CJam , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Brachylog , 5 bajtów
Wypróbuj online!
Wyjaśnienie
Zasadniczo opisany algorytm:
źródło
Java 7, 148 bajtów
źródło
Rubinowy,
63 60 5351 bajtówPodziękowania dla Martina za pomoc w grze w golfa.
źródło
Pushy , 4 bajty
Swój wkład w wierszu poleceń:
$ pushy facsum.pshy 5
. Oto podział:źródło
Oktawa, 30 bajtów
Oblicza silnię, biorąc iloczyn listy
[1 2 ... n]
. Konwertuje go na ciąg znaków i odejmuje48
od wszystkich elementów (dla kodu ASCII0
). Wreszcie podsumowuje :)źródło
bash (seq, bc, fold, jq),
3433 bajtyNa pewno nie najbardziej elegancki, ale do wyzwania
źródło
fold -1
zapisuje bajt.C, 58 bajtów
To nie jest idealne. Działa tylko, ponieważ na początku musi być -1. Chodzi o to, aby użyć dwóch funkcji rekurencyjnych w jednej funkcji. To nie było tak proste, jak myślałem na początku.
Zastosowanie i zrozumiały format:
Edycja: Znalazłem metodę, która pozwala używać tej funkcji wiele razy, ale długość wynosi 62 bajty.
źródło
Perl 6 , 21 bajtów
Rozszerzony:
źródło
Cubix,
3332 bajtyFormularz netto:
Wypróbuj online!
Notatki
Infinity
liczbę (technicznie rzecz biorąc, jest to nie do zapisania, nie do wyliczenia i nie do skonfigurowania właściwość obiektu okna).Wyjaśnienie
Ten program składa się z dwóch pętli. Pierwszy oblicza silnię danych wejściowych, drugi dzieli wynik na cyfry i dodaje je do siebie. Następnie suma jest drukowana i program kończy się.
Początek
Najpierw musimy przygotować stos. W tej części wykorzystujemy pierwsze trzy instrukcje. IP zaczyna się na czwartej linii, wskazując na wschód. Stos jest pusty.
Będziemy trzymać sumę na samym dole stosu, więc musimy zacząć od
0
bycia sumą, przechowując ją na dole stosu. Następnie musimy nacisnąć a1
, ponieważ dane wejściowe zostaną początkowo pomnożone przez liczbę przed nim. Gdyby było to zero, silnia również zawsze dawałaby zero. Na koniec odczytujemy dane wejściowe jako liczbę całkowitą.Teraz stos jest,
[0, 1, input]
a adres IP znajduje się w czwartej linii, czwartej kolumnie, skierowanej na wschód.Pętla czynnikowa
Jest to prosta pętla, która zwielokrotnia dwa górne elementy stosu (wynik poprzedniej pętli i danych wejściowych - n, a następnie zmniejsza dane wejściowe. Łamie się, gdy dane wejściowe osiągną 0.
$
Instrukcja powoduje, że IP pomijau
- turn Pętla jest następującą częścią sześcianu: IP zaczyna się od czwartej linii, czwartej kolumny.Z powodu tej
^
postaci IP natychmiast zaczyna się poruszać na północ. Następnieu
odwraca adres IP i przesuwa go jeden w prawo. Na dole znajduje się kolejna strzałka:<
wskazuje adres IP z powrotem na^
. Stos zaczyna się od[previousresult, input-n]
, gdzie, gdzien
jest liczba iteracji. W pętli wykonywane są następujące znaki:Następnie górna część stosu (zmniejszone wejście) jest sprawdzana
0
przez!
instrukcję, a jeśli tak0
,u
znak jest pomijany.Zsumuj cyfry
IP otacza sześcian, kończąc na ostatnim znaku w czwartej linii, początkowo wskazując na zachód. Następująca pętla składa się z prawie wszystkich pozostałych znaków:
Pętla najpierw usuwa element górny ze stosu (który jest albo
10
albo0
), a następnie sprawdza, co jest na lewo od wyniku silni. Jeśli to zostało zmniejszone0
, drukowane jest dno stosu (suma) i program zatrzymuje się. W przeciwnym razie zostaną wykonane następujące instrukcje (stos zaczyna się jako[oldsum, ..., factorial]
):Pętla zaczyna się od nowa, aż do
factorial/10
zera.źródło
C, 47 bajtów
stosowanie:
źródło
Python, 57 bajtów
Wypróbuj online
źródło
L
się stało, gdy silnia jest wystarczająco duża, aby stać się długim.Partia, 112 bajtów
Dogodnie
set/a
działa na bieżącej wartości zmiennej, więc działa normalnie w pętli. Działa tylko do 12 ze względu na ograniczenia typu liczb całkowitych Batcha, więc teoretycznie mogę zapisać bajt, zakładającf<1e9
:Ale w ten sposób leży szaleństwo ... Równie dobrze mogę w tym przypadku zakodować listę (97 bajtów):
źródło
JavaScript (ES6), 50 bajtów
Działa tylko
n=22
ze względu na ograniczenia dokładności zmiennoprzecinkowej.źródło
Befunge 93 ,
5654 bajtówZaoszczędzono 2 bajty, aby użyć get zamiast cudzysłowów. To pozwoliło mi przesunąć górne 2 linie o 1, zmniejszając niepotrzebne białe miejsca.
Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript ES6 -
6154 bajtówEDYCJA: Dziękuję Hedi i ETHproductions za odcięcie 7 bajtów. Muszę pamiętać, że sztuczka t - = - j.
źródło
n=>{a=_=>!_||_*a(~-_);t=0;for(j of''+a(n))t-=-j;return t}
n=>eval(`for(j of''+(a=_=>!_||_*a(~-_))(n,t=0))t-=-j`)
AHK , 60 bajtów
AutoHotkey nie ma wbudowanej funkcji silni, a funkcje pętli mają długie nazwy dla wbudowanych zmiennych. Pierwsza pętla jest silnia, a druga dodaje cyfry razem.
źródło
J,
1211 bajtówOszczędność 1 bajtu dzięki Cole!
To po prostu stosuje sumę (
1#.
) do cyfr (przy użyciu odwrotnościinv
konwersji podstawy#.
z podstawą10
) silni (!
) argumentu.Przypadki testowe
Uwaga: dwa ostatnie przypadki testowe to biginty, oznaczone znakiem końcowym
x
.źródło
"."0":
aby uzyskać cyfry1#.,.&.":@!
co wymaga większej precyzji także w przypadku mniejszych przypadków (nie wiadomo dlaczego). Również 11 bajtów:1#.10#.inv!
.Brachylog (v2), 3 bajty
Wypróbuj online!
Ten sam „algorytm” jak odpowiedź v1 autorstwa @Fatalize, tylko z lepszym kodowaniem.
źródło
C,
6360 bajtów-3 bajt na
do...while
pętlę.Niegolfowane i użycie:
źródło
int
domyślnie definiujemy f (n) ?int
zakłada się.