Injection de deux chaînes à une chaîne

13

Défi

Écrivez un programme qui applique une fonction injective qui prend une paire ordonnée de chaînes en entrée et une chaîne en sortie. En d'autres termes, chaque entrée doit correspondre à une sortie unique.

Détails

  • L'entrée peut être tout deux chaînes de longueur arbitraire, mais se compose uniquement de caractères ASCII imprimables (codes [32,126] ).
  • De même, la chaîne de sortie n'a pas de restriction de longueur, mais elle doit être constituée uniquement de caractères ASCII imprimables.
  • Si votre langue ne peut pas gérer des chaînes de longueur arbitraire, le programme peut simplement fonctionner théoriquement pour des chaînes de n'importe quelle taille.
  • Le mappage des entrées aux sorties doit être cohérent entre les exécutions du programme. Sinon, le mappage que vous utilisez dépend entièrement de vous, tant qu'il s'agit d'une injection.
  • L'entrée est ordonnée. Si les deux chaînes d'entrée sont différentes, elles doivent produire une sortie différente que si elles étaient échangées. stf(s,t)f(t,s)
  • Toutes les chaînes n'ont pas besoin d'être une sortie possible.
  • La réponse la plus courte dans chaque langue gagne!

Cas de test

Les entrées suivantes devraient toutes entraîner des sorties différentes. Pour éviter toute confusion, les chaînes sont entourées de guillemets («») et séparées par des espaces simples.

"Bonjour le monde"
«Lelho» «drowl»
"différent"
"pas le même"

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

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

"a B c d e F"
"a B c d e F"
"a B c d e F"
"a B c d e F"

«\» «" »
«\\» «\" »
sept négatif
la source
8
Hmm, je viens de remarquer "Écrivez un programme qui ..." - notez que par méta consensus (actuellement 46 en haut, 1 en bas) "Restreindre aux programmes uniquement nécessite de spécifier explicitement" programme complet "plutôt que simplement" programme "" . J'espère que vous ne vouliez pas essayer de restreindre cela, mais si vous le faisiez, vous devrez mettre à jour le message en conséquence et adresser ceux d'entre nous qui ont déjà soumis des fonctions comme réponses.
Jonathan Allan
4
@JonathanAllan L'intention était d'autoriser les fonctions.
négatif sept
3
L'une des chaînes peut-elle être vide?
Shaggy
2
@Shaggy Oui, l'un ou les deux le peuvent.
négatif sept
1
Pouvons-nous avoir des cas de test? Merci!
ouflak

Réponses:

17

brainfuck, 30 29 27 23 octets

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

Essayez-le en ligne!

Les entrées sont séparées par un 0x01octet.

Cela ["foo", "bar"]s'en fUToUToUTUTbUTaUTrUT. Pour récupérer les deux chaînes originales, prenez des groupes de 3 caractères, trouvez celui où ne se trouve pas la deuxième lettre Uet divisez-le.

Poignée de porte
la source
@Grimy Désolé, incompris "Les entrées sont séparées par un octet 0x01."
wastl
15

JavaScript (ES6), 14 octets

Prend l'entrée comme un tableau de 2 chaînes. Inspiré par la réponse de Luis .

JSON.stringify

Essayez-le en ligne!


JavaScript (ES6),  21  20 octets

Prend l'entrée comme (a)(b).

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

Essayez-le en ligne!

Renvoie la longueur de a , suivie d'une virgule, suivie de la concaténation de a et b .

Arnauld
la source
Bon Dieu! J'étais sur le point d'utiliser stringifymoi-même l' astuce!
Shaggy
Rupture avec a="hello","" b="world"eta="hello" b="","world"
Soleil
1
@Soleil Cela donnerait ["\"hello\",\"\"","\"world\""]et ["\"hello\"","\"\",\"world\""].
Arnauld
1
@Arnauld, la protection contre les barres obliques inverses ne sera pas visible. La fonction n'injectera pas.
Soleil
1
@Soleil Je ne comprends pas ce que tu veux dire. JSON.stringify()s'échappe définitivement ". Voir un vidage hexadécimal .
Arnauld
15

jq -c, 0 octet

Essayez-le en ligne!

Cela ressemble vraiment à de la triche ...? Mais il semble respecter les règles du challenge.

Par défaut, jqaffichera son entrée dans un format JSON lisible par l'homme. L' -cindicateur (compact) indique jqde sortir dans un style "compact", ce qui supprime les nouvelles lignes (car le défi interdit les ASCII non imprimables).

Poignée de porte
la source
1
OP permet une entrée vide, donc a = "", b = "x" ne donnerait pas la même sortie que a = "x" b = ""
Gnudiff
3
@Gnudiff Comment ça? Ils donneraient ["","x"]et ["x",""]respectivement
Poignée de porte
1
Désolé, vous avez raison.
Gnudiff
7

Python 3 , 3 octets

str

Une fonction (intégrée) qui, étant donné une liste des deux chaînes, donne une représentation sous forme de chaîne de la liste

Essayez-le en ligne!

Jonathan Allan
la source
2
Plus moelleux que Pyth ...
trichoplax
Eh bien, la solution Pyth à 1 octet `fait la même chose.
Anders Kaseorg
5

Japt -S , 3 octets

Je sens toujours que je dois manquer quelque chose ici ...

®mc

Essayez-le

Peut-être 2 octets:

mq

Essayez-le

Ou l'étirer avec cet octet:

U

Essayez-le

La première version mappe chaque chaîne du tableau à ses points de code et les renvoie joints à un espace.

La deuxième version divise chaque chaîne en un tableau de caractères et les renvoie jointes à un espace.

Et la troisième version, qui ressemble à de la triche, sort juste l'entrée avec le -Qdrapeau faisant le gros du travail srringify.

Hirsute
la source
5

Pyth , 4 octets

jNmC

Essayez-le en ligne!

Cela convertit chaque chaîne en base 256, puis les joint dans l'ordre avec a ". Étant donné que les résultats sont chacun des nombres, les "sépare sans ambiguïté et les chaînes d'origine peuvent être récupérées avec mCsdczN.

FryAmTheEggman
la source
1
@AndersKaseorg suggère un octet .
Kevin Cruijssen du
@KevinCruijssen Je le sais depuis quelques minutes après avoir posté ceci, je préfère simplement l'esprit de cette solution. Merci de l'avoir soulevé de toute façon, et n'hésitez pas à le poster vous-même :)
FryAmTheEggman
En effet, j'aime aussi mieux votre réponse. :) Et non, je ne connais même pas Pyth. Si vous le souhaitez, vous pouvez le poster vous-même en tant que réponse séparée (ou en tant que réponse combinée en modifiant celle-ci), sinon Anders Kaseorg peut le poster, car c'est lui qui l'a mentionné dans le commentaire.
Kevin Cruijssen du
4

T-SQL, 38 octets

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

L'entrée provient d'une table préexistante jeavec varcharchampsune et b, selon nos règles IO .

Utilise QUOTENAME, qui entoure les cordes []et échappe également aux supports internes. Devrait correspondre à une sortie unique.

BradC
la source
1
Même durée sur MySQL: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t Essayez-le en ligne
Night2
4

Zsh , 7 octets

<<<$@:q

Essayez-le en ligne!

Joint implicitement les arguments sur les espaces. leq modificateur indique à zsh de citer les arguments, ce qui échappe de manière cruciale aux espaces, garantissant qu'un espace non échappé sépare sans ambiguïté les deux arguments.

(Sans q, "a " "b"et "a" " b"céderait tous les deux "a b".)

GammaFunction
la source
3

MATL , 1 octet

j

Le code prend en entrée un tableau de deux chaînes et génère une représentation sous forme de chaîne de ce tableau.

Essayez-le en ligne!

Explication

Le code lit simplement l'entrée comme une chaîne, non évaluée.

Luis Mendo
la source
1
Cela prend-il vraiment deux chaînes en entrée? Il semble que cela imprime simplement l'entrée quelle qu'elle soit. Essayez-le en ligne!
James
1
@DJ It just reads unevaluated input, so it reads anything. Is it a loophole? A more standard approach would be to take the evaluated input as an array and then convert to string representation. But the result would be the same as my code, so I would argue that the distinction is unobservable
Luis Mendo
3

Jelly, 2 bytes

ŒṘ

A monadic Link accepting a list of two lists of characters as its argument which yields a single list of characters.

Try it online!

How?

It's a built-in to get Python's string representation, simples.

Jonathan Allan
la source
3

Haskell, 4 bytes

show

The Haskell built-in to turn things into strings. The input is taken as a pair of strings.

Try it online!

nimi
la source
3

05AB1E, 2 bytes

₁ö

Try it online! Interprets each string as a base-256 integer, then prints the two in the form [1, 2].


05AB1E, 1 byte (unknown validity)

â

Try it online!

Takes the cartesian product of the input with itself. Quotes in the input are not escaped, which could cause confusion. I brute-forced all combinations of up to 12 ", " and "], [" and didn’t find any collision; however, I can’t prove there aren’t any collisions for longer strings. If anybody can come up with a proof or counter-example, I’d highly appreciate it!

The trivial 0-byter fails because of quotes not being escaped: inputs (", ", empty string) and (empty string, ", ") both yield the output ["", "", ""].

The 1-byter º (mirror each input string) also fails because of this: inputs (", "" ,", empty string) and (empty string, " ,"", ") both yield the output ["", "" ,"", "" ,"", ""].

Grimmy
la source
3

C# with 26 bytes (thanks to Lukas Lang, Kevin Cruijssen and Jo King)

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

tio.run lambda

Soleil
la source
1
Please consider using tio.run
Ver Nick says Reinstate Monica
This still breaks on ("a<>","b") and ("a","<>b") - note that it is impossible to handle all cases if you're just concatenating the inputs, no matter what you put between/around them - you need to modify the strings somehow
Lukas Lang
1
Sorry, still not: ("1","11111111111") and ("11111111111","1") - what does work on the other hand (and is even shorter) is this $"{a.Length}.{a}{b}" - you can always extract a and b from this without any ambiguity (just read until the first . to get the length of a, b is then the rest
Lukas Lang
1
@LukasLang Great. Thanks for the follow ups.
Soleil
1
Many thanks @JoKing !
Soleil
2

Charcoal, 12 bytes

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

Try it online! Link is to verbose version of code. Explanation:

 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
la source
2

PowerShell, 22 bytes

Many fixes thanks to mazzy

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

Try it online!

Take five, oh my.

Veskah
la source
"ab" "c" and "a" "bc" both produce the same output.
BradC
@JoKing Things should be fixed. Hopefully.
Veskah
1
15 bytes with $OFS?
Andrei Odegov
1

CSS + HTML, 55 + 20 = 75 bytes

Provide the inputs in the HTML after <code> tags. Visually injects letters one by one from each input into the output. When an input is longer than the other one, visual spaces are shown for missing letter(s) of the shorter input. Also one comma is added in HTML to force visual output uniqueness (I hope).

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

Night2
la source
1

Perl 6, 6 3 bytes

&dd

Try it online!

Outputs the object representation to STDERR.

Jo King
la source
I'm not familiar enough with Perl - how would you input a string containing spaces here?
negative seven
2
@negativeseven like this
Grimmy
@negativeseven Yeah sorry, I was just using a shortcut syntax for lists of strings. You can do that in a typical fashion like ["Hello, ", "World!"]
Jo King
1

Lua, 27 bytes

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

Try it online!

Full program, take input as arguments.

Inspired by zsh answer, as it also use %q modifier to use internal safe-string engine.

Also, I can think of just

('%q%q'):format

but I'm not sure if this is acceptable answer.

val says Reinstate Monica
la source
I don't think the second is valid since ('%q%q'):format doesn't result in an object that can, for example, be assigned to a variable. It just causes a syntax error on its own. The colon syntax is just a shortcut for '%q%q'.format('%q%q', ...) and Lua doesn't allow partial application for functions
Jo King
@JoKing Yeah, you are right, I think.
val says Reinstate Monica
1

sed, 19 bytes

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

Try it 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 ": "
GammaFunction
la source
1

C (gcc), 59 bytes

Thanks to Grimy for the suggestion.

Takes an array of input strings (of which "2" is the correct number for this challenge) and prints their character values, including the trailing NUL. Technically, the %p formatter used by printf is for pointers, but it works fine for displaying hex values of arbitrary integers if you're not picky about how they look!

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

Try it online!

ErikF
la source
Nice! Here’s a 59.
Grimmy
0

PHP, 9 bytes

serialize

Try it online!

Input is an array of 2 strings like this: ['abc', 'def']. Uses PHP's serialize to serialize the input into a string.

Night2
la source
0

Bash, 11 bytes

echo ${@@Q}

Try it online!

${parameter@Q} quotes the parameter for reuse as input. In the case of an array, it quotes each element.

GammaFunction
la source