「a」と「b」の数は等しくなければなりません。コンピューターを手に入れましたか?


75

人気のある(必須の)コンピューターサイエンスの本、Peter Linzによる「形式言語とオートマトンの紹介」では、次の形式言語が頻繁に述べられています。

定義

主に、この言語は有限状態オートマトンで処理できないためです。この表現は、「言語Lは「a」と「b」が続くすべての文字列で構成され、「a」と「b」の数は等しくゼロではないことを意味します。

チャレンジ

「a」と「b」のみを含む文字列を入力として取得し、この文字列が正式な言語Lで有効かどうかを示す真理値返す/出力する作業プログラム/関数を作成します。

  • プログラムは、ネットワーク、外部プログラムなどの外部計算ツールを使用できません。シェルはこの規則の例外です。たとえば、Bashはコマンドラインユーティリティを使用できます。

  • プログラムは、結果を「論理的な」方法で返す/出力する必要があります。たとえば、0の代わりに10を返す、「ビープ音」、stdoutへの出力などです。詳細はこちら。

  • 標準コードのゴルフ規則が適用されます。

これはです。バイト単位の最短コードが優先されます。幸運を!

真実のテストケース

"ab"
"aabb"
"aaabbb"
"aaaabbbb"
"aaaaabbbbb"
"aaaaaabbbbbb"

偽のテストケース

""
"a"
"b"
"aa"
"ba"
"bb"
"aaa"
"aab"
"aba"
"abb"
"baa"
"bab"
"bba"
"bbb"
"aaaa"
"aaab"
"aaba"
"abaa"
"abab"
"abba"
"abbb"
"baaa"
"baab"
"baba"
"babb"
"bbaa"
"bbab"
"bbba"
"bbbb"

24
入力を空にすることはできますか?(あなたはそれが言語の一部ではないと言っているが、それが我々が考慮する必要がある入力であるかどうかではない。)
マーティン・エンダー

1
私たちの言語に真実性や偽りがない場合はどうなりますか?うempty string == truthynon-empty string == falsy受け入れられますか?
DJMcMayhem

5
ナイスチャレンジですが、タイトルは少し曖昧ではないかもしれません(つまり、sの数がs の数に等しいa^n b^nだけでなく、言及または類似)ab
-Sp3000

1
@ Sp3000このタイトルを選んだのは、面白そうだったからです。後で

1
50以上の回答で、私がpaserジェネレーターを使用するのは私だけだと少し驚いています。厳密には長さの面で競争的ではないことを確認するために、提起された問題は、単純だが自明ではない言語の構文解析の1つです。私は選択肢にあまり詳しくないので、他のコンパイラー・コンパイラー構文で答えを見たいです。
dmckee

回答:


34

MATL5 4バイト

tSP-

文字列がLに属する場合は1の空でない配列を出力し、そうでない場合は空の配列または0を持つ配列(両方とも偽)を出力します。

@LuisMendoに1バイトのゴルフをしてくれてありがとう!

オンラインでお試しください!

使い方

t      Push a copy of the implicitly read input.
 S     Sort the copy.
  P    Reverse the sorted copy.
   -   Take the difference of the code point of the corresponding characters
       of the sorted string and the original.

6
私の2番目の(実際の)MATL回答。:)
デニス

2
真実と偽の奇妙な定義: 'aabb'は-1 -1 1 1は真実です。'aaabb'は-1 -1 0 1 1を与え、偽です
Etoplay

3
@Etoplayすべての値がゼロ以外の空でない配列は真実です。MatlabとOctaveで使用されている定義です
ルイスメンドー

145

Python 3、32バイト

eval(input().translate(")("*50))

終了コードを介した出力:falseの場合はエラー、Trueの場合はエラーなし。

文字列はPythonコードとして評価され、(for a)forの括弧を置き換えbます。フォームの式のみが、のa^n b^nような括弧の整形式に((()))なり、tupleに評価され()ます。

(()())区切り記号がないため、のような複数のグループでエラーが発生します。空の文字列も失敗します(成功しますexec)。

変換は( -> a) -> b使用して行われstr.translate、変換テーブルとしての文字列によって示されるように文字を置き換えています。長さ100の文字列 ")(" * 50を指定すると、テーブルは最初の100個のASCII値を次のようにマッピングします。

... Z[\]^_`abc
... )()()()()(

これ取り( -> a) -> b。Python 2では、256 "ab"*128バイトすべてのASCII値の変換を提供する必要があり、1バイト長くなります。これを指摘してくれたisaacgに感謝します。


58
わかりました。
TLW

何をし*128ますか?
エリックアウトゴルファー

5
12850(または99その点で)バイトを保存するために置き換えることができます。
isaacg

@EʀɪᴋᴛʜᴇGᴏʟғᴇʀ:量指定子だと思う。しかし、私は実際にはPythonを知らず、それに関するドキュメントをまだ見つけていません。
タイタス

4
@isaacgありがとう、Python 3で変更されたことを知りませんでした。
xnor16年

28

網膜、12バイト

このソリューションを独自に見つけたFryAmTheEggmanの功績。

+`a;?b
;
^;$

1有効な入力などのために印刷します0

オンラインでお試しください!(最初の行は、改行で区切られたテストスイートを有効にします。)

説明

バランシンググループには高価な構文が必要なため、代わりに有効な入力を単純なフォームに削減しようとしています。

ステージ1

+`a;?b
;

ザ・は+出力が変化しなくなるまでループの中で、この段階を繰り返すように網膜に指示します。abまたはのいずれかに一致し、a;bで置き換え;ます。いくつかのケースを考えてみましょう。

  • 場合asおよびb文字列のsがその同じようにバランスの取れていない()正常にする必要があり、一部aまたはb文字列のままになり、以来ba、またはb;a解決できないと、単一aまたはb自分自身ではできませんどちらか。すべてのasとs を取り除くには、それぞれのにb対応するものがb必要aです。
  • もしaおよびインクルードbすべてのネストされていない(例えば、我々のようなものがある場合ababまたはaabaabbb)、その後、我々は複数になってしまいます;(そして潜在的にいくつかのaSとbS)最初の反復が複数ありますので、abそれらを挿入するためにSを、さらに反復が保持されます;文字列内のの数。

したがって、入力がの形式である場合にのみ、文字列に1つが含まれます。anbn;

ステージ2:

^;$

結果の文字列にセミコロンが1つしか含まれていないかどうかを確認します。(実際に「チェック」と言うと、「与えられた正規表現の一致数をカウントしますが、その正規表現はアンカーのために1回しか一致しないため、0またはのいずれか1です。」)


25

Haskell、31バイト

f s=s==[c|c<-"ab",'a'<-s]&&s>""

リストの内包は、[c|c<-"ab",'a'<-s]1列になり'a'、それぞれのための'a'sいずれかが続く、'b'それぞれの'a'中にs定数照合して、一致するたびに出力を生成することでカウントを回避します。

この文字列は、元の文字列と等しいことが確認され、元の文字列は空でないことが確認されます。


これは素敵です。Haskellがリスト内包表記の要素を一貫性のある非常に具体的な方法で順序付けすることの便利さをよく忘れます。
Vectornaut

私の最善の試み(f=g.span id.map(=='a');g(a,b)=or a&&b==(not<$>a))よりずっといいです。よくやった。
ジュール

うわー、私はリスト内包表記の定数に一致することができるとは知りませんでした!
ルービック

16

グライム、12バイト

A=\aA?\b
e`A

オンラインでお試しください!

説明

最初の行は非端末を定義します。非端末Aは1つの文字a、ことによると非端末A、そして1つの文字に一致しbます。2行目は、input(e)全体を非終端に対して照合しAます。

8バイトの非競合バージョン

e`\a_?\b

この回答の最初のバージョンを書いた後、Grimeを更新し_てトップレベルの式の名前と見なしました。このソリューションは上記と同等ですが、labelを繰り返すことを避けAます。


どうしてJでやらなかったの?
リーキー修道女

@LeakyNunグライムを誇示したかっただけです。:P
ズガルブ

この言語を作成しましたか?
リーキー修道女

@LeakyNunはい。開発は遅いですが、進行中です。
Zgarb

11

Brachylog23 19バイト

@2L,?lye:"ab"rz:jaL

オンラインでお試しください!

説明

@2L,                  Split the input in two, the list containing the two halves is L
    ?lye              Take a number I between 0 and the length of the input              
        :"ab"rz       Zip the string "ab" with that number, resulting in [["a":I]:["b":I]]
               :jaL   Apply juxtapose with that zip as input and L as output
                        i.e. "a" concatenated I times to itself makes the first string of L
                        and "b" concatenated I times to itself makes the second string of L

8
tryitonline.netでおめでとうございます!
リーキー修道女

10

05AB1E、9バイト

コード:

.M{J¹ÔQ0r

説明:

.M         # Get the most frequent element from the input. If the count is equal, this
           results into ['a', 'b'] or ['b', 'a'].
  {        # Sort this list, which should result into ['a', 'b'].
   J       # Join this list.
    Ô      # Connected uniquified. E.g. "aaabbb" -> "ab" and "aabbaa" -> "aba".
     Q     # Check if both strings are equal.
      0r   # (Print 0 if the input is empty).

入力が空でないことが保証されている場合、最後の2バイトは破棄できます。

CP-1252エンコードを使用します。オンラインでお試しください!


入力が空の場合はどうなりますか?
AdmBorkBork

2
投稿でゼロ以外を探します。それはそこにあります:)
リン

@Lynnしかし、仕様では有効な言語に対してゼロ以外としか書かれていませんか?入力についてではありません。
エミグナ

本当です。間違っていると思いました。しかし、あなたはまだ.M{J¹ÔQ0rあなたのためにすることができます。
エミグナ

@Emignaありがとう、投稿を編集しました。
アドナン

9

ゼリー、6 バイト

Ṣ=Ṛ¬Pȧ

文字列がLに属するか空の場合は文字列自体を出力し、そうでない場合は0を出力します。

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

Ṣ=Ṛ¬Pȧ  Main link. Argument: s (string)

Ṣ       Yield s, sorted.
  Ṛ     Yield s, reversed.
 =      Compare each character of sorted s with each character of reversed s.
   ¬    Take the logical NOT of each resulting Boolean.
    P   Take the product of the resulting Booleans.
        This will yield 1 if s ∊ L or s == "", and 0 otherwise.
     ȧ  Take the logical AND with s.
       This will replace 1 with s. Since an empty string is falsy in Jelly,
       the result is still correct if s == "".

代替バージョン、4バイト(非競合)

ṢnṚȦ

1または0を印刷しますオンラインでお試しください!または、すべてのテストケースを確認します

使い方

ṢnṚȦ  Main link. Argument: s (string)

Ṣ     Yield s, sorted.
  Ṛ   Yield s, reversed.
 n    Compare each character of the results, returning 1 iff they're not equal.
   Ȧ  All (Octave-style truthy); return 1 if the list is non-empty and all numbers
      are non-zero, 0 in all other cases.

9

J、17バイト

#<.(-:'ab'#~-:@#)

これは、空の文字列に対してfalseyを与えるために正しく機能します。エラーは偽です。

古いバージョン:

-:'ab'#~-:@#
2&#-:'ab'#~#   NB. thanks to miles

証明と説明

主動詞は、次の3つの動詞で構成されるフォークです。

# <. (-:'ab'#~-:@#)

これは、「<.長さ(#)の小さい方()と右歯の結果()」を意味し(-:'ab'#~-:@#)ます。

右のタインは4トレインで、次のもので構成されます。

(-:) ('ab') (#~) (-:@#)

k入力を表現しましょう。次に、これは次と同等です。

k -: ('ab' #~ -:@#) k

-:は一致演算子であるため-:、モナドフォークでの不変性の主要なテストです'ab' #~ -:@#

フォークの左脚は動詞なので、定数関数になります。したがって、フォークは次と同等です。

'ab' #~ (-:@# k)

フォークの右の歯の半分(-:)の長さ(#k。観察#

   1 # 'ab'
'ab'
   2 # 'ab'
'aabb'
   3 # 'ab'
'aaabbb'
   'ab' #~ 3
'aaabbb'

現在、これはk有効な入力のみであるため、ここで完了です。言語#決して満たさない奇数長の文字列のエラーなので、これで完了です。

短い方の長さとこれを組み合わせることで、私たちの言語の一部ではない空の文字列がその長さをもたらし、それで0すべて完了です。


2&#-:'ab'#~#エラーを回避し、0代わりに12バイトを使用しながら出力するように修正しました。
マイル

@miles魅惑的!私はそのように考えたことがありません。
コナーオブライエン

これは空の文字列を処理しますか?
ズガルブ

@Zgarbが修正しました!
コナーオブライエン

9

Bison / YACC 60(または29)バイト

(まあ、YACCプログラムのコンパイルは2、3のステップなので、そのためのいくつかを含めることをお勧めします。詳細については以下を参照してください。)

%%
l:c'\n';
c:'a''b'|'a'c'b';
%%
yylex(){return getchar();}

この関数は、正式な文法の観点から解釈することがわかっていれば、かなり明白です。パーサーは、のいずれabか、またはa任意の受け入れ可能なシーケンスとそれに続くを受け入れますb

この実装は、K&Rセマンティクスを受け入れていくつかの文字を失うコンパイラーに依存しています。

を定義yylexして呼び出す必要があるため、私が望むよりも冗長ですgetchar

コンパイルする

$ yacc equal.yacc
$ gcc -m64 --std=c89 y.tab.c -o equal -L/usr/local/opt/bison/lib/ -ly

(gccのオプションのほとんどは私のシステムに固有のものであり、バイトカウントにカウントされるべきではありません-std=c89。リストされた値に8を加算するカウントが必要な場合があります)。

で実行

$ echo "aabb" | ./equal

または同等。

真理値はOSに返され、エラーsyntax errorはコマンドラインにも報告されます。解析関数を定義するコードの部分のみをカウントできる場合(2番目以降%%を無視する場合)、29バイトのカウントを取得します。


7

5.10、35(と17バイト-nフラグ)

say/^(a(?1)?b)$/

文字列がasで始まり、sで再帰するようにしbます。両方の長さが等しい場合にのみ一致します。

バイト数を半分にし、正規表現の再帰について少し教えてくれたMartin Enderに感謝します:D

一致する場合は文字列全体を返し、一致しない場合は何も返しません。

ここで試してみてください!


空ではないテストケースを含めて管理できる最も近いのは18バイトです$_&&=y/a//==y/b//(必須-p)。空でない場合は、16バイトをドロップできます&&。だから、近い...
ドムヘイスティングス

1
だから私は別の17バイトを行うことができます:echo -n 'aaabbb'|perl -pe '$_+=y/a//==y/b//'しかし、私は別のバイトをシフトすることはできません...これをあきらめる必要があるかもしれません!
ドムヘイスティングス

7

JavaScript、54 55 44

s=>s&&s.match(`^a{${l=s.length/2}}b{${l}}$`)

文字列の長さに基づいて単純な正規表現を構築し、テストします。長さ4の文字列(aabb)の場合、正規表現は次のようになります。^a{2}b{2}$

真偽値または偽値を返します。

Neilのおかげで11バイト節約されました。

f=s=>s&&s.match(`^a{${l=s.length/2}}b{${l}}$`)
// true
console.log(f('ab'), !!f('ab'))
console.log(f('aabb'), !!f('aabb'))
console.log(f('aaaaabbbbb'), !!f('aaaaabbbbb'))
// false
console.log(f('a'), !!f('a'))
console.log(f('b'), !!f('b'))
console.log(f('ba'), !!f('ba'))
console.log(f('aaab'), !!f('aaab'))
console.log(f('ababab'), !!f('ababab'))
console.log(f('c'), !!f('c'))
console.log(f('abc'), !!f('abc'))
console.log(f(''), !!f(''))


f=省略することができます。
リーキー修道女

関数式は有効な提出物ですか、実際には機能的である必要がありますか?
Scimonster

関数は有効な提出です。
リーキー修道女

@TimmyD以前はtrueを返していましたが、現在はfalseを返します。
Scimonster

1
s=>s.match(`^a{${s.length/2}}b+$`)
l4m2

5

C、57 53バイト

t;x(char*s){t+=*s%2*2;return--t?*s&&x(s+1):*s*!1[s];}

古い57バイト長のソリューション:

t;x(char*s){*s&1&&(t+=2);return--t?*s&&x(s+1):*s&&!1[s];}

gcc v。4.8.2 @Ubuntuでコンパイル

ヒントをありがとう。

Ideoneでお試しください!


私はここに新しく、まだ他の回答についてコメントできないので、@ Joshの62bソリューションが「aaabab」などの文字列に対して誤検出を与えることを指摘したいと思います。
ジャスム

-1バイトに変更(t+=2)t++++ます。
owacoder

@owacoder t++++は有効なCコードではありません。
ジャスム

いくつかを保存t+=*s%2*2して:*s*!1[s]
ugoren

非常に賢い答えです!残念ながら、入力 "ba"で失敗します:ideone.com/yxixG2
ジョシュ


4

Befunge-93、67バイト

0v@.<  0<@.!-$<  >0\v
+>~:0`!#^_:"a" -#^_$ 1
~+1_^#!-"b" _ ^#`0: <

ここで試してみてください!後でどのように機能するかを説明するかもしれません。キックのためだけに、もう少しゴルフをしようとするかもしれません。


3

MATL、9バイト

vHI$e!d1=

オンラインでお試しください!

出力配列が空でなく、そのすべてのエントリがゼロでない場合、出力配列は真実です。それ以外の場合は偽です。以下に例を示します。

v     % concatenate the stack. Since it's empty, pushes the empty array, []
H     % push 2
I$    % specify three inputs for next function
e     % reshape(input, [], 2): this takes the input implicitly and reshapes it in 2
      % columns in column major order. If the input has odd length a zero is padded at
      % the end. For input 'aaabbb' this gives the 2D char array ['ab;'ab';'ab']
!     % transpose. This gives ['aaa;'bbb']
d     % difference along each column
1=    % test if all elements are 1. If so, that means the first tow contains 'a' and
      % the second 'b'. Implicitly display

2
それは真実のいくつかの便利な定義です。(ゼロ以外の要件については知っていましたが、空でない要件については知りませんでした。)
デニス

3

x86マシンコード、29 27バイト

Hexdump:

33 c0 40 41 80 79 ff 61 74 f8 48 41 80 79 fe 62
74 f8 0a 41 fe f7 d8 1b c0 40 c3

アセンブリコード:

    xor eax, eax;
loop1:
    inc eax;
    inc ecx;
    cmp byte ptr [ecx-1], 'a';
    je loop1;

loop2:
    dec eax;
    inc ecx;
    cmp byte ptr [ecx-2], 'b';
    je loop2;

    or al, [ecx-2];
    neg eax;
    sbb eax, eax;
    inc eax;
done:
    ret;

a先頭のバイトを反復し、その後に次の「b」バイトを反復します。最初のループはカウンターを増やし、2番目のループはそれを減らします。その後、次の条件の間でビット単位のORを実行します。

  1. カウンターが最後に0でない場合、文字列は一致しません
  2. bs のシーケンスに続くバイトが0でない場合、文字列も一致しません

次に、真理値を「反転」するeax必要があります-0でない場合は0に設定し、逆も同様です。それを行うための最短コードは、次の5バイトコードであり、C ++コンパイラの出力から盗んだものであることがわかりましたresult = (result == 0)

    neg eax;      // negate eax; set C flag to 1 if it was nonzero
    sbb eax, eax; // subtract eax and the C flag from eax
    inc eax;      // increase eax

1
否定を改善できると思います。試してみてください。neg eaxキャリーフラグを以前のように設定し、キャリーフラグcmcを反転し、キャリーフラグsalcが設定されているかどうかに応じてALをFFhまたは0に設定します。2バイトを節約しますが、32ビットではなく8ビットの結果になります。
ジュール

ESIが入力文字列をポイントし、ALで結果を返す文字列opsを使用する同じこと(SETccを使用し、386 +が必要):xor eax,eax | xor ecx,ecx | l1: inc ecx | lodsb | cmp al, 'a' | jz l1 | dec esi | l2: lodsb | cmp al,'b' | loopz l2 | or eax,ecx | setz al | ret
ninjalj

@ninjalj答えにそれを投稿する必要があります-それは私のものとは十分に異なっており、私はかなり短いと思われます!
アナトリグ

3

ルビー、24バイト

eval(gets.tr'ab','[]')*1

(これはxnorの Ruby形式での素晴らしいアイデアです。他の答えは、実際に自分で思いついた解決策です。)

このプログラムは、入力を受け取り変換aし、b[]、それぞれ、それを評価します。

有効な入力はネストされた配列を形成し、何も起こりません。不均衡な式は、プログラムをクラッシュさせます。Rubyでは、空の入力はと評価されnil、メソッドがnil定義されていないためクラッシュし*ます。


3

Sed、38 + 2 = 40バイト

s/.*/c&d/;:x;s/ca(.*)bd/c\1d/;tx;/cd/p

空でない文字列の出力は真実です

有限状態オートマトンはこれを行うことができません、あなたは言いますか?ループのある有限状態オートマトンはどうですか。:P

rおよびnフラグで実行します。

説明

s/.*/c&d/        #Wrap the input in 'c' and 'd' (used as markers)
:x               #Define a label named 'x'
s/ca(.*)bd/c\1d/ #Deletes 'a's preceded by 'c's and equivalently for 'b's and 'd's. This shifts the markers to the center
tx               #If the previous substitution was made, jump to label x
/cd/p            #If the markers are next to one another, print the string

いいアプローチ。故障してくれてありがとう。
-joeytwiddle

3

JavaScript、44 42

取り消し線44はまだ通常の44です;(

f=s=>(z=s.match`^a(.+)b$`)?f(z[1]):s=="ab"

再帰の外側を剥離することによって機能aし、bかつ再帰的に選択された内部値を使用して、しかし.+^a.+b$左側に一致するものがない場合、最終結果は残りの文字列が正確な値かどうかですab

テストケース:

console.log(["ab","aabb","aaabbb","aaaabbbb","aaaaabbbbb","aaaaaabbbbbb"].every(f) == true)
console.log(["","a","b","aa","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb","aaaa","aaab","aaba","abaa","abab","abba","abbb","baaa","baab","baba","babb","bbaa","bbab","bbba","bbbb"].some(f) == false)

3

ANTLR、31バイト

grammar A;r:'ab'|'a'r'b'|r'\n';

@dmckeeのYACC answerと同じコンセプトを使用します。

テストするには、ANTLRの入門チュートリアルの手順に従ってください。次に、上記のコードを名前のファイルに入れて、A.g4次のコマンドを実行します。

$ antlr A.g4
$ javac A*.java

次に、STDINで次のgrun A rように入力してテストします。

$ echo "aaabbb" | grun A r

入力が有効な場合、何も出力されません。それが無効である場合、grunエラーになります(どちらかtoken recognition errorextraneous inputmismatched input、またはno viable alternative)。

使用例:

$ echo "aabb" | grun A r
$ echo "abbb" | grun A r
line 1:2 mismatched input 'b' expecting {<EOF>, '
'}

単一のルールで代替として改行を追加する巧妙なトリック。私もyaccでいくつかの方法で節約できると思います。grammerただし、このキーワードは、antlrを使用したゴルフのスティンカーです。fortranを使うようなものです
dmckee

3

C、69バイト

69バイト:

#define f(s)strlen(s)==2*strcspn(s,"b")&strrchr(s,97)+1==strchr(s,98)

なじみのない人には:

  • strlen 文字列の長さを決定します
  • strcspn 他の文字列が見つかった文字列の最初のインデックスを返します
  • strchr 文字の最初の出現へのポインタを返します
  • strrchr 文字の最後の出現へのポインタを返します

タイタスに大いに感謝します!


1
>97代わりに==98
タイタス

2
61バイトのソリューションでは、「aaabab」などの文字列で誤検知が発生します。参照してくださいideone.com/nmT8rm
Jasmes

ああ、あなたは正しいジャスムです、ありがとう。これを少し考え直さなければなりません。
ジョシュ

69バイトのソリューションに戻りますが、このアプローチを使用して短縮できるかどうかはわかりません。
ジョシュ

3

R、64 61 55バイト、73 67バイト(堅牢)または46バイト(空の文字列が許可されている場合)

  1. 繰り返しになりますが、xnorの回答が書き直されました。入力がasとbsの文字列で構成されているというルールで暗示されている場合、動作するはずです。式が有効であればNULLを返し、その他には何もスローしません。

    if((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
    
  2. 入力が堅牢でなく、ゴミなどが含まれている可能性がある場合、たとえばaa3bb、次のバージョンを考慮する必要がありTRUEます(NULLではなく、真のテストケースに戻る必要があります)。

    if(length(y<-scan(,'')))is.null(eval(parse(t=chartr("ab","{}",y))))
    
  3. 最後に、空の文字列が許可されている場合、空でない入力の条件を無視できます。

    eval(parse(text=chartr("ab","{}",scan(,''))))
    

    繰り返しますが、成功した場合はNULL、それ以外の場合はNULL。


Rがわからない、空の入力の結果は何ですか?(偽造する必要があります)
タイタス

空の入力をテストする簡単な方法はありませんか?
タイタス

バージョン1:ちょうど何も(正しい入力のみ返すNULL)、バージョン2:ちょうど何も(正しい入力のみ返すTRUE)、バージョン3(状態と、空の文字列がOKであると仮定): NULL。Rは、警告なしにすべてを問題なく型キャストする統計的オブジェクト指向言語です。
アンドレイKostyrka 16

これ(回答1)はさらに55バイトに改善できますif((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
ジュゼッペ

3

Japt、11バイト

©¬n eȦUg~Y

オンラインでお試しください!

trueまたはを与えます。ただし、JSでどれが偽であるかfalseを示し""ます""

開梱と仕組み

U&&Uq n eXYZ{X!=Ug~Y

U&&     The input string is not empty, and...
Uq n    Convert to array of chars and sort
eXYZ{   Does every element satisfy...?
X!=       The sorted char does not equal...
Ug~Y      the char at the same position on the original string reversed

デニスのMATLソリューションから採用。


2

C(ANSI)、65 75バイト

ゴルフ:

l(b,i,j,k)char*b;{for(i=j=0;(k=b[i++])>0&k<=b[i];)j+=2*(k>97)-1;return !j;}

説明:

値jを設定し、各bでjをインクリメントし、それ以外ではjをデクリメントします。前の文字が次の文字以下かどうかをチェックして、アバブが働かないようにします

編集

ababケースのチェックを追加しました。


これは、baまたはのような文字列で誤検知を与えませんかabab
ズガルブ

ああ、はい、私はブロックされてから写真を見ることができなかったので、私はその投稿を読み違えました。それを修正する!
dj0wns

2

バッチ、133バイト

@if ""=="%1" exit/b1        Fail if the input is empty
@set a=%1                   Grab the input into a variable for processing
@set b=%a:ab=%              Remove all `ab` substrings
@if "%a%"=="%b%" exit/b1    Fail if we didn't remove anything
@if not %a%==a%b%b exit/b1  Fail if we removed more than one `ab`
@if ""=="%b%" exit/b0       Success if there's nothing left to check
@%0 %b%                     Rinse and repeat

ERRORLEVEL成功すると0、失敗すると1を返します。Batchは空の文字列に対して部分文字列の置換を行うことを好まないため、事前に確認する必要があります。空のパラメーターが有効な場合、6行目は必要ありません。


2

PowerShell v2 +、61 52バイト

param($n)$x=$n.length/2;$n-and$n-match"^a{$x}b{$x}$"

入力$nを文字列として受け取り、として作成$xhalf the lengthます。構造-and間のブール比較$n-match等しい数の正規表現に対する正規表現演算子aのとbさん。ブール値$TRUEまたはを出力し$FALSEます。$n-and考慮してあります""= $FALSE

代替、35バイト

$args-match'^(a)+(?<-1>b)+(?(1)c)$'

これは、PowerShell オペレーターにカプセル化された.NETバランシンググループに基づいた、Leakyの答えからの正規表現を使用します-match。真偽の場合は文字列、偽の場合は空の文字列を返します。


あなたは評価すべき別のバージョンで-matchに対して$args[0]そうでない場合、-matchフィルタとして動作します
マティアスR.ジェッセン

@ MathiasR.Jessenプロダクションコードでは、はい、ただし、[0]入力は1つしか与えられておらず、出力としてtrue / false値が1つだけ必要なので、ここでゴルフをすることができます。空の文字列は偽であり、空ではない文字列は真実であるため、配列に対してフィルター処理を行い、入力文字列を戻すか、何も戻さず、チャレンジ要件を満たします。
AdmBorkBork

2

Pyth-13バイト

&zqzS*/lz2"ab

説明:

  qz          #is input equal to
          "ab #the string "ab"
     *        #multiplied by
      /lz2    #length of input / 2
    S         #and sorted?
&z            #(implicitly) print if the above is true and z is not empty

あなたは、入力された文字列を使用し、それを行うことができます&qS*/lQ2"ab
漏れ尼僧

@LeakyNunヒントをありがとう!どのように/なぜそれが機能するのか説明できますか?これはPythを使って今まで私の最初の時間です
Cowabunghole

例えば、+4に拡大する+4Q(引数の暗黙充填)
漏れ修道女

2

Haskell、39バイト

p x=elem x$scanl(\s _->'a':s++"b")"ab"x

使用例:p "aabb"-> True

scanl(\s _->'a':s++"b")"ab"xすべて["ab", "aabb", "aaabbb", ...](length x)要素を含むすべてのリストを作成します。このリストにあるelemかどうかを確認しますx


2

Python、43 40バイト

lambda s:''<s==len(s)/2*"a"+len(s)/2*"b"

Leaky Nunのおかげで明らかな解決策を考えた

他のアイデア、45バイト:

lambda s:s and list(s)==sorted(len(s)/2*"ab")

len / 2を使用して-4バイト(半分が最後に来るとエラーになります)

空の文字列に対してfalseを与えるようになりました

xnorのおかげで-3バイト


はい、ラムダに名前を付ける必要はありません。
リーキー修道女

lambda s:list(s)==sorted("ab"*len(s)//2)(Python 3)
リーキー修道女

lambda s:s=="a"*len(s)//2+"b"*len(s)//2(Python 3)
リーキー修道女

ええ、私はそれを投稿しながらそれを実現しました。笑、明白な解決策は、Python 2で短いです:
KarlKastor

1
''<代わりにs and、空のケースを除外することができます。
XNOR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.