> <> , 137 131 Bytes
Als ich diese Herausforderung sah, dachte ich, dass> <> endlich eine gute Wahl für die Sprache sein könnte, da man mit ihr Palindrome meist ignorieren kann. Es ist einfach sicherzustellen, dass der Zeiger nur dort bleibt, wo er sollte. Obwohl dies zutrifft, macht> <> die Golfbedingungen leider unerträglich (oder nur allgemein). Ich hoffe, dass ich einige seltsame Tricks anwenden kann, um dies zu kompensieren, aber hier ist eine "schnelle" Antwort (nicht wirklich, sowohl in Bezug auf Programme als auch in Bezug auf die Erstellung). Sie können es hier online ausprobieren .
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
Gibt 1 für wahr und -1 für falsch zurück (ich könnte es in 0 ändern, aber die Länge würde leider gleich bleiben)
Lassen Sie mich wie immer wissen, wenn dies nicht funktioniert und Sie Ideen haben, wie Sie Golf spielen können. Ich habe es mit ein paar Testfällen getestet, aber es kann immer eine Ausnahme geben.
Hier ist eine andere Version, von der ich denke, dass sie etwas schlauer ist, aber leider sind es zehn Bytes mehr. Die Wahrheits- / Falschheitswerte sind diesmal 1 und ein Fehler ( 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<
Erläuterung:
Hier ist der Code ohne den Teil, der hinzugefügt wurde, um daraus ein Palindrom zu machen. In diesem Fall werden die "clevereren" Tricks, die ich für die alternative Version verwendet habe, nicht verwendet. Daher ist es etwas einfacher zu erklären (falls jemand Interesse an einer Erklärung für die "Tricks" hat, würde ich gerne einen geben obwohl).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Linie 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
So funktioniert das verschlungene Tauschen ( :{:@=?v$
) - Ich verwende einen Testfall dieses Stapels: [5,1,8,1]
Dabei ist das letzte Zeichen das oberste.
:{
Die Oberseite des Stapels wird dupliziert [5,1,8,1,1]
und der Stapel nach links verschoben:[1,8,1,1,5]
:@
Der obere Bereich wird dupliziert: [1,8,1,1,5,5]
Dann werden die oberen drei Werte nach rechts verschoben:[1,8,1,5,1,5]
=?v
Unnötig für diesen Teil der Erklärung
$
Der oberste Wert wird noch einmal getauscht [1,8,1,5]
, was, wie Sie sehen werden, bedeutet, dass der ursprüngliche Stapel einmal verschoben wurde (als ob {
dies der einzige Befehl gewesen wäre).
Das heißt, auf Englisch ("Gott sei Dank, er erklärt die Dinge") wird der gesamte Stapel mit dem Höchstwert verglichen und zu einem Punkt in der zweiten Zeile verschoben, wenn ein Wert dem Höchstwert entspricht. Diese Überprüfung erfolgt proportional zu der Anzahl der Werte im Stapel ( l - 1
wobei l
die Länge des Stapels angegeben ist), sodass alle Werte gegeneinander überprüft werden.
Zeile 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)
ein gültiges Palindrom? Ähnlich für[]
,{}
und<>
(falls zutreffend).