Видаліть Салюти


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

Випробування акумулятора

Хола, всього 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 # out тоді. (З
підсумком регулярного виразів

1
Пітон також вийшов (з регулярним виразом) :(
Gábor Fekete

Ви завжди можете повернути даний вклад на суму 31,3%.
Ян Міллер

Закликайте відредагувати привітання на початку виклику, що піднімається. ;)
Draco18s більше не довіряє SE

2
Веселий анекдот: Спочатку я розпочав своє перше повідомлення на PPCG з "Привіт, світ! :)", але помітив, як тільки я опублікував це, що 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

У вітань бути видалені починаються з d, g, hабо s(або в верхньому регістрі його версій); непривітання, що починається з цих букв, є

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

Ігнорування рядків там, де вони з’являються поодинці, це 220 помилкових позитивних результатів. Тож давайте просто видалимо початкові слова, починаючи з будь-якої з цих чотирьох літер.

Коли ми бачимо початкове слово, що починається з будь-якого з цих ( / ^[dghs]\w*), нечутливих до регістру ( /i), а за ним принаймні один несловесний символ ( \W\+), то замінюємо його порожнім рядком. Потім замініть перший символ його великим регістром ( s/./\U&/).

Це дає нам

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

Тепер ми можемо трохи уточнити це:

  • Найбільший набір помилково-позитивних є how, тому ми робимо підстановку умовною, префіксом негативним тестом:

     /^[Hh]ow\b/!
  • Ми також можемо фільтрувати другу букву, щоб виключити g'd, speakі 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`^.

Спробуйте в Інтернеті! Редагувати: Отримало 4,8% (старі) 2,7% (нові) покриття за допомогою порад @ MartinEnder.


1
Я думаю, ви можете зробити, [ ,]+ щоб вичавити ще кілька байт. Ви також можете витягти hз чергування.
Мартін Ендер

не впевнений, але це i`^h(a[iy]|eya?|i(h?i?|ya))[ ,]+може спрацювати, тобто у вас є 8 байт
лише для ASCII

@ ASCII тільки h?i?не економить нічого, h?i|і це буде відповідати hih(хоча я не знаю, чи це навіть у тестових випадках).
Мартін Ендер

Насправді, це дійсно зберігає байт, якщо ви це робите 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 оновлено
Jörg Hülsermann

4

Vim, 55,4% 44,4%

df,<<vgU

Пояснення:

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

Гей, я змінив нову пробну батарею, чи можете ви оновити свою відповідь своїм новим балом? Спасибі
бета-розпад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.