Suatu fungsi (atau program) yang mengambil input dan menyediakan output dapat dikatakan memiliki siklus jika memanggil fungsi pada outputnya sendiri berulang kali akhirnya mencapai angka aslinya. Misalnya, ambil fungsi berikut:
Input: n 1 2 3 4 5 6
Output: f(n) 5 7 1 3 4 9
Jika kita mulai dengan n=1
, f(n)=5
, f(f(n))=f(5)=4
, f(f(f(n)))=f(4)=3
, f(f(f(f(n))))=f(3)=1
.
Ini ditulis (1 5 4 3)
. Karena ada 4 angka unik dalam loop ini, ini adalah siklus dengan panjang 4.
Tantangan Anda adalah menulis program atau fungsi yang memiliki siklus dari setiap panjang yang memungkinkan. Artinya, harus ada siklus panjang 1, panjang 2, dan seterusnya.
Selain itu, fungsi / program Anda harus dari bilangan bulat positif ke bilangan bulat positif, dan itu harus bijective , artinya harus ada tepat satu nilai input untuk setiap nilai output yang mungkin, di atas semua bilangan bulat positif. Dengan kata lain, fungsi / program harus menghitung permutasi bilangan bulat positif.
Detail: Setiap sistem input / output standar diperbolehkan, termasuk STDIN, STDOUT, argumen fungsi, pengembalian, dll. Lubang standar dilarang.
Anda tidak perlu khawatir tentang keterbatasan tipe data Anda - properti di atas hanya perlu tahan dengan asumsi bahwa a int
atau float
dapat memiliki nilai apa pun, misalnya.
Tidak ada batasan pada perilaku fungsi pada input yang bukan bilangan bulat positif, dan input / output tersebut akan diabaikan.
Skor adalah kode golf dalam byte, kode terpendek menang.
sumber
Jawaban:
Pyth,
118 byteJauh lebih membosankan daripada jawaban saya sebelumnya.
Setiap angka yang berisi peta 0 digit untuk dirinya sendiri. Setiap nomor lain memetakan ke nomor yang digit-digitnya dirotasi oleh 1. Jadi misalnya:
sumber
Python 2,
565554 byteInilah 21 keluaran pertama:
Polanya jelas jika kita memecah daftar menjadi beberapa bagian seperti:
sumber
Pyth, 25 byte
Ini adalah urutan yang sama dengan @ Sp3000, tetapi dengan formulir tertutup. Bentuk tertutup adalah:
sumber
Python3, 40 byte
Setiap angka yang berisi peta 0 digit untuk dirinya sendiri. Setiap nomor lain memetakan ke nomor yang digit-digitnya dirotasi oleh 1. Jadi misalnya:
sumber
Ruby, 22 + 1 = 23
Dengan bendera baris perintah
-p
, jalankanKetika diberikan sebagai input representasi string dari angka (tanpa baris baru tertinggal), itu membuat digit pertama tetap konstan, kemudian memutar sisanya ke kiri, sehingga
1234
menjadi1342
.Ini dapat dikurangi menjadi 21 karakter dengan
$_=$1+$'+$2if/(.)(.)/
, tetapi mencetak peringatan.sumber
Ruby, 16 + 1 = 17
Dengan bendera baris perintah
-p
, jalankanIni adalah fungsi yang lebih rumit daripada jawaban saya yang lain, tetapi kebetulan lebih golf (dan toleran untuk mengikuti baris baru). Dibutuhkan digit bukan nol terakhir dari input, ditambah angka nol yang tertinggal, dan memindahkannya ke awal nomor. Jadi
9010300
menjadi3009010
. Angka apa pun dengan n digit bukan nol akan menjadi bagian dari siklus panjang-n.Input adalah string dalam basis apa pun melalui STDIN, output adalah string dalam basis itu.
sumber
Python, 43
The kebalikan dari fungsi Sp3000 ini , dilaksanakan secara rekursif.
Fungsi adalah satu siklus diikuti oleh dua siklus diikuti oleh tiga ...
Operasi
n%k+1
bertindak sebagaik
siklus-pada nomor1..k
. Untuk menemukan yang tepatk
untuk digunakan, geser semuanya ke bawahk=1
, laluk=2
, dan seterusnya, hinggan<=k
.sumber
Pyth, 15 byte
Jawaban terpendek sejauh ini yang menggunakan operasi numerik daripada operasi string.
Efek dari fungsi ini pada representasi biner adalah memperluas blok paling kanan dari 1s ke 0 berikutnya; atau jika tidak ada 0, untuk meresetnya kembali ke 1 tunggal:
Pyth, 26 byte, varian menyenangkan
Lakukan operasi di atas secara bersamaan ke semua blok 1s, bukan hanya yang paling kanan — masih menggunakan operasi bitwise dan aritmatika saja.
sumber
Swift 1.2, 66 byte
sumber
Brachylog , 5 byte
Cobalah online!
Port jawaban Pyth @ orlp. Sederhana dan rapi:
Saya awalnya ingin port solusi Python @ Sp3000, tapi butuh 23 byte kekalahan :
Cobalah online!
sumber
JavaScript (ES6), 43 byte
sumber
Matlab (189)
Fungsi:
Memetakan bilangan bulat apa pun berdasarkan faktor prima, jika jumlahnya nol atau difaktorkan menjadi 2 atau 1, jumlahnya dipetakan ke dirinya sendiri, jika tidak kita memilih faktor prima terbesar dari angka ini, maka kita menambah faktor prima berbeda yang tersisa dengan terdekat faktor prima lebih besar sampai kita mencapai angka di
biggest_prime^n
manan
jumlah dari semua eksponen semua faktor, begitu kita mencapai jumlah itu, kita beralih kemax_prime*2^(n-1)
dan kita mereproduksi siklus yang sama lagi.sumber
Matlab (137)
2
sampai kita menemukan eksponen2
yang dapat dibagi dengan jumlah eksponen faktor prima lainnya. lalu kita beralih ke awal siklus dengan membagi2^(sum of exponents of other primes)
. mati rasa lainnya dipetakan untuk diri mereka sendiri.sumber