Pendahuluan (dapat diabaikan)
Menempatkan semua bilangan bulat positif dalam urutan regulernya (1, 2, 3, ...) agak membosankan, bukan? Jadi di sini adalah serangkaian tantangan seputar permutasi (perombakan) dari semua bilangan bulat positif. Ini adalah tantangan keenam dalam seri ini (tautan ke tantangan pertama , kedua , ketiga , keempat dan kelima ).
Tantangan ini memiliki tema Paskah yang ringan (karena ini Paskah). Saya mengambil inspirasi dari telur angsa yang sangat dihiasi ini (dan menurut saya agak jelek).
Itu mengingatkan saya pada spiral Ulam , di mana semua bilangan bulat positif ditempatkan dalam spiral berlawanan arah jarum jam. Spiral ini memiliki beberapa fitur menarik yang terkait dengan bilangan prima, tetapi itu tidak relevan untuk tantangan ini.
Kita sampai pada permutasi tantangan ini dari bilangan bulat positif jika kita mengambil angka dalam spiral Ulam dan melacak semua bilangan bulat dalam spiral putaran searah jarum jam , mulai dari 1. Dengan cara ini, kita mendapatkan:
1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.
Jika Anda akan menggambar kedua spiral, Anda akan mendapatkan semacam jaring spiral (kulit telur) tak terbatas ( perhatikan referensi Orde Baru di sana ).
Urutan ini hadir dalam OEIS dengan nomor A090861 . Karena ini adalah tantangan "urutan murni", tugasnya adalah mengeluarkan untuk diberikan sebagai input, di mana adalah A090861 .
Tugas
Diberikan input integer , output dalam format integer, di mana adalah A090861 .
Catatan: pengindeksan berbasis 1 diasumsikan di sini; Anda dapat menggunakan pengindeksan berbasis 0, jadi , dll. Sebutkan ini dalam jawaban Anda jika Anda memilih untuk menggunakan ini.
Uji kasus
Input | Output
---------------
1 | 1
5 | 3
20 | 10
50 | 72
78 | 76
123 | 155
1234 | 1324
3000 | 2996
9999 | 9903
29890 | 29796
Aturan
- Input dan output adalah bilangan bulat.
- Program Anda setidaknya harus mendukung input dalam kisaran 1 hingga 32767).
- Input yang tidak valid (0, float, string, nilai negatif, dll.) Dapat mengakibatkan output yang tidak terduga, kesalahan atau (tidak) perilaku yang didefinisikan.
- Standar I / O aturan berlaku.
- Celah default dilarang.
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang
JavaScript (ES7),
46 4541 byteDiindeks 0.
Cobalah online!
Bagaimana?
Ini didasarkan pada rumus 1-diindeks yang digunakan dalam program contoh A090861 .
Cobalah online!
Cobalah online!
Cobalah online!
Yang dapat diterjemahkan ke dalam:
Membuatnya 0-diindeks menghemat 5 byte segera:
Rumus ini dapat lebih disederhanakan dengan menggunakan:
yang dapat dinyatakan sebagai:
mengarah ke:
dan akhirnya:
sumber
Bahasa Wolfram (Mathematica) , 60 byte
Cobalah online!
sumber
MATL ,
1211 byteCobalah online!
Sangat tidak efisien memori. Prepending
X^k
membuatnya lebih efisien .sumber
C # (Visual C # Interactive Compiler) , 67 byte
Cobalah online!
sumber
Python 3.8,
10474656057 byteSunting: Terima kasih kepada Johnathan Allan untuk memperolehnya dari 74 hingga 57 byte!
Solusi ini menggunakan pengindeksan berbasis 0.
sumber
>
di tempat<=
danx*x
di tempatx**2
... seperti:def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n
... TIOPython 3.8 (pra-rilis) , 53 byte
Port langsung dari jawaban JavaScript Arnauld , pilih itu, dan / atau jawaban Mathematica J42161217 , dan / atau jawaban Python Kapocsi :)
Diindeks 0.
Cobalah online!
sumber
Befunge,
6757 byteSolusi ini mengasumsikan pengindeksan berbasis 0 untuk nilai input.
Cobalah online!
Penjelasan
Kita mulai dengan menghitung "radius" di mana input n ditemukan dengan loop:
Pada akhir loop, nilai n sebelumnya adalah offset ke spiral pada radius itu:
Kita kemudian dapat menentukan apakah kita berada di bagian atas atau bawah spiral sebagai berikut:
Dan begitu kita memiliki semua detail ini, nilai spiral dihitung dengan:
Jari-jari adalah satu-satunya nilai yang kita perlu simpan sebagai "variabel", membatasi nilai maksimum 127 di Befunge-93, sehingga algoritma ini dapat menangani input hingga 65024.
sumber
Japt , 15 byte
Solusi Port of Jonathan's Jelly. 1-diindeks.
Cobalah
sumber
x+(1-x%2)
inix|1
(menyimpan byte di Jelly), yang jawaban ini juga bisa mendapatkan keuntungan dari, saya bertaruh.C ++ (gcc) , 88 byte
1-diindeks; menggunakan rumus pada halaman OEIS, tetapi dimanipulasi untuk menyimpan beberapa byte.
Cobalah online!
sumber
sqrt(n-1)/2+.5
alih-alih(sqrt(n-1)+1)/2