> <> , 137 131 Bytes
Ketika saya melihat tantangan ini, saya pikir> <> mungkin akhirnya menjadi pilihan bahasa yang baik karena menggunakannya Anda kebanyakan dapat mengabaikan palindrom; sederhana untuk memastikan pointer hanya tetap di tempat yang seharusnya. Meskipun ini benar,> <> sayangnya membuat persyaratan bermain golf menyiksa (atau hanya bermain golf pada umumnya). Saya berharap untuk menggunakan beberapa trik aneh yang saya pikirkan untuk mengimbangi ini, tapi inilah jawaban "cepat" (tidak sebenarnya, baik program-bijaksana dan penciptaan-bijaksana). Anda dapat mencobanya online di sini .
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
Mengembalikan 1 untuk true dan -1 untuk false (saya bisa mengubahnya ke 0 tetapi panjangnya akan tetap sama, sayangnya)
Seperti biasa, beri tahu saya jika ini tidak berhasil dan jika Anda memiliki ide tentang cara menurunkannya. Saya mengujinya terhadap beberapa kasus uji, tetapi selalu ada pengecualian.
Ini versi lain, yang menurut saya sedikit lebih pintar, tetapi sayangnya sepuluh byte lebih. Nilai kebenaran / kesalahan saat ini adalah 1 dan kesalahan ( 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<
Penjelasan:
Inilah kode tanpa bagian yang ditambahkan untuk menjadikannya palindrome. Yang ini tidak menggunakan trik "lebih pintar" yang saya coba gunakan untuk versi alternatif, jadi agak lebih mudah untuk menjelaskan (jika ada yang tertarik dengan penjelasan untuk "trik," saya akan dengan senang hati memberikan satu. , meskipun).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Baris 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
Inilah cara swapping berbelit-belit ( :{:@=?v$
) bekerja - saya akan menggunakan test case stack ini: di [5,1,8,1]
mana karakter terakhir adalah atas.
:{
Bagian atas tumpukan digandakan:, [5,1,8,1,1]
dan tumpukan bergeser ke kiri:[1,8,1,1,5]
:@
Atas digandakan:, [1,8,1,1,5,5]
maka tiga nilai teratas digeser ke kanan:[1,8,1,5,1,5]
=?v
Tidak perlu untuk bagian penjelasan ini
$
Nilai teratas ditukar sekali lagi menghasilkan [1,8,1,5]
, yang, jika Anda akan perhatikan, adalah tumpukan asli bergeser sekali (seolah-olah {
telah menjadi satu-satunya perintah).
Jadi apa yang dilakukan dalam bahasa Inggris ("Terima kasih Tuhan, dia benar-benar menjelaskan hal-hal") adalah memeriksa seluruh tumpukan terhadap nilai teratas dan pindah ke titik di baris kedua jika ada nilai yang sama dengan atas. Pemeriksaan ini dilakukan proporsional dengan berapa banyak nilai yang ada di tumpukan ( l - 1
, di mana l
panjang tumpukan) sehingga semua nilai diperiksa satu sama lain.
Baris 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 yang valid? Mirip untuk[]
,,{}
dan<>
(jika perlu).