Metin İşleme # 1: Tireleme


14

Arka fon

Bu, metin işleme üzerine 3 delikli bir golf sahasının ilk kısmıdır. Aşırı kavrama fikri, bir giriş metnini alır ve üç zorluğun (az miktarda tutkal koduyla) çözümlerine geçirirseniz, güzel biçimlendirilmiş bir paragraf çıkarır. Bu ilk zorlukta, göreviniz verilen tireleme kalıplarını kullanarak bir metin parçasını tirelemek.

Giriş

Programınız iki dize girişi alacaktır: bir metin parçası ve tireleme kalıpları listesi. İlk girdi, yazdırılamaz ASCII karakterleri ve boşluklarının boş olmayan bir dizesidir; satır kesmeleri veya tildler içermez ~. İkinci girdi, küçük harfli ASCII karakterlerinin tilde sınırlı hecelerinden oluşan, virgülle ayrılmış bir kelime listesidir. Bir örnek ex~cel~lent,pro~gram~ming,abil~i~ties.

Çıktı

Programınız ilk girişi aşağıdaki şekilde değiştirecektir. İkinci girişte tirelenmiş küçük harf versiyonu bulunan herhangi bir kelime (alfabetik ASCII karakterlerinin maksimum alt dizgisi), tirelenmiş sürümle değiştirilir, ancak durumu korunur. Yukarıdaki örnek listesiyle, metin kelimeyi içeriyorsa Excellent, bunun yerine Ex~cel~lent; Ancak Excellentlyeder değil değiştirilebilir. Çıktınız bu değiştirilmiş dize olacaktır.

Ayrıntılı Kurallar ve Puanlama

Girişler hakkında aşağıdakileri varsayabilirsiniz:

  • İlk giriş tildler içermez ve ön, arka veya tekrarlanan boşluk içermez. Boş değil.
  • İkinci girdi en az bir kelime içerir ve içindeki her kelime en az iki hece içerir. Her hece boş değildir.
  • İkinci giriş, başka bir kelimede hece olarak ortaya çıkan bir kelime içermez.

İsterseniz iki girişin sırasını değiştirebilir ve isteğe bağlı olarak çıkışa bir satırsonu ekleyebilirsiniz.

Bir işlev veya tam bir program yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklara izin verilmez.

Test Durumları

Bunlar formatta listelenir 1st input [newline] 2nd input [newline] output.

Excellent programming abilities, you work excellently!
ex~cel~lent,pro~gram~ming,abil~i~ties
Ex~cel~lent pro~gram~ming abil~i~ties, you work excellently!

Superman (sometimes incorrectly spelled "Super-man") is super #&%@ing strong.
su~per,some~times,in~cor~rectly,spell~ing
Superman (some~times in~cor~rectly spelled "Su~per-man") is su~per #&%@ing strong.

IncONsISTent caPItalizATIon!
in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!

Such short words.
awk~ward
Such short words.

Digits123 are456cool789.
dig~its,dig~i~tal,are~cool
Dig~its123 are456cool789.

magic magic
ma~gic
ma~gic ma~gic

Bu sorundaki olası tireleme hataları bu tireleme aracından kaynaklanmaktadır .


Girişin standart 7 bitlik ASCII olduğunu ve bazı genişletilmiş 8 bitlik sürüm olmadığını varsayıyorum?
orlp

Alfasayısal olmayan herhangi bir karakterin bir kelimede değişiklik olarak sayılmayacağını varsaymak doğru olur mu (örneğin, gibi bir ilk girdi #programming!, ikinci bir girdiden etkilenecektir pro~gram~ming)? Sayılar da sayılmaz mı (yani yalnızca alfabetik karakterlere izin verilir)?
cole

@orlp Evet, girdi burada listelenen standart yazdırılabilir ASCII karakterlerden oluşur .
Zgarb

@Kole Alfabetik olmayan karakterler kelimelerin bir parçası değildir (ikinci test senaryosuna bakın). Rakamlar alfabetik olmayan olarak sayılır, bunun için bir test örneği ekleyeceğim.
Zgarb

Tek bir kelimede maksimum hece olduğunu varsayabilir miyim?
Qwertiy

Yanıtlar:


5

Pip, 60 54 bayt

Fwa^`([A-Za-z]+)`O{aQ'~?'~w@++y}M(LCwQ_RM'~FIb^',Yv)|w

Pip için GitHub deposu

Girdileri komut satırı bağımsız değişkenleri olarak alır (boşluk içerdiği varsayılarak girdi 1 çevresinde tırnak işaretleri gerektirir). Sondaki satırsonu yazdırılmaz (bir satır eklemek xiçin programın sonuna bir satır ekleyin).

Biraz ungolfed, yorumlarla:

 ; Split 1st input on runs of letters, including the separators in the results
a^:`([A-Za-z]+)`
 ; Split 2nd input on commas
b^:',
 ; Iterate over the words w in that list
Fwa {
  ; Filter b for entries that match the current word (lowercase, with tildes removed)
 m:(LCw EQ _RM'~)FIb
  ; We expect this to be a list of 0 or 1 elements
  ; If it has one, m gets that element (the hyphenation pattern); if it's empty, m gets nil
 i:-1
 m:m@i
  ; Map this function to each character of pattern m: if it's tilde, return tilde;
  ; otherwise, return corresponding character of w
 m:{aEQ'~ ? '~ w@++i}Mm
  ; Output the result, unless it was nil (falsey), in which case output the original word
 Om|w
}

Örnek çalışma:

C:\Users\dlosc> pip.py hyphens.pip "IncONsISTent caPItalizATIon!" in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!

8

Retina , 88 bayt

+is`(?<![a-z~])([a-z~]+)(?=([a-z]+)+[^a-z~].*(?<=[\n,]\1(?(2)!)(?<-2>~\2)+[\n,]))
$1~
\n.*
<empty>

Sayım amacıyla, her satır ayrı bir dosyaya gider \n, yerine yeni satır karakteri konur ve <empty>boş bir dosyadır. Kolaylık sağlamak <empty>için, -syorumlayıcı bayrağını kullanırsanız yukarıdaki kodu tek bir dosyadan ( boş bir satırdır) çalıştırabilirsiniz .


2

JavaScript ES6, 117 141 karakter

f=(t,p)=>p.split`,`.map(p=>t=t.replace(RegExp("((?:^|[^a-z])"+p.replace(/~/g,")(")+")(?=$|[^a-z])","ig"),(...x)=>x.slice(1,-2).join("~")))&&t

Ölçek:

document.querySelector(".question pre").textContent.split("\n\n").map(t=>(t=t.split("\n"))&&f(t[0],t[1])==t[2])
// Array [ true, true, true, true, true ]

RegExp yapıcısı yerine eval kullanabilirsiniz. Dize şablonları da birkaç bayt kaydedebilir
Downgoat

1

JavaScript (ES6), 173 169

Temel normal ifade arama ve değiştirme

(a,b)=>(b.split`,`.map(s=>a=a.replace(eval(`/(^|[^a-z])(${s.replace(/~/g,"")})(?=[^a-z]|$)/gi`),(_,n,o)=>(x=0,n+s.split``.map((q,i)=>(q=='~'&&++x?q:o[i-x])).join``))),a)

Vaktini boşa harcamak

Düzenleme: Test durumu için hata düzeltildi magic magic,ma~gic


Yanlış: f("magic magic", "ma~gic")döner"ma~gic magic"
Qwertiy

@Qwertiy düzeltildi. Bir şekilde tamir etmek beni 4 bayt kurtardı!
DankMemes

0

Perl, 146

$a=<>;$d=$_=~s/~//rg,$a=~s/(?<!\pL)$d(?!\pL)/h($&,$_)/gie for(split/,|\n/,<>);
print$a;
sub h{($g,$h)=@_;while($h=~/~/g){substr($g,"@-",0)='~'}$g}

Sadece ilk denemede, birçok şey kısaltılabilir - yarın devam edecek!

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.