Introducción
Quiero construir una escalera. Para esto, he eliminado del depósito de chatarra dos tablas largas con agujeros en ellas, y quiero colocar los escalones en estos agujeros. Sin embargo, los agujeros no están colocados de manera uniforme, por lo que los pasos serán un poco torpes, y me resulta difícil estimar la cantidad de varilla que necesito para ellos. Tu trabajo es hacer los cálculos por mí.
Entrada
Su entrada son vectores de dos bits, dados como matrices de enteros, que representan las dos tablas. A 0
representa un segmento de un aud ( unidad arbitraria de distancia ) sin un agujero, y a 1
representa un segmento de un aud con un solo agujero. Las matrices pueden ser de diferentes longitudes y contener un número diferente de 1
s, pero no estarán vacías.
Construiré mi escalera de la siguiente manera. Primero, coloco las dos tablas separadas exactamente una a una y alineo sus extremos izquierdos. Para cada índice i
, mido la distancia entre el i
hoyo th de la primera tabla con el i
hoyo th de la segunda tabla, corto un trozo de varilla y lo adjunto entre los dos agujeros. Me detengo una vez que me quedo sin agujeros en una de las tablas.
Salida
Su salida es la cantidad total de varilla que necesitaré para los pasos, medidos en audios. La salida debe ser correcta al menos a seis dígitos significativos.
Ejemplo
Considere las entradas [0,1,1,0,1,1,1,1,0,0]
y [1,0,0,1,1,1,0,0,1]
. La escalera resultante se ve así:
La longitud total de la barra en esta escalera es 7.06449510224598
auds.
Reglas
Puede escribir una función o un programa completo. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
[0] [0] -> 0.0
[0] [1,0] -> 0.0
[1,0,0] [1,1,1,1,1] -> 1.0
[0,1,0,1] [1,0,0,1] -> 2.414213562373095
[0,1,1,0,1,1,1,1,0,0] [1,0,0,1,1,1,0,0,1] -> 7.06449510224598
[1,1,1,1,1] [0,0,1,1,0,1,0,0,1] -> 12.733433128760744
[0,0,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0] [0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1] -> 20.38177416534678
Respuestas:
J, 20 bytes
Utiliza el truco en la respuesta de MickyT en I .
(<0 1)|:
da la diagonal de una matriz. Para las explicaciones de las otras partes, vea la respuesta de FUZxxl .fuente
J, 22 caracteres
No inspirado por la respuesta de randomra. La
I.
parte es igual, ya que es la forma obvia de encontrar los agujeros.I. y
- todos los índices dey
repetidos tan a menudo como el elemento correspondiente dey
. Por cierto, siy
es un vector de booleanos,I. y
contiene los índices en los que sey
encuentra1
. Por ejemplo,I. 1 0 0 1 1 1 0 0 1
rendimientos0 3 4 5 8
.x u&v y
- lo mismo que(v x) u (v y)
. Aplicado comox u&I. y
, lo conseguimos(I. x) u (I. y)
. Continuemos con la entrada transformada.x <.&# y
- la menor de las longitudes dex
yy
.x -/@,: y
- la diferencia de los elementos dex
yy
. Si un vector es más largo, se rellena con ceros.x $ y
-y
remodelado a la forma especificada porx
. Específicamente, six
es un escalar,x
se toman elementos dey
. En este uso,x (<.&# $ -/@,:) y
se asegura de que se ignoren los agujeros finales.4 o. y
- la función%: 1 + *: y
, es decir, sqrt (1 + y ²). Por cierto, esta función asigna desde la distancia del agujero hasta la longitud de las barras.+/ y
- la suma de los elementos dey
.fuente
Python, 85
Esto resultó similar a la solución de Mac . Convierta las listas de 0 y 1 en listas ordenadas de los índices uno, y luego sume la distancia entre los elementos respectivos.
fuente
J,
3228 bytesEl verbo
I.
devuelve las posiciones de1
s en una cadena binaria que es de gran ayuda.Para una mejor solución J, verifique la respuesta de FUZxxl .
fuente
R, 67
Usa el exterior para hacer una diferencia para los agujeros indexados. Diag devuelve las diferencias requeridas. Luego suma las distancias calculadas
Prueba de funcionamiento en R Fiddle. Lo he envuelto en una impresión para mostrar que la devolución cumple con las especificaciones.
fuente
a==1
puede sera>0
o!!a
.Haskell,
7773 bytesUso:
[0,1,0,1] # [1,0,0,1]
que salidas2.414213562373095
Cómo funciona: la función
r
devuelve una lista de las posiciones de los agujeros de un tablero, por ejemplo,r [0,1,0,1]
->[2,4]
.#
comprime dos de esas listas y la convierte en una lista de distancias entre los agujeros correspondientes y finalmente la suma.fuente
CJam,
3633 bytesEnfoque muy ingenuo ... espera la entrada como matrices de estilo CJam en STDIN
Aquí hay un arnés de prueba para todas las entradas de ejemplo. Los resultados en el campo de entrada se usan antes de llamar al código real. Puedes eliminarlos si no confías en mí. ;)
Explicación
fuente
Python, 86
Una solución recursiva ingenua y de bajo nivel sin ninguna búsqueda en la lista.
Las listas de entrada son
a
yb
. Si alguno está vacío, regrese0
.De lo contrario, deje
x
yy
sean sus primeros elementos (el código en realidad no los asigna porque no puede hacer asignaciones en alambda
, pero facilitará la explicación). Si ambos son 1, es decir, su producto es 1, entonces contribuyen a la distancia de la barra. Llevamos un registro de la distancia en el número complejoi
, de modo que la distancia es el valor absoluto. En realidad, lo calculamos independientemente, luego lo multiplicamos porx*y
.Entonces, recurrimos. La idea es cambiar ambas listas un paso, a menos que una lista comience con un 0 y la otra con un uno, en cuyo caso solo cambiamos la lista 0. De esa manera, los 1 siempre se consumen en pares. Podríamos verificar estas condiciones con
x<y
yy<x
, pero es más corto aprovechar la comparación de listas comoa[:1]<=b
. Finalmente, ajustamos el desplazamiento complejo entre los elementos actuales porx-y
.fuente
a>[]<b
aa>0<b
. Funciona desde ambos[]
y0
son falsas, por lo que son equivalentes.a:
?([] > []) != ([] > 0)
y en python3 es un error (tipos no ordenados).a:
es parte de la rebanada[b[:1]<=a:]
.Python,
105102100 bytesBastante básico, solo convierte las listas de entrada en listas de índices de agujeros, luego calcula la distancia entre cada par de dichos índices.
Caso de prueba:
Gracias a @FryAmTheEggman por un par de sugerencias para guardar bytes. Resulta que esto se puede jugar más, como se demuestra en la respuesta de xnor .
fuente
enumerate(l)
y el0.5
(que podría ser solo .5).l=lambda*a:sum(((a-b)**2+1)**.5for a,b in zip(*map(i,a)))
Pyth, 30 bytes
Pruébelo en línea con la entrada
[0,1,1,0,1,1,1,1,0,0], [1,0,0,1,1,1,0,0,1]
.Explicación:
Convierto las listas en las listas de índices
[2, 3, 5, 6, 7, 8]
y[1, 4, 5, 6, 9]
y comprímalos juntos[(2,1), (3,4), (5,5), (6,6), (7,9)]
. Luego resto los valores, los cuadro, sumo 1 y sumo sobre todas las raíces cuadradas.Es una pena que
sum
no funcione para listas vacías.fuente
Python,
116115 bytesEsta es una solución recursiva.
Se volvió bastante molesto cuando descubrí que
index()
solo arroja un error cuando no se encuentra ningún valor, pero lo hice funcionar. Desafortunadamente, no puedo usar una lambda. También me molestó quelist.remove()
no devuelva la lista, sino que regreseNone
.Ejecute en línea aquí: http://repl.it/c5L/2
fuente
Clip 3 ,
55 4738Para la lista con menos agujeros, el programa itera a través de ella y conecta cada agujero con el agujero correspondiente de la otra lista. Los tamaños son calculados y sumados.
Explicación
Si somos muy liberales con respecto al formato de entrada, podemos reducir esto a 36 bytes eliminando cada uno
k
. Esto requiere que la entrada sea una cadena de caracteres de caracteres de control\0
y\1
.fuente
ECMAScript 6, 86 bytes
Originalmente, esto comenzó usando reducir (quería ver si se podía hacer en un bucle en lugar de la respuesta @ edc65).
Pero usando @ edc65 para
map
y&&t
para devolver el valor pude acortarlo un poco.fuente
reduce
tiene más sentido semánticamente, pero aparte de eso, en realidad es un poco incómodo de usar. Por supuesto, desde cuándo los golfistas de código se preocuparon por la semántica.Java, 151
Esto simplemente camina en
a
busca de unos, luego caminab
cuando encuentra uno. Si lafloat
precisión es aceptable, podría guardar un par de bytes, perodouble
elegí la salida de prueba.Con espacios en blanco:
fuente
JavaScript (ES6) 108
El punto principal es la función f que mapea las matrices de entrada 0..1 en matrices de posiciones de agujeros. Luego, las matrices se escanean calculando la longitud total de las barras utilizando el teorema de Pitágoras. Se
|0
necesita cerca del final para convertir los NaN que pueden resultar cuando la matriz de controladores (la primera) es más larga que la segunda.Prueba en la consola Firefox / FireBug
fuente
Octava,
605942fuente
Perl 98
Legible:
Pruebas:
fuente
APL,
3528 bytesUtiliza un algoritmo similar a la solución J, pero APL tiene menos componentes incorporados.
Entrada de ejemplo:
fuente