Ode Golf - Xóa thư


17

Cho một tệp từ điển (một tệp văn bản chứa một từ hoặc cụm từ trên mỗi dòng, có thể có dấu câu nhưng không có số; các dòng được xếp theo thứ tự chữ cái), bạn phải xuất từng tổ hợp các từ trong đó một chữ cái có thể được loại bỏ khỏi một từ để tạo từ khác; các chữ cái bị loại bỏ nên được đặt trong ngoặc đơn.

Ví dụ: đầu vào

cat
cart
code
golf
ode
verify
versify

nên cho một đầu ra của

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

Nhiều cách để có được cùng một cặp chỉ phải được hiển thị một lần. Bạn có thể xuất scra(p)pedhoặc scrap(p)ed, nhưng không phải cả hai.

Đầu ra nên được sắp xếp theo thứ tự abc bởi mục nhập dài hơn;

mart
mar
mat
ma

nên có một đầu ra của

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

và hai cái sau có thể theo thứ tự.

Tệp từ điển có thể bao gồm viết hoa, dấu cách, dấu gạch nối hoặc dấu nháy đơn; những điều này nên được bỏ qua. Ví dụ,

inlay 
in-play

nên sản xuất in(p)lay . Đầu ra của bạn nên được trong cùng một trường hợp. Khoảng trắng thêm được cho phép.

Đầu vào có thể là STDIN hoặc từ một tệp; nó được phân tách bằng dòng mới. Đầu ra có thể là giá trị trả về của hàm hoặc STDOUT (hoặc được ghi vào tệp nếu bạn muốn).

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.

(Đây là thử thách đầu tiên của tôi trên PPCG - hãy cho tôi biết nếu tôi đã làm gì sai và tôi sẽ sửa nó.)


3
Đầu ra để làm mart mar mat magì? Nó sẽ là mar(t) ma(r)t ma(r) ma(t)gì?
Sp3000

@Sp: Quên chỉ định thứ tự - chỉnh sửa để làm rõ.
Deusovi

Trong ví dụ đầu tiên, từ golf không có trong đầu ra. Có phải vì đó là một từ không có sự kết hợp khác?
LukStorms

@Luk: Đúng! Đối với hầu hết các tệp từ điển, sẽ có rất nhiều từ không tạo ra các từ khác - những từ đó không xuất hiện ở bất cứ đâu trong đầu ra.
Deusovi

2
Điều gì về việc cho phép một hàm với tham số chuỗi (lớn), trả về đầu ra được yêu cầu dưới dạng một mảng chuỗi? Điều này đặt trọng tâm vào thuật toán, tránh sự cần thiết phải quản lý I / O tệp.
edc65

Câu trả lời:


1

Perl -an0, 101 + 3 byte

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

Ở đâu

  • @Flà từ điển, được lưu trữ trong một mảng, được cung cấp bởi ma thuật cờ thời gian chạy. (b-oost, BoO # @% @ # $% $ # @ T)
  • map{s/\W//g;lc}@Floại bỏ tất cả các biểu tượng từ các từ và biến mọi thứ chữ thường. (tăng, khởi động)
  • sort{length$b<=>length$a}sắp xếp theo chiều dài. (khởi động, tăng tốc)
  • map{ (...) while/(.)(?!\1)/g}@F phù hợp với tất cả các nhân vật không được theo dõi bởi cùng một nhân vật ([b] oot, bo [o] t, boo [t], ...)
  • print"$`($1)$'\n" in các phần trước, ngoặc đơn và thành công một trận đấu ... (boo (s) t)
  • if $`.$'~~@F... Nếu kết hợp tất cả mọi thứ trước và sau trận đấu có trong từ điển. ([boo] s [t])

5

JavaScript (ES6), 225

Một hàm với tham số chuỗi, không có đầu vào từ tệp. Tôi hỏi OP nếu điều này có thể hợp lệ.

Kiểm tra chạy đoạn mã trong trình duyệt tuân thủ EcmaScript 6 (thực hiện các chức năng mũi tên, chuỗi mẫu, toán tử trải rộng - Firefox, có thể là Safari hoặc MS Edge, không phải 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 đúng, thx
edc65

3

Ruby, 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}

Kiểm tra nó ở đây: http://ideone.com/86avbe

Phiên bản dễ đọc tại đây: http://ideone.com/ynFItB


Trên thiết bị di động vì vậy tôi không thể kiểm tra ngay bây giờ - bạn có thể thêm trường hợp kiểm tra cho trường hợp SCRAPPED / SCRAPED không?
Deusovi

@Deusovi Trường hợp đó không hoạt động chính xác. Tôi đang sửa nó ngay bây giờ ...
Cristian Lupascu

@Deusovi Cập nhật!
Cristian Lupascu

Câu trả lời này không cung cấp đầu ra chính xác cho ví dụ ['jacklantern','jackslantern','jack-o-lantern']dict.
14mRh4X0r

1
@ 14mRh4X0r không thể tìm thấy yêu cầu đó trong câu hỏi ... The output should be ordered by the longer entry;...and the latter two could be in either order.
edc65

1

Ruby, 211

Tôi quyết định tôi sẽ thực hiện một cách tiếp cận khác để giải quyết vấn đề này, sử dụng 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

Mã tải đầu vào trong một mảng được sắp xếp và kiểm tra từng giá trị đối với tất cả các giá trị trong mảng dài hơn 1 byte.

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}<>)

Kiểm tra

$ 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 byte

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)

Tôi không chắc định dạng đầu vào nào được cho phép. fcó một danh sách các chuỗi. Nếu chỉ cho phép một chuỗi (với các từ được phân tách bằng nl), hãy thêm .linesvàof (+6 byte).

Ví dụ sử dụng:

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"]

Cách thức hoạt động: biến mọi từ thành chữ thường và chỉ giữ lại các chữ cái. Chia mỗi từ xthành hai phần ở mọi vị trí có thể và tạo thành bộ ba (i,j,k)trong đó ilà phần đầu tiên, jlà ký tự đầu tiên của phần thứ hai và klà phần đuôi của phần thứ hai. Giữ bộ ba nơi i++kcũng xuất hiện trong danh sách từ. Nếu danh sách này không trống, lấy phần tử đầu tiên, gọi nó (l,m,n). Biến tất cả những người đứng đầu danh sách sang định dạng đầu ra theo yêu cầu của xung quanh mvới ()và đặt nó giữa ln.

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.