Eliminar los saludos

11

Desafío

Hola, dada una cadena como entrada, elimine cualquier saludo que se encuentre al comienzo de la cadena.

El programa que realiza las sustituciones más correctas en menos de 50 bytes gana.

Saludos

Hola, un saludo se define como una de las siguientes palabras:

  • Hola
  • Oye
  • Hola
  • querido
  • saludos
  • hai
  • chicos
  • Hola yo
  • hola
  • hola
  • heno
  • heya
  • Hola
  • hola
  • saludos

La primera letra puede estar en mayúscula.

Siempre habrá una coma y / o un espacio único después del saludo que también debe eliminarse. La coma y el espacio pueden estar en cualquier orden ( ,<space>o <space>,) y ambos deben eliminarse.

El saludo y la siguiente palabra solo estarán separados por una coma y / o un espacio único.

Luego debe poner en mayúscula la primera letra de la palabra que habría seguido al saludo. Incluso si no se ha realizado ningún reemplazo, aún debe capitalizar la primera palabra de la salida.

Las mayúsculas solo se aplican a caracteres alfabéticos en minúsculas ( abcdefghijklmnopqrstuvwxyz). Deberías dejar cualquier otro personaje como estaba.

El saludo siempre será al comienzo de la cadena. No debe reemplazar un saludo que no está al comienzo.

Puede que no siempre haya un saludo.

Su código debe tener menos de 50 bytes.

Ejemplos

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

Prueba de la batería

Hola, hay 1000 entradas diferentes en total:

Un comando Bash para recuperar tanto lo anterior es

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

Victorioso

Hola, el programa con las sustituciones más correctas de las 1000 entradas anteriores gana.

Debe poner el porcentaje de las entradas que su programa maneja correctamente en su encabezado de la siguiente manera:

# Language Name, percentage%

No estoy completamente seguro de por qué Jeff hizo esto, pero sin embargo, es un buen desafío.

Decaimiento Beta
fuente
3
s=>System.Text.RegularExpressions.Regex.Replace();50 bytes antes incluso de que se especifique un patrón, entonces eso es C #. (Con un enfoque regex, por supuesto)
TheLethalCoder
1
Python también está fuera (con expresiones regulares) :(
Gábor Fekete
Siempre puede devolver la entrada dada para un puntaje de 31.3%.
Ian Miller
Insta a editar el saludo al comienzo del desafío en aumento. ;)
Draco18s ya no confía en SE
2
Anécdota divertida: Originalmente comencé mi primera publicación en PPCG con "¡Hola, mundo! :)", pero noté tan pronto como lo publiqué que SE eliminó la totalidad de esa línea, excepto ":)". Por supuesto, estaba mortificado de haber hecho algo mal e inmediatamente eliminé el smiley también. No quedó rastro en el historial de revisiones, y hasta el día de hoy, usted y yo somos los únicos que lo sabemos ...
ETHproductions

Respuestas:

8

GNU sed, 78% 100%

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

(49 bytes)

La batería de prueba es bastante limitada: podemos contar qué palabras aparecen primero en cada línea:

$ 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

Los saludos que ser eliminado comienzan con d, g, ho s(o mayúsculas versiones de los mismos); los no saludos que comienzan con esas letras son

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

Ignorando las líneas donde aparecen solas, eso es 220 falsos positivos. Entonces, eliminemos las palabras iniciales que comienzan con cualquiera de esas cuatro letras.

Cuando vemos una palabra inicial que comienza con cualquiera de esos ( / ^[dghs]\w*), sin distinción entre mayúsculas y minúsculas ( /i), y seguida de al menos un carácter que no sea de palabra ( \W\+), luego reemplácelo con una cadena vacía. Luego, reemplace el primer carácter con su equivalente en mayúsculas ( s/./\U&/).

Eso nos da

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

Ahora podemos refinar esto un poco:

  • El conjunto más grande de falsos positivos es how, por lo que hacemos la sustitución condicional al prefijar con una prueba negativa:

     /^[Hh]ow\b/!
  • También podemos filtrar en la segunda letra, para eliminar g'd, speaky sweet:

    s/^[dghs][eruaio]\w*\W\+//i
  • Eso deja solo goodcomo un falso positivo. Podemos ajustar la prueba de prefijo para eliminar las palabras que terminan en wo d:

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

Demostración

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

Retina , 68% 72.8% (antiguo) 74.8% 77.5% (batería de prueba nueva)

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

T`l`L`^.

Pruébalo en línea! Editar: Obtuve 4.8% (antiguo) 2.7% (nuevo) de cobertura con la ayuda de los consejos de @ MartinEnder.

Neil
fuente
1
Creo que puedes hacer [ ,]+ para exprimir algunos bytes más. También puede extraer el hde la alternancia.
Martin Ender
no estoy seguro, pero i`^h(a[iy]|eya?|i(h?i?|ya))[ ,]+podría funcionar, lo que significa que tiene 8 bytes de sobra
solo ASCII
@ ASCII-only h?i?no guarda nada h?i|y coincidiría hih(aunque no sé si eso es incluso en los casos de prueba).
Martin Ender
En realidad, guarda un byte si lo hace ih?i?|iya.
Martin Ender
Quizás i`^h(a[iy]|eya?|ih?i|iya|ola|ello)[ ,]+entonces
solo ASCII
6

PHP, 60,6%

50 bytes

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

Pruébalo en línea!

PHP, 59,4%

49 bytes

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

Pruébalo en línea!

PHP, 58,4%

50 bytes

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

Pruébalo en línea!

Jörg Hülsermann
fuente
1
60,1%:#^[gh]\w+.#
manatwork
Oye, he cambiado a una nueva batería de prueba, ¿puedes actualizar tu respuesta con tu nueva puntuación? Gracias
Beta Decay
@BetaDecay se actualiza
Jörg Hülsermann
4

Vim, 55.4% 44.4%

df,<<vgU

Explicación:

df,    Delete until and including the first comma
<<     Remove leading spaces
vgU    Uppercase first letter
Alondra
fuente
Oye, he cambiado a una nueva batería de prueba, ¿puedes actualizar tu respuesta con tu nueva puntuación? Gracias
Beta Decay