Dada uma pirâmide de adição , determine se ela pode ser resolvida. Uma pirâmide de adição consiste em camadas , cada uma com um número menor que o número abaixo dela. A camada é simbolizada como . é a camada base e é a camada no topo de . O ésimo número de é indicado como . é o número mais à esquerda de , e é o número à direita de . Você pode visualizar residindo em cima dei P i P 1 P i + 1 P i j P i P i , j P i , 1 P i P i , j + 1 P i , j P i + 1 , j P i , je no meio, daí o nome " pirâmide de adição ".
- , ou seja, todo número na pirâmide é um número inteiro positivo diferente de zero.
- , ou seja, todos os números que não estão na camada base da pirâmide são a soma de os dois números abaixo dele.
- Se possui números, possui , portanto, é o número mais à direita de . Em termos mais simples, cada camada tem um número a menos que a camada abaixo dela.
Um quebra-cabeça de pirâmide de adição é uma pirâmide de adição com alguns números removidos (substituídos por ). Sua solução é uma pirâmide de adição , onde , ou seja, os números que estavam originalmente presentes no quebra-cabeça têm foi deixado inalterado. Esse quebra-cabeça pode ter mais de uma solução.
Seu trabalho é, com um quebra-cabeça de pirâmide adicional, determinar se ele tem exatamente uma solução.
Entrada
Você pode obter informações de qualquer uma das seguintes formas, mas seja consistente:
- Matriz de camadas.
- Matriz de camadas, em forma de pirâmide, usando um valor inteiro não positivo consistente como um separador entre os elementos (usados apenas uma vez por vez), bem como o preenchimento esquerdo e direito. O separador e o preenchimento devem ser os mesmos.
- Matriz de camadas com um preenchimento válido direito ou esquerdo consistente (neste caso, você deve ser consistente e não misturar o preenchimento direito e esquerdo).
Observe que um valor consistente que não seja um número inteiro estritamente positivo deve ser usado para representar um número ausente; esse valor não pode ser usado como preenchimento. Além disso, é possível concatenar as camadas (ainda é possível separá-las) e a ordem pode ser da base para o topo ou da parte superior para a base.
Resultado
Um dos dois valores distintos consistentes, em que um representa a presença de uma solução única e o outro a ausência de uma solução ou a presença de mais de uma solução.
Regras
- sempre será verdadeiro se , ou seja, a entrada é garantido que não contenha um número em cima de dois outros números que não é a soma deles se todos os três números forem conhecidos.
- , ou seja, a pirâmide conterá pelo menos um número conhecido.
- Não faça essas coisas .
- Isso é código-golfe , então a resposta mais curta vence! No entanto, não deixe que isso o desencoraje de postar uma solução apenas porque seu idioma é "muito detalhado".
Casos de teste
Uma matriz com as camadas da parte superior à base é usada para esses casos de teste, com 0
representação .
[[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
Exemplos trabalhados
Os casos de teste são trabalhados aqui.
Solução única 1
Passo 1: .
Etapa 2: .
Passo 3: .
Passo 4: .
As etapas 5 a 6 são semelhantes a 4.
Então aqui temos nossa solução exclusiva.
Solução única 2
Etapa 1: não há uma abordagem óbvia aqui, então vamos tentar usar os valores mínimos possíveis.
Etapas 2-5: Parece que os valores mínimos resultam em uma solução, portanto, esta é a única solução e, portanto, única.
Dica: existe um teorema sobre quebra-cabeças de pirâmide de adição relacionado a esse quebra-cabeça que você pode provar se pensar bastante.
Solução única 3
Passo 1: .
Esta é uma solução obviamente única.
Sem solução 1
Sem solução 2
Solução não exclusiva
Duas soluções:
Como existem pelo menos duas soluções, não há solução única.
fonte
Respostas:
Geléia ,
1816 bytesExperimente online!
Um link monádico que pega a pirâmide na ordem inversa e retorna 1 para verdadeiro e 0 para falso. Gera todas as pirâmides possíveis com uma base até o número máximo na pirâmide e verifica se há uma correspondência exclusiva para a entrada.
Agradecemos a @Arnauld por apontar que isso falhou
[[1,0],[0]]
; agora corrigido.Obrigado a @JonathanAlan por salvar 2 bytes!
Explicação
fonte
ṗ
do número máximo na grade com o comprimento da base. por exemplo, se o número máximo fosse 10 e o comprimento da base 4, ele testaria tudo, desde[1,1,1,1]
a[10,10,10,10]
, ou seja, 10000 possibilidades.[[0,0],[0]]
.‘
para»2
qual também tem a vantagem de recuperar a eficiência perdida com minha última alteração, embora ao custo de um byte....Ƭ€Ṗ€a@ċ⁼1
salva dois bytes (a menos que haja casos de ponta com o e não servidos pelos testes?)C # (Compilador interativo do Visual C #) ,
303227 bytesLança exceção se true, executa normalmente se false.
Experimente online!
fonte
Wolfram Language (Mathematica) ,
8588 bytesExperimente online!
+3 fixo.
Força bruta: para todas as bases com valores , verifique se a pirâmide resultante corresponde à forma especificada e verifique se o número total de correspondências é 1. É inserido como uma lista de níveis, base primeiro, com a representação de números ausentes.
1..(sum of all numbers)
0
fonte
05AB1E , 25 bytes
Toma as camadas da pirâmide em ordem invertida, da base à ponta (ou seja
[[0,0,0,1],[0,2,0],[0,0],[10]]
).Além disso, parece haver um bug em algum lugar do 05AB1E
.Γ
dentro de um mapa. O valor©...®š
deve ser...yš
de -1 byte.Experimente online ou verifique mais alguns casos de teste .
Uma alternativa menor de bytes iguais para
©.ΓüO}®š
poderia ser[Ðg#üO}\)
: Experimente online.Explicação:
fonte
a%b == 0
como atalhoa == b || a == 0
, mas isso não funciona porque a pode ser um múltiplo de b.[[0,0],[0]]
, que têm infinitas soluções. Eu acho que mudar>
para asI
correções com sotaque correto isso..S*
vez de%
, portanto, apenas +2 bytes.Haskell, 106 bytes
Toma uma pirâmide de cabeça para baixo, por exemplo
[[0,0,0,1],[0,2,0],[0,0],[10]]
.Experimente online!
A abordagem da força bruta em Haskell:
t
(mapM(\_->[1..sum(sum<$>x)])x
), onde os números vão de 1 à soma de todos os números na pirâmide de entradat
(iterate(z(+)=<<tail)t
)z(z(#))x
). A função de comparaçãoa # b
retornaráTrue
se os dois números forem iguais oua
forem zero (a*b==a*a
).1
para cada pirâmide que corresponda e compare a lista resultante com a lista de singleton[1]
.fonte