Latar Belakang
Urutan 1-2-3-Tribonacci
Bayangkan sesaat Anda bisa membuat urutan fibonacci dengan mengganti rumus iterasi standar dengan yang berikut:
Pada dasarnya, alih-alih menjumlahkan dua terakhir untuk mendapatkan yang berikutnya, Anda menjumlahkan tiga terakhir. Ini adalah dasar untuk urutan 1-2-3-Tribonacci.
Kriteria Brown
Kriteria Brown menyatakan bahwa Anda dapat mewakili nilai integer apa pun sebagai jumlah anggota dari suatu urutan asalkan:
Untuk semua yang
n
lebih besar dari 1,
Apa artinya ini untuk tantangan
Anda dapat menggambarkan bilangan bulat positif sebagai jumlah anggota dari urutan 1-2-3-Tribonacci yang dibentuk oleh kondisi awal berikut:
Ini dikenal sebagai, untuk setiap nilai dalam urutan ini, rasio antara istilah tidak pernah lebih besar dari 2 (rasio rata-rata keluar sekitar 1,839).
Cara menulis dalam sistem representasi numerik ini
Katakanlah Anda menggunakan representasi little-endian. Sejajarkan anggota urutan seperti ini:
1 2 3 6 11 20 37 68
Kemudian, Anda mengambil nomor Anda untuk diwakili (untuk pengujian kami, katakan saja itu 63
) dan temukan nilai-nilai yang diberikan 1-2-3-Tribonacci yang berjumlah 63 (menggunakan nilai terbesar pertama!) . Jika nomor tersebut merupakan bagian dari jumlah, tulis 1 di bawahnya, 0 jika tidak.
1 2 3 6 11 20 37 68
0 0 0 1 0 1 1 0
Anda dapat melakukan ini untuk bilangan bulat apa pun yang diberikan - cukup verifikasi bahwa Anda menggunakan nilai terbesar di bawah input yang Anda berikan terlebih dahulu!
Definisi (akhirnya)
Tulis program atau fungsi yang akan melakukan hal berikut ini dengan beberapa input bilangan bulat positif n
(ditulis dalam basis standar apa pun) antara 1 dan nilai maksimum bahasa Anda:
- Ubah nilainya menjadi representasi numerik 1-2-3-Tribonacci yang ditentukan.
- Menggunakan representasi seperti biner ini, dan membacanya seolah-olah biner. Ini berarti bahwa digitnya tetap sama, tetapi yang mereka maksud berubah.
- Ambil nomor biner ini dan ubah menjadi basis nomor asli.
- Keluarkan atau kembalikan nomor baru ini.
Namun, selama outputnya valid, Anda tidak perlu mengikuti langkah-langkah ini. Jika Anda secara ajaib menemukan beberapa rumus yang lebih pendek (dan secara matematis setara), silakan menggunakannya.
Contohnya
Biarkan fungsi f
menjadi fungsi yang dijelaskan oleh definisi, dan biarkan []
mewakili langkah-langkah yang diambil (sebagai little-endian, meskipun seharusnya tidak masalah) (Anda tidak perlu mengikuti proses ini, ini hanya proses yang dijelaskan):
>>> f(1)
[1]
[1]
[1]
1
>>> f(5)
[5]
[0, 1, 1]
[6]
6
>>> f(63)
[63]
[0, 0, 0, 1, 0, 1, 1]
[104]
104
sumber
Jawaban:
Javascript
117111 byteTerima kasih kepada @theonlygusti karena membantu bermain golf 5 byte
Bagaimana itu bekerja
Pertama, fungsi ini menghasilkan semua angka tribarbon sampai menemukan yang lebih besar dari input
Selanjutnya, itu membalikkan pencarian daftar angka. Jika angka kurang dari input, itu menambah 2 ^ (indeks nomor itu) ke nilai kembali dan mengurangi input dengan angka itu.
Akhirnya mengembalikan hasilnya.
Cobalah secara Online
sumber
a[++i]<x
di dalam untuk kondisi untuk menyimpan byte?x>0
denganx
. Simpan 2 byte lagi.Python 2 ,
110102 byte-3 byte terima kasih kepada Rod (trik rapi untuk casting boolean
i
ke int dengan+i
begitu repr`+i`
bekerja)Cobalah online!
sumber
'01'[i]
dengan`+i`
i
adalah boolean bukan int. Sunting - Ohhh+i
, rapi.JavaScript (ES6),
9793 byteDi sini, kami menggunakan
reduce()
fungsi rekursif. Kami berasumsi bahwa outputnya adalah 31-bit (yang merupakan jumlah unsigned terbesar yang dapat dengan mudah digunakan JS untuk operasi bitwise).Dari segi kinerja, ini jelas tidak terlalu efisien.
Untuk yang penasaran:
F()
untukreduce()
iterasi N + 1 vs iterasi N dengan cepat konvergen menuju Tribon Constant (≈ 1,83929). Oleh karena itu, setiap bit tambahan dalam biaya output kira-kira dua kali lebih banyak dari waktu sebelumnya.F()
fungsinya disebut baik 124 juta kali.Uji
NB: Ini mungkin membutuhkan waktu 1 atau 2 detik untuk selesai.
Tampilkan cuplikan kode
sumber
Mathematica,
7874 byteLinearRecurrence[{1,1,1},{1,2,3},#]
menghasilkan daftar, dengan panjang yang sama dengan input, dari angka tribal 1-2-3. (Yang{1,1,1}
mewakili jumlah dari tiga istilah sebelumnya, sementara{1,2,3}
adalah nilai awal.) Lalu#~NumberDecompose~
menemukan cara paling serakah untuk menulis input sebagai jumlah elemen dari daftar (ini adalah fungsi yang sama yang akan menguraikan jumlah uang menjadi beberapa kelipatan dari mata uang yang tersedia, misalnya). Akhirnya,Fold[#+##&,...]
ubah daftar biner yang dihasilkan menjadi integer (basis-10).Pengajuan sebelumnya:
Seperti yang sering terjadi (meskipun tidak di atas), versi golf ini sangat lambat pada input yang lebih besar dari 20 atau lebih, karena menghasilkan (dengan rekursi yang tidak dioptimalkan) daftar suku yang panjangnya adalah input; mengganti final
#
dengan ikatan yang lebih masuk akal sepertiRound[2Log@#+1]
menghasilkan kinerja yang jauh lebih baik.sumber
123Tribonacci[]
builtin?Haskell, 95 byte
Contoh penggunaan:
f 63
->104
.Cobalah online! .Cara kerjanya:
!
membangun urutan 1-2-3-Tribonacci. Diberikan1
,2
dan3
sebagai parameter awal, kami mengambiln
elemen pertama dari urutan. Kemudian kita lipat dari fungsi#
yang tepat yang mengurangi elemen berikutnyae
darin
dan menetapkan bit dalam nilai kembalir
jikae
diperlukan atau membiarkan bit tidak disetel. Mengatur bit adalah menggandakanr
dan menambahkan1
, membiarkannya tidak disetel hanya menggandakan.sumber
Jelly , 31 byte
Cobalah online!
Saya hampir yakin ada cara yang jauh lebih pendek untuk mencapai ini di Jelly.
Bagaimana?
sumber
Perl 6 ,
9391 byte-2 byte berkat b2gills
Bagaimana itu bekerja
Pertama, ini menghasilkan urutan 1-2-3-Tribonacci hingga elemen pertama yang lebih besar dari input:
Berdasarkan itu ia menemukan subset dari urutan yang menambahkan hingga input:
Berdasarkan itu ia membangun daftar boolean yang menentukan apakah setiap elemen dari urutan adalah bagian dari jumlah:
Dan akhirnya menafsirkan daftar nilai True = 1, False = 0 sebagai basis 2 dan mengembalikannya sebagai nomor (basis 10):
sumber
*>$^n
dan.sum==$n
. Juga ruang tidak diperlukan antaramy
dan@f
JavaScript (ES6),
6160 byteHitung angka 1-2-3-Tribonacci sampai mencapai angka asli, kemudian saat rekursi tersebut menghilang, cobalah untuk mengurangi masing-masing secara bergantian, menggandakan hasilnya saat berjalan.
Sunting: Disimpan 1 byte berkat @Arnauld.
sumber
n=>(g=(x,y,z)=>(n>x&&g(y,z,x+y+z)*2)+!(n<x||![n-=x]))(1,2,3)
menyimpan satu byte?n<x||
tapi itu![]
hanya jenius.Batch,
151148145 bytePort jawaban JavaScript saya. Sunting: Disimpan 3 byte dengan meneruskan argumen subrutin saya dalam urutan terbalik dan 3 byte lainnya dengan menggunakan masing-masing
@
s pada setiap baris alih-alih@echo off
.sumber
Jelly ,
191817 byteCobalah online!
Latar Belakang
Alih-alih mencoba mengubah bilangan bulat menjadi 1,2,3-Basis Tribonacci, lalu dari biner ke bilangan bulat, kami akan melakukan yang sebaliknya: konversi bilangan bulat menjadi biner, lalu dari 1,2,3-Basis Trigram ke bilangan bulat, dan kembali yang tertinggi yang cocok dengan input. Ini mudah dicapai.
Kami akan mencontohkan proses input 63 , khususnya langkah di mana 104 diuji. Dalam biner, dari digit paling signifikan ke paling signifikan, 104 sama dengan
di mana baris kedua mewakili nilai posisi digit tersebut.
Kita dapat memperluas deret 1,2,3-Tribonacci ke kanan, mengamati bahwa digit yang ditambahkan sesuai dengan rumus rekursif yang sama. Untuk tiga digit, ini memberi
Sekarang, untuk menghitung nilai angka dasar 1,2,3-Tribonacci, kita dapat menggunakan rumus rekursif. Karena setiap angka adalah jumlah dari tiga angka di sebelah kanannya (dalam tabel di atas), kita dapat menghapus digit pertama dan menambahkan ini ke tiga digit pertama dari array yang tersisa. Setelah 7 langkah, yang sama dengan jumlah digit biner 104 , kami jarang pergi dengan hanya tiga digit.
Sekarang, karena digit pertama dan terakhir yang tersisa keduanya memiliki nilai posisi 0 , hasilnya adalah digit tengah, yaitu 63 .
Bagaimana itu bekerja
sumber
Jelly ( garpu ),
1716 byteDisimpan 1 byte berkat @ Dennis yang bermain golf tanpa menjalankannya.
Ini bergantung pada garpu Jelly di mana saya mengecewakan masih bekerja pada implementasi atom pemecahan Frobenius yang efisien. Bagi mereka yang tertarik, saya ingin mencocokkan kecepatan Mathematica
FrobeniusSolve
dan untungnya ada penjelasan tentang metode mereka dalam makalah "Membuat Perubahan dan Menemukan Repfigits: Menyeimbangkan Ransel" oleh Daniel Lichtblau.Penjelasan
sumber
ḣ3S;µ¡¶3RṚdzæFṪḄ
bekerja Saya tidak memasang garpu Anda, jadi saya tidak bisa menguji.³
referensi argumen pertama.jelly.py
punya beberapa hal lain di dalamnya setelah komit terakhir.dc ,
110102 byteYah, sepertinya pikiran hebat memang berpikir sama. Ternyata, algoritma yang saya buat untuk mengatasi keterbatasan
dc
ini adalah kebetulan yang sama persis yang digunakan dalam jawaban @ LliwTelrac. Menarik.Cobalah online!
sumber
Python 2 , 93 byte
Ini adalah pelabuhan jawaban Jelly saya .
Cobalah online!
sumber
bash + BSD Utilities (OS X, dll.), 53 byte
bash + Utilitas GNU (berfungsi di bawah BSD juga), 59 byte
Input dan output di kedua di atas adalah dalam biner.
Cobalah versi GNU di TIO. (Contoh terkait dengan menunjukkan input 111111, yang 63 dalam biner, dan output 1101000, yang 104 dalam biner.)
Saya rasa TIO tidak menawarkan opsi BSD, tetapi jika Anda memiliki Mac, Anda dapat mencobanya di luar. (Program 59-byte jauh lebih cepat daripada program 53-byte.)
Sayangnya,
seq
tidak bisa begitu saja dimasukkan ke dalam solusi BSDjot
, karena format output untukseq
berbeda untuk output di atas 999999. (Ini mulai menjadi masalah untuk input sekitar 32, karena 32 ^ 4> 1000000.)Anda dapat mengganti di
jot
atas denganseq -f%.f
agar ini berfungsi dengan utilitas GNU, tetapi untuk 59 byte yang sama, Anda dapat menggunakan solusi GNU di atas, yang jauh lebih cepat.sumber