Remova as saudações


11

Desafio

Oi, dada uma string como entrada, remova qualquer saudação encontrada no início da string.

O programa que executa as substituições mais corretas em menos de 50 bytes ganha.

Saudações

Ei, uma saudação é definida como uma das seguintes palavras:

  • Oi
  • Ei
  • Olá
  • caro
  • saudações
  • hai
  • rapazes
  • Olá eu
  • Olá
  • oi
  • feno
  • heya
  • hola
  • oi
  • saudações

A primeira letra pode ser maiúscula.

Sempre haverá uma vírgula e / ou um espaço único após a saudação, que também deve ser removida. A vírgula e o espaço podem estar em qualquer ordem ( ,<space>ou <space>,) e ambos devem ser removidos.

A saudação e a palavra a seguir serão separadas apenas por vírgula e / ou espaço único.

Você deve colocar em maiúscula a primeira letra da palavra que teria seguido a saudação. Mesmo que nenhuma substituição tenha ocorrido, você ainda deve capitalizar a primeira palavra da saída.

Letras maiúsculas se aplicam somente a caracteres alfabéticos minúsculos ( abcdefghijklmnopqrstuvwxyz). Você deve deixar qualquer outro personagem como estava.

A saudação será sempre no início da string. Você não deve substituir uma saudação que não esteja no início.

Nem sempre pode haver uma saudação.

Seu código deve ter menos de 50 bytes.

Exemplos

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

Bateria de teste

Olá, existem 1000 entradas diferentes no total:

Um comando Bash para recuperar os itens acima é

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

Ganhando

Olá, o programa com as substituições mais corretas das 1000 entradas acima vence.

Você deve colocar a porcentagem das entradas que seu programa manipula corretamente no cabeçalho da seguinte maneira:

# Language Name, percentage%

Não sei ao certo por que Jeff fez isso, mas faz um bom desafio.


3
s=>System.Text.RegularExpressions.Regex.Replace();50 bytes antes que um padrão seja especificado, isso é C # então. (Com uma abordagem regex é claro)
TheLethalCoder

1
Python também está fora (com regex) :(
Gábor Fekete

Você sempre pode retornar a entrada fornecida para uma pontuação de 31,3%.
Ian Miller

É urgente editar a saudação no início do desafio crescente. ;)
Draco18s não confia mais no SE

2
Anedota divertida: originalmente comecei meu primeiro post no PPCG com "Olá, mundo! :)", mas notei assim que o publiquei que o SE removeu toda a linha, exceto o ":)". Obviamente, eu estava mortificado por ter feito algo errado e imediatamente removido o sorriso também. Nenhum vestígio foi deixado no histórico de revisões, e até hoje você e eu somos os únicos que sabemos sobre isso ...
ETHproductions

Respostas:


8

GNU sed, 78% 100%

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

(49 bytes)

A bateria de teste é bastante limitada: podemos contar quais palavras aparecem primeiro em cada linha:

$ 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

Os saudações a ser removidos começar com d, g, hou s(em maiúsculas ou versões dos mesmos); as não-saudações que começam com essas letras são

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

Ignorar as linhas onde elas aparecem sozinhas, são 220 falsos positivos. Então, vamos remover as palavras iniciais que começam com qualquer uma dessas quatro letras.

Quando vemos uma palavra inicial começando com qualquer um desses ( / ^[dghs]\w*), sem distinção entre maiúsculas e minúsculas ( /i) e seguida de pelo menos um caractere que não seja da palavra ( \W\+), substitua-a por uma sequência vazia. Em seguida, substitua o primeiro caractere pelo seu equivalente em maiúscula ( s/./\U&/).

Isso nos dá

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

Agora podemos refinar isso um pouco:

  • O maior conjunto de falsos positivos é how, então tornamos a substituição condicional prefixando com um teste negativo:

     /^[Hh]ow\b/!
  • Também pode filtrar a segunda letra, para eliminar g'd, speake sweet:

    s/^[dghs][eruaio]\w*\W\+//i
  • Isso sai apenas goodcomo um falso positivo. Podemos ajustar o teste prefixo para eliminar palavras que terminam em qualquer wou d:

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

Demonstração

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

9

Retina , 68% 72,8% (antiga) 74,8% 77,5% (nova bateria de teste)

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

T`l`L`^.

Experimente online! Edit: Obteve 4,8% (antigo) 2,7% (novo) de cobertura com a ajuda das dicas do @ MartinEnder.


1
Eu acho que você pode fazer [ ,]+ para extrair mais alguns bytes. Você também pode extrair o hda alternância.
Martin Ender

Não tenho certeza, mas i`^h(a[iy]|eya?|i(h?i?|ya))[ ,]+o trabalho poder seja, você tem 8 bytes de sobra
ASCII-only

@ Somente ASCII h?i?não economiza nada h?i|e seria compatível hih(embora eu não saiba se isso é mesmo nos casos de teste).
Martin Ender

Na verdade, ele salva um byte, se você o fizer ih?i?|iya.
Martin Ender

Talvez i`^h(a[iy]|eya?|ih?i|iya|ola|ello)[ ,]+então
ASCII-only

6

PHP, 60,6%

50 bytes

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

Experimente online!

PHP, 59,4%

49 bytes

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

Experimente online!

PHP, 58,4%

50 bytes

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

Experimente online!


1
60,1%:#^[gh]\w+.#
manatwork

Ei, mudei para uma nova bateria de teste. Você pode atualizar sua resposta com sua nova pontuação? Obrigado
Decay Beta

O @BetaDecay é atualizado
Jörg Hülsermann

4

Vim, 55,4% 44,4%

df,<<vgU

Explicação:

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

Ei, mudei para uma nova bateria de teste. Você pode atualizar sua resposta com sua nova pontuação? Obrigado
Decay Beta
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.