> <> , 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<
Пояснення:
Ось код без доданої частини, щоб зробити його паліндром. Цей не використовує "більш розумні" хитрощі, які я намагався використати для альтернативної версії, тому пояснити це трохи простіше (якщо когось цікавить пояснення до "хитрощів", я би радий дати такий , хоча).
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)
дійсний паліндром? Аналогічно для[]
,{}
та<>
(де це доречно).