> <>,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
返回1表示true,-1表示false(我可以将其更改为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
这就是令人费解的swapping(:{:@=?v$
)的工作方式-我将使用此堆栈的测试用例:[5,1,8,1]
最后一个字符是顶部。
:{
堆栈的顶部被复制:[5,1,8,1,1]
,并且堆栈向左移动:[1,8,1,1,5]
:@
顶部重复:[1,8,1,1,5,5]
,然后顶部三个值向右移动:[1,8,1,5,1,5]
=?v
这部分解释不必要
$
最高值将再次交换一次yield [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)
是有效的回文?类似的[]
,{}
以及<>
(如适用)。