Kata pengantar
Dalam lagu Natal yang terkenal, The Twelve Days of Christmas , narator dihadiahi beberapa hadiah setiap hari. Lagu ini bersifat kumulatif - di setiap ayat, hadiah baru ditambahkan, dengan jumlah yang lebih tinggi dari hadiah sebelumnya. Satu Partridge, Dua Merpati Penyu, Tiga Ayam Perancis, dan seterusnya.
Pada setiap ayat tertentu, N , kita dapat menghitung jumlah kumulatif hadiah sejauh ini dalam lagu dengan menemukan nomor tetrahedral ke- N , yang memberikan hasil:
Verse 1: 1
Verse 2: 4
Verse 3: 10
Verse 4: 20
Verse 5: 35
Verse 6: 56
Verse 7: 84
Verse 8: 120
Verse 9: 165
Verse 10: 220
Verse 11: 286
Verse 12: 364
Misalnya, setelah ayat 4, kami memiliki 4 * (1 ayam hutan) , 3 * (2 burung merpati) , 2 * (3 ayam Perancis) dan 1 * (4 burung pemanggil) . Dengan menjumlahkan ini, kita dapatkan 4(1) + 3(2) + 2(3) + 1(4) = 20
.
Tantangan
Tugas Anda adalah menulis sebuah program atau fungsi yang, diberi bilangan bulat positif yang mewakili jumlah hadiah 364 ≥ p ≥ 1 , menentukan hari (ayat) Natal mana yang tepat.
Sebagai contoh, jika p = 286 , kita berada pada hari Natal ke-11. Namun, jika p = 287 , maka muatan hadiah berikutnya telah dimulai, artinya ini adalah hari ke-12.
Secara matematis, ini menemukan nomor tetrahedral berikutnya, dan mengembalikan posisinya di seluruh urutan nomor tetrahedral.
Aturan:
- Ini adalah kode-golf , sehingga solusi terpendek (dalam byte) menang.
- Berlaku celah golf standar.
- Dalam hal berhari-hari, program Anda harus diindeks 1.
- Kiriman Anda harus berupa program atau fungsi lengkap - tetapi bukan cuplikan.
Uji Kasus
1 -> 1
5 -> 3
75 -> 7
100 -> 8
220 -> 10
221 -> 11
364 -> 12
sumber
x=>{while(x>p)p+=r+=++i;return i}
:, saya yakin itu bisa dibuat lebih pendek dalam bahasa seperti JavaScript.Jawaban:
Jelly ,
76 byte-1 byte berkat Dennis (gunakan vektorised minimum
«
,, dan indeks pertama,i
)TryItOnline
Bagaimana?
Tidak semua yang efisien - menghitung angka tetrahedral ke-1 sampai ke n secara berurutan dalam daftar dan mengembalikan indeks berbasis-1 dari yang pertama yang sama atau lebih besar.
Sebelumnya 7 byters menggunakan berbagai menurunkan
[0,1,2,3,...,n-1]
dan menghitung tetrahedrals kurang dari n:Ḷ+\⁺<µS
,Ḷ+\⁺<ḅ1
,Ḷ+\⁺<ċ1
, danḶ+\⁺<¹S
sumber
Python , 27 byte
Cobalah online!
Formula langsung dengan beberapa kurva-fitting, sama seperti yang asli yang ditemukan oleh Level River St.
Persamaan bergeser
i**3-i==n*6
dekat dengani**3==n*6
untuk besari
. Itu teratasii=(n*6)**(1/3)
. Turunkan lantai putaran sesuai kebutuhan, mengimbangi off-by-one.Tapi, ada 6 input pada batas di mana kesalahan membawanya di bawah bilangan bulat itu harus di atas. Semua ini dapat diperbaiki dengan sedikit meningkatkan eksponen tanpa memperkenalkan kesalahan lebih lanjut.
Python , 38 byte
Rumus
n=i*(i+1)*(i+2)/6
untuk angka tetrahedral dapat ditulis dengan lebih baiki+1
sebagain*6=(i+1)**3-(i+1)
. Jadi, kita menemukan terendahi
yangi**3-i<n*6
. Setiap kali kami menambahi
mulai dari 1, panggilan rekursif menambah1
output. Mulai darii=1
alih-alihi=0
mengkompensasi pergeseran.sumber
**.33359
bekerja untuk satu byte tambahan.lambda n:n**.3336//.5501
menghemat beberapa byte.J , 12 byte
Mungkin ada cara golf untuk melakukan ini, tetapi ini adalah kesempatan yang bagus untuk menggunakan fungsi inversi bawaan J.
Cobalah online!
Bagaimana itu bekerja
sumber
Python , 22 byte
Sangat terinspirasi oleh jawaban Python @ xnor .
Cobalah online!
sumber
Jelly , 7 byte
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6), 33 byte
Berdasarkan rumus rekursif:
Ekspresi kedua juga dapat ditulis sebagai ...
... yang mana yang kita gunakan di sini.
a(i - 1)
sebenarnya disimpan dalamk
variabel dan diteruskan ke iterasi berikutnya hinggak >= n
.Uji kasus
Tampilkan cuplikan kode
sumber
Ruby, 26 byte
Sunting: versi alternatif, masih 26 byte
Versi asli
Menggunakan fakta
T(x) = x(x+1)(x+2)/6 = ((x+1)**3-(x+1))/6
yang sangat dekat(x+1)**3/6
.Fungsi ini hanya dikalikan dengan 6, menemukan versi yang sedikit tweak dari akar kubus (ya 5 tempat desimal diperlukan) dan mengembalikan hasilnya terpotong ke integer.
Program uji dan keluaran
sumber
0.3336
tampaknya berfungsi untuk versi asli. (Sunting: Tidak apa-apa, Dennis menunjukkan saya lupa tentang 364.)JavaScript,
3633 byte-3 bytes terima kasih kepada Luke (membuat fungsinya digulung)
Ini adalah fungsi lambda tanpa nama yang dapat ditugaskan
func
dan dipanggil denganfunc(220)()
, seperti yang dijelaskan dalam pos meta ini . Fungsi asli saya, non-kari terlihat seperti ini:Jawaban ini menggunakan fakta bahwa bilangan tetrahedral ke- X dapat ditemukan dengan fungsi berikut:
Pengajuan bekerja dengan meningkatkan
i
, dan menemukan secara rekursiftetrahedral(i)
, sampai lebih besar atau sama dengann
(jumlah hadiah yang diberikan).Ketika dipanggil dengan satu argumen seperti yang diharapkan
i = undefined
,, dan karenanya tidak lebih besar darin
. Ini berartif(n,-~i)
dieksekusi, dan-~undefined
dievaluasi menjadi1
, yang memicu rekursi.Cuplikan Tes:
sumber
n=>g=i=>n<=i/6*++i*++i?i-2:g(~-i)
. Anda akan menyebutnya sepertif(2)()
.i=>n<=i
Cantik ;-)MATL ,
1211 byteCobalah online!
Penjelasan
sumber
05AB1E , 10 byte
Cobalah online!
Penjelasan
sumber
[N2Ý+P6÷¹Q#N>
, bagus.Pyke, 11 byte
Coba di sini!
sumber
Mathematica, 26 byte
Fungsi yang tidak disebutkan namanya mengambil argumen integer nonnegatif dan mengembalikan integer nonnegatif (ya, berfungsi juga untuk hari
0
itu). Kami ingin mencari bilangan bulat terkecili
yang input#
paling banyaki(i+1)(i+2)/6
, yang merupakan formula untuk jumlah hadiah yang diberikan pada pertamai
hari. Melalui tipuan aljabar ringan, ketimpangan# ≤ i(i+1)(i+2)/6
setara dengan(i+1) + 6# ≤ (i+1)^3
. Jadi struktur0//.i_/;i+6#>i^3:>i+1
dimulai dengan a0
dan terus menambahkan1
selama tesi+6#>i^3
puas; lalu(...)-1&
kurangi1
di akhir (daripada menghabiskan byte dengan tanda kurung di dalam ketidaksetaraan).Jika kita membiarkan 12 Hari Natal berlanjut, kita dapat menangani sekitar 65536 hari sebelum batas rekursi
//.
bawaan untuk menghentikan proses ... itu sekitar 4,7 * 10 ^ 13 hari, atau sekitar sepuluh kali usia alam semesta sejauh ini ....sumber
J , 9 byte
Cobalah online!
Ini lebih tidak efisien daripada menggunakan kebalikan faktorial tetapi kebetulan lebih pendek.
Misalnya, jika bilangan bulat input adalah n = 5, buat kisaran
[2, n+1]
.Ini adalah 5 angka tetrahedral pertama. Langkah selanjutnya adalah menentukan interval (hari) n milik. Ada n +1 = 6 interval.
Kemudian n = 5 milik interval 3 yaitu
(4, 10]
dan hasilnya 3.Penjelasan
sumber
Python, 43 byte
Disimpan 5 byte berkat @FlipTack dan 3 lainnya berkat @xnor !
sumber
f(220)=11
, yang seharusnyaf(220)=10
.and-~f(n,i+1)
untukand f(n,i+1)or i
. Anehnya, biasanya lebih pendek ketika Anda menghitung variabel secara rekursif untuk tidak mengembalikannya, tetapi untuk meningkatkan output secara rekursif.Japt , 12 byte
Uji secara online! atau Verifikasi semua kasus uji sekaligus
Bagaimana itu bekerja
Ini adalah penyederhanaan rumus tetrahedral yang digunakan beberapa jawaban lain:
Dengan mengganti
x - 1
untukx
, kita dapat menyederhanakan ini jauh:Oleh karena itu, hasil yang benar adalah satu kurang dari bilangan bulat terkecil
x
sehingga(x^3 - x) / 6
lebih besar atau sama dengan input.Solusi 13-byte, terinspirasi oleh jawaban @ xnor :
Beberapa lebih banyak solusi @ ETHproductions dan saya bermain-main dengan
Uji di sini .
sumber
SmileBASIC, 43 byte
I
adalah hari,R
adalahi
bilangan segitiga th, danP
merupakani
nomor tetrahedral (jumlah hadiah).Saya pikir jawaban yang sama dalam bahasa lain, mungkin:
x=>{while(x>p)p+=r+=++i;return i}
bisa sangat bagus.sumber
?I
pada akhirnya, bukan?Python 3,
4846 bytesumber
221
akan crash itu.Mathematica,
3125 bytesumber
Haskell,
2123 byteSunting: Seperti xnor tunjukkan, solusi asli (
floor.(/0.82).(**0.4)
) tidak berfungsi antara hari-hari Natalsumber
Batch, 69 byte
Secara manual menghitung angka tetrahedronal.
sumber
Pyth 11 byte
Cobalah online!
cukup banyak hanya menerjemahkan jawaban Dennis ke Pyth
sumber
R, 19 karakter
berdasarkan jawaban xnor di
Python
.sumber
QBIC , 19 byte
Ini mencuri rumus @xnor:
Saya mencoba menekan resolusi ke .3336 untuk menghemat satu byte, tetapi gagal di testcase akhir.
sumber
Bash + bc, 44 byte
sumber