> <> , 137 131 Bayt
Bu meydan okumayı gördüğümde, sonunda palindromları görmezden gelebileceğiniz için iyi bir dil seçimi olabileceğini düşündüm. işaretçinin yalnızca olması gerektiği yerde kaldığından emin olmak kolaydır. Bu doğru olsa da,> <> maalesef golf koşullarını aşırı derecede (veya sadece genel olarak golf oynamayı) zorlaştırıyor. Bunun için telafi etmeyi düşündüğüm bazı tuhaf hileler kullanmayı umuyorum, ama işte "hızlı" (aslında, hem programda hem de yaratımda) cevap. Burada çevrimiçi deneyebilirsiniz .
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 için 1, false için -1 döndürür (bunu 0 olarak değiştirebilirim, ancak uzunluk ne yazık ki aynı kalır)
Her zaman olduğu gibi, bu işe yaramazsa ve nasıl golf oynamak hakkında bir fikriniz varsa bana bildirin. Birkaç test olayına karşı test ettim, ancak her zaman bir istisna olabilirdi.
İşte biraz daha zekice olduğunu düşündüğüm başka bir sürüm daha var ama ne yazık ki on bayt daha fazla. Bu sefer Truthy / falsey değerleri 1 ve bir hata ( 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<
Açıklama:
İşte bir palindrome yapmak için eklenen kısmı olmayan kod. Bu, alternatif sürüm için kullanmaya çalıştığım "daha akıllıca" püf noktalarını kullanmıyor, bu yüzden açıklamak biraz daha kolay (eğer herhangi biri "püf noktaları" ile ilgili bir açıklama yapmak isterse, bir tane vermekten mutluluk duyarım) , olsa).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Satır 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
Kıvrımlı swapping ( :{:@=?v$
) nasıl çalışır? - Bu yığının bir test senaryosunu kullanacağım: [5,1,8,1]
son karakter en üstte.
:{
Yığının üstü çoğaltılır: [5,1,8,1,1]
ve yığın sola kaydırılır:[1,8,1,1,5]
:@
Üst kopyalanır: [1,8,1,1,5,5]
sonra ilk üç değer sağa kaydırılır:[1,8,1,5,1,5]
=?v
Açıklamanın bu kısmı için gereksiz
$
En yüksek değer bir kez daha değiştirilir [1,8,1,5]
, eğer dikkat ederseniz, orijinal yığının bir kez kaydırıldığı ( {
tek komut sanki ).
Öyleyse bunun İngilizce'de yaptığı şey ("Tanrıya şükür, aslında bir şeyler açıklıyor") , tüm yığını en yüksek değere karşı kontrol etmek ve herhangi bir değer en üste eşitse, ikinci satırdaki bir noktaya geçmek. Bu denetleme (yığınında kaç değerleri orantılı küçük yapılır l - 1
, l
tüm değerler birbirine karşı kontrol edilir, böylece yığının uzunluğudur).
Hat 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)
geçerli bir palindrom mu? Benzer[]
,{}
ve<>
(uygun olduğunda).