Étant donné une pyramide d'addition , déterminez si elle peut être résolue. Une pyramide d'addition se compose de couches , chacune ayant un nombre inférieur à celui en dessous. La couche est symbolisée par . est la couche de base et est la couche au sommet de . Le ème nombre de est noté . est le nombre le plus à gauche de , et est le nombre à droite de . Vous pouvez visualiser résidant au-dessus de et au milieu, d'où le nom "pyramide d'addition".
- , c'est-à-dire que chaque nombre dans la pyramide est un entier positif non nul.
- , c'est-à-dire que chaque nombre qui n'est pas sur la couche de base de la pyramide est la somme des deux nombres en dessous.
- Si a nombres, a nombres, donc est le nombre le plus à droite de . En termes plus simples, chaque couche a un numéro de moins que la couche en dessous.
Un puzzle pyramide d'addition est une pyramide d'addition dont certains nombres ont été supprimés (remplacés par ). Sa solution est une pyramide d'addition , où , c'est-à-dire que les nombres qui étaient initialement présents dans le puzzle sont restés inchangés. Un tel casse-tête peut avoir plus d'une solution.
Votre tâche consiste, compte tenu d'un casse-tête à pyramide supplémentaire, à déterminer s'il a exactement une solution.
Contribution
Vous pouvez obtenir des informations sous l'une des formes suivantes, mais soyez cohérent:
- Tableau de couches.
- Tableau de couches, en forme de pyramide utilisant une valeur entière non positive cohérente comme séparateur entre les éléments (utilisé une seule fois à chaque fois) ainsi qu'un remplissage gauche et droit. Le séparateur et le rembourrage doivent être identiques.
- Tableau de calques avec un remplissage droit ou gauche cohérent valide (vous devez être cohérent et ne pas mélanger le remplissage droit et gauche dans ce cas).
Veuillez noter qu'une valeur cohérente qui n'est pas un entier strictement positif doit être utilisée pour représenter un nombre manquant; cette valeur ne peut pas être utilisée comme remplissage. De plus, vous pouvez prendre les couches concaténées (vous pouvez toujours les séparer), et l'ordre peut être de la base vers le haut ou du haut vers la base.
Production
L'une des deux valeurs distinctes cohérentes, où l'une représente la présence d'une solution unique et l'autre l'absence d'une solution ou la présence de plusieurs solutions.
Règles
- Ne fais pas ces choses .
- Il s'agit de code-golf , donc la réponse la plus courte l'emporte! Cependant, ne laissez pas cela vous décourager de publier une solution simplement parce que votre langue est "trop verbeuse".
Cas de test
0
[[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
Exemples travaillés
Les cas de test sont travaillés ici.
Solution unique 1
Les étapes 5-6 sont similaires à 4.
Nous avons donc ici notre solution unique.
Solution unique 2
Étape 1: Il n'y a pas d'approche évidente ici, alors essayons d'utiliser les valeurs minimales possibles.
Étapes 2 à 5: il semble que les valeurs minimales aboutissent à une solution, c'est donc la seule solution et donc unique.
Astuce: Il y a un théorème sur les puzzles de pyramides d'addition liés à ce puzzle que vous pouvez prouver si vous réfléchissez suffisamment.
Solution unique 3
Il s'agit d'une solution évidemment unique.
Pas de solution 1
Pas de solution 2
Solution non unique
Deux solutions:
Puisqu'il y a au moins deux solutions, il n'y a pas de solution unique.
la source
Réponses:
Gelée ,
1816 octetsEssayez-le en ligne!
Un lien monadique qui prend la pyramide dans l'ordre inverse et renvoie 1 pour vrai et 0 pour faux. Génère toutes les pyramides possibles avec une base jusqu'au nombre maximum dans la pyramide et vérifie s'il existe une correspondance unique pour l'entrée.
Merci à @Arnauld d'avoir souligné que cela a échoué
[[1,0],[0]]
; maintenant corrigé.Merci à @JonathanAlan pour avoir économisé 2 octets!
Explication
la source
ṗ
du nombre maximum dans la grille avec la longueur de la base. Par exemple, si le nombre maximum était de 10 et la longueur de la base 4, il testerait tout de[1,1,1,1]
à[10,10,10,10]
, c'est- à -dire 10000 possibilités.[[0,0],[0]]
.‘
à ce»2
qui a également l'avantage de retrouver l'efficacité perdue avec mon dernier changement, mais au prix d'un octet....Ƭ€Ṗ€a@ċ⁼1
enregistre deux octets (sauf s'il y a des cas limites avec le ET non pris en compte par les tests?)C # (Visual C # Interactive Compiler) ,
303227 octetsLève une exception si vrai, s'exécute normalement si faux.
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
8588 octetsEssayez-le en ligne!
+3 fixe.
Force brute: pour toutes les bases avec des valeurs , voyez si la pyramide résultante correspond à la forme donnée, et vérifiez si le nombre total de correspondances est 1. Prend la saisie sous forme de liste de niveaux, base en premier, avec représentation des nombres manquants.
1..(sum of all numbers)
0
la source
05AB1E , 25 octets
Prend les couches pyramidales à l'envers, de la base à la pointe (c.-à-d
[[0,0,0,1],[0,2,0],[0,0],[10]]
.).En outre, il semble y avoir un bogue quelque part dans 05AB1E avec à l'
.Γ
intérieur d'une carte .. Le©...®š
devrait juste être...yš
pour -1 octet ..Essayez-le en ligne ou vérifiez quelques cas de test supplémentaires .
Une alternative mineure à octets égaux
©.ΓüO}®š
pourrait être[Ðg#üO}\)
: Essayez-la en ligne.Explication:
la source
a%b == 0
comme raccourci poura == b || a == 0
, mais cela ne fonctionne pas car a pourrait être un multiple de b.[[0,0],[0]]
, qui ont une infinité de solutions. Je pense que changer simplement>
lesI
correctifs correctement accentués ..S*
au lieu de%
, donc juste +2 octets.Haskell, 106 octets
Prend une pyramide à l'envers, par exemple
[[0,0,0,1],[0,2,0],[0,0],[10]]
.Essayez-le en ligne!
L'approche de la force brute à Haskell:
t
(mapM(\_->[1..sum(sum<$>x)])x
), où les nombres vont de 1 à la somme de tous les nombres dans la pyramide d'entréet
(iterate(z(+)=<<tail)t
)z(z(#))x
). La fonction de comparaisona # b
renvoieTrue
si les deux nombres sont égaux oua
sont nuls (a*b==a*a
).1
pour chaque pyramide qui correspond et comparer la liste résultante à la liste singleton[1]
.la source