오데 골프-편지 삭제


17

사전 파일 (각 줄마다 단어 나 구를 포함하고 문장 부호는 있지만 숫자는 포함하지 않은 텍스트 파일)이 주어지면 한 문자를 제거하여 다른 문자를 만들 수있는 각 단어 조합을 출력해야합니다. 제거 된 문자는 괄호로 묶어야합니다.

예를 들어, 입력

cat
cart
code
golf
ode
verify
versify

의 출력을 제공해야

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

동일한 쌍을 얻는 여러 가지 방법은 한 번만 표시해야합니다. 당신은 출력을 할 수있는 scra(p)pedscrap(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

첫 번째 예에서 golf라는 단어는 출력에 없습니다. 다른 조합이없는 단어이기 때문입니까?
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... 전과 후의 모든 것이 연결되어있는 경우 사전에 있습니다. ([후원])

5

자바 스크립트 (ES6), 225

파일로부터 입력이없는 문자열 매개 변수가있는 함수. 이것이 유효한지 OP에게 물었습니다.

EcmaScript 6 호환 브라우저에서 스 니펫 실행 테스트 (화살표 기능, 템플릿 문자열, 스프레드 연산자-Firefox, Chrome이 아닌 Safari 또는 MS Edge 구현)

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, thx
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


모바일에서는 지금 테스트 할 수 없습니다. 스크랩 핑 / 스크랩 핑 테스트 케이스를 추가 할 수 있습니까?
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

정규식을 사용 하여이 문제를 해결하기 위해 다른 접근법을 사용하기로 결정했습니다.

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

펄 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

하스켈, 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 단어 분리와 함께) 허용되는 경우, 추가 .linesf(6 바이트).

사용 예 :

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)ijki++k(l,m,n)m()ln

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.