> <>、137 131バイト
この挑戦を見たとき、> <>は言語の良い選択かもしれないと思った。ポインタが本来あるべき場所に留まるようにするのは簡単です。これは事実ですが、残念ながら、ゴルフの条件付けは耐え難いものになります(または一般的には単にゴルフになります)。これを補うために私が考えた奇妙なトリックを使用したいと思っていますが、ここに「クイック」(実際には、プログラムと作成の両方ではない)答えがあります。こちらからオンラインで試すことができます。
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に変更することはできますが、残念ながら長さは同じままです)
いつものように、これがうまくいかないかどうか、そしてゴルフをする方法について何かアイデアがあれば教えてください。いくつかのテストケースに対してテストしましたが、常に例外が発生する可能性があります。
ここに別のバージョンがありますが、私はもう少し賢いと思いますが、悲しいかな10バイト多くなります。今回の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]
ます。これは、元のスタックが1回だけシフトされたことに注意してください({
唯一のコマンドであるかのように)。
したがって、これが英語で行われること(「ありがとう、彼は実際に物事を説明している」)は、スタック全体を最上位の値と照合し、値が最上位に等しい場合は2行目のポイントに移動します。このチェックは、スタック内の値の数に比例して行われ(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)
、有効な回文ですか?以下のための同様の[]
、{}
および<>
(適切な場合)。