잘 연결된 도전


40

지루할 때 때때로하는 활동은 일치하는 쌍으로 두 개의 문자를 쓰는 것입니다. 그런 다음이 문자들을 연결하기 위해 선을 그립니다. 예를 들어 작성 하고 다음과 같이 선을 그립니다.abcbac

첫 번째 링크

아니면 나는abbcac

두 번째 링크

이 선을 그리면 청크 주위에 닫힌 고리를 그려서 루프가 방금 그린 선과 교차하지 않도록합니다. 예를 들어 첫 번째 루프에서 우리가 그릴 수있는 유일한 루프는 전체 주위에 있지만 두 번째 루프에서는 (또는 다른 모든 것) 주위에 루프를 그릴 수 있습니다.b

루프 그린

잠시 동안이 문제를 해결하면 닫힌 문자열에 첫 번째 예제와 같이 문자가 모두 또는 전혀 포함되지 않도록 일부 문자열 만 그릴 수 있음을 알 수 있습니다. 우리는 그러한 문자열을 잘 연결된 문자열이라고 부릅니다.

일부 문자열은 여러 가지 방법으로 그릴 수 있습니다. 예를 들어 는 다음 두 가지 방법으로 그릴 수 있습니다 (세 번째는 포함되지 않음).bbbb

방법 1 또는 방법 2

이러한 방법 중 하나를 그려서 닫힌 루프가 줄을 교차하지 않고 일부 문자를 포함하도록 만들 수 있으면 문자열이 제대로 연결되지 않은 것입니다. ( 는 잘 연결되어 있지 않습니다)bbbb

태스크

당신의 임무는 잘 연결된 문자열을 식별하는 프로그램을 작성하는 것입니다. 입력은 모든 문자가 짝수 번 나타나는 문자열로 구성되며 출력은 문자열이 제대로 연결되어 있고 다른 하나는 다른 두 가지 일관된 값 중 하나 여야합니다.

또한 프로그램은 잘 연결된 문자열 의미 여야합니다

  • 모든 캐릭터는 프로그램에서 짝수 번 나타납니다.

  • 전달 될 때 진실한 가치를 산출해야합니다.

프로그램은 인쇄 가능한 ASCII 또는 자체 프로그램의 문자로 구성된 문자열에 대해 올바른 출력을 생성 할 수 있어야합니다. 각 문자가 짝수 번 나타납니다.

답은 더 적은 바이트가 더 좋은 점수 인 바이트 단위의 길이로 점수가 매겨집니다.

힌트

연속 된 비어 있지 않은 엄격한 하위 문자열이 존재하면 각 문자열이 해당 하위 문자열에 짝수 번 표시되도록 문자열이 제대로 연결되지 않습니다.

테스트 사례

abcbac -> True
abbcac -> False
bbbb -> False
abacbc -> True
abcbabcb -> True
abcbca -> False

1
테스트 사례 : abcbca -> False.
Ørjan Johansen

나는 당신의 힌트에 불필요한 내용이 포함되어 있다고 생각합니다 there.
Jonathan Frech

2
명확하게 : 문자열에 모든 짝수의 문자가 있는지 여부는 문자열이 잘 연결된 문자열인지 여부와 관련이 없습니다. 이 요구 사항은 프로그램의 소스 코드에만 적용됩니다. 프로그램은 임의의 문자의 총 개수가 홀수 인 입력 된 문자열에 대해 정의되지 않은 동작을 가질 수 있기 때문에 이것은 의미론의 문제 일뿐입니다.
데드 코드

어떤 종류의 문자를 입력 할 수 있습니까?
xnor

@ xnor 나는 그것을 도전에 추가했다. 잘하면 그것은 그것을 정리합니다.
밀 마법사

답변:


19

정규식 (ECMAScript를 .NET 2018) 140 126 118 100 98 82 바이트

^(?!(^.*)(.+)(.*$)(?<!^\2|^\1(?=(|(<?(|(?!\8).)*(\8|\3$){1}){2})*$).*(.)+\3$)!?=*)

이 코드는 ^\1lookahead의 왼쪽에 남아 있기 때문에 98 바이트 버전보다 훨씬 느립니다 . 속도를 회복하는 간단한 스위처에 대해서는 아래를 참조하십시오. 그러나 이로 인해 아래의 두 TIO는 이전보다 작은 테스트 사례를 완료하는 것으로 제한되며 .NET은 자체 정규식을 확인하기에는 너무 느립니다.

온라인으로 사용해보십시오! (ECMAScript 2018)
온라인으로 사용해보십시오! (.그물)

18 바이트 (118 → 100)를 삭제하기 위해 Neil의 정규 표현식 에서 부당한 룩을 훔쳐서 부정적인 lookbehind 안에 미리보기를 넣지 않아도됩니다 (80 바이트 무제한 정규 표현식). 고마워, 닐!

jaytea 의 아이디어 덕분에 69 바이트 무제한 정규 표현식으로 인해 16 바이트 (98 → 82)가 더 많이 떨어졌을 때 그것은 더 이상 사용되지 않습니다 ! 훨씬 느리지 만 골프입니다!

것을 참고 (|(잘 연결된 정규식을위한 작전이 만드는 결과가없는 아주 천천히 .NET에서 평가한다. 너비가 0 인 선택적 일치는 일치 하지 않는 것으로 취급 되므로 ECMAScript에서는이 효과가 없습니다 .

ECMAScript는 어설 션에 대한 한정자를 금지하므로 요구 사항을 수행하기가 더 어려워집니다. 그러나이 시점에서 골프는 너무 제한적이어서 특정 제한을 해제해도 더 이상의 골프 가능성이 열리지 않을 것이라고 생각합니다.

추가 문자가 없으면 제한을 통과하는 데 필요합니다 ( 101 69 바이트).

^(?!(.*)(.+)(.*$)(?<!^\2|^\1(?=((((?!\8).)*(\8|\3$)){2})*$).*(.)+\3))

속도는 느리지만이 간단한 편집 (2 바이트 만 더)은 모든 손실 속도를 회복합니다.

^(?!(.*)(.+)(.*$)(?<!^\2|(?=\1((((?!\8).)*(\8|\3$)){2})*$)^\1.*(.)+\3))

^
(?!
    (.*)               # cycle through all starting points of substrings;
                       # \1 = part to exclude from the start
    (.+)               # cycle through all ending points of non-empty substrings;
                       # \2 = the substring
    (.*$)              # \3 = part to exclude from the end
    (?<!               # Assert that every character in the substring appears a total
                       # even number of times.
        ^\2            # Assert that our substring is not the whole string. We don't
                       # need a $ anchor because we were already at the end before
                       # entering this lookbehind.
    |                  # Note that the following steps are evaluated right to left,
                       # so please read them from bottom to top.
        ^\1            # Do not look further left than the start of our substring.
        (?=
            # Assert that the number of times the character \8 appears in our
            # substring is odd.
            (
                (
                    ((?!\8).)*
                    (\8|\3$) # This is the best part. Until the very last iteration
                             # of the loop outside the {2} loop, this alternation
                             # can only match \8, and once it reaches the end of the
                             # substring, it can match \3$ only once. This guarantees
                             # that it will match \8 an odd number of times, in matched
                             # pairs until finding one more at the end of the substring,
                             # which is paired with the \3$ instead of another \8.
                ){2}
            )*$
        )
        .*(.)+         # \8 = cycle through all characters in this substring
        # Assert (within this context) that at least one character appears an odd
        # number of times within our substring. (Outside this negative lookbehind,
        # that is equivalent to asserting that no character appears an odd number
        # of times in our substring.)
        \3             # Skip to our substring (do not look further right than its end)
    )
)

가변 길이 lookbehind로 변환하기 전에 분자 lookahead ( 103 69 바이트)를 사용하여 작성했습니다 .

^(?!.*(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$))

^
(?!
    .*(?*(.+)(.*$))       # cycle through all non-empty substrings;
                          # \1 = the current substring;
                          # \2 = the part to exclude from the end
    (?!                   # Assert that no character in the substring appears a
                          # total even number of times.
        ^\1$              # Assert that our substring is not the whole string
                          # (i.e. it's a strict substring)
    |
        (?*(.)+.*\2$)    # \3 = Cycle through all characters that appear in this
                          # substring.
        # Assert (within this context) that this character appears an odd number
        # of times within our substring.
        (
            (
                ((?!\3).)*
                (\3|\2$)
            ){2}
        )*$
    )
)

그리고 정규 표현식 자체를 잘 연결하기 위해 위의 정규 표현식을 변형하여 사용했습니다.

(?*(.+)(.*$))(?!^\1$|(?*(.)+.*\2$)((((?!\3).)*(\3|\2$)){2})*$)\1

와 함께 사용 regex -xml,rs -o하면 짝수 개의 모든 문자 (있는 경우)가 포함 된 입력의 엄격한 하위 문자열을 식별합니다. 물론, 나는 이것을 위해 정규식이 아닌 프로그램을 작성할 수 있었지만 그 재미는 어디에 있습니까?


8
그것이 여전히 골프 중입니다
ASCII 전용

@ASCII 전용이며 여전히 골프 중입니다 ...
Quintec

11

젤리, 20 바이트

ĠẈḂẸẆṖÇ€Ạ
ĠẈḂẸ
ẆṖÇ€Ạ

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

첫 번째 줄은 무시됩니다. 모든 캐릭터가 짝수 번 나타나는 조건을 만족시키기 위해서만 있습니다.

다음 줄은 먼저 Ġ값을 기준으로 지수를 정리합니다. 그런 다음 결과 목록 ( ) 에서 각 하위 목록의 길이를 가져 오면 각 문자가 나타나는 횟수를 얻습니다. 이 중 하나 고르지 않은지 확인하기 위해 각 카운트 의 마지막 값을 가져와 xist가 참 (0이 아닌) 값 인지 여부를 묻습니다 .

따라서이 도우미 링크는 하위 문자열에 동그라미를 표시 할 수 없는지 여부를 반환합니다 .

메인 링크에서, 우리는 입력의 모든 하위 문자열 ( )을 가져 오고 마지막 문자열을 제거하고 (전체 문자열에 동그라미를 칠 수 있는지 여부를 확인하지 않음 Ç) ach 하위 문자열 에서 도우미 링크 ( )를 실행합니다 . 그런 다음 ll 하위 문자열에 동그라미를 표시 할 수 없는지 여부가 결정 됩니다.


그래, 좋아, 이것은 불행하게도, 그것은 지루한 ... :( 너무 내 해결책이 될 수 있지만 것
에릭 Outgolfer

8

J , 34 바이트

2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\

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

FrownyFrog 덕분에 -8 바이트

기발한

J , 42 바이트

(*#'.,012&|@~#')=1#.[:,([:*/0=2&|@#/.~)\.\

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

설명

(*#'.,012&|@~#') = 1 #. [: , ([: */ 0 = 2&|@#/.~)\.\

(*#'.,012&|@~#')                                       NB. this evaluates to 1
                                                       NB. while supplying extra
                                                       NB. chars we need.  hence...
                 =                                     NB. does 1 equal...
                   1 #.                                NB. the sum of...
                        [: ,                           NB. the flatten of...
                             (                  )\.\   NB. the verb in parens applied
                                                       NB. to every suffix of every
                                                       NB. prefix, ie, all contiguous 
                                                       NB. substrings
                             ([: */ 0 = 2&|@#/.~)      NB. def of verb in paren:
                                             /.~       NB. when we group by each
                                                       NB. distinct char...
                              [: */                    NB. is it the case that
                                                       NB. every group...
                                           @#          NB. has a length...
                                    0 = 2&|            NB. divisible by 2...

1
@Deadcode 처리하는 것은 다른 모든 하위 문자열과 마찬가지로 전체 문자열에 대해 반대 테스트를 수행하는 것이므로 대부분의 솔루션에서 제외시키는 것이 안전 합니다. 로 테스트 abc하면 Perl 항목 만 "실패"하지 않습니다. (하지만 다른 문제가 있습니다.)
Ørjan Johansen

1
@ ØrjanJohansen 당신은 오해했습니다. 나는 홀수의 모든 문자가있는 문자열 (잘 연결 된 문자열이 아닌 프로그램의 소스 코드 만 실격)은 잘 연결 될 수 있으며이 프로그램은 잘 연결된 문자열 중 일부에 대해 거짓을 반환합니다. 질문은이 정의되지 않은 동작을 명시 적으로 허용하므로 프로그램이 유효합니다. 조나, 나는 당신의 프로그램이 이것을하는 것이 정말로 흥미 롭다고 생각한다. 그리고 나는 당신이 이런 식으로 작동하는 방법을 알아 낸 것에 감탄한다. 나는 설명을 좋아할 것이다. 이런 종류의 프로그래밍은 나에게 완전히 외계이므로 주석과 코드를 이해하지 못합니다.
Deadcode

1:@':.,02|~*'=1(#.,)*/@(0=2|#/.~)\.\
FrownyFrog

1
2:@':.,|~*'>1(#.,)*/@(1>2|#/.~)\.\또한 유효한 것 같습니다
FrownyFrog

6

Python 3.8 (시험판) , 66 바이트

lambda l,b={id}:len({str(b:=b^{c})for(c)in l})<len(l)#,<^fmnost{}#

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

과제 표현의 시대가 다가 왔습니다. Python 3.8에 PEP 572가 포함되어 있으면 골프는 결코 같을 수 없습니다. 초기 개발자 미리보기 3.8.0a1을 여기에 설치할 수 있습니다 .

대입 식을 사용 :=하면 해당 값으로 평가하면서 변수 인라인에 대입 할 수 있습니다 . 예를 들어, (a:=2, a+1)gives (2, 3). 이것은 재사용을 위해 변수를 저장하는 데 사용될 수 있지만 여기서는 한 걸음 더 나아가서 이해의 누적기로 사용합니다.

예를 들어이 코드는 누적 합계를 계산합니다. [1, 3, 6]

t=0
l=[1,2,3]
print([t:=t+x for x in l])

각각이 목록 이해를 통과 할 때 누적 합계 t가 증가 x하고 새 값이 이해에 의해 생성 된 목록에 어떻게 저장되는지 유의하십시오 .

마찬가지로 b:=b^{c}문자 세트를 업데이트하여 문자 b포함 여부를 토글 c하고 새 값인으로 평가합니다 b. 따라서 코드 [b:=b^{c}for c in l]는 문자 c를 반복하고 l비어 있지 않은 각 접두사에서 홀수 번 보이는 문자 집합을 누적합니다.

이 목록은 대신에 이해력을 설정하고 길이가 길이보다 작은 지 확인하여 중복이 있는지 확인합니다 s. 이는 일부 반복이 축소되었음을 의미합니다. 그렇다면 반복은 s그 시간 사이 에 보이는 부분 에서 모든 문자가 짝수의 숫자를 만나서 문자열이 잘 연결되지 않았 음을 의미합니다. 파이썬은 해시 불가능한 세트 세트를 허용하지 않으므로 내부 세트는 대신 문자열로 변환됩니다.

세트 b는 선택적 인수로 초기화되고 함수 범위에서 성공적으로 수정됩니다. 이것이 함수를 재사용 할 수 없게 될까 걱정했지만 실행 사이에 재설정되는 것처럼 보입니다.

소스 제한의 경우 쌍을 이루지 않은 문자는 끝에 주석으로 채워집니다. 쓰지 for(c)in l않고 쓰는 것은 for c in l무료로 여분의 parens를 취소합니다. 우리 id는 초기 세트에 넣었 습니다. b어떤 세트로도 시작할 수 있기 때문에 무해합니다. 그러나 빈 세트는 {}파이썬이 빈 사전을 만들 것이므로 쓸 수 없습니다 . 문자 id페어링이 필요한 문자 중 하나 이므로 함수를 id여기에 넣을 수 있습니다 .

이 코드는 부정 부울을 출력하므로 올바르게 제공 False됩니다.



5

파이썬 2 , 74 바이트

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)

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

문자열을 반복하면서 P지금까지 홀수 번 표시된 문자 세트를 추적 합니다. 이 목록 d은의 모든 과거 값을 저장 P하며 현재에 P이미 표시되어있는 경우 d해당 시간 이후에 표시된 문자에서 각 문자가 짝수 번 나타남을 의미합니다. 그렇다면 전체 입력을 통과했는지 확인하십시오.있는 경우 전체 문자열이 예상대로 쌍을 이루므로 수락하고 그렇지 않으면 거부하십시오.

이제 소스 제한에 대해 페어링이 필요한 캐릭터는 아래에 밑줄이있는 다양한 무해한 장소에 채워집니다.

bmn0=f=lambda s,P={0},d=[]:s<" "if(P in d)else+f(s[f<s:],P^{s[0^0]},[P]+d)
_____              _              _      _    _    ___        ___    

f<s평가 0오프 페어링 동안 f함수 이름은 또한 인을 활용 f이 정의되어 있도록 (함수가 호출되는 시간.)를가 0^0흡수 ^기호.

0에서는 P={0}파이썬에서 : 불행한 일이다 {}빈 딕셔너리보다는 우리가 원하는대로 빈 세트로 평가하고, 여기에 우리가 아닌 문자 요소에 넣을 수 있습니다 그것은 해가 될 것입니다. 그래도 여분의 것을 보지 못하고 2 바이트의 비용을 들이고 0에 넣었습니다 bmn0. 함수가 정의 될 때 초기 인수는 평가되므로, 우리가 정의한 변수는 여기에 넣을 수 없습니다.


4

펄 6 , 76 바이트

*.comb[^*X+(^*).map(^*)].grep({$_&[&]($_)}).none.Bag{*}.none%2#*^+XBob2rec%#

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

진실 / 거짓 값으로 부울 수있는 없음 접합의 없음 접합을 반환하는 What Lambda. ?그래도 반환 결과를 무효화 하는 것을 제거하지 않는 것이 좋습니다 . 그렇지 않으면 출력이 다소 집니다.

이 용액 인해 여러 관련 기능을 예를 들면, 연결이 해제되기 때문에, 필요한 것보다 약간 더 복잡하다 .., all, >>, %%등을 제한없이 소스, 이는 43 바이트 일 수있다 :

*.comb[^*X.. ^*].grep(?*).one.Bag{*}.all%%2

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

설명:

*.comb                     # Split the string to a list of characters
      [^*X+(^*).map(^*)]   # Get all substrings, alongside some garbage
                        .grep({$_&[&]($_)})        # Filter out the garbage (empty lists, lists with Nil values)
                                           .none                 # Are none of
                                                .Bag{*}          # The count of characters in each substring
                                                       .none%2   # All not divisible by 2

                                               #*^+XBob2rec%#    And garbage to even out character counts

3

Perl 5 -p, 94, 86, 78 바이트

m-.+(?{$Q|=@q&grp,$\|=$&eq$_^!grep+/^/&(@m=$g=~/\Q$_/g),($g=$&)=~/./g})(?!)-}{

연결이 잘되어 있으면 출력 0, 그렇지 않으면 출력 0

78 바이트

86 바이트

94 바이트

작동 원리

  • -p}{출력 트릭을 종료 $\말에
  • m-.+(?{.. })(?!)-, 비어 있지 않은 모든 하위 문자열에 대해 코드를 실행하려면 ( .+전체 문자열을 먼저 일치시키고 강제로 실패 하여 (?{.. })백 트랙 사이에서 코드를 실행 한 후)(?!)
  • $Q|=@q&grp, 소스 제한으로 인한 쓰레기
  • $\|=정수 비트 단위 또는 대입, 거의 1 $\이있는 경우 1 (참)이며 기본적으로 비어 있습니다 (거짓)
  • $&eq$_sbustring이 전체 문자열 인 경우 ^"홀수 문자 발생 없음"으로 비트 단위 xored
  • ($g=$&)=~/./g일치하는 부분 문자열을 $g(다음 정규식 일치 후에 무시하기 때문에) 에 복사하고 부분 문자열 의 문자 배열을 반환합니다.
  • /^/ 1로 평가되는 쓰레기
  • grep&(@m=$g=~/\Q$_/g),하위 문자열의 각 문자에 대해 1 은 문자 $g자체 를 일치 시키는 배열을 가져 옵니다. 스칼라의 배열은 크기를 평가 grep하고 이상한 발생으로 chracter를 필터링하는 1&x것은 다음과 같습니다.x%2==1

나는 이것이 소스 제한을 만족시키지 않는다고 생각한다. 예를 들어 홀수 괄호를
세어 본다

@ msh210 그게 아닌가요? 짝수의 숫자가 있다면, 그것은 잘 연결되어 있지 않습니다
Quintec

잘 연결되고에 대한 요구 사항의 @Quintec 하나가 있다는 것입니다 있는 각 문자의 짝수.
Ørjan Johansen

내 첫 번째 대답에는 요구 사항이 있었지만 골프를 타려고 시도한 후에는 잃었습니다. 업데이트되었지만 골프를 칠 수 있습니다.
Nahuel Fouilleul

1
여기에있는 모든 소스는 소스 제한을 충족하며, 코드는 링크가 잘되어 있고 각 문자가 짝수 인 경우 0을 반환합니다.
Nahuel Fouilleul

3

망막 , 150 96 바이트

^(?!(.*)(.+)(.*)$(?<!^\2|^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

온라인으로 사용해보십시오! 링크에는 자체 테스트 케이스가 포함됩니다. 편집 : @Deadcode의 도움을 받아 원래 정규식을 공정하게 조금 내리고 소스 레이아웃을 유지하기 위해 약간 덜 화려하게 백업했습니다. 설명:

^(?!(.*)(.+)(.*)$

\3다음 제한 조건과 일치하는 서브 스트링 이 존재 하지 않는지 확인 하십시오.

(?<!^\2|

부분 문자열이 전체 원본 문자열이 아니라고 가정하십시오.

^\1(?:(^?(?:(?!\6).)*\6){2})*(|(?!\6).)*(?!.+\6.*\3$)(.){1,}\3)(?!,<)?)

다음 \6과 같은 특성이 없다고 주장하십시오 .

  • 문자 자체 (제외)와 부분 문자열의 끝 사이에는 나타나지 않습니다.
  • 부분 문자열의 시작과 자체 사이에 짝수 번 나타납니다 (제외)

소스 레이아웃 제약을 통과하기 위해, 나는 교체 ((((와 함께 (?:(^?(?:(((함께 (|(. 나는 아직도 하나 개의 소스 제약이 있었다 ))왼쪽과 문자 !()1<{}I가 변경하므로, 남은 +{1,}하고 쓸모를 삽입 (?!,<)?나머지를 소비 할 수 있습니다.


2
이것은 제한된 소스 요구 사항을 충족시키지 못하는 것 같습니다.
Ørjan Johansen

@ ØrjanJohansen 마지막으로, 나는 유효한 해결책을 생각해 냈습니다. 거기에 쓰레기가 많으므로 더 짧은 것이있을 수 있습니다.
Neil

3

C 번호 (카메라 C 번호 인터랙티브 컴파일러) , 208 (206) 200 198 바이트

x=>!x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&!Enumerable.Repeat(x.Count,x.Count*x.Count).Where(
(l,i)=>i%l>0&!x.Skip(i/l).Take(i%l).GroupBy(c=>c).Any(g=>g.Count()%2>0)
).Any()/*>!oyAnC0EmeablR*WhiS/T*/

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

@KevinCruijssen 덕분에 -2 바이트!

마침내 200 아래로 떨어 졌으므로 지금은 골프를 할 수 있습니다 :) 나는 이전 답변을 기반으로 물건을 테스트하기 위해 두 번째 TIO를 만들었습니다.

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

이 작업을 까다로 웠던 것들 :

  • 평등 운영자 ==는 허용되지 않았습니다
  • 증분 / 할당 연산자 ++가 허용되지 않았습니다.
  • Linq All()기능이 허용되지 않았습니다

아래에 주석이 달린 코드 :

// anonymous function that takes an IList as input
x=>
  // the first condition makes sure the string even
  // counts of each character
  !x.GroupBy(c=>c).Any(g=>g.Count()%2>0)&
  // the second condition generates all proper substrings of x
  // and tests for any that contain even character counts
  // the string length `l` is repeated `l*l` times
  !Enumerable.Repeat(x.Count,x.Count*x.Count)
    .Where((l,i)=>
      // check that the substring length is greater than 0
      i%l>0&
      // use skip/take to generate a substring
      // and check for a character count thats odd
      // negate the result meaning we have found
      // a substring that invalidates the input
      !x.Skip(i/l).Take(i%l)
        .GroupBy(c=>c).Any(g=>g.Count()%2>0)
    )
    // if any invalid substrings are found
    // then the result in invalid
    // the comment string at the end is needed
    // to make the program well-linked
    .Any()/*>!oyAnC0EmeablR*WhiS/T*/

후행 주석에서 두 공백을 제거 할 수 있습니다.
Kevin Cruijssen

@ KevinCruijssen-좋은 하나 :) 나는 이미 공간을 추가했다는 것을 잊었다. 나는 다른 것을 소스로 던져야했다.
dana


2

Brachylog , 16 바이트

sᶠb∋p~j&sᶠb∋p~j&

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

false.진실한 인스턴스와 거짓 인스턴스를 인쇄 true.합니다. TIO 버전은 처리하기에는 너무 느리지 만 고유 문자가 두 번 반복되는 문자열이기 때문에 명확하게 연결되어 있습니다.

설명

    Input is a string: "abcacbaa"
sᶠ  Find all substrings: ["abcacbaa","abcacba","abcacb",..,"a"]
b   Behead (now the proper substrings remain): ["abcacba","abcacb",..,"a"]
∋   Take one of them: "abcacb"
p   Permute it: "abcabc"
~j  It is some string repeated twice: "abc"
&   Get the input again: "abcacbaa"
    Then repeat the above.
    If the constraints can be satisfied, the result is true, otherwise false.

1

05AB1E , 22 20 바이트

Œε¢Pà}KŒIKεSIS¢ÈP}àÈ

문자열이 제대로 연결되어 있고 문자열이 제대로 연결되지 않은 경우 출력 1합니다 0.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

기본 프로그램은 ŒsKεsS¢ÈP}à( 11 바이트 )이며, 제대로 0연결되어 있고 1제대로 연결되어 있지 않으면 출력 됩니다 . 후행 È(is_even)은 출력을 반전시키는 준 no-op이므로 1잘 연결된 문자열과 0제대로 연결되지 않은 문자열에 적합합니다. 다른 부분은 챌린지 규칙을 준수하지 않습니다.

Œε¢Pà}K         # No-ops: substrings, map, count, product, maximum, close map, remove
                # Due to the last remove, we're back at the (implicit) input again
Œ               # Take the substrings of the input
 IK             # Remove the input itself from that list of substrings
   ε            # Map each substring to:
    S           #  No-op: transform the substring into a list of characters
     IS         #  Get the input-string as a list of characters
       ¢        #  Count the occurrence of each character in the current substring
        È       #  Check which counts are even (1 if truthy; 0 if falsey)
         P      #  Take the product of that
              # After the map: check if any are truthy by taking the maximum
            È   # Semi no-op: check if this maximum is even (0 becomes 1; 1 becomes 0)
                # (and output the result implicitly)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.