Napisz program, który wyświetla na ekranie sumę dzielników liczby (1 ≤ N ≤ 100) wprowadzonych przez użytkownika w zakresie od 1 do N.
To jest OEIS A000203 .
Przykłady:
Wejście : 7
7 / 1 = 7
7 / 7 = 1
7 + 1 = 8
Wyjście: 8
Wejście: 15
15 / 1 = 15
15 / 3 = 5
15 / 5 = 3
15 / 15 = 1
15 + 5 + 3 + 1 = 24
Wyjście: 24
Wejście: 20
20 / 1 = 20
20 / 2 = 10
20 / 4 = 5
20 / 5 = 4
20 / 10 = 2
20 / 20 = 1
20 + 10 + 5 + 4 + 2 + 1 = 42
Wyjście: 42
Wejście: 1
1 / 1 = 1
Wyjście: 1
Wejście: 5
5 / 1 = 5
5 / 5 = 1
5 + 1 = 6
Wyjście: 6
Odpowiedzi:
05AB1E , 2 bajty
Wypróbuj online!
W jaki sposób?
źródło
ÑO
- Odrzucając wyzwanie i jednocześnie wygrywając. To całkiem nieźle.x86-64 Kod maszynowy, 23 bajty
Powyższe bajty kodu definiują funkcję, która akceptuje pojedynczą liczbę całkowitą, N, i zwraca w rezultacie sumę jej wielokrotności.
Pojedynczy parametr jest przekazywany w pliku
EDI
rejestru, zgodny z System V AMD64 ABI (stosowany w systemach * nix). Wynik jest zwracany doEAX
rejestru, podobnie jak wszystkie konwencje wywoływania x86.Algorytm jest bardzo prosty, podobny do wielu innych zgłoszeń w innych językach. Pętlimy N razy, za każdym razem obliczając moduł i dodając go do naszej sumy bieżącej.
Mnemoniki do montażu bez golfa:
Wypróbuj online!
Wydaje się, że powinien istnieć sposób na skrócenie tego, ale nie widzę tego. Obliczenie modulo na x86 wymaga sporo kodu, ponieważ robisz to za pomocą instrukcji
DIV
(lubIDIV
) i oba używają stałych rejestrów wejściowych (EDX
iEAX
), których wartości są blokowane (ponieważ otrzymują wyniki, reszta i iloraz odpowiednio).Jedynymi sztuczkami tutaj są dość standardowe gry w golfa:
LOOP
instrukcji w stylu CISC , która jest po prostu kombinacjąDEC
+JNZ
zECX
rejestrem jako domyślnym operandem.XCHG
na końcu zamiastMOV
ponieważ ten pierwszy ma specjalne 1-bajtowe kodowanie, gdyEAX
jest jednym z operandów.CDQ
do wyzerowaniaEDX
w przygotowaniach do podziału, nawet jeśli dla niepodpisanego podziału zwykle zerujesz go za pomocąXOR
. JednakXOR
zawsze ma 2 bajty, aCDQ
tylko 1 bajt. UżywamCDQ
ponownie po raz drugi w pętli do zeraEDX
, przedCMOVZ
instrukcją. Działa to, ponieważ mogę zagwarantować, że iloraz podziału (inEAX
) jest zawsze niepodpisany, więc rozszerzenie znaku naEDX
będzie ustawioneEDX
na 0.źródło
C (gcc), 45 bajtów
Wypróbuj online!
źródło
Japt , 3 bajty
Wypróbuj online!
źródło
â x
-x
może to być jeden bajtBrachylog , 2 bajty
Wypróbuj online!
Wyjaśnienie
źródło
Mathematica, 14 bajtów
lub odpowiedź @Loki
Mathematica, 17 bajtów
źródło
Tr@Divisors@#&
jeszcze lepiej ;-)f=
która pobiera dane wejściowe f [x], dlatego przedstawiam to w ten sposób. Witamy w PPCGTr@*Divisors
aby ogolić bajt.C, C ++, C #, D, Java,
6562 bajtówDziała to we wszystkich 5 językach programowania ze względu na podobieństwa.
Optymalizacja C, C ++ i D:
6260 bajtówW C ++ i D liczby całkowite są konwertowane niejawnie na logiczne (Zero => false, Not Zero => true), więc nie musisz mieć
!=0
Optymalizacja D: system szablonów golfy, 55 bajtów
Kod do przetestowania :
C:
C ++:
C #:
D:
Java:
źródło
n%i
/n%i!=0
w dowolnym języku. Po drugie,n%i>0
zamiast tego powinno być dostępne Twoje pierwsze rozwiązanien%i!=0
. Po trzecie, rozwiązaniem D może byćT d(T)(T n){T s,i=1;for(;i<=n;++i)s+=n%i?0:i;return s;}
nadużycie systemu szablonów i wartości domyślnych.Shnap ,
4443 bajty-1 do zobaczenia dzięki Panu Xcoderowi (lol zostałem rozegrany w moim własnym języku)
To jest funkcja (
$
uruchamia funkcję w Shnap).Wypróbuj online!
Wyjaśnienie:
Niekonkurencyjne, 19 bajtów
Po wielu aktualizacjach języka można to teraz zredukować do zaledwie 19 bajtów:
Wypróbuj online!
źródło
==0
to<1
( 43 bajty )Python, 44 bajty
źródło
J, 23 bajty
Wypróbuj online!
Dla fanów J jest coś sprytne 13-bajtowe rozwiązanie :
>:@#.~/.~&.q:
ale ponieważ nie był to mój wynalazek, nie publikuję go jako mojej oficjalnej odpowiedzi.Moje własne rozwiązanie po prostu filtruje 1..n, znajdując dzielniki, a następnie je sumuje. Jego sednem jest widelec widmowy
Zauważ, że w tym kontekście
]
jest to 1..n i[
samo jest n. Stąd]|[
są pozostałe przy dzieleniu każdego elementu 1..n na n, i=&0
mówi, czy są równe 0.źródło
+1#.i.*0=i.|]
i.|]
wielką poprawę mojego podejścia. Nie do końca jednak rozumiem tę część:+1#.i.
- mógłbyś to wyjaśnić?1#.
jest konwersją podstawy 1, która jest równoważna+/"1
. Najpierwi.|]
zdobądź pozostałe, następnie0=
znajdź te równe 0 (dzielniki), a następniei.*
wyzeruj niepodzielniki w zakresie, następnie zsumuj za pomocą1#.
, a następnie dodaj+
się, ponieważi.
jest to zakres wyłączny.Java (OpenJDK 8) ,
5351 bajtówWypróbuj online!
źródło
Haskell , 30 bajtów
Wypróbuj online!
źródło
MATL , 6 bajtów
Wypróbuj online!
-4 bajty dzięki @LuisMendo
10 bajtów
Moje poprzednie rozwiązanie za pomocą pętli
Wypróbuj online!
3 bajty
Korzystanie z wbudowanego
Wypróbuj online!
źródło
JavaScript,
5444 bajtyZaoszczędź 10 bajtów dzięki Shaggy
Wypróbuj online!
źródło
Brain-Flak , 96 bajtów
Wypróbuj online!
Wyjaśnienie:
Teraz przestarzałe przez ulepszenia.
Sedno algorytmu jest następujące:
Jest to modyfikacja mod, która da nam,
M
jeśli jest to czynnikN
i0
nie tylko. Pełny kod znajduje się poniżej.źródło
R ,
3126 bajtówWypróbuj online!
Zwraca
1x1
macierz.Oblicza
!N%%x
odwzorowuje elementyd
dotyczące1:N
poprzez:d->(1 if d divides N, 0 otherwise)
Następnie
x%*%x!N%%x
jest iloczyn macierzy,1:N
którego wynikiem jest sumax
gdzie!N%%x
jest1
. Schludny! Technicznie jest to część odpowiedzi Octave Luisa Mendo, ale zobaczyłem to dopiero po tym, jak o tym pomyślałem.Liczby R +, 14 bajtów
Wypróbuj online!
źródło
N=scan();
numbers::Sigma(N)
? W ten sposób wyświetla kod źródłowy funkcjiSigma
.JavaScript, 31 bajtów
źródło
Pari/GP, 5 bytes
Try it online!
źródło
Python 2, 41 bytes
Try it online!
źródło
VBA (Excel), 73 bytes
źródło
Sub Y
...End Sub
to get the 85 Byte solutionSub y
A=Cells(1,1)
x=1
While x<=A
If A Mod x=0 Then b=b+x
x=x+1
Wend
MsgBox b
End Sub
Sub y
While x<=[A1]
x=x+1
If [A1]Mod x=0Then b=b+x
Wend
Debug.?b
End Sub
which assumes that it is run in a clean module (x = default int value,0
) and outputs to the VBE immediate window (?
autoformats toPrint
)While x<=[A1]:x=x+1:b=IIf([A1]Mod x,b,b+x):Wend:?b
which assumes thatx
,b
are the default value of 0 and outputs to the VBE immediate window (from the VBE immediate window?
is equivalent toDebug.Print
)Pyth, 6 bytes
Try it here!
Pyth doesn't have a built-in for divisors, so I think this is reasonable.
Explanation
Given
20
, for instance, this is what our program does after each instruction:P
:[2, 2, 5]
.y
:[[], [2], [2], [5], [2, 2], [2, 5], [2, 5], [2, 2, 5]]
.{
:[[], [2], [5], [2, 2], [2, 5], [2, 2, 5]]
.*M
:[1, 2, 5, 4, 10, 20]
.s
:42
.źródło
Ohm v2, 2 bytes
Try it online!
This is pretty straight-forwad:
źródło
Husk, 5 bytes
Try it online!
How?
Thanks to Zgarb for the suggestions in chat!
źródło
Octave, 20 bytes
Try it online!
źródło
RProgN 2, 2 bytes
Explained
Trivial, but felt it needed to be posted.
Try it online!
źródło
Perl 5, 35 + 1 (-p) = 36 bytes
Try it online!
źródło
Bash + GNU utilities, 36
Try it online.
Pure Bash, 41
Try it online.
I first tried a fancy bash expansion answer, but it ended up being longer than the simple loop above:
źródło
Add++, 9 bytes
Try it online!
I clearly got here too late. This defines a function that gets the factors, then sums them.
źródło
QBIC, 17 bytes
Explanation
źródło
Gaia, 2 bytes
Try it online!
Pretty straight-forward:
źródło