산악입니까?


29

도전

이 도전에있어서, 산줄 M: x(Mx)*은 각 생산에서 모든 x가 동일한 문자 인 문법 규칙을 따르는 것입니다 . 들여 쓰기를하면 산줄이 다음과 같이 보일 수 있습니다.

A
 B
  C
   D
  C
   E
    F
   E
  C
 B
A

보시다시피, 측면에서 산처럼 보입니다.

공식적인 정의

  • 모든 단일 문자 a는 산악입니다.
  • 경우 S산악 문자열과 a문자는 다음 aSa병치는 문자열 연결을 나타내며, 산악입니다.
  • 경우 aSaaTa산악 문자열, 다음 aSaTa산악 문자열입니다. 이 규칙은이 패턴이 여러 번 반복된다는 것을 의미합니다. (즉 aSaTaUa, aSaTaUaVa, aSaTaUaVaWa... 모든 산이 있습니다.)

예를 들어 홀수 길이의 회문은 모두 산악입니다.

t
 a
  c
   o
  c
 a
t

qwertytrasdfdgdsarewqjklkjq 덜 간단한 예입니다.

q
 w
  e
   r
    t
     y
    t
   r
    a
     s
      d
       f
      d
       g
      d
     s
    a
   r
  e
 w
q
 j
  k
   l
  k
 j
q

출력 예

a                           ==> true
aaa                         ==> true
mom                         ==> true
tacocat                     ==> true
qwertytrasdfdgdsarewqjklkjq ==> true
wasitacaroraratisaw         ==> true
abcbcbcbcba                 ==> true
aaaaabcbbba                 ==> true

<empty string>              ==> false
aa                          ==> false
pie                         ==> false
toohottohoot                ==> false
asdfdghgfdsa                ==> false
myhovercraftisfullofeels    ==> false

규칙

  • 이것은 의사 결정 문제이므로, 정확하고 일관되며 모호하지 않으며 프로그램이 유한 한 시간 안에 종료되는 한 true 또는 false의 표현은 유효한 출력입니다. 솔루션에 출력 규칙을 명시하십시오.
    • 입력 문자열이 무엇인지 알 필요없이 출력이 참인지 거짓인지를 결정하는 것은 쉽지 않습니다. 이것이 사실 또는 허위 출력이 일정해야 함을 의미하지는 않지만 "줄이 산악인 경우 산악 줄을 인쇄하고 산악인이 아닌 경우 비열 줄을 인쇄하는"규칙은 명백한 이유로 금지 된 허점입니다.
    • 다른 한편으로, "거짓에 대한 예외를 던져서 참으로 빠져 나간다"와 같은 규칙은 "단일 문자를 참으로 그리고 다른 것을 거짓으로 인쇄한다"
  • 이것은 코드 골프이므로 가장 짧은 프로그램이 승리합니다.
  • 표준 허점은 금지되어 있습니다.

4
aaa동일한 문자를 여러 레벨에서 사용해야 하는 테스트 케이스 가 좋습니다.
Martin Ender

확실 wasitacaroraratisaw합니까? 그것은 나에게 mountanous 보인다
톤 Hospel에게

wasitacaroraratisaw실제로 산악 AFAICT
ETHproductions

그렇습니다. 나는 단지 '거의 회문'을 찾으려고했지만 우연히 산악 현을 발견했다.
Beefster

2
문자열을 첫 번째 문자로 분할하면 쉽게 해결할 수 있다고 생각했지만 aaa작동하지 않는 경우가 있습니다.
xnor

답변:




6

펄, 22 바이트

포함 +을 위해p

perl -pe '$_=/^((.)((?1)\2)*)$/' <<< abcbcbcbcba

1을 true로 인쇄하고 false를 인쇄하지 않습니다.


5

Brain-Flak , 78 바이트

({()<<>(([{}]({}))([{}]({}))<>[({}<>)])>{[()()]((<()>))}<{}{}{}<>>}(())){{}}{}

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

1을 true로 인쇄하고 false를 인쇄하지 않습니다.

산악 단어를 확인하려면 가능할 때마다 단어가 "아래로"내려가는 것으로 충분합니다.



3

프롤로그 (SWI) , 29 바이트

a-->[X],+X.
+X-->[];a,[X],+X.

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

이 프로그램은 a//0산악 문자열 인 모든 문자열 (문자 목록)과 일치 하는 DCG 규칙 을 정의 합니다.

설명

이 프로그램을 위해 나는이 도전에 설명 된 것보다 산악 문자열에 대한 약간 다른지만 해당 정의를 사용 : 산악 문자열이 문자 c뒤에 숫자와 산악 문자열 (영 수) c그 끝에 압정으로 고정. 더 간결한 정규식 유래 표기법에서 산이 문자열 패턴과 일치해야 산이 문자열이며 괄호 안의 식 0 회 이상 반복되는 것을 의미한다. 각 문자는 같은 문자 여야 하지만 각각 동일한 산악 줄일 필요는 없습니다.c(Mc)*M*cM

동등성 증명

챌린지의 규칙 1과 2는 Mc각각 0 번과 1 번 발생하는 규칙과 동일합니다 .

경우에 산악 캐릭터는 것을 Mc발생 n시간 n > 1문자열로 다시 작성할 수 있습니다 다음 cMcSc경우 S후자 n - 1시간이 Mc지난 제외 발생 c(주 M반드시 다른 동일한되지 않은 산악 문자열과 M). M산악 끈 이기 때문에 규칙 2에 따르면 cMc산악 끈이어야합니다. 어느 S경우가있는 산악 문자열 cSc산악 문자열 또는 S으로 다시 작성할 수 있습니다 cMcTcT후자 n - 2Mc마지막을 제외하고 발생은 c. 이 추론은 산이 확실하지 않을 때까지 계속 적용 할 수 있습니다.Mc한번은 산이 많을 것입니다. 따라서 이후로는 cMc산악과 경우입니다 cMccM'c다음 산악 있습니다 cMcM'c해야 산악 전체 문자열이 산악해야합니다.

반대로, 그리고 산악이 있는 끈의 cScTc경우 cSc, 규칙 2 또는 규칙 3에 의한 산악 끈입니다. 규칙 2에 의한 산악 끈인 경우에는 산악 끈 이어야합니다. 그것이 규칙 3에 의한 산악 끈이라면 어디에서 그리고 산악 끈 형태이어야합니다 . 긴 보낸 사람 과 여전히보다 적어도 두 글자 짧아야합니다 규칙 3 규칙 3가 사이의 각 문자열의 응용 프로그램에 한정된 수의 후 다음 적용 할 최소한 5 문자를 필요로하며, 산악이어야 규칙 3의 응용 프로그램에서 선택 s의 끈. 동일한 추론을 적용 할 수 있습니다cTccScScSccUcVccUccVccUccVccScccTc 따라서 끈은 나의 정의에 의해 산이 많다.

내 정의와 일치하는 모든 문자열은 산악이고 내 정의는 모든 산악 문자열과 일치하기 때문에 질문에 주어진 것과 동일합니다.

코드 설명

a//0첫 번째 줄에 정의 된 전체 DCG 규칙은 모든 산악 문자열과 일치합니다. +//1DCG 규칙 (술어처럼, DCG 규칙 운영자 이름을 부여 할 수 있습니다 라인이에 정의)은, 그 인수로 전달 된 문자와 0 개 이상의 산악 문자열의 순서로 구성되어 모든 문자열과 일치하는 X그들의 끝에 압정으로 고정을 . 또는 정규식-처럼 나는 위에서 사용 된 표기법, 빌려 a//0일치 c(Mc)*하지만, 실제로 일치의 작업 아웃소싱 (Mc)*+//1있는 소요 c인수로를 X.

코드는 한 줄씩 다음과 같이 동작합니다.

a-->[X],+X.

이 줄은 DCG 규칙을 정의합니다 a. [X]상태 첫 문자는 현재 정의되지 않은 변수와 동일해야한다는 X. 결과적으로 X첫 번째 문자와 동일하게 설정됩니다. 그러면 +X문자열의 나머지 부분이 인수로 설정된 +//1문자와 DCG 규칙 과 일치해야합니다 X.

+X-->[];a,[X],+X.

이 줄은 +//1DCG 규칙을 정의합니다 . 는 ;을 나타냅니다 또는 프롤로그에있는 문자열 중 하나와 일치 할 수 있다는 것을 의미 []a,[X],+X. 는 []빈 문자열이 그렇게 표현 +//1항상 빈 문자열을 일치시킬 수있다. 문자열이 비어 있지 않으면 문자열의 시작이 일치 a//0해야하며 산악 문자열이어야합니다. 그런 다음 문자 X가 설정되어 있어야합니다. 마지막으로 나머지 문자열이 일치해야합니다 +X.


2

껍질 , 15 바이트

εωφΓ§?t·:⁰`(=←t

온라인으로 사용해보십시오! 유형 유추는 약 40 초가 걸리므로 인내심을 가지십시오.

설명

εωφΓ§?t·:⁰`(=←t  Implicit input, say s = "abacdca"
 ω               Apply until fixed point is reached
  φ              this self-referential anonymous function (accessed with ⁰):
                  Argument is a string x.
   Γ              Deconstruct x into head h and tail t.
    §?t·:⁰`(=←t   Call this function on h and t. It is interpreted as §(?t)(·:⁰)(`(=←t)).
                  § feeds h to (·:⁰) and (`(=←t)), and calls (?t) on the results.
                  The semantics of ? cause t to be fed to all three functions.
          `(=←t   First, check whether h equals the first element (←) of the tail of t.
     ?t           If it does (e.g. if h='a' and t="bacdca"), return tail of t ("acdca").
                  Otherwise (e.g. if h='b' and t="acdca"),
       · ⁰        call the anonymous function recursively on t: "aca"
        :         and prepend h to the result: "baca".
                 Final result is "a".
ε                Is it a 1-element string? Implicitly print 0 or 1.

아이디어는 반복적 형태의 문자열을 대체하는 것입니다 aba함께 a이 더 이상 가능하다 때까지. 입력이 단일 문자 문자열 ( ε테스트 대상) 인 경우에만 입력이 산이 많습니다. 가장 위험한 상황은 다음과 같이 문자열이있을 때입니다 aba.

a
 b
  a
   c
  a
   d
  a
 b
a

다행히도 항상 하나로 변환 할 수 있습니다.

a
 b
a
 c
a
 d
a
 b
a

나는 true경우에 대해 단일 문자를 반환하고 그렇지 않으면 "일관성"이 아니라고 생각합니다.
Jonathan Allan

실제로 그것은 허점 일 것이다.
Jonathan Allan

@JonathanAllan 단일 문자 대 다른 문자열은 특히 진실성과 관련이 거의 없기 때문에 나에게 너무 희미한 것처럼 보입니다 (허크에서는 빈 문자열 만 거짓입니다).
Zgarb

네은 "어떤 표현은"분명히 너무 진보적이다 - 나는 :) 영업 Uner에 댓글을 달았
조나단 앨런

좀 더 창의적인 솔루션을 허용하기 때문에 실제로 정의가 자유롭기를 원합니다. 문맥이 없어도 모호하지 않아야한다고 덧붙일 수도 있지만 문구를 '일관된'에서 '명확한'으로 변경했습니다. 마찬가지로 입력 문자열이 결과가 참인지 거짓인지 모른 채 명확해야합니다. 따라서 true에 대한 단일 문자와 false에 대한 단일 문자는 괜찮습니다.
Beefster


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.