Ein Portmanteau-Wort ist eine Kombination aus zwei Wörtern, die aus jedem Wort ein neues Wort bilden. Zum Beispiel Löwe + Tiger => Liger .
Lassen Sie uns ein Programm schreiben, um Portmanteaus aus zwei Eingabewörtern zu generieren. Computer beherrschen nicht die englische Sprache, daher müssen wir einige Regeln festlegen, um sicherzustellen, dass die Ausgabe-Portmanteaus für Auge und Ohr angenehm sind.
(Beispiele sind hier zur Verdeutlichung mit einem Trennzeichen zwischen Präfix und Suffix versehen:. li|ger
Die tatsächlichen Ausgaben des Programms sollten jedoch kein Trennzeichen haben:. liger
)
- Jedes Portmanteau besteht aus einem nicht leeren Präfix des ersten Wortes, das mit einem nicht leeren Suffix des zweiten Wortes verknüpft ist: Ja bis
li|ger
, Nein bis|iger
. - Wenn das Präfix mit einem Vokal endet, muss das Suffix mit einem Konsonanten beginnen und umgekehrt: Ja zu
lio|ger
oderl|er
, Nein zulio|iger
oderl|ger
. Sie können entscheiden, ob Siey
als Vokal oder Konsonant zählen möchten. Ihre Lösung muss jedoch eine Option auswählen und dabei bleiben. - Das resultierende Wort darf keines der ursprünglichen Wörter vollständig enthalten: ja bis
lio|ger
, nein bislion|iger
oderli|tiger
.- Diese Regel gilt auch dann, wenn der betreffende Teil aus Teilen beider Wörter besteht: Bei Eingabe von
two
+words
ist die Ausgabetw|ords
immer noch unzulässig, da sie die Teilzeichenfolge enthältwords
. (Die einzig gültige Ausgabe für dieses Paar wäret|ords
.)
- Diese Regel gilt auch dann, wenn der betreffende Teil aus Teilen beider Wörter besteht: Bei Eingabe von
Ihr Programm oder Ihre Funktion muss aus zwei Wörtern bestehen und eine Liste aller angenehmen Portmanteausgeben / zurückgeben , die aus diesen Wörtern in dieser Reihenfolge gebildet werden können.
Einzelheiten
- Es gelten die Standard-Eingabe- und Ausgabemethoden . Standardlücken sind verboten.
- Wörter bestehen nur aus Kleinbuchstaben (oder, wenn Sie möchten, nur aus Großbuchstaben).
- Sie können die beiden Eingabewörter als Liste, Tupel, zwei separate Eingaben, eine einzelne Zeichenfolge mit einem Nicht-Buchstaben-Trennzeichen usw. verwenden.
- Das Ausgabeformat ist ähnlich flexibel. Wenn Sie eine Zeichenfolge zurückgeben oder ausgeben, sollte sie so begrenzt sein, dass klar ist, wo ein Portmanteau-Wort endet und das nächste beginnt.
- Ein Portmanteau-Wort sollte keine Begrenzer enthalten.
- Es ist in Ordnung, wenn Ihre Ausgabeliste doppelte Ergebnisse enthält. Duplikate können auch entfernt werden.
Testfälle
> lion, tiger
< liger, ler, liger, lir, lioger, lior
> tiger, lion
< tion, ton, tin, tigion, tigon, tigen
> spoon, fork
< sork, spork, spork, spok, spoork, spook
> smoke, fog
< sog, smog, smog, smokog
> gallop, triumph
< giumph, gumph, gariumph, gamph, gaph, gah, galiumph, galumph, galliumph, gallumph, galloriumph, gallomph, galloh
> breakfast, lunch
< bunch, brunch, brench, brech, breh, breanch, breach, breah, breakunch, breakfunch, breakfanch, breakfach, breakfah, breakfasunch
> two, words
< tords
> harry, ginny (if y is treated as a consonant)
< hinny, hanny, hany, hay, harinny, harrinny
> harry, ginny (if y is treated as a vowel)
> hinny, hy, hanny, hany, harinny, hary, harrinny
Referenzlösung
Hier ist eine Referenzlösung in Pip (wird y
als Konsonant behandelt ).
Das ist Code-Golf : Die kürzeste Antwort in jeder Sprache gewinnt!
Antworten:
05AB1E , 28 Bytes
y
ist ein Vokal (die gleiche Anzahl von Bytes wie der Konsonant).Probieren Sie es online! oder als leicht modifizierte Test Suite
quelle
ʒs¢Z_
;ʒsåO_
;ʒsм__
; etc.Netzhaut , 72 Bytes
Probieren Sie es online!
quelle
Lw$`(?<=[aeiou])(.+),(.+)(?<!^\2\1,\2)(?!\1)(?=[^aeiou])|(?<=[^aeiou])(.+),(.+)(?<!^\4\3,\4)(?!\3)(?=[aeiou])
, konnte mich aber aufgrund von Kopfschmerzen nicht auf das Golfen konzentrieren.(?=.(?<=[aeiou]\1[^aeiou]|[^aeiou]\1[aeiou]))
und dann wahrscheinlich mindestens sechs Iterationen brauchte, um es dahin zu bringen, wo es jetzt ist.^
s in meinem vorherigen Kommentar sind falsch.) In der Tat hätte ich nie an diesen()|.()
Trick gedacht , ich hätte wahrscheinlich damit aufgehörtLw$`(?<=([aeiou])|.)((.+),(.+))(?<!\4\2)(?!\3)(?=(?(1)[^aeiou]|[aeiou]))
.Pyth , 38 Bytes
Die Eingabe ist eine Liste der beiden Wörter, und y wird nicht als Konsonant behandelt.
Versuchen Sie es online hier , oder prüfen Sie alle Testfälle auf einmal hier .
quelle
Java 8,
228225215 BytesNimmt zwei Strings in der aktuellen Syntax und gibt einen String zurück. Behandelt
y
als Konsonant. Probieren Sie es online aus hier aus .Dank an DLosc für das Golfen mit 2 Bytes.
Ungolfed:
quelle
Japt , 32 Bytes
Japt Interpreter
Dank Shaggys klarerem Verständnis der Japt-Syntax konnten 10 Byte eingespart werden.
8 Byte aufgrund einer neuen Sprachfunktion eingespart
2 Byte gespart dank einiger Anregungen von ETHproductions
Die neueste Version von Japt hat die Cartesian Product-Funktion eingeführt, die einige Bytes einspart und es mir ermöglicht, die Reihenfolge der Eingaben wiederherzustellen (also "lion" "tiger" gibt "liger" und so weiter). "y" wird immer noch als Konsonant behandelt.
Erläuterung:
quelle
Python 3 ,
156150 BytesIch habe
y
als Konsonant betrachtet.-6 Bytes dank Jonathan Frech
Probieren Sie es online!
quelle
lambda x=0
, um ... 0 Zeichen zu speichern, was ärgerlich ist.lambda a,b,v='aeiou',r=range:{a[:i]+b[j:]for i in r(1,len(a))for j in r(1,len(b))if((a[i-1]in v)^(b[j]in v))*0**(a in a[:i]+b[j:]or b in a[:i]+b[j:])}
(Noch 150)JavaScript (ES6), 124 Byte
Nimmt die 2 Wörter in currying Syntax
(a)(b)
und druckt die Ergebnisse mitalert()
. Angenommen, y ist ein Konsonant.Probieren Sie es online!
quelle
Gelee , 27 Bytes
Probieren Sie es online!
Yy ist ein Konsonant. Beide Fälle werden unterstützt. Gibt Duplikate zurück.
Die Ausgabe wurde über TIO vorgegeben. Entfernen Sie
+/€
aus der Fußzeile, um die tatsächliche Ausgabe anzuzeigen.quelle
C ++ 11,
217202 BytesMacht viel Gebrauch von
std::string#find
. Behandelty
als Konsonant. Probieren Sie es hier online aus .Ungolfed:
quelle
Python 2 ,
179176166162 BytesProbieren Sie es online!
3 Bytes von Jonathan Frech . Und 10 Bytes danke an The Matt .
In meiner Welt
y
ist kein Vokal. (Es ist ein Jaulen!)quelle
t) if
undt) or []
.(s in w)<1>(t in w)
.Ruby ,
113 112 109104 Bytesy
ist ein KonsonantDies gibt die gleichen Duplikate wie die Beispiele in der Frage aus, ich muss die gleiche Schleife verwenden
Probieren Sie es online!
quelle
Emacs Lisp , 306 + 13 = 319 Bytes
+13 für
(require'seq)
Probieren Sie es online!
Definiert eine anonyme Lambda-Funktion. Gibt eine Folge von Portmanteaus mit Zeilenumbrüchen aus, wobei jedes von Anführungszeichen umgeben ist. Golftipps sind willkommen. Der Brief
y
gilt als Konsonant.Ungolfed
quelle