Introducción
Considere dos matrices enteras no vacías, digamos A = [0 3 2 2 8 4] y B = [7 8 7 2] . Para realizar la adición de alineación en ellos, hacemos lo siguiente:
Repita cada matriz suficientes veces para tener una longitud total mcm (longitud (A), longitud (B)) . Aquí mcm representa el mínimo común múltiplo.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][7 8 7 2][7 8 7 2]
Realice la suma por elementos en las matrices repetidas y corte el resultado en cada posición donde haya un corte en cualquiera de ellas.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][ 7 8 7 2][7 8 7 2] -> [7 11 9 4][15 12][7 5][9 10 15 6]
Esta matriz de matrices es su resultado.
La tarea
Sus entradas son dos matrices no enteras de enteros, y su salida será el resultado de su adición de alineación, como se definió anteriormente. Las entradas y salidas pueden estar en cualquier formato razonable. No tiene que preocuparse por el desbordamiento de enteros al realizar la adición.
Reglas y puntaje
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana.
Casos de prueba
[1] [4] -> [[5]]
[1,2,-3,-4] [15] -> [[16],[17],[12],[11]]
[0,-4] [2,1,0,-3] -> [[2,-3],[0,-7]]
[0,3,2,2,8,4] [7,8,7,2] -> [[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
[18,17,16] [-1,-2,-3,-4] -> [[17,15,13],[14],[16,14],[15,13],[15],[16,14,12]]
[18,17,16,15] [-1,-2,-3,-4] -> [[17,15,13,11]]
[1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7],[6,7,3,2],[7],[6,7,6,7,6],[7,3,2],[7,6],[7,6,7,6,7],[3,2],[7,6,7],[6,7,6,7,3],[2],[7,6,7,6],[7,6,7,3,2]]
[1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6],[7,3,2],[7,6,7],[6,7,6,7,3,2]]
[1,1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6,7],[3,2],[7,6,7,6,7],[6,7,3,2],[7,6,7],[6,7,6,7,3,2],[7],[6,7,6,7,6,7,3],[2],[7,6,7,6,7,6],[7,3,2],[7,6,7,6],[7,6,7,3,2],[7,6],[7,6,7,6,7,3,2]]
Respuestas:
JavaScript (ES6),
10199 bytesToma la entrada como 2 matrices. Devuelve una cadena.
Cómo funciona
Repetimos la primera matriz
a
con un punteroi
mientras actualizamos otro punteroj
en la segunda matrizb
. Las sumasa[i] + b[j]
se agregan a la cadena de salidas
. Se inserta un separador cada vezi == 0
oj == 0
. Repetimos este proceso hastaj
que regrese exactamente al principio ob
al final de una iteración.Nota: Cuando
|
se aplica el operador,a.map(...)
se coacciona aNaN
(sia
contiene más de un elemento) o al valor actual dej
(sia
contiene exactamente un elemento). Por lo tanto,a.map(...)|j == j
en todos los casos y es seguro de usar aquí.Casos de prueba
Mostrar fragmento de código
fuente
Haskell,
8479 bytesMi primera versión fue la misma en un diseño más legible:
Usar una definición local para evitar tener que dar
(%)
argumentos adicionales paraa
yb
. Sorprendentemente, esta es casi la misma solución dada casi al mismo tiempo que @ nimi, de quien tomé la idea de usar solo una línea para la definición local.Uso:
fuente
!
.PHP,
126120 bytesPruébalo aquí!
Función anónima que devuelve la matriz resultante de matrices.
Esencialmente, recorremos los contenidos de nuestros dos conjuntos, modificando nuestro iterador por la longitud del conjunto para simular 'copiarlos'. Tomando cada uno de los valores de las matrices, los sumamos y los agregamos a una matriz en
$c
. Si llegamos al final de una de nuestras matrices de entrada (una división, en términos del desafío), comenzamos a asignar una nueva matriz en$c
.El motivo de la
do while
bucle es porque nuestra condición se basa en$i
, que comienza en0
. Si usamos un bucle donde se verifica la condición al principio, el bucle no se ejecutaráSolo finalizamos la suma una vez que llegamos al final de ambas matrices al mismo tiempo, lo que implicaría el LCM.
fuente
$b[$i%$y]
? Puede guardar 3 bytes moviéndose$x=count($a)
al primer uso de$x
; mismo para$y=count($b)
y un byte con bit a bit o en lawhile
condiciónHaskell,
8784 bytesEjemplo de uso:
[0,3,2,2,8,4] # [7,8,7,2]
->[[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
.Recurrencia simple Caso base: ambas listas están vacías. Si solo uno de ellos está vacío, reinicie con una versión completa e inicie un nuevo clúster en la salida. Si ninguno está vacío, anteponga la suma al elemento from.
También eche un vistazo a la respuesta de @Christian Sievers , que es casi idéntica y se publicó unos segundos antes.
fuente
Octava, 113 bytes
esta función se puede llamar directamente para llamarla, colocarla entre paréntesis y llamar como (@ (a, b) ...) ([1 2 3 4], [6 4 5])
fuente
CJam , 30 bytes
Pruébalo en línea!
Toma datos como un par de listas.
Explicación
La idea es insertar algunos marcadores en las matrices de entrada (en forma de cadenas cortas) que indican dónde termina la matriz alineada y dónde necesitamos insertar los saltos en las matrices. De esta forma podemos evitar tener que calcular el LCM.
fuente
Gelatina ,
212018 bytesPruébalo en línea!
Cómo funciona
fuente
Python 3.5 - (
146137134130 + 12) = 142 BytesNo puedo entender cómo poner todo el bucle for en una línea.
Ediciones:
fuente
gcd
función está enfractions
, nomath
.3.4.3
.l*k
y tenerprint(r);r=[]
en la última línea.Python 2, 119 bytes
Toma la entrada de stdin como dos tuplas separadas por comas, emite las listas resultantes a stdout. Termina planteando la
ZeroDivisionError
excepción, ya que parece estar permitido .Por ejemplo, si la entrada es
(0, 3, 2, 2, 8, 4), (7, 8, 7, 2)
, el programa imprimiráa stdout y la excepción rastrea a stderr.
fuente
J ,
3432 bytesPruébalo en línea!
Explicación
fuente
Haskell, 166 bytes
Probablemente este no sea el enfoque más elegante: Básicamente, la función
?
crea una lista de la longitud necesaria con los suums, y%
está recortando esta suma nuevamente.!
es la función final que combina esos dos.fuente
ind
pork
o algo, y hay algunos paréntesis innecesarios alrededordrop i l
ymap(+(-i))ind
. Considere también tener dos casos para%
, con la coincidencia de patrones activadal
.[PHP],
183152135 bytesBuena versión:
Salida:
fuente
$i=$j=$k=0;
es innecesario si usa+$i
etc. para los índices de matriz en la asignación adjunta (-8 bytes).$i++;if(!isset($A[$i])){$i=0;$k++;}
->isset($A[++$i])?:$i=!++$k;
(-9, dos veces).$i==0&&$j==0&&!isset()
->!$i&!$j&!isset()
(-6).return$O;
no necesita espacio (-1).$i=$j=0;
parte ya que los primeros valores de las matrices no serán correctos. He modificado un poco la lógica, así que no estoy seguro de cómo implementar operadores ternarios en este caso. Gracias por los++$i
consejosunset($i);$A[+$i]
. El se+
lanzaránull
a entero0
.if(!isset($A[++$i])){$i=0;++$k;++$f;}
->isset($A[++$i])?:$i=!++$k|!++$f;
todavía guarda 5 bytes cada uno. Ahorre uno más con en$f<2
lugar de$f!=2
. y otros dos con enwhile($f=$f<3){...}
lugar dewhile($f<2){$f=0;...}
(inicializa y restablece$f
a 1 a menos que se incremente dos veces)PowerShell ,
147145bytesPruébalo en línea!
(Se aceptan sugerencias de golf. Siento que probablemente hay otros 10 a 15 bytes que se pueden extraer de esto. )
Toma datos como dos matrices explícitas (con la
@(...)
sintaxis) como argumentos de línea de comandos. Devuelve una tabla hash de las matrices resultantes, porque las matrices multidimensionales en PowerShell pueden volverse extrañas, y esto es más consistente. Establece algunas variables iniciales, luego ingresa ado
/until
loop nuevamente, siendo el condicional hasta$i
que el mcm de la matriz cuente .Cada iteración del ciclo, agregamos los valores correspondientes
$a
y$b
juntos, lo tratamos como una matriz,(...)
antes de agregarlo a la tabla hash$o
en el lugar apropiado$j
. La encapsulación de la matriz es necesaria para evitar la adición aritmética; en su lugar, esto obliga+=
a sobrecargar la concatenación de la matriz. Luego, un condicional en$x
y$y
(los recuentos) para determinar si estamos en un borde de matriz; si es así, incrementamos$j
.Finalmente, dejamos
$o
en la tubería y la salida es implícita.(Nota: debido a cómo PowerShell enumera las tablas hash con el valor predeterminado
Write-Output
, esto tiende a salir "hacia atrás"; como en, la matriz resultante "0" está en la "parte inferior" de la salida. El hash en sí está bien, y sería se usa muy bien si, por ejemplo, encapsula este código en una variable de retorno ... simplemente se ve extraño cuando se imprime).Ahorró 2 bytes moviendo $ x y $ y en la indexación de la matriz en lugar de separarlos (guardó dos puntos y comas).
fuente
Python 2, 113 bytes
fuente
not
s ser<1
s en su lugar?Python 3.5,
210176173169158 BytesToma dos listas como entrada e imprime todas las listas.
Es mi primera respuesta y todavía no sé jugar al golf. La idea básica que he usado es tener dos contadores para cada lista que indican una división y una lista actual donde se agregan los valores agregados; Tan pronto como se encuentra una división, imprimimos la lista actual y hacemos una nueva vacía.
fuente
x=[];c=len(a);d=len(b);e=f=0
. Además,true
puede llegar a ser1
, yx.append(a[e]+b[f])
puede llegar a serx+=a[e]+b[f],
.if
y laswhile
declaraciones no necesitan paréntesis.Raqueta 373 bytes
Sin golf:
Pruebas:
Salida:
fuente
Clojure,
280206 bytesBueno, esto tiene mucho más sentido. Generando la suma de elementos sabios, agregando metadatos posicionales, tomando mientras aún no hemos repetido y colocando el valor de la suma para cada partición.
Original: espero mejorar esto, pero este es el más amable que tengo por ahora.
Sin golfos y detallado:
Comienza por "fusionar" un ciclo infinito de colecciones
a
yb
, agrega metadatos en el índice de cada elemento dentro de la colección, toma hasta que ambas secuencias comiencen desde el índice 0 nuevamente.Esta coleccion
c
se fusiona con datos de partición (una suma acumulativa de unos y ceros), se divide y se selecciona el último elemento (que es la suma de elementos).Creo que para mejoras significativas se requiere un enfoque totalmente diferente.
fuente
PHP,
150121119 bytesLa función anónima toma datos como matrices.
Descompostura
fuente
C ++ 14, 206 bytes
Como lambda sin nombre genérico, que requieren recipientes de entrada
P
,Q
y el recipiente de salidaR
a ser comovector<vector<int>>
.Sin golf y uso:
fuente
Mathematica 112 Bytes
Esto probablemente podría mejorarse. La idea es crear una matriz 2D con el segundo elemento utilizado para rastrear el arrendador del contador y modificar la longitud de cada matriz de entrada.
Uso
fuente
JavaScript (ES6), 131 bytes
Ligeramente incólume:
d
ye
contienen números, la suma del primer número se agrega as
y los elementos restantes se procesan de forma recursivas
se agrega al resultador
y la otra matriz se restablece a su matriz inicialLamentablemente, esta solución no tiene la eficacia despiadada de @ Arnauld, pero al menos creo que es una solución hermosa.
fuente