かっこいい2進数


28

先行ゼロのないバイナリで正の整数を表し、すべてをaで、すべてをa で置き換える1と、すべての括弧が一致しますか?(0)

ほとんどの場合、彼らはしません。たとえば、9は1001バイナリであり())(、最初の2つの括弧のみが一致するになります。

しかし、時々一致します。たとえば、44は1011002進数で、これはになり()(())、すべての左括弧に対応する右括弧があります。

正の10進整数を取り込んで、数値の2進括弧バージョンにすべての一致する括弧がある場合に真理値を出力または返すプログラムまたは関数を作成します。そうでない場合は、偽の値を出力するか返します。

バイト単位の最短コードが優先されます。

関連するOEISシーケンス。

100以下の真実の例:

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

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
すべてのシーケンスがあります
...-アークトゥルス

回答:


8

TeaScript、9 バイト 16 18 20 22 24

@ETHproductionsのおかげで2バイト節約

!x÷W(n,¢)

わあ 短いです。@xnorのアプローチを使用します。これは、再帰置き換える機能(使用するWすべてが置き換えられます)10に等しい()何もし。文字列が空白の場合、バランスが取れています。


このチャレンジの投稿後に作成されたバージョンのTeaScriptを使用すると、これは7バイトになります。

!x÷W(n)

非ゴルフ

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

説明

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

1
優れた!役立つ可能性のある2つのこと:1)上昇時に偽りの場合、すでに下降しているので、最初のチルダは必要ないはずです。2)と~--cまったく同じシナリオで虚偽だと思いc--ます。
ETHproductions

@ETHproductions素晴らしい、ありがとう!今私は16のバイトまでだ
Downgoat

13

Pyth、10バイト

!uscG`T.BQ

Pyth Compilerでこのテストスイートを試してください。

使い方

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

私は同等のものを思いついた!u:G`Tk.BQ。間違いなく理解しやすい。
orlp

はい、それは確かにより自然な選択です。
デニス

8

Python2、87バイト

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

構文エラーを悪用するひどい実装。


3
これはコードゴルフです。ひどいのはほめ言葉です。
corsiKa

8

JavaScript(ES6)、55 54 51バイト

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

@Vɪʜᴀɴ@xsotのおかげでバイトを節約できました

説明

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
不要なを削除すると、2バイト節約できますf=。整数の場合の+c代わりにuseを使用することもできますc|0。また、使用することができます(+c?d++:d--)さらに短くなる
Downgoat

@VɪʜᴀɴOK。いつ使用する必要があるかについてのガイドがありますf=か?サイト上の他の多くのJavaScriptがその機能に名前を付けているためです。
-user81655

1
通常、チャレンジで必要な場合にのみ、関数に名前を付ける必要があります。それ以外の場合は、名前のない関数は問題ないと想定しても安全です。
アレックスA.

Firefoxでは、これをで実行すると11、戻るtrueべきときに戻りますfalse
-Downgoat

2
私はjavascriptを知らないが、私は数バイトをカットしようとし、それはクロムで動作します:n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
-xsot

7

Python 2、45バイト

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

再帰関数。n最後の2進数を読み取りi、括弧の現在のネストレベルのカウントを保持します。を下回る場合0、拒否します。最初に到達したら、カウントがであるかどうかを確認します0

実際、にカウントが開始され、にi=1落ちたかどうかを簡単に確認でき0ます。唯一の端末成功ケースはn==0and i==1でチェックされn<i<2ます。我々は場合に発生する場合は、このチェックを強制するn==0場合、またはiに落ち0、それが自動的に失敗した場合には、。

feersumは、短絡の不等式を使用して非再帰的なケースを再構築することにより、2バイトを節約しました。


3
より条件付きの虐待が必要です。f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2、少なくとも、1を節約します
。– feersum

6

CJam、11バイト

ri2b"}{"f=~

これは少し汚れています:括弧でくくる数字については、1つ以上のブロックを印刷します。括弧ではない番号の場合、STDOUTに何も出力せずにクラッシュします。CJamインタープリターでこれをオンラインで試す場合、STDOUTとSTDERRを区別しないことに注意してください。

CJamでは空ではない/空の文字列は真実/偽であり、印刷出力は常に文字列であるため、ほぼ間違いなくルールに準拠しています。合計14バイトの追加の3バイトのコストで、実際に印刷されるスタックに真実または偽の文字列を残すことができます。

Lri2b"}{"f=~]s

これは、括弧で囲まれていない番号に対してもクラッシュします。これはデフォルト許可されています

テスト実行

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

使い方

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バイト

ri2bs_,{As/s}*!

CJamインタープリターでこのフィドルを試すか、すべてのテストケースを一度に検証します

使い方

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
くそー

6

Python、51バイト

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

匿名関数。次のような式に評価します

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

各置換は10、に対応するすべてを削除し()ます。すべての置換が行われた後、関数は、残っているのがバイナリプレフィックスだけであるかどうかを返します0b。- 桁の数字は多くてもステップを取り、その値はmost なのでn、置換するだけで十分です。kk/22**k


4

ルビー、40

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

単純な文字列操作。残りがなくなるまで「10」をドロップします。


4

真剣に、17バイト

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

0falseおよび1trueの出力。オンラインでお試しください

説明:

,      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バイト

JaptJa vaScri ptの短縮バージョンです。通訳

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

これは、JaptがTeaScriptと比べてどれだけ先に進んでいるかを思い出させます。次の数日間で通訳を刷新した後、Vɪʜᴀɴのような「ショートカット」文字を追加したいと思います。

使い方

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

この挑戦のすぐ後、@Vɪʜᴀɴ(現在@Downgoatとして知られている)Wは、TeaScriptの答えのように、再帰的置換機能の実装を助けてくれました。つまり、このチャレンジはわずか5バイトで実行できるようになりました。

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

オンラインでテストしてください!


3

Mathematica、49バイト

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

Mathematicaを読むことができません。説明してください?:)
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ数値を(リストとして)基数2に変換1,0し、リストから繰り返し削除して、結果が空のリストかどうかをテストします。
-alephalpha


3

C ++、104 94バイト

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

このコンパイラで実行で前に標準入力を指定する必要があります。

説明

  • メイン以外の宣言は0に初期化されます。
  • これはコンピューターであるため、10進数を読み取ると暗黙的に2進数に変換されます。
  • のためにビット/括弧を右から左にチェックしますn>>=1
  • c+=n&1?-1:1開き括弧のカウントを保持します)
  • n&c>=0 先頭の0だけが残っているか、括弧が開いているよりも閉じているときに停止します。

3

Haskell、49 46バイト

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

使用例:f 13-> False

l他の多くの答えと同様に、ネストレベルを追跡しています。ただし、「balanced」ケースはで表される1ため、「more- )-than- (」ケースは0です。

PS:l+(-1)^nxnorの答えにネストレベルの調整が見つかりました。


signumあまりにもちょうど方法については、複雑なようですか_#0=1<0
xnor

@xnor:はい、ありがとう。
-nimi

なぜではl>0なくl==1
マイケルクライン

@MichaelKlein:l==1バランスが取れているだけだから。の場合l>1、括弧は不均衡です。
-nimi

@nimi私が見て、私はそれがどのように動作するか誤解
マイケル・クライン

3

パイソン2、60 57 56 55 53 52の 50の 49バイト

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

2バイトを保存してくれたxnorと、最終的なバイトカウントを49にしてくれたfeersumに感謝します!

説明

入力番号、nは最下位ビットから処理されます。i0と1の数を追跡するカウンターです。1バイトを保存するために初期化されることに注意してください。n1の数が0の数を超えると、ループは0 に達する前に中断します(i<=0)ます。

括弧のバランスをとるには、2つの条件が必要です。

  • 0と1の数が等しい(つまりi==1
  • このプロセス中、1の数が0の数を超えることはありません(つまり、ループは途中で中断しませんn==0)。編集:私は、前の条件が十分でiあれば、この条件は非正でなければならないので必要ではないことに気付きましたn!=0

場合in非負ある、その後i==n==0ですi+n==0
orlp

iループが途中で中止された場合、負になる可能性があります。
xsot

実際にi|n==0は、常に動作するはずです。
orlp

素晴らしい提案、その行は今より良く見えます。
xsot

while i*n動作するはずです
-xnor

3

JavaScriptのES5、118 87 85 82 77バイト

私の意見では興味深いテクニックです。@ETHproductionsと@NotthatCharlesに感謝します

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

JavaScriptのES6、77 57 56 54バイト

-21バイトからETHproductions。

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

括弧への翻訳が好きです。ただし、1と0のままにすると、少し短くなりますfunction p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
。– ETHproductions

@ETHproductions良い点!私は一番下に他のコードを残すと思う、私は本当にアルゴリズムが好きです^ _ ^ありがとう、仲間!
コナーオブライエン

ES6バージョンはまだ大量にゴルフすることができますx=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)。トリックは、whileループをに移動する.mapことです。これは、入力に「10」がその長さよりも多くないためです。
ETHproductions

@ETHproductionsありがとうございmapます
コナーオブライエン

問題ありません:)ところで、edc65が常に使用するトリックを使用して別のバイトを保存x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!xできます。
ETHproductions

2

D、209 170バイト

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

これは、追加や利点なしで行うべきことを正確に実行します。


2

C、67バイト

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

私のpython提出のかなりの部分。


2

プロローグ、147バイト

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

使い方

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

10進数Nをリストとしてのバイナリ表現に変換します(反転)。意味:

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

次に:

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

リスト[H | T]を再帰処理します。先頭要素が0の場合はNを増やし、それ以外の場合は減らします。
いずれかのポイントでNが負になるか、最後のNが0でない場合はfalseを返し、そうでない場合はtrueを返します。

カットイン

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

バックトラッキングを回避し、b(N、[N])

テストの非バイナリソリューションを見つけるためにあり
ます。ここでオンライン試してみてください
。次のようなクエリ実行します。

p(42).

2

PowerShell、106バイト

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

最短の競争に勝つつもりはない、それは確かです。でも、少なくともJavaを破っていますか?

非常に長い.NET呼び出し[convert]::ToString($a,2)を使用して、入力番号を2進数を表す文字列に変換します。次に、でその文字列をforループします1..$b.length|%{..}。各ループで、数字が1(数バイトを節約するので%2はなくで評価される-eq1)の場合、カウンターをインクリメントします。それ以外の場合は、デクリメントします。負に達した場合、これまでに遭遇した以上の)ものがあることを意味する(ため、とを出力0exitます。ループを通過したら、$cis 0またはsome number >0であるため、論理的ではなく!、出力を取得します。

これには、0より多く)があるために括弧が一致しない場合に出力するという癖がありますが、より多くがあるFalseために括弧が一致しない場合に出力します(。基本的に機能的に同等の偽のステートメント、興味深いだけです。括弧がすべて一致する場合、を出力しますTrue


もちろん。(まあ、間違った問題を解決しているというしつこい疑念を解決できれば、そうするでしょう)。
TessellatingHeckler

1

GNU Sed(eval拡張付き)、27

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

Sedには真実と偽りの概念が明確に定義されていないため、ここで空の文字列は真実を意味し、他のすべての文字列は偽りを意味すると主張しています。

これが受け入れられない場合は、次のことができます。

GNU Sed(eval拡張付き)、44

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

真の場合は1、それ以外の場合は0を出力します。


1

ES(ESMin)、21文字/ 43バイト

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

Try it here (Firefox only).

これは、数値(特に2と0)に事前定義された変数を使用することに注意してください。0から256までの事前定義された数値変数があります。

19文字/ 40バイト、非競合

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

Try it here (Firefox only).

暗黙的な出力の実装を決定しました...ただし、以前の出力形式は引き続きサポートされているため、いくつかの出力オプションがあります!


誰もが文字数で測定するため
フェーズ

1

Java、129 131バイト

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

おそらく短縮できます。来る説明。Geobitsに4バイトオフをありがとう!


それは、組み合わせることも可能であるint k=0;int j=0;
-ETHproductions

いいえ、jはforループ内の内部変数であり、外部では参照できません。
GamrCorps

ただし、他の方法を組み合わせることができるはずです。int k=0,j=0;for(...その後char[]、ループ初期化子内に宣言を配置して、セミコロンも保存できます。
ジオビット

より大きな問題は、これにより誤検知が発生することです。たとえば、9、35、37、38に対してtrueを返します。
ジオビット

@Geobitsおっと、私はそれに気づかなかったが、チャンスがあれば直るだろう。
GamrCorps

1

C ++、61バイト

現在のC ++の答えは間違っていると思います。すべての偶数(4など)に対して真の値を返します。免責事項:上記のコンパイラを使用できなかったため、g ++ 4.8.4を使用しました。問題は、閉じかっこの数が開きかっこの数を超えたときに早期にブレークするために使用される論理ANDの代わりにバイナリAND演算子を使用することにあります。このアプローチはtrue、すべてが真のビットパターンを持つ単語として表される場合に機能します。私のシステム、およびおそらく他のほとんどのシステムでtrueは、1; と同等です。1ビットのみが真です。また、n/=2はより短いですn>>=1。機能として改善されたバージョンは次のとおりです。

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

0

𝔼𝕊𝕄𝕚𝕟(非常に非競合的)、6文字/ 8バイト

!ïⓑĦⅩ

Try it here (Firefox only).

非常に長い時間を経て、この課題を再検討することにしました。𝔼𝕊𝕄𝕚𝕟とても良くなりました。

これが別の答えである理由は、2つのバージョンがほぼ完全に異なるためです。

説明

入力をバイナリに変換し、10のインスタンスを再帰的に置き換え、結果が空の文字列かどうかを確認します。


0

C#98バイト

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

提案があれば開いてください。私もこの挑戦が好きです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.