Tugas
Temukan himpunan angka sehingga representasi biner berisi dua atau lebih proses 1
dipisahkan oleh setidaknya satu 0
.
Misalnya, untuk angka-angka yang panjangnya 4 bit:
0 0000 (no ones)
1 0001 (only one run)
2 0010 (only one run)
3 0011 (only one run)
4 0100 (only one run)
5 0101 Valid
6 0110 (only one run)
7 0111 (only one run)
8 1000 (only one run)
9 1001 Valid
10 1010 Valid
11 1011 Valid
12 1100 (only one run)
13 1101 Valid
14 1110 (only one run)
15 1111 (only one run)
Memasukkan
Integer yang disediakan untuk aplikasi melalui beberapa input dalam jangkauan 3 .. 32
. Ini mewakili jumlah bit maksimum yang akan dihitung.
Masukan dari n
menunjukkan bahwa angka-angka perlu diperiksa.0 .. 2n-1
Keluaran
Daftar semua angka yang dibatasi (pilihan Anda) yang memenuhi kriteria. Angka-angka harus disajikan dalam urutan numerik. Pembatas tambahan tambahan dapat diterima. Penutup struktur data (misalnya []
dan sejenisnya) juga dapat diterima.
Contoh
Input: 3
Output: 5
Input: 4
Output: 5, 9, 10, 11, 13
Input: 5
Output: 5, 9, 10, 11, 13, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 29
Ini adalah kode-golf - jawabannya dengan jumlah byte terkecil yang menang.
\n
membatasi dan menempatkan\n
pada baris terakhir, maka,
dibatasi dengan,
trailing juga harus dapat diterima. Diperbarui.[1, 2, 3]
?Jawaban:
Pyth, 12 byte
Cobalah online.
Ide
Representasi biner dari bilangan positif selalu dimulai dengan deret 1 s, mungkin diikuti oleh deret lain, bergantian 0 s dan 1 s. Jika setidaknya ada tiga run terpisah, dua di antaranya dijamin menjalankan 1 detik.
Kode
sumber
Python, 48
Saya telah terlalu memikirkan ini. Kami hanya perlu memeriksa apakah ekspansi biner berisi
'01'
.Agar ada dua run yang, yang di sebelah kanan harus didahului oleh a
0
. Jika hanya ada satu kali, tidak akan ada yang memimpin0
, jadi itu tidak akan terjadi.Jawaban lama:
Representasi biner Python bekerja sangat baik di sini. Bilangan biner ditulis seperti
bin(9)=='0b10110'
. Membagi'0'
hasil dalam daftar0
, di antara dua beruntun0
, dan di sebelah kanan final0
b
diikuti oleh satu atau lebih yang terkemuka1
yang tidak mengarahDua kategori pertama selalu ada, tetapi yang terakhir hanya ada jika ada yang dijalankan
1
yang tidak mengandung yang memimpin'1'
, dan hanya jika ada lebih dari satu yang dijalankan1
. Jadi, cukup untuk memeriksa apakah daftar tersebut mengandung lebih dari2
elemen yang berbeda.Python 3.5 menghemat 2 karakter dengan membongkar
{*_}
di tempatset(_)
.sumber
/01/
bukan/10+1/
. Saya mengambil keuntungan dari itu di Perl .Ruby,
444038 karakterdicoret 44 masih teratur 44; (
Fungsi anonim (proc, sebenarnya) yang mengambil integer dan mengembalikan array.
Menggunakan regex@ histokrat menunjukkan bahwa jika/10+1/
: a1
, setidaknya satu0
, lalu yang lain1
.01
ada di mana saja dalam string, pasti ada suatu1
tempat sebelum itu.sumber
/10+1/=~'%b'%x
. Selain itu, Anda dapat menyimpan karakter dengan menggunakan rentang inklusif (0..2**n
) karena2**n
tidak akan pernah memiliki banyak proses.=~
. Terima kasih!/01/
berfungsi. Jika ada01
, harus ada 1 ke kiri di suatu tempat.Julia,
4341 byteIni menciptakan fungsi tanpa nama yang menerima integer dan mengembalikan array. Ini menggunakan trik regex histokrat (digunakan dalam jawaban Doorknob), di mana
01
hanya akan cocok jika ada 1 sebelumnya.Tidak Disatukan:
sumber
Matlab,
79 68 6459Idenya adalah menafsirkan angka biner sebagai array angka nol dan angka, dan kemudian menghitung perbedaan absolut antara setiap pasangan tetangga. Jika kita memiliki dua kali atau lebih selisih 1, maka kita jelas memiliki dua atau lebih run. Perhatikan bahwa ini hanya berfungsi jika kita merepresentasikan angka biner tanpa angka nol di depan.
Versi lama:
sumber
JavaScript (ES7),
8985726962 byteSapi suci, membuat rentang di JS tidak mudah.
Mungkin akan lebih pendek denganTidak, saya berbohong; sebenarnya sedikit lebih lama. Baiklah. Saya kira saya hanya harus puas dengan 27 byte yang disimpan. (7 terima kasih kepada Mwr247!)for
loop yang sebenarnya .Bekerja dengan baik di versi terbaru Firefox, tetapi mungkin tidak di peramban lain. Cobalah:
(Cuplikan diambil dari halaman ini )
Saran diterima!
sumber
.keys()
alih-alih.fill()
dana
bukannyai
mengikat tambang untuk 62:x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]
Haskell,
686153 bytePerbaikan dari Damien
Sejarah:
Ini memperbaiki bug (Beralih == dan =, dan kuadrat alih-alih kekuatan dua). Dan ganti true dengan 2> 1 dan false dengan 1> 2. Juga terima kasih untuk menunjukkan bahwa 2 ^ x selalu gagal. Terima kasih kepada Thomas Kwa dan nimi
Semula
Jika harus program penuh,
sumber
1..(2^x-1)
yang bisa1.. (2^x)
sejak 2 ^ x selalu gagal.False
danTrue
dengan1>2
dan1<2
. Tidak perlu untuk tanda kurung di sekitar2^x-1
. (BTW: Anda salah ketik: pasti4==1=True
).mod
4 == 1 = x> 4 | 2> 1 = g $ xdiv
2APL,
3427 byteIni menciptakan fungsi monadik tanpa nama yang menerima integer di sebelah kanan dan mengembalikan array.
Penjelasan:
Disimpan 7 byte berkat Dennis!
sumber
R,
5547 byte(dengan bantuan dari @ Alex.A)
R tidak memiliki fungsi bawaan untuk menampilkan angka yang dikonversi dengan cara yang mudah, jadi saya menggunakan
R.utils::intToBin
ini, sementara sisanya cukup banyak hanya melaporkan lokasi ekspresi regex yang cocok dan mencetak ke STDOUT sambil dipisahkan oleh ruang.sumber
cat
ruang, sehingga Anda bisa menghilangkan,sep=","
seluruhnya, menghemat 7 byte.CJam, 14
3 byte lebih pendek berkat Dennis. Cobalah online
sumber
2be`,2>
.2be`2>
dan2,#)
harus bekerja juga. Juga, OP telah mengklarifikasi bahwa output dapat dicetak dalam bentuk daftar.JavaScript (ES6),
69686762 byteHari ini saya menemukan cara baru yang lebih singkat untuk mengisi array secara dinamis tanpa menggunakan isi atau peta. Melakukan
x=>[...Array(x).keys()]
akan mengembalikan array rentang 0 hingga x. Jika Anda ingin menentukan rentang / nilai Anda sendiri, gunakanx=>[...Array(x)].map((a,i)=>i)
, karena hanya beberapa byte lagi.sumber
Java,
214165155154148141110 byteKiriman ini mengeksploitasi fakta bahwa representasi string biner dari angka di Jawa tidak pernah memiliki nol di depan. Jika string "01" muncul dalam representasi biner dari angka, itu harus menandai kemunculan kedua angka "1".
Golf:
Tidak Disatukan:
Output program (ingat, trailing delimiter dapat diterima):
sumber
int
variabel counter?long
. Selanjutnya, menggunakanint
benar-benar akan meningkatkan ukuran kode karena mereferensikanInteger
kelas pembungkus yang melakukan parsing angka. Saya pikir tempat yang mungkin untuk menghemat ruang adalah regex, tetapi pengujian saya menunjukkan saya harus memimpin dan membuntuti.*
Long
bungkusnyaint
? (Ya tidak dalam kasus ini tetapi umumnya?)int
akan dipromosikanlong
ketika digunakan sebagai parameter denganLong
. Dalam hal ini meskipun sebenarnya tidak ada cara untuk menggunakanint
bit karena tanda, danInteger
lebih lama dariLong
. Namun, saya telah menemukan beberapa cara untuk memeras ruang ekstra dari bahasa yang sama verbose dengan Java.new Long()
bukanLong.parseLong()
?C (gcc) ,
11199 byteCobalah online!
12 byte dicukur berkat @ceilingcat!
Tidak Disatukan:
Fungsi ffsl () memberi Anda indeks bit pertama yang diatur dalam bilangan bulat panjang. Jadi kami beralih dari
i = 1
ke 2 ^ number_of_bits. Kami menetapkanx
untuki
bergeser ke kanan sampai kami telah menghapus semua bit nol berturut-turut pada ujung yang paling signifikan. Kemudian, kami menggeser kex
kanan sampai kami telah menghapus semua 1 bit berturut-turut pada akhir yang paling signifikan. Jika hasilnya masih nol, kami menemukan kecocokan.sumber
if (popcount(i ^ (i*2))>3)
:, dan perluas popcount () ke serangkaian AND bitwise dan operasi shift. Tapi itu akan menghasilkan kode yang cukup panjang.JavaScript (ES6) 76
sumber
,,,,,5,,,,9,10,11,,13,,,,17,18,19,20,21,22,23,,25,26,27,,29,,
K5, 19 byte
Ini beroperasi di sepanjang prinsip yang sama dengan solusi Dennis, tetapi dengan lebih sedikit builtin untuk memanfaatkan.
Pertama, buat serangkaian biner x-tuple (
+!x#2
), lalu untuk setiap tupel temukan setiap titik yang angka tidak cocok dengan sebelumnya jika kita memperlakukan elemen -1 pada daftar sebagai 0 untuk tujuan ini (~0=':'
). Solusi kami adalah di mana dua lebih sedikit dari jumlah masing-masing hitungan run. (&2<+/'
).Menampilkan setiap langkah perantara lebih jelas:
Dan semuanya:
sumber
Pip, 13 + 1 = 14 byte
Mengambil input dari baris perintah dan menggunakan
-s
flag untuk spasi di antara angka-angka output.Cukup mudah: membangun
range(2**a)
dan memfilterlambda _: "01" in toBinary(_)
. Saya cukup senang memikirkan01
ide itu secara mandiri. Tidak ada tanda kutip yang diperlukan01
karena ini memindai sebagai literal numerik (angka dan string adalah tipe yang sama di Pip).sumber
Julia, 40 byte
Ini menggunakan pendekatan yang agak berbeda dengan solusi Julia lainnya - daripada melakukan pencarian string untuk "01" dalam bit string, ia menggunakan beberapa matematika untuk menentukan apakah angka memenuhi syarat.
i$i>>1
akan memiliki yang hanya di tempat-tempat digit berubah dari nol menjadi satu, atau satu ke nol. Dengan demikian, setidaknya harus ada tiga yangi
harus bolak-balik antara nol dan satu kali cukup.count_ones
menemukan jumlah yang, dan kemudianfilter
menghapus yang tidak cukup.sumber
C ++,
197188141 byteCatatan: ini ditulis dan diuji menggunakan MSVC ++ 2013. Tampaknya
#include
ing<iostream>
mencakup semua C header yang diperlukan untuk membuat karya ini. Tampaknya juga bahwa kode tidak lagi benar-benar C ++, tetapi kompilasi menggunakan C ++ memungkinkan trik header yang mengurangi ukuran kode dibandingkan dengan memasukkan banyak header C lebih banyak.Menggunakan
printf
alih-alihcout
juga menghemat beberapa byte.Golf:
Tidak Disatukan:
sumber
'\n'
alih-alih std :: endl (secara umum), atau','
karena setiap pemisah valid dan yang tertinggal baik-baik saja.strstr(c,"01")
.1<<atol(b[1])
seharusnya1L<<atol(b[1])
, jika tidak, hasil dari ekspresi itu akan menjadi integer 32 bit yang ditandatangani, yang berarti kode hanya akan berjalan hingga 2 ^ 30. Printf harus digunakan%ld
untuk mencetak angka antara 2 ^ 31 dan 2 ^ 32 dengan benar.Perl 5,
5553494741 byte5452484640 byte, plus satu untuk-E
bendera, bukan-e
.Terimakasih untuk xnor untuk petunjuk tentang penggunaan
/01/
alih-alih/10+1/
, yang menghemat dua byte.Terima kasih kepada Dennis saran untuk menggunakan
<>
bukan$ARGV[0]
, yang menyelamatkan enam byte.sumber
C,
8481 byteIni didasarkan pada komentar yang saya buat pada jawaban C lain untuk pertanyaan ini tentang kemungkinan menggunakan operator bitwise sederhana. Ia bekerja dengan mengalihkan semua trailing 0 bit ke 1 dalam pernyataan i | (i-1). Kemudian ia mengalihkan semua trailing 1 bit ke 0 menggunakan k & (k + 1). Ini akan menghasilkan nol jika hanya ada satu yang dijalankan dan bukan-nol sebaliknya. Saya membuat asumsi bahwa panjang adalah 64-bit tetapi bisa memperbaikinya dengan mengorbankan tiga byte dengan menggunakan int64_t sebagai gantinya.
Tidak disatukan
sumber
int64_t
hanya ditentukan jika Anda#include<stdint.h>
. memastikan operasi 64 bit memerlukanlong long
jenis dengan biaya 5 byte.long i
untuk%d
format. Perhatikan juga yang()
berlebihan untuk&
dan|
operator. Memperbaiki ini menghemat 3 byte!long i,j,k;main(){for(scanf("%ld",&j);++i<1L<<j;k&k+1&&printf("%ld ",i))k=i|i-1;}
Pyth,
201716 byteDemo langsung.
sumber
"01"
. Kecuali 0, binary repr. akan selalu dimulai dengan 1.Python 2.7, 89 byte
Saya pikir ini bisa sedikit golf.
sumber
0
pada output.print[i for i in range(2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1]
dua byte lebih pendek. Tetapi dengan memperbaiki untuk0
akan memiliki panjang yang sama (89), jika Anda gunakanrange(1,2**input())
.TI-BASIC,
343230 byteUntuk kalkulator TI-83 + / 84 + series.
Agar angka mengandung dua run dari 1s, itu harus berisi dua
10
s ketika kita memakukan trailing nol ke representasi biner.Daripada menghasilkan representasi biner dan memeriksa a
10
, kami menguji pasangan bit secara matematis dengan menggunakan sisa oleh 4 (int(4fPart(
), yang akan memberikan di2
mana ada a10
. Karena kami tidak peduli dengan pesanan,randIntNoRep(
adalah cara terpendek untuk menghasilkan daftar eksponen.Kami gunakan
log(
untuk memeriksa jumlah proses:Jika setidaknya ada 2 run, maka
log(
hasilnya positif, dan jumlahnya ditampilkan.Jika ada satu proses, maka itu
log(
adalah 0, dan jumlahnya tidak ditampilkan.Jika tidak ada jalan (yang pertama kali terjadi pada X = 2 ^ Ans), kemudian
log(
melempar ERR: DOMAIN, menghentikan output tepat pada titik yang tepat.Kami menggunakan
e^(Ans
sebagai argumen akhir dariFor(
loop — selalu lebih besar dari2^Ans
, tetapie^(
merupakan token tunggal, jadi satu byte lebih pendek.Input / output untuk N = 4:
Kemudian kalkulator melakukan kesalahan; layar kesalahan terlihat seperti ini:
Ketika 1 ditekan, layar beranda ditampilkan lagi:
Kalkulator TI menyimpan semua angka dalam float BCD dengan presisi 14 digit, bukan float int atau biner. Oleh karena itu, pembagian dengan kekuatan dua lebih besar dari
2^14
mungkin tidak tepat. Sementara saya telah memverifikasi bahwa angka-angka paling sulit,3*2^30-1
dan2^32-1
, ditangani dengan benar, saya belum mengesampingkan kemungkinan kesalahan pembulatan. Namun saya akan terkejut jika ada kesalahan untuk input apa pun.sumber
matlab
(90)(70)eksekusi
4
ans =
ans =
ans =
prinsip
Setiap angka yang diambil dari interval] f (n, l), f (n, l) + 2 ^ (l-1) [di mana l> 1 memverifikasi kondisi ini, sehingga hasilnya adalah hasil dari negasi dari seri ini di ketentuan n.
x = 1
x = x + 1 =
01
,x = x + 2 ^ 0 =
11
,x = x + 1 =
001
,x = x + 2 ^ 1 =
011
,x = x + 2 ^ 0 =
111
,x = x + 1 =
0001
,x = x + 2 ^ 2 =
0011
,x = x + 2 ^ 1 =
0111
,x = x + 2 ^ 0 =
0111
,x = x + 1 =
1111
...x + 1, x = x + 2 ^ n, x = x + 2 ^ (n-1) ... x = x + 2 ^ 0
Program saya mencetak rentang antara masing-masing dua baris (jika ada)
setelah periode perjuangan saya berhasil menemukan representasi matematis untuk seri ini yaitu:
2 ^ l (0 + 1 + 2 ^ 1 + ... 2 ^ k) dengan l + k <n
= 2 ^ l (2 ^ k-1)
skor = 90
sumber
C,
103102 byteMemperluas (sebenarnya berkontraksi) pada entri G.Sepepen, mengambil keuntungan dari komentar xnor pada
01
pola dalam representasi biner, tetapi hanya menggunakan fungsi standar dan sedikit memutar-mutar.Versi tidak disatukan:
Loop dalam memindai
i
pola biner01
dengan menggeser secara iteratifx
ke kanan selama masih memiliki 3 bit.printf
mengembalikan jumlah karakter yang dicetak, karenanya tidak pernah0
, jadi tes loop dalam gagal setelahprintf
, menghindari kebutuhan untukbreak
pernyataan.C ++,
129128 byteMengadaptasi gagasan yang sama, varian C ++ ada di sini:
Secara teknis, saya harus membuat
i
sebuahlong long
untuk memastikan bit operasi 64 dan menghitung upto2^32
untuk tambahan 5 byte, tetapi platform modern memiliki 64 bit int.sumber
JavaScript ES6, 60 byte
Kode
Cobalah online!
Penjelasan
sumber
C (semacam - kompilasi dengan peringatan di GCC) - 103
Ini tidak menggunakan fungsi perpustakaan dalam bentuk apa pun kecuali printf. Anda dapat melihat dengan melihat ini bahwa tidak ada upaya yang telah dilakukan untuk menjadikannya sesuai standar atau menghindari UB.
Untuk membuatnya patuh, Anda perlu melakukan banyak hal seperti memasukkan stdio.h yang akan bertentangan dengan semangat membuatnya sekecil mungkin.
Jika ada yang punya saran untuk membuatnya lebih singkat, beri tahu saya.
sumber
PowerShell, 80 byte
sumber
Python, 44 Bytes
Oke, ini mungkin bisa lebih pendek tapi itu codegolf pertama saya:
Pikirkan ini menjawab pertanyaan, tolong jangan turun memilih jika tidak, hanya memposting apa yang salah dengan itu di bawah ini.
sumber
input()
sangat ideal) untuk mendapatkann
, dan kemudian hanya menghitung hingga2^n-1
, daripada mengulang tanpa batas. Selain itu, Anda bisa menggunakan spasi 1 dan 2 untuk bersarang, daripada 4 dan 8, dan menggunakanmap
atau pemahaman daftar mungkin akan mempersingkat kode Anda.jawaban matlab lain yang berbeda dari skor yang baik.
matlab
60(57)eksekusi
ans =
>> ans(5)
ans =
1
contoh:
0000111
ditolak karena ~ x =1111
, ~ x + 1 =00001
mengandung satu digit = 10100111
diterima karena ~ x =1011
, ~ x + 1 =0111
mengandung banyak 1sumber