Napisz program lub funkcję, która znajdzie liczbę zer na końcu n!
w podstawie 10, gdzie n
jest liczbą wejściową (w dowolnym żądanym formacie).
Można założyć, że n
jest to dodatnia liczba całkowita, co oznacza, że n!
jest również liczbą całkowitą. Po kropce dziesiętnej nie ma zer n!
. Można również założyć, że Twój język programowania obsługuje wartości n
i n!
.
Przypadki testowe
1
==> 0
5
==> 1
100
==> 24
666
==> 165
2016
==> 502
1234567891011121314151617181920
==> 308641972752780328537904295461
To jest kod golfowy. Obowiązują standardowe zasady. Najkrótszy kod w bajtach wygrywa.
Zgłoszenia
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Tabela liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
/* Configuration */
var QUESTION_ID = 79762; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 43444; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
n
być łańcuchem wejściowym?n!
że pasuje do twojego typu liczb całkowitych! Cóż, może innym razem.Odpowiedzi:
Python 2, 27 bajtów
Zakończenie zera są ograniczone przez czynniki 5. Liczba wielokrotność
5
że są co najwyżejn
jestn/5
(z podziałem piętro), ale to się nie liczy powtarzające się czynniki wielokrotność25, 125, ...
. Aby je zdobyć, podzieln
przez 5 i powtórz.źródło
Galaretka , 5 bajtów
Stosuje odwrotne do zamierzonego podejście do znajdowania silni, a następnie faktoryzowania go ponownie, sprawdzając wykładnik 5 w pierwszej faktoryzacji.
Wypróbuj online!
źródło
Mornington Crescent,
19491909 bajtów-40 bajtów dzięki NieDzejkob
źródło
Mornington Crescent
zakwestionowani, byłoby fajne. :)Pyth, 6 bajtów
Wypróbuj tutaj.
Alternatywny 7-bajtowy :
Skumulowane zmniejszenie
.u/N5
wielokrotnie dzieli podłoga przez,5
aż do uzyskania powtórzenia, co w tym przypadku następuje po osiągnięciu 0.Pierwszy element jest następnie usuwany (
t
), a reszta jest sumowana (s
).źródło
Właściwie 10 bajtów
Wypróbuj online!
Zauważ, że ostatni przypadek testowy kończy się niepowodzeniem, gdy działa poważnie na CPython, ponieważ
math.factorial
używa rozszerzenia C (które jest ograniczone do 64-bitowych liczb całkowitych). Jednak uruchamianie serialu na PyPy działa dobrze.Wyjaśnienie:
źródło
Haskell, 26 bajtów
Piętro dzieli dane wejściowe przez
5
, a następnie dodaje wynik do wywoływanej funkcji. Wyrażenie(+)=<<f
przyjmuje dane wejściowex
i wyjściowex+(f x)
.Skrócono z:
Nierekurencyjne wyrażenie dało 28 bajtów:
źródło
i
jest licznik od1..n
?log_5(n)
sprawach, reszta daje 0.MATL , 9 bajtów
Wypróbuj online!
Działa to w przypadku bardzo dużych liczb, ponieważ pozwala uniknąć obliczania silni.
Podobnie jak inne odpowiedzi, wykorzystuje to fakt, że liczba razy
2
pojawia się, ponieważ dzielnik silni jest większy lub równy niż liczba razy5
.źródło
05AB1E, 5 bajtów
Byłoby 4 bajty, gdybyśmy mogli zagwarantować n> 4
Kod:
Wyjaśnienie:
Alternatywne, znacznie szybsze, 6-bajtowe rozwiązanie: Zainspirowany odpowiedzią MATL Luisa Mendo
Wyjaśnienie:
Edycja: usunięte rozwiązania przy użyciu ¢ (liczba), ponieważ wszystkie liczby pierwsze zawierające 5 byłyby liczone jako 5, np. 53.
Edycja 2: dodano bardziej wydajne rozwiązanie dla wyższych nakładów jako porównanie.
źródło
5¢
,5Q
powinno działać. Dobra odpowiedź! :)Ó
jest powolnaÎ!Ó2é
. Błąd został naprawiony wczoraj .Î!Ó7è
ma on 8 bajtów, a rozwiązanie „6 bajtów” to 10 bajtówMatlab
(59) (54)(39)Cześć Dawg !!!! słyszeliśmy, że lubisz matematykę ....
Jest to oparte na mojej utworzonej odpowiedzi w przeglądzie kodu .
dalej niż to, co wspomniano w mojej odpowiedzi w przeglądzie kodu, wzór na liczbę zer w silni (n) to Suma (n / (5 ^ k)), gdzie k zmienia się między 1 a log_5 (n)
Jedynym trywialnym powodem, dla którego nie można uzyskać golfiera, jest to, że
log5
nie jest on dostępny w Matlabie jako wbudowany, dlatego zastąpiłem log (5) przez 1.6, nie ma to znaczenia, ponieważ i tak zostanie zmienione.Spróbuj
źródło
Mathematica, 20 bajtów
IntegerExponent
liczy zera. Dla zabawy, oto wersja, która nie oblicza silni:źródło
Array
zapisuje bajt na drugim roztworze.C, 28 bajtów
Wyjaśnienie
Liczba końcowych zer jest równa liczbie piątek, które składają się na silnię. Spośród wszystkich
1..n
, jedna piąta z nich wnosi pięć, więc zaczynamyn/5
. Spośród nichn/5
, piąty są wielokrotnością 25, więc przyczynić się dodatkowo pięć, i tak dalej. Skończyło się na tymf(n) = n/5 + n/25 + n/125 + ...
, że jestf(n) = n/5 + f(n/5)
. Musimy zakończyć rekurencję, gdyn
osiągnie zero; również korzystamy z punktu sekwencji w,?:
aby podzielićn
przed dodaniem.Jako bonus, ten kod jest znacznie szybszy niż ten, który odwiedza każdy z nich
1..n
(i znacznie, znacznie szybciej niż obliczanie silni).Program testowy
Wyjście testowe
źródło
JavaScript ES6, 20 bajtów
Ta sama taktyka jak w odpowiedzi Xnora, ale krótsza.
źródło
Julia,
343130 bajtówJest to anonimowa funkcja, która przyjmuje dowolny typ liczby całkowitej ze znakiem i zwraca liczbę całkowitą. Aby go wywołać, przypisz go do zmiennej. Większe przypadki testowe wymagają przekazania
n
jako większego typu, takiego jak aBigInt
.Obliczamy silnię
n
(użycie ręczneprod
jest krótsze niż wbudowanefactorial
), otrzymujemy jej tablicędigits
w odwrotnej kolejności,find
indeksy niezerowych elementów, otrzymujemy pierwszy taki indeks i odejmujemy 1.Wypróbuj online!(obejmuje wszystkie przypadki testowe oprócz ostatniego, ponieważ ostatni trwa zbyt długo)
Oszczędność bajtu dzięki Dennisowi!
źródło
C, 36
Ta sama metoda, co odpowiedź @ xnor liczenia 5s, ale tylko prosta pętla for zamiast rekurencji.
Ideone .
źródło
Siatkówka , 33 bajty
Pobiera dane wejściowe jednoargumentowe.
Zwraca wynik w jednostkowej.
(Zwróć uwagę na końcowe podawanie linii).
Wypróbuj online!
Jak to działa:
Pierwszy etap:
Nieznacznie nie golfista:
Co to robi:
11111
.5
.(?=1)
zapewnia, że liczba jest dodatnia.+`
środki powtarzać aż idempotent.Jeśli wartość wejściowa to 100 (w jedności), tekst jest teraz:
Drugi etap:
Po prostu usuwa wszystkie średniki.
źródło
Ruby, 22 bajty
Jednym z niewielu przypadków, w których Ruby
0
jest prawdą, jest problem z liczeniem bajtów.źródło
0
prawdą?nil
ifalse
są falsey, i nic więcej nie jest. Istnieje wiele przypadków, w których pomaga się w golfie, ponieważ0
bycie prawdziwym oznacza, że funkcje indeksu i wyrażenia regularnego w Ruby zwracają,nil
jeśli nie ma dopasowania-1
, a niektóre są problematyczne, na przykład puste ciągi znaków są nadal prawdziwe.Perl 6 , 23 bajtów
Mógłbym go skrócić, gdyby
^...
został dodany do Perla 6{sum $_,*div 5^...0}
.Powinno być bardziej wydajne pod względem pamięci dla większych liczb, jeśli dodano
lazy
modyfikator pomiędzysum
i generator sekwencji.Wyjaśnienie:
Test:
(Ta ostatnia linia jest nieco myląca, ponieważ MoarVM musi się uruchomić, załadować kompilator i środowisko wykonawcze Perl 6, skompilować kod i uruchomić go. Tak więc zajmuje to w sumie około półtorej sekundy.
To wciąż znacznie szybciej niż to było sprawdzenie wyniku ostatniego testu z WolframAlpha.com)
źródło
Mathcad, [tbd] bajty
Mathcad jest swego rodzaju matematyczną „tablicą”, która umożliwia wprowadzanie 2D wyrażeń, tekstu i wykresów. Wykorzystuje symbole matematyczne do wielu operacji, takich jak sumowanie, różnicowanie i integracja. Operatory programowania są specjalnymi symbolami, zwykle wprowadzanymi jako pojedyncze kombinacje klawiszy sterowania i / lub shift na standardowym klawiszu.
To, co widzisz powyżej, jest dokładnie tym, jak wygląda arkusz Mathcad, gdy jest wpisywany i gdy Mathcad go ocenia. Na przykład zmiana n z 2016 na dowolną inną wartość spowoduje, że Mathcad zaktualizuje wynik z 502 do dowolnej nowej wartości.
http://www.ptc.com/engineering-math-software/mathcad/free-download
Metoda punktacji równoważności bajtów Mathcada nie została jeszcze ustalona. Biorąc równoważność symbolu, rozwiązanie zajmuje około 24 „bajtów” (operator while można wprowadzić tylko za pomocą kombinacji klawiszy „ctl-]” (lub z paska narzędzi)). Metoda Matlaba Agawa001 zajmuje około 37 bajtów po przetłumaczeniu na Mathcad (operator sumowania jest wprowadzany przez ctl-shft- $).
źródło
dc, 12 bajtów
Definiuje funkcję,
f
która pobiera dane wejściowe z góry stosu i pozostawia dane wyjściowe na górze stosu. Zobacz moją odpowiedź C dla podstawy matematycznej. Wielokrotnie dzielimy przez 5, kumulując wartości na stosie, a następnie dodajemy wszystkie wyniki:Program testowy
Wyjście testowe
źródło
Jolf, 13 bajtów
Definiuje funkcję rekurencyjną, która jest wywoływana na wejściu. Wypróbuj tutaj!
źródło
J,
281716 bajtówPrawie tak samo, jak technika nierekurencyjna z odpowiedzi xnor.
Oto starsza wersja, którą tu zachowałem, ponieważ osobiście bardziej mi się podoba, licząc 28 bajtów:
Chociaż nie jest to konieczne, dołączyłem
x:
do przypadków testowych dla większej precyzji.Ostatni numer nie działa z tą funkcją.
Wyjaśnienie
Działa to poprzez obliczanie
n!
, konwertowanie go na ciąg i sprawdzanie, czy każdy element jest równy z'0'
. Ponieważn = 15
proces ten byłby następujący:Teraz używamy
;._1
do dzielenia listy na jej pierwszym elemencie (zero), boksując każdy wynik podziału, uzyskując pole wypełnione asami (a:
) lub ciągami1
s, w ten sposób:Po prostu uzyskujemy ostatniego członka (
{:
), rozpakowujemy go (>
) i wykonujemy nad nim sumę+/
, uzyskując liczbę zer.Oto bardziej czytelna wersja:
źródło
>:@i.
można zapisać,1+i.
aby zapisać bajt.[:#.~'0'=":@!
13 bajtów, zmieniając metodę liczenia końcowych 1s.Python 3, 52 bajty
źródło
Pyke, 5 bajtów
Wypróbuj tutaj!
źródło
ZWROT , 17 bajtów
Try it here.
Operator rekurencyjny lambda. Stosowanie:
Wyjaśnienie
źródło
Perl,
2422 + 1 (-p
flaga) = 23 bajtyZa pomocą:
Pełny program:
źródło
Java, 38 bajtów
Pełny program, z metodą bez golfa:
źródło
J, 7 bajtów
Funkcja monadyczna z argumentem po prawej stronie.
Jeśli
x
jest dodatnia,x q: y
zwraca wykładniki w pierwszym rozkładzie na czynniki pierwszey
, tylko dla pierwszychx
liczb pierwszych.3
-Rd pierwsza jest 5 i{:
wykonuje ogon listy.Zauważ, że musisz wprowadzić liczby całkowite z
x
na końcu, bo J potraktuje je jako zmiennoprzecinkowe.Spróbuj sam na tryj.tk , ale ostrzegaj, że ten internetowy tłumacz będzie narzekał, jeśli spróbujesz czegoś większego niż 1343.
Jeśli chcesz czegoś, co nie oblicza n ! i dlatego nie wymaga dopasowania do liczby całkowitej, użyj rozwiązania rekurencyjnego
<.@%&5(+$:@)^:*
. (tryj.tk wciąż płacze przy dużych nakładach).źródło
Rubin,
70615149 bajtówWersja 3 z podziękowaniami dla Kenny'ego Lau i Daniero
Edycja: Okazuje się, że można zapisać dwa bajty, mapując
to_i
wcześniej sobąreduce
. Dziwne: PTa funkcja odejmuje sumę
n
5 cyfr podstawyn
a następnie dzieli wynik przez 4. Jest to związane z sumą szeregu geometrycznego1+5+25+..+5**n = (5**n+1)/4
.Jako przykład (ponownie, dzięki dzięki Kenny'emu Lau), rozważ
358
(2413
w bazie 5) minus jej 5 cyfr podstawy.Podziel
348
się4
i dostanieszf(358) = 87
.Wersja 2 z podziękowaniami dla Kenny'ego Lau
Funkcja oblicza
n!
następnie odejmowanasize
odn!
zsize
o(n!).reverse.to_i.to_s
, co usuwa wszystkie zera, a tym samym zawracaniasize
samych zer.Wersja 1
To odmiana „Ilu
5
jest tam pierwszych faktoryzacjin!
?” trik wykorzystujący proste wbudowane konwersje bazowe Ruby.Golfa jest nieco bólu chociaż z konwersji z
Integer
abyString
sięArray
, chwytając część obrzeżaArray
i przetwarzania, które naString
sięInteger
ponownie zreduce
. Wszelkie sugestie dotyczące gry w golfa są mile widziane.źródło
to_i
->n{(n-n.to_s(5).chars.map(&:to_i).reduce(:+))/4}
Julia,
2119 bajtówUżywa rekurencyjnej formuły z odpowiedzi xnor .
Wypróbuj online!
źródło
Dyalog APL , 9 bajtów
⎕
monit o numer!
rozkładać na czynniki⍕
skreślić'0'=
sprawdź równość znaku zero⊥⍨
policz końcowe ślady ** Dosłownie jest to konwersja mieszanej bazy na bazę 10, przy użyciu listy boolowskiej jako liczby i bazy:
⊥⍨0 1 0 1 1
jest taki sam, jak0 1 0 1 1⊥⍨0 1 0 1 1
który,0×(0×1×0×1×1) 1×(1×0×1×1) 0×(0×1×1) 1×(1×1) + 1×(1)
który znowu jest dwa (liczba końcowych 1s).źródło