テキスト処理#1:ハイフネーション


14

バックグラウンド

これは、テキスト処理に関する3ホールのゴルフコースの最初の部分です。包括的な考え方は、入力テキストを取得し、3つの課題すべて(少量のグルーコードを使用)のソリューションにパイプすると、きれいに書式設定された段落を吐き出すというものです。この最初の課題では、タスクは指定されたハイフネーションパターンを使用してテキストをハイフネーションします。

入力

プログラムは、テキストとハイフネーションパターンのリストの2つの文字列入力を受け取る必要があります。最初の入力は、単に印刷可能なASCII文字とスペースの空でない文字列です。改行やチルダは含まれません~。2番目の入力は、カンマで区切られた単語のリストであり、チルダで区切られた小文字のASCII文字の音節で構成されています。例はex~cel~lent,pro~gram~ming,abil~i~tiesです。

出力

プログラムは、次の方法で最初の入力を変更します。ハイフン付き小文字バージョンが2番目の入力で見つかった単語(アルファベットASCII文字の最大部分文字列)は、そのハイフン付きバージョンに置き換えられますが、大文字と小文字は保持されます。上記のリストの例では、テキストにwordが含まれている場合、; Excellentに置き換えられEx~cel~lentます。しかし、Excellentlyものではない修正されます。出力は、この変更された文字列になります。

詳細なルールとスコアリング

入力について次のことを想定できます。

  • 最初の入力には、チルダは含まれず、先頭、末尾、または繰り返されるスペースは含まれません。空ではありません。
  • 2番目の入力には少なくとも1つの単語が含まれ、その各単語には少なくとも2つの音節が含まれます。各音節は空ではありません。
  • 2番目の入力には、別の単語の音節として現れる単語は含まれません。

必要に応じて、2つの入力の順序を変更し、オプションで1つの末尾の改行を出力に追加できます。

関数または完全なプログラムを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

テストケース

これらは形式でリストされています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

このチャレンジで起こり得るハイフネーションエラーは、このハイフネーションツールによるものです


入力は標準の7ビットASCIIであり、一部の拡張8ビットバージョンではないと想定していますか?
orlp

それは、任意の非英数字の文字が単語への変更としてカウントされませんと仮定しても大丈夫である(例えば、Aのような第一の入力#programming!はまだの第二の入力によって影響を受けることができるだろうかpro~gram~ming)?数字もカウントされませんか(つまり、アルファベット文字のみが許可されます)?
コール

@orlpはい、ここにリストされているように、入力は標準の印刷可能なASCII文字で構成されています
ズガルブ

@Coleアルファベット以外の文字は単語の一部ではありません(2番目のテストケースを参照)。数字はアルファベット以外のものとしてカウントされます。それについてのテストケースを追加します。
ズガルブ

1つの単語に最大数の音節を想定できますか?
Qwertiy

回答:


5

ピップ、60 54バイト

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

PipのGitHubリポジトリ

コマンドライン引数として入力を受け取ります(スペースが含まれていると仮定すると、入力1を引用符で囲む必要があります)。末尾の改行は出力されません(xプログラムの最後にを追加して追加します)。

コメント付きでやや手放せません:

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

サンプル実行:

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

網膜、88バイト

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

カウントのために、各行は個別のファイルに入り、\n実際の改行文字に置き換えられ<empty>、空のファイルになります。便宜上、インタープリターフラグ<empty>を使用する-sと、単一のファイル(空の行)から上記のコードを実行できます。


2

JavascriptをES6、117の 141文字

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

テスト:

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コンストラクターの代わりにevalを使用できます。文字列テンプレートは、数バイトを節約することもあります
-Downgoat

1

Javascript(ES6)、173 169

基本的な正規表現の検索と置換

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

フィドル

編集:テストケースのバグ修正magic magicma~gic


違う: f("magic magic", "ma~gic")戻り値"ma~gic magic"
-Qwertiy

@Qwertiyが修正されました。どういうわけかそれを修正することで4バイトも節約できました!
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}

初めての試みですが、多くのことを短縮できます-明日も続きます!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.