あいさつ文を削除する


11

チャレンジ

こんにちは、入力として文字列を指定すると、文字列の先頭で見つかったあいさつを削除します。

50バイト未満で最も正しい置換を実行するプログラムが勝ちます。

あいさつ文

あいさつ文は、次のいずれかの単語として定義されます。

  • こんにちは
  • ねえ
  • こんにちは
  • 親愛な
  • あいさつ
  • ハイ
  • みんな
  • ひい
  • ハウディ
  • ひや
  • 干し草
  • へや
  • ほら
  • ひひ
  • あいさつ

最初の文字は大文字にすることができます。

あいさつ文の後には常にカンマおよび/または単一のスペースがありますが、これらも削除する必要があります。コンマとスペースは任意の順序(,<space>または<space>,)にすることができ、両方を削除する必要があります。

あいさつ文とそれに続く単語は、コンマや単一のスペースでのみ区切られます。

次に、挨拶の後に続く単語の最初の文字を大文字にする必要があります。置換が行われていなくても、出力の最初の単語を大文字にする必要があります。

大文字は小文字のアルファベット文字(abcdefghijklmnopqrstuvwxyz)にのみ適用されます。他のキャラクターはそのままにしておく必要があります。

あいさつは常に文字列の先頭になります。開始時ではない挨拶文を置き換えるべきではありません

常に挨拶があるとは限りません。

コードは50バイト未満でなければなりません。

Input > Output

Salutations, what's going on? > What's going on?
hello i have quetions how does juice an avocado > I have quetions how does juice an avocado
How d'you do > How d'you do
Hey,You! > You!
hola cows eat hay > Cows eat hay
hey Hi there! > Hi there!
hihi ,guys > Guys

テストバッテリー

Hola、合計で1000の異なる入力があります。

上記の両方を取得するBashコマンドは

wget https://raw.githubusercontent.com/beta-decay/Remove-Substitutions-Battery/master/{inputs,replaced}.txt

勝ち

ハウディ、上記の1000個の入力から最も正しい置換を行ったプログラムが勝ちます。

次のように、プログラムで処理する入力の割合をヘッダーに正しく入力する必要があります。

# Language Name, percentage%

ジェフがこれをなぜ作ったのかは完全にはわかりませんが、それでも素晴らしい挑戦になります。


3
s=>System.Text.RegularExpressions.Regex.Replace();パターンが指定される前の50バイト、それはC#出力です。(もちろん正規表現アプローチを使用)
TheLethalCoder

1
Pythonは:((正規表現での)外にもある
ガーボルFekete

31.3%のスコアに対して、指定された入力をいつでも返すことができます。
イアンミラー

挑戦の始まりのあいさつ文を編集してください。;)
Draco18sは、

2
面白い逸話:PPCGの最初の投稿は「Hello、world!:)」で始めましたが、投稿するとすぐにSEが「:)」以外の行全体を削除したことに気付きました。もちろん、私は何か間違ったことをしたことを悔し、すぐにスマイリーも削除しました。改訂履歴には痕跡は残っていませんでしたが、今日まであなたと私だけがそれについて知っています
...-ETHproductions

回答:


8

GNU sed、78% 100%

/^\w*[wd]\b/!s/^[dghs][eruaio]\w*\W\+//i
s/./\U&/

(49バイト)

テストバッテリーは非常に限られています。各行で最初に現れる単語をカウントできます。

$ sed -e 's/[ ,].*//' inputs.txt | sort | uniq -ic
 40 aight
 33 alright
 33 dear
 33 g'd
 41 good
 36 greetings
 35 guys
 31 hai
 33 hay
 27 hello
 33 hey
 37 heya
 43 hi
 34 hihi
 29 hii
 35 hiya
 45 hola
 79 how
 37 howdy
 33 kowabunga
 39 salutations
 32 speak
 34 sweet
 40 talk
 36 wassup
 34 what's
 38 yo

始まる除去すべき礼拝dgh又はs(またはその大文字バージョン)。それらの文字で始まる非敬称は

 33 g'd
 41 good
 79 how
 32 speak
 34 sweet

単独で表示される行を無視すると、220の偽陽性です。これらの4文字のいずれかで始まる最初の単語を削除してみましょう。

これらのいずれか(/ ^[dghs]\w*)で始まり、大文字と小文字を区別しない(/i)で始まり、少なくとも1つの非単語文字(\W\+)が続く最初の単語が見つかったら、空の文字列で置き換えます。次に、最初の文字を対応する大文字(s/./\U&/)に置き換えます。

それは私たちに与えます

s/^[dghs]\w*\W\+//i
s/./\U&/

これを少し改良できます。

  • 誤検知の最大セットはhowであるため、ネガティブテストを前に付けて置換を条件付きにします。

     /^[Hh]ow\b/!
  • 我々はまた、排除するために、第二の手紙にフィルタリングすることができg'dspeakそしてsweet

    s/^[dghs][eruaio]\w*\W\+//i
  • それはgood誤検知としてのみ残ります。プレフィックステストを調整して、wまたはで終わる単語を削除できますd

    /^\w*[wd]\b/!

デモンストレーション

$ diff -u <(./123478.sed inputs.txt) replaced.txt | grep ^- | wc -l
0

9

網膜68% 72.8%(旧)74.8% 77.5%(新しいテストバッテリー)

i`^h(a[iy]|eya?|i(h?i|ya|)|ello)[ ,]+

T`l`L`^.

オンラインでお試しください!編集:@MartinEnderのヒントの助けを借りて、4.8%(旧)2.7%(新規)の報道を得ました。


1
[ ,]+ もう少しバイトを絞り出すことができると思います。またh、代替から抽出することもできます。
マーティンエンダー

わからなくi`^h(a[iy]|eya?|i(h?i?|ya))[ ,]+かもしれない作業スペアに8バイト持つ意味
ASCIIのみ

@ ASCII-only h?i?は何も保存せず、h?i|一致しますhih(テストケースにあるかどうかはわかりませんが)。
マーティンエンダー

実際には、を実行すると1バイト節約されますih?i?|iya
マーティンエンダー

たぶんi`^h(a[iy]|eya?|ih?i|iya|ola|ello)[ ,]+それから
ASCIIのみ

6

PHP、60.6%

50バイト

<?=ucfirst(preg_replace("#^[dh]\w+.#i","",$argn));

オンラインでお試しください!

PHP、59.4%

49バイト

<?=ucfirst(preg_replace("#^h\w+,? #i","",$argn));

オンラインでお試しください!

PHP、58.4%

50バイト

<?=ucfirst(preg_replace("#^[gh]\w+.#i","",$argn));

オンラインでお試しください!


1
60.1%:#^[gh]\w+.#
マナトワーク

ねえ、新しいテストバッテリーに変更しました。新しいスコアで答えを更新できますか?ありがとう
ベータ崩壊

@BetaDecayが更新されました
ヨルクヒュルサーマン

4

Vim、55.4% 44.4%

df,<<vgU

説明:

df,    Delete until and including the first comma
<<     Remove leading spaces
vgU    Uppercase first letter

ねえ、新しいテストバッテリーに変更しました。新しいスコアで答えを更新できますか?ありがとう
ベータ崩壊
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.