Kami telah mendefinisikan nomor lipat di sini .
Tapi sekarang kita akan mendefinisikan Nomor Super Lipat. Angka Super Lipat adalah angka yang jika dilipat cukup kali pada akhirnya akan mencapai satu kurang dari kekuatan dua. Metode melipat sedikit berbeda dari pada pertanyaan nomor lipat.
Algoritma lipat berjalan sebagai berikut:
Ambil representasi biner
misalnya 5882
1011011111010
Mencurahkannya menjadi tiga partisi. Paruh pertama, setengah terakhir dan digit tengah (jika memiliki angka ganjil)
101101 1 111010
Jika angka tengah nol, angka ini tidak dapat dilipat
Membalikkan babak kedua dan melapiskan pada babak pertama
010111 101101
Tambahkan digit di tempatnya
111212
- Jika ada 2s dalam hasil angka tidak dapat dilipat kalau tidak angka baru adalah hasil dari algoritma lipat.
Angka adalah nomor Super Lipat jika dapat dilipat ke string yang terus-menerus. (Semua nomor Lipat juga Nomor Super Lipat)
Tugas Anda adalah menulis kode yang menggunakan angka dan menampilkan nilai yang benar jika nomor tersebut adalah nomor Super Lipat dan sebaliknya palsu. Anda akan dinilai berdasarkan ukuran program Anda.
Contohnya
5200
Konversi ke biner:
1010001010000
Dibagi dua:
101000 1 010000
Yang di tengah adalah satu sehingga kami melanjutkan Menumpangkan bagiannya:
000010
101000
Menambahkannya:
101010
Tidak ada dua jadi kami melanjutkan Berpisah menjadi dua:
101 010
Melipat:
010
101
111
Hasilnya adalah 111
(7 dalam desimal) jadi ini adalah Nomor Super Lipat.
Uji Kasus
100 Nomor Super Lipat pertama adalah:
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
menyelinap ke dalam kasus uji lagi? Saya tidak bisa melihat bagaimana bisa dilipat, karena terbelah1 1
, segera memberi a2
. Atau apakah Anda mengatakan bahwa melipatnya nol kali juga dihitung?Jawaban:
Inilah pukulan pertama saya di kode golf:
Python 3, 167 byte
167 byte jika tab atau spasi tunggal digunakan untuk indentasi
Sunting: Terima kasih atas bantuan semua orang di bawah ini, kode di atas telah dikurangi dari ukuran asli 232 byte!
sumber
:
s, dan kembali0
dan1
bukannyaTrue
danFalse
.Java 7, 202 byte
Butuh sedikit usaha untuk membuat fungsi lipat yang lama dapat didaur ulang, tetapi ini dia. Jujur saja, itu dosa. Saya harus melihat-lihat di pagi hari untuk melihat apakah saya bisa bermain golf lebih jauh, karena saya hampir tidak tahan melihatnya sekarang.
Dengan jeda baris:
sumber
CJam ,
4744 byteCobalah online! atau menghasilkan daftar nomor lipat super hingga nomor yang diberikan.
Upaya bermain golf dapat dilihat di sini .
Kode terurai ke fase berikut:
EDIT: Versi ini kurang lebih membutuhkan pendekatan Hukum De Morgan ke versi sebelumnya.
* Masalah dengan menjalankan singleton adalah kita terjebak dengan string kosong setelah slice.
** Jika angka biner super lipat, gambar cerminnya (dengan 0s jika perlu) adalah. Ini menghemat satu byte dari mengambil bagian kanan.
sumber
JavaScript, 149 byte
Menentukan fungsi rekursif.
Penjelasan:
sumber
m=l>>1
,/2/.test(n)
,n.slice(l-m)
(Atau mengiris string terbalik). Saya pikir jika Anda mengganti kasus kegagalan dan kesuksesan maka Anda dapat menggunakannya/0/.test(n)?f(...):1
.JavaScript (ES6),
113109108 byteDiformat dan dikomentari
Demo
sumber
Perl,
7170 byteTermasuk +1 untuk
-p
Berikan nomor pada STDIN
superfolding.pl
:sumber
Python 2, 151 byte
ideone
Fungsi ganda rekursif yang mengambil integer
n
,, dan mengembalikan0
atau1
.Variabel
r
dipertahankan untuk memungkinkan hasil pelipatan dan untuk mengetahui apakah kita saat ini: memiliki integer (pertama saja); punya string biner baru untuk mencoba melipat (luar); atau lipat (bagian dalam).Pada pass pertama
n
adalah dan integer, yang ada<''
di Python 2 sehingga rekursi dimulai dengan casting ke string biner.Eksekusi berikutnya memiliki
r=''
dan pengujian{'1'}==set(n)
dijalankan untuk memeriksa string1
s berkelanjutan (RHS tidak dapat{n}
karena kita mungkin perlu melewati titik ini nanti denganr=''
dan kosongn
ketika itu akan menjadi kamus yang tidak sama dengan{'1'}
, satu set).Jika ini tidak dipenuhi, kriteria ekor dalam diuji (bahkan jika tidak perlu): jika
n in'1'
akan mengevaluasi ke True ketikan
string kosong atau tunggal1
, dimana rekursi luar baru dimulai dengan menempatkanr
, kemudian dilipat, string biner ke dalamn
dan''
menjadir
. Literal2
ditambahkan ke hasil pemanggilan fungsi ini untuk memungkinkan tidak jatuh ke bagian berikutnya (di sebelah kanan logisor
) yang diperbaiki kemudian.Jika itu bukan nilai kebenaran (semua bilangan bulat bukan nol adalah benar dalam Python) kriteria rekursi ekor luar diuji:
n!=0
tidak termasuk case dengan tengah0
dan dua karakter luar diuji, mereka tidak dijumlahkan2
oleh penggabungan string'11'!=n[0]+n[-1]
; jika keduanya benar, bit luar dibuang darin
dengann[1:-1]
, dan kemudian1
ditambahkan ker
jika ada satu di luar sebaliknya a0
, menggunakan fakta bahwa'1'>'0'
dengan Pythonmax(n[0],n[-1])
.Akhirnya penambahan
2
pada setiap rekursi dalam dikoreksi dengan%2
.sumber
PHP, 113 byte
keluar dengan kesalahan (kode
1
) jika argumen tidak super-lipat, kode0
lain. Jalankan dengan-r
.Input
0
akan mengembalikan true (kode0
).kerusakan
sumber
PHP, 197 Bytes
Diperluas
Nilai sebenarnya <10000
sumber