ค้นหา Semordnilaps


21

Semordnilaps (ยังเป็นที่รู้จักกันในนาม heteropalindromes, กึ่ง palindromes, ครึ่ง palindromes, reversgrams, mynoretehs, anagrams ย้อนกลับได้คำพลิกผันคำหรือ anadromes) เป็นคำที่สะกดเมื่อย้อนกลับ ตัวอย่างบางส่วนคือ:

  • วอร์ด <=> วาด
  • ขุด <=> เดนิม
  • อะไหล่ <=> สาย

รับจำนวนเต็มบวก N (ผ่านฟังก์ชั่นอาร์กิวเมนต์หรือ STDIN) ส่งคืน / ส่งออกรายการ semordnilaps จากรายการคำศัพท์ภาษาอังกฤษนี้ที่มีตัวอักษร N ทั้งหมด w.txtรายชื่อของคำที่สามารถบันทึกไว้ในเครื่องคอมพิวเตอร์ของคุณเป็นไฟล์ข้อความที่เรียกว่า: นอกจากนี้คุณยังสามารถรับรายการจาก url แต่จะรวมอยู่ในจำนวนไบต์

กฎ:

  1. Palindromesไม่ใช่ semordnilaps! ดังนั้นคำว่า "เที่ยง", "โรเตอร์" และ "เรดาห์" ไม่ควรรวมอยู่ในรายการ
  2. ควรมีเพียงหนึ่งคำ (ในคู่ semordnilap) ในรายการ ดังนั้นหาก "สุนัข" อยู่ในรายการคุณไม่ควรเป็น "พระเจ้า" (ไม่สำคัญว่าจะรวมอยู่ในรายการใด)
  3. หากไม่มี semordnilaps เอาต์พุตควรเป็นสตริงว่างเปล่า, 0, FALSE หรืออย่างอื่นที่ระบุว่าไม่มีผลลัพธ์ ฟังก์ชั่นจะต้องใช้งานได้แม้ว่าจะไม่มีผลลัพธ์

นี่คือโค้ดกอล์ฟเพื่อให้โค้ดที่สั้นที่สุดเป็นไบต์ชนะ!


ลีดเดอร์บอร์ด

ส่วนย่อยของสแต็กที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการของวิธีแก้ปัญหาที่สั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในบรรทัดแรกโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

## Ruby, <s>104</s> <s>101</s> 96 bytes

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

## Perl, 43 + 2 (-p flag) = 45 bytes

คุณยังสามารถทำให้ชื่อภาษาเป็นลิงก์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes



5
เอกพจน์ควรเป็นEmordnilapและพหูพจน์Semordnilapไม่ได้หรือ ;)
FryAmTheEggman

1
"Palindromes ไม่ใช่ semordnilaps!" ว้าวประโยค / สัญลักษณ์นั้นไม่ชัดเจนกว่านี้ แต่ตอนนี้ฉันเห็นสิ่งที่คุณหมายถึง คำที่เป็นตัวเองเมื่อกลับรายการไม่ใช่ semordnilaps
แมว

คำตอบ:


10

Pyth , 23 (18 รหัส, 5 จำเป็น STDIN)

J'f&qlTQ&}_TJ>_TTJ

นี่เป็นวิธีแก้ปัญหาที่ค่อนข้างตรงไปตรงมา

Jเก็บรายการคำศัพท์ จากนั้นเราจะกรองรายการคำ ( f J) ตามความยาวของคำที่เป็นอินพุท ( qlTQ) คำที่ตรงกันข้ามอยู่ในรายการ ( }_TJ) และการพลิกกลับคำที่มากกว่าคำ (>_TT ) เงื่อนไขสุดท้ายทำให้แน่ใจได้ว่าTจะไม่เป็นแบบ palindromic และมีการพิมพ์เพียงคู่เดียวเท่านั้น รายการผลลัพธ์จะถูกพิมพ์

วิธีการทำงานของ Pyth วิธีเดียวที่จะเปิดไฟล์ได้คือการรับชื่อไฟล์ใน STDIN นี่คือเหตุผลที่ฉันนับจำนวน STDIN จำนวน 5 ตัวw.txtในคะแนนของฉัน

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

$ pyth -c "J'f&qlTQ&}_TJ>_TTJ" <<< '6
w.txt'
['animal', 'denier', 'diaper', 'drawer', 'pupils', 'recaps', 'redraw', 'sleets', 'snoops', 'sports']

10

Ruby, 74 ไบต์

f=->n{i=IO.read('w.txt').split
p *i&[f.reverse]if f.size==n while f=i.pop}

ทำซ้ำรายการโดยลบองค์ประกอบซึ่งหลีกเลี่ยงทั้ง palindromes และส่งออกทั้ง "เครียด" และ "ขนมหวาน" การใช้ชื่อตัวแปรเดียวกันสำหรับฟังก์ชั่นและตัววนซ้ำได้รับการวนรอบการเล่นโวหารของไวยากรณ์: แม้ว่าf=i.popจะได้รับการประเมินมาก่อนf.reverseบรรทัดจะไม่แยกวิเคราะห์เว้นแต่จะfมีความหมายอะไรบางอย่างอยู่แล้ว pฉันยังสามารถใช้


4

ทุบตี134 157 118 ไบต์

f () { comm -12 <(sort w.txt) <(rev w.txt|sort)|while read w; do ((${#w}==$1))&&[[ $w<$(rev<<<$w) ]]&&echo $w; done; }

นี้ไม่ได้เป็นรายการที่ร้ายแรง แต่ในการตอบสนองของไบรอันคำตอบทุบตี นี่คือวิธีที่ฉันมักจะคิดเกี่ยวกับการเขียนโปรแกรมสิ่งนี้ใน Bash - โดยใช้ Bash ตัวเองให้น้อยที่สุดเท่าที่จะเป็นไปได้และการปล่อยให้เครื่องมือในตัวทำงานได้ทั้งหมด


คุณจะได้ทั้งคำและการสะท้อนจากคอมมิชชันต่อไปคุณสามารถสะท้อน "$ w" และไม่ต้องกังวลกับการเรียงลำดับและหางเพิ่มเติม หากคุณทำเช่นนั้นผลลัพธ์ควรถูกจัดเรียงแล้วดังนั้นการเรียงลำดับสุดท้ายก็สามารถลบออกได้
orion

ฉันไม่ทำตาม ฉันจะทำ dedupe ในแนวทางของคุณได้อย่างไร
Aaron Davies

นอกจากนี้ฉันลืมลบ palindromes อย่างสมบูรณ์ แก้ไขแล้ว.
Aaron Davies

ขออภัยการอดนอน ... คุณจำเป็นต้องเปรียบเทียบกับสิ่งที่ตรงกันข้ามเพื่อเก็บไว้เพียงหนึ่งในนั้น แต่คุณไม่ต้องกังวลเกี่ยวกับ palindromes และความคิดเห็นที่เหลือของฉันยังคงใช้ได้ และตอนนี้ที่คุณพูดถึงมันทุบตีมีดำเนินการเปรียบเทียบสตริงเพื่อให้ยังคงหลีกเลี่ยง&&[[ $w > $(rev<<<$w) ]]&& echo $w sort|tail -1ด้วยสิ่งนี้ฉันคิดว่าคุณสามารถวางเรียงลำดับสุดท้ายและไม่ซ้ำกันได้เพราะมันจะลบ palindromes และให้ผลลัพธ์เพียงหนึ่งคำเท่านั้น
orion

นอกจากนี้แมวที่ไร้ประโยชน์ในตอนแรก<(sort w.txt)ก็โอเค
orion

4

Python, 126 125 120 ไบต์

N=input()
J=open("w.txt").read().split()
for c in set(J):
 if N==len(c)and c!=c[::-1]and c[::-1]in J:print c;J.remove(c)

ทางออกที่ตรงไปตรงมาสวย


k=c[::-1]แต่ดูเหมือนว่ามันจะสั้นจะกำหนด นอกจากนี้คุณไม่สามารถโทรset()ครั้งที่สองได้หรือไม่ ฉันไม่คิดว่ามีไฟล์ซ้ำกันหรือ?
FryAmTheEggman

@FryAmTheEggman: จริง ๆ แล้วมันจะใช้เวลา 11 ตัวอักษรในการกำหนดk(9 สำหรับนิยามบวก 1 สำหรับ newline บวก 1 สำหรับช่องว่าง) แต่ฉันจะบันทึกเพียง 10 ตัวอักษร (เอาออก[::-1]สำหรับ 6 แต่เพิ่ม 1 เพราะฉันต้องมีช่องว่าง) เกี่ยวกับsetฉันต้องJมีการตั้งค่าเพราะฉันลบคำที่ใช้แล้วจากมันเพื่อตอบสนองกฎไม่มีใครล่อลวง
Claudiu

เปลี่ยนเป็นการN==len(c)andประหยัดพื้นที่
isaacg

@isaacg: อ่าใช่แล้ว
Claudiu

คุณเป็นสั้น=- ==ควรจะเป็น
isaacg

3

CJam, 48 47 45 42 38 ไบต์

เนื่องจากต้องนับ URL ฉันจึงใช้ตัวย่อ URL เช่นเดียวกับเครื่องมือเพิ่มประสิทธิภาพ

"ri.ms/§"gDcN+/{,ea~i=},_Wf%&{_W%>},N*

นี่§เป็นส่วนหนึ่งของ ASCII ที่ขยายเพิ่มดังนั้นอักขระแต่ละตัวในรหัสสามารถเข้ารหัสในไบต์เดียว

ในกรณีของเครื่องมือเพิ่มประสิทธิภาพคุณจะต้องใช้ตัวแปลภาษาจาวาและเรียกใช้งานแบบโลคัลจากไฟล์พูดsemordnilap.cjamแล้ว

java -jar cjam-0.6.2.jar semordnilap.cjam <N>

ดังนั้นอินพุตจะถูกกำหนดเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

มันทำงานอย่างไร (ล้าสมัยเล็กน้อย):

"Prepare word list:";
"ri.ms/§"gDcN+/ 
"ri.ms/§"g      "Fetch list from shortened URL.";
          DcN+  "Create \r\n string.";
              / "Split input into lines.";

"Process input:";
{,ea~i=},
{      }, "Filter the list.";
 ,        "Get word length.";
  ea      "Push command-line arguments.";
    ~     "Unwrap array.";
     i    "Convert to integer.";
      =   "Check equality.";

"Find all palindromes and semordnilaps:";
_Wf%&
_     "Duplicate list.";
 Wf%  "Reverse each line.";
    & "Set intersection.";

"Remove duplicates and palindromes:";
{_W%>},N*
{    },   "Filter list.";
 _W%      "Duplicate word, reverse.";
    >     "Check lexicographic order.";
       N* "Join with newlines.";

สตริงผลลัพธ์จะถูกพิมพ์โดยอัตโนมัติเมื่อสิ้นสุดโปรแกรม


3

Java, 280 218 ไบต์

เมื่อเทียบกับส่วนที่เหลือของการแข่งขันฉันไม่รู้เลยว่านี่เป็นคะแนนที่ดีหรือไม่

void a(int n)throws Exception{List<String>l=Files.readAllLines(Paths.get("w.txt"));for(String s:l){String c=new StringBuilder(s).reverse()+"";if(s.length()==n&&c.compareTo(s)>0&&l.contains(c)){System.out.println(s);}}}

ขยาย:

void a(int n)throws Exception{
    List<String>l=Files.readAllLines(Paths.get("w.txt"));
    for(String s:l){
        String c=new StringBuilder(s).reverse()+"";
        if(s.length()==n&&c.compareTo(s)>0&&l.contains(c)){
            System.out.println(s);
        }
    }
}

ใช้ CompareTo () เพื่อละเว้น palindromes และรายการที่ซ้ำกัน


2
Java จะระเบิดในการแข่งขันกอล์ฟเสมอ
Rodolfo Dias

ฉันไม่เคยเห็นFiles.readAllLines(Paths.get("w.txt"))มาก่อน นั่นเป็นเคล็ดลับที่มีประโยชน์
Ypnypn

2

CJam, 68 ไบต์

"www.ri.ms/§"gDc-N/{_,ea~~=\_W%=!*},:Q{_W%aQ\/,({Q\a-:Q;1}{;0}?},N*

คุณจะต้องดาวน์โหลดคอมไพเลอร์เวอร์ชั่น Java จากที่นี่และบันทึกรหัสข้างต้นลงในไฟล์ที่เรียกว่า words.cjam (สามารถเป็นชื่อใดก็ได้) จากนั้นเรียกใช้รหัสเช่น

java -jar cjam-0.6.2.jar <file_name> <input_number> [> <output_file_name>]

ตัวอย่างเช่นสำหรับN = 8,

java -jar cjam-0.6.2.jar words.cjam 8 > out.txt  

Java - นั่นไม่ใช่ตัวย่อ กรุณาอย่าสะกด JAVA
FUZxxl

@FUZxxl เท่านี้สามารถแก้ไขได้ด้วยตนเอง ..
เครื่องมือเพิ่มประสิทธิภาพ

ฉันไม่ใช่เจ้าหน้าที่ตำรวจ ผู้คนมีความคิดเห็นที่แตกต่างกันเกี่ยวกับการสะกดคำและฉันเคารพความคิดเห็นของคุณ ฉันแค่แนะนำให้คุณไม่สะกด Java ราวกับว่ามันเป็นตัวย่อฉันไม่ต้องการบังคับให้คุณสะกดคำอื่น
FUZxxl

@FUZxxl ฉันไม่ได้กลาง: D
เครื่องมือเพิ่มประสิทธิภาพ

2

Node.js, 172 ไบต์

ฟังก์ชั่น:

function d(n){return(require('fs').readFileSync("w.txt")+"").match(RegExp(("b"+Array(n+1).join("(.)")+"b(?=(.|s)*b"+"87654321".substr(-n)+"b)").replace(/\w/g,"\\$&"),"g"))}

การทดสอบ:

console.log(d(+process.argv[2]));
// run from command line like this:
// node main 4
// where
//   main is js file name
//   4    is length

2

K, 59 ไบต์

{*+?{x@<x}'+(w;r)@\:&(x=#:'w)&(~w~'r)&w in r:|:'w:0:`w.txt}

ตรงไปตรงมาสวย อ่านรายการ, สร้างรายการย้อนกลับ, ใช้จุดตัดของพวกเขา, กรอง palindromes, กรองในจำนวนที่ต้องการ, เรียงลำดับและขจัดข้อมูลซ้ำซ้อน


2

Ruby, 95 ไบต์

f=->n{l=[]
(a=IO.read"w.txt").split.map{|w|a[w]=?.
w.size==n&&a[/^#{r=w.reverse}\s$/]&&l<<w}
l}

คำอธิบาย

  • อินพุตถูกใช้เป็นอาร์กิวเมนต์สำหรับแลมบ์ดา Integerมันคาดว่า
  • อ่านไฟล์ในหน่วยความจำในรูปแบบString( a)
  • วนArrayคำทั้งหมด (โดยไม่ต้องขึ้นบรรทัดใหม่)
    • ลบคำจาก aลบคำจาก
    • Array lเพิ่มคำที่มีคุณสมบัติเหมาะสมกับ
  • lกลับ

Arrayส่งคืนค่าว่างเมื่อไม่พบคำที่มีคุณสมบัติเหมาะสม


1

Node.js, CoffeeScript, 132 ไบต์

f=(n)->(require('fs').readFileSync('w.txt')+'').split('\n').filter((s,i,f)->s.length==n&&f.indexOf(s.split('').reverse().join(''))>i)

Node.js, 162 ไบต์

function a(n){return(require('fs').readFileSync('w.txt')+'').split('\n').filter(function(s,i,f){return s.length==n&&f.indexOf(s.split('').reverse().join(''))>i})}

คอนโซล Chrome Dev Tools ขนาด 111 ไบต์ (ในหน้าดาวน์โหลด)

f=(n=>$('pre').innerText.split('\n').filter((x,i,a)=>x.length==n&&a.indexOf(x.split('').reverse().join(''))>i))

ทุกรุ่นกลับอาร์เรย์ของ Semordnilaps nทั้งหมดของความยาว

Node.js, 162 ไบต์

พิมพ์ semordnilaps ทั้งหมด:

function a(n){(require('fs').readFileSync('w.txt')+'').split('\n').map(function(s,i,f){s.length==n&&f.indexOf(s.split('').reverse().join(''))>i&&console.log(s)})}

1

จูเลีย 101 ไบต์

k=split(readall("w.txt"))
for(i=k)
([]!=(l=find(x->x==reverse(i)&&x!=i,k)))&&(println(i);k[l]="")
end

สิ่งนี้ควรใช้งานได้จริง ...


1

Mathematica, 105 ไบต์

F[f_,n_]:=(W=StringSplit@Import@f;Select[W,StringLength@#==n&&MemberQ[W,r@#]&&Order[r@#,#]==1&&r@#!=# &])

บางครั้งการนำเข้าจะแบ่งข้อความโดยอัตโนมัติเป็นรายการของบรรทัดหรือถือว่าเป็น CSV หรือ TSV ในเวลาอื่น ๆ การนำเข้าจะอ่านเนื้อหาของไฟล์ลงในสตริง การนำเข้าเป็นส่วนหลังสำหรับข้อมูลการทดสอบ

การทดสอบ


0

ทุบตี

f() {
  w=($(cat "${1}"))
  for ((i=0;i<=${#w[@]};i++)); do
    if ((${#w[$i]} == $2)); then
      r=
      for((x=${#w[$i]}-1;x>=0;x--)); do
        r="$r${w[$i]:$x:1}";
      done
      if [[ ${w[$i]} != ${r} ]] && grep -qw $r "${1}"; then
        echo "${w[$i]}, ${r}"
      fi
      unset w[$i]
    fi
  done
}

การทดสอบ ...

f /usr/share/dict/words 5

debut, tubed
decaf, faced
decal, laced
deeps, speed
denim, mined
devil, lived
draws, sward
faced, decaf
keels, sleek
knits, stink
laced, decal
lager, regal
leper, repel
lever, revel
lived, devil
loops, spool
loots, stool
mined, denim
parts, strap
peels, sleep
pools, sloop
ports, strop
rebut, tuber
regal, lager
remit, timer
repel, leper
revel, lever
sleek, keels
sleep, peels
sloop, pools
smart, trams
snaps, spans
snips, spins
spans, snaps
speed, deeps
spins, snips
spool, loops
spots, stops
sprat, tarps
stink, knits
stool, loots
stops, spots
strap, parts
straw, warts
strop, ports
sward, draws
tarps, sprat
timer, remit
trams, smart

2
ฉันเดาว่านี่ไม่ใช่การเล่นกอล์ฟมาก .. ? นี่จะเป็นคำตอบที่ดีสำหรับ Stack Overflow (ถ้ามีความคิดเห็นและคำอธิบาย)
Stewie Griffin

1
เห็นด้วยนี่คือการทำซ้ำครั้งแรกของฉันในการแก้ปัญหานี้ในการทุบตี ฉันเหนื่อยที่จะทำให้มันอ่านง่ายที่สุด แต่เท่าที่กอล์ฟไป มันเหมือนที่ฉันยิง 9 ในพาร์ 3: -)
Brian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.