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"

«\» «" »
«\\» «\" »

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í.


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


¡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).


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


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.


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.


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.


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").


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.


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.


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!


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 ["", "" ,"", "" ,"", ""].


3

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

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

tio.run lambda


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




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>,



1

Perl 6 , 6 3 bytes

&dd

Pruébalo en línea!

Emite la representación del objeto a STDERR.


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.


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 ": "


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!


¡Agradable! Aquí hay un 59 .
Grimmy




Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.