끈이 붙어 있지 않습니다!


42

소개

벽에는 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

3
손을 떼어 줄의 경로를 적어 놓으면 어쨌든 그림이 떨어질 것 같습니다. 그러면이 도전은 정말 쉬워집니다.
owacoder

@owacoder 당신은 충분히 빨리해야합니다 : D
flawr

답변:


11

망막 , 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.

7

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


6

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 단위 (대문자 / 소문자 쌍임을 의미)로 떨어져 있는지 확인하고, 두 요소가 모두 튀어 나오도록하는 것입니다. 이 작업은 "실시간으로"수행되므로 쌍의 중첩이 올바르게 처리됩니다.


5

하스켈, 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에 전달되기 전에 처리됩니다 %.


좋은! 설명 주셔서 감사합니다, 나는 매번 새로운 것을 배우고 있습니다!
flawr

4

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

4

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

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


f=null.until(\a->r a==a)r.map fromEnum2 바이트를 저장해야합니다.
Laikoni

나는 (\a->r a==a)될 수 있다고 생각 한다 ((==)=<<r).
xnor

1
두 번째 줄에서, 당신은 변경할 수 있습니다 생각 =r ll생각은 단지 실행 당 하나 개의 교체를 만들기에 충분되고,.
xnor

감사합니다! 나는 두 번째 힌트를 이해하지만, 나는 무슨 일이 일어나고 있는지 전혀 모른다. =<<마술 XD처럼 보인다
flawr

1
@flawr 이 팁을 참조하십시오 . 은 =<<비슷 >>=하지만 스왑 인수. 표현은 종종 ((==)=<<r)"아래에 변함이 없음 r" 을 의미 하는 형태로 나타납니다 .
xnor

3

수학, 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~#결과에 빈 문자열인지 다음 테스트 및 ""==.


3

자바 스크립트 (ES6), 73 바이트

f=(s,t=s.replace(/(.)\1+/gi,s=>s.replace(/(.)(?!\1)./,'')))=>s==t?!s:f(t)

.NET과 달리 JavaScript는 일치하는 도중에 대 / 소문자 구분을 해제 할 수있는 방법이 없으므로 대신 반복되는 문자의 모든 하위 문자열을 대소 문자를 구분하지 않고 찾은 다음 일치하지 않는 인접한 문자 쌍을 삭제해야합니다. 대문자 / 소문자 쌍.


3

펄, 28 바이트

1 while s/.(??{$&^' '})//;$_

설명:

Perl을 사용하면 표준 정규식 내에 동적으로 생성 된 정규식을 포함시킬 수 있습니다.

.모든 항목과 일치합니다.

(??{생성 된 정규 표현식의 시작입니다.

$&변수는이 경우 단지 어떤되어 지금까지 문자열을 일치 전체, 포함 .일치합니다.

^연산자 피연산자의 값에 따라, 하나의 XOR 수치 나 문자열을 XOR한다. 이 경우 문자열 xor가됩니다.

(가) ' '의 공간이 범위 az 또는 AZ의 문자와 XOR 혼성 때 편리하게 ASCII (또는 유니!) (32)의 값을 갖는 공간을 포함하는 단순한 문자열, 그 케이스 또는 바이스 낮은 상부 변경됩니다 반대로.

})생성 정규식을 종료한다.

1 while s/whatever// 반복적으로 패턴을 검색하여 빈 문자열로 바꿉니다.

$_기본 변수입니다. 이 변수는 다른 변수를 지정하지 않을 때 펄이 재미 있고 신나는 일을하는 것입니다. 여기서는 길이가 0 인 문자열이 false이고 길이가 0이 아닌 길이가 아닌 문자열이 true이므로이 값을 사용하여 참 또는 거짓 값을 반환 "0"합니다. 또한 입력 문자열이 원래 입력되었다고 가정합니다.

여기 사용해보십시오


기술적으로, 이것은 도전이 요구하는 것과 반대가됩니다 (거짓 일 때 진실을 돌려 주거나 반대로). 문제를 해결하려면 !final 앞에 추가 하십시오 $_. 이런 식으로 유지하는 것이 괜찮다 s/.(??{$&^' '})//&&redo-p플래그에 대해 +1 바이트 로 변경하여 4 바이트를 절약 할 수 있습니다 . { code }실제로는 루프가 아니기 때문에 서브 루틴에서 &&redo작동하지 않지만 루프 -p안에 넣습니다 while.
가브리엘 베 나미

로 교체 ' '하여 다른 바이트를 저장할 수도 있습니다 $". 코드가 어떻게 보이는지 살펴보십시오.
Gabriel Benamy

2

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

f(S):-S="";string_code(I,S,X),string_code(J,S,Y),J is I+1,32is abs(X-Y),B is J+1,sub_string(S,0,I,_,T),sub_string(S,B,_,0,U),string_concat(T,U,V),f(V).

역 추적으로 인해 더 긴 거짓 사례를 실행하는 데 시간이 오래 걸립니다.

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

언 골프

f(S):-                       The string S corresponds to a falling picture if:
  S="";                      S is the empty string, or...
  string_code(I,S,X),        X is the character code at some index I
  string_code(J,S,Y),        Y is the character code at some index J
  J is I+1,                  J is I+1
  32 is abs(X-Y),            X and Y differ by 32 (difference between lower/upper case)
  B is J+1,                  ...
  sub_string(S,0,I,_,T),     ...
  sub_string(S,B,_,0,U),     ...
  string_concat(T,U,V),      ...
  f(V).                      The concatenation of the substrings before and after 
                             the letters X and Y corresponds to a falling picture.

1

MATL , 20 바이트

t"[]yd|32=fX<tQh(]n~

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 (시간이 걸립니다).

설명

t       % Input string implicitly. Duplicate
"       % Do as many times as input size
  []    %   Push empty array
  y     %   Duplicate current string onto the top
  d|    %   Absolute consecutive differences
  32=   %   Convert to true if 32, false otherwise
  fX<   %   Index of first occurrence of true, or empty of all false
  tQ    %   Duplicate, add 1. This gives the next index, or empty
  h     %   Concatenate. Gives the two consecutive indices of letters
        %   to be removed, or empty
  (     %   Assign an empty array to those positions, i.e. delete them
]       % End
n~      % Number of elements, negate

1

Mathematica, 65 바이트

(ToCharacterCode@#//.{x___,y_,z_,w___}/;Abs[y-z]==32:>{x,w})=={}&


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