Rimuovi i saluti


11

Sfida

Ciao, data una stringa come input, rimuovi tutti i saluti trovati all'inizio della stringa.

Vince il programma che esegue le sostituzioni più corrette in meno di 50 byte.

saluti

Ehi, un saluto è definito come una delle seguenti parole:

  • Ciao
  • Hey
  • Ciao
  • caro
  • saluti
  • hai
  • ragazzi
  • hii
  • howdy
  • hiya
  • fieno
  • heya
  • hola
  • hihi
  • saluti

La prima lettera può essere in maiuscolo.

Ci sarà sempre una virgola e / o un singolo spazio dopo il saluto che deve anche essere rimosso. La virgola e lo spazio possono essere in qualsiasi ordine ( ,<space>o <space>,) ed entrambi devono essere rimossi.

Il saluto e la parola seguente saranno sempre e solo separati da una virgola e / o un singolo spazio.

È quindi necessario scrivere in maiuscolo la prima lettera della parola che avrebbe seguito il saluto. Anche se non è stata effettuata alcuna sostituzione, è comunque necessario capitalizzare la prima parola dell'output.

Le maiuscole si applicano solo ai caratteri alfabetici minuscoli ( abcdefghijklmnopqrstuvwxyz). Dovresti lasciare qualsiasi altro personaggio com'era.

Il saluto sarà sempre all'inizio della stringa. Non dovresti sostituire un saluto che non è all'inizio.

Potrebbe non esserci sempre un saluto.

Il codice deve essere inferiore a 50 byte.

Esempi

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

Test della batteria

Ciao, ci sono 1000 diversi input in totale:

Un comando Bash per recuperare sia quanto sopra è

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

vincente

Salve, vince il programma con le sostituzioni più corrette tra i 1000 input sopra.

È necessario inserire la percentuale degli input gestiti correttamente dal programma nell'intestazione in questo modo:

# Language Name, percentage%

Non sono del tutto sicuro del perché Jeff abbia reso questa cosa una cosa, ma rappresenta comunque una bella sfida.


3
s=>System.Text.RegularExpressions.Regex.Replace();50 byte prima che venga specificato anche un pattern, quindi è C # fuori. (Con un approccio regex ovviamente)
TheLethalCoder

1
Anche Python è uscito (con regex) :(
Gábor Fekete

Puoi sempre restituire l'input specificato per un punteggio del 31,3%.
Ian Miller,

Esorta a modificare il saluto all'inizio della sfida crescente. ;)
Draco18s non si fida più di SE

2
Aneddoto divertente: Inizialmente ho iniziato il mio primo post su PPCG con "Hello, world! :)" ma ho notato non appena l'ho pubblicato che SE ha rimosso l'intera riga tranne ":)". Ovviamente ero mortificato di aver fatto qualcosa di sbagliato e immediatamente rimosso anche lo smiley. Non è stata lasciata traccia nella storia delle revisioni, e fino ad oggi tu ed io siamo gli unici a saperlo ...
ETHproductions,

Risposte:


8

GNU sed, 78% 100%

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

(49 byte)

La batteria di prova è piuttosto limitata: possiamo contare quali parole compaiono per prime su ogni riga:

$ 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

I saluti essere rimossi iniziano con d, g, ho s(o maiuscola versioni della stessa); le non salutazioni che iniziano con quelle lettere sono

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

Ignorando le linee in cui appaiono da sole, sono 220 falsi positivi. Quindi rimuoviamo solo le parole iniziali che iniziano con una di quelle quattro lettere.

Quando vediamo una parola iniziale inizia con qualsiasi di quelli ( / ^[dghs]\w*), case-sensitive ( /i), e seguito da almeno un carattere non-word ( \W\+), quindi sostituire con una stringa vuota. Quindi, sostituisci il primo carattere con il suo equivalente maiuscolo ( s/./\U&/).

Questo ci dà

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

Ora possiamo perfezionarlo un po ':

  • La più grande serie di falsi positivi è how, quindi subordiniamo la sostituzione al prefisso con un test negativo:

     /^[Hh]ow\b/!
  • Possiamo anche filtrare sulla seconda lettera, per eliminare g'd, speake sweet:

    s/^[dghs][eruaio]\w*\W\+//i
  • Questo lascia solo goodun falso positivo. Possiamo regolare il test del prefisso per eliminare le parole che terminano con una wo d:

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

Dimostrazione

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

9

Retina , 68% 72,8% (vecchio) 74,8% 77,5% (nuova batteria di prova)

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

T`l`L`^.

Provalo online! Modifica: ottenuto il 4,8% (vecchio) 2,7% (nuovo) di copertura con l'aiuto dei suggerimenti di @ MartinEnder.


1
Penso che tu possa fare [ ,]+ per spremere qualche byte in più. Puoi anche estrarre hl'alternanza.
Martin Ender,

non sono sicuro, ma i`^h(a[iy]|eya?|i(h?i?|ya))[ ,]+potrebbe funzionare nel senso che hai 8 byte da risparmiare
solo ASCII

@ ASCII-only h?i?non salva nulla h?i|e corrisponderebbe hih(anche se non so se questo è anche nei casi di test).
Martin Ender,

In realtà, salva un byte se lo fai ih?i?|iya.
Martin Ender,

Forse i`^h(a[iy]|eya?|ih?i|iya|ola|ello)[ ,]+allora
solo ASCII


4

Vim, 55,4% 44,4%

df,<<vgU

Spiegazione:

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

Ehi, sono passato a una nuova batteria di prova, puoi aggiornare la tua risposta con il tuo nuovo punteggio? Grazie
Beta Decay
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.