Hay dos piezas de madera. Ambos consisten en un cuerpo recto y algunos bloques adicionales debajo del cuerpo. Una pieza de ejemplo con bloques adicionales en las posiciones (indexadas a 0) 0,4,7,9,10:
XXXXXXXXXXX
X X X XX
La pieza se puede representar como una 01
secuencia binaria con el i
carácter th mostrando si hay un bloque en la i
posición th. El ejemplo superior se puede representar como 10001001011
.
Podemos juntar dos piezas volteando verticalmente la segunda (y quizás volteándola horizontalmente también). Después de la vuelta (s) podemos encontrar una alineación donde las dos piezas se pueden juntar para tener una altura de 3.
Two example pieces:
XXXXXXXXXXX XXXXXXXX
X X X XX XXX
Second piece flipped vertically and horizontally:
XXXXXXXXXXX
X X X XX
XXX
XXXXXXXX
Pieces put together:
XXXXXXXXXXX
XXXXX X XX
XXXXXXXX
El ejemplo resultó en un ancho total de 12 bloques.
Debe escribir un programa o función que reciba dos cadenas como entrada que represente las dos piezas y genere un número entero del ancho mínimo alcanzable con una altura de 3.
Entrada
- Dos cadenas que consisten en los caracteres
0
y1
. - Ambas cadenas contienen al menos un carácter.
- Puede elegir recibir las dos cadenas como una unida por un solo espacio.
Salida
- Un solo entero positivo, el ancho total mínimo alcanzable.
Ejemplos
0 0 => 1
1 0 => 1
1 1 => 2
11 111 => 5
010 0110 => 5
0010 111 => 5
00010 11011 => 6
01010 10101 => 5
1001 100001 => 6
1110001100001 1100100101 => 14
001101010000101 100010110000 => 16
0010110111100 001011010101001000000 => 21
0010110111100 001011010101001001100 => 28
100010100100111101 11100101100010100100000001 => 27
0010 10111 => 5
0100 10111 => 5
0010 11101 => 5
0100 11101 => 5
10111 0010 => 5
10111 0100 => 5
11101 0010 => 5
11101 0100 => 5
Este es el código de golf, por lo que gana la entrada más corta.
Respuestas:
Pyth,
3735343231 bytesToma entrada nueva línea separada.
Demostración , prueba de arnés .
Explicación:
En el nivel superior, para cada combinación de cadenas normales e inversas, desplazamos la segunda cadena a la izquierda por un número determinado de posiciones, y verificamos las superposiciones con la primera cadena. Esto se repite hasta que se encuentre una cantidad de turno sin superposiciones. Esa cantidad de turno se agrega a la longitud de la primera cadena y el resultado se compara con la segunda longitud de la cadena. Se imprime el valor más alto.
fuente
Pip ,
727048 bytesToma las dos cadenas como argumentos de línea de comandos. Formateado, con comentarios:
Solo estamos calculando las superposiciones donde la pieza inferior sobresale a la izquierda, por lo que debemos intentarlo con las piezas superior e inferior invertidas. Cada vez a través del ciclo interno, si no hay 2 en la suma, es un ajuste; Luego añadimos otro cero al final de la pieza inferior e intentamos nuevamente.
Para encontrar el ancho total, dividimos los elementos
p
en listas de caracteres y suma. Las operaciones por elementos en listas de longitud desigual conservan la longitud de la más larga, por lo que la longitud de esta suma es exactamente lo que necesitamos. (La división es necesaria porque simplemente sumar como números eliminará los ceros a la izquierda:,$+[0101 10] = 111
pero$+^[0101 10] = [0 1 1 1]
).fuente
Rubí 127
130Esto resultó ser tan largo ... :(
Pruebas: http://ideone.com/te8XWk
Rubí legible:
fuente
[[m,n],[m,n.reverse],[n,m],[n,m.reverse]]
parte puede ser incorrecta. (No estoy seguro, pero cometí un error similar.)[n.reverse,m]
lugar de,[n,m.reverse]
pero no conozco a Ruby.'0010110111100', '001011010101001001100'
diciendo Esperado: 28, Actual: 30 . Todas las otras pruebas pasan. Así que has hecho un buen trabajo probando casos de esquina. :)JavaScript ( ES6 ) 160
No se pudo acortar ...
fuente