> <> , 137131 바이트
이 도전을 보았을 때, 나는 언어를 사용하면 대부분 회문을 무시할 수 있기 때문에> <>가 결국 언어의 좋은 선택이라고 생각했다. 포인터가 원하는 곳에만 머 무르도록하는 것은 간단합니다. 이것이 사실이지만, 불행히도> <>는 골프 조건을 극도로 흥분시킨다 (또는 일반적인 골프). 나는 이것을 보상하기 위해 생각한 이상한 트릭을 사용하고 싶지만 여기에 "빠른"(실제로는 프로그램과 창조 모두가 아니라) 대답이 있습니다. 여기에서 온라인으로 사용해 볼 수 있습니다 .
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<01-n; >~00. >84*- ^>1n;
<.0e&$v?=@:}:&v?)1:-1lv?("Z":<v?)0:i
true의 경우 1을 반환하고 false의 경우 -1을 반환합니다 (0으로 변경할 수는 있지만 길이는 동일하게 유지됩니다)
항상 그렇듯이 작동하지 않는 경우와 골프를 치는 방법에 대한 아이디어가 있는지 알려주십시오. 몇 가지 테스트 사례에 대해 테스트했지만 항상 예외가있을 수 있습니다.
여기 좀 더 영리하다고 생각되는 또 다른 버전이 있습니다. 이번의 Truthy / falsey 값은 1이며 오류 ( something smells fishy...
) :
>i:0(?v>:"Z")?vl: 2(?v&{:@$:@=01-*2.
< ;n1<^ -*48<f6+0.0<
&1-:1)e*1.1*e(1:-1&
>0.0+6f>84*- ^>1n; >
.2*-10=@:$@:}&v?)2 :lv?("Z":<v?)0:i<
설명:
다음은 회문으로 만들기 위해 부품을 추가하지 않은 코드입니다. 이것은 대체 버전에 사용하려고 시도한 "더 영리한"트릭을 사용하지 않으므로 설명하기가 더 쉽습니다 (누군가 "트릭"에 대한 설명에 관심이있는 경우 그러나).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
1 행 :
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
i:0(?v #Pushes input and directs down if negative
>:"Z")?v #Directs down if input is greater than "Z"
#(reduces lowercase input to uppercase)
l #Pushes length
#Main loop begins
1-:1(?v #Decrements top, and then directs down if less than 1
& #Pushes top of stack onto register (length minus 1)
:{ #Duplicates top, shifts stack to the left
:@ #Duplicates top, shifts top three values of the stack to the right
=?v #If top two values are equal, directs down
$ #Swaps top two values of the stack
& #Pushes register onto stack
e0. #Jumps back to the "1" after "?vl"
#Main loop ends
> #Makes sure when the pointer jumps back to i it goes the right way
다음은 복잡한 스와핑 ( :{:@=?v$
)의 작동 방식입니다.이 스택의 테스트 사례를 사용하겠습니다 [5,1,8,1]
. 마지막 문자가 맨 위입니다.
:{
스택의 상단이 복제되고 스택이 [5,1,8,1,1]
왼쪽으로 이동합니다.[1,8,1,1,5]
:@
상단이 복제 된 [1,8,1,1,5,5]
다음 상단 3 개 값이 오른쪽으로 이동합니다.[1,8,1,5,1,5]
=?v
설명의이 부분에 불필요
$
최상위 값은 한 번 더 산출량으로 교체됩니다 [1,8,1,5]
. 이것은 주목할 것입니다. 원래 스택이 한 번 넘겨졌습니다 ( {
유일한 명령 인 것처럼 ).
이것이 영어로하는 것 ( "고마워요, 실제로 설명하고 있습니다") 은 전체 스택을 최상위 값과 비교하여 확인하고 어떤 값이 상위와 같으면 두 번째 줄의 한 지점으로 이동합니다. 이 검사는 스택에있는 값의 수 (스택 의 길이는 l - 1
어디에 있는지)에 비례하여 수행 l
되므로 모든 값이 서로 비교됩니다.
2 행 :
;n1<^ -*48< .00~< ;n-10<
n1< #If input is less than 0 (i.e. there is none), print 1
; #and terminate
< #If redirected because input is greater than "Z"
-*48 #Push 32, subtract (reducing lowercase to uppercase, numerically)
^ #And move back to the portion that tests if input
#is uppercase (which it will pass now)
< #If counter is less than 1 (for main loop)
.00~ #Pop the counter and jump to the beginning (i)
< #If any two values in the stack are equal
-10 #Push -1 (subtract 1 from 0)
;n #Print and terminate
(hellolleh)
유효한 회문입니까? 에 대한 유사[]
,{}
그리고<>
(적절한 경우).