Mari kita gunakan empat operasi dasar, penambahan +
, perkalian *
, pengurangan -
dan pembagian /
(float, not integer).
Urutan Stewie didefinisikan sebagai berikut:
x = [x(1), x(2)] // Two initial numbers (one indexed)
x(3) = x(1) + x(2)
x(4) = x(2) * x(3)
x(5) = x(3) - x(4)
x(6) = x(4) / x(5)
x(7) = x(5) + x(6)
... and so on.
Tantangan:
Ambil dua bilangan bulat non-negatif ( x(1), x(2)
), dan satu bilangan bulat positif N
sebagai input.
x(1)
dan x(2)
akan menjadi dua angka pertama dari urutan Anda, dan N
akan menjadi panjang urutan yang harus Anda keluarkan. (Anda dapat memilih untuk memiliki daftar berbasis 0, dalam hal ini N
akan menjadi kurang dari panjang daftar).
- Anda tidak dapat menganggap itu
x(2) >= x(1)
. N
akan selalu menjadi>2
jika berbasis 1, (>1
jika berbasis 0).- Anda tidak harus menangani pembagian dengan kesalahan nol.
- Catat test case ke-2. Anda tidak akan mendapatkan
0, 1
, danN=6
sebagai masukan, karena itu akan menghasilkan pembagian dengan nol, tetapi Anda harus mendukung0, 1
danN=5
.
- Catat test case ke-2. Anda tidak akan mendapatkan
- Asumsikan hanya input yang valid yang akan diberikan.
- Input dan output dapat dalam format apa pun yang nyaman, tetapi Anda harus mendukung setidaknya 3 digit setelah titik desimal jika outputnya bukan bilangan bulat.
Kasus uji:
1 3
8
1, 3, 4, 12, -8, -1.5, -9.5, 14.25
0 1
5
0, 1, 1, 1, 0 // N=6 would give division by zero error. You don't need to handle that case.
1 0
9
1, 0, 1, 0, 1, 0, 1, 0, 1
6 3
25
6, 3, 9, 27, -18, -1.5, -19.5, 29.25, -48.75, -0.6, -49.35, 29.61, -78.96, -0.375, -79.335, 29.7506, -109.086, -0.272727, -109.358, 29.825, -139.183, -0.214286, -139.398, 29.8709, -169.269
N
berbasis 0? Jadi, ambil input 1 kurang dari N yang ditunjukkan dalam contoh Anda. Saya kira mengambil N-2 terlalu banyak untuk meminta ... :-PJawaban:
MATL ,
191817 byteInput dalam format:
N
(berbasis 0)x(1)
,,x(2)
(sebagai string); semua dipisahkan oleh baris baru.Cobalah online! Atau verifikasi semua kasus uji (kode yang sedikit dimodifikasi; urutan keluaran dipisahkan oleh baris kosong).
Penjelasan
MATL tidak memiliki
eval
fungsi yang tepat , tetapiU
(str2num
) dapat mengevaluasi ekspresi numerik dengan operator infiks.Setiap istilah baru dihitung dan didorong ke tumpukan, menjaga ketentuan sebelumnya. Seluruh tumpukan dicetak di bagian akhir.
sumber
Haskell,
696864 bytex1
danx2
diambil sebagai daftar. Contoh penggunaan:[1,3] # 8
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Kemalasan memungkinkan untuk mendefinisikan daftar rekursif yang tak terbatas di mana kita mengambil elemen n pertama.
Haskell, 66 byte
Pendekatan berbeda, sedikit lebih lama. Agar argumen adalah
N
,x2
,x1
. Contoh penggunaan:( (.a).(.).take ) 8 3 1
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Mendefinisikan 4 fungsi
a
,b
,c
dand
yang mengambil dua argumeny
,x
dan membuat daftar dengan menempatkanx
di depan sebuah panggilan ke fungsi berikutnya dengany
sebagai argumen kedua danx op y
sebagai yang pertama. Sebagai contoha
adalah:a y x = x : (b (x+y) y)
,b
apakah perkalian:b y x = x : (c (x*y) y)
, dllSunting: @Michael Klein menyimpan byte dalam varian pertama (
#
). Untungnya saya juga menemukan satu byte untuk varian kedua, sehingga keduanya memiliki panjang yang sama lagi.Sunting II: @Zgarb menemukan 2 byte di versi kedua untuk disimpan, dan I 4 di pertama, sehingga tidak lagi sama panjangnya.
sumber
(.)
disusun dengan fungsi lain: pg x=(`take`f)where
tidak menyimpan byte: - /(h%g)y x=x:g(h x y)y
ES6 (Javascript),
79,67, 65 byteMEMPERBARUI
Golf
Uji
sumber
++i
untuk menghindari harus menambahkan 1 hinggai
dua kali??S(n,a,i+1,a.push(...)):a
mungkin menghemat beberapa byte.a.push
mengembalikan panjang baru,S=(n,a,i=2)=>i<n?S(n,a,a.push(...)):a
i=2
meskipun.S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"+*-/"[i%4]+a[i-1]))):a
untuk menghemat 2 byte.Python 3,
908074 bytexnor mungkin akan datang dan menghancurkan solusi ini ...
Fungsi memodifikasi daftar yang diteruskan ke sana. Gunakan seperti ini:
Coba di repl.it!
-6 byte berkat Tembaga
sumber
O
sekali, Anda dapat menyimpan beberapa byte dengan melakukan'-/+*'[i%4]
dan menghapus deklarasiO
. Juga, Anda mungkin dapat mengatasi panggilan berulangstr
dengan melakukan sesuatu sepertieval('%s'*3%(s[-2],'-/+*'[i%4],s[-1]))
.s+=[...]
bisa diganti dengans+=...,
(perhatikan tanda koma).i
input, jadi Anda tidak perlu nilai default untuk itu (i=2
bisa adili
). Off byte.n
item ke-3 sebagai berurutan, ini adalah 1 byte lebih pendek dengan rekursi:f=lambda x,n:n<2and x[n-1]or eval('%s'*3%(f(x,n-2),'*-/+'[n%4],f(x,n-1)))
Perl 6 ,
75 7161 byteMenguji
Menguji
Menguji
Diperluas:
sumber
Mathematica, 68 byte
Nyaris menyelinap ke posisi ke-3! Fungsi tiga argumen yang tidak disebutkan namanya, yang menggunakan operator unary helper
±
sedemikian rupa sehingga±n
persis elemen ke-n x (n) dari urutan Stewie. Dua argumen pertama adalah x (1) dan x (2), dan argumen ketiga adalah N yang menunjukkan x (N) yang kita hasilkan.Implementasi langsung, menggunakan perhitungan mod-4 untuk memilih fungsi biner mana yang akan diterapkan pada dua istilah sebelumnya. Memilih fungsi biner yang benar, yang
1##[#-#2,#/#2,+##]
membantu, menggunakan beberapa trik golf Mathematica yang menyenangkan ini .sumber
05AB1E ,
211918 byteInput diambil dalam urutan N (berbasis-0), x (2) , x (1) .
Disimpan 1 byte berkat carusocomputing .
Cobalah online!
Penjelasan
Kami membangun tumpukan berulang dengan elemen terbaru dalam urutan di atas, sambil menjaga semua elemen sebelumnya dalam urutan.
Kemudian kami membungkus tumpukan dalam daftar di bagian akhir untuk menampilkan semua nilai sekaligus.
sumber
XY
danUV
mungkin menghemat byte.UX
:)Common Lisp, 158
Tidak benar-benar kompetitif, tetapi saya suka bagaimana ini diungkapkan secara alami:
Kami mengabaikan kesalahan saat menghitung R, yang membuat R (dan kemudian B) mungkin mengambil nilai NIL. Itu memungkinkan untuk menampilkan hasil saat ini bahkan jika nilai berikutnya tidak ditentukan. Kemudian, pada akhirnya loop akan gagal, tetapi itu ada dalam aturan.
Tes
Kami memberi nama fungsi
F
dan memverifikasi bahwa nilai yang diharapkan kira-kira sama dengan yang diuji.Alasan untuk pengujian perkiraan adalah karena nilai yang dihitung sedikit lebih tepat dari yang dibutuhkan; di sini, untuk
(f 6 3 25)
:sumber
dc,
112110108 byteTerkadang
dc
jawaban bisa sangat panjang, dan kadang-kadang bisa sangat pendek. Itu semua hanya tergantung pada tantangan yang dihadapi seperti halnya dengan banyak bahasa lainnya. Bagaimanapun, ini meminta input baris perintah yang diindeks satu ruang yang dipisahkan dari 3 bilangan bulat,,x(1), x(2), N
pada saat doa, dan mengeluarkan setiap elemen dari urutan pada baris yang terpisah dengan output non-bilangan bulat yang mengandung 5 digit setelah titik desimal.Misalnya, input
6 3 25
menghasilkan output berikut:sumber
Perl, 62 + 3 (
-pla
bendera) = 65 byteMenggunakan:
sumber
Ruby, 79 byte
Saya menduga ini sangat jauh dari optimal (dan saya belum melihat jawaban yang lain), tetapi tetap menyenangkan.
Saya ingin bersenang-senang dengan
Enumerable#cycle
, tapi sayangnya, ini hanya 4 karakter yang lebih sedikit untuk digunakan%4
.sumber
C ++ 14, 118 byte
Sebagai lambda tanpa nama memodifikasi inputnya. Harus
v
menjadivector<double>
atauvector<float>
.Tidak digabungkan dan digunakan:
sumber
kode mesin x86-64, 34 byte
Konvensi Memanggil = x86-64 Sistem V x32 ABI (register args dengan pointer 32-bit dalam mode panjang).
Tanda tangan fungsi adalah
void stewie_x87_1reg(float *seq_buf, unsigned Nterms);
. Fungsi menerima nilai-nilai seed x0 dan x1 dalam dua elemen pertama array, dan memperluas urutan ke setidaknya N elemen lebih banyak. Buffer harus diisi hingga 2 + N-dibulatkan ke atas-ke-kelipatan-4. (Yaitu2 + ((N+3)&~3)
, atau hanya N + 5).Membutuhkan buffer berlapis adalah normal dalam perakitan untuk kinerja tinggi atau fungsi vektor-SIMD, dan loop terbuka ini serupa, jadi saya tidak berpikir itu menekuk aturan terlalu jauh. Penelepon dapat dengan mudah (dan harus) mengabaikan semua elemen padding.
Melewati x0 dan x1 sebagai fungsi arg yang belum ada di buffer akan menghabiskan biaya hanya 3 byte (untuk a
movlps [rdi], xmm0
ataumovups [rdi], xmm0
), meskipun ini akan menjadi konvensi panggilan non-standar karena Sistem V melewatistruct{ float x,y; };
dua register XMM yang terpisah.Ini adalah
objdump -drw -Mintel
output dengan sedikit pemformatan untuk menambahkan komentarImplementasi referensi C ini mengkompilasi (dengan
gcc -Os
) ke kode yang agak mirip. gcc memilih strategi yang sama dengan yang saya lakukan, yaitu hanya menyimpan satu nilai sebelumnya dalam register.Saya melakukan percobaan dengan cara lain, termasuk versi x87 dua register yang memiliki kode seperti:
Anda akan melakukannya dengan cara ini jika Anda ingin kecepatan (dan SSE tidak tersedia)
Menempatkan beban dari memori di dalam loop alih-alih sekali pada entri mungkin bisa membantu, karena kita bisa saja menyimpan hasil sub dan div rusak, tetapi masih membutuhkan dua instruksi FLD untuk mengatur stack pada entri.
Saya juga mencoba menggunakan skalar matematika SSE / AVX (dimulai dengan nilai dalam xmm0 dan xmm1), tetapi ukuran instruksi yang lebih besar adalah pembunuh. Menggunakan
addps
(karena itu 1B lebih pendek dariaddss
) membantu sedikit. Saya menggunakan AVX VEX-awalan untuk instruksi non-komutatif, karena VSUBSS hanya satu byte lebih panjang dari SUBPS (dan panjang yang sama dengan SUBSS).Diuji dengan test-harness ini:
Kompilasi dengan
nasm -felfx32 -Worphan-labels -gdwarf2 golf-stewie-sequence.asm &&
gcc -mx32 -o stewie -Og -g golf-stewie-sequence.c golf-stewie-sequence.o
Jalankan test-case pertama dengan
./stewie 8 1 3
Jika Anda tidak menginstal pustaka x32, gunakan
nasm -felf64
dan biarkan gcc menggunakan default-m64
. Saya menggunakanmalloc
alih-alihfloat seqbuf[seqlen+8]
(pada stack) untuk mendapatkan alamat rendah tanpa harus benar-benar membangun sebagai x32.Fakta menyenangkan: YASM memiliki bug: ia menggunakan rel32 jcc untuk cabang loop, ketika target cabang memiliki alamat yang sama dengan simbol global.
berkumpul untuk ...
11f: 0f 8f db ff ff ff jg 100 <stewie_x87_1reg>
sumber
05AB1E , 12 byte
Cobalah online!
sumber
Japt , 20 byte
Cobalah
sumber
Bash, 224 byte (TANPA KONTES)
Implementasi yang sangat besar di BASH .
Mengambil tugas secara harfiah, dan melakukan segalanya dalam satu pipa kontinu, tanpa struktur aliran kontrol atau rekursi yang tidak suci.
Memasukkan
Golf
Kurang Golf
Uji
Tahapan Pipa
Hasilkan tabel indeks elemen + op, untuk setiap elemen urutan output (satu per baris):
Gunakan sed untuk mengonversikan ini menjadi program linear bc :
beri makan ini ke bc dan biarkan ia melakukan semua pekerjaan
sumber
Pyth - 20 byte
Mengeluarkan semua
n
biaya saya.Tidak bekerja secara online karena eval.
sumber
Ceylon, 195 byte
Diformat dan dikomentari:
Contoh penggunaan:
Contoh output:
Contoh kedua menunjukkan bagaimana ini akan menangani pembagian dengan nol. Contoh terakhir menunjukkan bahwa hasil sedikit menyimpang tergantung pada jenis aritmatika (dan pembulatan) yang digunakan ... Saya pikir aritmatika floating point Ceylon 64 bit sedikit lebih dekat dengan apa yang seharusnya daripada apa yang diposting dalam pertanyaan. .
sumber
Clojure, 99 byte
Versi ini lebih baik untuk digunakan dalam praktik tetapi memiliki 110 byte:
Saya mengalami kesulitan mengacaukan fungsi yang berulang dan urutan operasi yang berulang sehingga saya harus menggunakan penghitung. Juga mencoba menggunakan tabel transisi FSM seperti
{+ * * - - / / +}
tetapi saya tidak bisa memerasnya ke kode yang lebih sedikit.Dapat diekspresikan sebagai fungsi anonim
Tidak golf:
Harus dipanggil dengan pelampung seperti
(f 6.0 3.0 25)
jika Anda mendapatkan nomor rasional keluar. Atau, iterasi dapat dimulai dari[a (float b) 0]
yang membawa beberapa karakter tambahan.sumber
Oktaf , 91 byte
Cobalah online!
Beberapa golf:
eval
panggilan pertamaeval
panggilan pertama*-/+
(tidak dimungkinkan dalam MATLAB)'
dan"
untuk menghindari lolosnya tanda kutip (tidak mungkin di MATLAB)n=@num2str
karena digunakan dua kali (tidak mungkin di MATLAB)sumber