끈이 붙어 있지 않습니다! 그러나 그림을 놓기 전에 : 손톱 주위에

소개

벽에는 3 개의 못이 있습니다. 양쪽 끝에 그림 프레임에 고정 된 문자열 조각이 있습니다. 그림을 걸기 위해 손톱으로 끈을 얽었습니다. 그러나 그림을 놓기 전에 : 손톱 주위에 줄이 어떻게 감겨 있는지 살펴보면 이미지가 떨어질지 여부를 예측할 수 있습니까?

첫 번째 예에서는 그림이 떨어지지 않습니다. 두 번째 예에서 그림은 떨어질 것입니다.

도전

N손톱 주위에 줄의 경로가 주어지면 그림이 떨어질지 여부를 결정하십시오. 반환 truthy을 사진이 떨어질 것입니다 경우 값 및 그렇지 않으면 falsy 값입니다.

세부

  • 손톱과 그림이 규칙적으로 배열되어 있다고 가정 할 수 있습니다 N+1 아래쪽에 그림과 함께 .
  • 로프에 매듭이 없다고 가정 할 수 있습니다. 즉, 로프를 두 끝 중 하나에서 연속적으로 감쌀 수 있습니다.
  • 각 손톱에는 알파벳 문자가 시계 방향으로 나열됩니다. 최대 26 개의 손톱 (AZ)이 있다고 가정 할 수 있습니다.
  • 손톱 주위의 시계 방향 랩은 소문자로 표시되고 시계 반대 방향 랩은 대문자로 표시됩니다.

위에서 첫 번째 예는로 인코딩되고 BcA두 번째 예는로 인코딩됩니다 CAbBac.

기울어 진 독자의 경우 :이 문제는 손톱 세트에 의해 생성 된 자유 그룹 의 요소가 동일성인지 여부를 결정하는 것과 같습니다 . 이것은 aA또는 같은 하위 문자열을 반복적으로 취소하는 것으로 충분하다는 것을 의미합니다.Aa 당신이 고정 된 지점에 도달 할 때까지. 고정 점이 빈 문자열 인 경우, 이것은 중립 요소이며 그렇지 않으면 그렇지 않습니다.

Picture will fall:
Aa
CAbBac
aBbA
DAacAaCdCaAcBCBbcaAb
ARrQqRrUuVHhvTtYyDdYyEKRrkeUWwua
AKkQqEeVvBESWwseYQqyXBbxVvPpWwTtKkVHLlWwNBbAanYYyyhWwEJZUuNnzjYyBLQqQqlEGgebeEPLlTtZzpUuevZzSsbXSGgsUuLlHhUQquPpHUuFfhTZzIitGgFAaBRrBbbYXxOoDZTDdtzVvXxUudHhOVvoUuXKkxyBEeLlbFfKkHhfVAaQqHAaJjODdoVvhSsZzMZzmPpXNBbnxBbUuSSsUuDRrdNnUusJDIiUuIidCEGgeMmcLlDPOopdTEeQqCAETtNnYyeGUuPEFfSsWwHheAaBbpgCcOHUuhAaCcoEFBbfeaFHhfcCFFffNncGFfgtjMVUuKAakvKkXxLlTMmtmOFfoUuXSsYZzLXxlyxUuRPZzTtprSsWwRrPLlpGgMmKRrDHhdRCcUurYNnKCckykXJjxWwUSsJjKkLlKkuBbBbOoWwWwIiUuPDdBbCcWHBbCFfcDdYBbLlyVvSsWGgEewCchDdYywAaJjEepPpPpQXxZzFfLGXxglNnZzYDdyqCcKWXxwXxQqXTtxkFfBSSAasTFftZzsXGgxSsLlLlbZzAaCCccXVvYyxTIiOoBbFftCVQqDdBbGgAavQqKkDPpKTCctRrkdcvAaQWOowLOolqVMmvZAaHCBbcPphIiRKkrLlzFMOomDIiXJjIixMmdNnMHhmfNTtIiKkSDdTtsVvHhnAaNSVvTUutNnXxsGIiXxPpPHhUupgNnAaAAOoaaIiHJjhVvLlnYyXxQqSsTtKJjkBbNnVvEYCcFfMHGghBbmNnEeJTtjJjWYywyeNWwDIiZYyzOodnMQqmVvCcQqxVvGNnEeNBbngVvUGgYyBbDdVvIiAAaauPpQKDdEekNnVLlvHhGSDIidPZzpsPCcpgQqKkQqNOonLlIiLlJjqPAaPXxTtppYyCPpHhCIicARBbracXxWwXEVUuUuGgZHhzBSsbvGgFfeVvxLlNKknWwBLlIibWOowNnRSsrSEeKAakOosLZzZRrHhzTtTFfUuNnOKkotXxTtla


Picture will not fall:
A
BcA
ABCD
aBaA
bAaBcbBCBcAaCdCaAcaCAD
ARrQqRrUatuVHhvTYyDdYyEKRrkeUAua
AEEeQqNneHhLlAIiGgaECXxcJjZzeJFfVWwDdKkvYWwyTJjtCXxANIinaXWwxcTWwtUuWwMmTBbVWIiFLlWwZzfwPLlEepvWZzwKkEYEeWXxwySXTtEexRIiNBbnWAaTtQqNnBMSsWwOombwWwPVPpGPpgYyvDdpBbrQqHhUusKRrDAVvadLlWwOZzokGJCXSSssXxxJPpGIigZzjJjLlOoNRrnPpcMZzmjgJjNDEeQqWKkNTtnSswIidCcnYBGgbyJSsjPpIiMmMmMmSNnWVvwZzIQqLXHhxTPptlisOoeTtTtYMmVvPpyKNnMFfmkXxSVvsCGJjXxgXYJPpjWwQIiXxqyDdxFfDdAaRNnJjrctHBbZzhEQqMmeCcRBbrGgAaAaJNnRrYyWwSDdVvsJOojQGgWWwIBbiwRrqJjjWwOoFPMmDdRrQOoqNnRrDPJjpMmdPpGFfVvWUuwgpWCcNnPpwfUXCcZzJjUSsuXxxUuuRGgHhrSQqJjOosMMTtmHhmKkXxDdLlWwjSUuAaMmKYyksZzVvPZzVEeVvvHhZZOozBbzMmZCczYyGgISsiQqpXxMmXxEMmeRrAGgaGgMOGgomZFfDdzSSssBGPpgbTtBbOoRWWwGgLJjlEeGgLDdRrUulNnZzJjJjUKkuXxFfwATtaZzLVvlWwSsMmrBAaELleGBLFflbgHhbIFfiBbPpTWZzwKkKLASsaTJYyjtBbBbWwIiZCcWwzIiZLlUTtuBbYyBbIizTJjtLTtDOOoBbodBbllSsUGgLlAKkauYykUuUNnPpuDFfAaLNVvnVvlHhdMmBAaBbIiVRrGWOoPpwgWXwKkvJjOoTtYCUucVGgYyLlVvFfvRrMmySsDdbtICZzcNnINSOosDQAaXoxRGgKkrqdZznDdXxZzMGgmiJjNnACcMQqmaNnWZzUOuwTVvAJjSsaRrGgSsTtOMmRroVvRrtAVGgvMmaINniDGCcOogRrWwMVvYFfyTtmTtVvOoOIiodRrGgAxaSsGgiJja



답변

망막 , 21 바이트

+`(.)(?!\1)(?i)\1

^$

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

flawr의 솔루션과 마찬가지로 인접한 대문자 / 소문자 쌍을 반복적으로 삭제 한 다음 결과가 비어 있는지 확인합니다.

대문자 / 소문자 쌍과 일치하는 방법은 다음과 같습니다.

(.)     # Match and capture a letter.
(?!\1)  # Ensure that the next character is not the same, to avoid matching
        # "aa" and "AA".
(?i)    # Turn on case-insensitivity.
\1      # Match the backreference. In .NET, when using case insensitivity,
        # backreferences also get case-insensitive, so this *can* still match
        # iff the cases of the two letters are different.


답변

MATLAB, 76 바이트 옥타브, 82 79 77 바이트

MATLAB이 실제로 Octave보다 짧은 곳을 처음 보았을 수도 있습니다 (전체 바이트 기준)!

MATLAB의 새로운 답변 :

c=input('');k='Aa';while k<1e5,k=k+1;c=strrep(c,65+mod(k,64),'');end;~nnz(c)

옥타브로 답변 :

c=input('');k='Aa';while k++<1e5,c=strrep(c,['',65+mod(k,64)],'');end;~nnz(c)

저장된 flawr 다섯 바이트 감사합니다. ~nnz(c)보다 짧은 isempty(c), 그리고 'Aa'이상의 바이트 짧다 [0,32].

온라인으로 Octave 버전을 사용해보십시오!


설명:

c=input('')사용자에게 입력을 요청합니다. k='Aa'문자 배열로 정의 합니다.

while k++<1e5: 두 요소 while 루프 k반복마다 증분되고 Aa, Bb, Cc등. 루프는 가장 큰 요소가 1e5~ 일 때까지 계속 되며 대부분의 문자열에 대해 충분히 높아야합니다. 9e9바이트 수를 늘리지 않고 증가 시킬 수 있습니다 .

우리는 걸릴거야 strrep중간에서 시작 단계에있는 기능.

사용하여 mod(k,64)(우리가 변환 할 경우 우리는 알파벳의 끝에 도달 할 때 우리는 다음을 얻을 것이다 k문자로 다시) :

ans = Yy
ans = Zz
ans = [{
ans = \|
ans = ]}
ans = ^~
ans = _
ans = `�
ans = aA
ans = bB

보시다시피, 사이에 몇 가지 기호가 있지만 알파벳을 다시 시작하고 소문자로 시작합니다. 이 모두 확인하는 매우 짧은 방법 AaaA.

['',65+mod(k,64)]-call의 숫자 값을 mod빈 문자열로 연결하여 숫자를 문자로 변환합니다.

strrep문자열에서 요소를 제거 c하고 반환하는 데 사용됩니다 . k문자열에서 모든 항목을 검색 하여 빈 문자열로 바꿉니다.

1e5반복 후에 는 빈 문자열이나 비어 있지 않은 문자열이 있습니다. c사용중인 요소가 있는지 확인합니다 nnz(c). 우리는 돌아 not(nnz(c))따라서, 1비어 있는지, 그리고 0에 남아있는 문자가있는 경우c


답변

Minkolang 0.15 , 30 바이트

od4&x,N.I1=$6&d3~c-$~48*=,2&xx

여기 사용해보십시오!

설명

od                            Take character from input and duplicate it
  4&                          If top of stack is truthy, jump 4 spaces
    x                         Dump top of stack
     ,                        NOT top of stack
      N.                      Output as number and stop

    I1=                       1 if stack has 1 element, 0 otherwise
       $6&                    If top of stack is truthy, jump 16 spaces (to the beginning)
          d3~c                Duplicate top two items of stack, in reversed order
              -               Subtract
               $~             Absolute value
                 48*          Push 32
                    =,        0 if top two items are equal, 1 otherwise
                      2&xx    If top of stack is truthy, dump two elements from top

Minkolang의 토 로이드 특성은 여기에서 외부 루프가 필요하지 않도록 활용됩니다. 여기에서 일반적인 아이디어는 스택의 상위 두 요소가 32 단위 (대문자 / 소문자 쌍임을 의미)로 떨어져 있는지 확인하고, 두 요소가 모두 튀어 나오도록하는 것입니다. 이 작업은 “실시간으로”수행되므로 쌍의 중첩이 올바르게 처리됩니다.


답변

하스켈, 62 바이트

a%l|b:t<-l,abs(a-b)==32=t|1>0=a:l
f=null.foldr((%).fromEnum)[]

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

신용 할 에 대한 flawrabs에 대한 Laikoni fromEnum지도 .

도우미 함수 %는 이미 단순화 된 string을 취하고 결과를 단순화하기 전에 l기호 a를 추가합니다 . l역 문자로 시작 하면 a취소됩니다. 그렇지 않으면 a단순히 앞에 붙습니다. 이 단계에서는 더 이상의 단순화가 필요하지 않습니다.

주요 기능 f은 각 문자를 앞에 추가하고 단순화합니다 foldr. 그런 다음 결과가 비어 있는지 확인합니다.

두 문자가 대소 문자를 구분하는지 여부를 확인하려면 취소해야하는 ASCII 값이 32인지 확인하십시오. 각 요소는 fromEnum에 전달되기 전에 처리됩니다 %.


답변

05AB1E , 17 바이트

DvADu‚øDíìvyK}}õQ

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

설명

Dv                 # input number of times do:
  A                # push lowercase alphabet
   Du              # push uppercase alphabet
     ‚ø            # zip the alphabets together (['aA', ..., 'zZ'])
       Díì         # prepend a copy with each element reversed ('Aa' ...)
          v        # for each pair in the resulting list
           yK      # remove it from the accumulated string (starts as input)
             }}    # end loops
               õQ  # check result for equality to empty string


답변

하스켈 , 98 97 85 81 바이트

이것은 더 이상 변화가 없을 때까지 인접한 문자를 반복적으로 취소하려고 시도하고 그 결과를 결정하는 순진한 구현입니다.

-12 바이트의 경우 @nimi와 다른 -4 바이트의 경우 @xnor에게 감사합니다!

o=fromEnum
r(a:b:l)|abs(o a-o b)==32=l|1>0=a:r(b:l)
r x=x
f=null.until((==)=<<r)r

온라인으로 사용해보십시오! 또는 모든 예를 확인하십시오!


답변

수학, 102 바이트

""==StringDelete[""|##&@@#<>#2&~MapThread~{Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}]~FixedPoint~#&

알파벳 문자열을 입력으로 사용하여 반환하는 True또는 이름이없는 함수 또는 False.

구현의 핵심은 문자열에서 "Pp"또는 과 같은 취소 쌍을 삭제하는 함수를 만드는 것 "gG"입니다. 이 표현식 {Join[a=Alphabet[],A=ToUpperCase@a],A~Join~a}은 순서가 지정된 문자 목록 쌍을 생성합니다. 첫 번째 목록 {"a","b",...,"Z"}은 두 번째 목록 {"A","B",...,"z"}입니다. 그런 다음 #<>#2&~MapThread~이 두 목록의 해당 요소가 연결된 목록 (즉,)을 ​​생성 {"aA","bB",...,"Zz"}합니다. 그러면 재미있는 표현 ""|##&@@은 (인수 순서의 마술을 통해 ##) 대안의 목록을 생성합니다 "" | "aA" | "bB" | ... | "Zz". 드디어,StringDelete[...] 문자열에서 이러한 대체 항목을 삭제하는 함수입니다.

이제 반복하여 수행 결과가 변경되지 않을 때까지 입력 문자열에 해당 기능을 적용하기에 충분 ~FixedPoint~#결과에 빈 문자열인지 다음 테스트 및 ""==.