pengantar
Metode middle-square digunakan untuk menghasilkan angka pseudorandom. Namun, ini bukan metode yang baik dalam praktik, karena periode ini biasanya sangat singkat dan memiliki beberapa kelemahan parah. Bagaimana cara kerjanya? Mari kita ambil contoh:
Untuk benih, kami memilih 123456
:
Seed 123456
Benih kuadrat (biji × biji), sama dengan:
Seed² 15241383936
Kami mulai dengan angka 6 digit . Itu berarti bahwa benih kuadrat harus memberikan angka 12 digit . Jika ini bukan masalahnya, nol terkemuka ditambahkan untuk mengkompensasi:
Seed² 015241383936
Kami kemudian mengambil bagian tengah dari nomor tersebut, dengan ukuran yang sama dengan biji:
Seed² 015241383936
^^^^^^
Ini kemudian kami benih baru : 241383
. Kami ulangi proses yang sama seperti yang ditunjukkan di atas. Kami mendapatkan yang berikut ini:
0: 123456
015241383936
| |
1: 241383
058265752689
| |
2: 265752
070624125504
| |
3: 624125
389532015625
| |
4: 532015
283039960225
| |
5: 039960
001596801600
| |
6: 596801
Dan ini terus berlanjut untuk sementara waktu ... Sekarang kita tahu apa metode kuadrat-tengah, mari kita hadapi tantangan:
Tugas
Setiap benih memiliki sebuah periode . Periode n- digit benih tidak boleh lebih dari 8 n . Misalnya, benih 82
. Ini akan memberikan urutan berikut:
82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0 1 2 3 4 5 6 7 8 9
Anda dapat melihat bahwa periodenya sama dengan 5 , sebelum mengandung digit yang sama lagi. Tugas Anda adalah, ketika diberi benih yang lebih besar dari 0 yang tidak mengandung nol terkemuka, hasilkan periode benih . Jadi, dalam hal ini, Anda perlu output 5
.
Contoh lain adalah 24
:, yang memberikan yang berikut:
24 > 57 > 24
|____|____|___...
0 1 2
Seperti yang Anda lihat, tidak semua urutan diakhiri 0
. Siklus ini memiliki periode 1 .
Uji kasus
Input > Output
24 > 1
82 > 5
123456 > 146
8989 > 68
789987 > 226
Pastebins dengan urutan untuk 123456 , 8989 , 789987
Ini adalah kode-golf , jadi pengiriman dengan jumlah byte paling sedikit menang!
Anda dapat mengasumsikan bahwa input tidak akan pernah memiliki jumlah digit yang tidak rata.
24
periodik (dengan periode 2, aku akan mengatakan),82
adalah akhirnya periodik (dengan periode 1).Jawaban:
Jelly,
262418 byteCobalah online!
Bagaimana itu bekerja
sumber
Bash murni,
162 131 116 113107Disimpan 3 byte dengan menggunakan
$c
...Terima kasih @Dennis untuk membantu saya menghemat 6 byte lebih.
---- begin middleSquare ----
---- end middleSquare ----
Bentuk kotak, 131
---- begin middleSquare ----
---- end middleSquare ----
Tua tapi dengan output mewah, 162
---- begin middleSquare ----
---- end middleSquare ----
sumber
JavaScript (ES7), 82 byte
Menerima input dalam bentuk string, misalnya "82", dan mengembalikan bilangan bulat. Teknik rekursif ekor sederhana untuk memeriksa setiap benih secara bergantian terhadap hash biji yang telah terlihat. Saya menambahkan 100 ** l ke kotak untuk memastikan panjang yang konsisten.
sumber
Python
32,13911497 byteTerima kasih kepada Seeq untuk bermain golf 25 byte dan terima kasih kepada Dennis untuk bermain golf 17 byte! Kode:
Pasti bisa bermain golf lebih lanjut. Ini juga kode yang digunakan untuk membuat kasus uji: P.
sumber
Pyth, 21 byte
Cobalah online: Demonstrasi atau Test Suite
sunting: Ditemukan kasing tepi
1000
, yang tidak berfungsi dengan kode saya sebelumnya. Memperbaikinya selama 1 byte.Penjelasan:
sumber
sz
bukanQ
?Q
, saya harus mengganti semualz
denganl`Q
s.input
. Saya kira itu benar-benar dimaksudkan untuk memungkinkan membaca stdin kedua ..?.z
dan.Q
, meskipun mereka membaca beberapa baris input dan menyimpannya dalam daftar. Tapi saya belum pernah melihat seseorang menggunakan fitur ini. Ini hanya 1 byte untuk mengevaluasi string atau untuk merangkai angka.Qz.Q.z
?MATL , 33
3540byteCobalah online!
sumber
Oracle SQL 11.2, 184 byte
Tidak bermain golf
Ini menggunakan deteksi siklus build untuk menghentikan rekursivitas.
sumber
Julia, 64 byte
Cobalah dengan Coding Ground .
sumber
Mathematica, 80 byte
sumber
CJam, 37 byte
Mengalami masalah tumpukan-urutan yang menyebalkan yang saya tidak bisa segera lihat bagaimana mengatasinya. Ini juga sangat lambat.
Cara kerjanya: Setiap iterasi mendorong nilai baru di atas tumpukan, lalu kami membungkus tumpukan ke dalam array, dan melihat apakah itu sama dengan penyatuannya dengan dirinya sendiri (untuk melihat apakah ia memiliki elemen duplikat). Ketika memiliki elemen duplikat, berhenti, dan lihat berapa banyak elemen dalam tumpukan.
sumber
Python 2, 82 byte
Cobalah di Ideone .
sumber
Python, 124 byte
sumber
VBSCRIPT, 131 byte
Terbaik yang bisa saya lakukan dengan vbscript, poster pertama kali jadi mudahkan saya!
sumber