Acme Canine Decoder 2000 del Professor Schwartzman


31

introduzione

Noi, specialmente i fanatici di noi, che tendono ad essere fan, tutti ricordiamo questo vecchio cartone animato di Far Side :

Hey!  Hey!  Hey!

Chiaramente, il professor Schwartzman avrebbe potuto ripassare le sue capacità di programmazione solo un po 'di più prima di mettere in pratica la sua invenzione. Ma puoi replicarlo da solo ... usando il minor numero di byte possibile?

Specifiche di input

Devi creare una sceneggiatura che traduca i suoni dei cani in "Hey" opportunamente intonati. Questo è puro codice golf; vince il numero più basso di byte.

Il tuo input consisterà in una combinazione dei seguenti token:

  • Bark, Baark, Baaark, Baaaark, ... (cioè B*rk con almeno 1 asostituire l'asterisco)
  • Woof, Wooof, Woooof, ... ( W*fcon almeno 2 o s sostituendo l'asterisco)
  • Grr, Grrr, Grrrr, ..., ( Gseguito da almeno 2 r s)
  • Qualsiasi numero di caratteri .(punto), !(punto esclamativo) e / o ?(punto interrogativo), che possono verificarsi in qualsiasi punto dell'input

Nota, ancora una volta, che i Woofbasati e Grrgettoni basati richiedono sempre almeno due o s e rs rispettivamente; Wofe nonGr sono token validi.

Non c'è limite alla durata di un token (ad es. Quante as ripetute possono esserci in un Barktoken); tuttavia, il tuo decodificatore deve funzionare correttamente solo per i token di input con un massimo di 10a s, os o rs totali per superare questa sfida.

Specifiche di uscita

Fedele al progetto di Schwartzman, il tuo programma di decodifica canina deve elaborarlo nel testo di output come segue:

  • Bark, Woofe Grrdiventa Hey;
  • Baark, Wooofe Grrrdiventa Heyy;
  • Baaark, Woooofe Grrrrdiventa Heyyy; eccetera.
  • Per tutti i Barktoken basati su, il numero di ys nel Heytoken basato sull'output deve essere uguale al numero di as;
  • Per tutti i Wooftoken basati, il numero di ys nel Heytoken basato sull'output deve essere uno in meno del numero di os;
  • Per tutti i Grrtoken basati, il numero di ys nel Heytoken basato sull'output deve essere uno in meno del numero di rs;
  • Tutti punteggiatura ( ., !, e ?) rimane invariato.

Ricordarsi di cadere una ydall'uscita per Woofs e Grrs solo! L'input Baaaaaaaark?, con 8 as, diventerà Heyyyyyyyy?, con un set corrispondente di 8 ys. Tuttavia, Woooooooof?diventa solo Heyyyyyyy?, con 7 ys.

Ancora una volta, se riesci a far funzionare il tuo programma per token di input di dimensioni illimitate, è fantastico, ma ai fini di questa sfida, il tuo programma verrà controllato solo per assicurarsi che funzioni correttamente per token di input che non hanno più di 10 lettere ripetute .

Tutto Bark-, Woof-, e Grrgettoni basati nel vostro ingresso si presume di iniziare con le lettere maiuscole. Pertanto, non è necessario gestire la trasformazione Bark grrrin Hey heyyo qualcosa di simile.

Esempi di ingressi e uscite

    • Ingresso: Bark. Bark! Bark!!
    • Produzione: Hey. Hey! Hey!!
    • Input: Baaaaaark?(sei as)
    • Uscita: Heyyyyyy?(sei ys)
    • Ingresso: Grrrrrrrr...(otto rs)
    • Uscita: Heyyyyyyy...( sette y s)
    • Ingresso: ?...!
    • Produzione: ?...!
    • Ingresso: Wooof Woof? Grrrr. Baaaark Grr!
    • Produzione: Heyy Hey? Heyyy. Heyyyy Hey!

10
Ciao e benvenuto nel sito! Solo per questo sai, su questo sito è consuetudine aspettare un po 'prima di accettare la risposta più breve. Ti incoraggio a non accettare la risposta che hai accettato e ad aspettare fino a quando l'attività su questa domanda si interrompe prima di accettare la risposta più breve. Ciò incoraggerà anche più risposte.
DJMcMayhem


Grazie per i suggerimenti riguardanti il ​​processo di accettazione. In realtà stavo pianificando di controllare l'elenco delle risposte ogni poche ore e, se ho notato che era arrivata una risposta migliore, accettalo. Ci scusiamo per chiunque a cui potrei aver negato la reputazione qui.
A. Mirabeau,

5
@ A.Mirabeau Questo è onorevole e come funzionerebbe idealmente, ma alcune persone non sono così attente, quindi la maggior parte dei rispondenti potrebbe presumere che il vincitore sia già stato scelto. Sebbene non ci sia nulla di sbagliato nella scelta del vincitore immediatamente se stai pianificando di aggiornarlo, probabilmente otterrai meno risposte a causa di esso insieme ad alcuni reclami, quindi di solito è meglio aspettare almeno una settimana.
Martin Ender,

Risposte:


16

Retina , 24 18 17 16 byte

1 byte salvato in base a un'idea nella risposta di MT0.

\wf?k?
y
\byy
He

Provalo online!

Spiegazione

\wf?k?
y

Questo trasforma semplicemente tutte le lettere in y, ma se sono seguite da un fo klo sostituiamo immediatamente anche quello. Rimuovendo fe k"normalizziamo" le lunghezze delle parole in modo che ora abbiano tutte due ys in più di quelle di cui hanno bisogno.

\byy
He

Questo trasforma le prime due ydi ogni parola in He, completando la trasformazione.


La risposta più efficiente finora, ben fatta. Non lo accetterò ancora, ma posso dirti che meriti CAT FUD.
A. Mirabeau,

10

Perl, 51 41 39 byte

s/(G.|[BW]..)(\w+)/He."y"x length$2/ge

uso

perl -pE 's/(G.|[BW]..)(\w+)/He."y"x length$2/ge'

Ingresso

Bark. Bark! Bark!!
Baaaaaark?
Grrrrrrrr...
?...!
Wooof Woof? Grrrr. Baaaark Grr!

Produzione

Hey. Hey! Hey!!
Heyyyyyy?
Heyyyyyyy...
?...!
Heyy Hey? Heyyy. Heyyyy Hey!

Come funziona

Semplice sostituzione regexp usando la stampa automatica -paggiungendo 1 byte al conteggio. /geesegue la sostituzione per ogni modello ed esegue la sostituzione come codice.


Una versione precedente utilizzava un rilevamento a tre vie, ma Martin Ender notò che non ero abbastanza aggressivo, il che mi fece risparmiare 10 byte.

msh210 mi ha informato che non hai bisogno di virgolette attorno alla stringa He, risparmiando due byte.


2
Il migliore finora, complimenti.
A. Mirabeau,

1
@A.Mirabeau Grazie, è un bel complimento considerando che mi sono appena registrato qui pochi minuti fa!
pipe

Avere tre soluzioni è motivante considerando che mi sono appena registrato qui poche ore fa.
A. Mirabeau,

1
Non hai bisogno delle virgolette He.
msh210,

@ msh210 Interessante, non sapevo che ti fosse permesso di ometterli lì!
pipe

5

Python, 106 byte

f=lambda s,a="B,He,Gr,He,Wo,He,a,y,r,y,o,y,f,,yk,".split(","):s if a==[]else f(s.replace(a[0],a[1]),a[2:])

dimostrazione

https://repl.it/C6Rr


Sebbene non sia la risposta accettata, questa merita una menzione d'onore per essere la soluzione più efficiente in termini di byte che cambia solo le tre parole chiave necessarie per la lingua del cane.
A. Mirabeau,

4

JavaScript (ES6) - 57 55 52 51 byte

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He')

Test:

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He');

[
  'Bark. Bark! Bark!!',
  'Baaaaaark?',
  'Grrrrrrrr...',
  '?...!',
  'Wooof Woof? Grrrr. Baaaark Grr!'
].forEach( s=>{console.log( f(s) );} );

Grazie a @MartinEnder per i byte 56 e 51 e l'ispirazione per alcuni degli altri trucioli.


4

Vimscript, 51 39 37 33 32 29 28 byte,

%s/\hk\?f\?/y/g|%s/\<yy/He/g

Crediti Regex per la rasatura di altri 9 byte: MT0, Martin Ender, msh210

asciicast dimostrazione

Spiegazione:

                               1. Normalize words to same length & replace letters with ys 

%s                             Regex search and replace 
  /                            Regex search begin
   \hk\?f\?                    Find any letter (\h) optionally followed by k or f
           /                   Regex search end and replace start
            y                  Replace with y
             /                 Replace end
              g                Replace globally

               |               New command

                               2. Overwrite first two y of every word with He

                %s             Regex search and replace
                  /            Regex search begin
                   \<yy        Find yy at a word's beginning
                        /      Regex search end and replace start
                         He    replace with He
                           /   Replace end
                            g  Replace globally

1
Non conosco Vimscript, ma puoi usare \<yyinvece di \<\hy?
msh210,

@ msh210 sì, è possibile e ho aggiornato la soluzione, grazie
starcorder il


2

Javascript, 72 66 64 byte

f=
t=>t.replace(/k|f/g,'').replace(/\w/g,'y').replace(/\byy/g,'He')

Modifica: separato f=e funzione + conteggio byte ridotto


1
Non è necessario il f=(come predefinito di PPCG), quindi funziona 64 byte.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ Fantastico, non lo sapevo
starcorder il

1

Pyke, 35 byte

.cFDlR\G.^+3-\y*"He"R+)Rdc~lL-],AsJ

Provalo qui!

Genera Heys, genera punteggiatura, zip insieme, join


1

Python 3, 140 135 134 byte

from re import*
f=lambda s:''.join('He'+'y'*len(x)+y for x,y in[(a+b+c,d)for a,b,c,d in findall('(?:Wo(o+)f|Gr(r+)|B(a+)rk)(\W+)',s)])

Utilizzo di regex per trovare occorrenze di caratteri sostituibili.

Modifica: spazio bianco a 1 byte golfizzato e 4 byte su come ottenere i valori dal risultato findall.

Edit2: Golfed 1 byte (la "a" di Bark non è stata conteggiata correttamente)

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.