รหัสที่สั้นที่สุดเพื่อตรวจสอบว่าสตริงเป็น Palindrome หรือไม่


42

palindromeคือสตริงบางอย่างที่จะสะกดทางเดียวกันทั้งต่องแต่ง ตัวอย่างเช่น 'Eva ฉันสามารถแทงค้างคาวในถ้ำได้หรือไม่' คือ palindrome (EVACANISTAB | BATSINACAVE)

สำหรับรหัสกอล์ฟนี้โดยใช้ภาษาที่คุณเลือกกำหนดว่าสตริงที่กำหนดเป็น palindrome หรือไม่

กรณีขอบ:

  • เครื่องหมายวรรคตอนจะไม่ถูกนับรวมกับความน่ากลัว
  • อักขระควบคุมจะไม่ถูกนับรวมกับความน่ากลัว
  • ช่องว่างจะไม่นับรวมกับความมืดมน
  • ตัวเลขจะถูกนับรวมกับความน่ากลัว
  • กรณีในการท้าทายนี้จะไม่นับรวมกับความน่ากลัว
  • ไม่มีการจำกัดความยาวของสตริงที่จะประเมินยกเว้นภาษาที่คุณเลือก
  • สำหรับความท้าทายนี้ จำกัด ตัวคุณเองไว้ที่ชุดอักขระ ASCII

ข้อกำหนดทางเทคนิค:

  • ร่างกายวิธีการเท่านั้นที่จำเป็น; สิ่งเพิ่มเติมเช่นลายเซ็นวิธีการประกาศโครงสร้างข้อมูล ฯลฯ ไม่นับรวมในข้อกำหนดของชัยชนะ
  • รหัสจะต้องรวบรวมหรือตีความโดยไม่มีข้อผิดพลาดในเวลารวบรวมหรือข้อยกเว้น
  • รหัสต้องไม่ส่งข้อยกเว้นหรือข้อผิดพลาดที่ไม่สามารถจัดการได้ (เกือบไม่มีความจำเป็นต้องพูดเกือบ)
  • รหัสจะต้องส่งกลับค่าบางอย่างที่บ่งบอกถึงความน่ากลัว ประเภทข้อมูลขึ้นอยู่กับภาษาที่คุณใช้ (เช่นผู้ใช้ C # อาจใช้ a boolในขณะที่ผู้ใช้ JavaScript สามารถใช้ a var.)
  • คุณไม่สามารถเขียนล่ามของคุณเองที่ทำงานนี้เป็นความสามารถแบบ 'เนทีฟ' เพื่อให้คุณ 'กอล์ฟ' ได้คะแนนที่ใกล้เคียง (หวังว่าไม่จำเป็นต้องพูด)

เงื่อนไขชัยชนะ:

  • รหัสที่สั้นที่สุดในตัวละครชนะ

ผู้นำปัจจุบัน: tmartin (k, 25 ตัวอักษร)

... ต้องการคำตอบของคุณใช่ไหม เอาชนะคำตอบของผู้ชายคนนี้!


1
I / O เป็นส่วนหนึ่งของความท้าทายหรือไม่หรือร่างกายของฟังก์ชั่นจะทำอะไร?
John Dvorak

1
"breadcrumbs" เพื่อแสดงว่างานได้รับการขัดเกลาอย่างไรพร้อมใช้งานทั่วทั้งไซต์ในคำตอบทั้งหมดผ่านประวัติการแก้ไข ไม่จำเป็นต้องเปิดเผยประวัติทั้งหมดในคำตอบเวอร์ชันปัจจุบัน
Peter Taylor

1
@WernerCD ฉันมั่นใจว่า OP จะเปลี่ยนผู้ที่ได้รับเครื่องหมายสีเขียวเมื่อเขากลับมาเพื่อตรวจสอบคำตอบใหม่
Gareth

2
การไม่ระบุภาษาเป็นเรื่องท้าทายสำหรับฉันอย่างยิ่ง ดังที่อธิบายไว้ด้านล่างภาษาที่แปลโดยมุ่งเน้นไปที่ฟังก์ชั่นการจัดการข้อความที่มีลำดับสูงมักจะได้ผลลัพธ์ที่สั้นที่สุด อะไรคือสิ่งที่ห้ามไม่ให้ฉันรวบรวมล่ามของฉันเองด้วยฟังก์ชั่นเดียวคือ ip () อัลกอริทึมการแข่งขันของฉันคือ 'ip: i' 4 ตัวอักษร เสร็จแล้ว
Gusdor

3
@Gusdor เห็นJ และ GolfScript ดูดทุกความสนุกจาก Code Golfและภาษาแฮนดิแคปและคำถามที่เกี่ยวข้องกับ meta ของเว็บไซต์นี้
AakashM

คำตอบ:


29

K, 25

{x~|x:_x@&x in,/.Q`a`A`n}

.

k){x~|x:_x@&x in,/.Q`a`A`n}"Eva, can I stab bats in a cave?"
1b

ดูเหมือนว่าจะมีส่วนผสมของ Q และ k: P
skeevey

ฉันจะไม่เรียกว่า. QA และอื่น ๆ พวกมันเป็นเพียงเครื่องห่อของสตริงไม่มีรหัส k ที่แท้จริงข้างใต้ ตอนนี้ถ้าฉันพูด. q.inter ฉันจะมีปัญหา
tmartin

ผมคิดว่ามันเป็นกรณีของการพูดคลุมเครือมากกว่าความหมาย แต่พวกเขามีการกำหนดใน QK
skeevey

สามารถพูด Q สำหรับ 31:{x~(|)x:(_)x inter(,/).Q`a`A`n}
tmartin

ฉันรู้ว่ามันเก่ามาก แต่ ... คุณสามารถบันทึก 1 ไบต์ด้วย{#|:\_x@&x in,/.Q`a`A`n}โดยที่ 1 เป็นจริงและ 2 เป็นเท็จ
เขียนลวก ๆ

24

Perl, 26 อักขระ

s/_|\W//g;uc eq reverse uc

หาค่า 1 เมื่อ$_เป็น palindrome ""(หนึ่งในค่าเท็จของ Perl) เมื่อไม่มี

ตัวอย่างการใช้งาน:

sub palin {
    s/_|\W//g;uc eq reverse uc
}
while (<DATA>) {
    chomp;
    print "$_ => ",palin()?"yes":"no","\n";
}
__DATA__
Eva, can I stab bats in a cave?
A man, a plan, a canal. Panama!
Madam, I'm Adam Corolla.
757
Boeing 757
A man, a plan, a big shovel, a canal. Panama!
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__

เอาท์พุท:

Eva, can I stab bats in a cave? => yes
A man, a plan, a canal. Panama! => yes
Madam, I'm Adam Corolla. => no
757 => yes
Boeing 757 => no
A man, a plan, a big shovel, a canal. Panama! => no
A man, a plan, a canoe, pasta, heros, rajahs, a coloratura, maps, snipe, percale, macaroni, a gag, a banana bag, a tan, a tag, a banana bag again (or a camel), a crepe, pins, Spam, a rut, a Rolo, cash, a jar, sore hats, a peon, a canal >> __Panama__ => yes

ประณามคุณเอาชนะฉันไป แม้ว่ามันจะไม่ทำงานอย่างถูกต้องถ้ามี_ในสตริงจะได้หรือไม่ และมันไม่รับอินพุตใด ๆ ดังนั้นคุณไม่จำเป็นต้องใช้-pตัวเลือกเหรอ?
Gareth

\Wใน regexes ไม่รวมขีดล่าง ฉันเกรงว่าคุณจะต้องการ[^a-z\d]regex ของคุณ ฉันกลัวว่าฉันจะพ่ายแพ้ต่อไป
John Dvorak

3
บันทึกเป็นหนึ่งเดียวกับแทน_|\W [_\W]
Howard

1
คุณสามารถร่น_|\Wไป\Pl: ideone.com/0ufdaQ ควรเป็นเพียงตัวอักษร Unicode
Kobi

จริง ๆ แล้วคิดอีกครั้ง - \Plจะไม่ตรงกับตัวเลขดังนั้นฉันเดาว่า_|\Wดีที่สุดที่คุณสามารถทำได้
Kobi

18

C # 82 เท่านั้น :)

var x=s.ToLower().Where(char.IsLetterOrDigit);return x.SequenceEqual(x.Reverse());

ไม่สามารถต้านทานสิ่งล่อใจในการเขียนโปรแกรมที่ไม่มีแผ่นสำเร็จรูปในภาษาที่ฉันโปรดปราน

มีการทดสอบที่นี่: http://ideone.com/8bwz7z


เรียบง่าย ... แต่สง่างาม!
Andrew Gray

@AndrewGray ขอขอบคุณสำหรับความคิดเห็นและข้อกำหนดทางเทคนิคที่ได้รับอนุญาต แผ่นเหล็ก C # ช่วยเพิ่มจำนวนถ่านอย่างจริงจังทำให้เป็นไปไม่ได้สำหรับการเล่นกอล์ฟ
Cristian Lupascu

2
ไม่มีปัญหา ฉันเป็นเพื่อน C # dev และฉันชอบเขียนโค้ดที่กระชับและมีประสิทธิภาพ มันเป็นความอัปยศมีต้นแบบมากในภาษา ...
แอนดรูสีเทา

13

GolfScript, 36 34 31 30 ตัวอักษร

{0"0:A[a{"@{>^}+/},{32|}%.-1%=

ขั้นตอนวิธีการคล้ายกับก่อนหน้านี้ (Javascript) วิธีการแก้ปัญหาของฉัน

0"0:A[a{"@{>^}+/- เพิ่มประสิทธิภาพโดย Peter Taylor และ Howard "/9@Z"{1$<},,2%\;รุ่นของฉันคือ ฮาวเวิร์ดบริจาคการต่อประสานงานและปีเตอร์เทย์เลอร์บริจาค XOR ให้กับโมดูโล -2 มันเป็นวิธีการทั่วไปในการเปรียบเทียบว่าค่าอยู่ในลำดับของช่วง

{.96>32*-}%(11 ตัวอักษร) ไม่ใช่การปรับปรุงจริง ๆ ของ Javascript .toUpperCase()(14 ตัวอักษร) โดยเฉพาะอย่างยิ่งเนื่องจากมันทำให้เครื่องหมายวรรคตอนแปลก ๆ ที่ตามมาzในตาราง ASCII (ซึ่งไม่สำคัญเท่านี้)

ตามที่แนะนำของ Peter Taylor แต่ถ้าเรากรองตัวอักษรและตัวเลขออกมาก่อนเราสามารถแปลงเป็นตัวพิมพ์เล็กและตัวเลขได้โดยการตั้งค่าหนึ่งบิตในแต่ละอักขระ: {32|}

.-1%=การยกของ Palindromic ทั้งหมดทำได้หรือไม่ ส่วนหนึ่งที่ฉันไม่ชอบจริง ๆ ใช้เวลานานแค่ไหนในการค้นหาวิธีย้อนกลับอาร์เรย์ ฉันควรอ่านเอกสาร อีกสองตัวละครทำการจัดการสแต็คและการเปรียบเทียบ

ทดสอบ: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEIGY2F2ZT8iCgp7IjA6QVtheyJcez59KywsMiV9LHszMnx9U4MS


เพิ่มเติมถ้าฉันสามารถสันนิษฐานได้ว่าไม่มีตัวควบคุมต่อไปนี้ปรากฏอยู่: (Data link escape, การควบคุมอุปกรณ์ 1-4, การตอบรับเชิงลบ, ไม่ได้ใช้งานแบบซิงโครนัส, จุดสิ้นสุดของบล็อกการส่งข้อมูล, ยกเลิก, จุดสิ้นสุดของสื่อ) ทั้งหมดค่อนข้างคลุมเครือ) หรือถ้าฉันสามารถใช้มันเป็นตัวเลขตัวพิมพ์ใหญ่ของตัวเลข 0-9 เราสามารถบันทึกอักขระอีกสองตัวได้:

GolfScript 28 ตัวอักษร

{32|}%{0"0:a{"@{>^}+/},.-1%=

ทดสอบ: http://golfscript.apphb.com/?c=IkV2YSwgY2FuIEkgc3RhYiBiYXRzIGluIGEIGY2F2ZT8iCgp7MzJ8fSV7MCIwOmF7II


2
คุณสามารถกำจัดการทำความสะอาดและบันทึกสองตัวอักษร:{"0:A["\{>}+,,2%},
โฮเวิร์ด

@Howard ขอบคุณ ฉันคิดว่าฉันเข้าใจผิด+ในบล็อก นั่นเป็นเคล็ดลับที่ยอดเยี่ยม
John Dvorak

1
คุณสามารถบันทึกสามตัวอักษรโดยกลับตัวกรองและมาตรฐานกรณีและปัญหา คุณต้องเพิ่มลงa{ในรายการอักขระของตัวกรองเพื่อรวมตัวอักษรตัวพิมพ์เล็ก แต่คุณสามารถใช้ตัวพิมพ์เล็ก{32|}%ได้ ผลลัพธ์ที่ได้คือ{"0:A[a{"\{>}+,,2%},{32|}%.-1%=
Peter Taylor

นอกจากนี้ยังมีการบันทึกอื่นที่จะทำในตัวกรอง การนับโมดูโล 2 คือ xor ดังนั้น0"0:A[a{"@{>^}+/การทำงาน
Peter Taylor

@PeterTaylor หากฉันไม่ได้ทำการเพิ่มประสิทธิภาพอื่นด้วยตัวเองในไม่ช้าฉันก็ควรเปลี่ยนมาใช้ wiki ชุมชน ขอขอบคุณอีกครั้ง :-)
John Dvorak

8

Javascript, 53 ตัวอักษร:

(x=x.toLowerCase().match(/[a-z\d]/g))+""==x.reverse()

เป็นนิพจน์ javascript ที่ประเมินว่าเป็นจริงหากxเป็น palindrome เป็นเท็จถ้าไม่ใช่ มันถือว่าxเป็นสตริง หากไม่ได้รับประกันรับประกันว่าจะได้รับการเติมเงินx+="",

นี่คือเกล็ดขนมปัง: เนื่องจากวิธีการreverse()ทำงาน

(x=x.toLowerCase().match(/[a-z\d]/g))==""+x.reverse()

ล้มเหลว อย่างไรก็ตาม

""+(x=x.toLowerCase().match(/[a-z\d]/g))==x.reverse()

ดีอย่างสมบูรณ์แบบ


ชิ้นอาหารอันโอชะที่ดีในการเชื่อมสตริงว่าง! คะแนนสำหรับ infoz ที่ดี!
Andrew Gray

3
คำแนะนำ: +""ปลดเปลื้องสตริง, ปลด+ล็อกไปยังหมายเลข, |0และ~~ส่งไปยังเลขจำนวนเต็ม, !!ปลดเปลื้องกับบูลีน
John Dvorak

ตัวอักษรสั้นลงด้วย regex/[^\W_]/g
SuperPrograman

7

R: 66

w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))

การใช้งาน:

f=function(s){w=grep("[a-z0-9]",strsplit(tolower(s),"")[[1]],v=T);all(w==rev(w))}

f("Eva, can I stab bats in a cave?")
[1] TRUE

7

Bash: 52 48 46 ตัวอักษร

s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]

สิ่งนี้ใช้การ sting เพื่อตรวจสอบว่าเป็นพารามิเตอร์แรกและตั้งรหัสทางออกเป็น 0 สำหรับ palindrome และ 1 ไม่ใช่

วิ่งตัวอย่าง:

bash-4.2$ p() { s=${1,,};s=${s//[^a-z0-9]};[ $s = `rev<<<$s` ]; }

bash-4.2$ p 'Eva, can I stab bats in a cave?'; echo $?
0

bash-4.2$ p 'A man, a plan, a canal. Panama!'; echo $?
0

bash-4.2$ p "Madam, I'm Adam Corolla."; echo $?
1

bash-4.2$ p '757'; echo $?
0

bash-4.2$ p 'Boeing 757'; echo $?
1

bash-4.2$ p 'A man, a plan, a shovel, a canal. Panama!'; echo $?
1

bash-4.2$ p 'A_man,_a_plan, a_caremer, a canal:_Panama!'; echo $?
0

7

Python 2: 49 (ไม่นับลายเซ็นวิธีการ)

def f(s):
 s=filter(str.isalnum,s.upper())
 return s==s[::-1]

โปรแกรมที่สมบูรณ์พร้อมอินพุตและเอาต์พุตสามารถเขียนได้ด้วยอักขระ74ตัว

import sys
s=filter(str.isalnum,sys.stdin.read().upper())
print s==s[::-1]

ตัวอย่างการใช้งาน:

$echo 'Eva,can I stab bats in a cave?' | python palindrome.py
True 
$ cat huge_palindrome.txt | python palindrome.py
True
$echo 'Able was I ere i SaW elBa' | python palindrome.py                                                                   
True                                         

( huge_palindrome.txtมีคำศัพท์ 17,826 คำนี้ )

โซลูชันนี้สามารถปรับใช้กับ python 3 โดยเพิ่มอักขระบางตัว:

Python 3: 55

def f(s):
 s=list(filter(str.isalnum,s.upper()))
 return s==s[::-1]

sys.stdin.readเป็นพื้นเดียวกันกับraw_input
CalculatorFeline

ใน Python 3.8 คุณสามารถย่อให้เหลือ58 ไบต์
MilkyWay90

นอกจากนี้โซลูชัน Python 2 & 3 ของคุณคือ 61 ไบต์และ 67 ไบต์ตามลำดับ
MilkyWay90

@ MilkyWay90 คุณอาจจะพลาดได้โดยไม่ต้องนับลายเซ็นของวิธีการ ในปี 2013 มันเป็นประเพณีที่จะไม่รวมมัน ในการแก้ปัญหาอื่น ๆ ในคำถามนี้ในภาษาอื่นพวกเขาเพียงแค่ละเว้นและคิดว่าคุณมีอินพุตในsตัวแปร ฉันตัดสินใจที่จะให้คำจำกัดความที่สมบูรณ์ แต่ตามธรรมเนียมในปี 2556 ไม่รวมถึงวิธีการลงลายมือชื่อในความยาว
Bakuriu

@Bakuriu อ่าฉันเข้าใจแล้ว ฉันเคยมาที่นี่เพียงไม่กี่เดือนดังนั้นฉันจึงไม่รู้จักศุลกากรตั้งแต่ปี 2013
MilkyWay90

7

JAVA (หรือภาษาที่ใช้พูดมากที่สุด) 102 96 95 ตัว

s=s.replaceAll("\\W|_","");return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());

การใช้งาน (ด้วยรหัส ungolfed):

static boolean q(String s) {
    s=s.replaceAll("\\W|_","");
    return s.equalsIgnoreCase(new StringBuffer(s).reverse().toString());
}

public static void main(String[] args) {
    System.out.println(q("'A man, a plan, a canal - Panama!'"));
}

ย่อด้วยความช่วยเหลือของผู้แสดงความคิดเห็นด้านล่าง


1
ในขณะที่ฉันไม่รู้จัก Java (ฉันเป็นคน C # ตลกพอ) คุณไม่สามารถบันทึกตัวละคร 1 ตัวโดยกำจัดวงเล็บปีกกาในกรณีที่? EG: if(s==null) return 1==0;? หรือจาวาบังคับใช้ifคำประกาศบนงบ?
Andrew Gray

3
คุณพูดถูกฉันขอขอบคุณ !! ... ฉันไม่ได้สังเกตว่าพวกเขาอยู่ที่นั่นฉันเดาว่าฉันเป็นนักพัฒนา Java ที่ไม่ได้ใช้ C #?
jsedano

4
1) ตรวจสอบว่าพารามิเตอร์เป็นnullนิสัยที่ดี แต่ไม่ได้รับการฝึกฝนใน CodeGolf อย่างที่ฉันบอกได้ไม่มีใครทำในคำถามนี้ ข้ามมัน. 2) ช่องว่างระหว่างข้อโต้แย้งช่วยให้อ่านได้ แต่ไม่ใช่การเล่นกอล์ฟ ย้ายมัน; 3) แทนการอย่างชัดเจนtoLowerCase()การใช้สตริงภายหลังแทนequalsIgnoreCase() equals()วิธีนี้คุณจะต้องปรับการแสดงออกปกติ แต่ก็ยังสั้นกว่า 1 ตัวอักษร pastebin.com/s7H84faj
จัดการ

1
replaceAll("[^A-Za-z0-9]","")=>replaceAll("\\W","")
assylias

ที่จริงแล้ว: replaceAll("\\W|_","");เพื่อลบ_ด้วย => 95 ตัวอักษร
assylias

7

Mathematica 54 53

บันทึกหนึ่งไบต์ด้วย CatsAreFluffy:

PalindromeQ@StringCases[ToUpperCase@#,WordCharacter]&

สำหรับผู้ที่มีเวอร์ชัน 10.2 หรือก่อนหน้า:

#==Reverse@#&@StringCases[ToUpperCase@#,WordCharacter]&

ตัวอย่าง

PalindromeQ@StringCases[ToUpperCase@#, WordCharacter]&["Eva,can I stab bats in a cave?"]

จริง


PalindromeQสั้นกว่า 1 ไบต์#==Reverse@#&
CalculatorFeline

ฉันสงสัยว่าทำไมฉันไม่เคยเห็นมัน เวอร์ชั่น 10.3!
DavidC

PalindromeQ= #==Reverse@#&
CalculatorFeline

ใช่ฉันดาวน์โหลดเวอร์ชัน 10.4 เพื่อทดลองใช้
DavidC

ออกมาแล้วเหรอ? OHNO
CalculatorFeline

6

J, 30 ตัวอักษร

*/(=|.)tolower(#~'[^_\W]'rxE])

การใช้งาน:

   */(=|.)tolower(#~'[^_\W]'rxE])'A man, a plan, a canal - Panama!'
1
   */(=|.)tolower(#~'[^_\W]'rxE])'Doc, note: I dissent. A fast never prevents a fatness. I diet on cod'
1

6

k ( 50 48 45 38 ตัวอักษร)

ไม่แสดงข้อผิดพลาดทั้งหมดคืนค่าเริ่มต้นเป็น0b(false)

{X~|X@:&(X:_:x)in 10h$(48+!10),97+!26}

ตัวอย่าง:

k){X~|X@:&(X:_:x)in 10h$(48+!10),97+!26} "Eva, can I stab bats in a cave?"
1b

แก้ไข: โกนตัวละครอีกสามตัวโดยหลีกเลี่ยงตัวแปรกลาง H / T, CS -7: ไม่จำเป็นต้องระงับข้อผิดพลาด


1
น่าสนใจว่าในเวลาเพียง 3 ตัวละครมากขึ้นรหัสของฉันมากขึ้นอ่าน :-)
จอห์น Dvorak

ถ่านพิเศษหลุดเข้ามาฉันลบมันแล้ว
skeevey

5

Ruby: 43 38 ตัวอักษร

s=s.upcase.tr'^A-Z0-9','';s==s.reverse

วิ่งตัวอย่าง:

irb(main):001:0> p=->s{s=s.upcase.tr'^A-Z0-9','';s==s.reverse}
=> #<Proc:0x854592c@(irb):1 (lambda)>

irb(main):002:0> p['Eva, can I stab bats in a cave?']
=> true

irb(main):003:0> p['A man, a plan, a canal. Panama!']
=> true

irb(main):004:0> p["Madam, I'm Adam Corolla."]
=> false

irb(main):005:0> p['757']
=> true

irb(main):006:0> p['Boeing 757']
=> false

irb(main):007:0> p['A man, a plan, a shovel, a canal. Panama!']
=> false

irb(main):009:0> p['A_man,_a_plan, a_caremer, a canal:_Panama!']
=> true

1
คุณสามารถเขียนได้s.tr!('^A-Za-z0-9','').upcase!.reverse==s
Howard

ผู้ชายนานแค่ไหนที่ฉันรวมการใช้!วิธีการ! คุณทำให้ฉันประหลาดใจ @Howard ด้วยกลอุบายของคุณ
จัดการ

ปัญหาเล็กน้อยแม้ว่า @Howard trและtr!ดูเหมือนว่าจะทำงานแตกต่างกันเมื่อพวกเขาไม่มีอะไรจะแปล: pastebin.com/4YThW2qNที่ทำให้การp['757']ทดสอบผิดพลาดด้วย“ NoMethodError: เมธอด undcase `upcase! ' สำหรับ nil: ข้อผิดพลาด NilClass”
จัดการ

อ๊ะขอโทษ ไม่ได้คิดเกี่ยวกับกรณีนี้
Howard

1
สามารถตัดให้สั้นลงไปอีก:s=s.upcase.tr('^A-Z0-9','');s==s.reverse
Cristian Lupascu

5

C ++ 107 (miscounted) 100 (ผิดพลาด), 81

string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
  • ใช้ประโยชน์จากรูปแบบบิต ASCII
  • using namespace std;อาศัยอยู่กับความชั่วร้าย
  • ใช้ค่าบิตและและหรือแทนตัวดำเนินการเชิงตรรกะ
  • ใช้intเพราะมันสั้นกว่าหรือcharauto

    #include <string>
    using namespace std;
    
    bool IsPalindrome(const string & t) {
    string s;for(int c:t)if(isalnum(c))s+=c|32;return s==string(s.rbegin(),s.rend());
    }
    
    #include <cassert>
    
    int main() {
        assert(!IsPalindrome("gorilla"));  // simple failure
        assert( IsPalindrome("racecar"));  // simple success
        assert( IsPalindrome("Hannah"));   // case blind
        assert(!IsPalindrome("1999"));     // digit failure
        assert( IsPalindrome("2002"));     // digit success
        // Ignore spacing, punctuation, and case:
        assert( IsPalindrome(" \t09AZ/:@[`{za90"));  // boundaries
        assert( IsPalindrome("A man, a plan, a canal: Panama."));
        assert( IsPalindrome("Eva, can I stab bats in a cave?"));
        assert( IsPalindrome(""));  // empty string
        return 0;
    }
    

4

ลัวะอายุ 56 ปี

a=io.read"*l":lower():gsub("%W","")print(a:reverse()==a)

หาก%Wมีอะไรที่เหมือนกับ\Wใน regex มันก็จะแยกอักขระเช่นขีดล่าง สิ่งนี้ไม่พึงประสงค์
John Dvorak

ฉันตรวจสอบแล้ว%wไม่รวม_( %Wเห็นได้ชัดว่ารวมไว้แล้ว)
mniip

1
จำเป็นต้องใช้ฟังก์ชันของร่างกายเท่านั้น s=s:lower():gsub('%W','')return s:reverse()==s 46 chars
Egor Skriptunoff

แต่สิ่งที่เกี่ยวกับfunction(s)
mniip


4

Haskell, 43

การใช้ห้องสมุดมาตรฐานControl.Monad, Control.Monad.InstancesและData.Char:

ap(==)reverse.map toLower.filter isAlphaNum

ฉันไม่สามารถทำงานนี้ใน ghci import Data.Char import Control.Monad ap(==)reverse.map toLower.filter isAlphaNumไม่ไม่มันมีช่องว่างเช่นการเพิ่มหรือขอโทษฉันไม่ได้เกินไปกระตือรือร้นกับ Haskell :)
SlimJim

1
@SlimJim: โอ๊ะคุณต้องการControl.Monad.Instancesเช่นกัน (ฉันใช้อินสแตนซ์ monad ผู้อ่านที่มีapแต่ตัวอย่างที่ไม่ได้ส่งออกโดยControl.Monad.)
จอนจัง

4

PHP 60 ตัวอักษร

ก่อนอื่นลอง codegolf

//thank you manatwork
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x); 

ตัวอย่าง:

$c='Eva, can I stab bats in a cave?';
echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);
//prints 1

ไม่ต้องใช้วงเล็บในรอบตัวดำเนินการแรกของผู้ประกอบการที่ประกอบไปด้วย ternary ที่จริงแล้วไม่จำเป็นต้องใช้ผู้ประกอบการที่ประกอบไปด้วย - แค่เอาท์พุทจริงหรือเท็จในการเป็นตัวแทนของภาษาของคุณ และโดยการหลีกเลี่ยงคำแถลงแยกต่างหากสำหรับการมอบหมายให้ $ x 1 อีกตัวละครก็สามารถย่อให้สั้นลง: echo($x=preg_replace('/\W/','',strtolower($c)))==strrev($x);.
จัดการ

3

Python 2 64 Charecters:

i =''.join(re.findall('[a-z0-9]+',i.lower()))
return i==i[::-1]

@manatwork หากคุณแทนที่ตัวระบุทั้งหมดด้วยตัวระบุตัวอักษรหนึ่งตัวคุณจะได้รับ77เวอร์ชันของตัวละคร ไม่มีความคิดว่าทำไม abhiram โพสต์เวอร์ชั่นที่ไม่ดี
Bakuriu

@Bakuriu ไม่เป็นไรฉันพลาดหนึ่งแถลงการณ์ในคำถาม:“ ต้องการวิธีการของร่างกายเท่านั้น” แม้ว่าบรรทัดที่ 2 และ 3 จะให้ฉันเพียง 73 ตัวอักษร เกี่ยวกับการลดความยาวเพิ่มเติมไม่จำเป็นต้องใช้สตริงดิบและกลุ่มการดักจับทำให้re.findall('[a-z0-9]+',input.lower())ส่วนที่ 3 สั้นลง
จัดการ

@ การจัดการฉันแก้ไขโพสต์และเปลี่ยนแปลงตัวแปรเล็กน้อย ที่นำมาลงไปที่ 66 ใช่แอตทริบิวต์สตริงดิบนั้นไม่มีประโยชน์ที่นี่
abhiram

โอเค แต่ทำไมคุณยืนยันในกลุ่มการดักจับในนิพจน์ทั่วไป ทำงานอย่างถูกต้องโดยไม่ต้อง: pastebin.com/JzpNRRZU
จัดการ

ฉันคิดว่ามันติดกับฉันหลังจากโครงการหลามเมื่อเร็ว ๆ นี้ที่เกี่ยวข้องกับเรื่อง :) ขอบคุณสำหรับการชี้ให้เห็น
abhiram

3

Haskell 48

(\x->x==reverse x).map toLower.filter isAlphaNum

ใช้แบบนี้:

(\x->x==reverse x).map toLower.filter isAlphaNum$"Eva, can I stab bats in a cave?"

3

Smalltalk , Squeak / Pharo flavor
116 chars โดยใช้การจัดรูปแบบดั้งเดิมพร้อมแท็บ

คุณเพิ่มสองวิธีในการสตริง:

selffles
    ^self = self reverse
isPalindrome
    ^(self asUppercase asDecomposedUnicode select: #isAlphaNumeric) selffles

แน่นอนว่าเราสามารถกำจัดช่องว่างบางส่วนหรือใช้ชื่อเมธอดที่สั้นลงได้ แต่อย่าหักหลังวิญญาณของ Smalltalk

มากกว่านี้จะจัดการกับ palindromes ภาษาฝรั่งเศสเช่นในhttp://fr.wikipedia.org/wiki/Liste_de_palindromes_fran%C3%A7aisมีคำตอบไม่มากนักในหน้านี้

['Léon a trop par rapport à Noël' isPalindrome] assert.

คำตอบที่ฉลาดและมีประโยชน์!
Andrew Grey

3

Python 3 (51 ถ่าน)

และอาจเป็น Python 2

ขึ้นอยู่กับวิธีแก้ปัญหาAbhiram (พร้อมตีกอล์ฟที่รุนแรงมากขึ้น)

from re import findall

def palindrome(i):
 i=findall('[a-z\d]',i.lower())
 return i==i[::-1]

print(palindrome(input('Phrase: ')))

อาจสั้นลงเหลือ 46 ตัวอักษรโดยใช้ RE '\ w'

และตัวแปรที่มีฟังก์ชันการทำงานที่สั้นมาก (27 ตัวอักษร)

import re
l=str.lower
f=re.compile('[a-z\d]').findall

def palindrome(i):i=f(l(i));return i==i[::-1]

print(palindrome(input('Phrase: ')))

2

Windows PowerShell, 56 47 45 ตัวอักษร

อัปเดต (ดูความคิดเห็น) และสามารถลบเครื่องหมายวงเล็บรอบ ๆ regex:

($s=$s-replace'\W')-eq(-join$s[$s.length..0])

เดิม (56)

$s=$s-replace'[^\w]','';$s-eq($s[-1..-$s.length]-join'')

ยกเลิกการตีลูกเดิม:

$s = "Eva, can I stab bats in a cave?"
$s = $s -replace '[^\w]', ''
$rev = $s[-1..-$s.length] -join ''
$s -eq $rev

คุณสามารถตีกอล์ฟลงได้ถึง 47 ตัวอักษรแบบนี้:($s=$s-replace'[\W]')-eq(-join$s[$s.length..0])
SpellingD

@SpellingD: ดี! ฉันใหม่รหัสกอล์ฟขอบคุณสำหรับการปรับปรุง
goric

($s=$s-replace'\W')-eq-join$s[$s.length..0]คุณสามารถเอาวงเล็บเพิ่มเติม:
mazzy

2

C ++, 74 ไบต์

รหัสนี้สวยงามจริงๆและเข้าใจง่าย (เมื่อจัดรูปแบบอย่างถูกต้อง) ฉันไม่เชื่อว่าเป็นไปได้ที่จะสั้นลงใน C ++ และไม่ใช้ฟังก์ชันไลบรารีมาตรฐานใด ๆ

p(auto c){auto e=c;while(*e)++e;--e;while(*e==*c&e>c)--e,++c;return e<=c;}

ตัวอย่างการใช้งาน:

p("Hello"); //Outputs 0
p(""); //Outputs 1
p("a"); //Outputs 1
p("HellolleH"); //Outputs 1

เวอร์ชันที่มีรูปแบบสวยงาม:

p(auto c)
{
    auto e=c;
    while(*e) ++e;
    --e;
    while(*e==*c & e>c)--e,++c;
    return e<=c;
}

1
error: ISO C++ forbids declaration of ‘p’ with no typeฟังก์ชั่นของคุณควรมีประเภทผลตอบแทน
Karl Napf

ฉันพนันได้เลยว่าไม่ได้เพิกเฉยกับตัวพิมพ์เล็กช่องว่างและตัวควบคุม
ติตัส

คุณสามารถบันทึกตัวอักษรที่มีแทนwhile(*++e); while(*e)++e;แต่ดังที่ Titus ได้กล่าวถึงคำตอบนี้ไม่ถูกต้อง
Nick Matteo

2

PHP, 26 84 80 78 62 63 ไบต์

<?=strrev($s=strtolower(preg_replace("#\W#","",$argv[1])))==$s;

รับอินพุตจากอาร์กิวเมนต์บรรทัดคำสั่งแรก พิมพ์1เพื่อความจริงสตริงว่างสำหรับเท็จ


I18n นั้นกว้างใหญ่ไพศาลเนื่องจากไม่มีทางเลือกหลายstrrevไบต์สำหรับ(110 bytes; run with -r):

preg_match_all("#.#us",$s=strtolower(preg_replace("#\W#u","",$argv[1])),$m);echo$s==join(array_reverse($m[0]);

utf8_strrev โจ๋งครึ่มขโมยจากคู่มือของ PHP คุณอาจต้องการดูโพสต์บล็อกนี้


มาติตัส ... มันล้มเหลวสเป็ค
Christoph

1
@ Christoph ใช่ฉันบางครั้งควรอ่านอย่างเต็มที่ แก้ไขแล้ว.
ติตัส

หืม-Rจะทำให้เกิดปัญหากับการแบ่งบรรทัดในสตริงเพื่อทดสอบใช่ไหม? จากข้อมูลจำเพาะ "-R <code> เรียกใช้ PHP <code> สำหรับทุกบรรทัดอินพุต" ยิ่งกว่านั้น<?=strrev($s=strtolower(preg_replace("#\W#","",$argn)))==$s;ก็จะสั้นลง
Christoph

1
@Christoph ดีคิด แต่ไม่มีโดยไม่ต้อง$argn -R
ติตัส

$argv[1]="O Genie, der Herr ehre dein Ego!"; # :D
ติตัส

1

ทับทิม, 48

p((g=gets.upcase.gsub /[^A-Z\d]/,'')==g.reverse)

ค่อนข้างง่ายและทำอย่างเร่งรีบไม่เล่นกอล์ฟมากจนเกินไป ฉันจะตีกอล์ฟทีหลัง


1

Pylongolf2 , 24 ไบต์

c╨2"[^a-zA-Z]"-_╨1=~

cใช้อินพุต╨2เพื่อแปลงเป็นตัวพิมพ์เล็ก
จากนั้นฉันจะผลัก regex ลงบนสแต็กและใช้-เพื่อลบอักขระที่ไม่ใช่ตัวอักษรทั้งหมดในอินพุต
_ทำซ้ำอินพุต
╨1ฝืนมัน=แล้วเปรียบเทียบพวกเขา
~พิมพ์สแต็คในที่สุดซึ่งพิมพ์อย่างใดอย่างหนึ่งหรือ truefalse


สิ่งนี้ไม่สนใจเครื่องหมายวรรคตอนช่องว่างและอักขระควบคุมใช่หรือไม่
MickyT

ฉันไม่ดีรุ่นนี้ไม่ได้ ฉันจะซ่อมมัน.

แก้ไขปัญหา

1

PowerShell, 194 190 ไบต์

การใช้งานแบบเรียกซ้ำเพื่อแสดงว่าสคริปต์ตัวบล็อก PowerShell ที่ไม่มีชื่อสามารถเรียกตัวเองได้อย่างไร

$P={param([string]$s)$s=($s-replace'[^a-z]').tolower();if(!$s){return $true};if($s.length-lt4){return $s[0]-eq$s[-1]};$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))}

ungolfed:

$P={
param([string]$s)
$s=($s-replace'[^a-z]').tolower();
if(!$s){return $true};
if($s.length-lt4){return $s[0]-eq$s[-1]};
$s[0]-eq$s[-1]-and(&$MyInvocation.MyCommand.ScriptBlock $s.trim($s[0]))
}

การทดสอบ:

&$P "Eva, can I stab bats in a cave?"
&$P "Eva, can I stab cats in a cave?"
&$P "A man, a plan, a canal. Panama!"
&$P "A man, a plan, a big shovel, a canal. Panama!"
&$P "Madam, I'm Adam."
&$P "Madam, I'm Adam Corolla."
&$P "757"
&$P "Boeing 757"

[^a-z0-9]ไม่ควรใช่มั้ย
ติตัส

1

05AB1E , 4 ไบต์ (ไม่แข่งขัน)

ไม่ใช่การแข่งขันเนื่องจากภาษาโพสต์ความท้าทาย รหัส:

álÂQ

คำอธิบาย:

á     # Only keep the alphabetic characters.
 l    # Lowercase the characters.
  Â   # Bifurcate, which duplicates the letters and reverses the duplicate.
   Q  # Check if they are equal.

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


พยายามเรียกใช้ผ่านลิงก์ของคุณ ผลลัพธ์ของโปรแกรมคือ "1"
Christopher Perry

1

เยลลี่, 10 ตัวละคร (ไม่แข่งขัน)

fØBŒl
UÇ⁼Ç

ส่งคืน 1 ถ้าเป็นจริง 0 ถ้าเป็นเท็จ

ลองออนไลน์!


มันไม่สนใจช่องว่างช่องว่างและอักขระควบคุมใช่หรือไม่ รายละเอียดจะดี
ติตัส

สถานะปัจจุบันของเยลลี่ช่วยให้การแก้ปัญหานี้ใน 7 ไบต์: fØBŒlŒḂ: fกรองเพื่อให้ØBชุด [a-zA-Z0-9] และŒlแปลงเป็นตัวพิมพ์เล็กแล้วŒḂทดสอบว่า palindrome
steenbergh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.