Schreiben Sie ein Programm, um das Namensspiel zu spielen .
Eingang
Ihr Programm sollte in irgendeiner Weise einen einzelnen Namen als Eingabe vom Benutzer akzeptieren (z. B. von der Standardeingabe lesen oder als Befehlszeilenargument). Sie können davon ausgehen, dass der Name ein einzelnes Wort ist, das aus einem Großbuchstaben gefolgt von einem oder mehreren Kleinbuchstaben besteht.
Ausgabe
Ihr Programm muss den Reim für den angegebenen Namen drucken, wie im Lied erläutert, indem Sie die folgende Vorlage ausfüllen:
(X), (X), bo-b(Y)
Banana-fana fo-f(Y)
Fee-fi-mo-m(Y)
(X)!
Hier (X)
ist der ursprüngliche Name und (Y)
der Name in Kleinbuchstaben, wobei alle Anfangskonsonanten entfernt wurden.
Es gibt jedoch eine Ausnahme. Wenn der ursprüngliche Name mit begann m
, f
oder b
, sollte es ohne diesen Brief auf der entsprechenden Zeile geschrieben werden. Wenn der Name beispielsweise war Bob
, sollte die Zeile "b" mit enden bo-ob
. Beachten Sie, dass in diesem Fall alle anderen Konsonanten gehalten werden, so dass für Fred
sie ist fo-red
, nicht fo-ed
.
Beispiele
Shirley:
Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!
Arnold:
Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!
Bob:
Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!
Fred:
Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!
Wertung
Der kürzeste Code gewinnt.
Y
es wird als Gesang behandelt, alsoYves
ist es wieIves
oderArnold
.Y
nur dann als Vokal behandeln, wenn ihm ein Konsonant folgt. Das sollte zumindest diese Fälle abdecken.Antworten:
vi,
118115Der Code enthält 5 Steuerzeichen, die ich in Klammern gesetzt habe. Jedes zählt nur als einzelnes Zeichen für die Zeichenanzahl.
BEARBEITEN: Durch Verschieben des ersten Joins (J) nach später und Ändern des Einfügens vor (P) in ein Einfügen nach (p) wurde mir 1 Zeichen gespeichert. Außerdem hat mir das Nichterfassen des O in der Regex 2 weitere Zeichen erspart.
quelle
SNOBOL4,
437430 BytesUngolfed (und ich habe eine Eingabeaufforderung hinzugefügt; die obige wartet nur darauf, dass ein Name eingegeben wird):
Dies ist das erste SNOBOL-Programm, das ich jemals geschrieben habe.
SNOBOL ist eine zeilenorientierte Sprache wie FORTRAN, COBOL oder BASIC. Jede Zeile besteht aus einer optionalen Beschriftung ab Spalte 1, dem Code für die Zeile, der Zuweisungen und Musterabgleich beinhalten kann, und einem optionalen Zweig. Ja, Zeilen enden mit (optionalen) GOTOs. Sie kommen in zwei Formen:
Zweige zu beschriften
TARGET
, währendVerzweigt zu,
SUCCESS
ob die Musterübereinstimmung erfolgreich war oderFAILURE
nicht. Sie können auch einfach nach Erfolg verzweigen und bei Misserfolg in die nächste Zeile wechseln oder umgekehrt.Fortsetzungszeilen beginnen mit einem
+
oder.
. Kommentare beginnen mit a*
.Wie funktioniert es?
Lesen Sie einen Namen ein und konvertieren Sie ihn in Kleinbuchstaben. Richten Sie die B-, F- und M-Namen so ein, dass sie mit einem Vokal beginnen. Überprüfen Sie dann, ob es mit einer Reihe von Konsonanten beginnt. Wenn nicht, sind wir bereit zu gehen! Wenn ja, entfernen Sie die führenden Konsonanten und richten Sie die B-, F- und M-Namen ein, vorausgesetzt, sie beginnen nicht mit einem dieser Buchstaben. Überprüfen Sie abschließend, ob es nacheinander mit jedem dieser Buchstaben beginnt, und korrigieren Sie die Namen nach Bedarf. Dann sind wir bereit, das Namensspiel zu spielen!
Probelauf:
Ich habe dies auf dem Hercules S / 370-Mainframe-Emulator ausgeführt, auf dem die Version 6.0a des Michigan Terminal Systems mit SNOBOL4 Version 3.10 vom 1. April 1973 ausgeführt wurde, die am 1. Mai 1975 für MTS erstellt wurde, aber es gibt wahrscheinlich einfachere Möglichkeiten, SNOBOL4 auf einem auszuführen modernes System. :) :)
Bearbeiten: Ein redundanter Erfolgszweig wurde entfernt, der einem Durchfall entspricht (ich wusste nicht, dass ich nur einen Fehlerzweig selbst einfügen kann), wodurch ein nicht benötigtes Zweigetikett entfernt wird, und ein bedingungsloser Goto in einen Fehlerzweig in der vorherigen Zeile umgewandelt. für eine Einsparung von 7 Bytes.
Jetzt, da TIO SNOBOL4 unterstützt, können Sie es online ausprobieren ! Hinweis: Die Größe wird als 429 anstatt als 430 angezeigt, da beim Einfügen dort der endgültige Zeilenvorschub entfernt wurde. Ich habe versucht, die Fortsetzungszeile (die mit beginnt
+
) in eine einzelne Zeile zu ändern , was in der Mainframe-Version nicht zulässig war, da die Zeile zu lang war, und es hat funktioniert und sie auf 427 reduziert. Offensichtlich erlaubt CSNOBOL4 längere Zeilen. Ich werde meine Punktzahl jedoch bei 430 belassen, da das Skript so viele Bytes auf meinem Computer hatte und SNOBOL außerdem nicht wettbewerbsfähig ist.quelle
N = TRIM(INPUT)
könnenN =TRIM(INPUT)
.J , 149 Zeichen
quelle
Javascript, 115 Bytes
Erläuterung:
Diese Funktion gibt den Namen ohne die Anfangskonsonanten zurück
Dann ist der Rest eine Funktion, die die vollständige Zeichenfolge zurückgibt.
Bearbeiten: von 119 bis 115 Bytes dank @Martin Ender
quelle
/[aeiou]\w*/i
.JavaScript, <s>119</s> 115 bytes
in der Kopfzeile einfügen, um den Leuten einen Hinweis zu geben, dass es ursprünglich eine längere Version gab, wenn sie interessiert sind.Clojure , 292 Zeichen nach dem Minimieren
Hier ist ein erster Versuch, fast positiv, ich kann ihn weiter vertiefen:
Ich lerne gerade Clojure und dachte, es würde Spaß machen, dies zu versuchen. Hier ist meine Argumentation:
quelle
Scala 281
Ich habe (X) und (Y) im Muster durch
#
und ersetzt012
.S
ist nur ein neuer Name fürString
unda(b,c,d)
ist eine Kurzdefinition fürb.replaceAll(c,d)
Testaufruf:
Und ungolfed:
quelle
Python 3,
148145142 BytesJa, ich weiß, es ist etwas spät, aber ...
Es verwendet die neuen F-Strings, um den resultierenden String zu formatieren.
Ich glaube, TIO unterstützt leider noch keine F-Strings.
Alte Version
3 Bytes dank @officialaimm gespeichert
quelle
Sed, 162 Bytes
Ich wusste nicht sehr gut, bevor ich das tat. Ich weiß es jetzt viel besser. Der erste Sed in der Pipeline dupliziert den Namen dreimal, sodass er zu "Bob \ nBob \ nBob \ nBob" anstatt nur zu "Bob" wird. Der nächste Sed macht das schwere Heben.
Erwartet Eingaben auf stdin wie
echo Name |sed ...
Ungolfed:
Ein paar Notizen. Die ersten vier Übereinstimmungen, 1s, 2s, 3s, 4s, verwandeln die Ausgabe in etwas, das nicht ganz korrekt ist. Bob ist bo-bbob geworden, Fred ist fo-ffred geworden, und Mike ist mo-mmike geworden. Kay würde mo-mkay werden, mkay?
Dann müssen wir entweder bo-bbob durch bo-ob oder bo-bkay durch bo-bay ersetzen. Um dies zu tun, können wir eine Funktion verwenden, bei der wir eine /// Ersetzung durchführen und dann verzweigen, wenn dies erfolgreich war, und über die zweite springen, die wir jetzt überspringen möchten. Aber wenn es fehlschlägt, wollen wir durch den Zweig fallen und die nächste Auswechslung vornehmen.
Der Befehl t [label] führt dies aus und verzweigt nur, wenn ein vorheriges s /// übereinstimmt. Aber zu Beginn des Skripts habe ich bereits ein s /// für jede Zeile geschrieben (die führenden Zahlen in 1s, 2s usw. sind Adressen; sie bedeuten, dass der Befehl nur ausgeführt wird, wenn die Adresse übereinstimmt). Egal auf welcher Linie wir uns befinden, 1, 2, 3 oder 4, mindestens ein s /// hat übereinstimmend. (Ich habe versucht, es umgekehrt zu machen, die Namen zu massieren und danach die "Banane-etc." Hinzuzufügen, bin aber auf diese Weise festgefahren, und der Versuch, alles auf einmal zu tun, würde einige Wiederholungen verursachen.) Glücklicherweise kann die Flagge durch Löschen eines Zweigs gelöscht werden, also machen wir das mit "tx ;: x". tx verzweigt zum x-Label und: x ist das x-Label.
Wütend! Das macht den Gaumen für die letzten beiden Auswechslungen frei. Wir versuchen es mit einem, und wenn es gelingt, verzweigen wir über das andere, sonst machen wir das zweite. In beiden Fällen landen wir am Label: z, und der Musterpuffer enthält eine Textzeile, die auf stdout gedruckt wird.
Vielen Dank, dass Sie mich dazu gebracht haben, genug Zeit mit der Manpage von sed und dem Texinfo-Handbuch zu verbringen, um endlich zu verstehen, wie man mehr als sed s / foo / bar / macht.
quelle
|
und allem. Vielleicht sollte ich diese Bash / Sed nennen oder anders zählen? Ich weiß es nicht. Ich bin zufrieden mit dem Ist-Zustand, aber lassen Sie mich wissen, ob es nach den Standards von PPCG anders sein sollte.Python, 161
Ich habe gerade festgestellt, dass mein Code fehlschlägt ...
- Entfernt keine Anfangskonstanten.
- Verwaltet nicht das 'Bo-Ob'-Geschäft.
Es ist das weiteste, was ich habe, vielleicht kann es jemand beenden.
quelle
Groovy, 146
quelle
R, 189 Zeichen
Mit nur einem weiteren Zeichen können Sie viele Namen auf einmal eingeben:
quelle
Pyth , 111 Bytes SBCS
Testsuite
Code verwendet nicht druckbare Zeichen und wird daher in Stack Exchange nicht richtig angezeigt. Der bereitgestellte Link enthält diese Zeichen und ist die richtige Version des Programms.
quelle
Python
quelle