Wprowadzenie
To bardzo proste wyzwanie: po prostu policz dzielniki liczby. Wcześniej mieliśmy podobne, ale bardziej skomplikowane wyzwanie , ale zamierzam, aby to było na poziomie podstawowym.
Wyzwanie
Utwórz program lub funkcję, która przy jednej ściśle dodatniej liczbie całkowitej N
wyprowadza lub zwraca liczbę posiadanych dzielników, w tym 1 i N
.
Dane wejściowe: jedna liczba całkowita> 0. Możesz założyć, że liczba może być reprezentowana w rodzimym typie liczbowym twojego języka.
Wynik: liczba posiadanych dodatnich dzielników liczb całkowitych, w tym 1 i sama liczba.
Zgłoszenia będą oceniane w bajtach . Ta witryna może być przydatna, ale możesz użyć dowolnej rozsądnej metody do generowania liczby bajtów.
To jest golf golfowy , więc wygrywa najniższy wynik!
Edycja: Wygląda na to, że FryAmTheEggman 5-bajtowa odpowiedź Pyth jest zwycięzcą! Możesz jednak przesyłać nowe odpowiedzi; jeśli możesz dostać coś krótszego, zmienię przyjętą odpowiedź.
Przypadki testowe
ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9
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.
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 dołączyć wiele numerów do nagłówka (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
C ++C,4357564643 bajtyZgodnie z sugestiami Martina Büttnera:
źródło
i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
LabVIEW, 4938 bajtów
Cóż, to oczywiście nie nadaje się do golfa kodowego, ale cokolwiek, więc na mój pierwszy post i Lolz tutaj idzie.
źródło
.
, co, jestem pewien, ma oznaczać separator tysiąca, a nie przecinek dziesiętny (jak to często bywa w niektórych językach).Haskell, 28 bajtów
Sztuczka polega na sprawdzeniu, czy reszta
0
korzysta z funkcji wskaźnika0^
.Działa to, ponieważ każda dodatnia moc 0 wynosi 0, podczas gdy 0 ^ 0 jest kombinatorycznie pustym iloczynem 1.
Porównaj to z filtrowaniem
źródło
Dyalog APL ,
76 bajtówJest to nienazwana funkcja, którą można nazwać, a następnie ponownie wykorzystać dla każdego
¨
przypadku testowego w następujący sposób:Wyjaśnienie:
Liczyć wyjątkowy z GCD od siebie i każda z liczb całkowitych, aż .
≢
∘
∪
∨
⊢
⍳
Dzięki ngn za zapisanie bajtu.
Stara wersja:
+/0=⍳|⊢
Tak to działa:
⍳|⊢
Argument 1-przez-argument dzielenia-reszty Wartość0=
logiczna, jeśli 0 jest równe reszcie+/
dzielącej Suma wartości boolowskiej, tj. Liczby jedności.źródło
Python 2, 37 bajtów
Funkcja rekurencyjna. Opcjonalne wejście
i
w testowanym dzielniku. Wyrażenie(n%i<1)
testuje podzielność, przyTrue
czym (która jest równa1
) dla dzielników. Wynik jest dodawany do wyrażenia zwrotnego dlai+1
. Kiedyi==n
zostanie osiągnięty, całkowity podział na piętra jesti/n
obliczany na1
, a ta wartość jest zwracana jako przypadek podstawowy, uznającn
się za dzielnikn
.38:
Anonimowa funkcja. Testy wszystkich możliwych dzielników
1
przezn
. To jest przesunięta w górę z0
pośrednictwemn-1
wrange(n)
użyciu-~
, co dodaje1
. Podsumowując boole wykorzystuje fakt, że Python traktujeTrue
/False
jak1
/0
.źródło
Siatkówka , 17 bajtów
Dane wejściowe są jednoargumentowe , dane wyjściowe dziesiętne.
Wypróbuj online.
Po wywołaniu z jednym wyrażeniem regularnym Retina po prostu liczy dopasowania. Wyrażenie regularne dopasowuje pozycję , w której liczba jednoargumentowa po jego lewej stronie jest dzielnikiem całego wejścia. Korzystam również z faktu, że spojrzenia są atomowe, więc nie muszę używać
^
kotwicy.Pierwsze spojrzenie po prostu przechwytuje cały przedrostek w grupie
1
. To nigdy nie może zawieść, więc po obejrzeniu wiemy, że to jest w grupie 1 i już się nie zmieni.Lookahead sprawdza następnie, czy możemy dotrzeć do końca ciągu, powtarzając przechwycony ciąg (nasz potencjalny dzielnik) 0 lub więcej razy.
źródło
J, 10 bajtów
To jest bezimienny, monadyczny czasownik. Oblicza σ 0 (∏p k α k ) jako ∏ (α k + 1) .
Spróbuj go online z J.js .
Jak to działa
źródło
q:
jest to dozwolone, ponieważ rozwiązuje zasadniczą część wyzwania. A może po prostu[:+/0=]|~1+i.
q:
.Golfscript,
19181713 bajtówZ podziękowaniami dla Martina Büttnera .
Jak to działa
Również
Od @Peter Taylor , również w 13 bajtach.
Jak to działa
źródło
~:X,{)X\%!},,
J,
131211 bajtówMój pierwszy golf w J. Wciąż się tego uczę.
Oszczędność bajtu dzięki Dennisowi.
Oszczędność jeszcze jednego bajtu dzięki randomra.
Wyjaśnienie:
źródło
Arcyóu , 12 bajtów
Zacznijmy imprezę!
Korzysta z wbudowanej funkcji
d/
. Oto wersja bez wbudowanego (27 bajtów):Wyjaśnienie:
źródło
CJam, 11 bajtów
Sprawdź to tutaj.
Wyjaśnienie
CJam nie ma do tego wbudowanego, więc przeprowadzamy podział próbny.
Premia
Oto interesujące rozwiązanie na 12 bajtów (które, jak podejrzewam, może być najkrótsze w języku takim jak J):
Wynik jest równy liczbie
n
wyświetleń wn x n
tablicy mnożenia:źródło
Matlab, 20 bajtów
Wykonaj
k mod n
dla każdegok = 1,...,n
, a następnie wykonajnot
(co zmienia każdy nonzer na zero i każde zero na 1) i zsumuj wszystkie te wartości.źródło
length(divisors(n))
.@(n)
aby stała się poprawnym przesłaniemJulia, 20 bajtów
Jest to anonimowa funkcja, która działa w następujący sposób: Dla każdej liczby całkowitej od 1 do wejścia sprawdź, czy moduł wejściowy liczba całkowita wynosi zero. Jeśli tak, wartość będzie
true
, w przeciwnym raziefalse
. Sumujemy liczby logiczne, które są domyślnie rzutowane na liczby całkowite, dając liczbę dzielników.Jest o wiele fajniejsze (choć także znacznie dłuższe) rozwiązanie, zawarte ze względu na kompletność
Pobiera to kanoniczną faktoryzację
n
, tj.\prod_{i=1}^k p_i^e_i
I oblicza funkcję dzielnika jakoτ(n) = \prod_{i=1}^k e_i + 1
.źródło
PARI / GP, 6 bajtów
PARI / GP mają do tego wbudowaną funkcję.
źródło
Pyth, 8 bajtów
Prosty podział próbny.
Wypróbuj online tutaj .
źródło
Rubinowy, 27 bajtów
Przykładowy przebieg:
źródło
Oktawa,
2120 bajtówźródło
nnz
, świetne użycie tutaj =)Regex (.NET), 33 bajty
Zakładając, że dane wejściowe i wyjściowe są jednoargumentowe, a dane wyjściowe są pobierane z głównego dopasowania wyrażenia regularnego.
Podział wyrażenia regularnego:
.*$
ustawia wskaźnik na końcu łańcucha, dzięki czemu mamy cały sygnał wejściowy xw jednym kierunku.(?<=^\2*(.+?(?>\2?)))
dopasowuje od prawej do lewej i sprawdza dzielnik, zapętlając od x do 0.(.+?(?>\2?))
jest „zmienną”, która zaczyna się od 1 w pierwszej iteracji i kontynuuje od liczby w poprzedniej iteracji i zapętla do x.^\2*
sprawdza, czy x jest wielokrotnością „zmiennej”.Zasadniczo ma ten sam pomysł, co moja odpowiedź na Calculate Phi (nie Pi) . Tylko czek jest inny.
Przetestuj wyrażenie regularne w RegexStorm .
źródło
Labirynt , 33 bajty
Wypróbuj online.
To wdraża podział próbny. Później dodam pełne wyjaśnienie. Prawdopodobnie nie jest to optymalne, ale trudno mi wymyślić coś krótszego.
źródło
Perl 6 , 17 bajtów
stosowanie:
źródło
JavaScript (ES6),
605742403937 bajtówPrawdopodobnie można to lepiej grać w golfa.
Edycja 1: Miałem rację. Usunięto nawiasy klamrowe po pętli for.
Edycja 2: Grał w golfa do 40 bajtów dzięki manatwork i Martinowi Büttnerowi .
Edycja 3: Zapisywanie bajtu przez oparcie funkcji na odpowiedzi C powyżej.
Edycja 4: Dzięki ן nɟuɐɯɹɐ ן oɯ i Neilowi , ale nie mogę sprawić, by eval działał.
Edycja 5: Zapomniałem usunąć ewaluację.
Test
źródło
var
słowa kluczowe. Więcej wskazówek w Poradach dla golfistów w JavaScript i Poradach dla golfistów w ECMAScript 6 .++i
ii++
, wybierz pierwszą (to nie ma nic wspólnego z golfem).n%i<1
Powinien również zapisać bajt.n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
n%++i||++d
?PowerShell, 34 bajty
|
!
aby dzielniki stały się $ true i zostały dopuszczone; za pomocą wbudowanego aliasu?
dlaWhere-Object
()
i.Count
ile przedmiotów przeszło przez filtrźródło
Galaretka , 2 bajty (niekonkurujące (ponownie))
Wypróbuj online!
Myślę, że wykorzystuje to funkcje zaimplementowane po drugiej odpowiedzi Jelly. Skomentuj, jeśli się mylę (nie mogę sprawdzić każdego zatwierdzenia w wierszu, wiesz :))
źródło
Taxi, 2143 bajtów
Wypróbuj online!
Nie golfowany:
Wyjaśnienie:
źródło
Japt , 3 bajty
-m
Flaga służy do uruchamiania wszystkich przypadków testowych.Spróbuj
źródło
Formuła Excel,
4228 bajtówEdycja: Właśnie zdałem sobie sprawę, że nie muszę używać
INDIRECT
, oszczędzając 14 bajtów!Jako formułę tablicową ( Ctrl+ Shift+ Enter) należy wprowadzić:
Gdzie N jest liczbą do przetestowania.
Przykłady:
Wyjaśnienie:
źródło
05AB1E , 2 bajty
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Całkiem proste, ale i tak jest:
źródło
Mathematica, 16 bajtów
Prosta kompozycja funkcji wbudowanych.
źródło
Minkolang 0,13 , 16 bajtów
Sprawdź wszystkie przypadki tutaj.
Wyjaśnienie
źródło