pengantar
Urutan EKG dimulai dengan 1 dan 2, maka aturannya adalah bahwa istilah berikutnya adalah bilangan bulat positif terkecil yang belum ada dalam urutan dan yang faktor umum dengan istilah terakhir lebih besar dari 1 (mereka bukan koprimes).
Istilah pertama adalah:
1, 2, 4, 6, 3, 9, 12, 8, 10, 5, 15, ...
Ini disebut EKG karena grafik istilahnya sangat mirip dengan EKG.
Ini urutan A064413 di OEIS .
Tantangan
Anda harus menulis sebuah fungsi yang mengambil bilangan bulat n sebagai input dan output berapa banyak n istilah pertama dari urutan lebih besar dari n .
Ketika aturan urutan dimulai dengan term ketiga, integer input harus lebih besar atau sama dengan 3. Misalnya, input yang diberikan 10
output 1
karena istilah ke-7 adalah12
dan tidak ada satu pun dari sepuluh suku pertama lainnya melebihi 10.
Uji kasus
3 -> 1
10 -> 1
100 -> 9
1000 -> 70
Aturan
- Untuk bilangan bulat yang lebih rendah dari 3, fungsi dapat menghasilkan 0 atau kode kesalahan.
- Tidak ada aturan khusus lain kecuali: itu kode golf, semakin pendek semakin baik!
1
menjadi istilah ke-0 dari urutan dan karenanya membuat, misalnya,15
istilah ke-10, bukan5
?Jawaban:
Jelly ,
201918 byteIni adalah program lengkap.
Cobalah online!
Bagaimana itu bekerja
Perhatikan bahwa urutan yang dihasilkan adalah[1,0,2,4,6,3,9,12,8,10,5,15,…] . Karena memanggil tautan helper n kali menghasilkan urutan panjang n+1 , 0 praktis diabaikan.
sumber
Perl 6 ,
66635958 byte-4 byte terima kasih kepada Jo King
Cobalah online!
Terlalu lambat pada TIO untuk n = 1000.
sumber
first &f,1..*
dapat ditulis ulang sebagai+(1...&f)
, trik persimpangan Anda membantu setelah semua.JavaScript (ES6),
107106105 byteCobalah online!
Bagaimana?
Fungsi pembantuC mengembalikan true jika dua bilangan bulat yang diberikan tidak coprime:
ArraySebuah diinisialisasi ke [ 2 , 1 ] dan memegang semua nilai yang ditemui sejauh ini dalam urutan terbalik. Karena itu, nilai terakhir selalua [ 0 ] .
Untuk mengetahui apakahk qualifies as the next term of the sequence, we test whether the following expression is equal to 0 :
a.indexOf(k)
is equal to either:Therefore,0 if and only if k is not found in a and k is not coprime with the last value (−1+true=0 ).
a.indexOf(k) + C(k, a[0])
is equal tosumber
Haskell,
8982 bytesEdit: -7 bytes thanks to @H.PWiz
Try it online!
sumber
Husk, 16 bytes
Try it online!
Explanation
sumber
MATL, 29 bytes
Try it online!
Explanation:
sumber
GE:
)?while
loop would be much messier in MATL so I was trying to avoid it.APL (Dyalog Unicode), 39 bytesSBCS
-2 bytes thanks to ngn, -1 byte by using proper conditional checking.
Try it online!
sumber
⍣
passes its own left argument to the operand function, so there's no need for∘
. also,⍵
won't bind with the thing on the right as it starts with a function (⍳
), so there's no need for⊢
.JavaScript,
939187 bytesThrows an overflow error for
0
or1
, outputs0
for2
.Try it online
sumber
APL(NARS), chars 121, bytes 242
test in less one minute here in running time:
Natural there is no check for type and for range...
sumber
Japt,
2321 bytesTry it
sumber
Python 3, 153 bytes
Try it online! (Warning: Takes ~30 seconds to evaluate)
sumber