> <> , 137 131 byte
Khi tôi thấy thử thách này, tôi nghĩ> <> cuối cùng có thể là một lựa chọn tốt về ngôn ngữ vì sử dụng nó, bạn hầu như có thể bỏ qua các palindromes; thật đơn giản để đảm bảo con trỏ chỉ ở đúng nơi cần thiết. Trong khi điều này là đúng,> <> không may làm cho việc chơi golf trở nên khó chịu (hoặc chỉ nói chung là chơi golf). Tôi hy vọng sẽ sử dụng một số thủ thuật kỳ lạ mà tôi nghĩ ra để bù đắp cho điều này, nhưng đây là một câu trả lời "nhanh chóng" (không thực sự, cả khôn ngoan theo chương trình và sáng tạo). Bạn có thể thử nó trực tuyến ở đây .
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
Trả về 1 cho true và -1 cho false (tôi có thể thay đổi thành 0 nhưng độ dài sẽ không thay đổi)
Như mọi khi, hãy cho tôi biết nếu điều này không hiệu quả và nếu bạn có bất kỳ ý tưởng nào về cách đánh golf xuống. Tôi đã thử nghiệm nó với một vài trường hợp thử nghiệm, nhưng luôn có thể có một ngoại lệ.
Đây là một phiên bản khác, một phiên bản mà tôi nghĩ là thông minh hơn một chút, nhưng than ôi là hơn mười byte. Giá trị Truthy / falsey lần này là 1 và lỗi ( 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<
Giải trình:
Đây là mã không có phần được thêm vào để biến nó thành một bảng màu. Cách này không sử dụng các thủ thuật "thông minh hơn" mà tôi đã cố sử dụng cho phiên bản thay thế, vì vậy sẽ dễ giải thích hơn một chút (nếu có ai quan tâm đến lời giải thích cho "thủ thuật", tôi rất vui lòng đưa ra một mẹo , Tuy nhiên).
i:0(?v>:"Z")?vl1-:1(?v&:{:@=?v$&e0.>
;n1<^ -*48< .00~< ;n-10<
Dòng 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
Đây là cách :{:@=?v$
hoạt động hoán đổi ( ) phức tạp - Tôi sẽ sử dụng trường hợp thử nghiệm của ngăn xếp này: [5,1,8,1]
trong đó ký tự cuối cùng là trên cùng.
:{
Đỉnh của ngăn xếp được nhân đôi: [5,1,8,1,1]
và ngăn xếp dịch chuyển sang trái:[1,8,1,1,5]
:@
Đỉnh được nhân đôi : [1,8,1,1,5,5]
, sau đó ba giá trị trên cùng được dịch sang phải:[1,8,1,5,1,5]
=?v
Không cần thiết cho phần giải thích này
$
Giá trị hàng đầu được hoán đổi một lần nữa cho năng suất [1,8,1,5]
, mà nếu bạn lưu ý, là ngăn xếp ban đầu được dịch chuyển một lần (như thể {
đó là lệnh duy nhất).
Vì vậy, những gì nó làm bằng tiếng Anh ("Cảm ơn Chúa, anh ấy thực sự giải thích mọi thứ") là kiểm tra toàn bộ ngăn xếp so với giá trị hàng đầu và di chuyển đến một điểm trong dòng thứ hai nếu bất kỳ giá trị nào bằng với đỉnh. Việc kiểm tra này được thực hiện tương ứng với số lượng giá trị trong ngăn xếp ( l - 1
trong đó l
độ dài của ngăn xếp) để tất cả các giá trị được kiểm tra đối với nhau.
Dòng 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)
một palindrom hợp lệ? Tương tự cho[]
,{}
và<>
(khi thích hợp).