Urutan Baum-Sweet (A086747 dengan Twist)
Ambil bilangan bulat positif n
dan cetak bilangan bulat dari 1 ke n di mana urutan Baum-Sweet mengembalikan true. The Baum-manis urutan harus kembali falsy jika representasi biner dari nomor mengandung ganjil nol berturut-turut di mana saja di nomor tersebut, dan truthy sebaliknya. Untuk informasi lebih lanjut, klik tautannya. Berikut beberapa contoh:
1 -> 1 -> Truthy
2 -> 10 -> Falsy
3 -> 11 -> Truthy
4 -> 100 -> Truthy (Even run of zeros)
Berikut ini contoh yang diberikan n=32
Langkah 1: Urutan Baum-Sweet divisualisasikan untuk n=32
1 1 (1)
1 0 0 (2)
11 1 (3)
1 00 1 (4)
1 0 1 0 (5)
11 0 0 (6)
111 1 (7)
1 000 0 (8)
1 00 1 1 (9)
1 0 1 0 0 (10)
1 0 11 0 (11)
11 00 1 (12)
11 0 1 0 (13)
111 0 0 (14)
1111 1 (15)
1 0000 1 (16)
1 000 1 0 (17)
1 00 1 0 0 (18)
1 00 11 1 (19)
1 0 1 00 0 (20)
1 0 1 0 1 0 (21)
1 0 11 0 0 (22)
1 0 111 0 (23)
11 000 0 (24)
11 00 1 1 (25)
11 0 1 0 0 (26)
11 0 11 0 (27)
111 00 1 (28)
111 0 1 0 (29)
1111 0 0 (30)
11111 1 (31)
1 00000 0 (32)
Jadi, setelah menghitung urutan Baum-Sweet untuk n, ambil angka yang benar untuk urutan tersebut dan kumpulkan untuk hasil akhir. Karena n=32
kita akan memiliki:
[1, 3, 4, 7, 9, 12, 15, 16, 19, 25, 28, 31]
Sebagai jawaban akhir.
Ini adalah kode-golf , kemenangan jumlah byte terpendek.
code-golf
sequence
base-conversion
binary
Guci Gurita Ajaib
sumber
sumber
Jawaban:
05AB1E ,
109 byteMenyimpan satu byte, terima kasih kepada Adnan
Cobalah online!
Penjelasan
sumber
ƒ
berfungsi>G
?.¡
digunakan;).JavaScript (ES6),
706863 byteSolusi rekursif yang sedikit lebih menarik:
67 byte berkat @Neil.
g
adalah fungsi untuk memanggil.sumber
f
mirip dengan fungsi yang saya gunakan sesekali untuk menghitung jumlah 1-bit dalam suatu angka.f
gagal kapann=0
? Juga karenaf
hanya mengembalikan 0 atau 1 Anda dapat memotong dua byte dengan menggunakann&f(n>>1)
.n = 0
bukan kasing;).filter
:n=>[...Array(n+1).keys()].filter(f=n=>n<2?n:n%4?n&f(n>>1):f(n/4))
Python 2, 62 byte
Memeriksa untuk menjalankan aneh 1 dalam representasi biner dengan membelah
00
dan memeriksa apakah ada nol tetap dalam representasi string dari daftar yang dihasilkan. Mengganggu, angka-angka biner mulai dengan0b
, yang memiliki nol yang perlu dihapus untuk menghindari positif palsu.Pencacahan dilakukan dengan berulang.
sumber
Pesta,
58, 46 byteEDIT:
Golf
Uji
Dijelaskan
kulit
sed
Cobalah secara Online!
sumber
Batch, 143 byte
sumber
Perl 6 , 40 byte
Cobalah
(
[]
digunakan untuk pengelompokan yang tidak menangkap, dengan<[]>
digunakan untuk kelas karakter)sumber
PowerShell ,
7961 byteCobalah online!
Saya mendapat inspirasi pagi ini untuk mengubah cara saya melakukan
-split
operasi, kemudian melihat bahwa itu mirip dengan bagaimana jawaban xnor dibangun, jadi, saya kira orang-orang hebat berpikir sama?Kami beralih dari
1
atas ke input$args[0]
, dan menggunakanWhere-Object
operator untuk mengeluarkan nomor yang sesuai|?{...}
. Klausa adalah nilai Boolean sederhana - kami ingin memastikan bahwa0
adalah-notin
hasil(...)
.Di dalam parens, kami
[convert]::
nomor saat ini$_
ToString
dengan pangkalan2
(yaitu, mengubahnya menjadi string biner). Kami kemudian-split
string pada regex1|00
- ini adalah pertandingan serakah, dan menghasilkan berbagai string (misalnya,100010
akan berubah menjadi'','','0','','0'
dan sebagainya).Jadi, jika setiap run dari
0
s dalam string biner adalah genap (artinya regex telah membaginya menjadi string kosong), maka0
akan menjadi-notin
hasilnya, jadiWhere
klausa itu benar, dan nomor tersebut dipilih. Angka-angka itu ditinggalkan di jalur pipa dan hasilnya tersirat.sumber
Python 2 ,
6747 byteTerima kasih kepada @xnor untuk bermain golf dengan 20 (!) Byte!
Mengembalikan daftar tidak terurut. Ini cukup efisien: masukan 100.000 membutuhkan sekitar 40 ms pada TIO.
Cobalah online!
sumber
[1][n:]or
. Jugax-~x
untuk2*x+1
.f=lambda n,k=1:n/k*[1]and[k]+f(n,k-~k)+f(n,4*k)
:, dengan asumsi ouputs dapat dalam urutan apa pun.Mathematica, 59 byte
Matematika nomor jawaban 4 ...
sumber
MATL ,
1211 byteCobalah online!
Penjelasan
Untuk mendeteksi jika suatu angka valid, ini dikonversi ke biner, menerapkan enkode run-length, hanya menjalankan run dengan panjang ganjil, dan memeriksa apakah tidak ada run dari nol yang bertahan.
sumber
R, 75 byte
Membaca input dari stdin dan menggunakan
bin
fungsi darimiscFuncs
paket untuk mengkonversi dari desimal ke vektor biner. Akibatnya melakukan pengkodean run-length untuk memeriksa nilai== 0
dan panjang ganjil.sumber
Ditumpuk , 69 byte
Coba di sini!
Atau, tidak bersaing pada 67 byte:
Dan, bahkan lebih tidak bersaing di 49 byte:
Semua menerima input sebagai KL dan meninggalkan output pada KL.
Penjelasan
Fungsi:
Penjelasan tentang tidak bersaing:
Sama seperti di atas, dengan beberapa perbedaan utama:
sumber
Befunge,
845149 byteSetelah sedikit bereksperimen, saya menyadari saya bisa melakukan sedikit lebih baik daripada solusi asli saya dengan menggunakan teknik yang mirip dengan jawaban Batch bahwa Neil datang dengan.
Cobalah online!
Seperti dengan solusi asli saya, ada dua loop - loop luar iterasi atas angka yang ingin kami uji, dan loop dalam menguji urutan bit untuk setiap nomor. Cara kerja tes ini adalah dengan memeriksa dua bit sekaligus (modulo 4 dari nilai saat ini). Jika itu sama dengan 2 kita punya urutan nol aneh dan dapat membatalkan loop dalam dan melanjutkan ke nomor berikutnya.
Jika modulo 4 tidak sama dengan 2, kita perlu terus menguji bit yang tersisa, jadi kita menggeser bit yang sudah diuji. Ini dilakukan dengan membagi nilai, sebut saja n , dengan
2+2*!(n%2)
. Ini berarti jika bit pertama adalah 1, kita membaginya dengan 2 (menjatuhkan 1 bit itu), tetapi jika itu adalah 0, kita membaginya dengan 4, jadi kita akan selalu menjatuhkan pasangan nol.Jika kita akhirnya turun ke nol, itu berarti tidak ada urutan aneh dari bit nol, jadi kami menuliskan nomornya.
sumber
Visual Basic (.net 4.5) 163 byte
Pertama kali menjawab di sini jadi saya yakin saya telah mengacaukan sesuatu. Beritahu saya dan saya akan memperbaikinya. Apakah lambdas Visual Basic bahkan diperbolehkan?
Terima kasih kepada MamaFunRoll untuk menghapus ide nol berturut-turut
R (32) keluaran
sumber
Java,
144130128 BytesIni tidak golf seperti yang saya kira bisa, tapi saya pikir itu akan menjadi solusi yang lucu untuk menggunakan Regex, meskipun tidak pernah menggunakannya.
Golf:
static String a(int n){String s="";for(Integer i=0;i++<n;)if(i.toString(i,2).replaceAll("00|1","").isEmpty())s+=i+" ";return s;}
Tidak Disatukan:
Sunting: Saya dapat menyimpan 14 byte dengan membuat regex 00 | 1 bukannya 00, dan menghapus ".replace (" 1 "," ")" antara replaceAll dan isEmpty!
Sunting 2: Saya dapat menyimpan 2 byte dengan menjadikan saya Integer dan mereferensikan Integer.toString dengan i.toString.
sumber
Clojure, 103 byte
Saya tidak berpikir ini adalah cara terpendek ...
Menggunakan
re-seq
untuk menemukan nol berturut-turut, memetakan panjang modulo-2 mereka ke aset
, membuangnya jika nomor1
ditemukan dari set.sumber
Bertanya-tanya , 38 byte
Pemakaian:
Penjelasan
Lebih mudah dibaca:
rng 1 +1 #0
: Rentang dari 1 hingga input.fltr@ ...
: Rentang filter dengan predikat berikut.bn #0
: Konversi item saat ini ke biner. (Ini akan memiliki pemimpin0b
).Rstr #["00"]
: Memangkas secara rekursif setiap kejadian00
dalam string.len iO 0
: Hitung jumlah0
s dalam string.=1
: Periksa apakah jumlahnya sama dengan 1. Jika satu-satunya yang0
tersisa di string setelah pemangkasan adalah di depan0b
, maka ini mengembalikan true; jika tidak, ini mengembalikan false.sumber
Rubi,
786968 byteVersi yang lebih lama:
sumber
Mathematica, 81 byte
Menghitung, untuk setiap putaran digit berturut-turut dalam suatu angka, {digit umum dalam jangka tersebut ditambah (1 jika panjangnya ganjil, 2 jika panjangnya genap)}; jika salah satu jawabannya adalah {1} maka angkanya tidak dalam urutan.
sumber
Mathematica, 75 byte
#~IntegerDigits~2
menghitung daftar digit biner dari input#
.Split
daftar itu menjadi elemen-elemen identik, ambilCases
korek api itu{0..}
, ambilLength
masing-masingnya, ambilEvenQ
panjangnya dan kemudian kembalikanAnd
hasilnya.sumber
!Or@@OddQ/@...
Python 3,
8682 byteGolf sedang berlangsung ...
Golf off 4 byte dengan mengubah
bin(x)[2:]
hanyabin(x)
- ini meninggalkan0b
pada awal string, tapi saya menyadari ini tidak benar-benar mempengaruhi perhitungan :)sumber
Python, 142 byte
Ini terutama hanya untuk berlatih bermain golf Python saya.
sumber
Jelly , 10 byte
Sangat tidak efisien. Cobalah online!
sumber
Ruby,
545348 byteSaya tidak berpikir regex untuk ini akan menjadi sangat mendasar.
edit 1: beralih untuk menolak untuk menyingkirkan negasi untuk -1.
sunting 2: beralih
match
ke=~
untuk -5.sumber
C #
159157155 byteDisimpan 2 x dua byte berkat TuukkaX.
Catatan: mencetak int dalam urutan terbalik.
Penjelasan:
sumber
c%2==0
bisa jadic%2<1
.N
.b[i++] == '0'
bisa jadib[i++]==48
, tetapi karena karakter lain yang mungkin adalah '1' (ASCII 49), Anda dapat memeriksa apakahb[i++]<49
.Mathematica, 69 byte
Panjang yang sama:
sumber
Ruby, 53 Bytes
sumber
Jelly,
151310 bytemenyimpan dua byte setelah melihat jawaban lain, 3 byte lainnya berkat Dennis
Penjelasan
sumber