Pemrosesan Teks # 1: Tanda hubung

14

Latar Belakang

Ini adalah bagian pertama dari lapangan golf 3-lubang tentang pemrosesan teks. Gagasan yang terlalu melengkung adalah bahwa jika Anda mengambil teks input dan menyalurkannya melalui solusi untuk ketiga tantangan (dengan sejumlah kecil kode lem), itu akan memuntahkan paragraf yang diformat dengan indah. Dalam tantangan pertama ini, tugas Anda adalah tanda hubung teks dengan menggunakan pola tanda hubung yang diberikan.

Memasukkan

Program Anda akan mengambil dua input string: sepotong teks dan daftar pola tanda hubung. Input pertama hanyalah serangkaian karakter dan spasi ASCII yang tidak kosong; itu tidak akan berisi jeda baris atau tilde ~. Input kedua adalah daftar kata-kata yang dibatasi koma, yang terdiri dari suku kata yang dibatasi-tilde dari karakter ASCII huruf kecil. Contohnya adalah ex~cel~lent,pro~gram~ming,abil~i~ties.

Keluaran

Program Anda harus memodifikasi input pertama dengan cara berikut. Kata apa pun (substring maksimal karakter ASCII alfabet) yang versi huruf kecilnya ditulis dgn tanda penghubung ditemukan di input kedua harus diganti oleh versi ditulis dgn tanda penghubung, tetapi kasusnya harus dipertahankan. Dengan daftar contoh di atas, jika teks berisi kata Excellent, itu akan digantikan oleh Ex~cel~lent; Namun, Excellentlyakan tidak dimodifikasi. Output Anda adalah string yang dimodifikasi ini.

Aturan dan Penilaian terperinci

Anda dapat mengasumsikan berikut tentang input:

  • Input pertama tidak berisi tilde, dan tidak ada spasi awal, akhir, atau berulang. Itu tidak kosong.
  • Input kedua berisi setidaknya satu kata, dan setiap kata di dalamnya mengandung setidaknya dua suku kata. Setiap suku kata tidak kosong.
  • Input kedua tidak mengandung kata yang muncul sebagai suku kata di kata lain.

Anda dapat mengubah urutan kedua input, jika diinginkan, dan secara opsional menambahkan satu baris tambahan ke output.

Anda dapat menulis fungsi atau program lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji Kasus

Ini tercantum dalam format 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

Kemungkinan kesalahan tanda hubung dalam tantangan ini adalah karena alat tanda hubung ini .

Zgarb
sumber
Saya berasumsi input standar ASCII 7-bit, dan bukan beberapa versi 8-bit diperpanjang?
orlp
Apakah boleh untuk menganggap bahwa karakter non-alfanumerik tidak akan dihitung sebagai perubahan kata (mis. Input seperti pertama #programming!masih akan dipengaruhi oleh input kedua pro~gram~ming)? Apakah angka juga tidak masuk hitungan (yaitu hanya karakter alfabet yang diperbolehkan)?
cole
@ orlp Ya, input terdiri dari karakter ASCII yang dapat dicetak standar seperti yang tercantum di sini .
Zgarb
@Cole Karakter bukan alfabet bukan bagian dari kata-kata (lihat test case kedua). Digit dihitung sebagai non-abjad, saya akan menambahkan test case tentang itu.
Zgarb
Bisakah saya mengasumsikan jumlah suku kata maksimum dalam satu kata?
Qwertiy

Jawaban:

5

Pip, 60 54 byte

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

Repositori GitHub untuk Pip

Mengambil input sebagai argumen baris perintah (yang mengharuskan tanda kutip di sekitar input 1, dengan asumsi itu berisi spasi). Tidak ada baris tambahan yang dicetak (tambahkan xke akhir program untuk menambahkan satu).

Agak tidak terserang, dengan komentar:

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

Contoh dijalankan:

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!
DLosc
sumber
8

Retina , 88 byte

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

Untuk tujuan penghitungan, setiap baris masuk ke file terpisah, \ndiganti dengan karakter baris baru yang sebenarnya dan <empty>merupakan file kosong. Untuk kenyamanan, Anda dapat menjalankan kode di atas dari satu file (di mana <empty>ada baris kosong) jika Anda menggunakan tanda -spenerjemah.

Martin Ender
sumber
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

Uji:

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 ]
Qwertiy
sumber
Anda dapat menggunakan eval alih-alih konstruktor RegExp. Templat string juga dapat menyimpan beberapa byte
Downgoat
1

Javascript (ES6), 173 169

Pencarian regex dasar dan ganti

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

Biola

Sunting: Fixed bug untuk test case magic magic,ma~gic

DankMemes
sumber
Salah: f("magic magic", "ma~gic")pengembalian"ma~gic magic"
Qwertiy
@ Kualifikasi telah diperbaiki. Entah bagaimana memperbaikinya menyelamatkan saya 4 byte juga!
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}

Hanya upaya pertama, banyak hal dapat dipersingkat - akan dilanjutkan besok!

Jarmex
sumber