Dada una pirámide de adición , determine si se puede resolver. Una pirámide de suma consta de capas , cada una con un número menor que el que está debajo. La capa se simboliza como . es la capa base, y es la capa sobre . El número de se denota como . es el número más a la izquierda de , y es el número a la derecha de . Puede visualizar reside en la parte superior de y en el medio, de ahí el nombre de "pirámide desuma".
- , es decir, cada número en la pirámide es un entero positivo distinto de cero.
- , es decir, cada número que no está en la capa base de la pirámide es la suma de los dos números debajo de él.
- Si tiene números, tiene números, por lo tanto es el número más a la derecha de . En términos más simples, cada capa tiene un número menor que la capa debajo de ella.
Un rompecabezas de pirámide de suma es una pirámide de suma con algunos números eliminados (¿reemplazados por ). Su solución es una pirámide de suma , donde , es decir, los números que originalmente estaban presentes en el rompecabezas no se han modificado. Tal rompecabezas puede tener más de una solución.
Su trabajo es, dado un rompecabezas piramidal adicional, determinar si tiene exactamente una solución.
Entrada
Puede obtener información en cualquiera de las siguientes formas, pero sea coherente:
- Matriz de capas.
- Matriz de capas, con forma de pirámide que utiliza un valor entero no positivo constante como separador entre elementos (se usa solo una vez cada vez), así como el relleno izquierdo y derecho. El separador y el relleno deben ser iguales.
- Matriz de capas con un relleno correcto derecho o izquierdo consistente (debe ser consistente y no mezclar el relleno derecho e izquierdo en este caso).
Tenga en cuenta que un valor consistente que no sea un entero estrictamente positivo debe usarse para representar un número faltante; Este valor no se puede utilizar como relleno. Además, puede tomar las capas concatenadas (aún puede separarlas), y el orden puede ser desde la base hasta la parte superior o desde la parte superior hacia la base.
Salida
Uno de dos valores distintos consistentes, donde uno representa la presencia de una solución única y el otro la ausencia de una solución o la presencia de más de una solución.
Reglas
- siempre será cierto si , es decir, la entrada se garantiza que no contendrá un número encima de otros dos números que no sea su suma si se conocen los tres números.
- , es decir, la pirámide contendrá al menos un número conocido.
- No hagas estas cosas .
- Este es el código de golf , por lo que gana la respuesta más corta. Sin embargo, no permita que eso lo desanime de publicar una solución solo porque su idioma es "demasiado detallado".
Casos de prueba
Una matriz con las capas desde la parte superior a la base se utiliza para estos casos de prueba, con 0
representación .
[[10], [0, 0], [0, 2, 0], [0, 0, 0, 1]] -> True
[[32], [0, 0], [0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]] -> True
[[0], [1, 1]] -> True
[[1], [0, 0]] -> False
[[10], [5, 5], [2, 3, 2], [0, 0, 0, 0]] -> False
[[5], [0, 0], [0, 0, 0]] -> False
Ejemplos trabajados
Los casos de prueba se trabajan aquí.
Solución única 1
Los pasos 5-6 son similares a 4.
Entonces aquí tenemos nuestra solución única.
Solución única 2
Paso 1: Aquí no hay un enfoque obvio, así que intentemos usar los valores mínimos posibles.
Pasos 2-5: Parece que los valores mínimos dan como resultado una solución, por lo tanto, esta es la única solución y, por lo tanto, es única.
Sugerencia: Hay un teorema sobre los rompecabezas de pirámides de suma relacionados con este rompecabezas que puedes probar si piensas lo suficiente.
Solución única 3
Esta es obviamente una solución única.
Sin solución 1
Sin solución 2
Solución no única
Dos soluciones:
Como hay al menos dos soluciones, no hay una solución única.
fuente
Respuestas:
Jalea ,
1816 bytesPruébalo en línea!
Un enlace monádico que toma la pirámide en orden inverso y devuelve 1 para verdadero y 0 para falso. Genera todas las pirámides posibles con una base hasta el número máximo en la pirámide y comprueba si hay una coincidencia única para la entrada.
Gracias a @Arnauld por señalar que esto falló
[[1,0],[0]]
; Ahora corregido.¡Gracias a @JonathanAlan por guardar 2 bytes!
Explicación
fuente
ṗ
del número máximo en la cuadrícula con la longitud de la base. por ejemplo, si el número máximo fuera 10 y la longitud de la base 4, entonces probaría todo, desde ,[1,1,1,1]
hasta[10,10,10,10]
10000 posibilidades.[[0,0],[0]]
.‘
a lo»2
que también tiene la ventaja de recuperar la eficiencia perdida con mi último cambio, aunque a costa de un byte....Ƭ€Ṗ€a@ċ⁼1
guarda dos bytes (a menos que haya casos extremos con el AND no atendido por las pruebas)C # (compilador interactivo de Visual C #) ,
303227 bytesLanza una excepción si es verdadero, se ejecuta normalmente si es falso.
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
8588 bytesPruébalo en línea!
+3 fijo.
Fuerza bruta: para todas las bases con valores , vea si la pirámide resultante coincide con la forma dada, y verifique si el número total de coincidencias es 1. Toma la entrada como una lista de niveles, base primero, con la representación de números faltantes.
1..(sum of all numbers)
0
fuente
05AB1E , 25 bytes
Toma las capas de la pirámide en orden invertido, de la base a la punta (es decir
[[0,0,0,1],[0,2,0],[0,0],[10]]
).Además, parece haber un error en algún lugar de 05AB1E
.Γ
dentro de un mapa.©...®š
Debería ser...yš
de -1 byte.Pruébelo en línea o verifique algunos casos de prueba más .
Una alternativa menor para bytes iguales
©.ΓüO}®š
podría ser[Ðg#üO}\)
: Pruébelo en línea.Explicación:
fuente
a%b == 0
como atajoa == b || a == 0
, pero eso no funciona porque a podría ser un múltiplo de b.[[0,0],[0]]
, que tienen infinitas soluciones. Creo que simplemente cambiar>
a lasI
correcciones correctamente acentuadas eso..S*
lugar de%
, por lo que solo +2 bytes.Haskell, 106 bytes
Toma una pirámide invertida, por ejemplo
[[0,0,0,1],[0,2,0],[0,0],[10]]
.Pruébalo en línea!
El enfoque de la fuerza bruta en Haskell:
t
(mapM(\_->[1..sum(sum<$>x)])x
), donde los números van del 1 a la suma de todos los números en la pirámide de entradat
(iterate(z(+)=<<tail)t
)z(z(#))x
). La función de comparacióna # b
devuelveTrue
si ambos números son iguales oa
es cero (a*b==a*a
).1
para cada pirámide que coincida y compare la lista resultante con la lista singleton[1]
.fuente