Angenommen, wir haben einen bestimmten Satz von Funktionen für Zeichenfolgen. Diese Funktionen ähneln dem Ausfüllen von Leerzeichen oder Madlibs, mit der Ausnahme, dass sie nur eine Eingabe verwenden, um alle Leerzeichen auszufüllen. Zum Beispiel könnten wir eine Funktion haben, die so aussieht
I went to the ____ store and bought ____ today.
Wenn wir diese Funktion auf den String anwenden cheese
würden, wäre das Ergebnis:
I went to the cheese store and bought cheese today.
Wir können diese Funktionen als eine nicht leere Liste von Zeichenfolgen darstellen, wobei die Leerzeichen einfach die Lücken zwischen den Zeichenfolgen sind. Zum Beispiel wäre unsere obige Funktion:
["I went to the ", " store and bought ", " today."]
Bei dieser Darstellung gibt es für jede Funktion dieser Art nur eine Darstellung und für jede Darstellung nur eine Funktion.
Eine wirklich nette Sache ist, dass die Menge solcher Funktionen unter Komposition geschlossen ist. Das heißt, die Zusammensetzung von zwei unserer Funktionen ist immer eine dieser Funktionen. Zum Beispiel, wenn ich unsere obige Funktion mit komponiere
["blue ", ""]
(Die Funktion, blue
die der Eingabe vorangeht. ) Wir erhalten die Funktion:
["I went to the blue ", " store and bought blue ", " today."]
Diese können jedoch etwas komplexer werden. Zum Beispiel, wenn wir die erste Funktion mit komponieren
["big ", " and ", ""]
Das Ergebnis ist
["I went to the big ", " and ", " store and bought big ", "and", " today."]
Aufgabe
Ihre Aufgabe ist es, zwei Funktionen zu übernehmen, die als nicht leere Listen von Zeichenfolgen beschrieben werden, und deren Zusammensetzung als nicht leere Liste von Zeichenfolgen auszugeben.
Für diesen Zweck kann eine Liste ein beliebiger sortierter Container sein, der Duplikate zulässt, und eine Zeichenfolge kann ein systemeigener Zeichenfolgentyp, eine Liste von Zeichen oder eine Liste von ganzen Zahlen sein.
Dies ist Code-Golf- Antworten werden in Bytes bewertet, wobei weniger Bytes besser sind.
Testfälle
["","xy"] ["ab",""] -> ["ab","xy"]
["x","y","z"] ["a","b"] -> ["xa","bya","bz"]
["xy"] ["ab"] -> ["xy"]
["","",""] ["a",""] -> ["a","a",""]
["x",""] ["","",""] -> ["x","",""]
["x","y","z"] ["a","b","c"] -> ["xa","b","cya","b","cz"]
["x","x","x"] ["a"] -> ["xaxax"]
["w","x","y","z"] ["ab","cd","e"] -> ["wab","cd","exab","cd","eyab","cd","ez"]
Antworten:
Gelee , 6 Bytes
Ein dyadischer Link, der die erste Funktionsdarstellung rechts und die zweite Funktionsdarstellung links akzeptiert und die resultierende Funktionsdarstellung ergibt. Jede Funktionsdarstellung ist eine Liste von Zeichenlisten (Jelly hat keine anderen Zeichenfolgen).
Probieren Sie es online! (Die vollständigen Programmargumente werden in Python-Notation angegeben. Zeichenfolgen werden zu Listen. In der Fußzeile wird eine Python-Darstellung der Ausgabe des Links angezeigt.)
Hier ist eine Testsuite, die die Ausgabe des Links wie die Eingaben neu formatiert.
Wie?
Nutzt Jellys gemischte Typenlisten, um die gesamte Domäne von Darstellungen (jede Liste von Zeichenlisten) zuzulassen, indem die Ganzzahl Null als Platzhalter verwendet wird:
Wenn wir uns mit einer der gemischten Listen von Jelly befassen müssten (einschließlich derer mit beliebiger Tiefe oder Form), könnten wir diesen 8-Byte-Code
j,©⁹jœṣ®
verwenden, der die paarweisen Argumente als Platzhalter verwendet.quelle
Haskell , 78 Bytes
Probieren Sie es online!
quelle
Python 3.8 (pre-release) ,
6058 BytesEine unbenannte Funktion, die zwei Listen von Zeichenfolgen akzeptiert
a
undb
eine Liste von Zeichenfolgen zurückgibt.Probieren Sie es online! Oder sehen Sie sich die Testsuite an .
Wie?
Bildet zunächst eine Trennzeichenkette
v
, die ina
oder nicht zu finden istb
. Bilden Sie dann eine Zeichenfolge, indem Sie die Zeichenfolgen in zusammenfügenb
mit Kopien vonv
. Bilden Sie dann eine Zeichenfolge, indem Sie die Zeichenfolgena
mit Kopien davon zusammenfügen. Teilt diese Zeichenfolge schließlich in Instanzen vonv
auf, um eine Liste von Zeichenfolgen zu erhalten.Während sichergestellt
v
ist , ist nicht ina
oderb
wir müssen auch sicherstellen,v
dass wir uns nicht früh in dem Fall trennen, in dem alle Saiten ina
undb
gleich sind. Zu diesem Zweck verbinden wirv
alle Zeichenfolgen in beiden Listen mit Instanzen einer Zeichenfolge (hier'&'
) und fügen ein zusätzliches, anderes Zeichen hinzu (hier'$'
). Beachten Sie, dass es nicht ausreicht, eine der beiden Optionen einzeln zu verwenden, da alle Zeichenfolgen in den Eingaben dem ausgewählten Zeichen entsprechen können.quelle
&
es erforderlich ist? und mit''.join(a+b)+'$'
nicht genug?['$','$'] ['$','$']
würde es aber sein.'$'
Zeichen übereinstimmen und das Ergebnis mehr als eine Zeichenfolge ist, benötigen wir ein anderes Zeichen, um ein frühzeitiges Aufteilen zu vermeiden.05AB1E ,
41519911 BytesAnders als bei der Jelly-Antwort sind der String
"0"
, die Ganzzahl0
und der Float von 05AB1E0.0
alle (etwas) gleich, sodass ich nicht durch eine Ganzzahl trennen / verbinden kann. Aus diesem Grund hatten wir die +15 Bytes als Workarounds, obwohl ich es jetzt auf 9 Bytes zurückgesetzt habe. Vielen Dank an @ JonathanAllan für das Auffinden von 2 Bugs.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Wolfram Language (Mathematica) ,
6261 BytesProbieren Sie es online!
-1 danke an Roman
Obwohl es sich nicht um eine gültige Ausgabe handelt, wird eine Funktion zurückgegeben, die den Job tatsächlich ausführt. (34 Byte)
Probieren Sie es online!
quelle
Riffle
.Japt , 8 Bytes
Passt Jonathans Ansatz an .
Versuch es
quelle
N
in diesem Fall? Wenn ich es richtig verstehe (mithilfe der Suchfunktion des TryIt-Links), wird esN
zweimal wiederholt (N²
). Anschließend wird dies zum Verknüpfen der zweiten EingabeV
(VqN²
) verwendet und anschließend die gesamte Zeichenfolge zum Verknüpfen der ersten (impliziten) EingabeU
(q...)
). Und schließlich teilt die resultierende Zeichenfolge aufN
(qN
). Aber was istN
in diesem Fall?p(...)
der Suche die falsche Methode angeschaut . Es hängt die2
beiden gekoppelten Eingänge an, nicht wahr? Führt nurN²
zu[["w","x","y","z"],["ab","cd","e"],2]
und verwendet die gesamte Liste zum Beitreten. WarumqN
überlässt das Finale2
in diesem Fall nicht die Ergebnisliste? Oder ändert sichN²
das OriginalN
?push
wenn Sie Elemente in ein Array in JS einfügen, wird das ursprüngliche Array geändert.Haskell , 62 Bytes
Probieren Sie es online!
Hier ist meine Haskell-Antwort. Es funktioniert mit jeder Art von Liste.
quelle
J ,
44434229 BytesProbieren Sie es online!
-13 Bytes dank Meilen!
Dieser Ansatz verwendet ganze Zahlen und ist auf Meilen zurückzuführen.
origineller Ansatz mit Streichern
Probieren Sie es online!
Hinweis: Ich habe -3 aus dem TIO angepasst, um das zu berücksichtigen
f=.
Verwendet Jonathan Allens Methode, angepasst für J.
Es war überraschend schwierig, Golf zu spielen, da J keine eingebaute "Join" -Methode hat, und ich wäre gespannt, ob es sich erheblich verbessern lässt.
g
ist ein Hilfsverb, das uns "beitreten" lässtquelle
_<;._1@,(;@}:@,@,.(,_&,)&.>/)
die Unendlich_
als Sentinel-Wert verwendet, um zu wissen, wo aufgeteilt werden soll<;._1
. Das Zusammenfügen erfolgt zunächst mit Hilfe der Option "Reduzieren"/
, um eine große Box zu bilden, und dann mit der einfachen Array-Formgebung.g&.:(a.&i.&.>)
zu den Bytes zählen oder fehle ich etwas?JavaScript (Node.js) ,
8579 BytesProbieren Sie es online!
quelle
JavaScript, 37 Bytes
Auch passt Jonathan Ansatz .
Probieren Sie es online aus
quelle
Perl 5 (
-lp
), 20 BytesWie @JonathanAllan bemerkte, handelt es sich hierbei um ein Vollprogramm, das für IO einen Tabulator als Listentrennzeichen und eine neue Zeile zum Trennen der beiden Listen verwendet.
TIO
Der Tabulator und die Zeilenvorschubzeile wurden ausgewählt, da dies die Prüfung von Testfällen erleichtert. Andernfalls können die Zeichen
\1
und in nicht druckbare Zeichen geändert werden\2
.(
-02l012p
)TIO
Wie es funktioniert,
-02
: um das Trennzeichen für den Eingabesatz auf zu setzen\2
-l
: um das Eingabetrennzeichen aus dem Standardargument zu entfernen$_
und Hinzufügen des Ausgabesatztrennzeichens zur Standardausgabe-012
: um das Trennzeichen für Ausgabedatensätze auf\012
(\n
) zu setzen, damit die Ausgabe leichter überprüft werden kann-p
: um das Standardargument zu drucken$n=<>;
: um den nächsten Datensatz zu lesen und zuzuweisen$n
chop$n;
: um das Trennzeichen von zu entfernen$n
s/\x1/$n/g
: um alle Vorkommen von\1
durch zu ersetzen$n
quelle
JavaScript (ES6),
6259 Bytes3 Bytes gespart dank @Shaggy
Dies ist eine feste Version von Luis 'Antwort (jetzt gelöscht), um alle Charaktere zu unterstützen.
Probieren Sie es online!
quelle