Inyección de dos cadenas a una cadena

13

Desafío

Escriba un programa que aplique una función inyectiva que tome un par ordenado de cadenas como entrada y una cadena como salida. En otras palabras, cada entrada debe correlacionarse con una salida única.

Detalles específicos

  • La entrada puede ser cualquiera de las dos cadenas de longitud arbitraria, pero consistirá solo en caracteres ASCII imprimibles (códigos [32,126] ).
  • Del mismo modo, la cadena de salida no tiene restricción de longitud, pero debe consistir solo en caracteres ASCII imprimibles.
  • Si su idioma no puede manejar cadenas de longitud arbitraria, el programa simplemente puede funcionar teóricamente para cadenas de cualquier tamaño.
  • La asignación de entradas a salidas debe ser coherente entre las ejecuciones del programa. De lo contrario, el mapeo que use depende completamente de usted, siempre que sea una inyección.
  • La entrada está ordenada. Si las dos cadenas de entrada son diferentes, deberían producir una salida diferente que si se intercambiaran. stf(s,t)f(t,s)
  • No todas las cadenas deben ser una salida posible.
  • ¡La respuesta más corta en cada idioma gana!

Casos de prueba

Las siguientes entradas deberían dar como resultado diferentes salidas. Para evitar confusiones, las cuerdas están rodeadas por guillemets («») y separadas por espacios individuales.

"Hola Mundo"
«Lelho» «drowl»
«Diffe» «_rent»
"no es el mísmo"

«Código» «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"

«\» «" »
«\\» «\" »
siete negativo
fuente
8
Hmm, acabo de notar "Escribe un programa que ..." - ten en cuenta que por meta consenso (actualmente 46 arriba, 1 abajo) "Restringir solo a los programas requiere especificar explícitamente" programa completo "en lugar de solo" programa "" . Espero que no haya intentado restringir esto, pero si lo hizo, deberá actualizar la publicación en consecuencia y dirigirse a aquellos de nosotros que ya hemos enviado funciones como respuestas.
Jonathan Allan
44
@JonathanAllan La intención era permitir funciones.
negativo siete
3
¿Puede alguna de las cadenas estar vacía?
Shaggy
2
@ Shaggy Sí, uno o ambos pueden.
negativo siete
1
¿Podemos tener algunos casos de prueba? ¡Gracias!
ouflak

Respuestas:

17

brainfuck, 30 29 27 23 bytes

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

Pruébalo en línea!

Las entradas están separadas por un 0x01byte.

Esto se convierte ["foo", "bar"]en fUToUToUTUTbUTaUTrUT. Para recuperar las dos cadenas originales, tome grupos de 3 caracteres, encuentre el que no está en la segunda letra Uy divídalo allí.

Pomo de la puerta
fuente
@Grimy Lo siento, mal entendido "Las entradas están separadas por un byte 0x01".
wastl
15

JavaScript (ES6), 14 bytes

Toma la entrada como una matriz de 2 cadenas. Inspirado por la respuesta de Luis .

JSON.stringify

Pruébalo en línea!


JavaScript (ES6),  21  20 bytes

Toma entrada como (a)(b).

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

Pruébalo en línea!

Devuelve la longitud de a , seguida de una coma, seguida de la concatenación de a y b .

Arnauld
fuente
¡Maldita sea! ¡Estaba a punto de usar el stringifytruco yo mismo!
Shaggy
Rompe con a="hello","" b="world"ya="hello" b="","world"
Soleil
1
@Soleil Eso daría ["\"hello\",\"\"","\"world\""]y ["\"hello\"","\"\",\"world\""].
Arnauld
1
@Arnauld la protección de barra invertida no será visible. La función no se inyectará.
Soleil
1
@Soleil No entiendo lo que quieres decir. JSON.stringify()Definitivamente se escapa ". Ver un basurero hexadecimal .
Arnauld
15

jq -c, 0 bytes

Pruébalo en línea!

Esto definitivamente se siente como hacer trampa ...? Pero parece cumplir con las reglas del desafío.

De forma predeterminada, jqgenerará su entrada en un formato JSON legible para humanos. El -cindicador (compacto) le indica jqa la salida en estilo "compacto", que elimina las nuevas líneas (ya que el desafío prohíbe ASCII no imprimible).

Pomo de la puerta
fuente
1
OP permite la entrada vacía, por lo que a = "", b = "x" no daría la misma salida que a = "x" b = ""
Gnudiff
3
@Gnudiff ¿Cómo es eso? Darían ["","x"]y ["x",""]respectivamente
Pomo
1
Perdón, tienes razón.
Gnudiff
7

Python 3 , 3 bytes

str

Una función (incorporada) que, dada una lista de las dos cadenas, proporciona una representación de cadena de la lista

Pruébalo en línea!

Jonathan Allan
fuente
2
Más concisa que Pyth ...
trichoplax
Bueno, la solución Pyth de 1 byte `hace lo mismo.
Anders Kaseorg
5

Japt -S , 3 bytes

Yo todavía siento que debo estar perdiendo algo aquí ...

®mc

Intentalo

Posiblemente 2 bytes:

mq

Intentalo

O estirándolo con este 1 byter:

U

Intentalo

La primera versión asigna cada cadena de la matriz a sus puntos de código y las muestra unidas con un espacio.

La segunda versión divide cada cadena en una matriz de caracteres y las muestra unidas con un espacio.

Y la tercera versión, que se siente como hacer trampa, solo genera la entrada con la -Qbandera haciendo el trabajo pesado srringify.

Lanudo
fuente
5

Pyth , 4 bytes

jNmC

Pruébalo en línea!

Esto convierte cada cadena en base 256 y luego las une en orden con a ". Como los resultados son números, los "separa inequívocamente y las cadenas originales se pueden recuperar con mCsdczN.

FryAmTheEggman
fuente
1
@AndersKaseorg sugiere un 1 byter .
Kevin Cruijssen
@KevinCruijssen He sido consciente de eso desde unos minutos después de publicar esto, solo prefiero el espíritu de esta solución. Gracias por mencionarlo de todos modos, y definitivamente puedes publicarlo tú mismo :)
FryAmTheEggman
De hecho, también me gusta tu respuesta. :) Y no, ni siquiera sé Pyth. Si lo desea, puede publicarlo usted mismo como una respuesta separada (o una respuesta combinada editando esta), de lo contrario, Anders Kaseorg puede publicarlo, ya que es él quien lo mencionó en el comentario.
Kevin Cruijssen
4

T-SQL, 38 bytes

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

La entrada se toma de una tabla preexistente yocon varcharcamposun y si, según nuestras reglas de IO .

Usos QUOTENAME, que rodea las cuerdas []y también escapa a los corchetes internos. Debe asignarse a una salida única.

BradC
fuente
1
Misma duración en MySQL: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t Pruébelo en línea
Noche2
4

Zsh , 7 bytes

<<<$@:q

Pruébalo en línea!

Se une implícitamente a los argumentos sobre espacios. El qmodificador le dice a zsh que cite los argumentos, lo que escapa de manera crucial a los espacios, asegurando que un espacio sin escape separe inequívocamente los dos argumentos.

(Sin q, "a " "b"y "a" " b"ambos cederían "a b").

Función Gamma
fuente
3

MATL , 1 byte

j

El código toma una matriz de dos cadenas como entrada y genera una representación de cadena de esa matriz.

Pruébalo en línea!

Explicación

El código simplemente lee la entrada como una cadena, sin evaluar.

Luis Mendo
fuente
1
¿Esto realmente toma dos cadenas como entrada? Parece que esto solo imprime la entrada, sea lo que sea. Pruébalo en línea!
James
1
@DJ Simplemente lee entradas no evaluadas, por lo que lee cualquier cosa. ¿Es una escapatoria? Un enfoque más estándar sería tomar la entrada evaluada como una matriz y luego convertirla en una representación de cadena. Pero el resultado sería el mismo que mi código, por lo que argumentaría que la distinción es inobservable
Luis Mendo
3

Jalea , 2 bytes

ŒṘ

Un enlace monádico que acepta una lista de dos listas de caracteres como argumento, lo que produce una sola lista de caracteres.

Pruébalo en línea!

¿Cómo?

Es una función integrada para obtener la representación de cadena de Python, simple.

Jonathan Allan
fuente
3

Haskell, 4 bytes

show

El Haskell incorporado para convertir las cosas en cuerdas. La entrada se toma como un par de cadenas.

Pruébalo en línea!

nimi
fuente
3

05AB1E , 2 bytes

₁ö

Pruébalo en línea! Interpreta cada cadena como un entero de base 256, luego imprime las dos en el formulario [1, 2].


05AB1E, 1 byte (validez desconocida)

â

Pruébalo en línea!

Toma el producto cartesiano de la entrada consigo mismo. Las citas en la entrada no se escapan, lo que podría causar confusión. Forcé brutalmente todas las combinaciones de hasta 12 ", "y"], [" no encontré ninguna colisión; Sin embargo, no puedo demostrar que no haya colisiones para cadenas más largas. Si alguien puede presentar una prueba o un contraejemplo, ¡lo agradecería mucho!

El trivial 0-byter falla debido a que no se escapan las comillas: las entradas ( ", ", cadena vacía) y (cadena vacía, ", ") producen la salida ["", "", ""].

El 1 byter º(espejo de cada cadena de entrada) también falla debido a esto: las entradas ( ", "" ,", cadena vacía) y (cadena vacía, " ,"", ") producen la salida ["", "" ,"", "" ,"", ""].

Mugriento
fuente
3

C # con 26 bytes (gracias a Lukas Lang, Kevin Cruijssen y Jo King)

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

tio.run lambda

Soleil
fuente
1
Por favor considere usar tio.run
Ver Nick dice Reinstate Monica
Esto todavía se rompe ("a <>", "b") y ("a", "<> b"): tenga en cuenta que es imposible manejar todos los casos si solo está concatenando las entradas, sin importar lo que poner entre / alrededor de ellos - necesita modificar las cadenas de alguna manera
Lukas Lang
1
Lo sentimos, todavía no: ("1", "11111111111") y ("11111111111", "1") - lo que funciona por otro lado (y es aún más corto) es esto $"{a.Length}.{a}{b}"- siempre se puede extraer ay bde esto sin ningún ambigüedad (solo lea hasta el primero .para obtener la longitud de a, bentonces es el resto
Lukas Lang
1
@LukasLang Genial. Gracias por los seguimientos.
Soleil
1
Muchas gracias @JoKing!
Soleil
2

Carbón de leña , 12 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

 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
fuente
2

PowerShell , 22 bytes

Muchas correcciones gracias a mazzy

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

Pruébalo en línea!

Toma cinco, oh mi.

Veskah
fuente
"ab" "c"y "a" "bc"ambos producen la misma salida.
BradC
@JoKing Las cosas deberían repararse. Ojalá.
Veskah el
1
15 bytes con $ OFS ?
Andrei Odegov el
1

CSS + HTML, 55 + 20 = 75 bytes

Proporcione las entradas en el HTML después de las <code>etiquetas. Inyecta visualmente letras una por una de cada entrada en la salida. Cuando una entrada es más larga que la otra, se muestran espacios visuales para las letras faltantes de la entrada más corta. También se agrega una coma en HTML para forzar la unicidad de la salida visual (espero).

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

Noche2
fuente
1

Perl 6 , 6 3 bytes

&dd

Pruébalo en línea!

Emite la representación del objeto a STDERR.

Jo King
fuente
No estoy lo suficientemente familiarizado con Perl: ¿cómo ingresaría una cadena que contiene espacios aquí?
negativo siete
2
@negativeseven así
Grimmy
@negativeseven Sí, lo siento, solo estaba usando una sintaxis de acceso directo para las listas de cadenas. Puedes hacer eso de una manera típica como["Hello, ", "World!"]
Jo King el
1

Lua , 27 bytes

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

Pruébalo en línea!

Programa completo, tome la entrada como argumentos.

Inspirado por la respuesta zsh, ya que también usa un %qmodificador para usar el motor interno de cadena segura.

Además, puedo pensar en

('%q%q'):format

pero no estoy seguro si esta es una respuesta aceptable.

val dice reinstalar a Monica
fuente
No creo que el segundo sea válido ya que ('%q%q'):formatno da como resultado un objeto que, por ejemplo, pueda asignarse a una variable. Solo causa un error de sintaxis por sí solo. La sintaxis de dos puntos es solo un atajo '%q%q'.format('%q%q', ...)y Lua no permite la aplicación parcial de funciones
Jo King,
@ JoKing Sí, tienes razón, creo.
Val dice Reinstate Monica
1

sed , 19 bytes

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

Pruébalo en línea!

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 ": "
Función Gamma
fuente
1

C (gcc) , 59 bytes

Gracias a Grimy por la sugerencia.

Toma una matriz de cadenas de entrada (de las cuales "2" es el número correcto para este desafío) e imprime sus valores de caracteres, incluido el final NUL. Técnicamente, el %pformateador utilizado printfes para punteros, ¡pero funciona bien para mostrar valores hexadecimales de enteros arbitrarios si no eres exigente sobre cómo se ven!

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

Pruébalo en línea!

ErikF
fuente
¡Agradable! Aquí hay un 59 .
Grimmy
0

Bash , 11 bytes

echo ${@@Q}

Pruébalo en línea!

${parameter@Q}cita el parámetro para su reutilización como entrada. En el caso de una matriz, cita cada elemento.

Función Gamma
fuente