Tôi là một palindrom. Bạn có phải?


103

Đã có một vài nỗ lực trước đây để đặt câu hỏi này, nhưng không phù hợp với tiêu chuẩn hiện đại trên trang web này. Mỗi cuộc thảo luận về Meta , tôi đang đăng lại nó theo cách cho phép cạnh tranh công bằng theo các quy tắc hiện đại của chúng tôi.

Lý lịch

Một là một chuỗi "đọc cùng một tiến và lùi", tức là ngược lại của chuỗi giống như chính chuỗi đó. Chúng ta không nói về "palindromes tiện lợi" ở đây, mà là một sự đảo ngược từng nhân vật nghiêm ngặt; ví dụ, ()()không phải là một palindrom, nhưng ())(là.

Nhiệm vụ

Viết chương trình hoặc hàm lấy một chuỗi S (hoặc tương đương phù hợp trong ngôn ngữ của bạn) làm đầu vào và có một đầu ra Q (thuộc loại bạn chọn). Bạn có thể sử dụng bất kỳ phương tiện hợp lý nào để lấy đầu vào và cung cấp đầu ra.

  • Khi đầu vào S là một palindrom, đầu ra Q phải có giá trị A (tương tự với bất kỳ S palindromic nào ).
  • Khi đầu vào S không phải là một palindrom, đầu ra Q phải có giá trị B (tương tự với bất kỳ S không palindromic nào ).
  • AB phải khác biệt với nhau.

Hay nói cách khác: ánh xạ tất cả các palindrome thành một giá trị và tất cả các palindromes khác.

Ngoài ra, chương trình hoặc chức năng bạn viết phải là một palindrom (tức là mã nguồn của nó phải là palindromic), làm cho điều này trở thành một thách thức .

Làm rõ

  • Mặc dù truefalselà những lựa chọn rõ ràng cho AB , bạn có thể sử dụng bất kỳ hai giá trị riêng biệt nào cho đầu ra "là một palindrom" và "không phải là một palindrom", không cần phải là booleans.
  • Chúng tôi đang xác định đảo ngược chuỗi ở cấp độ ký tự ở đây; éélà palindromic bất kể chương trình được mã hóa theo UTF-8 hay Latin-1, mặc dù đó không phải là một chuỗi các octet sau khi mã hóa UTF-8.
  • Tuy nhiên, ngay cả khi chương trình của bạn chứa các ký tự không phải ASCII, nó chỉ cần hoạt động cho đầu vào ASCII. Cụ thể, đầu vào S sẽ chỉ chứa các ký tự ASCII có thể in (bao gồm cả khoảng trắng, nhưng không bao gồm dòng mới). Trong số những thứ khác, điều này có nghĩa là nếu bạn coi đầu vào là một chuỗi byte chứ không phải là một chuỗi ký tự, chương trình của bạn vẫn có thể tuân thủ đặc tả (trừ khi mã hóa I / O của ngôn ngữ của bạn rất kỳ lạ). Như vậy, định nghĩa của một bảng màu trong viên đạn trước chỉ thực sự quan trọng khi kiểm tra xem chương trình có đúng mẫu không.
  • Ẩn một nửa chương trình trong một bình luận hoặc chuỗi bằng chữ, trong khi không sáng tạo, là hợp pháp; bạn đang được chấm điểm về chiều dài, không phải sự sáng tạo, vì vậy hãy thoải mái sử dụng các phương pháp "nhàm chán" để đảm bảo chương trình của bạn là một bảng màu. Tất nhiên, vì bạn đang bị ghi điểm về thời lượng, các phần trong chương trình của bạn không làm gì sẽ làm xấu đi điểm số của bạn, vì vậy việc có thể sử dụng cả hai nửa chương trình của bạn có thể sẽ hữu ích nếu bạn có thể quản lý nó .
  • Vì tiêu chí chiến thắng được đo bằng byte, bạn sẽ cần chỉ định mã hóa trong đó chương trình của bạn được viết để có thể chấm điểm (mặc dù trong nhiều trường hợp, rõ ràng bạn sẽ sử dụng mã hóa nào).

Tiêu chí chiến thắng

Mặc dù chương trình cần phải là một bảng màu ở cấp độ ký tự, chúng tôi đang sử dụng byte để xem ai thắng. Cụ thể, chương trình của bạn càng ngắn, được đo bằng byte thì càng tốt; đây là một thử thách . Để cho phép các bài nộp (đặc biệt là các bài nộp trong cùng một ngôn ngữ) được đặt, hãy đặt số byte cho chương trình của bạn trong tiêu đề của bài gửi của bạn (cộng với số ký tự, nếu nó khác với số byte).


12
Ai đó vui lòng giải thích tại sao sẽ () () không phải là một bảng màu ??
Emilio M Bumachar

58
@EmilioMBumachar Hãy thử thay thế (bằng a)bằng b. Là ababmột palindrom? Không, nó sẽ phải như vậy abba. Sau đó, ()()không phải là một palindrom; nó sẽ phải được ())(.
DLosc

7
Những giải pháp đó hoàn toàn sử dụng các bình luận để làm cho chương trình trở nên
nhạt nhẽo

15
@kennytm Không cho phép họ sẽ tồi tệ hơn, bởi vì không có cách nào thỏa đáng để làm điều đó một cách khách quan theo cách không thể tin được bằng ngôn ngữ. (Nhận xét là gì? Điều gì về việc đưa một nửa không sử dụng vào một chuỗi ký tự bị loại bỏ? Điều gì về ngôn ngữ 2D nơi bạn có thể có mã thực thi hoàn hảo mà đơn giản là không bao giờ đạt được?)
Martin Ender

Câu trả lời:


137

Brachylog (2), 3 byte trong bảng mã của Brachylog

I↔I

Hãy thử trực tuyến!

Đây là một chương trình đầy đủ nhận đầu vào thông qua đầu vào tiêu chuẩn (sử dụng cú pháp của Brachylog cho các hằng số, tức là các chuỗi được đặt trong dấu ngoặc kép) và đầu ra thông qua đầu ra tiêu chuẩn. Các đầu ra true.dành cho đầu vào palindromic và đầu vào false.không palindromic.

Chương trình này không chỉ là palindromic, nó còn có tính đối xứng gương trái / phải (và có thể trong một số phông chữ lên / xuống).

Giải trình

Trong Brachylog, chữ in hoa đánh dấu các điểm trong chương trình có các giá trị giống hệt nhau; cái này được sử dụng gần giống như một mạch điện để mang thông tin từ một phần của chương trình đến phần khác. Một hậu quả của điều này là nếu bạn kèm theo một lệnh giữa một cặp chữ in hoa giống hệt nhau, thì bạn khẳng định một cách hiệu quả rằng đầu vào và đầu ra của lệnh giống nhau. Brachylog mặc nhiên nhận đầu vào, vì vậy trong trường hợp này, chúng tôi cũng khẳng định rằng đầu vào của lệnh giống như đầu vào của chương trình. Trong chương trình này, chúng tôi đang sử dụng lệnh , đảo ngược mọi thứ (trong trường hợp này là chuỗi); do đó chương trình khẳng định một cách hiệu quả rằng đầu vào giống nhau về phía trước và phía sau.

Một chương trình đầy đủ (trái ngược với chức năng) trong Brachylog trả về giá trị boolean, false.nếu không có cách nào để thực hiện tất cả các xác nhận trong chương trình chính xác hoặc true.nếu các xác nhận trong chương trình hoàn toàn tương thích với nhau. Chúng tôi chỉ có một khẳng định ở đây - rằng đảo ngược đầu vào không thay đổi nó - vì vậy chương trình hoạt động như một trình kiểm tra palindrom.


49
Và đối xứng xoay 180 độ, Thật đẹp.
ATaco

7
... và đối xứng dọc theo trục dọc và trục ngang :-)
Luis Mendo

13
@SteakOverflow Brachylog sử dụng trang mã tùy chỉnh , vì vậy những ký tự đó không được mã hóa trong UTF-8
DJMcMayhem

4
Tôi tham gia cộng đồng này chỉ để bình chọn chương trình này. Ồ
Bill Michell

4
@ATaco Sự kết hợp của đối xứng trái / phải và lên / xuống ngụ ý đối xứng quay 180 độ. ;)
Eric Duminil

55

Bình thường , 3 byte

_I_

Trả về Đúng hoặc Sai .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

  _  Reverse the input.
_I   Invariant-reverse; test if the reversed input is equal to its reverse.

1
Tại sao bạn cần trận chung kết _?
busukxuan

34
@busukxuan Từ câu hỏi, "Ngoài ra, chương trình hoặc chức năng bạn viết phải là một bảng màu"
isaacg

1
Tại sao rất nhiều người ủng hộ ... Câu trả lời này dường như không khó để đưa ra ...?
ghosts_in_the_code

1
Tôi đoán vậy. Vẫn có vẻ như không công bằng. Trong một số câu hỏi, người ta phải đặt rất nhiều công việc khó khăn để trả lời, và những người khác thì dễ dàng hơn nhiều. Tuy nhiên, các khoản thanh toán là như nhau. Btw Tôi cũng đã nâng cấp: P
ghosts_in_the_code

4
@ghosts_in_the_code Chỉ có một trong những câu trả lời của tôi với hơn 100 câu hỏi thực sự khó khăn để viết, nhưng có những câu trả lời tôi đã dành nhiều ngày cho việc đó chỉ có một số ít các câu trả lời. Cuối cùng, tất cả phát sinh ...
Dennis


33

Thạch , 5 byte

ḂŒ
ŒḂ

Trả về 1 hoặc 0 . Dòng đầu tiên là một liên kết trợ giúp chưa được thực hiện, dòng thứ hai gọi thử nghiệm palindrom.

Hãy thử trực tuyến!


wow, bổ sung gần đây.
Jonathan Allan

6
Đúng, chỉ 18 giờ.
Dennis

bạn đã không chỉ định mã hóa. Tôi đang đoán UTF-8?
Brian Minton

1
@BrianMinton Không, đây sẽ là 11 byte trong UTF-8. Jelly sử dụng trang mã này .
Dennis

@Dennis, cảm ơn thông tin.
Brian Minton


23

Toán học, 23 byte

QemordnilaP;PalindromeQ

Không thú vị lắm, nhưng vì lợi ích của sự hoàn chỉnh ...

Trên đây là một CompoundExpressionđánh giá PalindromeQ, một tích hợp để giải quyết thách thức. QemordnilaPchỉ đơn giản là một định danh không xác định, được bỏ qua vì ;.


21

Haskell, 87 85 44 34 byte

p=(==)<*>reverse--esrever>*<)==(=p

Giải thích: ((->) a)là một ví dụ của Ứng dụng (cảm ơn @faubiguy), với <*>định nghĩa là

(<*>) f g x = f x (g x)

Vì vậy, bằng cách thay thế trong các đối số, người ta có thể thấy tại sao điều này hoạt động.


1
Bạn có thể giải thích mã?
bli

1
@bli mọi thứ sau khi --là một bình luận.
theonlygusti

3
@theonlygusti Haskell là người ngoài hành tinh đủ mà chỉ giúp một nửa.
Yakk

@Yakk Đó là một số loại kết hợp cả (==), reverseidchức năng ( idlà chức năng nhận dạng).
tbodt

Bạn có thể lưu 10 byte bằng cách sử dụng <*>thay vì <$>và xóa<*>id
faubi

20

05AB1E , 3 byte

Mã số:

ÂQÂ

Giải trình:

     # Bifurcate (duplicate and reverse the duplicate) implicit input
 Q    # Check if equal
  Â   # Bifurcate the result

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


Tại sao không chỉÂQ
Neil A.

1
@NeilA. Bản thân mã cũng cần phải là một bảng màu.
Ad Nam

17

PHP, 55 byte

<?=strrev($s=$_GET[s])==$s;#;s$==)]s[TEG_$=s$(verrts=?<

Thêm vào đó, tên của ngôn ngữ là một bảng màu để ... điểm thưởng!


Giải pháp lén lút.
Martijn

16

MATL , 7 byte

tPX=XPt

Hãy thử trực tuyến!

Trả về [1; 1] cho đầu vào palindromic và [0; 0] nếu không.

t       % duplicate the input
P       % reverse the second string
X=      % check the two strings are exactly equal (returns 0 or 1)
XP      % flip array (does nothing)
t       % duplicate the answer, giving either [1;1] or [0;0]
        % (implicit) convert to string and display

15

Pip , 12 11 byte

Bây giờ bình luận miễn phí!

x:RVaQaVR:x

Đưa đầu vào làm đối số dòng lệnh; đầu ra 1cho palindrom, 0cho không palindrom. Hãy thử trực tuyến!

Cốt lõi của những gì chúng tôi muốn làm là RVaQa: reverse(a) string-equals a. Mã x:RVaQatính toán kết quả này và gán nó cho x. Sau đó VR:xgán giá trị của xbiến VR. Vì nhiệm vụ này là tuyên bố cuối cùng trong chương trình, giá trị của nó cũng được tự động in. Voila!

Đối với phiên bản thú vị trước đó bằng cách sử dụng một số hành vi không xác định, hãy xem lịch sử sửa đổi.



9

R, 111 103 byte

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))#))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Không phải là câu trả lời nguyên bản nhất. #là nhân vật bình luận trong R

Ung dung:

all((s<-el(strsplit(scan(,"",,,"\n"),"")))==rev(s))
#
))s(ver==)))"",)"n\",,,"",(nacs(tilpsrts(le-<s((lla

Chuỗi ký tự từ scanđược chuyển đổi thành byte thô nhờ charToRawhàm. Các byte thô này được so sánh từng cái một với các đối tác của chúng từ rev()hàm, nó đảo ngược thứ tự của đối số của nó. Đầu ra của phần này là một vectơ của TRUEvà / hoặc FALSE.
Các allchức năng sau đó kết quả đầu ra TRUEnếu tất cả những yếu tố này làTRUE

Ở đây, "\n"trong scanhàm là cần thiết cho các đầu vào có nhiều hơn một từ.

Câu trả lời trước (byte-khôn ngoan), 81 byte

function(s)all((s=charToRaw(s))==rev(s))#))s(ver==))s(waRoTr‌​ahc=s((lla)s(noitcnu‌​f

với - 24 byte nhờ @rturnbull .


Bạn có thể lưu một vài byte tốt bằng cách thực hiện charToRawchuyển đổi trước khi gán svà thay đổi cách bạn đặt sepđối số thành scan:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
rturnbull

(Ngoài ra, cách tiếp cận này không hiệu quả đối với đầu vào éétheo mã hóa UTF-8, nhưng tôi không nghĩ rằng nó phá vỡ các quy tắc của thách thức.)
rturnbull

@rturnbull: cảm ơn vì đầu vào! Tôi thực sự đã thử nghiệm éévới một latin1mã hóa.
Frédéric

Vì bài kiểm tra phải được thực hiện theo cách thông minh, tôi nghĩ rằng chương trình hiện tại phá vỡ các quy tắc.
Frédéric

Tôi không chắc chắn phiên bản trước không phá vỡ quy tắc. OP tuyên bố: "Trong số những điều khác, điều này có nghĩa là nếu bạn coi đầu vào là một chuỗi byte chứ không phải là một chuỗi ký tự, chương trình của bạn vẫn có thể tuân thủ đặc tả (trừ khi mã hóa I / O của ngôn ngữ của bạn rất kỳ lạ). "
rturnbull

8

RProgN , 11 byte

~]S.E E.S]~

Nửa đầu của điều này thực hiện tất cả các công việc nặng nhọc, và bởi sự tiện lợi của RProgN, nửa sau là No-op.

~]S.E E.S]~
~           # Treat the word as a Zero Space Segment
 ]          # Duplicate the top of the stack
  S.        # Reverse the top of the stack
    E       # Compare if these values are equal
      E.S]~ # A no-op, because the ~ is at the end of the word, not the start.

Hãy thử trực tuyến!


8

Võng mạc , 53 byte

Số lượng byte giả định mã hóa ISO 8859-1.

$
¶$`
O$^`\G.
»
D`
M$`^.+$
$+.^`$M
`D
»
.G\`^$O
`$¶
$

Hãy thử trực tuyến!

Tôi khá chắc chắn rằng điều này chưa tối ưu ( »dòng này có vẻ đặc biệt lãng phí và tôi có một giải pháp 45 byte có tính chất thực tế ngoại trừ một ký tự), nhưng tôi đoán đó là một sự khởi đầu.


8

GNU sed , 64 59 + 1 (cờ r) = 60 byte UTF-8

Mất một lúc tôi mới đưa ra một câu trả lời không sử dụng phần bình luận để biến mã thành một bảng màu. Thay vào đó, tôi sử dụng clệnh sẽ in nửa đầu mã theo thứ tự ngược lại, chỉ tôi đảm bảo rằng lệnh này không đạt được.

:;s:^(.)(.*)\1$:\2:;t;/../c1
d
1c/../;t;:2\:$1\)*.().(^:s;:

Kịch bản in 1nếu chuỗi đầu vào không phải là một bảng màu (nghĩ về nó như là một lỗi). Nếu chuỗi là một palindrom, thì không có đầu ra nào được đưa ra (nghĩ rằng nó là thoát thành công).

Chạy ví dụ: hoặc dùng thử trực tuyến!

me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "level"
me@LCARS:/PPCG$ sed -rf palindrome_source.sed <<< "game"
1

Giải trình:

:                              # start loop
s:^(.)(.*)\1$:\2:              # delete first and last char, if they are the same
t                              # repeat if 's' was successful
/../c1                         # if at least 2 chars are left, print 1. 'c' reads
                               #till EOL, so next command must be on a new line.
d                              # delete pattern space. This line must be a
                               #palindrome itself, and must end the script.
1c/../;t;:2\:$1\)*.().(^:s;:   # (skipped) print first half of code in reverse
                               #order. Everything after 'c' is treated as string.

1
TIO đã hỗ trợ cho sed bây giờ. -rkhông hoạt động, nhưng bạn chỉ có thể gói toàn bộ trong BASH. Hãy thử trực tuyến!
Riley

@Riley Cách sử dụng đẹp của tiêu đề và chân trang trên TIO, cảm ơn. Cách giải quyết trước đó là di chuyển mã vào danh sách đối số bằng -e, nhưng cách của bạn đẹp hơn nhiều. Tôi đã chờ đợi để sửa nó, nhưng theo cách này tôi không cần.
seshoumara

7

Alice , 19 byte

/@.nzRoi\
\ioRzn.@/

Hãy thử trực tuyến!

Bản in Jabberwocky cho palindromes và không có gì cho không palindromes. Hoạt động cho đầu vào UTF-8 tùy ý.

Giải trình

Vì đây là một tác vụ xử lý chuỗi, Alice sẽ phải hoạt động ở chế độ Ordinal để giải quyết nó. Điều đó có nghĩa là con trỏ lệnh phải di chuyển theo đường chéo và do đó chúng ta cần ít nhất hai dòng để IP có thể bật lên và xuống. Nguồn cấp dữ liệu trong một chương trình như vậy tạo ra một vị trí tốt để đặt ký tự giữa của bảng màu. Điều đó có nghĩa là dòng thứ hai cần phải là đảo ngược của dòng đầu tiên. Nhưng vì chúng tôi chỉ thực hiện mọi ký tự khác trên mỗi dòng, nếu chúng tôi đảm bảo rằng độ dài dòng là số lẻ, thì mã ngược lại sẽ nằm gọn trong các khoảng trống của chính nó. Ký tự duy nhất hoàn toàn không được sử dụng là dấu gạch chéo ngược, nhưng vì nó tùy ý nên tôi đã chọn nó để làm cho chương trình trông đẹp và đối xứng.

Vì vậy, dù sao, mã thực tế có liên quan là đây:

/ . z o
 i R n @

Mà được thực hiện trong một zigzag từ trái sang phải.

/   Reflect the IP southeast, enter Ordinal mode.
i   Read all input as a single string.
.   Duplicate the input.
R   Reverse the copy.
z   Pop the reverse Y and the original X. If X contains Y, drop everything
    up to its first occurrence. Since we know that X and Y are the same length,
    Y can only be contained in X if X=Y, which means that X is a palindrome.
    So this will result in an empty string for palindromes and in the non-empty
    input for non-palindromes.
n   Logical NOT. Replaces non-empty strings with "", and empty strings with
    "Jabberwocky", the "default" truthy string.
o   Output the result.
@   Terminate the program.

6

Haskell , 34 byte

f=(==)=<<reverse--esrever<<=)==(=f

Hãy thử trực tuyến! Gọi với f "some string", trả lại Truehoặc False.

Các =<<nhà khai thác trên các chức năng hoạt động giống như f=<<g = \s -> f (g s) s, vì vậy các mã tương đương với f s=s==reverse s, trong đó, như tôi chỉ nhận thấy, sẽ dẫn đến việc đếm cùng byte.


Phiên bản không có nhận xét: (49 byte)

e x y=x/=y
p=e=<<reverse
esrever<<=e=p
y=/x=y x e

Hãy thử trực tuyến!

Gọi với p "some string". Điều này xuất ra Falsenếu chuỗi đã cho một palindrom và Truenếu đó không phải là một palindrom.

Giải trình:

Tôi tìm thấy bình luận này miễn phí bằng cách bắt đầu với phiên bản bình luận và thay thế bình luận bằng một dòng mới:

p=(==)=<<reverse
esrever<<=)==(=p

Dòng thứ hai thất bại vì dấu ngoặc đơn không khớp, vì vậy chúng ta cần loại bỏ chúng. Nếu chúng ta có một hàm ekiểm tra sự bằng nhau, thì

p=e=<<reverse
esrever<<=e=p

cả hai sẽ biên dịch với dòng thứ hai xác định một infix-nhà điều hành <<=mà phải mất hai đối số esreverevà trả về chức năng p.

Để định nghĩa elà hàm đẳng thức người ta thường viết e=(==), nhưng )==(=esẽ lại không biên dịch. Thay vào đó, chúng tôi rõ ràng có thể lấy hai đối số và chuyển chúng tới ==: e x y=x==y. Bây giờ mã đảo ngược y==x=y x ebiên dịch nhưng xác định lại ==toán tử, khiến định nghĩa e x y=x==ykhông thành công. Tuy nhiên, nếu chúng ta chuyển sang toán tử bất đẳng thức /=, định nghĩa đảo ngược sẽ trở thành y=/x=y x evà định nghĩa một =/toán tử không can thiệp vào /=toán tử gốc .


5

DẦU , 178 byte

Đọc một đầu vào, phát nổ nó, từ từ thêm chiều dài của nó (thông qua tăng và giảm) vào địa chỉ để biết địa chỉ sau chuỗi, nhảy đến một phần khác của mã (ở giữa), đảo ngược hướng băng tần, mã hóa chuỗi một lần nữa và kiểm tra xem nó có giống với chuỗi ban đầu không. TL; DR: Đó là một nỗi đau, như thường lệ.

Đầu ra 40nếu chuỗi không phải là một bảng màu, 0nếu có.

5
0
12
0
40
1
40
2
1
40
34
10
2
3
22
16
9
2
8
35
6
11
6
37

3
4
4
27
26
0
1
10
1

40
13
2
31
04

1
01
1
0
62
72
4
4
3

73
6
11
6
53
8
2
9
61
22
3
2
01
43
04
1
2
04
1
04
0
21
0
5

2
Ngôn ngữ gọn gàng! :)
DLosc

5

Javascript, 64 byte

f=s=>s==[...s].reverse().join``//``nioj.)(esrever.]s...[==s>=s=f

Chức năng gọi fvới chuỗi

f("abba") // returns true
f("abab") // returns false

Mã nguồn của bạn không phải là một bảng màu!
seshoumara

@seshoumara Cập nhật mã
Prasanth Bendra

Bây giờ thì ổn rồi. Có thể đề cập đến giá trị trả về nếu chuỗi không phải là một bảng màu, chỉ để hoàn thành.
seshoumara

@apsillers cảm ơn bạn tôi đã chỉnh sửa câu trả lời.
Prasanth Bendra

Không có chức năng f, mã của bạn không gán chức năng mũi tên của bạn cho một biến để không thể gọi nó
spex

5

Japt , 7 2 byte

êê

Chạy nó

Giải pháp cũ:

U¥UwU¥U

Hãy thử trực tuyến!

Giải trình

U¥UwU¥U
U¥        U is the input, ¥ is a shortcut for == 
  Uw      w is a reverse function.
    U¥U   This calculates U == U (always true), but the result is ignored
          because w does not look at its arguments.

Japt không thoát các chức năng trừ khi đạt được dấu ngoặc đơn (hoặc dấu cách).

Điều này có thể được viết lại: U¥Uw(U¥U)U¥UwU==Uw. Trong Japt, dấu ngoặc đơn bỏ đi ở đầu và cuối của hàm được tự động chèn.


Tất cả đều có ý nghĩa, ngoại trừ nếu wlà một hàm không có đối số, thì nó áp dụng như Uthế nào? Nó là một cái gì đó như thế U.reverse()nào?
DLosc

@DLosc Đúng. Nó đảo ngược Utheo cùng một cách như U.reverse().
Oliver

4

Tiện ích Bash + Unix, 49 byte

[ "$1" = "`rev<<<$1`" ] # ] "`1$<<<ver`" = "1$" [

Đầu vào được thông qua như là một đối số.

Đầu ra được trả về trong mã kết quả - 0 cho một bảng màu, 1 cho một bảng màu.

Có lẽ ai đó có thể làm tốt hơn và không chỉ dựa vào một nhận xét để làm cho bản thân mã trở nên nhạt nhẽo.

Hãy thử trực tuyến!


[[ $1 = `rev<<<$1` ]]ngắn hơn ( [[Cú pháp Bash , không cần trích dẫn)
Arthur2e5

2
@ Arthur2e5 Tôi đã thử đề xuất của bạn, nhưng tôi nghĩ rằng các trích dẫn xung quanh rev<<<$1là cần thiết ngay cả trong [[...]]giải pháp. Kiểm tra nó với chuỗi đầu vào '[$]]$['(là một palindrom). Với những trích dẫn được thêm vào để làm cho nó hoạt động, giải pháp của bạn có cùng độ dài với giải pháp của tôi.
Spector Mitchell

Cú bắt tuyệt vời! Tôi quên rằng RHS của ==in [[sẽ được hiểu là một casemô hình giống như.
Arthur2e5

@ Arthur2e5 Tôi vẫn nghĩ có lẽ có một số cách thông minh để làm cho nó ngắn hơn.
Spector Mitchell

Điều này sẽ vẫn hoạt động nếu có dòng mới trong đầu vào? Tôi nghĩ bạn cần rev | tac thay vì chỉ rev.
b_jonas

4

> <>, 11 byte

{=?!;
;!?={

Hãy thử nó ở đây!

Trả về "\ ns Something có mùi tanh ..." khi một bảng màu hợp lệ, không xuất ra một bảng màu không hợp lệ. Đặt palindrom trên ngăn xếp.


Yêu cầu đầu vào đã có trên ngăn xếp làm cho điều này trở thành một đoạn. Thử thách này đòi hỏi các chương trình hoặc chức năng, không phải đoạn trích.
pppery

4

Java - 171 169 160 byte

int q(String s){return s.equals(new StringBuffer(s).reverse().toString())?1:2;}//};2:1?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

Nhận xét ở cuối là làm cho nó một palindrom. Trả về P(alindrome)khi đầu vào là palindrom vàN(ot) khi không.

Phiên bản bị đánh cắp:

int q(String s) {
    return s.equals(new StringBuffer(s).reverse().toString()) ? 'P' : 'N';
}//};'N':'P'?))(gnirtSot.)(esrever.)s(reffuBgnirtS wen(slauqe.s nruter{)s gnirtS(q tni

2 byte được lưu nhờ @DLosc

Cảm ơn @Olivier Grégoire vì đã chỉ ra số lượng byte không chính xác! Đã sửa bây giờ


Tôi tin rằng bạn có thể lưu một số byte bằng cách trả về ints thay vì chars.
DLosc

Tôi không biết cách kiểm tra số byte của bạn, nhưng bạn có 160 byte chứ không phải 161.
Olivier Grégoire

Bạn có thể lưu 2 byte bằng cách trả lại 80 cho 'P'và 78 cho 'N'hoặc sử dụng các ký tự khác nhau để lưu nhiều byte hơn.
Selim

1
Bạn có thể tiết kiệm nhiều byte hơn bằng cách thực hiện new StringBuffer(s).reverse()+""thay vìnew StringBuffer(s).reverse().toString()
Selim

1
bất kỳ lý do bạn đang trở lại intthay vì bool?
CodeInChaos

4

Java 8, 92 90 byte

Đây là một phiên bản bình luận. Nếu một chuỗi chứa đảo ngược của nó, thì đó là một palindrom ( true) nếu không nó không phải là ( false).

s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s

Hãy thử trực tuyến!

Cập nhật

  • -2 [18-04-05] Đã chuyển sang chứa. Cảm ơn @Kevin Cruijssen !
  • -2 [17-02-20] Đã loại bỏ ;'s
  • -16 [17-02-22] Tự động chuyển đổi

Mã này không phải là một biểu thức lambda.
Jakob

@Jakob Tôi nghĩ là vậy. Nếu bạn đã sử dụng lambda, có lẽ bạn sẽ muốn một dòng mới hàng đầu và dấu. (Tôi đã thêm một liên kết tio)
Phi tuyến

Vâng, khiếu nại của tôi là nhận xét dòng làm cho bài nộp không chỉ là biểu thức lambda, và do đó không có giá trị như một giải pháp lambda. Đừng lo lắng về điều đó ngay bây giờ; Cuối cùng có lẽ tôi sẽ tạo một bài đăng meta để thu thập sự đồng thuận.
Jakob

Các giải pháp @Jakob Lambda đôi khi có thể có mã ngoại lai , đó là lý do tại sao tôi nghĩ rằng nó là hợp lệ. Nhưng nếu bạn không bán, một bài đăng meta sẽ không bị tổn thương.
Phi tuyến

1
Tôi biết đã được một lúc, nhưng bạn có thể chơi golf 2 byte bằng cách thay đổi nó thành s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-s. Hãy thử trực tuyến 90 byte .
Kevin Cruijssen

3

Trên thực tế , 5 byte

;R=R;

Hãy thử trực tuyến!

Đầu ra trung thực là [1]\n[1], và đầu ra falsey là []\n[](trong cả hai đầu ra, \nđại diện cho một dòng mới theo nghĩa đen).

Giải trình:

;R=R;
;R=    duplicate input, reverse one copy, test equality (the main palindrome-testing part)
   R   range(1, x+1) - if palindrome, this pushes [1], else it pushes []
    ;  duplicate

Tại sao bạn không làm điều này ?
Leaky Nun

1
@LeakyNun nó phải là một palindrom
caird coinheringaahing

3

C ++, 154 byte

int m(){std::string g,p="";g=p;std::reverse(p.begin(),p.end());return g==p;}//};p==g nruter;))(dne.p,)(nigeb.p(esrever::dts;p=g;""=p,g gnirts::dts{)(m tni

Tôi phải nói rằng, tuyên bố ngược lại rất tốn kém, nhưng tôi không thể tưởng tượng được mình có thể làm gì nhiều để thay đổi điều đó. Có thể cắt bỏ các biểu tượng std :: sẽ giúp tôi tiết kiệm khoảng 10 ký tự, nhưng "sử dụng không gian tên std;" là khá nhiều

Tôi cho rằng C ++ không thực sự có ý nghĩa cho sự ngắn gọn.


3

Prolog, 44 byte

p-->[]|[_]|[E],p,[E].%.]E[,p,]E[|]_[|][>--p

Điều này sử dụng ngữ pháp mệnh đề xác định. Nó thực sự là một ngữ pháp hoàn toàn miễn phí ngữ cảnh:

p -->
      []            % the empty string
   |                % or
      [_]           % a one character string
   |                % or
      [E],          % one character, followed by
      p,            % a palindrome, followed by
      [E].          % that same character

Sử dụng:

?- phrase(p,"reliefpfeiler").
true 

?- phrase(p,"re").
false.

2

CJam, 13 byte

l_W%=e#e=%W_l

Giải trình:

l_W%=e#e=%W_l
l_            e#Read input twice
  W%          e#Reverse one input
    =         e#Test for equality
     e#e=%W_l e#Comment to be a palindrome

Thí dụ:

> l_W%=e#e=%W_l
l_W%=e#e=%W_l
1

> l_W%=e#e=%W_l
Hi
0

> l_W%=e#e=%W_l
hh
1

Hãy thử điều này:l_W%#e#%W_l
aditsu

2

J, 15 byte, 15 ký tự

-:|.NB. .BN.|:-

Trả về 1 nếu palindrom, 0 nếu không.

Đầu ra:

   f '())('
1
   f 'nope'
0

Giải trình:

-:    NB. "Match" verb, checks for equality
|.    NB. Reverses the string
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.