Injektion von zwei Saiten auf eine Saite

13

Herausforderung

Schreiben Sie ein Programm, das eine injektive Funktion anwendet, die ein geordnetes Paar von Zeichenfolgen als Eingabe und eine Zeichenfolge als Ausgabe verwendet. Mit anderen Worten, jede Eingabe muss einer eindeutigen Ausgabe zugeordnet werden.

Besonderheiten

  • Die Eingabe kann alle zwei Strings beliebiger Länge, sondern nur aus druckbaren ASCII - Zeichen (Codes besteht ).[32,126]
  • In ähnlicher Weise unterliegt die Ausgabezeichenfolge keiner Längenbeschränkung, sondern darf nur aus druckbaren ASCII-Zeichen bestehen.
  • Wenn Ihre Sprache keine Zeichenfolgen beliebiger Länge verarbeiten kann, funktioniert das Programm möglicherweise nur theoretisch für Zeichenfolgen beliebiger Größe.
  • Die Zuordnung von Eingaben zu Ausgaben sollte zwischen den Ausführungen des Programms konsistent sein. Ansonsten liegt das verwendete Mapping ganz bei Ihnen, solange es sich um eine Injektion handelt.
  • Der Eingang ist bestellt. Wenn die beiden Eingabezeichenfolgen unterschiedlich sind, sollten sie eine andere Ausgabe erzeugen, als wenn sie vertauscht wären. stf(s,t)f(t,s)
  • Nicht jeder String muss eine mögliche Ausgabe sein.
  • Die kürzeste Antwort in jeder Sprache gewinnt!

Testfälle

Die folgenden Eingaben sollten alle zu unterschiedlichen Ausgaben führen. Um Verwechslungen zu vermeiden, werden Strings von Guillemets («») umgeben und durch einzelne Leerzeichen getrennt.

"Hallo Welt"
«Lelho» «drowl»
"anders"
"nicht das gleiche"

«Code» «Golf»
«Co» «deGolf»
«CodeGolf» «»

«» «»
«» «»
«» «»
«» «»
«» «»

«Abc", »« def »
«Abc» «," def »
«Abc '» «' def»
«Abc '» «' def»

«\» «" »
«\\» «\" »
negative sieben
quelle
8
Hmm ich habe gerade bemerkt , „Schreiben Sie ein Programm , dass ...“ - zur Kenntnis , dass durch Meta - Konsens (derzeit 46 bis 1 unten) volle Programm „Beschränken auf nur Programme explizit erfordert die Angabe‚‘ und nicht nur‚Programm‘“ . Ich hoffe, Sie wollten nicht versuchen, dies einzuschränken, aber wenn Sie dies taten, müssen Sie den Beitrag entsprechend aktualisieren und diejenigen von uns ansprechen, die bereits Funktionen als Antworten übermittelt haben.
Jonathan Allan
4
@ JonathanAllan Die Absicht war, Funktionen zuzulassen.
negative sieben
3
Kann eine der Saiten leer sein?
Shaggy
2
@ Shaggy Ja, einer oder beide können.
negative sieben
1
Können wir einige Testfälle haben? Vielen Dank!
Ouflak

Antworten:

17

Brainfuck, 30 29 27 23 Bytes

,[-[+.>]-[>+<---]>.-.,]

Probieren Sie es online!

Eingänge sind durch ein 0x01Byte getrennt.

Dies wird ["foo", "bar"]zu fUToUToUTUTbUTaUTrUT. Um die ursprünglichen zwei Zeichenfolgen wiederherzustellen, nehmen Sie Gruppen mit 3 Zeichen, suchen Sie die Zeichenfolge, bei der der zweite Buchstabe nicht vorhanden ist U, und teilen Sie sie dort auf.

Türknauf
quelle
@Grimy Sorry, missverstanden "Eingaben werden durch ein 0x01-Byte getrennt."
Wastl
15

JavaScript (ES6), 14 Byte

Übernimmt die Eingabe als Array von 2 Zeichenfolgen. Inspiriert von Luis 'Antwort .

JSON.stringify

Probieren Sie es online!


JavaScript (ES6),  21 bis  20 Byte

Übernimmt die Eingabe als (a)(b).

a=>b=>[a.length,a]+b

Probieren Sie es online!

Liefert die Länge von a , gefolgt von einem Komma, gefolgt von der Verkettung von a und b .

Arnauld
quelle
Gottverdammt! War gerade dabei, den stringifyTrick selbst anzuwenden !
Shaggy
Pausen mit a="hello","" b="world"unda="hello" b="","world"
Soleil
1
@Soleil Das gäbe ["\"hello\",\"\"","\"world\""]und ["\"hello\"","\"\",\"world\""].
Arnauld
1
@Arnauld der Backslash-Schutz ist nicht sichtbar. Die Funktion wird nicht injizieren.
Soleil
1
@Soleil Ich verstehe nicht was du meinst. JSON.stringify()auf jeden Fall entkommt ". Sehe einen Hex-Dump .
Arnauld
15

jq -c, 0 Bytes

Probieren Sie es online!

Das fühlt sich definitiv nach Schummeln an ...? Aber es scheint den Regeln der Herausforderung zu entsprechen.

Standardmäßig jqwird die Eingabe in einem für Menschen lesbaren JSON-Format ausgegeben. Das -c(kompakte) Flag weist jqan, im "kompakten" Stil auszugeben, wodurch die Zeilenumbrüche entfernt werden (da die Abfrage nicht druckbares ASCII verbietet).

Türknauf
quelle
1
OP erlaubt leere Eingaben, also würde a = "", b = "x" nicht die gleiche Ausgabe wie a = "x" b = ""
Gnudiff
3
@ Gnudiff Wie so? Sie würden geben ["","x"]und ["x",""]jeweils
Doorknob
1
Entschuldigung, du hast recht.
Gnudiff
7

Python 3 , 3 Bytes

str

Eine (eingebaute) Funktion, die bei gegebener Liste der beiden Zeichenfolgen eine Zeichenfolgendarstellung der Liste liefert

Probieren Sie es online!

Jonathan Allan
quelle
2
Stärker als Pyth ...
Trichoplax
Nun, die 1-Byte-Pyth-Lösung macht das Gleiche.
Anders Kaseorg
5

Japt -S , 3 Bytes

Ich habe immer noch das Gefühl, dass mir hier etwas fehlt ...

®mc

Versuch es

Möglicherweise 2 Bytes:

mq

Versuch es

Oder dehnen Sie es mit diesem 1-Byte:

U

Versuch es

In der ersten Version wird jeder String im Array seinen Codepunkten zugeordnet und mit einem Leerzeichen verbunden ausgegeben.

In der zweiten Version wird jede Zeichenfolge in ein Zeichenfeld aufgeteilt und mit einem Leerzeichen verbunden ausgegeben.

Und die dritte Version, die sich wie Schummeln anfühlt, gibt nur die Eingabe mit der -QFlagge aus, die das schwere Heben der Eingabe srringifybewirkt.

Zottelig
quelle
5

Pyth , 4 Bytes

jNmC

Probieren Sie es online!

Dadurch wird jede Zeichenfolge in die Basis 256 konvertiert und anschließend der Reihe nach mit a verbunden ". Da es sich bei den Ergebnissen jeweils um Zahlen handelt, "werden diese eindeutig voneinander getrennt und die ursprünglichen Zeichenfolgen können mit wiederhergestellt werden mCsdczN.

FryAmTheEggman
quelle
1
@AndersKaseorg schlägt ein 1-Byte vor .
Kevin Cruijssen
@ KevinCruijssen Ich bin mir dessen bewusst, seit ich dies ein paar Minuten später gepostet habe. Ich bevorzuge einfach den Geist dieser Lösung. Vielen Dank, dass Sie es trotzdem
angesprochen haben
Ihre Antwort gefällt mir in der Tat auch besser. :) Und nein, ich kenne Pyth nicht mal. Wenn Sie möchten, können Sie es selbst als separate Antwort veröffentlichen (oder durch Bearbeiten dieser kombinierten Antwort), andernfalls kann Anders Kaseorg es veröffentlichen, da er derjenige ist, der es im Kommentar erwähnt hat.
Kevin Cruijssen
4

T-SQL, 38 Bytes

SELECT QUOTENAME(a)+QUOTENAME(b)FROM i

Die Eingabe wird aus einer bereits vorhandenen Tabelle übernommen ichmit varcharFeldernein und b, Je unsere IO - Regeln .

Verwendet QUOTENAME, was die Saiten mit umgibt []und auch eventuelle interne Klammern übergeht. Sollte einer eindeutigen Ausgabe zugeordnet werden.

BradC
quelle
1
Gleiche Länge auf MySQL: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t Versuchen Sie es online
Night2
4

Zsh , 7 Bytes

<<<$@:q

Probieren Sie es online!

Verbindet implizit die Argumente in Leerzeichen. Der qModifikator weist zsh an, die Argumente in Anführungszeichen zu setzen, wodurch die Leerzeichen entscheidend ausgeblendet werden. Auf diese Weise wird sichergestellt, dass die beiden Argumente durch ein Leerzeichen eindeutig voneinander getrennt werden.

(Ohne q, "a " "b"und "a" " b"würde beiden Ausbeuten "a b") .

GammaFunktion
quelle
3

MATL , 1 Byte

j

Der Code verwendet ein Array mit zwei Zeichenfolgen als Eingabe und gibt eine Zeichenfolgendarstellung dieses Arrays aus.

Probieren Sie es online!

Erläuterung

Der Code liest einfach die Eingabe als Zeichenfolge, nicht ausgewertet.

Luis Mendo
quelle
1
Nimmt dies wirklich zwei Zeichenfolgen als Eingabe? Es sieht so aus, als würde nur die Eingabe gedruckt, was auch immer es ist. Probieren Sie es online!
DJMcMayhem
1
@DJ Es liest nur nicht bewertete Eingaben, also liest es alles. Ist es eine Lücke? Ein Standardansatz wäre, die ausgewertete Eingabe als Array zu verwenden und dann in eine Zeichenfolgendarstellung zu konvertieren. Aber das Ergebnis wäre das gleiche wie mein Code, also würde ich argumentieren, dass die Unterscheidung nicht zu beobachten ist
Luis Mendo
3

Gelee , 2 Bytes

ŒṘ

Ein monadischer Link, der eine Liste von zwei Listen von Zeichen als Argument akzeptiert, das eine einzelne Liste von Zeichen ergibt.

Probieren Sie es online!

Wie?

Es ist eingebaut, um Pythons String-Darstellung zu erhalten, simples.

Jonathan Allan
quelle
3

Haskell, 4 Bytes

show

Der Haskell ist eingebaut, um Dinge in Fäden zu verwandeln. Die Eingabe wird als ein Paar von Zeichenfolgen verwendet.

Probieren Sie es online!

nimi
quelle
3

05AB1E , 2 Bytes

₁ö

Probieren Sie es online! Interpretiert jede Zeichenfolge als Ganzzahl zur Basis 256 und druckt dann die beiden Zeichenfolgen im Formular aus [1, 2].


05AB1E, 1 Byte (unbekannte Gültigkeit)

â

Probieren Sie es online!

Nimmt das kartesische Produkt der Eingabe mit sich. Anführungszeichen in der Eingabe werden nicht maskiert, was zu Verwirrung führen kann. Ich habe alle Kombinationen von bis zu 12 ", "und brutal gezwungen "], ["und keine Kollision gefunden. Ich kann jedoch nicht beweisen, dass es für längere Saiten keine Kollisionen gibt. Wenn jemand einen Beweis oder ein Gegenbeispiel finden kann, würde ich es sehr schätzen!

Das einfache 0-Byte schlägt fehl, weil Anführungszeichen nicht maskiert werden: Eingaben ( ", ", leere Zeichenfolge) und (leere Zeichenfolge ", ") ergeben beide die Ausgabe ["", "", ""].

Das 1-Byte º(Spiegeln jeder Eingabezeichenfolge) schlägt auch deshalb fehl: Eingaben ( ", "" ,"leere Zeichenfolge) und (leere Zeichenfolge " ,"", ") liefern beide die Ausgabe ["", "" ,"", "" ,"", ""].

Grimmig
quelle
3

C # mit 26 Bytes (danke an Lukas Lang, Kevin Cruijssen und Jo King)

a=>b=>$"{a.Length}.{a}{b}"

tio.run lambda

Soleil
quelle
1
Bitte erwägen Sie die Verwendung von tio.run
Ver Nick sagt Reinstate Monica
Dies bricht immer noch auf ("a <>", "b") und ("a", "<> b") - beachten Sie, dass es unmöglich ist, alle Fälle zu behandeln, wenn Sie nur die Eingaben verketten, egal was Sie tun zwischen / um sie legen - du musst die Saiten irgendwie modifizieren
Lukas Lang
1
Entschuldigung, immer noch nicht: ("1", "11111111111") und ("11111111111", "1") - was auf der anderen Seite funktioniert (und noch kürzer ist), ist dies $"{a.Length}.{a}{b}"- Sie können immer extrahieren aund bdaraus ohne Mehrdeutigkeit (nur bis zum ersten lesen .die Länge zu erhalten a, bist dann der Rest
Lukas lang
1
@LukasLang Großartig. Vielen Dank für die Folgemaßnahmen.
Soleil
1
Vielen Dank @JoKing!
Soleil
2

Kohle , 12 Bytes

⪫E²⭆⪪S"⪫""λ,

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

 E²             Repeat twice
     S          Input a string
    ⪪ "         Split it on `"`s
   ⭆            Map over each piece and join
       ⪫""λ     Wrap each piece in `"`s
⪫          ,    Join the two results with a `,`
                Implicitly print
Neil
quelle
2

Power Shell , 22 Byte

Viele Fehlerbehebungen dank mazzy

"$($args|% le*)"+$args

Probieren Sie es online!

Nimm fünf, oh mein Gott.

Veskah
quelle
"ab" "c"und "a" "bc"beide erzeugen die gleiche Ausgabe.
BradC
@JoKing Dinge sollten behoben werden. Hoffnungsvoll.
Veskah
1
15 Bytes mit $ OFS ?
Andrei Odegov
1

CSS + HTML, 55 + 20 = 75 Byte

Stellen Sie die Eingaben im HTML nach <code>Tags bereit. Fügt Buchstaben einzeln von jeder Eingabe in die Ausgabe ein. Wenn eine Eingabe länger als die andere ist, werden visuelle Leerzeichen für fehlende Buchstaben der kürzeren Eingabe angezeigt. Außerdem wird in HTML ein Komma hinzugefügt, um die Eindeutigkeit der visuellen Ausgabe zu erzwingen (hoffe ich).

*{position:absolute;letter-spacing:9px}code>code{left:9px
<code>abcdefg<code>hijklmn</code>,

Night2
quelle
1

Perl 6 , 6 3 Bytes

&dd

Probieren Sie es online!

Gibt die Objektdarstellung an STDERR aus.

Scherzen
quelle
Ich kenne Perl nicht gut genug - wie würden Sie hier einen String mit Leerzeichen eingeben?
negative sieben
2
@negativeseven wie
Grimmy
@negativeseven Ja, tut mir leid, ich habe gerade eine Abkürzungssyntax für Listen von Zeichenfolgen verwendet. Sie können das auf eine typische Art und Weise tun wie["Hello, ", "World!"]
Jo King
1

Lua , 27 Bytes

print(('%q%q'):format(...))

Probieren Sie es online!

Vollständiges Programm, Eingabe als Argumente.

Inspiriert von zsh answer, wie es auch verwendet wird %q Modifikatoren zur Verwendung der internen Safe-String-Engine verwendet.

Auch mir fällt gerade ein

('%q%q'):format

aber ich bin nicht sicher, ob dies eine akzeptable Antwort ist.

val sagt Reinstate Monica
quelle
Ich glaube nicht, dass die zweite gültig ist, da ('%q%q'):formatsie nicht zu einem Objekt führt, das beispielsweise einer Variablen zugewiesen werden kann. Es verursacht nur einen eigenen Syntaxfehler. Die Doppelpunktsyntax ist nur eine Abkürzung für '%q%q'.format('%q%q', ...)und Lua erlaubt keine teilweise Anwendung für Funktionen
Jo King
@JoKing Ja, du hast recht, denke ich.
Val sagt Reinstate Monica
1

sed , 19 bytes

N
s/ /. /g
s/\n/: /

Probieren Sie es online!

N          # append the second string into the pattern space
s/ /. /g   # prefix all spaces with ".". Now ": " will not occur in the stiring
s/\n/: /   # replace the newline with ": "
GammaFunktion
quelle
1

C (gcc) , 59 Bytes

Vielen Dank an Grimy für den Vorschlag.

Nimmt ein Array von Eingabezeichenfolgen (von denen "2" die richtige Nummer für diese Abfrage ist) und druckt ihre Zeichenwerte, einschließlich des nachfolgenden Zeichens NUL. Technisch gesehen ist der von verwendete %pFormatierer printffür Zeiger gedacht, aber er funktioniert gut für die Anzeige von Hexadezimalwerten beliebiger Ganzzahlen, wenn Sie nicht genau wissen, wie sie aussehen.

f(s,t)char**s,*t;{for(;t=*s++;)for(;printf("%p",*t++)^5;);}

Probieren Sie es online!

ErikF
quelle
Nett! Hier ist ein 59 .
Grimmy
0

Bash , 11 Bytes

echo ${@@Q}

Probieren Sie es online!

${parameter@Q}zitiert den Parameter zur Wiederverwendung als Eingabe. Im Fall eines Arrays wird jedes Element in Anführungszeichen gesetzt.

GammaFunktion
quelle