Ode Golf - Mektup Silme


17

Bir sözlük dosyası (her satırda bir kelime veya kelime öbeği içeren, olası noktalama işaretleri içeren ancak sayı içermeyen bir metin dosyası; satırlar alfabetik olarak yazılır) verildiğinde, başka bir kelime oluşturmak için bir sözcüğün bir harfin kaldırılabileceği her sözcük kombinasyonunu çıktılamanız gerekir; kaldırılan harf parantez içine alınmalıdır.

Örneğin, girdi

cat
cart
code
golf
ode
verify
versify

çıktı vermeli

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

Aynı çifti almanın birden çok yolu yalnızca bir kez görüntülenmelidir. Çıktı alabilir scra(p)pedveya scrap(p)edikisini birden veremezsiniz.

Çıktı , daha uzun girişle alfabetik olarak sıralanmalıdır ;

mart
mar
mat
ma

çıktısı olmalı

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

ve son ikisi her iki sırada da olabilir.

Sözlük dosyası büyük / küçük harfleri, boşlukları, kısa çizgileri veya kesme işaretlerini içerebilir; bunlar göz ardı edilmelidir. Örneğin,

inlay 
in-play

üretmelidir in(p)lay. Çıktınızın hepsi aynı durumda olmalıdır. Fazladan boşluğa izin verilir.

Giriş STDIN veya bir dosyadan olabilir; yeni satırlarla ayrılır. Çıktı bir işlevin dönüş değeri veya STDOUT (veya isterseniz bir dosyaya yazılabilir) olabilir.

Bu , bu nedenle bayttaki en kısa kod kazanır.

(Bu benim PPCG'deki ilk meydan okumam - yanlış bir şey yaptıysam ve düzeltirsem bana bildirin.)


3
Çıktı ne için olmalı mart mar mat ma? Olur mar(t) ma(r)t ma(r) ma(t)mu?
Sp3000

@Sp: Açıklığa kavuşturmak için düzenlenen siparişi belirtmeyi unuttum.
Deusovi

İlk örnekte golf kelimesi çıktıda değildir. Başka kombinasyonları olmayan bir kelime olduğu için mi?
LukStorms

@Luk: Evet! Çoğu sözlük dosyası için, başka sözcükler yapmayan birçok kelime olacaktır - bunlar çıktıda hiçbir yerde görünmemelidir.
Deusovi

2
İstenen çıktıyı dize dizisi olarak döndüren (büyük) dize parametresine sahip bir işleve izin vermeye ne dersiniz? Bu, odağı algoritmaya odaklayarak dosya G / Ç'sini yönetme ihtiyacını ortadan kaldırır.
edc65

Yanıtlar:


1

Perl -an0, 101 + 3 bayt

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

nerede

  • @Fçalışma zamanı bayrağı sihri tarafından sağlanan bir dizide saklanan sözlüktür. (b-oost, BoO # @% @ # $% $ # T @)
  • map{s/\W//g;lc}@Fkelimelerdeki tüm sembolleri kaldırır ve her şeyi küçük harfe çevirir. (yükseltme, önyükleme)
  • sort{length$b<=>length$a}uzunluğu sıralar. (önyükleme, yükseltme)
  • map{ (...) while/(.)(?!\1)/g}@Faynı karakter tarafından takip edilmeyen tüm karakterlerle eşleşir ([b] oot, bo [o] t, boo [t], ...)
  • print"$`($1)$'\n"bir eşleşmeden önce gelen, parantez içindeki ve başarılı olan kısımları yazdırır ... (boo (s) t)
  • if $`.$'~~@F... maçtan önce ve sonra her şeyin birleşimi sözlükte ise. ([bölme] s [t])

5

JavaScript (ES6), 225

Dize parametresi olan bir işlev, dosyadan girdi yok. OP'ye bunun geçerli olup olmadığını sordum.

Parçacığı EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin (ok işlevlerini, şablon dizesini, forma operatörünü - Firefox, belki Safari veya MS Edge, Chrome değil)

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

3

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

Burada test edin: http://ideone.com/86avbe

Burada okunabilir sürüm: http://ideone.com/ynFItB


Mobilde şu anda test edemiyorum - SCRAPPED / SCRAPED için bir test durumu ekleyebilir misiniz?
Deusovi

@Deusovi Bu durum düzgün çalışmıyor. Şimdi
düzeltiyorum

@Deusovi Güncellendi!
Cristian Lupascu

Bu cevap, örneğin ['jacklantern','jackslantern','jack-o-lantern']dikte için doğru çıktı sağlamaz .
14mRh4X0r

1
@ 14mRh4X0r bu talebi bu soruda bulamıyor ... The output should be ordered by the longer entry;...and the latter two could be in either order.
edc65

1

Yakut, 211

Regex kullanarak bunu çözmek için farklı bir yaklaşım benimsemeye karar verdim.

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

Kod, girişi sıralı bir diziye yükler ve dizideki 1 bayt daha uzun olan tüm değerleri karşılaştırır.

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

Ölçek

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

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)

Hangi giriş biçimine izin verildiğinden emin değilim. fdizelerin bir listesini alır. Sadece tek bir dize (nl kelimeleri ayrılmış birlikte) izin verilirse, eklemek .linesiçinf (6 bayt).

Kullanım örneği:

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

Nasıl çalışır: Her kelimeyi küçük harfe çevirin ve sadece harfleri saklayın. xMümkün olan her pozisyonda her kelimeyi ikiye bölün ve üçüncülüğü yapın (i,j,k); burada ibirinci kısım, jikinci kısmın ilk karakteri ve ikinci kısmın kkuyruğu. Üçlüleri i++ksözcük listesinde de göründüğü yerde saklayın . Bu liste boş değilse, ilk öğeyi alın, arayın (l,m,n). Çevredeki gerektirdiği çıkış biçimi içine tüm bu liste baktırın mile ()arasına koyarak lve n.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.