피터 린츠 (Peter Linz )의 인기 있고 필수적인 컴퓨터 과학 서적 인 정식 언어 및 오토마타 소개 에서 다음 공식 언어가 자주 언급됩니다.
주로이 언어는 유한 상태 오토마타로 처리 할 수 없기 때문입니다. 이 표현은 “언어 L은 ‘a’와 ‘b’의 수가 같고 0이 아닌 ‘a’와 ‘b’의 모든 문자열로 구성됩니다.
도전
문자열을 얻는 작업 프로그램 / 기능 쓰기 “A”의와 “B”를 포함하는 유일한 s의 입력과 같은 수익을 / 진리 값을 출력 이 문자열이 있으면 말, 유효 공식 언어 L.
-
프로그램은 네트워크, 외부 프로그램 등을 포함한 외부 계산 도구를 사용할 수 없습니다. 쉘은이 규칙에서 예외입니다. Bash는 예를 들어 명령 줄 유틸리티를 사용할 수 있습니다.
-
프로그램은 “논리적”방식으로 결과를 반환 / 출력해야합니다. 예 : 0 대신 “10”, “경고음”, stdout 등으로 출력. 자세한 내용은 여기를 참조하십시오.
-
표준 코드 골프 규칙이 적용됩니다.
이것은 code-golf 입니다. 바이트 단위의 최단 코드가 이깁니다. 행운을 빕니다!
확실한 테스트 사례
"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"
답변
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.
답변
파이썬 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"*128
1 바이트 이상이 필요합니다 . 이것을 지적 해준 isaacg에게 감사합니다.
답변
레티 나 , 12 바이트
이 솔루션을 독립적으로 찾은 FryAmTheEggman에게 감사의 말을 전합니다.
+`a;?b
;
^;$
1
유효한 입력을 위해 인쇄 합니다 0
.
온라인으로 사용해보십시오! 첫 번째 줄은 줄 바꿈으로 구분 된 테스트 스위트를 활성화합니다.
설명
균형 그룹에는 비싼 구문이 필요하므로 유효한 입력을 간단한 형태로 줄이기 위해 노력하고 있습니다.
스테이지 1
+`a;?b
;
는 +
출력이 변경 멈출 때까지 루프에서이 단계를 반복 망막을 알려줍니다. 그것도 일치 ab
또는 a;b
과로 대체합니다 ;
. 몇 가지 경우를 고려해 봅시다.
- 는 IF
a
S와b
문자열의의는 그 같은 방식으로 균형되지 않습니다(
및)
일반적으로 할 필요가 일부a
또는b
문자열에 있기 때문에 남아ba
, 또는b;a
하나 해결 될 수없고,a
또는b
스스로 할 수 없습니다 어느 한 쪽. 모든a
s 및 s를 제거하려면 각각의 오른쪽에b
해당하는 것이b
있어야합니다a
. - 만약
a
과b
모든 중첩되지 않은 (예를 들어 우리가 같은 경우abab
또는를aabaabbb
) 우리가 여러 될 겁니다;
(그리고 잠재적으로 일부a
s와b
의) 첫 번째 반복 여러 찾을 수 있기ab
를 삽입들과 더 반복 보존한다;
문자열 의 수
따라서 입력이 양식 인 경우에만 문자열에서 단일 을 끝 냅니다.anbn
;
2 단계 :
^;$
결과 문자열에 단일 세미콜론 만 포함되어 있는지 확인하십시오. (내가 말할 때 주어진 정규식의 일치의 수를 계산 “, 사실은 의미”확인 “하지만 정규식으로 인해 앵커에 최대 한 번 일치 할 수 있기 때문에,이 제공하거나 0
또는 1
.)
답변
하스켈, 31 바이트
f s=s==[c|c<-"ab",'a'<-s]&&s>""
목록 이해는 [c|c<-"ab",'a'<-s]
하나의 캐릭터하게 'a'
각 'a'
에서 s
한 다음, 'b'
각각 'a'
의를 s
. 상수 를 일치 시키고 각 일치에 대한 출력을 생성하여 계산을 피합니다 .
이 문자열은 원래 문자열과 같은지 확인하고 원래 문자열은 비어 있지 않은지 확인합니다.
답변
Grime , 12 바이트
A=\aA?\b
e`A
설명
첫 번째 줄은 A
하나의 문자 a
, 아마도 비 터미널 A
및 하나의 문자와 일치 하는 비 터미널을 정의합니다 b
. 두 번째 줄은 전체 입력 ( e
)을 비 터미널과 비교합니다 A
.
8 바이트 비경쟁 버전
e`\a_?\b
이 답변의 첫 번째 버전을 작성한 후 Grime를 업데이트 _
하여 최상위 식의 이름으로 간주 했습니다. 이 솔루션은 위와 동일하지만 레이블 반복을 피합니다 A
.
답변
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
답변
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 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .