Digamos que tenemos un conjunto particular de funciones en cadenas. Estas funciones son como completar los espacios en blanco o madlibs, excepto que solo toman una entrada y la usan para completar todos sus espacios en blanco. Por ejemplo, podríamos tener una función similar a
I went to the ____ store and bought ____ today.
Si aplicamos esta función a la cadena, cheese
el resultado sería:
I went to the cheese store and bought cheese today.
Podemos representar estas funciones como una lista no vacía de cadenas, donde los espacios en blanco son simplemente los espacios entre cadenas. Por ejemplo, nuestra función anterior sería:
["I went to the ", " store and bought ", " today."]
Con esta representación solo hay una representación para cada función de este tipo y solo una función para cada representación.
Una cosa realmente interesante es que el conjunto de tales funciones está cerrado bajo composición. Es decir, la composición de dos de nuestras funciones es siempre otra de estas funciones. Por ejemplo, si compongo nuestra función anterior con
["blue ", ""]
(la función que antecede blue
a la entrada) Obtenemos la función:
["I went to the blue ", " store and bought blue ", " today."]
Sin embargo, estos pueden volverse un poco más complejos. Por ejemplo, si componimos la primera función con
["big ", " and ", ""]
El resultado es
["I went to the big ", " and ", " store and bought big ", "and", " today."]
Tarea
Su tarea es tomar dos funciones como se describen como listas de cadenas no vacías y generar su composición como una lista de cadenas no vacía.
Para el propósito de este desafío, una lista puede ser cualquier contenedor ordenado que permita duplicados y una cadena puede ser un tipo de cadena nativa, una lista de caracteres o una lista de enteros.
Este es el código de respuestas de golf se puntuará en bytes, con menos bytes mejor.
Casos de prueba
["","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"]
Respuestas:
Jalea , 6 bytes
Un enlace diádico que acepta la representación de la primera función a la derecha y la representación de la segunda función a la izquierda que produce la representación de la función resultante. Cada representación de función es una lista de listas de caracteres (Jelly no tiene otras cadenas).
Pruébalo en línea! (los argumentos del programa completo se dan en notación de Python; las cadenas se convierten en listas. El pie de página muestra una representación de Python de la salida del enlace).
Aquí hay un conjunto de pruebas que reformatea la salida del enlace como las entradas.
¿Cómo?
Aprovecha las listas de tipos mixtos de Jelly para permitir todo el dominio de representaciones (cualquier lista de listas de caracteres) utilizando el entero cero como marcador de posición:
Si necesitáramos lidiar con cualquiera de las listas mixtas de Jelly (incluidas las de cualquier profundidad o forma) podríamos usar este byte de ocho:
j,©⁹jœṣ®
que usa los argumentos emparejados como el marcador de posición.fuente
Haskell , 78 bytes
Pruébalo en línea!
fuente
Python 3.8 (prelanzamiento) ,
6058 bytesUna función sin nombre que acepta dos listas de cadenas
a
yb
que devuelve una lista de cadenas.Pruébalo en línea! O vea el conjunto de pruebas .
¿Cómo?
Primero forma una cadena de separación
v
, que no se puede encontrar dentroa
ob
. Luego forma una cadena uniendo las cadenasb
con copias dev
. Luego forma una cadena uniendo las cadenasa
con copias de eso. Finalmente divide esa cadena en instancias dev
para dar una lista de cadenas.Garantizando al mismo tiempo
v
no está ena
ob
también hay que asegurarse de quev
no hará que nos separamos temprano en el caso en que todas las cuerdas ena
yb
son iguales. Para hacerlo, formamosv
uniendo todas las cadenas en ambas listas con instancias de una cadena (aquí'&'
) y agregamos un carácter adicional diferente (aquí'$'
). Tenga en cuenta que hacer cualquiera de ellas de forma aislada no es suficiente ya que todas las cadenas en las entradas podrían ser iguales al carácter elegido.fuente
&
se requiere? y usar''.join(a+b)+'$'
no es suficiente?['$','$'] ['$','$']
sería uno.'$'
carácter elegido y el resultado será más de una cadena, necesitamos un carácter diferente para evitar la división temprana.05AB1E ,
41519911 bytesA diferencia de la respuesta de Jelly, la cadena
"0"
, el entero0
y el flotador de 05AB1E0.0
son todos (algo) iguales, por lo que no puedo dividir / unir por un entero. Esta es la razón por la que teníamos los +15 bytes como soluciones alternativas, aunque ahora lo he devuelto a 9 bytes. Gracias a @JonathanAllan por encontrar 2 errores.Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Wolfram Language (Mathematica) ,
6261 bytesPruébalo en línea!
-1 gracias a Roman
Aunque no es una salida válida, devuelve una función que realmente hace el trabajo ... (34 bytes)
Pruébalo en línea!
fuente
Riffle
.Japt , 8 bytes
Adapta el enfoque de Jonathan .
Intentalo
fuente
N
en este caso? Si lo entiendo correctamente (usando la funcionalidad de búsqueda del enlace TryIt), se repiteN
dos veces (N²
). Luego usa eso para unir la segunda entradaV
(VqN²
), y luego usa toda la cadena para unir la primera entradaU
( implícita) (q...)
). Y finalmente divide la cadena resultante enN
(qN
). ¿Pero qué hayN
en este caso?p(...)
método incorrecto en la búsqueda. Añade las2
dos entradas emparejadas juntas, ¿no? SoloN²
da como resultado[["w","x","y","z"],["ab","cd","e"],2]
, y utiliza toda esa lista para unirse. ¿Por qué la finalqN
no deja la2
lista de resultados en ese caso? ¿ON²
modifica el originalN
?push
incorporación de elementos a una matriz en JS modifica la matriz original.Haskell , 62 bytes
Pruébalo en línea!
Aquí está mi respuesta de Haskell. Funciona en cualquier tipo de lista.
fuente
J ,
44434229 bytesPruébalo en línea!
-13 bytes gracias a millas!
Este enfoque utiliza números enteros y se debe a millas.
enfoque original con cuerdas
Pruébalo en línea!
Nota: He ajustado -3 fuera del TIO para tener en cuenta
f=.
Utiliza el método de Jonathan Allen, adaptado para J.
Esto fue sorprendentemente difícil de jugar al golf, ya que J no tiene un método incorporado de "unión", y me gustaría ver si se puede mejorar significativamente.
g
es un verbo auxiliar que nos da "unirse"fuente
_<;._1@,(;@}:@,@,.(,_&,)&.>/)
usa infinito_
como valor centinela para saber dónde dividir<;._1
. La unión se realiza primero utilizando reducir/
para formar un cuadro grande, luego solo se configura el arreglo.g&.:(a.&i.&.>)
contar para los bytes o me falta algo?JavaScript (Node.js) ,
8579 bytesPruébalo en línea!
fuente
JavaScript, 37 bytes
También adapta el enfoque de Jonathan .
Pruébalo en línea
fuente
Perl 5 (
-lp
), 20 bytesComo comentó @JonathanAllan, este es un programa completo que utiliza, para IO, una pestaña como separador de listas y una nueva línea para separar las dos listas.
TIO
la pestaña y la nueva línea se eligieron porque es más conveniente verificar los casos de prueba; de lo contrario, podrían cambiarse a caracteres no imprimibles
\1
y\2
.(
-02l012p
)TIO
Cómo funciona,
-02
: para establecer el separador de registro de entrada en\2
-l
: para eliminar el separador de entrada del argumento predeterminado$_
y agregar el separador de registro de salida a la salida predeterminada-012
: para establecer el separador de registro de salida en\012
(\n
) para que la salida sea más fácil de verificar-p
: para imprimir el argumento predeterminado$n=<>;
: para leer el siguiente registro y asignar a$n
chop$n;
: para eliminar el separador de$n
s/\x1/$n/g
: para reemplazar todas las ocurrencias de\1
con$n
fuente
JavaScript (ES6),
6259 bytesGuardado 3 bytes gracias a @Shaggy
Esta es una versión fija de la respuesta de Luis (ahora eliminada) para admitir todos los caracteres.
Pruébalo en línea!
fuente