Professor Schwartzmans Acme Canine Decoder 2000

31

Einführung

Wir - vor allem die Geeks unter uns, die eher Fans sind - erinnern uns alle an diesen alten Far Side- Cartoon:

Hallo!  Hallo!  Hallo!

Offensichtlich hätte Professor Schwartzman seine Programmierkenntnisse ein wenig auffrischen können, bevor er seine Erfindung in die Tat umsetzte. Aber können Sie es selbst replizieren ... mit so wenig Bytes wie möglich?

Eingangsspezifikationen

Sie müssen ein Skript erstellen, das Hundegeräusche in entsprechend intonierte "Hey" übersetzt. Das ist reines Code-Golf. die niedrigste Anzahl von Bytes gewinnt.

Ihre Eingabe besteht aus einer Kombination der folgenden Token:

  • Bark, Baark, Baaark, Baaaark, ... (das heißt, B*rk mit mindestens 1 aden Stern ersetzt)
  • Woof, Wooof, Woooof, ... ( W*fmit mindestens 2 o s den Stern ersetzt)
  • Grr, Grrr, Grrrr, ..., ( Gmindestens gefolgt 2 r s)
  • Beliebige Anzahl von .(Punkt), !(Ausrufezeichen) und / oder ?(Fragezeichen) Zeichen, die an einer beliebigen Stelle in der Eingabe vorkommen können

Es ist wiederum zu beachten, dass die Tokens Woof-basiert und Grr-basiert immer mindestens zwei o s bzw. rs erfordern . Wofund Grsind keine gültigen Token.

Es gibt keine Begrenzung für die Länge eines Tokens (z. B. wie viele wiederholte as in einem BarkToken enthalten sein können). jedoch Decoder benötigen nur mit korrekt für die Eingabe - Token arbeiten bis zu 10 Gesamt as, os oder rs , diese Herausforderung zu bestehen.

Ausgangsspezifikationen

Getreu dem Entwurf von Schwartzman muss Ihr Hunde-Decoder-Programm diesen wie folgt in Ausgabetext umwandeln:

  • Bark, WoofUnd Grrwerden Hey;
  • Baark, WooofUnd Grrrwerden Heyy;
  • Baaark, WoooofUnd Grrrrwerden Heyyy; etc.
  • Für alle Bark-basierten Token muss die Anzahl der ys im Heyausgabebasierten Token gleich der Anzahl der as sein.
  • Für alle Woof-basierten Token muss die Anzahl der ys im Heyausgabebasierten Token um eins niedriger sein als die Anzahl der os.
  • Für alle Grr-basierten Token muss die Anzahl der ys im Heyausgabebasierten Token um eins niedriger sein als die Anzahl der rs.
  • Alle Interpunktion ( ., !und ?) bleibt unverändert.

Vergessen Sie nicht, einen yfür Woofs und Grrs aus der Ausgabe zu entfernen ! Der Eingang Baaaaaaaark?mit 8 as wird Heyyyyyyyy?mit einem passenden Satz von 8 ys. Allerdings Woooooooof?wird nur Heyyyyyyy?mit 7 ys.

Wiederum, wenn Sie Ihr Programm für Eingabetoken mit unbegrenzter Größe zum Laufen bringen können, ist das großartig, aber für die Zwecke dieser Herausforderung wird Ihr Programm nur überprüft, um sicherzustellen, dass es für Eingabetoken mit nicht mehr als 10 wiederholten Buchstaben ordnungsgemäß funktioniert .

Es wird davon ausgegangen, dass alle Bark-, Woof- und Grr-basierten Token in Ihrer Eingabe mit Großbuchstaben beginnen. Es ist daher nicht erforderlich , sich um das Drehen Bark grrrin Hey heyyoder ähnliches zu kümmern.

Beispiel Ein- und Ausgänge

    • Eingang: Bark. Bark! Bark!!
    • Ausgabe: Hey. Hey! Hey!!
    • Eingabe: Baaaaaark?(sechs as)
    • Ausgabe: Heyyyyyy?(sechs ys)
    • Eingabe: Grrrrrrrr...(acht rs)
    • Ausgabe: Heyyyyyyy...( sieben y s)
    • Eingang: ?...!
    • Ausgabe: ?...!
    • Eingang: Wooof Woof? Grrrr. Baaaark Grr!
    • Ausgabe: Heyy Hey? Heyyy. Heyyyy Hey!
A. Mirabeau
quelle
10
Hallo und willkommen auf der Seite! Nur damit Sie wissen, ist es auf dieser Website üblich, eine Weile zu warten, bevor Sie die kürzeste Antwort annehmen. Ich möchte Sie ermutigen, die von Ihnen akzeptierte Antwort nicht anzunehmen und zu warten, bis die Aktivität zu dieser Frage nachlässt, bevor Sie die kürzeste Antwort annehmen. Dies wird auch mehr Antworten ermutigen.
DJMcMayhem
Verbunden.
Martin Ender
Vielen Dank für die Tipps zum Abnahmeprozess. Eigentlich hatte ich vor, alle paar Stunden die Liste der Antworten zu überprüfen, und wenn ich bemerkte, dass eine bessere Antwort gekommen war, akzeptiere ich sie. Tut mir leid für jemanden, dem ich hier den Ruf verweigert habe.
A. Mirabeau
5
@ A.Mirabeau Das ist ehrenwert und wie es im Idealfall funktionieren würde, aber einige Leute sind nicht so aufmerksam, so dass die meisten Antwortenden davon ausgehen könnten, dass der Gewinner bereits ausgewählt wurde. Obwohl es nichts auszusetzen ist , einen Gewinner sofort auszuwählen, wenn Sie ein Update planen, werden Sie wahrscheinlich weniger Antworten erhalten, zusammen mit einigen Beschwerden. Daher ist es in der Regel besser, mindestens eine Woche zu warten.
Martin Ender

Antworten:

16

Retina , 24 18 17 16 Bytes

1 Byte gespeichert basierend auf einer Idee in der Antwort von MT0.

\wf?k?
y
\byy
He

Probieren Sie es online!

Erläuterung

\wf?k?
y

Das macht einfach alle Buchstaben zu y , aber wenn ihnen ein foder folgt, kersetzen wir das auch sofort. Durch Entfernen fund k"normalisieren" wir die Länge der Wörter, so dass sie jetzt alle zwei ys mehr haben, als sie brauchen.

\byy
He

Das sind die ersten beiden y von jedem Wort zu Heund vollendet die Transformation.

Martin Ender
quelle
Die bisher effizienteste Antwort, gut gemacht. Ich werde es noch nicht akzeptieren, aber ich kann Ihnen sagen, dass Sie CAT FUD verdienen.
A. Mirabeau
10

Perl, 51 41 39 Bytes

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

Verwendung

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

Eingang

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

Ausgabe

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

Wie es funktioniert

Einfaches Ersetzen durch reguläre Ausdrücke durch automatisches Drucken, -pwobei der Zählung 1 Byte hinzugefügt wird./geFührt die Ersetzung für jedes Muster aus und führt die Ersetzung als Code aus.


Eine ältere Version verwendete eine Drei-Wege-Erkennung, Martin Ender jedoch bemerkte, dass ich nicht aggressiv genug war, was mir 10 Bytes ersparte.

msh210 hat mich darüber informiert, dass Sie keine Anführungszeichen für die Zeichenfolge benötigen He, wodurch zwei Bytes eingespart werden .

Rohr
quelle
2
Das Beste bisher, herzlichen Glückwunsch.
A. Mirabeau
1
@ A.Mirabeau Danke, das ist ein ziemliches Kompliment, wenn man bedenkt, dass ich mich vor ein paar Minuten hier registriert habe!
Pipe
Es ist motivierend, drei Lösungen zu haben, wenn man bedenkt, dass ich mich vor ein paar Stunden hier registriert habe.
A. Mirabeau
1
Sie brauchen keine Anführungszeichen He.
msh210
@ msh210 Interessant, wusste nicht, dass man sie dort weglassen darf!
Pipe
5

Python, 106 Bytes

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:])

Demo

https://repl.it/C6Rr

Chuck Morris
quelle
Obwohl dies nicht die akzeptierte Antwort ist, verdient diese eine lobende Erwähnung als die byteeffizienteste Lösung, die nur die drei notwendigen Schlüsselwörter in der Sprache des Hundes ändert .
A. Mirabeau
4

JavaScript (ES6) - 57 55 52 51 Bytes

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

Prüfung:

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) );} );

Vielen Dank an @MartinEnder für die Bytes 56 und 51 und die Inspiration für einige der anderen Späne.

MT0
quelle
4

Vimscript, 51 39 37 33 32 29 28 Bytes,

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

Regex Credits für das Rasieren von 9 weiteren Bytes: MT0, Martin Ender, msh210

asciicast Demo

Erläuterung:

                               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
Starcorder
quelle
1
Ich kenne Vimscript nicht, aber können Sie \<yystattdessen verwenden \<\hy?
msh210
@ msh210 ja es ist möglich und ich habe die lösung aktualisiert, danke
starcorder
2

Perl 5, 25 Bytes

Eine Perl-Kopie von Martin Enders Retina-Antwort . 24 Bytes plus 1 für -pestatt -e.

s;\wf?k?;y;g;s;\byy;He;g
msh210
quelle
2

Javascript, 72 66 64 Bytes

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

Bearbeiten: getrennt f=und Funktion + reduzierte Bytezahl

Starcorder
quelle
1
Sie brauchen das nicht f=(als Standardeinstellung von PPCG), also funktionieren 64 Bytes.
28.
@ EᴀsᴀIᴛᴇʀʟʏ Großartig, ich wusste das nicht
Starcorder
1

Pyke, 35 Bytes

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

Probieren Sie es hier aus!

Erzeugt Heys, Interpunktion, Reißverschlüsse zusammen, verbindet

Blau
quelle
1

Python 3, 140 135 134 Bytes

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)])

Verwenden von Regex, um Vorkommen von ersetzbaren Zeichen zu finden.

Edit: 1 Byte Whitespace und 4 Byte beim Abrufen der Werte aus dem Findall-Ergebnis.

Edit2: Golfed 1 Byte (Bark's "a" wurde nicht richtig gezählt)

Gábor Fekete
quelle