Esse quebra-cabeça de pirâmide de adição tem uma solução única?


11

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 dePi 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 , jiPiP1Pi+1PijPiPEu,jPEu,1PEuPEu,j+1PEu,jPEu+1,jPEu,je no meio, daí o nome " pirâmide de adição ".PEu,j+1

  • PEu,j,PEu,jN , ou seja, todo número na pirâmide é um número inteiro positivo diferente de zero.
  • Eu>1,PEu,j=PEu-1,j+PEu-1,j+1 , 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.P1nPEun-Eu+1PEu,n-Eu+1PEu

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.Q?PQEu,j?,PEu,j=QEu,j

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

  • QEu+1,j=QEu,j+QEu,j+1 sempre será verdadeiro seQEu,j,QEu,j+1,QEu+1,jN , 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.
  • QEu,j,QEu,j?, ou seja, a pirâmide conterá pelo menos um número conhecido.
  • Não faça essas coisas .
  • Isso é , 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 0representaçã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

10???2????1

Passo 1: x+y=2x=y=1 .

10???2??111

Etapa 2: x=y=1x+y=2 .

10???22?111

Passo 3: x=y=2x+y=4 .

10?4?22?111

Passo 4: x+4=10x=6 .

1064?22?111

As etapas 5 a 6 são semelhantes a 4.

10644223111

Então aqui temos nossa solução exclusiva.

Solução única 2

32.????????????????????

Etapa 1: não há uma abordagem óbvia aqui, então vamos tentar usar os valores mínimos possíveis.

32.??????????????111111

Etapas 2-5: Parece que os valores mínimos resultam em uma solução, portanto, esta é a única solução e, portanto, única.

32.1616888444422222111111

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

?11

Passo 1: x=y=1x+y=2 .

211

Esta é uma solução obviamente única.

Sem solução 1

1??

minN=1x,y1x+y2>1

Sem solução 2

1055232????

x+y=2x=y=1

10552321111

1+1=3

Solução não exclusiva

5?????

Duas soluções:

552332112211

Como existem pelo menos duas soluções, não há solução única.


Respostas:


5

Geléia , 18 16 bytes

FṀ‘ṗLSƝƬ€Ṗ€a@ċ⁼1

Experimente 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

F                | Flatten
 Ṁ               | Maximum
  ‘              | Increase by 1
   ṗ             | Cartesian power of this with:
    L            | - Length of input
        €        | For each:
       Ƭ         | - Repeat the following until no change
     SƝ          |   - Sum of neighbours
         Ṗ€      | Remove last element from each list
           a@    | Logical and input with each list
             ċ   | Count times input appears
              ⁼1 | Check if equal to 1

Muito agradável. Como funciona a lógica "gerar todas as possibilidades"?
Jonah

1
@Jonah a potência catrtesiana 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.
Nick Kennedy

Realmente saídas para [[0,0],[0]].
Kevin Cruijssen 31/07/19

@KevinCruijssen Pedi esclarecimentos sobre se a entrada sem valores conhecidos é válida. Nesse caso, posso mudar para »2qual também tem a vantagem de recuperar a eficiência perdida com minha última alteração, embora ao custo de um byte.
Nick Kennedy

2
...Ƭ€Ṗ€a@ċ⁼1salva dois bytes (a menos que haja casos de ponta com o e não servidos pelos testes?)
Jonathan Allan


1

Wolfram Language (Mathematica) , 85 88 bytes

Count[l=Length@#;NestList[2#~MovingMedian~2&,#,l-1]&/@Range@Max@#~Tuples~l,#/. 0->_]==1&

Experimente 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


1

05AB1E , 25 bytes

ZÌLsgãε©.Γü+}¨®š.S*˜O_}OΘ

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:

Z        # Get the flattened maximum of the (implicit) input (without popping)
 Ì       # Increase it by 2
  L      # Create a list in the range [1, max+2]
   sg    # Swap to get the input again, and get the length (amount of layers)
     ã   # Create a cartesian product of this list repeated that many times
ε        # Map each inner list to:
 ©       #  Store it in variable `®` (without popping)
       #  Collect all results until the following doesn't change anymore:
    ü    #   Get the pairwise:
     +   #    Sums
   }®š   #  After we've collected all, prepend the original list `®`
 .S      #  Now compare this potential pyramid with the (implicit) input-pyramid
         #  (-1 if a<b; 0 if a==b; 1 if a>b)
   *     #  Multiply that with the (implicit) input-pyramid
    ˜O   #  Then take the flattened sum
      _  #  And check that this sum equals 0 (1 if truhy; 0 if falsey)
}O       # After the map, take the sum to get the amount of truthy values
  Θ      # And trutify it (== 1), since we must output distinct values instead of truthy/falsey
         # (after which the result is output implicitly)

1
Falha em muitos casos fáceis . Parece que você está tentando usar a%b == 0como atalho a == b || a == 0, mas isso não funciona porque a pode ser um múltiplo de b.
Grimmy

Problema separado: o código retorna verdadeiro para casos como [[0,0],[0]], que têm infinitas soluções. Eu acho que mudar >para as Icorreções com sotaque correto isso.
Grimmy

1
@Grimy Corrigido usando em .S*vez de %, portanto, apenas +2 bytes.
Kevin Cruijssen 31/07/19

0

Haskell, 106 bytes

z=zipWith
a#b=a*b==a*a
f x=[1|t<-mapM(\_->[1..sum(sum<$>x)])x,all and$z(z(#))x$iterate(z(+)=<<tail)t]==[1]

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:

  • crie todas as camadas base possíveis 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 entrada
  • crie uma pirâmide a partir de t( iterate(z(+)=<<tail)t)
  • compare cada camada em termos de elementos com a entrada ( z(z(#))x). A função de comparação a # bretornará Truese os dois números forem iguais ou aforem zero ( a*b==a*a).
  • pegue uma 1para cada pirâmide que corresponda e compare a lista resultante com a lista de singleton [1].
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.