Verfassen Füllen Sie die Lücken aus

18

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 cheesewü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, bluedie 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 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"]
Weizen-Assistent
quelle
1
Alle 3 vorhandenen Antworten schlagen derzeit fehl, wenn in der Eingabe ein nicht druckbares ASCII-Zeichen verwendet wird (je nach Antwort SOH, TAB oder LF). Ich denke, Sie sollten sich wirklich entscheiden, ob die Eingabe auf druckbares ASCII beschränkt ist oder nicht.
Arnauld
@Arnauld Ok bis jetzt ist es uneingeschränkt und ich habe keinen Grund gesehen, das zu ändern, damit es so bleibt.
Weizen-Assistent
2
Die @ KevinCruijssen-Mine ist gültig, da Null kein Zeichen ist. Lucky Language Feature hilft aus.
Jonathan Allan
1
@ SriotchilismO'Zaic Mein 05AB1E wurde durch Zeilenumbrüche verbunden / gespalten. Die JavaScript- und Haskell-Antworten werden durch Tabulatoren verbunden / getrennt, die C # -Antwort durch das nicht druckbare Zeichen `` (SOH), sodass auch diese ungültig sind. Ich kenne Perl 5 allerdings auch nicht gut genug. Damit man gültig sein könnte.
Kevin Cruijssen
3
@Roman Sie können nicht davon ausgehen, dass in der Eingabe kein Zeichen erscheint, sodass Sie es als Trennzeichen verwenden können. Sie müssen die Herausforderung tatsächlich lösen.
Weizen-Assistent

Antworten:

11

Gelee , 6 Bytes

j0j@ṣ0

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:

j0j@ṣ0 - Link: b, a        e.g.    b = [['a','b'],['c','d'],['e']]
       -                   ...and  a = [['w'],['x'],['y'],['z']]
                             (i.e. test-case ["w","x","y","z"] ["ab","cd","e"])
j0     - join b with zeros         ['a','b',0,'c','d',0,'e']    
  j@   - join a with that          ['w','a','b',0,'c','d',0,'e','x','a','b',0,'c','d',0,'e','y','a','b',0,'c','d',0,'e','z']
    ṣ0 - split at zeros            [['w','a','b'],['c','d'],['e','x','a','b'],['c','d'],['e','y','a','b'],['c','d'],['e','z']
                             (i.e.: ["wab","cd","exab","cd","eyab","cd","ez"])

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.

Jonathan Allan
quelle
5

Haskell , 78 Bytes

(a:b:r)#t@(x:s)|s>[]=(a++x):init s++((last s++b):r)#t|z<-a++x++b=(z:r)#t
x#_=x

Probieren Sie es online!

Laikoni
quelle
5

Python 3.8 (pre-release) ,  60  58 Bytes

lambda a,b:(v:='&'.join(a+b)+'$').join(b).join(a).split(v)

Eine unbenannte Funktion, die zwei Listen von Zeichenfolgen akzeptiert aund beine Liste von Zeichenfolgen zurückgibt.

Probieren Sie es online! Oder sehen Sie sich die Testsuite an .

Wie?

Bildet zunächst eine Trennzeichenkette v, die in aoder nicht zu finden ist b. Bilden Sie dann eine Zeichenfolge, indem Sie die Zeichenfolgen in zusammenfügenb mit Kopien von v. Bilden Sie dann eine Zeichenfolge, indem Sie die Zeichenfolgen amit Kopien davon zusammenfügen. Teilt diese Zeichenfolge schließlich in Instanzen von vauf, um eine Liste von Zeichenfolgen zu erhalten.

Während sichergestellt vist , ist nicht in aoder bwir müssen auch sicherstellen, vdass wir uns nicht früh in dem Fall trennen, in dem alle Saiten in aund bgleich sind. Zu diesem Zweck verbinden wir valle 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.

Jonathan Allan
quelle
Könnten Sie ein Beispiel geben, wo &es erforderlich ist? und mit ''.join(a+b)+'$'nicht genug?
Weizen-Assistent
Ich brauchte eine Weile, ['$','$'] ['$','$']würde es aber sein.
Weizen-Assistent
Ja, wenn alle Zeichenfolgen mit dem ausgewählten '$'Zeichen übereinstimmen und das Ergebnis mehr als eine Zeichenfolge ist, benötigen wir ein anderes Zeichen, um ein frühzeitiges Aufteilen zu vermeiden.
Jonathan Allan
2

05AB1E , 4 15 19 9 11 Bytes

«TýR©ý¹sý®¡

Anders als bei der Jelly-Antwort sind der String "0", die Ganzzahl 0und der Float von 05AB1E 0.0alle (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:

«            # Merge the two (implicit) input-lists together
 Tý          # Then using a "10" delimiter join all strings together
   R         # Reverse this string
    ©        # Store this string in variable `®` (without popping)
     ý       # Use this string as delimiter to join the second (implicit) input-list
      ¹sý    # Then join the first input-list by this entire string
         ®¡  # And split it back on variable `®` so it's the expected list of strings
             # (after which this result is output implicitly)
Kevin Cruijssen
quelle
2
Dies schlägt fehl, wenn der Eingang Zeilenumbrüche enthält (OP hat gemeldet, dass der Eingang derzeit nicht eingeschränkt ist).
Erik der Outgolfer
@EriktheOutgolfer Jede andere Antwort hat übrigens das gleiche Problem.
Kevin Cruijssen
@EriktheOutgolfer Kann definitiv noch mehr golfen, hat aber vorerst eine schnelle und schmutzige Lösung gefunden.
Kevin Cruijssen
1
Äh, tut mir leid ... es wird nicht funktionieren, wenn die Eingabelisten Zeichenfolgen enthalten, die nur Zeilenumbrüche enthalten :( (es wird vorzeitig aufgeteilt)
Jonathan Allan
1
@ JonathanAllan Lol .. Ah, ich schätze, ich kann Ihnen nur dafür danken, dass Sie diese Fehler gefunden haben. Ich hoffe, dass sie jetzt behoben sind und Sie nichts anderes finden. Obwohl ich das Gefühl habe, dass Sie das könnten.
Kevin Cruijssen
2

Japt , 8 Bytes

Passt Jonathans Ansatz an .

qVqN²)qN

Versuch es

qVqN²)qN     :Implicit input of arrays U & V (N=[U,V])
q            :Join U with
 Vq          :  V joined with
   N²        :    Push 2 to N (modifying the original), which gets coerced to a string
             >     e.g., N=[["a","b"],["c","d"]] -> N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"
     )       :End join
      qN     :Split on the modified N, which, again, gets coerced to a string
             > e.g., N=[["a","b"],["c","d"],2] -> "a,b,c,d,2"
Zottelig
quelle
Was ist Nin diesem Fall? Wenn ich es richtig verstehe (mithilfe der Suchfunktion des TryIt-Links), wird es Nzweimal wiederholt ( ). Anschließend wird dies zum Verknüpfen der zweiten Eingabe V( VqN²) verwendet und anschließend die gesamte Zeichenfolge zum Verknüpfen der ersten (impliziten) Eingabe U( q...)). Und schließlich teilt die resultierende Zeichenfolge auf N( qN). Aber was ist Nin diesem Fall?
Kevin Cruijssen
Ah warte, ich glaube ich habe bei p(...)der Suche die falsche Methode angeschaut . Es hängt die 2beiden gekoppelten Eingänge an, nicht wahr? Führt nur zu [["w","x","y","z"],["ab","cd","e"],2]und verwendet die gesamte Liste zum Beitreten. Warum qNüberlässt das Finale 2in diesem Fall nicht die Ergebnisliste? Oder ändert sich das Original N?
Kevin Cruijssen
1
@ KevinCruijssen, fügte eine Erklärung hinzu, aber Sie haben es so ziemlich herausgefunden. Und ja, pushwenn Sie Elemente in ein Array in JS einfügen, wird das ursprüngliche Array geändert.
Shaggy
1

Haskell , 62 Bytes

[a]#(c:d)=(a++c):d
(a:b)#c=a:b#c
[a]%b=[a]
(a:b)%c=[a]#c#(b%c)

Probieren Sie es online!

Hier ist meine Haskell-Antwort. Es funktioniert mit jeder Art von Liste.

Weizen-Assistent
quelle
1

J , 44 43 42 29 Bytes

_<;._1@,(;@}:@,@,.(,_&,)&.>/)

Probieren Sie es online!

-13 Bytes dank Meilen!

Dieser Ansatz verwendet ganze Zahlen und ist auf Meilen zurückzuführen.

origineller Ansatz mit Streichern

g=.[:}.@,,.
f=.(<@0<@;;._1@,];@g<"0@[)<@0<@g]

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ässt

Jona
quelle
Als ich mit einer Liste von Ganzzahlen als Eingabe arbeitete, fand ich eine 29-Zeichen- Lösung , _<;._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.
Meilen
Das ist beeindruckend. Danke @miles. Dieser hatte definitiv das Gefühl, es gäbe Raum für Verbesserungen, aber ich habe nicht gesehen, wie.
Jonah,
@miles Sollte das nicht g&.:(a.&i.&.>)zu den Bytes zählen oder fehle ich etwas?
Jonah
Das OP erwähnte, dass die Eingabe als eine Liste von Zeichen oder als eine Liste von ganzen Zahlen erfolgen könnte, so dass die Hilfsfunktion nur darin besteht, von Feldern
Meilen
Ah, das habe ich vergessen, danke
Jonah
0

Perl 5 ( -lp), 20 Bytes

Wie @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.

chop($n=<>);s/  /$n/g

TIO

Der Tabulator und die Zeilenvorschubzeile wurden ausgewählt, da dies die Prüfung von Testfällen erleichtert. Andernfalls können die Zeichen \1und in nicht druckbare Zeichen geändert werden\2 .

( -02l012p)

chop($n=<>);s//$n/g

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 \1durch zu ersetzen$n
Nahuel Fouilleul
quelle
2
Mein Perl existiert so gut wie nicht, aber ich glaube, dass dies ein Vollprogramm ist, das für IO einen Tabulator als Listentrennzeichen und einen Zeilenvorschub zum Trennen der beiden Listen verwendet. Wie kann es Eingaben mit diesen Zeichen akzeptieren?
Jonathan Allan
@ JonathanAllan, Sie sind richtig, ich hatte nicht die Zeit, Erklärung hinzuzufügen, wenn ich versuche, zu tun
Nahuel Fouilleul
0

JavaScript (ES6),  62  59 Bytes

3 Bytes gespart dank @Shaggy

Dies ist eine feste Version von Luis 'Antwort (jetzt gelöscht), um alle Charaktere zu unterstützen.

a=>b=>a.map(e=escape).join(b.map(e)).split`,`.map(unescape)

Probieren Sie es online!

Arnauld
quelle