PietCompiler

Numbers

Creating constants in Piet can simply be done by using the push operation with a very big blob. However, this is not the most pixel efficient way to do this. We can find the optimal solution by doing a BFS search of all possible operations, giving the operations weight based on amount of pixels used. This results in the following table of the first 173 optimal solutions

0   ['push 1', 'not']
1   ['push 1']
2   ['push 2']
3   ['push 3']
4   ['push 2', 'dup', 'add']
5   ['push 5']
6   ['push 3', 'dup', 'add']
7   ['push 1', 'push 3', 'dup', 'add', 'add']
8   ['push 2', 'dup', 'dup', 'add', 'mul']
9   ['push 3', 'dup', 'mul']
10  ['push 1', 'push 3', 'dup', 'mul', 'add']
11  ['push 2', 'push 3', 'dup', 'mul', 'add']
12  ['push 3', 'dup', 'push 1', 'add', 'mul']
13  ['push 1', 'push 3', 'dup', 'push 1', 'add', 'mul', 'add']
14  ['push 1', 'push 3', 'dup', 'add', 'add', 'dup', 'add']
15  ['push 3', 'dup', 'push 2', 'add', 'mul']
16  ['push 2', 'dup', 'add', 'dup', 'mul']
17  ['push 1', 'push 2', 'dup', 'add', 'dup', 'mul', 'add']
18  ['push 3', 'dup', 'dup', 'add', 'mul']
19  ['push 1', 'push 3', 'dup', 'dup', 'add', 'mul', 'add']
20  ['push 2', 'dup', 'add', 'dup', 'push 1', 'add', 'mul']
21  ['push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'mul']
22  ['push 2', 'dup', 'push 3', 'dup', 'mul', 'add', 'mul']
23  ['push 5', 'dup', 'mul', 'push 2', 'sub']
24  ['push 3', 'dup', 'push 1', 'add', 'dup', 'add', 'mul']
25  ['push 5', 'dup', 'mul']
26  ['push 1', 'push 5', 'dup', 'mul', 'add']
27  ['push 3', 'dup', 'dup', 'mul', 'mul']
28  ['push 1', 'push 3', 'dup', 'dup', 'mul', 'mul', 'add']
29  ['push 2', 'push 3', 'dup', 'dup', 'mul', 'mul', 'add']
30  ['push 3', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul']
31  ['push 2', 'dup', 'add', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add']
32  ['push 2', 'dup', 'dup', 'add', 'dup', 'mul', 'mul']
33  ['push 1', 'push 2', 'dup', 'dup', 'add', 'dup', 'mul', 'mul', 'add']
34  ['push 2', 'dup', 'dup', 'add', 'dup', 'mul', 'push 1', 'add', 'mul']
35  ['push 3', 'dup', 'add', 'dup', 'mul', 'push 1', 'sub']
36  ['push 3', 'dup', 'add', 'dup', 'mul']
37  ['push 1', 'push 3', 'dup', 'add', 'dup', 'mul', 'add']
38  ['push 2', 'dup', 'push 3', 'mul', 'dup', 'mul', 'add']
39  ['push 3', 'dup', 'dup', 'add', 'dup', 'mul', 'add']
40  ['push 2', 'dup', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'mul']
41  ['push 5', 'dup', 'push 1', 'add', 'dup', 'mul', 'add']
42  ['push 3', 'dup', 'add', 'dup', 'push 1', 'add', 'mul']
43  ['push 1', 'push 3', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'add']
44  ['push 2', 'dup', 'dup', 'push 3', 'dup', 'mul', 'add', 'mul', 'mul']
45  ['push 3', 'dup', 'dup', 'push 2', 'add', 'mul', 'mul']
46  ['push 1', 'push 3', 'dup', 'dup', 'push 2', 'add', 'mul', 'mul', 'add']
47  ['push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'mul', 'push 1', 'sub']
48  ['push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'mul']
49  ['push 1', 'push 3', 'dup', 'add', 'add', 'dup', 'mul']
50  ['push 5', 'dup', 'dup', 'add', 'mul']
51  ['push 1', 'push 5', 'dup', 'dup', 'add', 'mul', 'add']
52  ['push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'dup', 'mul', 'add']
53  ['push 3', 'dup', 'dup', 'mul', 'mul', 'dup', 'push 1', 'sub', 'add']
54  ['push 3', 'dup', 'dup', 'dup', 'add', 'mul', 'mul']
55  ['push 1', 'push 3', 'dup', 'dup', 'dup', 'add', 'mul', 'mul', 'add']
56  ['push 2', 'dup', 'dup', 'add', 'mul', 'dup', 'push 1', 'sub', 'mul']
57  ['push 3', 'dup', 'dup', 'push 1', 'add', 'dup', 'mul', 'add', 'mul']
58  ['push 2', 'dup', 'dup', 'dup', 'add', 'mul', 'dup', 'dup', 'mul', 'sub', 'sub']
59  ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'sub', 'mul', 'push 1', 'sub']
60  ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'sub', 'mul']
61  ['push 1', 'push 2', 'dup', 'add', 'dup', 'dup', 'dup', 'mul', 'mul', 'sub', 'sub']
62  ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'push 2', 'sub']
63  ['push 3', 'dup', 'mul', 'dup', 'push 2', 'sub', 'mul']
64  ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul']
65  ['push 1', 'push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'add']
66  ['push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'add']
67  ['push 3', 'dup', 'push 1', 'add', 'dup', 'dup', 'mul', 'mul', 'add']
68  ['push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul']
69  ['push 1', 'push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul', 'add']
70  ['push 3', 'dup', 'add', 'dup', 'mul', 'push 1', 'sub', 'dup', 'add']
71  ['push 3', 'dup', 'add', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add']
72  ['push 3', 'dup', 'add', 'dup', 'dup', 'add', 'mul']
73  ['push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'mul', 'sub', 'sub']
74  ['push 1', 'push 3', 'dup', 'add', 'dup', 'mul', 'add', 'dup', 'add']
75  ['push 3', 'dup', 'push 2', 'add', 'dup', 'mul', 'mul']
76  ['push 1', 'push 3', 'dup', 'push 2', 'add', 'dup', 'mul', 'mul', 'add']
77  ['push 3', 'dup', 'mul', 'dup', 'mul', 'push 2', 'dup', 'add', 'sub']
78  ['push 3', 'dup', 'dup', 'dup', 'mul', 'mul', 'push 1', 'sub', 'mul']
79  ['push 3', 'dup', 'mul', 'dup', 'mul', 'push 2', 'sub']
80  ['push 3', 'dup', 'mul', 'dup', 'mul', 'push 1', 'sub']
81  ['push 3', 'dup', 'mul', 'dup', 'mul']
82  ['push 1', 'push 3', 'dup', 'mul', 'dup', 'mul', 'add']
83  ['push 2', 'push 3', 'dup', 'mul', 'dup', 'mul', 'add']
84  ['push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add']
85  ['push 1', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'add']
86  ['push 2', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'add']
87  ['push 3', 'dup', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'add']
88  ['push 2', 'dup', 'dup', 'add', 'mul', 'dup', 'push 3', 'add', 'mul']
89  ['push 3', 'dup', 'mul', 'dup', 'dup', 'mul', 'push 1', 'sub', 'add']
90  ['push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul']
91  ['push 1', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']
92  ['push 2', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']
93  ['push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']
94  ['push 1', 'push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'add']
95  ['push 1', 'push 3', 'dup', 'add', 'sub', 'dup', 'dup', 'add', 'dup', 'mul', 'add']
96  ['push 3', 'dup', 'push 1', 'add', 'dup', 'dup', 'add', 'mul', 'mul']
97  ['push 1', 'push 3', 'dup', 'push 1', 'add', 'dup', 'dup', 'add', 'mul', 'mul', 'add']
98  ['push 1', 'push 3', 'dup', 'add', 'add', 'dup', 'dup', 'add', 'mul']
99  ['push 3', 'dup', 'mul', 'dup', 'push 2', 'add', 'mul']
100 ['push 1', 'push 3', 'dup', 'mul', 'add', 'dup', 'mul']

This process is actually not limited to just pushing numbers (constants) onto the stack, we can actually find a sequence of operations that will create anything on the stack, e.g. finding the shortest way to create [9,12] on the stack might not be the same as just doing 9, and then 12.

9 ['push 3', 'dup', 'mul']
12 ['push 3', 'dup', 'push 1', 'add', 'mul']

vs

9,12 ['push 3', 'dup', 'mul', 'dup', 'push 3', 'add']

The problem with this solution, is if I ask for the number 123512436, this will take a very long time. So instead, we can find a fast and close to optimal solution instead. For this we take the N’th (integer) root of the number, with N increasing until the root is smaller than 173. Then we use dup and mul to to get the N’th power of the N’th root, getting us very close to the actual number. We then repeat this process and add the result recursively. Now finding a compact representation for 123512436 “only” takes 2sec resulting in:

123512436 ['push 3', 'dup', 'dup', 'add', 'dup', 'mul', 'push 1', 'sub', 'mul', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'push 5', 'dup', 'dup', 'mul', 'mul', 'dup', 'dup', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'dup', 'mul', 'push 1', 'push 3', 'dup', 'add', 'dup', 'mul', 'add', 'add', 'add', 'add']

We can even do very big numbers like

10528634093245891598124891409502082689253983140914951 ['push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'dup', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'dup', 'push 1', 'sub', 'add', 'mul', 'push 1', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'sub', 'dup', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'dup', 'push 1', 'sub', 'add', 'mul', 'push 1', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'push 1', 'add', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'dup', 'add', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 5', 'dup', 'dup', 'push 1', 'add', 'mul', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'push 1', 'add', 'mul', 'dup', 'dup', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'dup', 'add', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'push 1', 'add', 'dup', 'add', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'sub', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'mul', 'push 2', 'sub', 'dup', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'dup', 'add', 'dup', 'dup', 'mul', 'push 1', 'add', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'add', 'dup', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'add', 'dup', 'dup', 'add', 'dup', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'mul', 'push 1', 'add', 'dup', 'add', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'dup', 'push 2', 'add', 'mul', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 5', 'dup', 'push 1', 'add', 'dup', 'add', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'push 1', 'add', 'dup', 'mul', 'sub', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 2', 'push 5', 'dup', 'dup', 'mul', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 5', 'dup', 'push 1', 'add', 'dup', 'add', 'dup', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'dup', 'dup', 'add', 'mul', 'sub', 'sub', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'add', 'dup', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'sub', 'dup', 'dup', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'mul', 'dup', 'mul', 'dup', 'push 1', 'sub', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 3', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 1', 'push 5', 'dup', 'dup', 'mul', 'mul', 'add', 'dup', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'mul', 'push 5', 'dup', 'dup', 'mul', 'mul', 'push 1', 'sub', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'push 2', 'dup', 'add', 'dup', 'dup', 'mul', 'mul', 'dup', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'mul', 'push 3', 'dup', 'dup', 'mul', 'dup', 'push 1', 'add', 'mul', 'add', 'dup', 'dup', 'dup', 'mul', 'mul', 'mul', 'push 5', 'dup', 'dup', 'mul', 'push 2', 'sub', 'mul', 'dup', 'dup', 'mul', 'mul', 'push 2', 'push 3', 'dup', 'mul', 'dup', 'mul', 'add', 'dup', 'mul', 'push 3', 'dup', 'push 2', 'add', 'mul', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add', 'add']

We can see that we are currently not using repeating squaring, which could make the power function alot faster. And if we look at smaller numbers, the optimal

421 ['push 1', 'push 2', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'dup', 'push 1', 'add', 'mul', 'add']

takes 18sec using 14 pixels, becomes

421 ['push 2', 'dup', 'add', 'dup', 'push 1', 'add', 'mul', 'dup', 'mul', 'push 3', 'dup', 'dup', 'push 1', 'add', 'add', 'mul', 'add']

taking only 0.1sec using 20 pixels.

TODO Pixels

TODO Compiling from a simple stack langauge

TODO Structuring functions

TODO Heap and variables

TODO Dolphin to ELVM

TODO ELVM to Piet