> <> , 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
ส่งคืน 1 สำหรับจริงและ -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<
คำอธิบาย:
นี่คือรหัสที่ไม่มีส่วนที่เพิ่มเพื่อให้เป็นแบบ palindrome อันนี้ไม่ได้ใช้กลอุบายที่ "ฉลาดกว่า" ที่ฉันพยายามจะใช้กับรุ่นอื่นดังนั้นจึงเป็นการง่ายกว่าที่จะอธิบาย (ถ้าใครสนใจคำอธิบายสำหรับ "ลูกเล่น" ฉันยินดีที่จะให้ แม้ว่า)
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]
จากนั้นค่าสามอันดับแรกจะถูกเลื่อนไปทางขวา:[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)
palindrome ที่ถูกต้องหรือไม่? ที่คล้ายกันสำหรับ[]
,{}
และ<>
(ตามความเหมาะสม)