ฉันเป็น palindrome คุณเป็น


103

มีความพยายามก่อนหน้านี้ สองสามครั้งที่จะถามคำถามนี้ แต่ก็ไม่สอดคล้องกับมาตรฐานที่ทันสมัยในเว็บไซต์นี้ ตามการอภิปรายเกี่ยวกับ Metaฉันจะทำการโพสต์ใหม่ในลักษณะที่อนุญาตให้มีการแข่งขันที่เป็นธรรมภายใต้กฎเกณฑ์ที่ทันสมัยของเรา

พื้นหลัง

คือสตริงว่า "อ่านไปข้างหน้าและข้างหลังเดียวกัน" คือการย้อนกลับของสตริงเป็นเช่นเดียวกับสตริงตัวเอง เราไม่ได้พูดถึงเรื่อง "palindromes ที่สะดวกสบาย" ที่นี่ แต่เป็นการกลับตัวอักขระทีละตัวอักษรอย่างเข้มงวด ตัวอย่างเช่น()()ไม่ใช่ palindrome แต่())(เป็น

งาน

เขียนโปรแกรมหรือฟังก์ชั่นที่รับสตริงS (หรือเทียบเท่าที่เหมาะสมในภาษาของคุณ) เป็นอินพุตและมีเอาต์พุตQหนึ่งรายการ(ของประเภทที่คุณเลือก) คุณสามารถใช้วิธีการที่สมเหตุสมผลเพื่อรับอินพุตและจัดเตรียมเอาต์พุต

  • เมื่ออินพุตSเป็น palindrome เอาต์พุตQควรมีค่าA (นั่นคือค่าเดียวกันสำหรับ palindromic Sใด ๆ)
  • เมื่ออินพุตSไม่ใช่ Palindrome เอาต์พุตQควรมีค่าB (ซึ่งเป็นค่าเดียวกันสำหรับS ที่ไม่ใช่ palindromic S )
  • AและBจะต้องแตกต่างจากกัน

หรือกล่าวอีกนัยหนึ่งคือจับคู่ palindromes ทั้งหมดกับค่าหนึ่งและไม่ใช่ palindromes อื่น

นอกจากนี้โปรแกรมหรือฟังก์ชั่นที่คุณเขียนจะต้องเป็น Palindrome นั้นเอง (เช่นซอร์สโค้ดของมันจะต้องเป็น Palindromic) ซึ่งทำให้เกิดความท้าทาย

ชี้แจง

  • แม้ว่าtrueและfalseเป็นตัวเลือกที่ชัดเจนสำหรับAและBคุณสามารถใช้สองค่าที่แตกต่างกันสำหรับผลลัพธ์ "is a palindrome" และ "ไม่ใช่ palindrome" ซึ่งไม่จำเป็นต้องเป็นบูลีน
  • เรากำลังนิยามการย้อนกลับของสตริงที่ระดับตัวละครที่นี่ ééเป็น palindromic โดยไม่คำนึงว่าโปรแกรมนั้นเข้ารหัสใน UTF-8 หรือ Latin-1 แม้ว่าจะไม่ใช่ลำดับ palindromic ของ octets หลังจากการเข้ารหัส UTF-8
  • อย่างไรก็ตามแม้ว่าโปรแกรมของคุณมีอักขระที่ไม่ใช่ ASCII แต่ก็จำเป็นต้องใช้งานกับอินพุต ASCII เท่านั้น โดยเฉพาะอินพุตSจะมีอักขระ ASCII ที่พิมพ์ได้ (รวมถึงช่องว่าง แต่ไม่รวมถึงบรรทัดใหม่) เหนือสิ่งอื่นใดซึ่งหมายความว่าหากคุณปฏิบัติต่ออินพุตเป็นลำดับไบต์แทนที่จะเป็นลำดับอักขระโปรแกรมของคุณจะยังคงปฏิบัติตามข้อกำหนด (เว้นแต่ว่าการเข้ารหัส I / O ภาษาของคุณจะแปลกมาก ) ดังนั้นคำจำกัดความของ palindrome ในสัญลักษณ์แสดงหัวข้อก่อนหน้ามีความสำคัญจริงๆเมื่อตรวจสอบว่าโปรแกรมมีรูปแบบที่ถูกต้อง
  • การซ่อนโปรแกรมครึ่งหนึ่งในความคิดเห็นหรือสตริงตามตัวอักษรในขณะที่ไม่ได้สร้างสรรค์นั้นถือว่าถูกกฎหมาย คุณได้รับคะแนนตามความยาวไม่ใช่ความคิดสร้างสรรค์ดังนั้นอย่าลังเลที่จะใช้วิธี "น่าเบื่อ" เพื่อให้แน่ใจว่าโปรแกรมของคุณเป็น Palindrome แน่นอนเนื่องจากคุณได้รับคะแนนตามความยาวส่วนต่าง ๆ ของโปรแกรมที่ไม่ทำอะไรเลยจะแย่ลงคะแนนดังนั้นการใช้ทั้งสองส่วนของโปรแกรมจึงน่าจะมีประโยชน์หากคุณสามารถจัดการได้ .
  • เนื่องจากเกณฑ์ชัยชนะถูกวัดเป็นไบต์คุณจะต้องระบุการเข้ารหัสที่โปรแกรมของคุณเขียนขึ้นเพื่อให้คะแนน (แม้ว่าในหลายกรณีจะเห็นได้ชัดว่าคุณกำลังใช้การเข้ารหัส)

เกณฑ์ชัยชนะ

แม้ว่าโปรแกรมจะต้องเป็นแบบ palindrome ที่ระดับตัวอักษรเราใช้ bytes เพื่อดูว่าใครชนะ ยิ่งโปรแกรมของคุณสั้นลงเท่านั้นหน่วยเป็นไบต์ก็ยิ่งดีเท่านั้น นี่คือความท้าทายของเพื่อให้สามารถเปรียบเทียบได้ (โดยเฉพาะอย่างยิ่งการส่งในภาษาเดียวกัน) ให้นับจำนวนไบต์สำหรับโปรแกรมของคุณในส่วนหัวของการส่งของคุณ (รวมถึงจำนวนตัวอักษรหากแตกต่างจากจำนวนไบต์)


12
ใครช่วยอธิบายหน่อยได้ไหมว่าทำไม () () ไม่ใช่ palindrome
Emilio M Bumachar

58
@EmilioMBumachar ลองเปลี่ยน(กับaและกับ) bคือababpalindrome? abbaไม่มีก็จะต้องมีการ ถ้าอย่างนั้น()()ก็ไม่ใช่ palindrome; ())(มันจะต้องมีการ
DLosc

7
โซลูชั่นเหล่านั้นใช้ความคิดเห็นทั้งหมดเพื่อให้โปรแกรม palindromic ดูเหมือนจะเป็นช่องโหว่สำหรับฉัน :(
kennytm

15
@ kennytm การไม่อนุญาตให้พวกเขาแย่ลงเพราะไม่มีวิธีที่น่าพอใจที่จะทำสิ่งนั้นอย่างเป็นกลางในลักษณะที่ไม่เชื่อเรื่องภาษา (อะไรคือความคิดเห็นอะไรเกี่ยวกับการใส่ครึ่งที่ไม่ได้ใช้ลงในสตริงตัวอักษรที่ถูกทิ้งไปแล้วภาษาแบบ 2D ที่คุณสามารถมีโค้ดที่สามารถใช้งานได้อย่างสมบูรณ์แบบที่ไม่เคยไปถึงมาก่อน)
Martin Ender

คำตอบ:


137

Brachylog (2), 3 ไบต์ในเพจรหัสของ Brachylog

I↔I

ลองออนไลน์!

นี่เป็นโปรแกรมเต็มรูปแบบที่รับอินพุตผ่านอินพุตมาตรฐาน (โดยใช้ไวยากรณ์ของ Brachylog สำหรับค่าคงที่เช่นสตริงถูกใส่ไว้ในเครื่องหมายคำพูดคู่) และเอาต์พุตผ่านเอาต์พุตมาตรฐาน เอาต์พุตtrue.สำหรับอินพุต palindromic และfalse.สำหรับอินพุตที่ไม่ใช่ palindromic

palindromic ของโปรแกรมนี้ไม่เพียง แต่มันยังมีซ้าย / ขวา (และอาจเป็นแบบอักษรขึ้น / ลง) บางส่วน

คำอธิบาย

ใน Brachylog ตัวอักษรพิมพ์ใหญ่จะทำเครื่องหมายคะแนนในโปรแกรมที่มีค่าเหมือนกัน นี่ใช้วงจรไฟฟ้าเพื่อส่งข้อมูลจากส่วนหนึ่งของโปรแกรมไปยังอีกส่วนหนึ่ง สิ่งหนึ่งที่เป็นผลมาจากสิ่งนี้คือถ้าคุณใส่คำสั่งระหว่างตัวอักษรใหญ่คู่ที่เหมือนกันคุณจะยืนยันได้อย่างมีประสิทธิภาพว่าอินพุตและเอาต์พุตของคำสั่งนั้นเหมือนกัน Brachylog รับอินพุตโดยปริยายดังนั้นในกรณีนี้เรายังยืนยันด้วยว่าอินพุตกับคำสั่งนั้นเหมือนกับอินพุตของโปรแกรม ในโปรแกรมนี้เราใช้คำสั่งซึ่งย้อนกลับสิ่งต่าง ๆ (ในกรณีนี้คือสตริง); ดังนั้นโปรแกรมยืนยันอย่างมีประสิทธิภาพว่าอินพุตเหมือนกันไปข้างหน้าและข้างหลัง

โปรแกรมเต็มรูปแบบ (ตรงข้ามกับฟังก์ชั่น) ใน Brachylog ส่งคืนบูลีนfalse.หากไม่มีวิธีที่จะทำให้การยืนยันทั้งหมดในโปรแกรมนั้นถูกต้องในคราวเดียวหรือtrue.ถ้าการยืนยันในโปรแกรมนั้นเข้ากันได้ทั้งหมด เรามีเพียงหนึ่งการยืนยันที่นี่ - การย้อนกลับอินพุตไม่เปลี่ยนแปลง - ดังนั้นโปรแกรมทำหน้าที่เป็นตัวตรวจสอบพาลินโดรม


49
และสมมาตรการหมุน 180 องศามันสวยมาก
ATaco

7
... และสมมาตรตามแนวตั้งและแนวนอน :-)
Luis Mendo

13
@SteakOverflow Brachylog ใช้โค้ดเพจที่กำหนดเองดังนั้นอักขระเหล่านั้นจะไม่ถูกเข้ารหัสใน UTF-8
DJMcMayhem

4
ฉันเข้าร่วมชุมชนนี้เพื่อลงคะแนนโปรแกรมนี้ ว้าว.
Bill Michell

4
@ ATaco การรวมกันของสมมาตรซ้าย / ขวาและขึ้น / ลงแสดงถึงสมมาตรหมุนได้ 180 องศา ;)
Eric Duminil

55

Pyth , 3 ไบต์

_I_

ผลตอบแทนที่แท้จริงหรือเท็จ

ลองออนไลน์!

มันทำงานอย่างไร

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

1
ทำไมคุณถึงต้องการคนสุดท้าย_?
busukxuan

34
@busukxuan จากคำถาม "นอกจากนี้โปรแกรมหรือฟังก์ชั่นที่คุณเขียนจะต้องเป็น palindrome นั้นเอง"
isaacg

1
ทำไม upvotes มากมาย ... คำตอบนี้ไม่ยากนักที่จะมากับ ... ?
ghosts_in_the_code

1
ฉันเดาอย่างนั้น ยังดูเหมือนว่าไม่ยุติธรรม ในบางคำถามเราต้องทุ่มเทอย่างหนักเพื่อตอบคำถามและอื่น ๆ นั้นง่ายกว่ามาก การจ่ายเงินยังคงเหมือนเดิม Btw ฉันได้รับการโหวตด้วยเช่นกัน: P
ghosts_in_the_code

4
@ghosts_in_the_code หนึ่งในคำตอบของฉันที่มี 100+ มีความท้าทายในการเขียน แต่มีคำตอบที่ฉันใช้เวลาหลายวันในการรับ upvotes ในท้ายที่สุดมันก็หายไปหมดแล้ว ...
เดนนิส


33

เยลลี่ 5 ไบต์

ḂŒ
ŒḂ

ผลตอบแทนที่1หรือ0 บรรทัดแรกคือลิงก์ตัวช่วยที่ไม่ได้ดำเนินการบรรทัดที่สองเรียกว่าการทดสอบ Palindrome

ลองออนไลน์!


ว้าวนอกจากนี้ล่าสุด
Jonathan Allan

6
ใช่อายุเพียง 18 ชั่วโมง
เดนนิส

คุณไม่ได้ระบุการเข้ารหัส ฉันคาดเดา UTF-8 หรือไม่
Brian Minton

1
@BrianMinton ไม่นี่จะเป็น 11 ไบต์ใน UTF-8 วุ้นใช้รหัสหน้านี้
เดนนิส

@Dennis ขอขอบคุณสำหรับข้อมูล
Brian Minton


23

Mathematica ขนาด 23 ไบต์

QemordnilaP;PalindromeQ

ไม่น่าสนใจมาก แต่เพื่อความสมบูรณ์ ...

ข้างต้นเป็นสิ่งCompoundExpressionที่ประเมินPalindromeQว่าเป็นในตัวที่แก้ปัญหาได้ เป็นเพียงการระบุที่ไม่ได้กำหนดไว้ซึ่งจะถูกละเว้นเพราะQemordnilaP;


21

Haskell, 87 85 44 34 ไบต์

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

คำอธิบาย: ((->) a)เป็นอินสแตนซ์ของ Applicative (ขอบคุณ @faubiguy) โดย<*>กำหนดเป็น

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

ดังนั้นโดยการแทนที่ในข้อโต้แย้งหนึ่งสามารถดูว่าทำไมงานนี้


1
คุณอธิบายรหัสได้หรือไม่
bli

1
@bli ทุกอย่างหลังจากที่--มีความคิดเห็น
theonlygusti

3
@theonlygusti Haskell เป็นเอเลี่ยนที่เพียงพอที่จะช่วยได้เพียงครึ่งเดียว
Yakk

@Yakk มันเรียงลำดับของการรวมกันของบาง(==), reverseและidฟังก์ชั่น ( idเป็นฟังก์ชั่นตัวตน)
tbodt

คุณสามารถบันทึก 10 ไบต์โดยใช้<*>แทน<$>และลบ the<*>id
faubi

20

05AB1E , 3 ไบต์

รหัส:

ÂQÂ

คำอธิบาย:

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

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!


ทำไมไม่เพียงแค่ÂQ
Neil A.

1
@NeilA รหัสนั้นต้องเป็นแบบ palindrome เช่นกัน
Adnan

17

PHP, 55 ไบต์

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

ยิ่งไปกว่านั้นชื่อของภาษานั้นเป็นโทนสีเทาดังนั้น ... คะแนนโบนัส!


ทางออกส่อเสียด
Martijn

16

MATL , 7 ไบต์

tPX=XPt

ลองออนไลน์!

ส่งคืน [1; 1] สำหรับอินพุต palindromic และ [0; 0] มิฉะนั้น

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 ไบต์

ตอนนี้แสดงความคิดเห็นฟรี!

x:RVaQaVR:x

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง เอาต์พุต1สำหรับ palindrome 0สำหรับ non-palindrome ลองออนไลน์!

แก่นแท้ของสิ่งที่เราต้องการทำคือRVaQa: reverse(a) string-equals a. รหัสคำนวณผลนี้และกำหนดให้มันx:RVaQa xจากนั้นVR:xกำหนดค่าของตัวแปรx VRเนื่องจากการบ้านนี้เป็นคำสั่งสุดท้ายในโปรแกรมค่าของมันจึงถูกพิมพ์ซ้ำอัตโนมัติ Voila!

สำหรับรุ่นที่น่าสนใจก่อนหน้านี้โดยใช้พฤติกรรมที่ไม่ได้กำหนดโปรดดูประวัติการแก้ไข



9

R, 111 103 ไบต์

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

ไม่ใช่คำตอบดั้งเดิมที่สุด #เป็นอักขระความคิดเห็นในR

Ungolfed:

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

สตริงอักขระจากscanถูกแปลงเป็นไบต์ดิบด้วยcharToRawฟังก์ชัน ไบต์ดิบเหล่านี้จะถูกเปรียบเทียบหนึ่งต่อหนึ่งกับคู่หูของพวกเขาจากrev()ฟังก์ชั่นซึ่งกลับคำสั่งของการโต้แย้ง การส่งออกของส่วนนี้เป็นเวกเตอร์ของและTRUE / หรือ ฟังก์ชั่นแล้ว outputs ถ้าองค์ประกอบทั้งหมดเหล่านี้จะFALSE
allTRUETRUE

ที่นี่"\n"ในscanฟังก์ชั่นเป็นสิ่งจำเป็นสำหรับอินพุตที่มีมากกว่าหนึ่งคำ

คำตอบก่อนหน้า (ไบต์ฉลาด), 81 ไบต์

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

กับ- 24 ไบต์ขอบคุณที่@rturnbull


คุณสามารถบันทึกสองสามไบต์ที่ดีได้โดยทำการcharToRawแปลงก่อนกำหนดsและเปลี่ยนวิธีตั้งค่าsepอาร์กิวเมนต์เป็นscan:all((s<-charToRaw(scan(,"",,,"\n")))==rev(s))#))s(ver==)))"n\",,,"",(nacs(waRoTrahc-<s((lla
rturnbull

(นอกจากนี้วิธีนี้ใช้ไม่ได้กับอินพุตเช่นééการเข้ารหัสแบบ UTF-8 แต่ฉันไม่คิดว่ามันจะฝ่าฝืนกฎของการท้าทาย)
rturnbull

@rtbull: ขอบคุณสำหรับอินพุต! ฉันทดสอบééด้วยการlatin1เข้ารหัสแน่นอน
Frédéric

เนื่องจากการทดสอบจะต้องทำด้วยตัวละครที่ชาญฉลาดฉันคิดว่า programm ปัจจุบันผิดกฎ
Frédéric

ฉันไม่แน่ใจว่าเวอร์ชั่นก่อนหน้านี้ทำผิดกฎหรือไม่ สถานะ OP: "เหนือสิ่งอื่นใดซึ่งหมายความว่าหากคุณปฏิบัติต่ออินพุตเป็นลำดับของไบต์แทนที่จะเรียงลำดับอักขระโปรแกรมของคุณจะยังคงปฏิบัติตามข้อกำหนด (เว้นแต่การเข้ารหัส I / O ภาษาของคุณแปลกมาก) "
rturnbull

8

RProgNขนาด 11 ไบต์

~]S.E E.S]~

ครึ่งแรกของการทำเช่นนี้จะเป็นการยกของหนักทั้งหมดและด้วยความสะดวกสบายของ RProgN ในช่วงครึ่งหลังนั้นเป็นแบบไม่เปิด

~]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.

ลองออนไลน์!


8

เรติน่า 53 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

ลองออนไลน์!

ฉันค่อนข้างแน่ใจว่านี่ยังไม่เหมาะสม ( »เส้นดูเหมือนจะสิ้นเปลืองโดยเฉพาะและฉันมีโซลูชัน 45 ไบต์ที่เป็น palindromic ยกเว้นตัวละครตัวหนึ่ง) แต่ฉันคิดว่ามันเป็นการเริ่มต้น


8

GNU sed , 64 59 + 1 (แฟล็ก r) = 60 ไบต์ UTF-8

เอาฉันมาสักพักเพื่อหาคำตอบที่ไม่ได้ใช้ส่วนความคิดเห็นเพื่อทำให้โค้ดเป็นแบบ palindrome แต่ฉันใช้cคำสั่งที่จะพิมพ์ครึ่งแรกของรหัสในลำดับย้อนกลับ แต่ฉันมั่นใจว่าคำสั่งนี้ไม่ถึง

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

สคริปต์จะพิมพ์1หากสตริงอินพุตไม่ใช่ Palindrome (คิดว่าเป็นข้อผิดพลาด) หากสตริงเป็น Palindrome จะไม่มีการกำหนดเอาต์พุตใด ๆ (ให้คิดว่ามันออกมาเรียบร้อยแล้ว)

เรียกใช้ตัวอย่าง:หรือลองออนไลน์!

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

คำอธิบาย:

:                              # 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 ได้รับการสนับสนุนในตอนนี้ -rไม่ทำงาน แต่คุณสามารถห่อสิ่งทั้งหมดไว้ใน BASH ได้ ลองออนไลน์!
Riley

@Riley การใช้งานที่ดีของส่วนหัวและส่วนท้ายบน TIO ขอบคุณ วิธีแก้ปัญหาก่อนหน้าคือการย้ายรหัสไปยังรายการอาร์กิวเมนต์ด้วย -e แต่วิธีการของคุณดีกว่ามาก ฉันรอที่จะแก้ไข แต่วิธีนี้ฉันไม่จำเป็นต้อง
seshoumara

7

อลิซอายุ 19 ไบต์

/@.nzRoi\
\ioRzn.@/

ลองออนไลน์!

พิมพ์Jabberwockyสำหรับ palindromes และไม่มีอะไรสำหรับ palindromes ใช้งานได้กับอินพุต UTF-8 โดยพลการ

คำอธิบาย

เนื่องจากนี่เป็นงานการประมวลผลสตริงอลิซจะต้องทำงานในโหมด Ordinal เพื่อแก้ไข ในทางกลับกันหมายความว่าตัวชี้คำสั่งมีการเคลื่อนไหวในแนวทแยงมุมและดังนั้นเราต้องการอย่างน้อยสองบรรทัดเพื่อให้ IP สามารถเด้งขึ้นและลง linefeed ในโปรแกรมดังกล่าวทำให้ตำแหน่งที่ดีในการวางอักขระกลางของ palindrome นั่นหมายความว่าบรรทัดที่สองจำเป็นต้องย้อนกลับของบรรทัดแรก แต่เนื่องจากเราดำเนินการตัวละครทุกตัวในแต่ละบรรทัดเท่านั้นหากเราตรวจสอบให้แน่ใจว่าความยาวบรรทัดนั้นเป็นเลขคี่การย้อนกลับของรหัสจะพอดีกับช่องว่างของตัวเองอย่างเรียบร้อย ตัวละครเดียวที่ไม่ได้ใช้เลยก็คือแบ็กสแลช แต่เนื่องจากมันเป็นกฎเกณฑ์ฉันเลือกมันเพื่อให้โปรแกรมดูดีและสมมาตร

ดังนั้นรหัสที่เกี่ยวข้องที่แท้จริงคือ:

/ . z o
 i R n @

ซึ่งจะถูกดำเนินการในซิกแซกจากซ้ายไปขวา

/   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 ไบต์

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

ลองออนไลน์! โทรหาf "some string"ผลตอบแทนหรือTrueFalse

=<<ผู้ประกอบการเกี่ยวกับฟังก์ชั่นการทำงานเช่นf=<<g = \s -> f (g s) sดังนั้นรหัสเทียบเท่ากับf s=s==reverse sที่ที่ผมเพิ่งสังเกตเห็นจะส่งผลในการนับไบต์เดียวกัน


รุ่นที่ไม่มีความคิดเห็น: (49 ไบต์)

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

ลองออนไลน์!

p "some string"โทรหา เอาต์พุตนี้Falseหากสตริงที่กำหนดเป็น palindrome และTrueหากไม่ใช่ palindrome

คำอธิบาย:

ฉันพบความคิดเห็นฟรี palindrome โดยเริ่มต้นด้วยรุ่นความคิดเห็นและแทนที่ความคิดเห็นด้วยบรรทัดใหม่:

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

บรรทัดที่สองล้มเหลวเนื่องจากวงเล็บไม่ตรงกันดังนั้นเราต้องกำจัดมันออก หากเรามีฟังก์ชั่นeที่ตรวจสอบความเท่าเทียมกันแล้ว

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

ทั้งสองจะรวบรวมกับบรรทัดที่สองกำหนดมัดผู้ประกอบการ<<=ซึ่งจะใช้เวลาสองมีปากเสียงesreverและและผลตอบแทนการทำงานep

เพื่อกำหนดeเป็นฟังก์ชั่นความเท่าเทียมกันอย่างใดอย่างหนึ่งปกติจะเขียนe=(==)แต่)==(=eจะไม่รวบรวมอีกครั้ง แต่เราอาจจะใช้เวลาอย่างชัดเจนทั้งสองมีปากเสียงและส่งพวกเขาไปยัง:== e x y=x==yตอนนี้โค้ดกลับด้านจะy==x=y x eคอมไพล์ แต่กำหนดตัว==ดำเนินการใหม่ซึ่งทำให้คำจำกัดความe x y=x==yล้มเหลว อย่างไรก็ตามหากเราเปลี่ยนไปใช้ตัวดำเนินการที่ไม่เท่ากัน/=คำจำกัดความที่ตรงกันข้ามจะกลายเป็นy=/x=y x eและกำหนด=/ผู้ประกอบการที่ไม่รบกวน/=ผู้ปฏิบัติงานเดิม


5

OIL , 178 ไบต์

อ่านอินพุต, ระเบิด, ค่อยๆเพิ่มความยาวของมัน (ผ่านการเพิ่มและลด) ไปยังที่อยู่ที่จะรู้ที่อยู่หลังจากสตริงกระโดดไปยังส่วนต่าง ๆ ของรหัส (ตรงกลาง), ย้อนกลับทิศทางของวงดนตรี, implodes สตริง อีกครั้งและตรวจสอบว่ามันเหมือนกับสตริงเดิมหรือไม่ TL: DR: มันเป็นความเจ็บปวดตามปกติ

เอาต์พุต40ถ้าสตริงไม่ใช่ palindrome 0หากเป็น

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
ภาษาเรียบร้อย! :)
DLosc

5

Javascript, 64 ไบต์

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

ฟังก์ชั่นการโทรfพร้อมสายอักขระ

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

ซอร์สโค้ดของคุณไม่ใช่ palindrome!
seshoumara

@seshoumara อัพเดตรหัส
Prasanth Bendra

ตอนนี้ก็ไม่เป็นไร อาจพูดถึงค่าตอบแทนถ้าสตริงไม่ได้เป็น palindrome เพียงเพื่อความสมบูรณ์
seshoumara

@apsillers ขอบคุณฉันแก้ไขคำตอบ
Prasanth Bendra

ไม่มีฟังก์ชั่นfโค้ดของคุณไม่ได้กำหนดฟังก์ชั่นลูกศรให้กับตัวแปรดังนั้นจึงไม่สามารถเรียกได้
spex

5

Japtap , 7 2 ไบต์

êê

เรียกใช้

โซลูชันเก่า:

U¥UwU¥U

ลองออนไลน์!

คำอธิบาย

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 ไม่หนีฟังก์ชันยกเว้นว่าถึงวงเล็บปิด (หรือเว้นวรรค)

นี้สามารถเขียนใหม่: U¥Uw(U¥U)→การ→การU¥Uw U==Uwใน Japtap วงเล็บออกจากจุดเริ่มต้นและจุดสิ้นสุดของฟังก์ชันจะถูกแทรกโดยอัตโนมัติ


ซึ่งทั้งหมดจะทำให้รู้สึกยกเว้นถ้าwเป็นฟังก์ชั่นที่ใช้เวลาการขัดแย้งใดเป็นวิธีการที่ไม่ได้นำไปใช้กับU? มันเป็นU.reverse()อย่างไร
DLosc

@DLosc ถูกต้อง มันฝืนในลักษณะเดียวกับที่U U.reverse()
โอลิเวอร์

4

ยูทิลิตีBash + Unix ขนาด 49 ไบต์

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

อินพุตถูกส่งผ่านเป็นอาร์กิวเมนต์

เอาต์พุตถูกส่งคืนในโค้ดผลลัพธ์ - 0 สำหรับ palindrome, 1 สำหรับ non-palindrome

บางทีใครบางคนสามารถทำได้ดีกว่าและไม่เพียง แต่พึ่งพาความคิดเห็นเพื่อสร้างรหัสให้เป็น Palindromic

ลองออนไลน์!


[[ $1 = `rev<<<$1` ]]สั้นกว่า ( [[ไวยากรณ์ทุบตีไม่ต้องอ้างคำพูด)
Arthur2e5

2
@ Arthur2e5 ฉันลองใช้คำแนะนำของคุณแล้ว แต่ฉันคิดว่าrev<<<$1จำเป็นต้องใช้อัญประกาศล้อมรอบแม้จะเป็น[[...]]ทางออกก็ตาม ทดสอบด้วยสตริงอินพุต'[$]]$['(ซึ่งเป็น palindrome) ด้วยราคาที่เพิ่มเข้ามาเพื่อให้มันใช้งานได้โซลูชันของคุณมีความยาวเท่ากับโซลูชันของฉัน
Mitchell Spector

เยี่ยมมาก! ฉันลืมว่า RHS ของ==ใน[[จะถูกตีความว่าเป็นcaseรูปแบบเหมือน
Arthur2e5

@ Arthur2e5 ฉันยังคิดว่าคงมีวิธีที่ฉลาดกว่าที่จะทำให้เรื่องนี้สั้นลง
Mitchell Spector

สิ่งนี้จะยังคงทำงานอยู่หรือไม่หากมีบรรทัดใหม่ในอินพุต ฉันคิดว่าคุณต้องการ rev | tac แทนที่จะเป็น rev
b_jonas

4

> <>, 11 ไบต์

{=?!;
;!?={

ลองที่นี่!

ส่งคืน "\ nsomething มีกลิ่นคาว ... " บนพาลินโดรมที่ถูกต้องไม่มีเอาต์พุตบนพาลินโดรมที่ไม่ถูกต้อง วาง palindrome บนสแต็ก


การกำหนดให้อินพุตอยู่ในสแต็กแล้วจะทำให้นี่เป็นข้อมูลโค้ด ความท้าทายนี้ต้องการโปรแกรมหรือฟังก์ชั่นไม่ใช่ตัวอย่าง
pppery

4

Java - 171 169 160 ไบต์

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

ความคิดเห็นในตอนท้ายคือการทำให้เป็นแบบ palindrome ส่งคืนP(alindrome)เมื่ออินพุตเป็นแพลงค์N(ot)ตอนและเมื่อไม่

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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 ไบต์ด้วย @DLosc

ขอบคุณ @Olivier Grégoireที่ชี้จำนวนไบต์ไม่ถูกต้อง! แก้ไขแล้ว


ฉันเชื่อว่าคุณสามารถบันทึกไบต์ได้โดยส่งคืนints แทนchars
DLosc

ฉันไม่ทราบว่าตรวจสอบจำนวนไบต์ของคุณอย่างไร แต่คุณมี 160 ไบต์ไม่ใช่ 161.
Olivier Grégoire

คุณสามารถบันทึก 2 ไบต์โดยส่งกลับ 80 สำหรับ'P'และ 78 สำหรับ'N'หรือใช้ตัวอักษรที่แตกต่างกันเพื่อบันทึกไบต์เพิ่มเติม
เซลิม

1
คุณสามารถบันทึกไบต์ได้มากขึ้นโดยทำnew StringBuffer(s).reverse()+""แทนnew StringBuffer(s).reverse().toString()
เซลิม

1
ด้วยเหตุผลใดก็ตามที่คุณกำลังส่งคืนintแทนbool?
CodesInChaos

4

Java 8, 92 90 ไบต์

นี่เป็นรุ่นความคิดเห็น หากสตริงมี reverse ของมันแสดงว่าเป็น palindrome ( true) มิฉะนั้นจะไม่ใช่ ( false)

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

ลองออนไลน์!

ปรับปรุง

  • -2 [18-04-05] เปลี่ยนเป็น ขอบคุณ@Kevin Cruijssen !
  • -2 [17-02-20] ลบ;'s
  • -16 [17-02-22] แปลงอัตโนมัติ

รหัสนี้ไม่ใช่การแสดงออกแลมบ์ดา
จา

@ Jakob ฉันคิดว่ามันเป็น หากคุณใช้แลมบ์ดาคุณอาจต้องการบรรทัดใหม่ที่เป็นผู้นำและต่อท้าย (ฉันเพิ่มลิงค์ tio)
NonlinearFruit

ใช่การร้องเรียนของฉันคือความคิดเห็นของบรรทัดทำให้การส่งมากกว่าแค่การแสดงออกแลมบ์ดาและดังนั้นจึงไม่ถูกต้องในฐานะแลมบ์ดา ไม่ต้องเป็นห่วงตอนนี้ ในที่สุดฉันจะสร้างเมตาโพสต์เพื่อรวบรวมฉันทามติ
Jakob

@ โซลูชั่น Jakob Lambda บางครั้งอาจมีรหัสภายนอกซึ่งเป็นเหตุผลที่ฉันคิดว่ามันถูกต้อง แต่ถ้าคุณไม่ได้ขายโพสต์เมตาจะไม่เจ็บ
NonlinearFruit

1
ฉันรู้ว่ามันรับในขณะที่ แต่คุณสามารถกอล์ฟ 2 s->s.contains(new StringBuffer(s).reverse())//))(esrever.)s(reffuBgnirtS wen(sniatnoc.s>-sไบต์โดยเปลี่ยนไป ลองมันออนไลน์90 ไบต์
Kevin Cruijssen

3

ที่จริงแล้ว 5 ไบต์

;R=R;

ลองออนไลน์!

เอาต์พุตที่เป็นจริงคือ[1]\n[1]และเอาต์พุตที่เป็นเท็จคือ[]\n[](ในทั้งสองเอาต์พุต\nแสดงถึงการขึ้นบรรทัดใหม่ตามตัวอักษร)

คำอธิบาย:

;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

ทำไมคุณไม่ทำเช่นนี้ ?
Leun Nun

1
@LeakyNun มันต้องเป็น palindrome
caird coinheringaahing

3

C ++, 154 ไบต์

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

ฉันต้องบอกว่าคำแถลงย้อนกลับนั้นมีค่าใช้จ่ายสูง แต่ฉันไม่สามารถจินตนาการได้ว่าฉันจะเปลี่ยนแปลงอะไรได้มากนัก ความสามารถในการตัดสัญลักษณ์ std :: จะช่วยฉันได้ประมาณ 10 ตัวอักษร แต่ "ใช้ namespace std;" ค่อนข้างน้อย

ฉันคิดว่า C ++ นั้นไม่ได้มีไว้สำหรับช่วงสั้น ๆ


3

Prolog ขนาด 44 ไบต์

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

สิ่งนี้ใช้ไวยากรณ์ประโยคที่แน่นอน จริงๆแล้วมันเป็นไวยากรณ์แบบบริบทที่สมบูรณ์:

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

การใช้งาน:

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

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

2

CJam, 13 ไบต์

l_W%=e#e=%W_l

คำอธิบาย:

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

ตัวอย่าง:

> 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

ลองสิ่งนี้:l_W%#e#%W_l
aditsu

2

J, 15 ไบต์, 15 ตัวอักษร

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

ส่งคืน 1 ถ้า palindrome, 0 ถ้าไม่ใช่

เอาท์พุท:

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

คำอธิบาย:

-:    NB. "Match" verb, checks for equality
|.    NB. Reverses the string
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.