Nomor Biner Yang Dapat Diverifikasi


28

Jika Anda menyatakan bilangan bulat positif dalam biner tanpa nol di depan dan ganti setiap 1dengan a (dan setiap 0dengan a ), maka apakah semua tanda kurung akan cocok?

Dalam kebanyakan kasus mereka tidak mau. Misalnya, 9 1001dalam biner, yang menjadi ())(, di mana hanya dua kurung pertama yang cocok.

Namun terkadang mereka akan cocok. Sebagai contoh, 44 berada 101100dalam biner, yang menjadi ()(()), di mana semua tanda kurung kiri memiliki tanda kurung yang cocok.

Tulis program atau fungsi yang menggunakan bilangan bulat sepuluh basis positif dan cetak atau kembalikan nilai kebenaran jika versi tanda kurung biner memiliki semua tanda kurung yang cocok. Jika tidak, mencetak atau mengembalikan falsy nilai.

Kode terpendek dalam byte menang.

Urutan OEIS terkait.

Contoh kebenaran di bawah 100:

2, 10, 12, 42, 44, 50, 52, 56

Contoh-contoh palsu di bawah 100:

1, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99


10
Ada urutan untuk semuanya ...
Arcturus

Jawaban:


8

TeaScript , 9 byte 16 18 20 22 24

Disimpan 2 byte berkat produk @ETH

!x÷W(n,¢)

Wow. Itu pendek. Menggunakan pendekatan xnor. Ini akan menggunakan fungsi ganti rekursif ( W) yang akan menggantikan semua 10sama ()dengan apa-apa. Jika string kosong, itu seimbang.


Menggunakan versi TeaScript yang dibuat setelah tantangan ini diposting ini bisa menjadi 7 byte:

!x÷W(n)

Tidak disatukan

!xT(2)W(n,``)

Penjelasan

!      // NOT, returns true if empty string, else false
 xT(2)   // To binary
 W(n,``) // n is 10, reclusive replaces 10 or (), with nothing.

1
Luar biasa! Dua hal yang mungkin membantu: 1) Jika palsu ketika naik, itu sudah palsu turun, jadi Anda tidak perlu tilde pertama. 2) Saya percaya ~--citu salah dalam skenario yang sama persis dengan c--.
ETHproduk

@ ETHproduk yang luar biasa, terima kasih! Sekarang saya turun ke 16 byte
Downgoat

13

Pyth, 10 byte

!uscG`T.BQ

Coba suite tes ini di Pyth Compiler.

Bagaimana itu bekerja

              (implicit) Store the evaluated input in Q.
       .BQ    Return the binary string representation of Q.
 u            Reduce w/base case; set G to .BQ and begin a loop:
     `T         Return str(10) = "10".
   cG           Split G (looping variable) at occurrences of "10".
  s             Join the pieces without separators.
              Set G to the returned string.
              If the value of G changed, repeat the loop.
              This will eventually result in either an empty string or a
              non-empty string without occurrences of "10".
!             Return (and print) the logical NOT of the resulting string.

Saya datang dengan yang setara !u:G`Tk.BQ. Boleh dibilang lebih mudah dimengerti.
orlp

Ya, itu tentu pilihan yang lebih alami.
Dennis

8

Python2, 87 byte

try:exec"print 1,"+"".join(["],","["][int(c)]for c in bin(input())[2:])
except:print 0

Implementasi yang mengerikan yang menyalahgunakan kesalahan sintaksis.


3
Ini kode golf. Mengerikan adalah pujian.
corsiKa

8

JavaScript (ES6), 55 54 51 byte

n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2

Bytes yang disimpan berkat @ Vɪʜᴀɴ dan @xsot !

Penjelasan

n=>
  ![...n.toString(    // convert the input to an array of binary digits
    d=2)]             // d = current depth (+2)
      .some(c=>       // iterate through the digits
        (d+=c*2-1)    // increment or decrement the parenthesis depth
          <2          // if the depth goes negative, return false
      )*
        d==2          // if we finished at a depth of 0, return true

1
Anda dapat menyimpan dua byte dengan menghapus yang tidak diperlukan f=. Anda juga bisa menggunakan use +cbukan c|0case ke integer. Anda juga dapat menggunakan (+c?d++:d--)mana yang lebih pendek
Downgoat

@ Vɪʜᴀɴ OK. Apakah ada semacam panduan tentang kapan saya harus menggunakan f=? Karena banyak jawaban JavaScript lain di situs nama fungsinya.
user81655

1
Biasanya Anda hanya perlu memberi nama fungsi jika tantangan mengharuskan Anda untuk melakukannya. Kalau tidak, aman untuk menganggap bahwa fungsi yang tidak disebutkan namanya baik-baik saja.
Alex A.

Di Firefox, jalankan ini untuk 11, kembali trueketika itu harus kembalifalse
Downgoat

2
Saya tidak tahu javascript, tetapi saya mencoba untuk memotong beberapa byte dan berfungsi di chrome:n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
xsot

7

Python 2, 45 byte

f=lambda n,i=1:i*n>0<f(n/2,i+(-1)**n)or n<i<2

Fungsi rekursif. Membaca angka biner ndari akhir, menjaga hitungan ilevel sarang saat ini dari parens. Jika jatuh di bawah 0, tolak. Ketika kami mencapai awal, periksa apakah hitungannya 0.

Sebenarnya, kami mulai menghitung i=1untuk memudahkan memeriksa apakah sudah jatuh 0. Satu-satunya kasus keberhasilan terminal adalah n==0dan i==1, diperiksa n<i<2. Kami memaksakan pemeriksaan ini terjadi jika n==0, atau jika ijatuh 0, dalam hal ini secara otomatis gagal.

feersum menyelamatkan dua byte dengan merestrukturisasi kasus-kasus non-rekursif dengan ketidaksetaraan pada hubungan pendek.


3
Membutuhkan lebih banyak penyalahgunaan bersyarat. f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2, setidaknya, menghemat 1.
feersum

6

CJam, 11 byte

ri2b"}{"f=~

Ini sedikit haram: Untuk angka yang dapat di-parentifikan, ia akan mencetak satu atau lebih blok. Untuk nomor yang tidak dapat di-parent-kan, ia akan mogok tanpa mencetak apa pun ke STDOUT. Jika Anda mencoba ini secara online dalam juru bahasa CJam , perlu diingat bahwa itu tidak membedakan antara STDOUT dan STDERR.

Karena string non-kosong / kosong adalah true / falsy dalam CJam dan hasil cetak selalu berupa string, ini bisa dibilang mematuhi aturan. Dengan biaya tambahan 3 byte lebih, untuk total 14 byte , kita dapat meninggalkan string benar atau salah pada tumpukan yang akan dicetak:

Lri2b"}{"f=~]s

Ini masih macet untuk nomor yang tidak dapat di-parent-kan, yang diizinkan secara default .

Tes berjalan

$ cjam <(echo 'ri2b"}{"f=~') <<< 52 2>&-; echo
{{}{}}
$ cjam <(echo 'ri2b"}{"f=~') <<< 53 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 54 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 55 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 56 2>&-; echo
{{{}}}

Bagaimana itu bekerja

ri          e# Read an integer from STDIN.
  2b        e# Push the array of its binary digits.
    "}{"f=  e# Replace 0's with }'s and 1's with {'s.
          ~ e# Evaluate the resulting string.
            e# If the brackets match, this pushes one or more blocks.
            e# If the brackets do not match, the interpreter crashes.

CJam, 15 byte

ri2bs_,{As/s}*!

Coba biola ini dalam juru bahasa CJam atau verifikasi semua kasus uji sekaligus .

Bagaimana itu bekerja

ri               Read an integer from STDIN.
  2b             Push the array of its binary digits.
    s            Cast to string.
     _,          Push the string's length.
       {    }*   Do that many times:
        As/        Split at occurrences of "10".
           s       Cast to string to flatten the array of strings.
              !  Push the logical NOT of the result.

1
Sialan, kau hampir tidak bisa mengalahkanku lagi ...
GamrCorps

6

Python, 51 byte

lambda n:eval("'0b'==bin(n)"+".replace('10','')"*n)

Fungsi anonim. Mengevaluasi ekspresi yang terlihat seperti

'0b'==bin(n).replace('10','').replace('10','').replace('10','')...

Setiap penggantian menghapus semua 10, yang sesuai dengan (). Setelah semua penggantian dilakukan, fungsi mengembalikan apakah yang tersisa hanyalah awalan biner 0b. Lebih dari cukup untuk melakukan npenggantian, karena angka k-digit mengambil paling banyak k/2langkah, dan nilainya paling banyak 2**k.


4

Ruby, 40

->i{n='%0b'%i;1while n.slice!'10';n<?0}

Manipulasi string sederhana. Teteskan '10' sampai tidak ada yang tersisa.


4

Serius , 17 byte

,;2@¡@`""9u$(Æ`nY

Output 0untuk false dan 1true. Cobalah online .

Penjelasan:

,      get value from stdin
;      dupe top of stack
2@¡    pop a: push a string containing the binary representation of a (swapping to get order of operands correct)
@      swap top two elements to get original input back on top
`""9u$(Æ` define a function:
  ""     push empty string
  9u$    push "10" (push 9, add 1, stringify)
  (      rotate stack right by 1
  Æ      pop a,b,c: push a.replace(b,c) (replace all occurrences of "10" in the binary string with "")
n      pop f,a: call f a times
Y      pop a: push boolean negation of a (1 if a is falsey else 0)

4

Japt, 23 byte

Japt adalah versi singkat dari Ja vaScri pt . Penerjemah

Us2 a e@+X?++P:P-- &&!P

Ini mengingatkan saya seberapa jauh Japt belum pergi dibandingkan dengan TeaScript. Setelah mengubah penerjemah dalam beberapa hari ke depan, saya ingin menambahkan karakter "pintas" seperti Vɪʜᴀɴ.

Bagaimana itu bekerja

       // Implicit: U = input number, P = empty string
Us2 a  // Convert U to base 2, then split the digits into an array.
e@     // Assert that every item X in this array returns truthily to:
 +X?   //  If X = 1,
 ++P   //   ++P. ++(empty string) returns 1.
 :P--  //  Otherwise, P--. Returns false if P is now -1.
&&!P   // Return the final result && !P (true if P is 0; false otherwise).
       // Implicit: output final expression

Tak lama setelah tantangan ini, @ Vɪʜᴀɴ (sekarang dikenal sebagai @Downgoat) membantu saya menerapkan fitur rekursif-ganti, seperti Wpada jawaban TeaScript. Ini berarti bahwa tantangan ini sekarang dapat dilakukan hanya dalam 5 byte:

!¢eAs  // Implicit: U = input integer, A = 10
 ¢     // Convert U to binary.
  eAs  // Recursively remove instances of A.toString().
!      // Return the logical NOT of the result (true only for the empty string).

Uji secara online!


3

Mathematica, 49 byte

(#~IntegerDigits~2//.{x___,1,0,y___}:>{x,y})=={}&

Saya tidak bisa membaca Mathematica. Penjelasannya, tolong? :)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ubah nomor menjadi basis 2 (sebagai daftar), lalu hapus berulang-ulang 1,0dari daftar, dan uji apakah hasilnya daftar kosong.
alephalpha


3

C ++, 104 94 byte

#include<iostream>
int n,c;int main(){for(std::cin>>n;n&c>=0;n>>=1)c+=n&1?-1:1;std::cout<<!c;}

Jalankan dengan kompiler ini , harus menentukan input standar sebelum menjalankan.

Penjelasan

  • Deklarasi di luar mainisialisasi ke 0.
  • Membaca desimal secara implisit dikonversi menjadi biner, karena ini adalah komputer.
  • Kami memeriksa bit / tanda kurung dari kanan ke kiri karena n>>=1.
  • c+=n&1?-1:1terus menghitung kurung buka ).
  • n&c>=0 berhenti ketika hanya 0 yang tersisa atau kurung tutup lebih dari yang dibuka.

3

Haskell, 49 46 byte

0#l=l==1
_#0=2<1
n#l=div n 2#(l+(-1)^n)
f=(#1)

Contoh penggunaan: f 13-> False.

Saya melacak tingkat bersarang lseperti banyak jawaban lainnya. Namun, kasus "seimbang" diwakili oleh 1, jadi kasus "lebih- )-tan- (" adalah 0.

PS: menemukan penyesuaian level bersarang l+(-1)^ndalam jawaban xnor .


The signumtampaknya terlalu rumit, bagaimana hanya _#0=1<0?
xnor

@ xnor: ya, terima kasih.
nimi

Mengapa tidak l>0bukan l==1?
Michael Klein

@MichaelKlein: karena hanya l==1seimbang. Jika l>1, tanda kurung tidak seimbang.
nimi

@nimi Begitu, saya salah mengartikan cara kerjanya
Michael Klein

3

Python 2, 60 57 56 55 53 52 50 49 byte

n=input()
i=1
while i*n:i+=1|n%-2;n/=2
print i==1

Terima kasih kepada xnor karena telah menghemat dua byte dan feersum untuk menjadikan jumlah byte terakhir menjadi 49!

Penjelasan

Nomor input,, ndiproses dari bit terkecilnya. iadalah penghitung yang melacak jumlah 0 dan 1. Perhatikan bahwa ia diinisialisasi 1untuk menyimpan byte. Pengulangan akan dibatalkan sebelum nmencapai 0 jika angka 1 melebihi angka 0 ( i<=0).

Agar tanda kurung seimbang, dua syarat diperlukan:

  • Jumlah 0 dan 1 sama (yaitu i==1)
  • Jumlah 1 tidak pernah melebihi angka 0 selama proses ini (yaitu loop tidak dibatalkan sebelum waktunya n==0). Sunting: Saya menyadari bahwa kondisi ini tidak perlu karena iharus non-positif jika n!=0kondisi sebelumnya cukup.

Jika idan ntidak negatif maka i==n==0itu i+n==0.
orlp

ibisa negatif jika loop dibatalkan sebelum waktunya.
xsot

Sebenarnya, i|n==0harus selalu bekerja.
orlp

Saran bagus, garis itu terlihat lebih baik sekarang.
xsot

while i*nharus bekerja
xnor

3

JavaScript ES5, 118 87 85 82 77 byte

Teknik menarik menurut saya. Kurang banyak sih, terima kasih kepada @ETHproductions, dan @NotthatCharles

function p(x){x=x.toString(2);while(/10/.test(x))x=x.replace(10,"");return!x}

JavaScript ES6, 77 57 56 54 byte

-21 byte ke produk ETH.

x=>[...x=x.toString(2)].map(_=>x=x.replace(10,""))&&!x

Saya suka terjemahan ke tanda kurung. Namun, jika Anda membiarkannya sebagai 1 dan 0, itu sedikit lebih baik:function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
ETHproduksi

@ ETHproduk Bagus! Saya pikir saya akan meninggalkan kode lain di bagian bawah, saya sangat suka algoritma ^ _ ^ Terima kasih sobat!
Conor O'Brien

Versi ES6 masih bisa diagregasi banyak: Kiatnya x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)adalah untuk memindahkan loop sementara ke dalam .map, karena tidak pernah ada lebih banyak '10 dalam input daripada panjangnya.
ETHproduk

@ ETHproductions Terima kasih lagi ^ _ ^ Trik yang bagus dengan map.
Conor O'Brien

Tidak masalah :) BTW, byte lain dapat disimpan dengan menggunakan trik edc65 sepanjang waktu: x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!xIDK jika itu bisa menjadi lebih pendek.
ETHproduk

2

D, 209 170 byte

import std.stdio;import std.format;import std.conv;void main(char[][]a){string b=format("%b",to!int(a[1]));int i;foreach(c;b){i+=c=='1'?1:-1;if(i<0)break;}writeln(i==0);}

Ini melakukan persis apa yang seharusnya dilakukan tanpa tambahan atau manfaat.


2

C, 67 byte

n;main(i){for(scanf("%d",&n);n*i;n/=2)i+=1-n%2*2;putchar(48+!~-i);}

Cukup banyak port pengiriman python saya.


2

Prolog, 147 byte

b(N,[X|L]):-N>1,X is N mod 2,Y is N//2,b(Y,L).
b(N,[N]).
q([H|T],N):-N>=0,(H=0->X is N+1;X is N-1),q(T,X).
q([],N):-N=0.
p(X):-b(X,L),!,q(L,0).

Bagaimana itu bekerja

b(N,[X|L]):-N>1,X is N mod 2,Y is N//2,b(Y,L).
b(N,[N]).

Mengonversi angka desimal N ke representasi biner sebagai daftar (terbalik). Berarti:

b(42,[0,1,0,1,0,1]) is true

Kemudian:

q([H|T],N):-N>=0,(H=0->X is N+1;X is N-1),q(T,X).
q([],N):-N=0.

Berulang dari daftar [H | T] meningkat N jika elemen head adalah 0 sebaliknya menguranginya.
Jika N pada titik mana pun menjadi negatif atau jika N pada akhirnya bukan 0 menghasilkan false, yang lain benar.

Pemotongan

p(X):-b(X,L),!,q(L,0).

Apakah ada untuk mencegah backtracking dan menemukan solusi non-biner ke b (N, [N])

Pengujian
Coba online di sini
Jalankan dengan kueri seperti:

p(42).

2

PowerShell, 106 Bytes

param($a)$b=[convert]::ToString($a,2);1..$b.Length|%{if($b[$_-1]%2){$c++}else{$c--}if($c-lt0){0;exit}};!$c

Tidak akan memenangkan kompetisi terpendek, itu sudah pasti. Tapi hei, setidaknya itu mengalahkan Jawa?

Menggunakan panggilan .NET yang sangat panjang [convert]::ToString($a,2)untuk mengonversi nomor input kami menjadi string yang mewakili digit biner. Kami kemudian untuk loop melalui string itu dengan 1..$b.length|%{..}. Setiap loop, jika digit kami adalah 1(dievaluasi dengan %2daripada -eq1menyimpan beberapa byte), kami menambah penghitung kami; selain itu, kami menurunkannya. Jika kita mencapai negatif, itu berarti ada lebih )dari yang (ditemui sejauh ini, jadi kita output 0dan exit. Setelah kita melalui loop, $cadalah salah satu 0atau beberapa angka >0, jadi kita ambil yang logis-bukan !dari itu, yang mendapat output.

Ini memiliki kekhasan keluaran 0jika orangtua tidak cocok karena kita memiliki lebih banyak ), tetapi mengeluarkan Falsejika orangtua tidak cocok karena kita memiliki lebih banyak (. Pada dasarnya pernyataan falsy yang secara fungsional setara, hanya menarik. Jika parens semua cocok, keluaran True.


Baiklah, tentu. (Yah, jika saya bisa memperbaiki keraguan yang mengganggu bahwa saya menyelesaikan masalah yang salah, saya akan).
TessellatingHeckler

1

GNU Sed (dengan ekstensi eval), 27

s/.*/dc -e2o&p/e
:
s/10//
t

Sed tidak benar-benar memiliki gagasan yang jelas tentang kebenaran dan falsey, jadi di sini saya mengklaim bahwa string kosong berarti benar dan semua string lainnya berarti falsey.

Jika ini tidak dapat diterima, maka kita dapat melakukan hal berikut:

GNU Sed (dengan ekstensi eval), 44

s/.*/dc -e2o&p/e
:
s/10//
t
s/.\+/0/
s/^$/1/

Ini menghasilkan 1 untuk kebenaran dan 0 sebaliknya.


1

𝔼𝕊𝕄𝕚𝕟 (ESMin), 21 karakter / 43 byte

ô⟦ïßḂ]Ĉ⇀+$?⧺Ḁ:Ḁ‡)⅋!Ḁ)

Try it here (Firefox only).

Perhatikan bahwa ini menggunakan variabel yang ditentukan sebelumnya ke angka (khususnya 2 dan 0). Ada variabel angka yang telah ditetapkan dari 0 hingga 256.

19 karakter / 40 byte, tidak kompetitif

⟦ïßḂ]Ĉ⇀+$?⧺Ḁ:Ḁ‡)⅋!Ḁ

Try it here (Firefox only).

Memutuskan untuk mengimplementasikan output implisit ... Namun, form output sebelumnya masih didukung, sehingga Anda mendapatkan beberapa opsi output!


karena semua orang mengukur dengan char count
fase

1

Java, 129 131 byte

boolean T(int i){int j=0,k=0;for(char[]a=Integer.toString(i,2).toCharArray();j<a.length&&k>=0;j++){k+=a[j]=='1'?1:-1;}return k==0;}

Mungkin bisa dipersingkat. Penjelasan yang akan datang. Terima kasih untuk Geobits selama 4 byte!


Apakah mungkin untuk menggabungkan int k=0;dengan int j=0;?
ETHproduk

Tidak, j adalah variabel dalam di dalam for loop dan tidak dapat dirujuk di luarnya.
GamrCorps

Anda harus dapat menggabungkan cara lain, meskipun: int k=0,j=0;for(...Kemudian Anda bisa meletakkan char[]deklarasi di dalam penginisialisasi loop untuk menyimpan tanda titik koma juga.
Geobits

Masalah yang lebih besar adalah ini memberikan hasil positif palsu. Ini mengembalikan true untuk 9, 35, 37, 38, misalnya .
Geobits

@Geobits oops, saya bahkan tidak menyadari bahwa, akan memperbaiki ketika saya mendapat kesempatan.
GamrCorps

1

C ++, 61 byte

Saya pikir jawaban C ++ saat ini salah: ia mengembalikan nilai kebenaran untuk semua bilangan genap, misalnya 4. Penafian: Saya tidak dapat menggunakan kompiler yang disebutkan, jadi saya menggunakan g ++ 4.8.4. Masalahnya terletak pada penggunaan biner DAN operator dan bukan logika AND yang digunakan untuk memutuskan lebih awal ketika jumlah kurung tutup melebihi jumlah kurung pembuka. Pendekatan ini bisa berfungsi jika truedirepresentasikan sebagai kata dengan pola bit yang benar. Pada sistem saya, dan mungkin sebagian besar sistem lain, truesetara dengan 1; hanya sedikit yang benar. Juga, n/=2lebih pendek dari n>>=1. Ini adalah versi yang disempurnakan sebagai fungsi:

int f(int n,int c=0){for(;c>=0&&n;n/=2)c+=n&1?-1:1;return c;}

0

𝔼𝕊𝕄𝕚𝕟 (sangat tidak kompetitif), 6 karakter / 8 byte

!ïⓑĦⅩ

Try it here (Firefox only).

Saya telah memutuskan untuk meninjau kembali tantangan ini setelah waktu yang sangat, sangat lama. 𝔼𝕊𝕄𝕚𝕟 menjadi jauh lebih baik.

Alasan mengapa ini adalah jawaban yang terpisah adalah karena kedua versi tersebut hampir sepenuhnya berbeda.

Penjelasan

Mengonversi input ke biner, secara rekursif menggantikan instance 10, lalu memeriksa apakah hasilnya adalah string kosong.


0

C # 98 byte

bool f(int m){int i=0;foreach(char s in Convert.ToString((m),2)){if(s=='1')i+=2;i--;}return i==0;}

terbuka untuk saran. Saya suka tantangan ini bahkan itu sudah tua

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.