Tulis program yang menampilkan pada layar jumlah pembagi angka (1 ≤ N ≤ 100) yang dimasukkan oleh pengguna dalam kisaran 1 hingga N.
Ini adalah OEIS A000203 .
Contoh:
Input : 7
7 / 1 = 7
7 / 7 = 1
7 + 1 = 8
Output: 8
Input: 15
15 / 1 = 15
15 / 3 = 5
15 / 5 = 3
15 / 15 = 1
15 + 5 + 3 + 1 = 24
Output: 24
Input: 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
Output: 42
Input: 1
1 / 1 = 1
Output: 1
Input: 5
5 / 1 = 5
5 / 5 = 1
5 + 1 = 6
Output: 6
Jawaban:
05AB1E , 2 byte
Cobalah online!
Bagaimana?
sumber
ÑO
- Menolak tantangan dan menang pada saat yang sama. Itu sangat buruk.x86-64 Kode Mesin, 23 byte
Byte kode di atas mendefinisikan fungsi yang menerima integer tunggal, N, dan mengembalikan jumlah kelipatannya sebagai hasilnya.
Parameter tunggal dilewatkan dalam
EDI
register, konsisten dengan System V AMD64 ABI (seperti yang digunakan pada sistem * nix-style). Hasilnya dikembalikan dalamEAX
register, seperti semua konvensi pemanggilan x86.Algoritma ini sangat mudah, mirip dengan banyak kiriman lainnya dalam bahasa lain. Kami mengulang N kali, setiap kali menghitung modulo dan menambahkannya ke total berjalan kami.
Mnemonik perakitan tidak dikumpulkan:
Cobalah online!
Sepertinya memang ada cara untuk membuatnya lebih pendek, tapi aku tidak bisa melihatnya. Komputasi modulo pada x86 membutuhkan sedikit kode, karena Anda melakukannya menggunakan instruksi
DIV
(atauIDIV
), dan keduanya menggunakan register input tetap (EDX
danEAX
), nilai-nilai yang menjadi musnah (karena mereka menerima hasil, sisanya dan bagi hasil, masing-masing).Satu-satunya trik nyata di sini adalah yang golf standar:
LOOP
instruksi gaya CISC , yang pada dasarnya hanya kombinasiDEC
+JNZ
denganECX
register sebagai operan implisit.XCHG
di akhir bukanMOV
karena yang pertama memiliki 1-byte encoding khusus ketikaEAX
adalah salah satu operan.CDQ
untuk nolEDX
dalam persiapan untuk divisi, meskipun untuk divisi tanpa tanda tangan Anda biasanya hanya akan nol menggunakanXOR
. Namun,XOR
selalu 2 byte, sementaraCDQ
hanya 1 byte. Saya menggunakanCDQ
lagi untuk kedua kalinya di dalam loop ke nolEDX
, sebelumCMOVZ
instruksi. Ini berfungsi karena saya dapat dijamin bahwa hasil bagi divisi (inEAX
) selalu tidak ditandatangani, jadi perpanjangan tanda masukEDX
akan ditetapkanEDX
sama dengan 0.sumber
C (gcc), 45 byte
Cobalah online!
sumber
Japt , 3 byte
Cobalah online!
sumber
â x
-x
, bisa jadi satu byteBrachylog , 2 byte
Cobalah online!
Penjelasan
sumber
Mathematica, 14 byte
atau jawaban oleh @Loki
Mathematica, 17 byte
sumber
Tr@Divisors@#&
bahkan lebih baik ;-)f=
yang mengambil input f [x] itu sebabnya saya menyajikannya dengan cara ini. Selamat datang di PPCGTr@*Divisors
untuk mengurangi byte.C, C ++, C #, D, Java,
6562 byteIni bekerja di semua 5 bahasa pemrograman tesis karena kesamaan.
Optimasi C, C ++ dan D:
6260 byteDalam C ++ dan D, integer dikonversi secara implisit menjadi boolean (Nol => salah, Bukan Nol => benar), jadi Anda tidak perlu memiliki
!=0
D optimasi: sistem template golf, 55 byte
Kode untuk diuji :
C:
C ++:
C #:
D:
Jawa:
sumber
n%i
/n%i!=0
dalam salah satu bahasa. Kedua, solusi pertama Anda seharusnya bisan%i>0
bukann%i!=0
. Ketiga, solusi D dapatT d(T)(T n){T s,i=1;for(;i<=n;++i)s+=n%i?0:i;return s;}
dengan menyalahgunakan sistem template dan nilai default.Shnap ,
4443 byte-1 sampai jumpa terima kasih kepada Tn. Xcoder (lol saya kalah dalam bahasa saya sendiri)
Ini adalah fungsi (
$
memulai fungsi dalam Shnap).Cobalah online!
Penjelasan:
Tidak bersaing, 19 byte
Setelah banyak pembaruan bahasa, ini sekarang dapat dikurangi menjadi 19 byte:
Cobalah online!
sumber
==0
is<1
( 43 bytes )Python, 44 byte
sumber
J, 23 byte
Cobalah online!
Untuk penggemar J, ada solusi 13 byte yang pintar :
>:@#.~/.~&.q:
tapi karena itu bukan penemuan saya, saya tidak mempostingnya sebagai jawaban resmi saya.Solusi saya sendiri cukup menyaring 1..n, menemukan pembagi, lalu menjumlahkannya. Inti dari itu adalah garpu diad
Perhatikan bahwa dalam konteks ini
]
adalah 1..n, dan[
adalah n itu sendiri. Karenanya]|[
adalah sisa ketika membagi setiap elemen dari 1..n menjadi n, dan=&0
memberi tahu Anda jika mereka sama dengan 0.sumber
+1#.i.*0=i.|]
i.|]
merupakan perbaikan besar pada pendekatan saya. Saya tidak sepenuhnya memahami bagian ini:+1#.i.
- dapatkah Anda menjelaskannya?1#.
adalah konversi basis 1, yang setara dengan+/"1
. Pertamai.|]
untuk mendapatkan sisanya, kemudian0=
untuk menemukan yang sama dengan 0 (pembagi), kemudiani.*
untuk nol pembagi-pembagi dalam rentang, lalu jumlah menggunakan1#.
, kemudian tambahkan+
sendiri karenai.
merupakan rentang eksklusif.Java (OpenJDK 8) ,
5351 byteCobalah online!
sumber
Haskell , 30 byte
Cobalah online!
sumber
MATL , 6 byte
Cobalah online!
-4 byte terima kasih kepada @LuisMendo
10 byte
Solusi saya sebelumnya menggunakan loop
Cobalah online!
3 byte
Menggunakan built-in
Cobalah online!
sumber
Javascript,
5444 byteDisimpan 10 byte berkat Shaggy
Cobalah online!
sumber
Brain-Flak , 96 byte
Cobalah online!
Penjelasan:
Sekarang ketinggalan jaman dengan perbaikan.
Inti dari algoritma ini adalah:
Itu adalah modifikasi pada mod yang akan memberi kita
M
jika itu adalah faktorN
dan0
sebaliknya. Kode lengkapnya ada di bawah ini.sumber
R ,
3126 byteCobalah online!
Mengembalikan
1x1
matriks.Menghitung
!N%%x
peta elemend
dari1:N
oleh:d->(1 if d divides N, 0 otherwise)
Maka
x%*%x!N%%x
adalah produk matriks1:N
yang hasil dalam jumlahx
mana!N%%x
adalah1
. Rapi! Secara teknis pelabuhan Luis Mendo jawaban Oktaf tetapi saya hanya melihat itu setelah saya memikirkan hal ini.Angka R +, 14 byte
Cobalah online!
sumber
N=scan();
numbers::Sigma(N)
? Seperti ini ia mengeluarkan kode sumber fungsiSigma
.JavaScript, 31 byte
sumber
Pari / GP , 5 byte
Cobalah online!
sumber
Python 2 , 41 byte
Cobalah online!
sumber
VBA (Excel), 73 byte
sumber
Sub Y
...End Sub
untuk mendapatkan solusi 85 ByteSub 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
yang mengasumsikan bahwa itu dijalankan dalam modul bersih (x = nilai int default,0
) dan output ke jendela langsung VBE (?
autoformats kePrint
)While x<=[A1]:x=x+1:b=IIf([A1]Mod x,b,b+x):Wend:?b
yang mengasumsikan bahwax
,b
adalah nilai default 0 dan output ke jendela langsung VBE (dari jendela langsung VBE?
setara denganDebug.Print
)Pyth , 6 byte
Coba di sini!
Pyth tidak memiliki built-in untuk pembagi, jadi saya pikir ini masuk akal.
Penjelasan
Mengingat
20
, misalnya, inilah yang dilakukan program kami setelah setiap instruksi: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
.sumber
Ohm v2 , 2 byte
Cobalah online!
Ini cukup jelas:
sumber
Sekam , 5 byte
Cobalah online!
Bagaimana?
Terima kasih kepada Zgarb untuk sarannya dalam obrolan!
sumber
Oktaf , 20 byte
Cobalah online!
sumber
RProgN 2 , 2 byte
Dijelaskan
Sepele, tetapi merasa perlu diposting.
Cobalah online!
sumber
Perl 5 , 35 + 1 (-p) = 36 byte
Cobalah online!
sumber
Utilitas Bash + GNU, 36
Cobalah online .
Pure Bash, 41
Cobalah online .
Saya pertama kali mencoba jawaban ekspansi bash mewah, tetapi akhirnya lebih panjang dari loop sederhana di atas:
sumber
Tambahkan ++ , 9 byte
Cobalah online!
Saya jelas terlambat sampai di sini. Ini mendefinisikan fungsi yang mendapatkan faktor, lalu menjumlahkannya.
sumber
QBIC , 17 byte
Penjelasan
sumber
Gaia , 2 byte
Cobalah online!
Cukup mudah:
sumber