Pascal's triangle/Puzzle: Difference between revisions

m
(→‎{{header|C}}: field solver method)
m (→‎{{header|Wren}}: Minor tidy)
 
(90 intermediate revisions by 43 users not shown)
Line 1:
{{task}}
 
This puzzle involves a [http://xunor.free.fr/en/riddles/auto/pyramidnb.php Pascals Triangle], also known as a [http://xunor.free.fr/en/riddles/auto/pyramidnb.php Pyramid of Numbers].
<pre>
Line 9 ⟶ 10:
</pre>
Each brick of the pyramid is the sum of the two bricks situated below it.<br>
Of the three missing numbers at the base of the pyramid, the middle one is the sum of the other two (that is, Y = X + Z).
the middle one is the sum of the other two (that is, Y = X + Z).
 
 
;Task:
Write a program to find a solution to this puzzle.
<br><br>
 
=={{header|11l}}==
{{trans|D}}
 
<syntaxhighlight lang="11l">F e(&x, row, col) -> &
R x[row * (row + 1) I/ 2 + col]
 
F iterate(&v, &diff, do_print = 1B)
V tot = 0.0
L
e(&v, 0, 0) = 151
e(&v, 2, 0) = 40
e(&v, 4, 1) = 11
e(&v, 4, 3) = 4
 
L(i) 1..4
L(j) 0..i
e(&diff, i, j) = 0
I j < i
e(&diff, i, j) += e(&v, i - 1, j) - e(&v, i, j + 1) - e(&v, i, j)
I j != 0
e(&diff, i, j) += e(&v, i - 1, j - 1) - e(&v, i, j - 1) - e(&v, i, j)
 
L(i) 1..3
L(j) 0.<i
e(&diff, i, j) += e(&v, i + 1, j) + e(&v, i + 1, j + 1) - e(&v, i, j)
 
e(&diff, 4, 2) += e(&v, 4, 0) + e(&v, 4, 4) - e(&v, 4, 2)
 
L(i) 0 .< v.len
v[i] += diff[i] / 4
 
tot = sum(diff.map(a -> a * a))
I do_print
print(‘dev: ’tot)
I tot < 0.1
L.break
 
V v = [0.0] * 15
V diff = [0.0] * 15
iterate(&v, &diff)
 
V idx = 0
L(i) 5
L(j) 0..i
print(‘#4’.format(Int(0.5 + v[idx])), end' I j < i {‘ ’} E "\n")
idx++</syntaxhighlight>
 
{{out}}
<pre>
dev: 73410
dev: 17968.6875
dev: 6388.46484375
dev: 2883.337402344
dev: 1446.593643188
...
dev: 0.136503592
dev: 0.125866452
dev: 0.116055273
dev: 0.107006115
dev: 0.098659977
151
81 70
40 41 29
16 24 17 12
5 11 13 4 8
</pre>
 
=={{header|Ada}}==
The solution makes an upward run symbolically, though excluding Z. After that two blocks (1,1) and (3,1) being known yield a 2x2 linear system, from which X and Y are determined. Finally each block is revisited and printed.
<langsyntaxhighlight lang="ada">with Ada.Text_IO; use Ada.Text_IO;
procedure Pyramid_of_Numbers is
Line 82 ⟶ 155:
end loop;
end loop;
end Pyramid_of_Numbers;</langsyntaxhighlight>
{{Out}}
Sample output:
<pre>
 
Line 92 ⟶ 165:
5 11 13 4 8
</pre>
 
=={{header|ALGOL 68}}==
{{works with|ALGOL 68|Standard - ''lu decomp'' and ''lu solve'' are from the [[ALGOL 68G]]/gsl library}}
{{works with|ALGOL 68G|Any - tested with release mk15-0.8b.fc9.i386}}
<!-- {{does not work with|ELLA ALGOL 68|Any (with appropriate job cards AND formatted transput statements removed) - tested with release 1.8.8d.fc9.i386 - ELLA has no FORMATted transput, and not }} -->
<langsyntaxhighlight lang="algol68">MODE
FIELD = REAL,
VEC = [0]REAL,
Line 191 ⟶ 265:
FOR var FROM 1 BY 2 TO 5 DO
printf(($5x$,$g$,puzzle[UPB puzzle][var],"=", real repr, solution[UPB puzzle][var]))
OD</langsyntaxhighlight>
{{Out}}
Output:
<pre>
(151.0)
Line 204 ⟶ 278:
=={{header|AutoHotkey}}==
The main part is this:
<langsyntaxhighlight lang="autohotkey">N1 := 11, N2 := 4, N3 := 40, N4 := 151
Z := (2*N4 - 7*N3 - 8*N2 + 6*N1) / 7
X := (N3 - 2*N1 - Z) / 2
MsgBox,, Pascal's Triangle, %X%`n%Z%</langsyntaxhighlight>
Message box shows:
<pre>5.000000
Line 214 ⟶ 288:
 
The GUI shows all values in the solved state.
<langsyntaxhighlight lang="autohotkey">;---------------------------------------------------------------------------
; Pascal's triangle.ahk
; by wolf_II
Line 487 ⟶ 561:
; delete status bar text
Else SB_SetText("")
}</langsyntaxhighlight>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<syntaxhighlight lang="bbcbasic"> INSTALL @lib$ + "ARRAYLIB"
REM Describe the puzzle as a set of simultaneous equations:
REM a + b = 151
REM a - c = 40
REM -b + c + d = 0
REM e + f = 40
REM -c + f + g = 0
REM -d + g + h = 0
REM e - x = 11
REM f - y = 11
REM g - y = 4
REM h - z = 4
REM x - y + z = 0
REM So we have 11 equations in 11 unknowns.
REM We can represent these equations as a matrix and a vector:
DIM matrix(10,10), vector(10)
matrix() = \ a, b, c, d, e, f, g, h, x, y, z
\ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
\ 1, 0,-1, 0, 0, 0, 0, 0, 0, 0, 0, \
\ 0,-1, 1, 1, 0, 0, 0, 0, 0, 0, 0, \
\ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, \
\ 0, 0,-1, 0, 0, 1, 1, 0, 0, 0, 0, \
\ 0, 0, 0,-1, 0, 0, 1, 1, 0, 0, 0, \
\ 0, 0, 0, 0, 1, 0, 0, 0,-1, 0, 0, \
\ 0, 0, 0, 0, 0, 1, 0, 0, 0,-1, 0, \
\ 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, 0, \
\ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,-1, \
\ 0, 0, 0, 0, 0, 0, 0, 0, 1,-1, 1
vector() = 151, 40, 0, 40, 0, 0, 11, 11, 4, 4, 0
REM Now solve the simultaneous equations:
PROC_invert(matrix())
vector() = matrix().vector()
PRINT "X = " ; vector(8)
PRINT "Y = " ; vector(9)
PRINT "Z = " ; vector(10)</syntaxhighlight>
{{Out}}
<pre>
X = 5
Y = 13
Z = 8
</pre>
 
=={{header|C}}==
{{incorrect|C|Displayed result seems wrong.}}
This solution is based upon algebraic necessities, namely that a solution exists when (top - 4(a+b))/7 is integral. It also highlights the type difference between floating point numbers and integers in C.
 
<syntaxhighlight lang="c">
<lang c>
/* Pascal's pyramid solver
*
Line 533 ⟶ 654:
return 0;
}
</syntaxhighlight>
</lang>
{{Out}}
Output:
<pre>
x: 35, y: 13, z: 108
</pre>
 
 
 
===Field equation solver===
Treating relations between cells as if they were differential equations, and apply negative feedback to each cell at every iteration step. This is how field equations with boundary conditions are solved numerically. It is, of course, not the optimal solution for this particular task.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
void show(int *x) {
int i, j;
 
#define E(x, row, col) x[(row) * ((row) + 1) / 2 + col]
void show(double *x)
{
int i = 0, j = 0;
for (i = 0; i < 5; i++)
for (j = 0; j <= i; j++)
printf("%4d%c", (int)(.5 + *(x++)), j < i ? ' ' : '\n');
}
 
inline int sign(int i)
void iterate(double *v, double *diff)
{
return i < 0 ? -1 : i > 0;
int i, j;
}
double sum;
 
redo:
int iter(int *v, int *diff) {
int sum, i, j, e = 0;
 
# define E(x, row, col) x[(row) * ((row) + 1) / 2 + (col)]
/* enforce boundary conditions */
E(v, 0, 0) = 151;
Line 568 ⟶ 695:
E(diff, i, j) = 0;
if (j < i)
E(diff, i, j) += E(v, i - 1, j) -
- E(v, i, j + 1) -
- E(v, i, j);
if (j)
if (j) E(diff, i, j) += E(v, i - 1, j - 1)
-E(diff, i, j) += E(v, i - 1, j - 1) -
- E(v, i, j - 1); -
E(v, i, j);
}
}
 
for (i = 0; i < 4; i++)
for (j = 0; j < i; j++)
E(diff, i, j) += E(v, i + 1, j) +
+ E(v, i + 1, j + 1) -
- E(v, i, j);
 
E(diff, 4, 2) += E(v, 4, 0) + E(v, 4, 4) - E(v, 4, 2);
# undef E
 
/* doDo feedback, check if we are close enoughdone. */
for (i = 0, sum = 0; i < 15; i++) {
sum += !!sign(e = diff[i]);
v[i] += diff[i] / 4; /* 4: scale down the feedback to avoid oscillations */
sum += diff[i] * diff[i];
}
printf("dev: %g\n", sum);
if (sum < .1) return;
 
/* 1/5-ish feedback strength on average. These numbers are highly
goto redo;
magical, depending on nodes' connectivities. */
if (e >= 4 || e <= -4) v[i] += e/5;
else if (rand() < RAND_MAX/4) v[i] += sign(e);
}
return sum;
}
 
int main() {
int v[15] = { 0 }, diff[15] = { 0 }, i, s;
{
 
double v[15] = {0}, diff[15] = {0};
for (i = s = 1; s; i++) {
iterate(v, diff);
s = iter(v, diff);
printf("pass %d: %d\n", i, s);
}
show(v);
 
return 0;
}</syntaxhighlight>
}</lang>output<lang>dev: 73410
{{Out}}<pre>pass 1: 12
dev: 17968.7
pass 2: 12
dev: 6388.46
pass 3: 14
dev: 2883.34
pass 4: 14
...<about a million and half iterations later>...
...
dev: 0.116055
pass 113: 4
dev: 0.107006
pass 114: 7
dev: 0.09866
pass 115: 0
151
81 70
40 41 29
16 24 17 12
5 11 13 4 8</pre>
 
</lang>
=={{header|C sharp|C#}}==
<syntaxhighlight lang="c sharp">
using System;
 
namespace Pyramid_of_Numbers
{
class Program
{
public static void Main(string[] args)
{
// Set console properties
Console.Title = " Pyramid of Numbers / Pascal's triangle Puzzle";
Console.SetBufferSize(80,1000);
Console.SetWindowSize(80,60);
Console.ForegroundColor = ConsoleColor.Green;
 
// Main Program Loop
ConsoleKeyInfo k = new ConsoleKeyInfo('Y', ConsoleKey.Y,true,true,true);
while (k.Key == ConsoleKey.Y)
{
Console.Clear();
Console.WriteLine("----------------------------------------------");
Console.WriteLine(" Pyramid of Numbers / Pascal's triangle Puzzle");
Console.WriteLine("----------------------------------------------");
Console.WriteLine();
 
//
// Declare new Pyramid array
//
int r = 5;// Number of rows
int [,] Pyramid = new int[r,r];
// Set initial Pyramid values
for (int i = 0; i < r; i++)
{
for(int j = 0; j < r; j++)
{
Pyramid[i,j] = 0;
}
}
// Show info on created array
Console.WriteLine(" Pyramid has " + r + " rows");
Console.WriteLine("--------------------------------------------");
// Enter Pyramid values
for(int i = 0; i <= r-1; i++)
{
Console.WriteLine(" Enter " + (i+1).ToString() + ". row values:");
Console.WriteLine("--------------------------------------------");
for(int j = 0; j < i+1; j++)
{
Console.Write(" " + (j+1).ToString() + ". value = ");
int v = int.Parse(Console.ReadLine());
Pyramid[i,j] = v;
}
Console.WriteLine("--------------------------------------------");
}
//
// Show initial Pyramid values
//
Console.WriteLine();
Console.WriteLine(" Initial Pyramid Values ");
Console.WriteLine();
// Show Pyramid values
for(int i = 0; i <= r-1; i++)
{
for(int j = 0; j < i+1; j++)
{
Console.Write("{0,4}",Pyramid[i,j]);
}
Console.WriteLine();
}
Console.WriteLine("--------------------------------------------");
// Find solution
Solve_Pyramid(Pyramid);
Console.WriteLine();
Console.Write(" Start new calculation <Y/N> . . . ");
k = Console.ReadKey(true);
}
}
//
// Solve Function
//
public static void Solve_Pyramid(int [,] Pyramid)
{
int r = 5; // Number of rows
// Calculate Y
int a = Pyramid[r-1,1];
int b = Pyramid[r-1,3];
int c = Pyramid[0,0];
int y = (c - (4*a) - (4*b))/7;
Pyramid[r-1,2] = y;
// Create copy of Pyramid
int [,] Pyramid_Copy = new int[r,r];
Array.Copy(Pyramid,Pyramid_Copy,r*r);
int n = 0; // solution counter
for(int x = 0; x < y + 1; x++)
{
for(int z = 0; z < y + 1; z++)
{
if( (x+z) == y)
{
Pyramid[r-1,0] = x;
Pyramid[r-1,r-1] = z;
// Recalculate Pyramid values
for(int i = r-1; i > 0; i--)
{
for(int j = 0; j < i; j++)
{
Pyramid[i-1,j] = Pyramid[i,j]+Pyramid[i,j+1];
}
}
// Compare Pyramid values
bool solved = true;
for(int i = 0; i < r-1; i++)
{
for(int j = 0; j < i+1; j++)
{
if(Pyramid_Copy[i,j]>0)
{
if(Pyramid[i,j] != Pyramid_Copy[i,j])
{
solved = false;
i = r;
break;
}
}
}
}
if(solved)
{
n++;
Console.WriteLine();
Console.WriteLine(" Solved Pyramid Values no." + n);
Console.WriteLine();
// Show Pyramid values
for(int i = 0; i <= r-1; i++)
{
for(int j = 0; j < i+1; j++)
{
Console.Write("{0,4}",Pyramid[i,j]);
}
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine(" X = " + Pyramid[r-1,0] + " " +
" Y = " + Pyramid[r-1,2] + " " +
" Z = " + Pyramid[r-1,4]);
Console.WriteLine();
Console.WriteLine("--------------------------------------------");
}
Array.Copy(Pyramid_Copy,Pyramid,r*r);
}
}
}
if(n == 0)
{
Console.WriteLine();
Console.WriteLine(" Pyramid has no solution ");
Console.WriteLine();
}
}
}
}
</syntaxhighlight>
{{out| Program Input and Output}}
<pre>
 
----------------------------------------------
Pyramid of Numbers / Pascal's triangle Puzzle
----------------------------------------------
 
Pyramid has 5 rows
--------------------------------------------
Enter 1. row values:
--------------------------------------------
1. value = 151
--------------------------------------------
Enter 2. row values:
--------------------------------------------
1. value = 0
2. value = 0
--------------------------------------------
Enter 3. row values:
--------------------------------------------
1. value = 40
2. value = 0
3. value = 0
--------------------------------------------
Enter 4. row values:
--------------------------------------------
1. value = 0
2. value = 0
3. value = 0
4. value = 0
--------------------------------------------
Enter 5. row values:
--------------------------------------------
1. value = 0
2. value = 11
3. value = 0
4. value = 4
5. value = 0
--------------------------------------------
 
Initial Pyramid Values
 
151
0 0
40 0 0
0 0 0 0
0 11 0 4 0
--------------------------------------------
 
Solved Pyramid Values no.1
 
151
81 70
40 41 29
16 24 17 12
5 11 13 4 8
 
X = 5 Y = 13 Z = 8
 
--------------------------------------------
 
Start new calculation <Y/N> . . .
 
 
</pre>
 
=={{header|C++}}==
{{trans|C}}
<syntaxhighlight lang="cpp">#include <iostream>
#include <iomanip>
 
inline int sign(int i) {
return i < 0 ? -1 : i > 0;
}
 
inline int& E(int *x, int row, int col) {
return x[row * (row + 1) / 2 + col];
}
 
int iter(int *v, int *diff) {
// enforce boundary conditions
E(v, 0, 0) = 151;
E(v, 2, 0) = 40;
E(v, 4, 1) = 11;
E(v, 4, 3) = 4;
 
// calculate difference from equilibrium
for (auto i = 1u; i < 5u; i++)
for (auto j = 0u; j <= i; j++) {
E(diff, i, j) = 0;
if (j < i)
E(diff, i, j) += E(v, i - 1, j) - E(v, i, j + 1) - E(v, i, j);
if (j)
E(diff, i, j) += E(v, i - 1, j - 1) - E(v, i, j - 1) - E(v, i, j);
}
 
for (auto i = 0u; i < 4u; i++)
for (auto j = 0u; j < i; j++)
E(diff, i, j) += E(v, i + 1, j) + E(v, i + 1, j + 1) - E(v, i, j);
 
E(diff, 4, 2) += E(v, 4, 0) + E(v, 4, 4) - E(v, 4, 2);
 
// do feedback, check if we are done
uint sum;
int e = 0;
for (auto i = sum = 0u; i < 15u; i++) {
sum += !!sign(e = diff[i]);
 
// 1/5-ish feedback strength on average. These numbers are highly magical, depending on nodes' connectivities
if (e >= 4 || e <= -4)
v[i] += e / 5;
else if (rand() < RAND_MAX / 4)
v[i] += sign(e);
}
return sum;
}
 
void show(int *x) {
for (auto i = 0u; i < 5u; i++)
for (auto j = 0u; j <= i; j++)
std::cout << std::setw(4u) << *(x++) << (j < i ? ' ' : '\n');
}
 
int main() {
int v[15] = { 0 }, diff[15] = { 0 };
for (auto i = 1u, s = 1u; s; i++) {
s = iter(v, diff);
std::cout << "pass " << i << ": " << s << std::endl;
}
show(v);
 
return 0;
}</syntaxhighlight>
 
=={{header|Clojure}}==
 
X and Z are the independent variables, so first work bottom up and determine the value of each cell in the form (n0 + n1*X + n2*Z). We'll use a vector [n0 n1 n2] to represent each cell.
We'll use a vector [n0 n1 n2] to represent each cell.
<lang clojure>(def bottom [ [0 1 0], [11 0 0], [0 1 1], [4 0 0], [0 0 1] ])
<syntaxhighlight lang="clojure">(def bottom [ [0 1 0], [11 0 0], [0 1 1], [4 0 0], [0 0 1] ])
 
(defn plus [v1 v2] (vec (map + v1 v2)))
Line 628 ⟶ 1,086:
(defn above [row] (map #(apply plus %) (partition 2 1 row)))
 
(def rows (reverse (take 5 (iterate above bottom))))</langsyntaxhighlight>
We know the integer value of cells c00 and c20 ( base-0 row then column numbers), so by subtracting these values we get two equations of the form 0=n0+n1*X+n2*Z.
<langsyntaxhighlight lang="clojure">(def c00 (get-in rows [0 0]))
(def c20 (get-in rows [2 0]))
 
(def eqn0 (minus c00 [151 0 0]))
(def eqn1 (minus c20 [ 40 0 0]))</langsyntaxhighlight>
In this case, there are only two variables, so solving the system of linear equations is simple.
<langsyntaxhighlight lang="clojure">(defn solve [m]
(assert (<= 1 m 2))
(let [n (- 3 m)
Line 646 ⟶ 1,104:
 
(let [x (solve 1), z (solve 2), y (+ x z)]
(println "x =" x ", y =" y ", z =" z))</langsyntaxhighlight>
If you want to solve the whole pyramid, just add a call ''(show-pyramid x z)'' to the previous ''let'' form:
<langsyntaxhighlight lang="clojure">(defn dot [v1 v2] (reduce + (map * v1 v2)))
 
(defn show-pyramid [x z]
(doseq [row rows]
(println (map #(dot [1 x z] %) row)))</langsyntaxhighlight>
=={{header|Go}}==
'''Preferred solution'''
 
=={{header|Craft Basic}}==
The following solution is based on several observations on the task:
<syntaxhighlight lang="basic">let x = -1
 
do
* The task does not ask for solutions to any generalization of the problem, only this one problem.
* The (twice) linked reference in the task description similarly does not describe any generalizations, but only this one problem.
* The talk page notes that intermediate work need not be coded, and indeed, a number of existing solutions do intermediate work.
* The entire problem is solvable with elementary algebra, thus a decision to actually code any part of the problem is arbitrary.
* Any part coded is not only done frivolously, but represents unnecessary chances for errors.
* Skills needed to develop this solution are prerequisite to any other solution. No other solution is easier.
* The task does not specify program output. This program provides the solution to the problem in a form that is clear to anyone wishing to further adapt the program to their needs.
<lang go>package main
 
let x = x + 1
func main() {
let z = 0
// bottom row given: [X] [11] [Y] [4] [Z]
 
do
// given sum relation of bricks,
// next row up: [x+11] [y+11] [y+4] [z+4]
// middle row: [x+y+22] [2y+15] [y+z+8]
 
let e = x + 11
// given brick=40 and relation y=x+z,
let f = 11 + (x + z)
// middle row: [40] [2y+15] [3y-10]
let g = (x + z) + 4
let h = 4 + z
 
if e + f = 40 then
// continuing sum relation of bricks,
// next row up: [2y+55] [5y+5]
// top brick: [7y+60]
 
let c = f + g
// given top brick = 151,
let d = g + h
// 7y = 91: y = 13
let a = 40 + c
// x + y = 18: x = 5
let b = c + d
// z = y - x: z = 8
let q = 0
}</lang>
'''Alternative solution'''
 
if a + b = 151 then
Showing a possible data representation of the problem, using the computer to do some arithmetic, and displaying intermediate and final results.
 
<lang go>package main
let q = 1
 
endif
 
endif
 
if q = 0 then
 
let z = z + 1
 
endif
 
wait
 
loopwhile z < 20 and q = 0
 
if q = 0 then
 
let z = -1
 
endif
 
wait
 
loopuntil z >= 0
 
print "x = ", x
print "y = ", x + z
print "z = ", z</syntaxhighlight>
{{out| Output}}<pre>x = 5
y = 13
z = 8</pre>
 
=={{header|Curry}}==
{{Works with|PAKCS}}
<syntaxhighlight lang="curry">import CLPFD
import Constraint (allC, andC)
import Findall (findall)
import List (init, last)
 
 
solve :: [[Int]] -> Success
solve body@([n]:rest) =
domain (concat body) 1 n
& andC (zipWith atop body rest)
& labeling [] (concat body)
where
xs `atop` ys = andC $ zipWith3 tri xs (init ys) (tail ys)
 
tri :: Int -> Int -> Int -> Success
tri x y z = x =# y +# z
 
test (x,y,z) | tri y x z =
[ [151]
, [ _, _]
, [40, _, _]
, [ _, _, _, _]
, [ x, 11, y, 4, z]
]
main = findall $ solve . test</syntaxhighlight>
{{Out}}
<pre>Execution time: 0 msec. / elapsed: 0 msec.
[(5,13,8)]</pre>
 
=={{header|D}}==
{{trans|C}}
<syntaxhighlight lang="d">import std.stdio, std.algorithm;
 
void iterate(bool doPrint=true)(double[] v, double[] diff) @safe {
static ref T E(T)(T[] x, in size_t row, in size_t col)
pure nothrow @safe @nogc {
return x[row * (row + 1) / 2 + col];
}
 
double tot = 0.0;
do {
// Enforce boundary conditions.
E(v, 0, 0) = 151;
E(v, 2, 0) = 40;
E(v, 4, 1) = 11;
E(v, 4, 3) = 4;
 
// Calculate difference from equilibrium.
foreach (immutable i; 1 .. 5) {
foreach (immutable j; 0 .. i + 1) {
E(diff, i, j) = 0;
if (j < i)
E(diff, i, j) += E(v, i - 1, j) - E(v, i, j + 1) - E(v, i, j);
if (j)
E(diff, i, j) += E(v, i - 1, j - 1) - E(v, i, j - 1) - E(v, i, j);
}
}
 
foreach (immutable i; 1 .. 4)
foreach (immutable j; 0 .. i)
E(diff, i, j) += E(v, i + 1, j) + E(v, i + 1, j + 1) - E(v, i, j);
 
E(diff, 4, 2) += E(v, 4, 0) + E(v, 4, 4) - E(v, 4, 2);
 
// Do feedback, check if we are close enough.
// 4: scale down the feedback to avoid oscillations.
v[] += diff[] / 4;
tot = diff.map!q{ a ^^ 2 }.sum;
 
static if (doPrint)
writeln("dev: ", tot);
 
// tot(dx^2) < 0.1 means each cell is no more than 0.5 away
// from equilibrium. It takes about 50 iterations. After
// 700 iterations tot is < 1e-25, but that's overkill.
} while (tot >= 0.1);
}
 
void main() {
static void show(in double[] x) nothrow @nogc {
int idx;
foreach (immutable i; 0 .. 5)
foreach (immutable j; 0 .. i+1) {
printf("%4d%c", cast(int)(0.5 + x[idx]), j < i ? ' ' : '\n');
idx++;
}
}
 
double[15] v = 0.0, diff = 0.0;
iterate(v, diff);
show(v);
}</syntaxhighlight>
{{out}}
<pre>dev: 73410
dev: 17968.7
dev: 6388.46
dev: 2883.34
dev: 1446.59
dev: 892.753
dev: 564.678
[... several more iterations...]
dev: 0.136504
dev: 0.125866
dev: 0.116055
dev: 0.107006
dev: 0.0986599
151
81 70
40 41 29
16 24 17 12
5 11 13 4 8</pre>
 
=={{header|F_Sharp|F#}}==
<p>In a script, using the [http://numerics.mathdotnet.com/ Math.NET Numerics] library</p>
<syntaxhighlight lang="fsharp">
#load"Packages\MathNet.Numerics.FSharp\MathNet.Numerics.fsx"
 
open MathNet.Numerics.LinearAlgebra
 
let A = matrix [
[ 1.; 1.; 0.; 0.; 0.; 0.; 0.; 0.; 0.; 0.; 0. ]
[ -1.; 0.; 1.; 0.; 0.; 0.; 0.; 0.; 0.; 0.; 0. ]
[ 0.; -1.; 1.; 1.; 0.; 0.; 0.; 0.; 0.; 0.; 0. ]
[ 0.; 0.; 0.; 0.; 1.; 1.; 0.; 0.; 0.; 0.; 0. ]
[ 0.; 0.; -1.; 0.; 0.; 1.; 1.; 0.; 0.; 0.; 0. ]
[ 0.; 0.; 0.; -1.; 0.; 0.; 1.; 1.; 0.; 0.; 0. ]
[ 0.; 0.; 0.; 0.; -1.; 0.; 0.; 0.; 1.; 0.; 0. ]
[ 0.; 0.; 0.; 0.; 0.; -1.; 0.; 0.; 0.; 1.; 0. ]
[ 0.; 0.; 0.; 0.; 0.; 0.; -1.; 0.; 0.; 1.; 0. ]
[ 0.; 0.; 0.; 0.; 0.; 0.; 0.; -1.; 0.; 0.; 1. ]
[ 0.; 0.; 0.; 0.; 0.; 0.; 0.; 0.; 1.; -1.; 1. ]
]
 
let b = vector [151.; -40.; 0.; 40.; 0.; 0.; -11.; -11.; -4.; -4.; 0.]
 
let x = A.Solve(b)
 
printfn "x = %f, Y = %f, Z = %f" x.[8] x.[9] x.[10]</syntaxhighlight>
{{out}}
<pre>x = 5.000000, Y = 13.000000, Z = 8.000000</pre>
 
=={{header|Factor}}==
{{works with|Factor|0.98}}
<syntaxhighlight lang="factor">USING: arrays backtrack combinators.extras fry grouping.extras
interpolate io kernel math math.ranges sequences ;
 
: base ( ?x ?z -- seq ) 2dup + swap '[ _ 11 _ 4 _ ] >array ;
 
: up ( seq -- seq' ) [ [ + ] 2clump-map ] twice ;
 
: find-solution ( -- x z )
10 [1,b] dup [ amb-lazy ] bi@ 2dup base
up dup first 40 = must-be-true
up first 151 = must-be-true ;
 
find-solution [I X = ${1}, Z = ${}I] nl</syntaxhighlight>
{{out}}
<pre>
X = 5, Z = 8
</pre>
 
=={{header|FreeBASIC}}==
{{trans|PureBasic}}
<syntaxhighlight lang="freebasic">Function SolveForZ(x As Integer) As Integer
Dim As Integer a, b, c, d, e, f, g, h, z
For z = 0 To 20
e = x + 11
f = 11 + (x+z)
g = (x+z) + 4
h = 4 + z
If e + f = 40 Then
c = f + g
d = g + h
a = 40 + c
b = c + d
If a + b = 151 Then Return z
End If
Next z
Return -1
End Function
 
Dim As Integer x = -1, z = 0
Do
x = x + 1
z = SolveForZ(x)
Loop Until z >= 0
 
Print "X ="; x
Print "Y ="; x + z
Print "Z ="; z
Sleep
</syntaxhighlight>
{{out}}
<pre>X = 5
Y = 13
Z = 8</pre>
 
 
=={{header|Go}}==
This solution follows the way the problem might be solved with pencil and paper. It shows a possible data representation of the problem, uses the computer to do some arithmetic, and displays intermediate and final results.
<syntaxhighlight lang="go">package main
 
import "fmt"
Line 822 ⟶ 1,505:
fmt.Println("y =", solveY(y))
fmt.Println("z =", solveZ(z))
}</langsyntaxhighlight>
{{Out}}
Output:
<pre>
bottom row: [{1 0 0 0} {0 0 0 11} {0 1 0 0} {0 0 0 4} {0 0 1 0}]
Line 845 ⟶ 1,528:
I assume the task is to solve any such puzzle, i.e. given some data
 
<langsyntaxhighlight lang="haskell">puzzle = [["151"],["",""],["40","",""],["","","",""],["X","11","Y","4","Z"]]</langsyntaxhighlight>
 
one should calculate all possible values that fit. That just means solving a linear system of equations. We use the first three variables as placeholders for ''X'', ''Y'' and ''Z''. Then we can produce the matrix of equations:
 
<langsyntaxhighlight lang="haskell">triangle n = n * (n+1) `div` 2
 
coeff xys x = maybe 0 id $ lookup x xys
Line 877 ⟶ 1,560:
eqs = eqXYZ n ++ eqPyramid n h ++ eqConst n fields
h = length puzzle
n = length fields</langsyntaxhighlight>
 
To solve the system, any linear algebra library will do (e.g [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hmatrix-0.2.0.0 hmatrix]). For this example, we assume there are functions ''decompose'' for LR-decomposition, ''kernel'' to solve the homogenous system and ''solve'' to find a special solution for an imhomogenous system. Then
 
<langsyntaxhighlight lang="haskell">normalize :: [Rational] - [Integer]
normalize xs = [numerator (x * v) | x <- xs] where
v = fromInteger $ foldr1 lcm $ map denominator $ xs
Line 890 ⟶ 1,573:
answer = case solve 0 lr a of
Nothing - []
Just x - x : kernel lr</langsyntaxhighlight>
 
will output one special solution and modifications that lead to more solutions, as in
 
<langsyntaxhighlight lang="haskell">*Main run puzzle
[[151,81,70,40,41,29,16,24,17,12,5,11,13,4,8]]
*Main run [[""],["2",""],["X","Y","Z"]]
[[3,2,1,1,1,0],[3,0,3,-1,1,2]]</langsyntaxhighlight>
 
so for the second puzzle, not only X=1 Y=1 Z=0 is a solution, but also X=1-1=0, Y=1+1=2 Z=0+2=2 etc.
but also X=1-1=0, Y=1+1=2 Z=0+2=2 etc.
 
Note that the program doesn't attempt to verify that the puzzle is in correct form.
Line 907 ⟶ 1,591:
Fixed points in the pyramid are 40 and 151, which I use to check a resulting pyramid for selection:
 
<langsyntaxhighlight lang="j">chk=:40 151&-:@(2 4{{."1)</langsyntaxhighlight>
 
verb for the base of the pyramid:
 
<langsyntaxhighlight lang="j">base=: [,11,+,4,]</langsyntaxhighlight>
 
the height of the pyramid:
 
<langsyntaxhighlight lang="j">ord=:5</langsyntaxhighlight>
 
=> 'chk', 'base' and 'ord' are the knowledge rules abstracted from the problem definition.
Line 921 ⟶ 1,605:
The J-sentence that solves the puzzle is:
 
<langsyntaxhighlight lang="j"> |."2(#~chk"2) 2(+/\)^:(<ord)"1 base/"1>,{ ;~i:28</langsyntaxhighlight>
<pre> 151 0 0 0 0
81 70 0 0 0
Line 930 ⟶ 1,614:
Get rid of zeros:
<langsyntaxhighlight lang="j">,.(1+i.5)<@{."0 1{.|."2(#~chk"2) 2(+/\)^:(<ord)"1 base/"1>,{ ;~i:28</langsyntaxhighlight>
or
<langsyntaxhighlight lang="j">,.(<@{."0 1~1+i.@#){.|."2(#~chk"2) 2(+/\)^:(<ord)"1 base/"1>,{ ;~i:28</langsyntaxhighlight>
 
<pre> +-----------+
Line 946 ⟶ 1,630:
+-----------+</pre>
 
=={{header|MathematicaJava}}==
 
Generate 11 equations and 11 unknowns. Reuse code from Cramer's Rule.
 
<syntaxhighlight lang="java">
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class PascalsTrianglePuzzle {
 
public static void main(String[] args) {
Matrix mat = new Matrix(Arrays.asList(1d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, -1d, 0d, 0d),
Arrays.asList(0d, 1d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, -1d, 0d),
Arrays.asList(0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, -1d, 1d, -1d),
Arrays.asList(0d, 0d, 1d, 0d, 0d, 0d, 0d, 0d, 0d, -1d, 0d),
Arrays.asList(0d, 0d, 0d, 1d, 0d, 0d, 0d, 0d, 0d, 0d, -1d),
Arrays.asList(1d, 1d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d, 0d),
Arrays.asList(0d, 1d, 1d, 0d, -1d, 0d, 0d, 0d, 0d, 0d, 0d),
Arrays.asList(0d, 0d, 1d, 1d, 0d, -1d, 0d, 0d, 0d, 0d, 0d),
Arrays.asList(0d, 0d, 0d, 0d, -1d, 0d, 1d, 0d, 0d, 0d, 0d),
Arrays.asList(0d, 0d, 0d, 0d, 1d, 1d, 0d, -1d, 0d, 0d, 0d),
Arrays.asList(0d, 0d, 0d, 0d, 0d, 0d, 1d, 1d, 0d, 0d, 0d));
List<Double> b = Arrays.asList(11d, 11d, 0d, 4d, 4d, 40d, 0d, 0d, 40d, 0d, 151d);
List<Double> solution = cramersRule(mat, b);
System.out.println("Solution = " + cramersRule(mat, b));
System.out.printf("X = %.2f%n", solution.get(8));
System.out.printf("Y = %.2f%n", solution.get(9));
System.out.printf("Z = %.2f%n", solution.get(10));
}
private static List<Double> cramersRule(Matrix matrix, List<Double> b) {
double denominator = matrix.determinant();
List<Double> result = new ArrayList<>();
for ( int i = 0 ; i < b.size() ; i++ ) {
result.add(matrix.replaceColumn(b, i).determinant() / denominator);
}
return result;
}
private static class Matrix {
private List<List<Double>> matrix;
@Override
public String toString() {
return matrix.toString();
}
@SafeVarargs
public Matrix(List<Double> ... lists) {
matrix = new ArrayList<>();
for ( List<Double> list : lists) {
matrix.add(list);
}
}
public Matrix(List<List<Double>> mat) {
matrix = mat;
}
public double determinant() {
if ( matrix.size() == 1 ) {
return get(0, 0);
}
if ( matrix.size() == 2 ) {
return get(0, 0) * get(1, 1) - get(0, 1) * get(1, 0);
}
double sum = 0;
double sign = 1;
for ( int i = 0 ; i < matrix.size() ; i++ ) {
sum += sign * get(0, i) * coFactor(0, i).determinant();
sign *= -1;
}
return sum;
}
private Matrix coFactor(int row, int col) {
List<List<Double>> mat = new ArrayList<>();
for ( int i = 0 ; i < matrix.size() ; i++ ) {
if ( i == row ) {
continue;
}
List<Double> list = new ArrayList<>();
for ( int j = 0 ; j < matrix.size() ; j++ ) {
if ( j == col ) {
continue;
}
list.add(get(i, j));
}
mat.add(list);
}
return new Matrix(mat);
}
 
private Matrix replaceColumn(List<Double> b, int column) {
List<List<Double>> mat = new ArrayList<>();
for ( int row = 0 ; row < matrix.size() ; row++ ) {
List<Double> list = new ArrayList<>();
for ( int col = 0 ; col < matrix.size() ; col++ ) {
double value = get(row, col);
if ( col == column ) {
value = b.get(row);
}
list.add(value);
}
mat.add(list);
}
return new Matrix(mat);
}
 
private double get(int row, int col) {
return matrix.get(row).get(col);
}
}
 
}
</syntaxhighlight>
 
{{out}}
<pre>
Solution = [16.0, 24.0, 17.0, 12.0, 41.0, 29.0, 81.0, 70.0, 5.0, 13.0, 8.0]
X = 5.00
Y = 13.00
Z = 8.00
</pre>
 
=={{header|jq}}==
{{works with|jq}}
'''Also works with gojq, the Go implementation of jq, and with fq.'''
 
In the spirit of the simplicity of Pascal Triangle's definition, the
first solution given in this entry works up from the bottom of the triangle using the
basic Pascal Triangle equation for each brick that is above two
others.
 
In the following, the value of the j-th brick in the i-th row is
denoted by rij if initially known (so r11 refers to the apex), and by
$Rij if initially unknown, so the variable "X" in the puzzle
could be denoted by $R51.
 
It is assumed that:
* all values in the triangle must be positive integers;
* the task is to solve for any given values of r11, r31, r52, r54;
* all solutions for the triple [X, Y, Z] should be found.
<syntaxhighlight lang=jq>
def solve(r11; r31; r52; r54):
range(1;r31 - 1) as $X
| range(1; r31 - 1) as $Y
| (($Y - $X) | select(. > 0)) as $Z
| (r52 + $X) as $R41
| (r52 + $Y) as $R42
| select($R41 + $R42 == r31)
| ($Y + r54) as $R43
| (r54 + $Z) as $R44
| ($R42 + $R43) as $R32
| ($R43 + $R44) as $R33
| (r31 + $R32) as $R21
| ($R32 + $R33) as $R22
| select($R21 + $R22 == r11)
| [$X, $Y, $Z];
solve(151; 40; 11; 4),
</syntaxhighlight>
{{output}}
<pre>
[5,13,8]
</pre>
===Algebraic solution===
As noted elsewhere on this page, elementary considerations show that
the apex (top) value and the value in the third row (mid) can be written as:
<pre>
top = 4(a+b) + 7(x+z)
mid = 2x + 2a + z
</pre>
where a and b are the known values at the base.
 
Using the jq program at [[Cramer%27s_rule#jq|Cramer's rule]], with the unknown vector being [x, z]:
<syntaxhighlight lang=jq>
include "rc-cramers-rule";
def solve(top; mid; a; b):
cramer(
[ [7, 7],
[2, 1]];
[top - 4*(a+b), mid-2*a]);
 
solve(151; 40; 11; 4)
</syntaxhighlight>
This gives the solution for [x,z] as:
{{output}}
<pre>
[5,8]
</pre>
 
=={{header|Julia}}==
{{trans|Kotlin}}
<syntaxhighlight lang="julia">function pascal(a::Integer, b::Integer, mid::Integer, top::Integer)
yd = round((top - 4 * (a + b)) / 7)
!isinteger(yd) && return 0, 0, 0
y = Int(yd)
x = mid - 2a - y
return x, y, y - x
end
 
x, y, z = pascal(11, 4, 40, 151)
if !iszero(x)
println("Solution: x = $x, y = $y, z = $z.")
else
println("There is no solution.")
end</syntaxhighlight>
 
{{out}}
<pre>Solution: x = 5, y = 13, z = 8.</pre>
 
=={{header|Kotlin}}==
{{trans|C}}
<syntaxhighlight lang="scala">// version 1.1.3
 
data class Solution(val x: Int, val y: Int, val z: Int)
 
fun Double.isIntegral(tolerance: Double = 0.0) =
(this - Math.floor(this)) <= tolerance || (Math.ceil(this) - this) <= tolerance
 
fun pascal(a: Int, b: Int, mid: Int, top: Int): Solution {
val yd = (top - 4 * (a + b)) / 7.0
if (!yd.isIntegral(0.0001)) return Solution(0, 0, 0)
val y = yd.toInt()
val x = mid - 2 * a - y
return Solution(x, y, y - x)
}
 
fun main(args: Array<String>) {
val (x, y, z) = pascal(11, 4, 40, 151)
if (x != 0)
println("Solution is: x = $x, y = $y, z = $z")
else
println("There is no solutuon")
}</syntaxhighlight>
 
{{out}}
<pre>
Solution is: x = 5, y = 13, z = 8
</pre>
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">
sys := {22 + x + y = 40, 78 + 5*y + z = 151, x + z = y}:
solve(sys, {x,y,z});
</syntaxhighlight>
{{out}}<pre>
{x = 5, y = 13, z = 8}
</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
We assign a variable to each block starting on top with a, then on the second row b,c et cetera. k,m, and o are replaced by X, Y, and Z. We can write the following equations:
<langsyntaxhighlight Mathematicalang="mathematica">b+c==a
d+e==b
e+f==c
Line 958 ⟶ 1,896:
n+Y==i
n+Z==j
X+Z==Y</langsyntaxhighlight>
And we have the knowns
<langsyntaxhighlight Mathematicalang="mathematica">a->151
d->40
l->11
n->4</langsyntaxhighlight>
Giving us 10 equations with 10 unknowns; i.e. solvable. So we can do so by:
<langsyntaxhighlight Mathematicalang="mathematica">eqs={a==b+c,d+e==b,e+f==c,g+h==d,h+i==e,i+j==f,l+X==g,l+Y==h,n+Y==i,n+Z==j,Y==X+Z};
knowns={a->151,d->40,l->11,n->4};
Solve[eqs/.knowns,{b,c,e,f,g,h,i,j,X,Y,Z}]</langsyntaxhighlight>
gives back:
<langsyntaxhighlight Mathematicalang="mathematica">{{b -> 81, c -> 70, e -> 41, f -> 29, g -> 16, h -> 24, i -> 17, j -> 12, X -> 5, Y -> 13, Z -> 8}}</langsyntaxhighlight>
In pyramid form that would be:
<langsyntaxhighlight Mathematicalang="mathematica"> 151
81 70
40 41 29
16 24 17 12
5 11 13 4 8</langsyntaxhighlight>
 
An alternative solution in Mathematica 10, constructing the triangle:
<syntaxhighlight lang="mathematica">triangle[n_, m_] := Nest[MovingMap[Total, #, 1] &, {x, 11, y, 4, z}, n - 1][[m]]
Solve[{triangle[3, 1] == 40, triangle[5, 1] == 151, y == x + z}, {x, y, z}]</syntaxhighlight>
Three equations and three unknowns, which gives back:
<syntaxhighlight lang="mathematica">{{x -> 5, y -> 13, z -> 8}}</syntaxhighlight>
 
=={{header|MiniZinc}}==
<syntaxhighlight lang="minizinc">
%Pascal's Triangle Puzzle. Nigel Galloway, February 17th., 2020
int: N11=151; constraint N11=N21+N22;
var 1..N11: N21=N31+N32;
var 1..N11: N22=N32+N33;
int: N31=40; constraint N31=N41+N42;
var 1..N11: N32=N42+N43;
var 1..N11: N33=N43+N44;
var 1..N11: N41=X+11;
var 1..N11: N42=Y+11;
var 1..N11: N43=Y+4;
var 1..N11: N44=Z+4;
var 1..N11: X;
var 1..N11: Y=X+Z;
var 1..N11: Z;
</syntaxhighlight>
{{out}}
<pre>
Z = 8;
X = 5;
----------
</pre>
 
=={{header|Nim}}==
{{trans|Ada}}
<syntaxhighlight lang="nim">import strutils
 
type
 
BlockValue = object
known: int
x, y, z: int
 
Variables = tuple[x, y, z: int]
 
func `+=`(left: var BlockValue; right: BlockValue) =
## Symbolically add one block to another.
left.known += right.known
left.x += right.x - right.z # Z is excluded as n(Y - X - Z) = 0.
left.y += right.y + right.z
 
proc toString(n: BlockValue; vars: Variables): string =
## Return the representation of the block value, when X, Y, Z are known.
result = $(n.known + n.x * vars.x + n.y * vars.y + n.z * vars.z)
 
proc Solve2x2(a11, a12, b1, a21, a22, b2: int): Variables =
## Solve a puzzle, supposing an integer solution exists.
if a22 == 0:
result.x = b2 div a21
result.y = (b1 - a11 * result.x) div a12
else:
result.x = (b1 * a22 - b2 * a12) div (a11 * a22 - a21 * a12)
result.y = (b1 - a11 * result.x) div a12
result.z = result.y - result.x
 
var blocks : array[1..5, array[1..5, BlockValue]] # The lower triangle contains blocks.
 
# The bottom blocks.
blocks[5][1] = BlockValue(x: 1)
blocks[5][2] = BlockValue(known: 11)
blocks[5][3] = BlockValue(y: 1)
blocks[5][4] = BlockValue(known: 4)
blocks[5][5] = BlockValue(z: 1)
 
# Upward run.
for row in countdown(4, 1):
for column in 1..row:
blocks[row][column] += blocks[row + 1][column]
blocks[row][column] += blocks[row + 1][column + 1]
 
# Now have known blocks 40=[3][1], 151=[1][1] and Y=X+Z to determine X,Y,Z.
let vars = Solve2x2(blocks[1][1].x,
blocks[1][1].y,
151 - blocks[1][1].known,
blocks[3][1].x,
blocks[3][1].y,
40 - blocks[3][1].known)
 
# Print the results.
for row in 1..5:
var line = ""
for column in 1..row:
line.addSep(" ")
line.add toString(blocks[row][column], vars)
echo line</syntaxhighlight>
{{out}}
<pre>151
81 70
40 41 29
16 24 17 12
5 11 13 4 8</pre>
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">%% to compile : ozc -x <file.oz>
functor
 
Line 1,046 ⟶ 2,083:
 
{Application.exit 0}
end</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
[ 6y+x+z+4a[2]+4a[4]= 7y +4a[2]+4a[4]]
Line 1,055 ⟶ 2,093:
 
this helped me...
<langsyntaxhighlight lang="parigp">
Pascals_triangle_puzzle(topvalue=151,leftsidevalue=40,bottomvalue1=11,bottomvalue2=4) = {
y=(topvalue-(4*(bottomvalue1+bottomvalue2)))/7;
Line 1,061 ⟶ 2,099:
z=y-x;
print(x","y","z); }
</syntaxhighlight>
</lang>
 
I'm thinking of one to solve all puzzles regardless of size and positions. but the objective was to solve this puzzle.
 
=={{header|Perl}}==
<syntaxhighlight lang="perl"># set up triangle
my $rows = 5;
my @tri = map { [ map { {x=>0,z=>0,v=>0,rhs=>undef} } 1..$_ ] } 1..$rows;
$tri[0][0]{rhs} = 151;
$tri[2][0]{rhs} = 40;
$tri[4][0]{x} = 1;
$tri[4][1]{v} = 11;
$tri[4][2]{x} = 1;
$tri[4][2]{z} = 1;
$tri[4][3]{v} = 4;
$tri[4][4]{z} = 1;
 
# aggregate from bottom to top
for my $row ( reverse 0..@tri-2 ) {
for my $col ( 0..@{$tri[$row]}-1 ){
$tri[$row][$col]{$_} = $tri[$row+1][$col]{$_}+$tri[$row+1][$col+1]{$_} for 'x','z','v';
}
}
# find equations
my @eqn;
for my $row ( @tri ) {
for my $col ( @$row ){
push @eqn, [ $$col{x}, $$col{z}, $$col{rhs}-$$col{v} ] if defined $$col{rhs};
}
}
# print equations
print "Equations:\n";
print " x + z = y\n";
printf "%d x + %d z = %d\n", @$_ for @eqn;
# solve
my $f = $eqn[0][1] / $eqn[1][1];
$eqn[0][$_] -= $f * $eqn[1][$_] for 0..2;
$f = $eqn[1][0] / $eqn[0][0];
$eqn[1][$_] -= $f * $eqn[0][$_] for 0..2;
# print solution
print "Solution:\n";
my $x = $eqn[0][2]/$eqn[0][0];
my $z = $eqn[1][2]/$eqn[1][1];
my $y = $x+$z;
printf "x=%d, y=%d, z=%d\n", $x, $y, $z;
</syntaxhighlight>
{{out}}
<pre>Equations:
x + z = y
7 x + 7 z = 91
2 x + 1 z = 18
Solution:
x=5, y=13, z=8
</pre>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">--
-- demo\rosetta\Pascal_triangle_Puzzle.exw
-- =======================================
--
-- I approached this with a view to solving general pyramid puzzles, not just the one given.
--
-- This little ditty converts the pyramid to rules quite nicely, then uses a modified copy
-- of solveN() from [[Solving_coin_problems#Phix]] to solve those simultaneous equations.
--</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">pyramid</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">151</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #000000;">40</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"x"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"y"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"z"</span><span style="color: #0000FF;">}}</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">rules</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
<span style="color: #000080;font-style:italic;">-- each cell in the pyramid is either an integer final value or an equation.
-- initially the equations are strings, we substitute all with triplets of
-- the form {k,x,z} ie k+l*x+m*z, and known values &lt; last row become rules.</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">=</span><span style="color: #000000;">5</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">prc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">][</span><span style="color: #000000;">c</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">equ</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">prc</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"x"</span> <span style="color: #008080;">then</span> <span style="color: #000000;">prc</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- ie 0 + one x</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">prc</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"y"</span> <span style="color: #008080;">then</span> <span style="color: #000000;">prc</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- ie 0 + one x plus one z</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">prc</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"z"</span> <span style="color: #008080;">then</span> <span style="color: #000000;">prc</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- ie 0 + one z</span>
<span style="color: #008080;">else</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">prc</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">or</span> <span style="color: #000000;">r</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">4</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- examples: x+11 is {0,1,0}+{11,0,0} -&gt; {11,1,0},
-- 11+y is {11,0,0}+{0,1,1} -&gt; {11,1,1},
-- 40=""+"" is {40,0,0}={22,2,1} ==&gt; {18,2,1}</span>
<span style="color: #000000;">equ</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">c</span><span style="color: #0000FF;">],</span><span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">][</span><span style="color: #000000;">c</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">prc</span><span style="color: #0000FF;">=</span><span style="color: #008000;">""</span> <span style="color: #008080;">then</span> <span style="color: #000000;">prc</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">equ</span>
<span style="color: #008080;">else</span> <span style="color: #000000;">prc</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">prc</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">r</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">4</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">equ</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">prc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">equ</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">rules</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rules</span><span style="color: #0000FF;">,</span><span style="color: #000000;">equ</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">][</span><span style="color: #000000;">c</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">prc</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">ppOpt</span><span style="color: #0000FF;">({</span><span style="color: #004600;">pp_Nest</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #004600;">pp_StrFmt</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #004600;">pp_IntCh</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">})</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"equations"</span>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pyramid</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"rules"</span>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rules</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- {18,2,1} === 18=2x+z
-- {73,5,6} === 73=5x+6z</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"=====\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rules</span><span style="color: #0000FF;">)==</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- more work needed!?
-- modified copy of solveN() from Solving_coin_problems.exw as promised, a
-- bit of a sledgehammer to crack a peanut is the phrase you are looking for:</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">solveN</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">rules</span><span style="color: #0000FF;">)</span>
<span style="color: #000080;font-style:italic;">--
-- Based on https://mathcs.clarku.edu/~djoyce/ma105/simultaneous.html
-- aka the ancient Chinese Jiuzhang suanshu ~100 B.C. (!!)
--
-- Example (not related to the task problem):
-- rules = <nowiki>{{</nowiki>18,1,1},{38,1,5<nowiki>}}</nowiki>, ie 18==x+y, 38==x+5y
-- ==&gt; {13,5}, ie x=13, y=5
--
-- In the elimination phase, both x have multipliers of 1, ie both rii and rij are 1,
-- so we can ignore the two sq_mul and just do [sq_sub] (38=x+5y)-(18=x+y)==&gt;(20=4y).
-- Obviously therefore y is 5 and substituting backwards x is 13.
--
-- Example2 (taken from the task problem):
-- rules = <nowiki>{{</nowiki>18,2,1},{73,5,6<nowiki>}}</nowiki>, ie 18==2x+z, 73==5x+6z
-- ==&gt; <nowiki>{{</nowiki>18,2,1},{56,0,7<nowiki>}}</nowiki>, ie rules[2]:=rules[2]*2-rules[1]*5 (eliminate)
-- ==&gt; <nowiki>{{</nowiki>18,2,1},8}, ie rules[2]:=56/7, aka z:=8 (substitute)
-- ==&gt; <nowiki>{{</nowiki>10,2,0},8}, ie rules[1]-=1z (substitute)
-- ==&gt; {5,8}, ie rules[1]:=10/2, aka x:=5 (substitute)
-- ==&gt; {5,8}, ie x=5, z=8
-- </span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ri</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">rj</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rules</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">rii</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">rji</span>
<span style="color: #000000;">rules</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rules</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
<span style="color: #000080;font-style:italic;">-- successively eliminate (grow lower left triangle of 0s)</span>
<span style="color: #000000;">ri</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ri</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">l</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">rii</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ri</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rii</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (see note below)</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">l</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">rj</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">rji</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rj</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">rji</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">rj</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rj</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rii</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">sq_mul</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ri</span><span style="color: #0000FF;">,</span><span style="color: #000000;">rji</span><span style="color: #0000FF;">))</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rj</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]==</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (job done)</span>
<span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rj</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">l</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #000080;font-style:italic;">-- then substitute each backwards</span>
<span style="color: #000000;">ri</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">rii</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ri</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]/</span><span style="color: #000000;">ri</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- (all else should be 0)</span>
<span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rii</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">i</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">1</span> <span style="color: #008080;">by</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
<span style="color: #000000;">rj</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">rji</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rj</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">rji</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #000000;">rj</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">rji</span><span style="color: #0000FF;">*</span><span style="color: #000000;">rii</span>
<span style="color: #000000;">rj</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rj</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">rules</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #000080;font-style:italic;">-- Obviously these next two lines directly embody knowledge from the task, and
-- would need changing for an even slightly different version of the problem:</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">z</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">solveN</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rules</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">y</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">z</span> <span style="color: #000080;font-style:italic;">-- (as per task desc)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"x=%d, y=%d, z=%d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">z</span><span style="color: #0000FF;">})</span>
<span style="color: #000080;font-style:italic;">-- finally evaluate all the equations and print it.</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">r</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pyramid</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">c</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">][</span><span style="color: #000000;">c</span><span style="color: #0000FF;">]</span>
<span style="color: #000000;">pyramid</span><span style="color: #0000FF;">[</span><span style="color: #000000;">r</span><span style="color: #0000FF;">][</span><span style="color: #000000;">c</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">+</span><span style="color: #000000;">l</span><span style="color: #0000FF;">*</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">m</span><span style="color: #0000FF;">*</span><span style="color: #000000;">z</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pyramid</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
"equations"
{{{151,0,0}},
{{55,2,2}, {23,3,4}},
{{40,0,0}, {15,2,2}, {8,1,2}},
{{11,1,0}, {11,1,1}, {4,1,1}, {4,0,1}},
{{0,1,0}, {11,0,0}, {0,1,1}, {4,0,0}, {0,0,1}}}
"rules"
{{18,2,1},
{73,5,6}}
=====
x=5, y=13, z=8
{{151},
{81,70},
{40,41,29},
{16,24,17,12},
{5,11,13,4,8}}
</pre>
Interestingly, this appears to match Python in that 40 is propagated up the tree, whereas Perl and Go appear to propagate 22+2x+z up, not that I can think of any case where that would make a difference.
 
A couple of other ways to use that solveN():
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #0000FF;">?</span><span style="color: #000000;">solveN</span><span style="color: #0000FF;">({{</span><span style="color: #000000;">18</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">73</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}})</span> <span style="color: #000080;font-style:italic;">-- -- {5,13,8}</span>
<span style="color: #7060A8;">ppOpt</span><span style="color: #0000FF;">({</span><span style="color: #004600;">pp_Nest</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">})</span>
<span style="color: #000080;font-style:italic;">-- Or, hand-coding 11 simultaneous equations for 11 unknowns:
-- (be warned I had to reorder a bit to avoid rii==0 mishaps,
-- perhaps solveN() should find or even sort rules somehow)
--sequence pyramid = <nowiki>{{</nowiki>151},
-- {"a","b"},
-- {40,"c","d"},
-- {"e","f","g","h"},
-- {"x", 11,"y", 4,"z"<nowiki>}}</nowiki>
-- a b c d e f g h x y z</span>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">solveN</span><span style="color: #0000FF;">({{</span><span style="color: #000000;">151</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- a+b=151</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">40</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- 40+c=a</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- c+d=b</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- g+h=d</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">40</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- e+f=40</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- f+g=c</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- x+11=e</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- y+4=g</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- 11+y=f</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span> <span style="color: #000080;font-style:italic;">-- 4+z=h</span>
<span style="color: #0000FF;">{</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}</span> <span style="color: #000080;font-style:italic;">-- x+z=y
-- })) -- {81,70,41,29,16,24,17,12,5,13,8}</span>
<span style="color: #0000FF;">})[-</span><span style="color: #000000;">3</span><span style="color: #0000FF;">..-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span> <span style="color: #000080;font-style:italic;">-- {5,13,8}</span>
<!--</syntaxhighlight>-->
 
And finally, a cheeky little two-liner that does the whole job
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #004080;">integer</span> <span style="color: #000000;">Y</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">151</span><span style="color: #0000FF;">-</span><span style="color: #000000;">4</span><span style="color: #0000FF;">*(</span><span style="color: #000000;">11</span><span style="color: #0000FF;">+</span><span style="color: #000000;">4</span><span style="color: #0000FF;">))/</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">X</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">40</span><span style="color: #0000FF;">-</span><span style="color: #000000;">2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">11</span><span style="color: #0000FF;">-</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">Z</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">Y</span><span style="color: #0000FF;">-</span><span style="color: #000000;">X</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Two-liner: x=%d, y=%d, z=%d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">X</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Z</span><span style="color: #0000FF;">})</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Two-liner: x=5, y=13, z=8
</pre>
 
=={{header|Picat}}==
Below are three different approaches using constraint modelling (cp solver).
 
===Using lists to represent the triangle===
{{trans|Prolog}}
<syntaxhighlight lang="picat">import cp.
 
go =>
puzzle(T, X, Y,Z),
foreach(TT in T)
println(TT)
end,
println([x=X,y=Y,z=Z]),
nl,
fail, % are there any more solutions?
nl.
% Port of the Prolog solution
puzzle(Ts, X, Y, Z) :-
Ts = [ [151],
[_, _],
[40, _, _],
[_, _, _, _],
[X, 11, Y, 4, Z]],
Y #= X + Z,
triangle(Ts),
Vs = vars(Ts),
Vs :: 0..10000,
solve(Vs).
triangle([T|Ts]) :-
( Ts = [N|_] -> triangle_(T, N), triangle(Ts) ; true ).
triangle_([], _).
triangle_([T|Ts],[A,B|Rest]) :-
T #= A + B, triangle_(Ts, [B|Rest]).</syntaxhighlight>
 
{{out}}
<pre>[151]
[81,70]
[40,41,29]
[16,24,17,12]
[5,11,13,4,8]
[x = 5,y = 13,z = 8]</pre>
 
===Calculating the positions===
Here is a constraint model which calculates the positions in the triangle that should be added together.
<syntaxhighlight lang="picat">import cp.
 
puzzle2 =>
N = 5, % number of rows
Len = (N*(N+1)) div 2, % number of entries
% The triangle numbers for 1..N
T = [I*(I+1) div 2 : I in 1..N],
 
% The index of first number to use in addition
% create the indices of the numbers to add,
% i.e. Adds[I] + Adds[I+1]
Adds = new_list(T[N-1]),
Adds[1] := 2,
foreach(I in 2..T[N-1])
% "jump" of 2 when i-1 is a triangle number
if membchk(I-1,T) then
Adds[I] := Adds[I-1] + 2
else
Adds[I] := Adds[I-1] + 1
end
end,
 
% the pyramid
MaxVal = 10_000,
L = new_list(Len),
L :: 1..MaxVal,
 
% The clues.
L = [ 151,
_, _,
40, _, _,
_, _,_ , _ ,
X, 11, Y, 4, Z
],
 
% The sums
foreach(I in 1..T[N-1])
L[I] #= L[Adds[I]]+L[Adds[I]+1]
end,
 
% The extra constraint
Y #= X + Z,
solve(L),
println([x=X,y=Y,z=Z]),
fail, % check if there is another solution
nl.</syntaxhighlight>
 
{{out}}
<pre>[x = 5,y = 13,z = 8]</pre>
 
===Hard coded constraints===
<syntaxhighlight lang="picat">import cp.
 
puzzle3 =>
% 1
% 2 3
% 4 5 6
% 7 8 9 10
%11 12 13 14 15
X = new_list(15),
X :: 0..10_000,
X[1] #= X[2]+X[3],
X[2] #= X[4]+X[5],
X[3] #= X[5]+X[6],
X[4] #= X[7]+X[8],
X[5] #= X[8]+X[9],
X[6] #= X[9]+X[10],
X[7] #= X[11]+X[12],
X[8] #= X[12]+X[13],
X[9] #= X[13]+X[14],
X[10] #= X[14]+X[15],
X[13] #= X[11] + X[15], % Y=X+Z,
 
% The hints
X[1] #= 151,
X[4] #= 40,
X[12] #= 11,
X[14] #= 4,
 
solve(X),
println([x=X[11],y=X[13],z=X[15]]),
fail,
nl.</syntaxhighlight>
 
{{out}}
<pre>[x = 5,y = 13,z = 8]</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(be number (@N @Max)
(^ @C (box 0))
(repeat)
(or
((^ @ (>= (val (-> @C)) (-> @Max))) T (fail))
((^ @N (inc (-> @C)))) ) )
 
(be + (@A @B @Sum)
(^ @ (-> @A))
(^ @ (-> @B))
(^ @Sum (+ (-> @A) (-> @B))) )
 
(be + (@A @B @Sum)
(^ @ (-> @A))
(^ @ (-> @Sum))
(^ @B (- (-> @Sum) (-> @A)))
T
(^ @ (ge0 (-> @B))) )
 
(be + (@A @B @Sum)
(number @A @Sum)
(^ @B (- (-> @Sum) (-> @A))) )
 
#{
Line 1,108 ⟶ 2,532:
(+ @Y 4 @G)
(+ 4 @Z @H)
(+ @X @Z @Y) )</lang>
T )</syntaxhighlight>
Output:
{{Out}}
<pre>: (? (puzzle @X @Y @Z))
@X=5 @Y=13 @Z=8</pre>
 
=={{header|Prolog}}==
<langsyntaxhighlight lang="prolog">:- use_module(library(clpfd)).
 
puzzle(Ts, X, Y, Z) :-
Line 1,132 ⟶ 2,557:
% X = 5,
% Y = 13,
% Z = 8 ;</langsyntaxhighlight>
 
=={{header|PureBasic}}==
Brute force solution.
<langsyntaxhighlight PureBasiclang="purebasic">; Known;
; A.
; [ 151]
Line 1,166 ⟶ 2,591:
z=SolveForZ(x)
Until z>=0
MessageRequester(title$,"X="+Str(x)+#CRLF$+"Y="+Str(x+z)+#CRLF$+"Z="+Str(z))</langsyntaxhighlight>
 
=={{header|Python}}==
{{works with|Python|2.4+}}
<langsyntaxhighlight lang="python"># Pyramid solver
# [151]
# [ ] [ ]
Line 1,291 ⟶ 2,716:
p = [ [151], [None,None], [40,None,None], [None,None,None,None], ['X', 11, 'Y', 4, 'Z'] ]
addlConstraint = { 'X':1, 'Y':-1, 'Z':1, '1':0 }
SolvePyramid( p, addlConstraint)</langsyntaxhighlight>
{{Out}}
Output:
<pre>Constraint Equations:
-1*Y + 1*X + 0*1 + 1*Z = 0
Line 1,307 ⟶ 2,732:
http://www.fantascienza.net/leonardo/so/csp.zip
 
<langsyntaxhighlight lang="python">from csp import Problem
 
p = Problem()
Line 1,325 ⟶ 2,750:
p.addrule("Y == X + Z")
for sol in p.xsolutions():
print [sol[k] for k in "XYZ"]</langsyntaxhighlight>
 
{{Out}}
'''Sample output'''
<lang pythonpre>[5, 13, 8]</langpre>
 
=={{header|REXXRacket}}==
(Based on the clojure version)
<lang rexx>
/*REXX program to solve a "Pyramid of Numbers" puzzle. */
 
Only X and Z are independent variables.
We'll use a struct (cell v x z) to represent each cell,
where the value is (v + x*X + z*Z).
<syntaxhighlight lang="racket">
#lang racket/base
(require racket/list)
 
(struct cell (v x z) #:transparent)
/*┌──────────────────────────────────────────────┐
┌─┘ └─┐
│ answer │
│ mid / │
│ \ / │
│ \ 151 │
│ \ --- --- │
│ 40 --- --- │
│ --- --- --- --- │
│ x 11 y 4 z │
│ / \ │
│ / \ │
│ / \ │
│ B D │
│ │
└─┐ ┌─┘
└──────────────────────────────────────────────┘*/
 
(define (cell-add cx cy)
(cell (+ (cell-v cx) (cell-v cy))
(+ (cell-x cx) (cell-x cy))
(+ (cell-z cx) (cell-z cy))))
 
(define (cell-sub cx cy)
arg x b y d z mid answer . /*get some values, others, just X*/
(cell (- (cell-v cx) (cell-v cy))
(- (cell-x cx) (cell-x cy))
(- (cell-z cx) (cell-z cy))))
</syntaxhighlight>
 
We first work bottom up and determine the value of each cell, starting from the bottom row.
top=answer- 4*b - 4*d /*calculate the top # - constants*/
<syntaxhighlight lang="racket">
middle=mid- 2*b /*calculate the mod # - constants*/
(define (row-above row) (map cell-add (drop row 1) (drop-right row 1)))
 
(define row0 (list (cell 0 1 0) (cell 11 0 0) (cell 0 1 1) (cell 4 0 0) (cell 0 0 1)))
do x=-top to top
(define row1 (row-above row0))
do y=-top to top
(define row2 (row-above row1))
if x+y\==middle then iterate /*40 = x+2B+Y -or- 40-2*11 =x+y*/
(define row3 (row-above row2))
y6=y*6 /*calculate a short cut. */
(define row4 (row-above row3))
do z=-top to top
</syntaxhighlight>
if z\==y-x then iterate /*z has to equal y-x (y=x+z) */
 
if x+y6+z==top then say 'x=' x ' y=' y ' z=' z
We know the value of two additional cells, so by subtracting these values we get two equations of the form 0=v+x*X+z*Z. In the usual notation we get x*X+z*Z=-v, so v has the wrong sign.
end
 
end
<syntaxhighlight lang="racket">
end
(define eqn40 (cell-sub (car row4) (cell 151 0 0)))
</lang>
(define eqn20 (cell-sub (car row2) (cell 40 0 0)))
Output for the following input:
</syntaxhighlight>
x 11 y 4 z 40 151
 
<pre style="height:8ex;overflow:scroll">
To solve the 2 equation system, we will use the Cramer's rule.
x= 5 y= 13 z= 8
<syntaxhighlight lang="racket">
(define (det2 eqnx eqny get-one get-oth)
(- (* (get-one eqnx) (get-oth eqny)) (* (get-one eqny) (get-oth eqnx))))
 
(define (cramer2 eqnx eqny get-val get-unk get-oth)
(/ (det2 eqnx eqny get-val get-oth)
(det2 eqnx eqny get-unk get-oth)))
</syntaxhighlight>
 
To get the correct values of X, Y and Z we must change their signs.
<syntaxhighlight lang="racket">
(define x (- (cramer2 eqn20 eqn40 cell-v cell-x cell-z)))
(define z (- (cramer2 eqn20 eqn40 cell-v cell-z cell-x)))
 
(displayln (list "X" x))
(displayln (list "Y" (+ x z)))
(displayln (list "Z" z))
</syntaxhighlight>
 
{{Out}}
<pre>
(X 5)
(Y 13)
(Z 8)
</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{trans|Perl}}
<syntaxhighlight lang="raku" line># set up triangle
my $rows = 5;
my @tri = (1..$rows).map: { [ { x => 0, z => 0, v => 0, rhs => Nil } xx $_ ] }
@tri[0][0]<rhs> = 151;
@tri[2][0]<rhs> = 40;
@tri[4][0]<x> = 1;
@tri[4][1]<v> = 11;
@tri[4][2]<x> = 1;
@tri[4][2]<z> = 1;
@tri[4][3]<v> = 4;
@tri[4][4]<z> = 1;
# aggregate from bottom to top
for @tri - 2 ... 0 -> $row {
for 0 ..^ @tri[$row] -> $col {
@tri[$row][$col]{$_} = @tri[$row+1][$col]{$_} + @tri[$row+1][$col+1]{$_} for 'x','z','v';
}
}
 
# find equations
my @eqn = gather for @tri -> $row {
for @$row -> $cell {
take [ $cell<x>, $cell<z>, $cell<rhs> - $cell<v> ] if defined $cell<rhs>;
}
}
 
# print equations
say "Equations:";
say " x + z = y";
for @eqn -> [$x,$z,$y] { say "$x x + $z z = $y" }
 
# solve
my $f = @eqn[0][1] / @eqn[1][1];
@eqn[0][$_] -= $f * @eqn[1][$_] for 0..2;
$f = @eqn[1][0] / @eqn[0][0];
@eqn[1][$_] -= $f * @eqn[0][$_] for 0..2;
 
# print solution
say "Solution:";
my $x = @eqn[0][2] / @eqn[0][0];
my $z = @eqn[1][2] / @eqn[1][1];
my $y = $x + $z;
say "x=$x, y=$y, z=$z";</syntaxhighlight>
{{out}}
<pre>Equations:
x + z = y
7 x + 7 z = 91
2 x + 1 z = 18
Solution:
x=5, y=13, z=8</pre>
 
=={{header|REXX}}==
This REXX version also displays a diagram of the puzzle.
<syntaxhighlight lang="rexx">/*REXX program solves a (Pascal's) "Pyramid of Numbers" puzzle given four values. */
/* ╔══════════════════════════════════════════════════╗
║ answer ║
║ / ║
║ mid / ║
║ \ 151 ║
║ \ ααα ααα ║
║ 40 ααα ααα ║
║ ααα ααα ααα ααα ║
║ x 11 y 4 z ║
║ / \ ║
║ find: / \ ║
║ x y z b d ║
╚══════════════════════════════════════════════════╝ */
do #=2; _= sourceLine(#); n= pos('_', _) /* [↓] this DO loop shows (above) box.*/
if n\==0 then leave; say _ /*only display up to the above line. */
end /*#*/; say /* [↑] this is a way for in─line doc. */
parse arg b d mid answer . /*obtain optional variables from the CL*/
if b=='' | b=="," then b= 11 /*Not specified? Then use the default.*/
if d=='' | d=="," then d= 4 /* " " " " " " */
if mid='' | mid=="," then mid= 40 /* " " " " " " */
if answer='' | answer=="," then answer= 151 /* " " " " " " */
big= answer - 4*b - 4*d /*calculate BIG number less constants*/
do x=-big to big
do y=-big to big
if x+y\==mid - 2*b then iterate /*40 = x+2B+Y ──or── 40-2*11 = x+y */
do z=-big to big
if z \== y - x then iterate /*Z has to equal Y-X (Y= X+Z) */
if x+y*6+z==big then say right('x =', n) x right("y =",n) y right('z =',n) z
end /*z*/
end /*y*/
end /*x*/ /*stick a fork in it, we're all done. */</syntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
/* ╔══════════════════════════════════════════════════╗
║ answer ║
║ / ║
║ mid / ║
║ \ 151 ║
║ \ ααα ααα ║
║ 40 ααα ααα ║
║ ααα ααα ααα ααα ║
║ x 11 y 4 z ║
║ / \ ║
║ find: / \ ║
║ x y z b d ║
╚══════════════════════════════════════════════════╝ */
 
x = 5 y = 13 z = 8
</pre>
 
=={{header|Ruby}}==
uses [[Reduced row echelon form#Ruby]]
<langsyntaxhighlight lang="ruby">require 'rref'
 
pyramid = [
Line 1,387 ⟶ 2,941:
["x", 11,"y", 4,"z"]
]
pyramid.each{|row| p row}
p pyramid
 
equations = [[1,-1,1,0]] # y = x + z
 
Line 1,396 ⟶ 2,951:
for term in lhs.split("+")
case term
when "x": then eqn[0] += 1
when "y": then eqn[1] += 1
when "z": then eqn[2] += 1
else eqn[3] -= term.to_i
end
end
Line 1,408 ⟶ 2,963:
pyramid[row].each_index do |col|
val = pyramid[row][col]
sum = "%s+%s" % [pyramid[row+1][col].to_s, pyramid[row+1][col+1].to_s]
if val.nil?
pyramid[row][col] = sum
Line 1,422 ⟶ 2,977:
if eqn[0] + eqn[1] + eqn[2] != 1
fail "no unique solution! #{equations.inspect} ==> #{reduced.inspect}"
elsif eqn[0] == 1: then x = eqn[3]
elsif eqn[1] == 1: then y = eqn[3]
elsif eqn[2] == 1: then z = eqn[3]
end
end
 
puts
puts "x == #{x}"
puts "y == #{y}"
Line 1,436 ⟶ 2,992:
answer << row.collect {|cell| eval cell.to_s}
end
puts
p answer</lang>
answer.each{|row| p row}</syntaxhighlight>
<pre>[[151], [nil, nil], [40, nil, nil], [nil, nil, nil, nil], ["x", 11, "y", 4, "z"]]
 
{{out}}
<pre>
[151]
[nil, nil]
[40, nil, nil]
[nil, nil, nil, nil]
["x", 11, "y", 4, "z"]
 
x == 5
y == 13
z == 8
 
[[151], [81, 70], [40, 41, 29], [16, 24, 17, 12], [5, 11, 13, 4, 8]]</pre>
[151]
[81, 70]
[40, 41, 29]
[16, 24, 17, 12]
[5, 11, 13, 4, 8]
</pre>
 
=={{header|Scala}}==
<syntaxhighlight lang="scala">object PascalTriangle extends App {
 
val (x, y, z) = pascal(11, 4, 40, 151)
 
def pascal(a: Int, b: Int, mid: Int, top: Int): (Int, Int, Int) = {
val y = (top - 4 * (a + b)) / 7
val x = mid - 2 * a - y
(x, y, y - x)
}
 
println(if (x != 0) s"Solution is: x = $x, y = $y, z = $z" else "There is no solution.")
}</syntaxhighlight>
{{Out}}See it in running in your browser by [https://scalafiddle.io/sf/UJF14fw/0 (JavaScript)]
or by [https://scastie.scala-lang.org/l0AlwpSdR7i801Fq8CWHEQ Scastie (JVM)].
 
=={{header|Sidef}}==
{{trans|Raku}}
<syntaxhighlight lang="ruby"># set up triangle
var rows = 5
var tri = rows.of {|i| (i+1).of { Hash(x => 0, z => 0, v => 0, rhs => nil) } }
tri[0][0]{:rhs} = 151
tri[2][0]{:rhs} = 40
tri[4][0]{:x} = 1
tri[4][1]{:v} = 11
tri[4][2]{:x} = 1
tri[4][2]{:z} = 1
tri[4][3]{:v} = 4
tri[4][4]{:z} = 1
 
# aggregate from bottom to top
for row in (tri.len ^.. 1) {
for col in (^tri[row-1]) {
[:x, :z, :v].each { |key|
tri[row-1][col]{key} = (tri[row][col]{key} + tri[row][col+1]{key})
}
}
}
 
# find equations
var eqn = gather {
for r in tri {
for c in r {
take([c{:x}, c{:z}, c{:rhs} - c{:v}]) if defined(c{:rhs})
}
}
}
 
# print equations
say "Equations:"
say " x + z = y"
for x,z,y in eqn { say "#{x}x + #{z}z = #{y}" }
 
# solve
var f = (eqn[0][1] / eqn[1][1])
{|i| eqn[0][i] -= (f * eqn[1][i]) } << ^3
f = (eqn[1][0] / eqn[0][0])
{|i| eqn[1][i] -= (f * eqn[0][i]) } << ^3
 
# print solution
say "Solution:"
var x = (eqn[0][2] / eqn[0][0])
var z = (eqn[1][2] / eqn[1][1])
var y = (x + z)
say "x=#{x}, y=#{y}, z=#{z}"</syntaxhighlight>
{{out}}
<pre>
Equations:
x + z = y
7x + 7z = 91
2x + 1z = 18
Solution:
x=5, y=13, z=8
</pre>
 
=={{header|SystemVerilog}}==
We can view this as a problem of generating a set of random numbers that satisfy the constraints. Because there is only one solution, the result isn't very random...
<langsyntaxhighlight SystemVeriloglang="systemverilog">program main;
 
class Triangle;
Line 1,482 ⟶ 3,128:
 
Triangle answer = new;
endprogram</langsyntaxhighlight>
<pre> [151]
[81][70]
Line 1,492 ⟶ 3,138:
=={{header|Tcl}}==
using code from [[Reduced row echelon form#Tcl]]
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
namespace path ::tcl::mathop
 
Line 1,559 ⟶ 3,205:
lappend solved $newrow
}
print_matrix $solved</langsyntaxhighlight>
<pre>x=5.0
y=13.0
Line 1,568 ⟶ 3,214:
16.0 24.0 17.0 12.0
5.0 11.0 13.0 4.0 8.0</pre>
 
=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="wren">import "./fmt" for Fmt
 
var isIntegral = Fn.new { |x, tol| x.fraction.abs <= tol }
 
var pascal = Fn.new { |a, b, mid, top|
var yd = (top - 4 * (a + b)) / 7
if (!isIntegral.call(yd, 0.0001)) return [0, 0, 0]
var y = yd.truncate
var x = mid - 2*a - y
return [x, y, y - x]
}
 
var sol = pascal.call(11, 4, 40, 151)
if (sol[0] != 0) {
Fmt.print("Solution is: x = $d, y = $d, z = $d", sol[0], sol[1], sol[2])
} else {
System.print("There is no solution")
}</syntaxhighlight>
 
{{out}}
<pre>
Solution is: x = 5, y = 13, z = 8
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">proc Print; int N, A, B, C, D, E;
int I, P;
def Tab = $09;
[P:= @A; \point to first number
for I:= N to 5-1 do ChOut(0, Tab);
for I:= 0 to N-1 do
[IntOut(0, P(I)); ChOut(0, Tab); ChOut(0, Tab)];
CrLf(0);
];
 
int N, P, Q, R, S, T, U, V, W, X, Y, Z; \ 151
[for X:= 0 to 40-11 do \ N P
for Z:= 0 to 151-4 do \ Q R S
[Y:= X+Z; \ T U V W
T:= X+11; \X 11 Y 4 Z
U:= 11+Y;
V:= Y+4;
W:= 4+Z;
if T+U = 40 then
[R:= U+V;
S:= V+W;
N:= 40+R;
P:= R+S;
if N+P = 151 then
[Print(1, 151);
Print(2, N, P);
Print(3, 40, R, S);
Print(4, T, U, V, W);
Print(5, X, 11, Y, 4, Z);
exit;
];
];
];
]</syntaxhighlight>
 
{{out}}
<pre>
151
81 70
40 41 29
16 24 17 12
5 11 13 4 8
</pre>
 
=={{header|zkl}}==
{{trans|Python}}
<syntaxhighlight lang="zkl"># Pyramid solver
# [151]
# [ ] [ ]
# [ 40] [ ] [ ]
# [ ] [ ] [ ] [ ]
#[ X ] [ 11] [ Y ] [ 4 ] [ Z ]
# Known: X - Y + Z = 0
p:=T( L(151), L(Void,Void), L(40,Void,Void), L(Void,Void,Void,Void),
L("X", 11, "Y", 4, "Z") );
addlConstraint:=Dictionary( "X",1, "Y",-1, "Z",1, "1",0 );
solvePyramid(p, addlConstraint);</syntaxhighlight>
<syntaxhighlight lang="zkl">fcn solvePyramid([List]vl,[Dictionary]cnstr){ //ListOfLists,Hash-->zip
vl=vl.reverse();
constraints:=L(cnstr);
lvls:=vl.len();
foreach lvln in ([1..lvls-1]){
lvd:=vl[lvln];
foreach k in (lvls-lvln){
sn:=lvd[k];
ll:=vl[lvln-1];
vn:=combine(ll[k], ll[k+1]);
if(Void==sn) lvd[k]=vn;
else constraints.append(constrainK(sn,vn));
}
}
println("Constraint Equations:");
constraints.pump(Console.println,fcn(hash){
hash.pump(List,fcn([(k,v)]){"%d*%s".fmt(v,k)}).concat(" + ") + " = 0"
});
mtx,vmap:=makeMatrix(constraints);
mtxSolve(mtx);
d:=vmap.len();
foreach j in (d){ println(vmap[j]," = ", mtx[j][d]); }
}
 
fcn [mixin=Dictionary] constrainK([Int]nsum,[Dictionary]vn){ //-->new hash of old hash, sum K
nn:=vn.copy(); nn["1"]=nn.find("1",0) - nsum;
return(nn.makeReadOnly());
}
 
fcn combine(snl,snr){ //Int|String|Hash *2 --> new Hash
cl:=Dictionary();
if(snl.isInstanceOf(Int)) cl["1"]=snl;
else if(snl.isInstanceOf(String)) cl[snl]=1;
else cl =snl.copy();
if(snr.isInstanceOf(Int)) cl["1"]=cl.find("1",0) + snr;
else if(snr.isInstanceOf(String)) cl[snr]=cl.find(snr,0) + 1;
else{ foreach k,v in (snr){ cl[k] =cl.find(k,0) + v; } }
return(cl.makeReadOnly())
}
//-->(listMatrix(row(X,Y,Z,c),row...),List("X","Y","Z"))
fcn makeMatrix([Dictionary]constraints){
vmap:=Dictionary();// create a sorted list of the variable names in constraints
foreach c in (constraints){ vmap.extend(c) } // no duplicate names
vmap.del("1"); vmap=vmap.keys.sort(); # sort here so output is in sorted order
 
mtx:=constraints.pump(List,'wrap(c){ // create list of [writeable] rows
vmap.pump(List, c.find.fp1(0),"toFloat").copy()
.append(-c.find("1",0).toFloat())
}).copy();
 
nvars:=vmap.len();
if(constraints.len()==nvars) println("System appears solvable");
else if(constraints.len()<nvars)
println("System is not solvable - needs more constraints.");
return(mtx,vmap);
}
fcn mtxSolve([List]mtx){ //munge mtx # Simple Matrix solver...
mDim:=mtx.len(); # num rows
foreach j in (mDim){
rw0:=mtx[j];
f:=1.0/rw0[j];
foreach k in ([j..mDim]){ rw0[k]=rw0[k]*f }
foreach l in ([j+1..mDim-1]){
rwl:=mtx[l]; f:=-rwl[j];
foreach k in ([j..mDim]){ rwl[k]+=f*rw0[k] }
}
}
# backsolve part ---
foreach j1 in ([1..mDim-1]){
j:=mDim - j1; rw0:=mtx[j];
foreach l in (j){
rwl:=mtx[l]; f:=-rwl[j];
rwl[j] +=f*rw0[j];
rwl[mDim]+=f*rw0[mDim];
}
}
return(mtx);
}</syntaxhighlight>
{{out}}
<pre>
Constraint Equations:
0*1 + 1*X + -1*Y + 1*Z = 0
-18*1 + 1*X + 1*Y = 0
-73*1 + 5*Y + 1*Z = 0
System appears solvable
X = 5
Y = 13
Z = 8
</pre>
 
[[Category:Puzzles]]
9,488

edits