"a"와 "b"의 개수는 같아야합니다. 컴퓨터 받았어?


75

피터 린츠 (Peter Linz )의 인기 있고 필수적인 컴퓨터 과학 서적 인 정식 언어 및 오토마타 소개 에서 다음 공식 언어가 자주 언급됩니다.

정의

주로이 언어는 유한 상태 오토마타로 처리 할 수 ​​없기 때문입니다. 이 표현은 "언어 L은 'a'와 'b'의 수가 같고 0이 아닌 'a'와 'b'의 모든 문자열로 구성됩니다.

도전

문자열을 얻는 작업 프로그램 / 기능 쓰기 "A"의와 "B"를 포함하는 유일한 s의 입력과 같은 수익을 / 진리 값을 출력 이 문자열이 있으면 말, 유효 공식 언어 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
입력이 비어? (언어는 언어의 일부가 아니라 우리가 고려해야 할 의견이 아니라고 말합니다.)
Martin Ender

1
우리 언어에 진실하거나 허위가 없다면 어떻게해야합니까? 겠습니까 empty string == truthynon-empty string == falsy수용 할 수?
DJMcMayhem

5
멋진 도전,하지만 난 제목이 좀 덜 모호한 (즉, 언급 될 수 있다고 생각 a^n b^n또는 이와 유사한보다는 그냥 숫자 a의 수를 같게들 b들)
SP3000

1
@ Sp3000 재미있어 보이기 때문에이 제목을 선택했습니다. 나중에 sth로 변경할 수도 있습니다.

1
나는 50 개 이상의 답변에서 내가 paser generator를 사용하는 유일한 사람이라는 것에 약간 놀랐습니다. 길이가 엄격하게 경쟁적이지는 않지만 문제는 간단하지만 사소한 언어를 파싱하는 것입니다. 나는 선택에 널리 익숙하지 않기 때문에 다른 컴파일러 컴파일러 구문에서 답변을보고 싶습니다.
dmckee

답변:


34

MATL , 5 4 바이트

tSP-

문자열이 L에 속하는 경우 비어 있지 않은 배열 1을 인쇄하고 그렇지 않은 경우 비어있는 배열 또는 0 s 배열 (둘 다 거짓)을 인쇄합니다.

1 바이트를 골라내는 @LuisMendo에게 감사드립니다!

온라인으로 사용해보십시오!

작동 원리

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
두 번째 (작동 중) MATL 답변입니다. :)
Dennis

2
진실되고 허위에 대한 이상한 정의 : 'aabb'는 -1 -1 1 1입니다. 'aaabb'는 -1-1 0 1 1을 제공하고 허위입니다
Etoplay

3
@Etoplay 0이 아닌 모든 값을 가진 비어 있지 않은 배열은 진실입니다. Matlab과 Octave에서 사용 된 정의
Luis Mendo

145

파이썬 3, 32 바이트

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

종료 코드를 통한 출력 : false에 대한 오류, True에 대한 오류 없음.

문자열은 괄호를 교체, 파이썬 코드로 평가 (를 위해 a)위해 b. 형식의 표현 만 튜플을 평가하는 등 a^n b^n의 괄호 표현이됩니다 .((()))()

일치하지 않는 파렌은 (()())구분 기호가 없으므로 와 같은 여러 그룹과 마찬가지로 오류가 발생 합니다. 빈 문자열도 실패합니다 (에 성공 exec).

변환은 ( -> a, ) -> b사용하여 수행되는 str.translate변환 테이블 역할을하는 문자열로 표시된 문자를 대체하는. 길이가 100 인 문자열 ") ("* 50)에서 표는 처음 100 개의 ASCII 값을 다음과 같이 매핑합니다.

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

이는합니다 ( -> a, ) -> b. Python 2에서는 256 바이트의 모든 ASCII 값에 대한 변환을 제공해야하며 "ab"*1281 바이트 이상이 필요합니다 . 이것을 지적 해준 isaacg에게 감사합니다.


58
좋습니다, 영리합니다.
TLW

무엇을 *128합니까?
Outgolfer 에릭

5
128바이트를 저장하기 위해 50(또는 99그 문제로) 대체 할 수 있습니다 .
isaacg

@ Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ : 나는 그것이 정량적이라고 생각합니다. 그러나 나는 실제로 파이썬을 모른다. 그리고 아직 그것에 관한 문서를 찾지 못했다.
Titus

4
@isaacg 고마워, 나는 파이썬 3에 대해 변경된 것을
몰랐다.

28

레티 나 , 12 바이트

이 솔루션을 독립적으로 찾은 FryAmTheEggman에게 감사의 말을 전합니다.

+`a;?b
;
^;$

1유효한 입력을 위해 인쇄 합니다 0.

온라인으로 사용해보십시오! 첫 번째 줄은 줄 바꿈으로 구분 된 테스트 스위트를 활성화합니다.

설명

균형 그룹에는 비싼 구문이 필요하므로 유효한 입력을 간단한 형태로 줄이기 위해 노력하고 있습니다.

스테이지 1

+`a;?b
;

+출력이 변경 멈출 때까지 루프에서이 단계를 반복 망막을 알려줍니다. 그것도 일치 ab또는 a;b과로 대체합니다 ;. 몇 가지 경우를 고려해 봅시다.

  • 는 IF aS와 b문자열의의는 그 같은 방식으로 균형되지 않습니다 ()일반적으로 할 필요가 일부 a또는 b문자열에 있기 때문에 남아 ba, 또는 b;a하나 해결 될 수없고, a또는 b스스로 할 수 없습니다 어느 한 쪽. 모든 as 및 s를 제거하려면 각각의 오른쪽에 b해당하는 것이 b있어야합니다 a.
  • 만약 ab모든 중첩되지 않은 (예를 들어 우리가 같은 경우 abab또는를 aabaabbb) 우리가 여러 될 겁니다 ;(그리고 잠재적으로 일부 as와 b의) 첫 번째 반복 여러 찾을 수 있기 ab를 삽입들과 더 반복 보존한다 ;문자열 의 수

따라서 입력이 양식 인 경우에만 문자열에서 단일 을 끝 냅니다.anbn;

2 단계 :

^;$

결과 문자열에 단일 세미콜론 만 포함되어 있는지 확인하십시오. (내가 말할 때 주어진 정규식의 일치의 수를 계산 ", 사실은 의미"확인 "하지만 정규식으로 인해 앵커에 최대 한 번 일치 할 수 있기 때문에,이 제공하거나 0또는 1.)


25

하스켈, 31 바이트

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

목록 이해는 [c|c<-"ab",'a'<-s]하나의 캐릭터하게 'a''a'에서 s한 다음, 'b'각각 'a'의를 s. 상수일치 시키고 각 일치에 대한 출력을 생성하여 계산을 피합니다 .

이 문자열은 원래 문자열과 같은지 확인하고 원래 문자열은 비어 있지 않은지 확인합니다.


사랑 스럽습니다. Haskell이 목록 이해의 요소를 일관되고 매우 구체적인 방식으로 주문하는 것이 얼마나 유용한 지 종종 잊습니다.
Vectornaut

내 최선의 시도보다 훨씬 좋습니다 f=g.span id.map(=='a');g(a,b)=or a&&b==(not<$>a). 잘 했어.
Jules

와우, 나는 목록 이해에서 상수와 일치 할 수 있다는 것을 몰랐습니다!
rubik

16

Grime , 12 바이트

A=\aA?\b
e`A

온라인으로 사용해보십시오!

설명

첫 번째 줄은 A하나의 문자 a, 아마도 비 터미널 A및 하나의 문자와 일치 하는 비 터미널을 정의합니다 b. 두 번째 줄은 전체 입력 ( e)을 비 터미널과 비교합니다 A.

8 바이트 비경쟁 버전

e`\a_?\b

이 답변의 첫 번째 버전을 작성한 후 Grime를 업데이트 _하여 최상위 식의 이름으로 간주 했습니다. 이 솔루션은 위와 동일하지만 레이블 반복을 피합니다 A.


왜 J에서하지 않았습니까?
Leaky Nun

@LeakyNun 방금 Grime을 과시하고 싶었습니다. : P
Zgarb

이 언어를 만들었습니까?
Leaky Nun

@LeakyNun 예. 개발은 느리지 만 진행중입니다.
Zgarb

11

Brachylog , 23 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을 이용해 주셔서 감사합니다!
Leaky Nun

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
게시물에서 0아닌 것을 찾으십시오 . 그것은에있다 :)
Lynn

@Lynn 스펙은 유효한 언어에 대해서만 0이 아니라고 말하지 않습니까? 입력에 관한 것이 아닙니다.
Emigna

참된. 잘못 생각했습니다. 그러나 당신은 여전히 .M{J¹ÔQ0r당신을 위해 할 수 있습니다.
Emigna

@Emigna 감사합니다. 게시물을 수정했습니다.
Adnan

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'#~-:@#)

이것은 빈 문자열에 거짓을주는 데 올바르게 작동합니다. 오류가 잘못되었습니다.

이전 버전 :

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

증거와 설명

주 동사는 다음 세 가지 동사로 구성된 포크입니다.

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

즉, " <.길이 ( #)가 짧을수록 ( (-:'ab'#~-:@#)) 올바른 타인의 결과 ( )"를 의미합니다.

올바른 타인은 다음 과 같이 구성된 4 트레인 입니다.

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

k우리의 의견을 표현 하자 . 그러면 다음과 같습니다.

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

-:일치 연산자이므로 -:monadic fork 아래의 불일치에 대한 주요 테스트입니다 'ab' #~ -:@#.

포크의 왼쪽 타인은 동사이므로 상수 함수가됩니다. 따라서 포크는 다음과 같습니다.

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

포크의 오른쪽 타인의 -:길이 ( #)는 길이 ( )입니다 k. 관찰 #:

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

이제 이것은 k유효한 입력에서만 가능하므로 여기에서 수행됩니다. #홀수 길이의 문자열에 대한 오류 는 언어를 만족시키지 하므로 완료됩니다.

더 짧은 길이와 이것과 결합하여, 우리의 언어의 일부가 아닌 빈 문자열은 길이를 산출하고 0, 우리는 그것을 모두 끝냅니다.


나는 12 바이트를 사용하는 동안 2&#-:'ab'#~#오류를 피하고 0대신 출력하도록 수정했습니다 .
마일

@ 마일 매혹적인! 나는 그렇게 생각하지 않았습니다.
코너 오브라이언

빈 문자열을 처리합니까?
Zgarb

@ Zgarb는 그것을 고쳤다!
코너 오브라이언

9

들소 / YACC 60 (또는 29) 바이트

(YACC 프로그램의 컴파일은 두 단계이므로 일부를 포함하고 싶을 수도 있습니다. 자세한 내용은 아래를 참조하십시오.)

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

공식 문법으로 해석하는 것을 알고 있다면이 기능은 상당히 분명해야합니다. 파서는 허용 가능한 순서 뒤에 a 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명령 줄에 보고 됩니다. 구문 분석 함수를 정의하는 코드의 일부만 계산할 수 있다면 (두 번째 %%와 그 이후의 모든 것을 무시 ) 29 바이트를 얻습니다.


7

Perl 5.10, 35 17 바이트 ( -n 플래그 사용)

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

문자열이 as로 시작한 다음 bs에서 되풀이되도록 합니다. 두 길이가 동일한 경우에만 일치합니다.

바이트 수를 반으로 줄이고 정규 표현식의 재귀에 대해 조금 가르쳐 주신 Martin Ender 에게 감사드립니다 .

일치하면 전체 문자열을 반환하고 그렇지 않으면 아무것도 반환하지 않습니다.

여기 사용해보십시오!


비어 있지 않은 테스트 케이스를 포함하여 관리 할 수있는 가장 가까운 것은 18 바이트입니다 : $_&&=y/a//==y/b//(필수 -p), 비어 있지 않으면 &&16을 드롭 할 수 있습니다 ! 너무 가까이 ...
Dom Hastings

1
17 바이트를 더 할 수는 echo -n 'aaabbb'|perl -pe '$_+=y/a//==y/b//'있지만 다른 바이트를 옮길 수는 없습니다. 이것을 포기해야 할 수도 있습니다!
Dom Hastings

7

자바 스크립트, 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=생략 될 수있다.
Leaky Nun

함수 표현식이 유효한 제출입니까, 아니면 실제로 기능적이어야합니까?
Scimonster

함수는 유효한 제출입니다.
Leaky Nun

@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"과 같은 문자열에 잘못된 긍정을 제공한다는 점을 지적하고 싶습니다.
Jasmes

변경 (t+=2)t++++-1 바이트를 위해.
owacoder

@owacoder t++++는 유효한 C 코드가 아닙니다.
Jasmes

일부를 저장 t+=*s%2*2하고:*s*!1[s]
ugoren

매우 영리한 답변! 불행히도 입력 "ba"에 실패합니다 : ideone.com/yxixG2
Josh

4

망막 , 22 바이트

같은 언어로 된 또 다른 짧은 대답이 방금 나왔습니다 ...

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

온라인으로 사용해보십시오!

이것은 Martin Ender가 자세히 설명 하는 정규식의 밸런싱 그룹의 쇼케이스입니다 .

내 설명이 그것의 절반 가까이에 오지 않을 것이기 때문에, 나는 그 설명과 관련이 있고 설명하려고 시도하지 않을 것입니다. 그것이 그의 설명의 영광에 해를 끼칠 수 있기 때문입니다.


4

Befunge-93, 67 바이트

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

여기 사용해보십시오! 나중에 어떻게 작동하는지 설명 할 수 있습니다. 또한 차기 위해 조금만 더 골프를 칠 수도 있습니다.


3

MATL , 9 바이트

vHI$e!d1=

온라인으로 사용해보십시오!

비어 있지 않고 모든 항목이 0이 아닌 경우 출력 배열이 진실입니다. 그렇지 않으면 거짓입니다. 다음은 몇 가지 예 입니다.

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
그것은 진실에 대한 편리한 정의입니다. (제로가 아닌 요구 사항에 대해서는 알았지 만 비어 있지 않은 것은 아닙니다.)
Dennis

3

x86 기계 코드, 29 27 바이트

16 진 덤프 :

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'바이트를 반복 합니다. 첫 번째 루프는 카운터를 증가시키고 두 번째 루프는 카운터를 감소시킵니다. 이후에 다음 조건 사이에 비트 단위 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캐리 플래그가 설정 여부에 따라 FFh가 0으로 AL을 설정할 수 있습니다. 32 비트가 아닌 8 비트 결과로 끝나지만 2 바이트를 절약합니다.
Jules

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 당신은 대답에 그것을 게시해야합니다-그것은 내 것과 충분히 다르며, 나는 상당히 짧습니다!
anatolyg

3

루비, 24 바이트

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

(이것은 Ruby 형식 의 xnor의 훌륭한 아이디어 입니다. 다른 대답 은 실제로 저 자신을 생각해 낸 해결책입니다.)

이 프로그램은 변환의 입력을 받아, ab[그리고 ]각각과 평가.

유효한 입력은 중첩 배열을 형성하며 아무 일도 일어나지 않습니다. 불균형 식으로 인해 프로그램이 중단됩니다. Ruby에서 빈 입력은로 평가되며 nil, 메소드를 nil정의하지 않았기 때문에 충돌이 발생 *합니다.


3

Sed, 38 + 2 = 40 바이트

s/.*/c&d/;:x;s/ca(.*)bd/c\1d/;tx;/cd/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

자바 스크립트, 44 42

44가 여전히 똑같습니다. 44; (

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

재귀 외측을 제거함으로써 작동 ab재귀하지만 선택된 상기 내부 값을 이용 .+. ^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 error, extraneous input, mismatched 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대신에 1 바이트를 저장==98
Titus

2
61 바이트 솔루션은 "aaabab"과 같은 문자열에서 오 탐지를 제공합니다. ideone.com/nmT8rm
Jasmes

아 당신은 올바른 Jasmes입니다. 감사합니다. 나는 이것을 조금 다시 생각해야 할 것이다.
Josh

이 접근법을 사용하여 더 짧게 얻을 수 있는지 확실하지 않은 69 바이트 솔루션으로 되돌립니다.
Josh

3

R, 64 61 55 바이트, 73 67 바이트 (견고) 또는 46 바이트 (빈 문자열이 허용되는 경우)

  1. 다시 xnor의 답변이 재 작업되었습니다. 입력이 as와 bs의 문자열로 구성된다는 규칙에 의해 암시 되면 작동해야합니다. 표현식이 유효하고, 던지고 오류가 있거나 그렇지 않으면 NULL을 리턴합니다.

    if((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
    
  2. 입력이 강력하지 않고 가비지가 포함 된 경우 (예 :), aa3bb다음 버전을 고려해야합니다 ( TRUENull이 아닌 실제 테스트 경우에는 반환해야 함 ).

    if(length(y<-scan(,'')))is.null(eval(parse(t=chartr("ab","{}",y))))
    
  3. 마지막으로 빈 문자열이 허용되면 비어 있지 않은 입력 조건을 무시할 수 있습니다.

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

    다시 한번, 성공하면 NULL, 그 외의 다른 것.


나는 R을 모른다, 빈 입력 결과는 무엇입니까? (거짓이어야 함)
Titus

빈 입력을 테스트하는 더 짧은 방법이 없습니까?
Titus

버전 1 : 아무것도 없음 (올바른 입력 만 반환 NULL), 버전 2 : 아무것도 없음 (올바른 입력 만 반환 TRUE), 버전 3 (빈 문자열이 상태라고 가정하면 상태) : NULL. R은 통계적 객체 지향 언어로 경고없이 모든 것을 올바르게 입력합니다.
Andreï Kostyrka

이 (답 1)은 55 바이트로 더 향상 될 수 있습니다 :if((y<-scan(,''))>'')eval(parse(t=chartr('ab','{}',y)))
Giuseppe

3

Japt , 11 바이트

©¬n eȦUg~Y

온라인으로 사용해보십시오!

주는 하나 true또는 false그 이외에는, """"JS에서 falsy된다.

포장 풀기 및 작동 방식

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

Dennis의 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이 작동하지 않도록합니다.

편집

abab 사례에 대한 검사를 추가했습니다.


이것은 ba또는 같은 문자열에 잘못된 긍정을주지 abab않습니까?
Zgarb

예, 게시물이 차단되어서 사진을 볼 수 없으므로 게시물을 잘못 읽었습니다. 고치기!
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, 문자열로 생성 $x같이 half 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필터로 작동합니다.
Mathias R. Jessen

@ MathiasR.Jessen 프로덕션 코드에서 그렇습니다. 그러나 [0]입력이 하나만 주어지고 출력으로 진실 / 거짓 값이 하나만 필요하기 때문에 여기서 골프를 칠 수 있습니다. 빈 문자열은 거짓이고 비어 있지 않은 문자열은 진실이기 때문에 배열에 대해 필터링하고 입력 문자열을 다시 가져 오거나 아무것도 반환하지 않아 도전 과제 요구 사항을 충족시킵니다.
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
Leaky Nun

@LeakyNun 팁 주셔서 감사합니다! 작동 방식 / 이유를 설명 할 수 있습니까? Pyth를 사용한 것은 이번이 처음입니다
Cowabunghole

예를 들어, (논리적 주장의 채움)으로 +4확장+4Q
Leaky Nun

2

하스켈, 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

파이썬, 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 바이트


예, 람다는 이름을 지정할 필요가 없습니다.
Leaky Nun

lambda s:list(s)==sorted("ab"*len(s)//2)(Python 3)
Leaky Nun

lambda s:s=="a"*len(s)//2+"b"*len(s)//2(Python 3)
Leaky Nun

예, 게시하는 동안 깨달았습니다. lol, 명백한 해결책은 파이썬 2에서 더 짧습니다 :
KarlKastor

1
빈 사례를 배제하는 ''<대신에 할 수 있습니다 s and.
xnor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.