Angka yang tak terkatakan adalah angka yang dapat dibagi oleh tujuh atau memiliki tujuh sebagai salah satu digit. Gim anak-anak adalah untuk menghitung lompatan angka yang tak terkatakan
1 2 3 4 5 6 ( ) 8 9 10 11 12 13 ( ) 15 16 ( ) 18 ...
Versi permainan dari Cantor adalah urutan yang ditentukan dengan secara berulang mengisi urutan "1 2 3 4 5 6 () 8 ..." ke dalam celah () di atas.
1 2 3 4 5 6 1 8 9 10 11 12 13 2 15 16 3 18 19 20 4 22 23 24 25 26 5 6 29 30 31 32 33 34 1 36 8 38 ...
Cetak / hasilkan setidaknya 7 ^ 7 angka pertama dari permainan angka Cantor yang tak terkatakan ...
Meskipun definisi diberikan secara rekursif, Anda tidak wajib menggunakan rekursi dalam kode.
Ini adalah kode-golf , sehingga program dengan jumlah byte terpendek akan menang!
Catatan: Jumlah angka dalam 1 hingga 7 ^ 7 adalah 203511962727. 10 angka terakhir dalam kisaran itu adalah 823534 823535 221563 108068 823538 823539 823540 823540 823542 823542 221565.
Dump pastebin dari 1000 iterates pertama: http://pastebin.com/Ksiu9Svf
Jawaban:
Pyth ,
252322 byteBerkat @Maltysen untuk -2 byte
Program yang mencetak aliran tanpa batas.
Cobalah online! (Output memerah pada interval dan waktu habis pada 1 menit)
Bagaimana itu bekerja
sumber
7
adalah prima, sehingga dapat dibagi dapat dilakukan melalui pengecekan faktorisasi prima, yang cocok dengan cek lainnyaPython 2,
77757470 byteBerkat @MartinEnder untuk menyarankan batas
9e5
yang ende r d up kerja setelah perubahan.Terima kasih kepada @mschauer karena menyarankan aliran tanpa batas, menghemat 4 byte.
Ini adalah generator yang menghasilkan aliran angka yang tak terbatas.
sumber
if n%7<1or'7'in`n`else n
mungkin sedikit lebih cepat (jumlah byte yang sama), karenan%7<1
lebih cepat daripada memeriksa string, danor
hubungan arus pendek. Sayang sekali ituyield[n,next(i)][n%7<1or'7'in`n`]
tidak akan berhasil.Perl,
47464139 byteDisimpan 5 byte berkat @Dada
Cobalah secara Online! TIO Nexus, sekarang dengan dukungan Perl! Ini akan memotong output setelah titik tertentu, tetapi jika Anda telah menginstal Perl, Anda dapat menjalankannya secara lokal untuk menghasilkan output penuh.
Kode menggunakan beberapa quirks aneh sintaks Perl, jadi saya akan memecah cara kerjanya di bawah ini.
Rincian kode:
sumber
say$a[@a]=$_=...
untuk memenangkan 2 byte jika saya tidak salah.$_
, itu menyelamatkan saya 5 byte. Terima kasih!PHP,
80 (Wahooka) 5754 byteSedangkan idenya adalah dari Wahooka. Saya pikir versi saya cukup berbeda untuk membuatnya menjadi jawaban sendiri:
sumber
Haskell,
6766 bytef
adalah daftar angka yang tak terbatas.Cobalah online!
f
memulai iterasi baru dengan1
dan indeks yang angka untuk memilih 0. Setiap kali ada kesenjangan kita mengambil iterasi baru pilihith
elemen itu dan melanjutkan iterasi saat ini dengani+1
. Jika tidak ada kesenjangan, kami mengambil nomor saat inix
dan melanjutkan tanpa meningkati
.Sunting: -1 byte terima kasih kepada @BMO.
sumber
MATL ,
2625 byteCobalah online! dengan
9e5
diganti oleh9e4
, sehingga waktu berjalan maksimum dan ukuran output dari kompiler online tidak terlampaui.Bagaimana itu bekerja
Ini menggunakan iterasi bukan rekursi. (Faktanya, MATL tidak memiliki rekursi).
Array angka dari
1
ke9e5
pertama kali dihasilkan (ini sudah cukup, karena9e5
melebihi7^7
). Kemudian, angka yang merupakan kelipatan dari7
atau memiliki7
sebagai digit diidentifikasi, dan digantikan oleh1
,2
, ... Proses ini iterasi sampai tidak ada nomor yang perlu diganti.sumber
Tcl , 121 Bytes
Solusi sepele menggunakan loop tak terbatas, tidak ada yang mewah ..
Tidak Disatukan:
sumber
incr
. Dan jika versi tcl> = 8.6,incr
mengasumsikan iterasi pertama merupakan peningkatan dari variabel baru dari0
ke1
jika variabel itu tidak ditetapkan sebelumnya; sehingga Anda dapat menyingkirkan duaset
instruksi pertama .PHP,
10680 byteTerima kasih Ismael Miguel untuk bantuan dengan solusi ternary dan menggunakan kode loop yang lebih pendek untuk sementara.
Tidak dapat memverifikasi bagian terakhir dari urutan penuh karena runtime maks 30 detik PhpFiddle. Tampaknya bekerja setidaknya hingga 1K berdasarkan pada sampel sampel yang disediakan oleh OP.
Golf:
Versi golf asli :
sumber
for($n=1;;$n++)echo$a[]=!(strpos($n,7)>-1||$n%7==0)?"$n ":array_shift($a)." ";
Saya tidak tahu jumlah byte, tapi saya yakin itu jauh lebih rendah dari 106 byte. Cobalah dan lihat apakah itu berhasil.for($n=1;;$n++)echo$a[]=strpos($n,"7")>-1||$n%7==0?array_shift($a)." ":"$n ";
. Saya tidak yakin apakah Anda dapat mengganti$n%7==0
dengan!$n%7
tetapi patut dicoba.for(;;)echo$a[]=strpos(++$n,55)<-1&&$n%7?"$n ":$a[++$b-1];
(58 byte).++$b-1
karena$a[null] === null
Julia, 62 byte
Tidak ada yang mewah. Menggunakan bahwa urutan dalam celah adalah urutan itu sendiri. Membuat salinan array berlebihan untuk menyimpan beberapa byte.
sumber
Perl 6 ,
74 57 5453 byteCobalah
Diperluas:
Uji:
sumber
~7
alih-alih'7'
.Ceylon, 202 byte
Ini bukan fungsi, tetapi deklarasi objek yang menerapkan urutan infinite (Iterable). Objek dapat dicetak langsung,
print(u)
menghasilkan ini:{ 1, 2, 3, 4, 5, 6, 1, 8, 9, 10, 11, 12, 13, 2, 15, 16, 3, 18, 19, 20, 4, 22, 23, 24, 25, 26, 5, 6, 29, 30, ... }
Untuk mencetak lebih banyak, gunakan
printAll(u)
. Kode berikut menggunakan baris baru, dan juga mencetak jumlah (dan 30 elemen pertama yang ditunjukkan di atas):Ini adalah versi yang tidak diklik dan dikomentari:
sumber
Ruby, 80 byte
l=->x{x%7==0||x.to_s[/7/]};a=(1..100);b=a.reject &l p a.map{|x|!l[x]?x:b.shift}
Pengajuan pertama, saya yakin ini bisa ditingkatkan :)
sumber
34
(yang8
saat ini) seharusnya7
, tetapi karena7
merupakan angka yang tak terkatakan, program harus memulai iterasi ketiga dan bukannya mencetak1
.Dyalog APL , 39 byte
{(⍵⍴⍨⍴i)@(i←⍸('7'∊¨⍕¨⍵)∨0=7|⍵)⊢⍵}⍣≡⍳7*7
⍳7*7
adalah 1 2 3 ... 7 7{ }⍣≡
adalah operator titik tetap - menerapkan fungsi berulang kali hingga hasilnya stabilA@I⊢B
mengubah Operator - menggantikan elemen di indeksI
diB
denganA
0=7|⍵
bitmask untuk tempat argumen habis dibagi 7'7'∊¨⍕¨⍵
bitmask untuk tempat format desimal argumen berisi 7∨
atau⍸
pada indeks apa salah satu dari bitmasks di atas benar?i←
menetapkan kei
⍵⍴⍨⍴i
membentuk kembali argumen ke sejumlah elemen dii
sumber
C
157155 BytesKelihatannya benar, saya tidak repot-repot memeriksa sepenuhnya. Naik hingga 999999 yang tampaknya cukup besar.
Versi tidak disatukan:
Versi yang sebagian golf:
sumber
else
?(r=0)
hampir sepanjang waktu. Tetapi beberapa kompiler pilih-pilih. Saya terlalu malas untuk memeriksa spesifikasi sekarang.R, 86 byte
Menggunakan R's Truthy built-in
T
(diinisialisasi keTRUE
/1
) untuk menghitung angka dalam urutan dan nilai FalsyF
(diinisialisasi keFALSE
/0
) untuk menghitung yang tak terkatakan. Selain itu, program ini hanya memeriksa apakah setiap angka dapat dibagi oleh tujuh atau berisi nomor.sumber
7%in%el(strsplit(c(T,""),""))
oleh55%in%utf8ToInt(paste(T))
? (tidak diuji)C - 115 byte
EDIT: Terima kasih kepada @mschauer yang menunjukkan bahwa saya melewatkan beberapa hal.
sumber
Javascript, 80 byte
Karena hanya ada persyaratan minimum tetapi bukan persyaratan maksimum, solusi ini terus menghasilkan tanpa batas waktu.
Untuk memverifikasi bahwa algoritme itu benar, Anda dapat menjalankan pencetakan kode yang sama hanya dengan 10 angka terakhir dan jumlahnya:
sumber
Mathematica, 82 byte
sumber
JavaScript 81 byte
Asli (98 byte)
Golf
sumber
p=console.log;for(c=0,i=1;i<=Math.pow(7,7);i++)/7/.test(i)||i%7==0?(6==c?c=1:c++,p(c)):p(i);
?9e5
alih - alihMath.pow(7,7)
, karena tantangannya berkata:Print/output AT LEAST the first 7^7
34 1 36 **8** 38
. Tapi untuk apa itu layak, versi saat ini bisa golfed lagi:for(c=i=0;++i<9e5;)console.log(!/7/.test(i)&&i%7?i:c++%6+1)
.Befunge, 100 atau 156 byte
Versi pertama ini adalah yang lebih portabel dari keduanya, membatasi dirinya pada sel memori 7-bit, yang adalah apa yang Anda dapatkan dalam penerjemah referensi.
Versi kedua hanya bekerja dengan interpreter yang memiliki sel memori 32-bit, dan karenanya Befunge tidak sepenuhnya standar, tetapi itu memungkinkan kita menyimpan nilai yang lebih besar dalam memori tanpa harus membaginya di sel.
Dalam kedua kasus program berjalan tanpa batas, tetapi versi pertama akan meluap sekitar tanda 2 juta, sedangkan versi kedua harus mencapai nilai maksimum int (sekitar 2 miliar).
Anda dapat mencobanya secara online , tetapi Anda harus mematikan proses untuk mencegahnya agar tidak berjalan selamanya.
sumber
Clojure, 130 byte
Basic kurangi, catat konten vektor hasil dan berapa banyak nilai yang dilewati. Yang terakhir
0
mengambil elemen pertama dari pengurangan[r s]
,rest
menjatuhkan elemen pertama dari hasil 0-diindeks.sumber
Perl6, 41 byte
sumber
Tcl , 64 byte
Cobalah online!
sumber
JavaScript, 64 byte
sumber
console.log
) jawaban JavaScript, itu 70 byteJapt , 25 byte
Uji jumlah dan 10 elemen terakhir.
Menghasilkan 1.000.000 entri pertama dari urutan dan mencetaknya. Satu juta adalah angka terpendek
7**7 == 823543
di Japt.Trailing newline signifikan, karena mengaktifkan penugasan implisit untuk
U
.Membuat daftar hanya membutuhkan waktu sekitar satu detik, tetapi mengeluarkan seluruh array kemungkinan akan membuat browser Anda hang.
Dibongkar & Cara kerjanya
Menggunakan properti yang definisi rekursif dapat diselesaikan dengan melihat urutan yang sudah dibuat.
sumber