소개
벽에는 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]
.
설명:
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
보시다시피, 사이에 몇 가지 기호가 있지만 알파벳을 다시 시작하고 소문자로 시작합니다. 이 모두 확인하는 매우 짧은 방법 Aa
및 aA
.
['',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~#
결과에 빈 문자열인지 다음 테스트 및 ""==
.