Parantezlenebilir İkili Sayılar


28

Bazı pozitif tamsayıları, başında sıfır olmadan ikili olarak ifade 1eder (ve her birini a ve her 0ile a ile değiştirirseniz ), tüm parantezler eşleşir mi?

Çoğu durumda olmaz. Örneğin, 9 1001olur ikili, içinde ())(sadece ilk iki parantez eşleşen burada.

Ama bazen eşleşirler. Örneğin, 44, 101100ikilik olarak bulunur; bu ()(()), tüm sol parantezlerin eşleşen bir sağ parantez içerdiği bir durumdadır.

Onda bir tamsayı alan ve bir temel parantez sürümünde tüm parantezler varsa, bir truthy değeri basan veya döndüren bir program veya işlev yazın . Olmazsa , sahte bir değer yazdırın veya döndürün .

Bayt cinsinden en kısa kod kazanır.

İlgili OEIS dizisi.

100'ün altındaki Truthy örnekleri:

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

100'ün altındaki sahte örnekler:

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
Her şeyin bir sırası var ...
Arcturus

Yanıtlar:


8

TeaScript , 9 bayt 16 18 20 22 24

@ETHproductions sayesinde 2 bayt kaydedildi

!x÷W(n,¢)

Woah. Bu kısa. @ Xnor'ın yaklaşımını kullanır. Bu, Whepsinin hiçbir şey ile 10eşdeğerini değiştirecek özyinelemeli değiştirme işlevini ( ) kullanacaktır (). Dize boşsa dengelenir.


Bu zorluğun yayınlanmasından sonra yapılan bir TeaScript sürümü kullanılarak bu 7 bayt olabilir :

!x÷W(n)

Ungolfed

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

açıklama

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

1
Mükemmel! İşe yarayabilecek iki şey: 1) Yukarı çıkarken sahte ise, aşağı yukarı sahte olur, bu yüzden ilk tilde ihtiyaç duymamanız gerekir. 2) ~--cAynı senaryoda aynı şekilde sahte olduğuna inanıyorum c--.
ETHProductions,

@ETHproductions harika, teşekkürler! Şimdi 16 bayta
düştüm

13

Pyth, 10 bayt

!uscG`T.BQ

Pyth Compiler'daki bu test takımını deneyin .

Nasıl çalışır

              (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.

Eşdeğeriyle geldim !u:G`Tk.BQ. Tartışılması daha kolay.
orlp

Evet, bu kesinlikle daha doğal bir seçim.
Dennis

8

Python2, 87 bayt

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

Sözdizimi hatalarını kötüye kullanan korkunç bir uygulama.


3
Bu kod golfü. Korkunç bir iltifat.
corsiKa

8

JavaScript (ES6), 55 54 51 bayt

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

@ Vɪʜᴀɴ ve @xsot sayesinde kaydedilen bayt !

açıklama

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
Gerekmeyenleri kaldırarak iki bayttan tasarruf edebilirsiniz f=. Ayrıca kullanımını kullanabilirsiniz +cyerine c|0tam sayıya davaya. Ayrıca (+c?d++:d--)daha kısa
olanı

@ Vɪʜᴀɴ Tamam. Ne zaman kullanmam gerektiğine dair bir rehber var mı f=? Çünkü sitedeki birçok JavaScript yanıtı işlevlerini adlandırıyor.
user81655 16:15

1
Genelde, iş görevin yapmasını gerektiriyorsa, işleve yalnızca bir ad vermeniz gerekir. Aksi takdirde, adlandırılmamış işlevlerin iyi olduğunu varsaymak güvenlidir.
Alex A.

Firefox'ta, bunun için çalışan 11, geri truedönmesi gerektiğinde geri dönerfalse
Downgoat

2
Javascript'i bilmiyorum ama birkaç n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
byte'ı kesmeye çalıştım

7

Python 2,45 bayt

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

Özyinelemeli bir işlev. Parenin o anki iç içe geçme düzeyinin nbir sayısını koruyarak uçtaki ikili haneleri okur i. Aşağı düşerse 0, reddet. Başa geldiğimizde sayının olup olmadığını kontrol eder 0.

Aslında, i=1düşüp düşmediğini kontrol etmeyi kolaylaştırmak için saymaya başlarız 0. Tek terminal başarı durumu n==0ve i==1ile kontrol edildi n<i<2. Bu kontrolü n==0, idüşerse 0, bu durumda otomatik olarak başarısız olursa olmaya zorluyoruz .

feersum özyinelemeli olmayan vakaları kısa devre eşitsizliği ile yeniden yapılandırarak iki bayt kurtardı.


3
Daha fazla koşullu kötüye kullanım gerekiyor. f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2, en azından, 1 kaydeder
feersum 16:15

6

CJam, 11 bayt

ri2b"}{"f=~

Bu biraz kirli: Parantezlenebilir numaralar için bir veya daha fazla blok basar. Parantez içine alınamayan numaralar için, STDOUT'a hiçbir şey yazdırmadan çökecektir. Bunu çevrimiçi olarak CJam tercümanında deniyorsanız , STDOUT ile STDERR arasında ayrım yapmadığını unutmayın.

Boş olmayan / boş olmayan dizeler CJam'da truthy / falsy olduğundan ve yazdırılan çıktı her zaman bir dize olduğundan, tartışmalı kurallara uymaktadır. 3 byte daha ilave maliyetle, toplam 14 byte , gerçekte basılacak yığında bir truthy veya sahte ip bırakabiliriz :

Lri2b"}{"f=~]s

Bu hala varsayılan olarak izin verilen parantez içinde olmayan numaralar için çöküyor .

Test çalıştırması

$ 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
{{{}}}

Nasıl çalışır

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 bayt

ri2bs_,{As/s}*!

Bu kemanı CJam yorumlayıcısında deneyin veya tüm test durumlarını bir kerede doğrulayın .

Nasıl çalışır

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.


6

Python, 51 bayt

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

Anonim bir işlev. Şuna benzeyen bir ifadeyi değerlendirir

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

Her değiştirme 10karşılık gelen tümünü kaldırır (). Tüm değiştirmeler yapıldıktan sonra, işlev geriye kalanın sadece ikili önek olup olmadığını döndürür 0b. nBir k-digit sayısı çoğu k/2adımda attığı ve değeri en fazla olduğu için değiştirme yapmak yeterlidir 2**k.


4

Ruby, 40

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

Basit dize manipülasyonu. Kalan kalmayıncaya kadar '10' düşer.


4

Cidden , 17 bayt

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

0Yanlış ve 1doğru çıktılar . Çevrimiçi deneyin .

Açıklama:

,      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 bayt

Japt kısaltılmış versiyonudur Ja vaScri nk . yorumlayıcı

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

Bu bana, Japt’in TeaScript’le karşılaştırıldığında ne kadar ileri gidebileceğini hatırlatıyor. Önümüzdeki birkaç gün içinde tercümanı yeniledikten sonra, Vɪʜᴀɴ gibi "kısayol" karakterleri eklemek istiyorum.

Nasıl çalışır

       // 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

Bu mücadeleden kısa bir süre sonra @ Vɪʜᴀɴ (şimdi @Downgoat olarak da bilinir) W, TeaScript cevabında olduğu gibi özyinelemeli değiştirme özelliğini uygulamama yardımcı oldu . Bu, şimdi bu meydan okuma sadece 5 bayt ile yapılabileceği anlamına gelir:

!¢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).

Çevrimiçi test edin!


3

Mathematica, 49 bayt

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

Mathematica'yı okuyamıyorum. Açıklama, lütfen? :)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Sayıyı taban 2'ye (liste olarak) dönüştürün, ardından tekrar tekrar 1,0listeden kaldırın ve sonucun boş bir liste olup olmadığını sınayın.
alephalpha


3

C ++, 104 94 bayt

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

Bu derleyici ile çalıştırın , çalıştırmadan önce standart girdi belirtmelisiniz.

açıklama

  • Ana dışındaki bildirimler 0 olarak başlatılır.
  • Ondalık okumak, dolaylı olarak ikiliye dönüşür, çünkü bu bir bilgisayardır.
  • Biz bit / parantez kontrol sağdan sola nedeniyle n>>=1.
  • c+=n&1?-1:1Açık parantez sayısını tutar ).
  • n&c>=0 sadece baştaki 0'lar kaldığında veya parantez açtıklarından daha yakın olduğunda durur.

3

Haskell, 49 46 bayt

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

Kullanım örneği: f 13-> False.

lDiğer birçok cevap gibi iç içe geçme seviyesini takip ediyorum . Bununla birlikte, “dengeli” durum temsil edilir 1, bu nedenle “daha )çok (” durumudur 0.

Not: l+(-1)^nxnor'ın cevabında yuva seviyesi ayarını buldu .


signumÇok karmaşık gibi görünüyor, nasıl hemen _#0=1<0?
Xnor

@ xnor: evet, teşekkürler.
nimi

Neden l>0yerine l==1?
Michael Klein,

@MichaelKlein: çünkü sadece l==1dengede. Eğer l>1parantezler dengesizse.
nimi

@ nimi Anlıyorum, nasıl çalıştığını yanlış yorumladım
Michael Klein

3

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

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

Son bayt sayısını 49’a çıkarmak için iki bayt ve feersum’u kurtardığınız için teşekkür ederiz!

açıklama

Giriş numarası, nen az anlamlı bitten işlenir. i0 ve 1 sayılarını izleyen bir sayaçtır. 1Bir bayt kaydetmenin başlatıldığını unutmayın . n1 sayısı 0'dan ( i<=0) fazla ise döngü 0 değerine ulaşmadan önce iptal olur .

Parantezlerin dengelenmesi için iki koşul gereklidir:

  • 0 ve 1 sayısı eşittir (yani i==1)
  • Bu işlem sırasındaki 1 sayısı hiçbir zaman 0 sayısını geçmez (yani döngü zamanından önce durmaz n==0). Düzenleme: Bir önceki durumun yeterli iolması durumunda , bu koşulun pozitif olmaması gerektiğinin gerekli olmadığını anladım n!=0.

Eğer ive nnegatif olmaz o zaman i==n==0olduğunu i+n==0.
orlp

iDöngü erken atlarsa negatif olabilir.
xsot

Aslında, i|n==0her zaman çalışması gerekir.
orlp

Harika öneri, şu an daha iyi görünüyor.
xsot

while i*nçalışması gerekir
xnor

3

JavaScript ES5, 118 87 85 82 77 bayt

Bence ilginç bir teknik. @ETHproductions ve @NotthatCharles sayesinde eksi bir sürü halt eder

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

JavaScript ES6, 77 57 56 54 bayt

-21 ETHproductions bayt.

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

Ben parantez çevirisini seviyorum. Ancak, 1 ve 0 function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
saniye

@ETHproductions İyi nokta! Sanırım altta diğer kodu bırakacağım, algoritmayı gerçekten seviyorum ^ ^ ^ Teşekkürler dostum!
Conor O'Brien,

ES6 sürümü hala bir demet golf oynayabilir: x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)Hile süresi döngüsünü a'ya taşımaktır .map, çünkü bir girişte uzunluğu 10'dan fazla olamaz.
ETHProductions,

@ETHproductions Tekrar teşekkürler ^ _ ^ Güzel hile ile map.
Conor O'Brien,

Hiç sorun değil :) BTW, başka bir byte ile saklanabilir bir edc65 her zaman kullandığı bir numara: x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!xIDK olsa kısalıyorsa.
ETHProductions,

2

D, 209 170 bayt

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);}

Bu, herhangi bir ekleme veya avantaj olmadan yapması gereken şeyi yapar.


2

C, 67 bayt

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

Python gönderimimin limanı.


2

Prolog, 147 bayt

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).

Nasıl çalışır

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

Ondalık sayı N'yi liste olarak ikili gösterime dönüştürür (ters çevrilmiş). Anlamı:

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

Sonra:

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

Baş elemanı 0 ise aksi takdirde azalan ise [H | T] listesindeki N artışları tekrarlar.
Herhangi bir noktada N negatif olursa veya sonunda N 0 değilse, false döndürür, doğru ise.

Kesilmiş

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

Yararlar ve b'ye olmayan ikili çözümler bulma önlemektir mı (N, [N])

Test
çevrimiçi Deneyin burada
bir sorguya gibi onu çalıştırın:

p(42).

2

PowerShell, 106 Bayt

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

En kısa süren yarışmaları kazanmayacağım, orası kesin. Ama hey, en azından Java'yı atıyor?

[convert]::ToString($a,2)Girdi numaramızı ikili sayıları temsil eden bir dizgeye dönüştürmek için çok uzun .NET çağrısını kullanır . Daha sonra bu dize ile döngü için for 1..$b.length|%{..}. Her döngü, eğer rakamımız bir 1( birkaç bayt kurtarmak %2yerine değerlendirilmişse -eq1) ise, sayacımızı artırırız; yoksa onu azaltırız. Eğer negatife ulaşırsak, bu şimdiye kadar karşılaşılandan daha )fazlası olduğu anlamına gelir (, bu yüzden çıktılar 0ve exit. Bir kez döngüden geçtikten sonra $c, ya 0bir rakam olur >0, ya da mantıklı !olanı alırız , ki bunun çıktısını alır.

Bu, 0eğer parkalar uyuşmazsa, daha fazlasına sahip olduğumuz için çıktılar, parsalar uyuşmazsa, çıktığımız çok )tuhaf Falseolur (. Esasen işlevsel olarak eşdeğer sahte ifadeler, sadece ilginç. Eğer parens hepsi eşleşirse, çıktılar True.


Tamam, elbette. (Yanlış sorunu çözdüğüme dair dırdırcı şüphesini giderebilirsem, yapacağım).
TessellatingHeckler

1

GNU Sed (eval uzantılı), 27

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

Sed'in gerçekten tanımlanmış bir truthy ve falsey fikri yok, bu yüzden burada boş dizginin truthy anlamına geldiğini ve diğer tüm dizelerin falsey anlamına geldiğini iddia ediyorum.

Eğer bu kabul edilebilir değilse, aşağıdakileri yapabiliriz:

GNU Sed (eval uzantılı), 44

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

Bu, truthy için 1, aksi takdirde 0 çıktılar.


1

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

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

Try it here (Firefox only).

Bunun sayılara önceden tanımlanmış değişkenleri (özellikle 2 ve 0) kullandığını unutmayın. 0 ile 256 arasında önceden tanımlanmış sayı değişkenleri vardır.

19 karakter / 40 bayt, rekabetçi olmayan

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

Try it here (Firefox only).

Örtük çıktı uygulamaya karar verildi ... Ancak, önceki çıktı formları hala destekleniyor, bu nedenle birkaç çıktı seçeneği elde ediyorsunuz!


Char sayımı ile herkesin tedbirler nedeniyle
faz

1

Java, 129 131 bayt

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;}

Muhtemelen kısaltılabilir. Gelecek açıklama. 4 baytlık Geobits'e teşekkürler!


O birleştirmek mümkün mü int k=0;ile int j=0;?
ETHProductions,

Hayır, j for döngüsündeki bir iç değişkendir ve bunun dışında referans alınamaz.
GamrCorps

Bununla birlikte, diğer yolu da birleştirebilmelisiniz: int k=0,j=0;for(...Sonra char[]bir noktalı virgül kaydetmek için döngü başlatıcıya bildirimi koyabilirsiniz .
Geobits

En büyük sorun bunun yanlış pozitifler vermesidir. Örneğin , 9, 35, 37, 38 için doğru olur .
Geobits

@Geobits ayy, bir şans yakaladığımda düzelteceğimi bile anlamadım.
GamrCorps 17:15

1

C ++, 61 bayt

Şu anki C ++ cevabının yanlış olduğunu düşünüyorum: örneğin tüm sayılar için bir truthy değeri döndürür, örneğin 4. Feragatname: Belirtilen derleyiciyi kullanamadım, bu yüzden g ++ 4.8.4 kullandım. Sorun, kapanış parantez sayısı açılış parantez sayısını aştığında erken kırmak için kullanılan mantıksal AND yerine binary AND işlecinin kullanımında yatmaktadır. Bu yaklaşım truetamamen gerçek bir bit desenine sahip bir kelime olarak temsil edilirse işe yarayabilir . Benim sistemimde ve muhtemelen çoğu diğer sistemlerde,true eşdeğerdir 1; sadece bir bit doğru. Ayrıca, n/=2daha kısadır n>>=1. İşlev olarak geliştirilmiş bir sürüm:

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

0

𝔼𝕊𝕄𝕚𝕟 (çok rekabetçi olmayan), 6 karakter / 8 bayt

!ïⓑĦⅩ

Try it here (Firefox only).

Çok uzun bir zaman sonra bu mücadeleyi tekrar gözden geçirmeye karar verdim. Better çok daha iyi oldu.

Bunun ayrı bir cevap olmasının nedeni, 2 versiyonun neredeyse tamamen farklı olmasıdır.

açıklama

Girişi ikiliye dönüştürür, tekrar tekrar 10 örneğini değiştirir, ardından sonucun boş bir dize olup olmadığını kontrol eder.


0

C # 98 bayt

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

herhangi bir öneri için açık. Eskiden olsa bile bu meydan okumayı seviyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.