El arte de formar palabras
Dada una matriz binaria y una cadena de letras, reemplace todos los 1 en la matriz de izquierda a derecha con las letras de la cadena. Una vez que las letras se han formado en la forma de la matriz, imprima la matriz, reemplazando los 0 con espacios. Probablemente sea más fácil solo dar un ejemplo o dos.
Caso: Caso base ...
Entrada uno:
[0,0,1,0,0]
[0,1,0,1,0]
[1,0,0,0,1]
[0,1,0,1,0]
[0,0,1,0,0]
"PPCGPPCG"
Salida uno:
P
P C
G P
P C
G
Caso: si la cadena de entrada es más larga que la cantidad de unidades ...
Entrada dos:
[1,0,0]
[0,1,0]
[1,0,1]
lambda
Salida dos:
l
a
m b
Caso: si la cadena de entrada es más corta que la cantidad de unidades ...
Entrada tres:
[1,1,1]
[1,0,1]
[1,1,1]
PPCG
Salida tres:
PPC
G P
PCG
Suposiciones disponibles
- Puede suponer que la cadena de entrada nunca está vacía.
- Puede suponer que la matriz nunca estará vacía.
- No puede suponer que la matriz binaria nunca será todos ceros.
Reglas
- Si la cadena es más corta que la cantidad de unidades, repita la cadena; Todos deben ser reemplazados.
- Si la cadena es más larga que la cantidad de unidades, solo use lo que se necesita.
- Puede usar Verdadero / Falso en lugar de enteros / bits para la entrada.
- SE REQUIEREN espacios finales, todos los ceros deben ser reemplazados por espacios.
- Una nueva línea final es aceptable.
- Este es el código de golf, gana el conteo de bytes más bajo.
Respuestas:
MATL , 11 bytes
Las entradas son una matriz numérica (con un
;
separador de filas) y una cadena.Pruébalo en línea! O verificar los casos de prueba: 1 , 2 , 3 .
fuente
Vim,
4442 bytes¡ Ahorré 2 bytes gracias a @DjMcMoylex !
Aquí, el
^M
es una nueva línea literal, y el^V
esCTRL-VToma la entrada en este formato:
Descargo de responsabilidad: si la cadena es más larga que ~ 40 caracteres, su computadora podría quedarse sin RAM.
Explicación:
Aquí hay un gif de mí "ejecutando" el "programa":
fuente
{
en lugar degg
quitarte un par.Retina ,
4133 bytesPruébalo en línea!
La cadena de entrada se da en la primera fila de la entrada, seguida de la matriz. Dado que Retina no tiene el concepto de listas (o realmente cualquier cosa excepto cadenas), no hay separadores en la matriz binaria, excepto los avances de línea para separar las filas.
Explicación
Convierte ceros en espacios.
Reemplace repetidamente el primero
1
con el primer carácter de la cadena de entrada mientras gira ese carácter al final de la cadena de entrada. Esto se encarga de casos en los que hay más1
s que caracteres en la cadena de entrada.Deseche la primera línea, es decir, la cadena de entrada.
fuente
(.)(.*)
- Teehee ...JavaScript ES6,
67535049 bytesGuardado 3 bytes gracias a @ETHproductions Guardado 1 más gracias a @Neil
Código anterior antes de saber que las matrices de cadenas son un formato de entrada válido:
Mostrar fragmento de código
fuente
c=>' '[c]||b[i++%b.length]
, pero lamentablemente es un byte más largo ...(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
i
esundefined
, así que++i
regresaNaN
. Dado queb
no tieneNaN
propiedad,b[++i]
rendimientosundefined
, y el||
operador explote su argumento del lado derecho, el establecimientoi
de0
y devolver el primer carácter enb
.\d
? Seguramente es.
suficiente, ya que solo tiene que lidiar con0
sy1
s (.
no coincide con las nuevas líneas).Perl, 40 bytes
36 bytes de código +
-i -p
banderas.(tenga en cuenta el espacio final y la falta de nueva línea final).
Para ejecutarlo, escriba la cadena de entrada después del
-i
indicador y proporcione la matriz en la entrada:Si su Perl es un poco viejo, es posible que deba agregar un punto y coma final (después del espacio).
fuente
Python 2,
11471 bytesResulta que estaba reinventando la rueda, un simple reemplazo doble en una cadena multilínea funciona bastante bien. La cadena tiene el beneficio adicional de poder contar ceros directamente en lugar de tener que hacer lo realmente feo
s*len(L)*len(L[0])
para una lista anidadaVieja solución:
Primero convertimos todo + 32 con
chr
(todos los ceros se convierten en espacios), luego reemplazamos todo!
con{}
para permitir el uso de laformat
función.SiSi decido hacer trampa y usar enNULL
se puede contar como un espacioNULL
lugar de espacio, puedo omitir la adición de 32 para ahorrar 12 bytes. (seprint
muestra'\x00'
como un espacio)fuente
.replace('\x00',' ')
al final agrega 20 bytesAPL, 18 bytes
Esta es una función que toma una matriz booleana como argumento izquierdo y una cadena como argumento derecho.
Explicación:
APL tiene una función integrada que hace algo como esto
\
(expandir). Sin embargo, solo funciona en vectores, y requiere que cada carácter se use realmente.X←,⍺
: aplana la matriz y almacena el resultado en X.⍵⍴⍨+/X
: cambia la forma del vector de caracteres para que tenga la cantidad requerida de elementos (esto también se encarga de alargar la cadena repitiendo caracteres si es necesario).X\
: Tomar uno de los caracteres para cada uno1
y un espacio para cada uno0
deX
.(⍴⍺)⍴
: da nueva forma al resultado para que tenga la forma de la matriz original.fuente
PHP,
11091978882818075 bytesguardado 6 bytes gracias a @ user59178
Corre con
-r
. Espera matriz como cadena multilínea en primer argumento, cadena en segundo argumento.fuente
foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];
cambié el orden de los dos ternaries y, por lo tanto, eliminé los corchetes del segundo utilizando en<1
lugar de>0
for(;""!=$c=$argv[1][$i++];)
lugar deforeach(...)
PowerShell v2 +, 70 bytes
Toma la palabra de entrada como
$a
y la matriz como una matriz de matrices como$b
(ver ejemplos a continuación). Recorre$b
, luego recorre los elementos de cada fila$_|%{...}
. El bucle interno es una condiciónif
/else
, donde sacamos$a[$n++]
y tomamos mod-igual a la longitud de la cadena, o sacamos un espacio' '
. Esos se-join
vuelven a juntar en una cadena. Cada una de las cadenas se deja en la tubería, y la salida implícita con nuevas líneas entre ocurreWrite-Output
al finalizar el programa.fuente
Groovy, 63
fuente
Python 3, 104 (u 83) bytes
Hay una opción más corta (83 Bytes), pero fallará si la cadena es más de 999 veces más corta de lo necesario:
fuente
next
a una lista. Si lo hace,s=iter(list(s)*999)
lo hace (89 bytes)s.pop(0)
. Parece que copié la versión incorrecta, lo arreglé.s[i++%s.length()]
Es una buena metodología, aunque no conozco Python.i++
en PythonPyth, 12 bytes
Pruébelo en línea: demostración
Explicación:
fuente
ES6, 78 bytes
Lo intenté
fuente
Lisp común, 152 bytes
Uso:
Esta función recorre cada elemento de cada fila de la cuadrícula. La
format
cadena de control imprime un espacio si el elemento es un 0 o consume el argumento del carácter si el elemento es 1. Se imprime una nueva línea después de cada fila de la cuadrícula. Si la cadena es demasiado corta, se repite desde el principio; si es demasiado largo, solo se genera la parte adecuada.fuente
Pip , 18 bytes
17 bytes de código, +1 para
-l
bandera.Toma la matriz como el primer argumento de la línea de comando como este:
100 010 101
(necesita ser citado en shells) y la cadena como el segundo argumento de la línea de comando.Pruébalo en línea!Explicación
fuente
Java,
237233 bytesEditar: guardado 4 Bytes gracias a Mukul Kumar
Golfizado:
Sin golf:
Pruebas:
fuente
Pyke, 12 bytes
Pruébalo aquí!
Emite una matriz de caracteres
O 9 bytes, no competitivos.
Pruébalo aquí!
Aún más no competitivo, 8 bytes
Pruébalo aquí!
print_grid
ahora alinea las cadenas vacías correctamentedeep_for
ahora adivina sobre falsas de un tipo diferente a las verdades
fuente
Java, 122 bytes
fuente
Mathematica, 76 bytes
Función sin nombre de dos argumentos, el primero de los cuales (
#
) es una matriz deTrue
s yFalse
s, y el segundo de los cuales (s
) es una lista de caracteres. La función auxiliarestá definido, lo que coloca los movimientos del primer personaje
s
hasta el final y luego devuelve el personaje recién movido. Llamarf
varias veces devolverá cíclicamente los caracteres des
en orden.La función central es
que invoca
f
cadaTrue
valor en la matriz de entrada y devuelve un espacio en cada entrada falsa. (El{2}
le diceMap
que trabaje en elementos de las listas de componentes de la matriz, en lugar de esas listas mismas).Esos 60 bytes devuelven una matriz de caracteres de
s
y espacios. La envolturacoloca nuevas líneas entre cada una de las listas de esa matriz y luego concatena todo.
fuente
C ++, 61 bytes
fuente