Ode Golf - การลบจดหมาย


17

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

ตัวอย่างเช่นการป้อนข้อมูล

cat
cart
code
golf
ode
verify
versify

ควรให้ผลลัพธ์ของ

ca(r)t
(c)ode
ver(s)ify

ต้องแสดงหลายวิธีในการรับคู่เดียวกันครั้งเดียวเท่านั้น คุณสามารถส่งออกscra(p)pedหรือscrap(p)edแต่ไม่ใช่ทั้งสองอย่าง

เอาต์พุตควรเรียงลำดับตามตัวอักษรโดยรายการที่ยาวกว่า;

mart
mar
mat
ma

ควรมีผลลัพธ์ของ

ma(r)
ma(t)
ma(r)t
mar(t)

และสองหลังอาจอยู่ในลำดับใดก็ได้

ไฟล์พจนานุกรมอาจรวมถึงตัวพิมพ์ใหญ่เว้นวรรคยัติภังค์หรือเครื่องหมายวรรคตอน สิ่งเหล่านี้ควรถูกละเว้น ตัวอย่างเช่น

inlay 
in-play

in(p)layควรผลิต ผลลัพธ์ของคุณควรอยู่ในกรณีเดียวกัน อนุญาตพื้นที่ว่างเพิ่มเติม

อินพุตสามารถเป็น STDIN หรือจากไฟล์ มันคั่นด้วยการขึ้นบรรทัดใหม่ เอาท์พุทสามารถคืนค่าของฟังก์ชั่นหรือ STDOUT (หรือเขียนลงไฟล์ถ้าคุณต้องการ)

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ

(นี่เป็นความท้าทายครั้งแรกของฉันใน PPCG - แจ้งให้เราทราบหากฉันทำอะไรผิดและฉันจะแก้ไข)


3
สิ่งที่ควรจะแสดงผลสำหรับmart mar mat ma? มันจะเป็นmar(t) ma(r)t ma(r) ma(t)อย่างไร
Sp3000

@Sp: ลืมระบุคำสั่งซื้อ - แก้ไขเพื่อให้ชัดเจน
Deusovi

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

@Luk: ใช่! สำหรับไฟล์พจนานุกรมส่วนใหญ่จะมีคำจำนวนมากที่ไม่ทำให้เกิดคำอื่น ๆ - คำเหล่านั้นไม่ควรปรากฏที่ใดก็ได้ในผลลัพธ์
Deusovi

2
สิ่งที่เกี่ยวกับการอนุญาตให้ฟังก์ชั่นที่มีพารามิเตอร์สตริง (ใหญ่) กลับผลลัพธ์ที่ร้องขอเป็นอาร์เรย์สตริง? สิ่งนี้ให้ความสำคัญกับอัลกอริทึมโดยไม่จำเป็นต้องจัดการไฟล์ I / O
edc65

คำตอบ:


1

Perl -an0, 101 + 3 ไบต์

@F=sort{length$a<=>length$b}map{s/\W//g;lc}@F;map{$`.$'~~@F?print"$`($1)$'\n":$\while/(.)(?!\1)/g}@F;

ที่ไหน

  • @Fเป็นพจนานุกรมที่จัดเก็บในอาเรย์ให้บริการโดยมายากลธงรันไทม์ (b-oost, BoO # @% @ # $% $ # @ T)
  • map{s/\W//g;lc}@Fลบสัญลักษณ์ทั้งหมดออกจากคำและเปลี่ยนทุกอย่างเป็นตัวพิมพ์เล็ก (เพิ่ม, บูท)
  • sort{length$b<=>length$a}เรียงตามความยาว (บูต, เพิ่ม)
  • map{ (...) while/(.)(?!\1)/g}@Fตรงกับตัวละครทั้งหมดที่ไม่ได้ติดตามด้วยตัวละครเดียวกัน([b] oot, bo [o] t, boo [t], ... )
  • print"$`($1)$'\n"พิมพ์ส่วนที่นำหน้าวงเล็บและประสบความสำเร็จในการแข่งขัน ... (boo (s) t)
  • if $`.$'~~@F... หากการต่อข้อมูลทุกอย่างก่อนและหลังการแข่งขันอยู่ในพจนานุกรม ([หุยฮา] s [t])

5

JavaScript (ES6), 225

ฟังก์ชั่นที่มีพารามิเตอร์สตริงไม่มีอินพุตจากไฟล์ ฉันถาม OP ว่าสามารถใช้งานได้หรือไม่

ทดสอบการเรียกใช้ตัวอย่างข้อมูลในเบราว์เซอร์ที่สอดคล้องกับ EcmaScript 6 (การใช้ฟังก์ชั่นลูกศร, แม่แบบสตริง, ตัวดำเนินการแพร่กระจาย - Firefox, อาจจะเป็น Safari หรือ MS Edge ไม่ใช่ Chrome)

f=t=>t.split`
`.map(w=>(d[k=w.replace(/\W/g,'').toLowerCase()]={},k),d={},r=[]).map(w=>[...w].map((c,i,v)=>(d[v[i]='',x=v.join``]&&!d[x][w]&&r.push(d[x][w]=(v[i]=`(${c})`,v.join``)),v[i]=c)))&&r.sort((a,b)=>a.length-b.length)

// LESS GOLFED

Q=t=>{
  // convert to canonical form and put in a dictionary
  // each value in the dictionary is an hashtable tha will store the list
  // of words that can generate the current word, removing a letter
  d={},
  t=t.split`\n`.map(w=>(k=w.replace(/\W/g,'').toLowerCase(),d[k]={},k))
  r=[], // result array 
  t.forEach(w =>
    [...w].forEach((c,i,v)=>( // for each letter in word, try to remove
      v[i]='', x=v.join``, // build string with missing letter
      v[i]='('+c+')', y=v.join``, // and build string with brackets
      v[i]=c, // restore the current letter
      d[x] && // if the word with removed letter is present in the dictionary
      !d[x][w] && // and not already from the same generating word
         r.push(d[x][w]=y) // update dictionary and add word to result array
    ))
  )
  return r.sort((a,b)=>a.length-b.length) // sort result by length
}  

// TEST
function test() { R.innerHTML=f(I.value) }
textarea { height: 20em }
Test <button onclick="test()">-></button>
<span id=R></span>
<br><textarea id=I>cat
cart
code
golf
node
scraped
scrapped
verify
versify
mart
mar
mat
ma</textarea>


@ETHproductions right ขอบคุณ
edc65

3

ทับทิม, 173

->d{o=[]
c={}
d=d.sort_by{|w|[w.size,w]}.map{|w|w=w.upcase.gsub /[^A-Z]/,''
c[w]=l=1
w.size.times{|i|p,x,s=w[0...i],w[i],w[i+1..-1]
c[p+s]&&l!=x&&o<<p+"(#{w[i]})"+s
l=x}}
o}

ทดสอบที่นี่: http://ideone.com/86avbe

รุ่นที่อ่านได้ที่นี่: http://ideone.com/ynFItB


บนมือถือดังนั้นฉันไม่สามารถทดสอบได้ในตอนนี้ - คุณสามารถเพิ่มเคสทดสอบสำหรับ SCRAPPED / SCRAPED ได้ไหม
Deusovi

@Deusovi กรณีนั้นทำงานไม่ถูกต้อง ฉันแก้ไขมันตอนนี้ ...
Cristian Lupascu

@Deusovi อัปเดต!
Cristian Lupascu

คำตอบนี้ไม่ได้ให้ผลลัพธ์ที่ถูกต้องสำหรับเช่น['jacklantern','jackslantern','jack-o-lantern']dict
14mRh4X0r

1
@ 14mRh4X0r ไม่พบคำขอนั้นในคำถาม ... The output should be ordered by the longer entry;...and the latter two could be in either order.
edc65

1

ทับทิม, 211

ฉันตัดสินใจว่าจะใช้วิธีอื่นในการแก้ปัญหานี้โดยใช้ regex

->d{o=[]
d.map{|x|x.upcase!.gsub! /[-' ]/,''}
d.map{|x|(x.size+1).times{|i|o+=d.map{|w|w.b.sub! /(#{x[0...i]})(.)(#{x[i..-1]})/,'\1(\2)\3'if w[i]!=w[i+1]}}}
o.compact.sort_by{|w|[w.size,w.gsub(/[()]/,'')]}.uniq}

0

Perl 5, 210

โค้ดโหลดอินพุตในอาร์เรย์ที่เรียงลำดับแล้วตรวจสอบแต่ละค่ากับค่าทั้งหมดในอาร์เรย์ที่ยาวกว่า 1 ไบต์

map{@W=split//,$w=$_;map{@X=split//,$x=$_;if(@W+1==@X){$i=0;while($W[$i]eq$X[$i]&&$i<@W){$i++}$c=$X[$i];$e=substr($w,$i);print substr($w,0,$i)."($c)$e\n",if substr($x,$i+1)eq$e}}@D}@D=sort(map{s/[^\w]//g;lc}<>)

ทดสอบ

$ perl dictionairy_same_words.pl dictionairywords.txt
ca(r)t
in(p)lay
ma(r)
ma(t)
mar(t)
ma(r)t
(c)ode
ver(s)ify

0

Haskell, 201 ไบต์

import Data.List
import Data.Char
a#(b:c)=(a,b,c)
g a=[l++'(':m:')':n|x<-a,((l,m,n):_)<-[[o|o@(i,j,k)<-zipWith(#)(inits x)$init$tails x,elem(i++k)a]]]
f=sortOn length.g.map(filter isLetter.map toLower)

ฉันไม่แน่ใจว่ารูปแบบการป้อนข้อมูลใดที่ได้รับอนุญาต fใช้รายการของสตริง ถ้ามีเพียงสายเดียว (กับ NL แยกคำ) ที่ได้รับอนุญาตเพิ่ม.linesไปf(6 bytes)

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

f ["cat","cart","code","golf","od-e","verify","versify","on","s-o-n","Scrapped","scraped"]

["(s)on","ca(r)t","(c)ode","ver(s)ify","scra(p)ped"]

มันทำงานอย่างไร: เปลี่ยนทุกคำเป็นตัวพิมพ์เล็กและเก็บตัวอักษรเท่านั้น แยกทุกคำพูดxเป็นสองส่วนในตำแหน่งที่เป็นไปได้และทำให้ทุกอเนกประสงค์(i,j,k)ที่iเป็นส่วนแรกjเป็นอักษรตัวแรกของส่วนที่สองและkเป็นหางของส่วนที่สอง เก็บอเนกประสงค์ที่i++kปรากฏในรายการคำด้วย (l,m,n)ถ้ารายการนี้ไม่ว่างเปล่าใช้องค์ประกอบแรกเรียกว่า เปิดทุกหัวรายการที่เป็นรูปแบบการส่งออกที่จำเป็นโดยรอบmด้วย()และวางไว้ระหว่างและln

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