Mari berhitung...
Hitung hingga 2 dan kembali ke 1
Hitung hingga 4 dan kembali ke 1
Hitung hingga 6 dan kembali ke 1
... ok Anda mendapatkannya ...
kumpulkan semuanya dan Anda akan mendapatkan urutan berikut
{1,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,2,3...}
Tantangan
Diberikan bilangan bulat n>0
untuk 1-diindeks (atau n>=0
untuk 0-diindeks), output istilah ke-n dari urutan ini
Uji kasus
Input->Output
1->1
68->6
668->20
6667->63
10000->84
Aturan
program Anda harus dapat menghitung solusi hingga n = 10.000 dalam waktu kurang dari satu menit
Ini adalah kode-golf , jadi kode terpendek dalam byte menang!
Jawaban:
JavaScript (ES7),
59 ... 4443 byteDisimpan 1 byte berkat Titus
Input yang diharapkan: 1-diindeks.
Awalnya terinspirasi oleh formula untuk A004738 , yang merupakan urutan yang sama. Tetapi akhirnya saya menulis ulang seluruhnya.
Uji kasus
Tampilkan cuplikan kode
Bagaimana?
Urutan dapat disusun sebagai segitiga, dengan bagian kiri dalam urutan menaik dan bagian kanan dalam urutan menurun.
Di bawah ini adalah 4 baris pertama, berisi 32 istilah pertama:
Sekarang, mari kita perkenalkan beberapa variabel:
Kami mulai dengan 2 elemen di bagian atas dan menambahkan 4 elemen di setiap baris baru. Oleh karena itu, jumlah elemen pada baris 0-diindeks r dapat dinyatakan sebagai:
Posisi awal 1-diindeks x dari baris r diberikan oleh jumlah dari semua istilah sebelumnya dalam seri aritmatika ini ditambah satu, yang mengarah ke:
Secara timbal balik, diberi posisi 1 diindeks n dalam urutan, baris yang sesuai dapat ditemukan dengan:
atau sebagai kode JS:
Setelah kita tahu r (n) , kita kurangi posisi awal x (r) dikurangi satu dari n :
Kita membandingkan n dengan (r) / 2 + 1 = 2r + 2 untuk mengetahui apakah kita berada di bagian naik atau di bagian menurun:
Jika ungkapan ini benar, kami mengembalikan n . Kalau tidak, kita mengembalikan 4 (r + 1) - n . Tetapi karena r sudah bertambah dalam pernyataan terakhir, ini disederhanakan sebagai:
sumber
Haskell , 37 byte
Cobalah online!
Diindeks nol. Buat daftar dan indeks ke dalamnya. Terima kasih kepada Ørjan Johansen karena telah menghemat 2 byte!
Haskell , 38 byte
Cobalah online!
Diindeks nol. Buat daftar dan indeks ke dalamnya.
Haskell , 39 byte
Cobalah online!
Diindeks nol. Metode rekursif.
sumber
Python , 46 byte
Cobalah online!
Nol diindeks.
sumber
Sekam , 8 byte
1-diindeks. Cobalah online!
Penjelasan
sumber
Perl 6 , 29 byte
Cobalah online
Berbasis 0
Diperluas:
Urutan dalam
1...$+=2...2
menghasilkanUntuk menjadikannya berbasis 1, tambahkan
0,
sebelum yang kedua{
, atau tambahkan-1
setelah$_
sumber
R, 64 byte
Fungsi yang mengambil argumen
n
. Ini menciptakan vektor2:n
dengan penambahan 2. Untuk masing-masing, vektor1:(x-1)
danx:2
dibuat. Total ini akan lebih lama darin
. Kitaunlist
itu, untuk mendapatkan vektor dan mengambiln
entri -th.sumber
1:n*2
bukanseq(2,n,2)
? Ini akan lebih besar dari yang Anda butuhkan tetapi itu akan baik-baik saja! Juga saya tidak berpikir ini bekerja denganseq(2,n,2)
untukn=1
anyway!Python 2 , 56 byte
Cobalah online!
Ini diindeks 0.
-1 byte terima kasih kepada @JustinMariner
Bagaimana ini Bekerja?
Kami perhatikan bahwa
n
grup ke -1 terindeks (1, 2, ... 2n ..., 2, 1
) muncul dari elemen bernomor 02(n-1)^2
hingga2n^2
.Untuk menemukan elemen pada indeks
x
, kita dapat menemukan nomor grupn
yangx
ada. Dari itu, kita menghitung jarak dari pusat grup itux
. (Jarak iniabs(2*n**2+2*n+2-x)
).Namun, karena elemen berkurang jauh dari pusat grup, kami mengurangi jarak dari nilai maksimum grup.
sumber
print 2*n-abs(2*n*n+2*n+1-x)+2
-2*n*n+2*n
bisa2*n*-~n
dan+2+2*n
dapat diubah menjadi-~n*2
, yang memungkinkan kita untuk memindahkannya ke awal yang menghemat byte ( 53 byte )05AB1E , 8 byte
Kode:
Menggunakan penyandian 05AB1E . Cobalah online!
Penjelasan:
sumber
€1
aneh ...JavaScript, 39 byte
sumber
Jelly ,
10, 9 byteCobalah online!
Juga 1 diindeks, dan selesai cukup cepat.
Satu byte disimpan berkat @ErikTheOutgolfer!
Penjelasan:
Secara hipotesis, katakanlah input (
a
) adalah 3.sumber
Ḥ€ŒḄ€Ṗ€Fị@
, sehingga Anda dapat menggunakanµ€
untuk -1 (tiga monad atau lebih dengan€
di awal):ḤŒḄṖµ€Fị@
ḤŒḄṖ
<newline>½ĊÇ€Fị@
untuk 12 untuk memenuhi persyaratan 10.000 (menjalankan kode 9 byte secara lokal membutuhkan sekitar 2:20 pada i7 saya dan menggunakan 7GB)MATL , 15 byte
Berbasis 1.
Cobalah online!
Kali ini untuk kasus uji terbesar di TIO, tetapi selesai dalam waktu pada komputer desktop saya (kompiler berjalan pada MATLAB R2017a). Untuk menampilkan waktu yang telah berlalu, tambahkan
Z`
di akhir kode.Penjelasan
Kode menghasilkan lebih banyak istilah daripada yang diperlukan. Secara khusus, itu menghitung
n
"potongan" dari urutan, di mana masing-masing bagian adalah hitungan ke atas dan kembali ke 1.sumber
Sekam ,
1210 byteCobalah online!
1-diindeks, bekerja cukup cepat
Penjelasan
sumber
…
Mathematica, 90 byte
Cobalah online!
sumber
Retina , 62 byte
Cobalah online! Tautan termasuk kasus uji. Input diindeks 1. Tahap pertama hanya konversi desimal ke unary. Tahap kedua menemukan angka kuadrat tertinggi hanya
s
kurang dari setengahnyan
;$1
adalahs²
, sementara$2
ini2s-1
. Ini menghitung dua nilai, pertama jumlah angka dalam run up / down saat ini, yaitu4(s+1) = 4s+4 = 2$2+6
, dan kedua posisi dalam run itu, yaitun-2s² = n-(2$1+1)+1 = n-$&+1
, yang hanya membutuhkan1
make up untuk1
digunakan untuk menegakkan ketimpangan yang ketat. Tahap akhir kemudian dihitung dari posisi itu untuk awal dan akhir lari dan mengambil hasil yang lebih rendah dan mengubahnya menjadi desimal.sumber
Mathematica, 67 byte
Cobalah online!
sumber
Perl 5 , 43 + 1 (-p) = 44 byte
Cobalah online!
Saya sedang mengerjakan rumus untuk menghitung elemen ke-n secara langsung. Lalu saya melihat bahwa @ fireflame241 telah melakukan pekerjaan itu, dan saya memasukkannya ke Perl.
# Perl 5 , 50 + 1 (-n) = 51 byteCobalah online!
Hasil diindeks 0.
sumber
Haskell ,
11581 byteCobalah online!
Ada beberapa keajaiban yang terjadi di sini. Mungkin bisa lebih pendek jika saya menggunakan pendekatan normal.
Penjelasan
Pertama kita mendefinisikan
%
.%
adalah fungsi yang mengambil dua variabelx
, dany
. Itu membangun daftarscanl(+)y[y+1,y+3..]
dan menemukan elemen pertama dari daftar itu lebih besar darix
.scanl(+)
hanya melakukan jumlah berulang, untuk mendapatkan angka segitiga yang akan kita lakukanscanl(+)0[1..]
, untuk mendapatkan angka kuadrat yang akan kita lakukanscanl(+)0[1,3..]
. Dua daftar khususnya yang akan kita buat adalahscanl(+)2[3,5..]
danscanl(+)1[2,4..]
ini adalah titik belok dari pola.Sekarang kita mendefinisikan fungsi utama
g
yang mengambilx
. Jikax
kita kembali1
karena itulah nilai pertama. Kalau tidak, kita periksa dua titik belok berikutnya, jika belok turun lebih besar1%x>2x
kita kembalikan penerusnyag$x-1
kalau tidak kita kembalikan pendahulunyag$x-1
.Ok tapi mengapa itu berhasil?
Pertama-tama "Whats dengan cara kita menemukan simpul?". Penting untuk mencatat jarak antara simpul berurutan dari jenis yang sama. Anda akan melihat bahwa perbedaannya bertambah 2 setiap kali. Ini masuk akal karena basis segitiga menjadi lebih lebar 2 setiap kali. Kita dapat membuat daftar perbedaan konstan menggunakan daftar literal seperti itu
[2,4..]
dan kita gunakanscanl(+)
untuk mengubah daftar ini menjadi daftar simpul kami, berdasarkan lokasi simpul pertama dan perbedaan pertama.Jadi sekarang kita memiliki cara untuk menemukan simpul ke atas dan ke bawah kita dapat menggunakan informasi itu untuk mendapatkan nilai. Kita mengatakan bahwa nilai pertama adalah
1
kalau tidak kita harus mengambil penerus atau pendahulunya. Jika simpul berikutnya adalah yang ke atas kita ingin mengambil pendahulunya, kalau tidak kita mengambil penerus.Haskell ,
565146 byteInilah solusi saya yang lebih baik dengan lebih sedikit matematika dan lebih sedikit byte.
Cobalah online!
sumber
Pyke , 14 byte
Coba di sini!
sumber
C # (.NET Core) , 120 byte
Penjelasan: cukup sederhana, loop bersarang pertama naik ke maks kami, yang kedua naik kembali ke 2. Pengulangan untuk setiap kelipatan 2.
Cobalah online!
sumber
Ruby ,
7875 byteDisimpan 1 byte berkat Langkah Hen
Disimpan 1 byte berkat Tn. Xcoder
Cobalah online!
Semoga saya bisa mendapatkan beberapa tips untuk menarik bytecount lebih banyak. Saya mencoba mengambil pendekatan sederhana.
sumber
c=1 if
dapat bermain golf untukc=1if
->n{a=0;b=2;c=1;n.times{if a==b then c=0;b+=2;end;c=1if a==1;a+=c<1?-1:1};a}
Java (OpenJDK 8) , 53 byte
Cobalah online!
-2 byte terima kasih kepada Nevay.
1-diindeks.
TL; DR Kami membagi urutan menjadi potongan-potongan yang mudah, menemukan potongan
n
dalam, kemudian menemukannth
posisi dalam potongan.Di sini, kita dapat membagi urutan seperti
[[1,2],[1,2,3,4,3,2],[1,2,3,4,5,6,5,4,3,2],...]
, yang memberi kita ukuran potongan4i-2
. Dimulai dengani=2
, kita kurangii
darin
, pada dasarnya bergerak ke atas sepotong pada suatu waktu. Setelah kami puasn<=i
, kami tahun
sekarang posisi nilai yang benar di chunk saat ini.Kami kemudian mendapatkan nilai dengan membandingkan
n
untuki
, ukuran chunk tersebut. Titik tengah setiap potongan sama dengani/2+1
; jikan
kurang dari ini, kami cukup kembalin
. Jikan
lebih besar, kami kembalii-n+2
.Contoh
sumber
+1
,return n>i/2?i-n+2:n
sudah cukup.Python 2 , 5! byte (120 byte: P)
Cobalah online!
Langsung saja, buat daftar lalu ambil elemen input'th
sumber
Python 3 ,
184156 byteCobalah online!
golf dengan generator Python untuk evaluasi "malas"
sumber
QBIC , 47 byte
Penjelasan
sumber
Röda , 54 byte
Cobalah online!
Telepon dengan:
try f(n)
Fungsi ini mengembalikan jawaban dengan cepat, tetapi setelah itu melakukan beberapa perhitungan yang tidak perlu dan akhirnya kehabisan memori.
Karena fungsi mengembalikan jawaban aktual sesaat setelah dipanggil (jelas di bawah satu menit), saya pikir jawaban ini valid.
(Dalam fungsi Röda dapat mengembalikan nilai sebelum keluar karena paralelisme.)
sumber
C # (.NET Core) ,
99 9586 byteCobalah online!
Fungsi Lambda yang mengambil dan mengembalikan integer. Satu loop yang menangani menghitung naik dan turun.
sumber
PHP, 65 +1 byte
Jalankan sebagai pipa dengan
-R
atau coba online (atau batalkan komentar salah satu versi lain).Port JavaScript rekursif tsh membutuhkan waktu 66 byte:
Port solusi Arnauld membutuhkan 62 + 1:
Port golf dari Xanderhall's Java memiliki kode terpendek sejauh ini (55 + 1 byte):
sumber
Pyth ,
1918 byteCoba di sini!
sumber