1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2; File:         takr.sch
3; Description:  TAKR benchmark
4; Author:       Richard Gabriel
5; Created:      12-Apr-85
6; Modified:     12-Apr-85 10:12:43 (Bob Shaw)
7;               22-Jul-87 (Will Clinger)
8; Language:     Scheme
9; Status:       Public Domain
10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
12;;; TAKR  -- 100 function (count `em) version of TAK that tries to defeat cache
13;;; memory effects.  Results should be the same as for TAK on stack machines.
14;;; Distribution of calls is not completely flat.
15
16(define (tak x y z)
17  (define (tak0 x y z)
18    (cond ((not (< y x)) z)
19          (else (tak1 (tak37 (- x 1) y z)
20                      (tak11 (- y 1) z x)
21                      (tak17 (- z 1) x y)))))
22  (define (tak1 x y z)
23    (cond ((not (< y x)) z)
24          (else (tak2 (tak74 (- x 1) y z)
25                      (tak22 (- y 1) z x)
26                      (tak34 (- z 1) x y)))))
27  (define (tak2 x y z)
28    (cond ((not (< y x)) z)
29          (else (tak3 (tak11 (- x 1) y z)
30                      (tak33 (- y 1) z x)
31                      (tak51 (- z 1) x y)))))
32  (define (tak3 x y z)
33    (cond ((not (< y x)) z)
34          (else (tak4 (tak48 (- x 1) y z)
35                      (tak44 (- y 1) z x)
36                      (tak68 (- z 1) x y)))))
37  (define (tak4 x y z)
38    (cond ((not (< y x)) z)
39          (else (tak5 (tak85 (- x 1) y z)
40                      (tak55 (- y 1) z x)
41                      (tak85 (- z 1) x y)))))
42  (define (tak5 x y z)
43    (cond ((not (< y x)) z)
44          (else (tak6 (tak22 (- x 1) y z)
45                      (tak66 (- y 1) z x)
46                      (tak2 (- z 1) x y)))))
47  (define (tak6 x y z)
48    (cond ((not (< y x)) z)
49          (else (tak7 (tak59 (- x 1) y z)
50                      (tak77 (- y 1) z x)
51                      (tak19 (- z 1) x y)))))
52  (define (tak7 x y z)
53    (cond ((not (< y x)) z)
54          (else (tak8 (tak96 (- x 1) y z)
55                      (tak88 (- y 1) z x)
56                      (tak36 (- z 1) x y)))))
57  (define (tak8 x y z)
58    (cond ((not (< y x)) z)
59          (else (tak9 (tak33 (- x 1) y z)
60                      (tak99 (- y 1) z x)
61                      (tak53 (- z 1) x y)))))
62  (define (tak9 x y z)
63    (cond ((not (< y x)) z)
64          (else (tak10 (tak70 (- x 1) y z)
65                       (tak10 (- y 1) z x)
66                       (tak70 (- z 1) x y)))))
67  (define (tak10 x y z)
68    (cond ((not (< y x)) z)
69          (else (tak11 (tak7 (- x 1) y z)
70                       (tak21 (- y 1) z x)
71                       (tak87 (- z 1) x y)))))
72  (define (tak11 x y z)
73    (cond ((not (< y x)) z)
74          (else (tak12 (tak44 (- x 1) y z)
75                       (tak32 (- y 1) z x)
76                       (tak4 (- z 1) x y)))))
77  (define (tak12 x y z)
78    (cond ((not (< y x)) z)
79          (else (tak13 (tak81 (- x 1) y z)
80                       (tak43 (- y 1) z x)
81                       (tak21 (- z 1) x y)))))
82
83  (define (tak13 x y z)
84    (cond ((not (< y x)) z)
85          (else (tak14 (tak18 (- x 1) y z)
86                       (tak54 (- y 1) z x)
87                       (tak38 (- z 1) x y)))))
88  (define (tak14 x y z)
89    (cond ((not (< y x)) z)
90          (else (tak15 (tak55 (- x 1) y z)
91                       (tak65 (- y 1) z x)
92                       (tak55 (- z 1) x y)))))
93  (define (tak15 x y z)
94    (cond ((not (< y x)) z)
95          (else (tak16 (tak92 (- x 1) y z)
96                       (tak76 (- y 1) z x)
97                       (tak72 (- z 1) x y)))))
98  (define (tak16 x y z)
99    (cond ((not (< y x)) z)
100          (else (tak17 (tak29 (- x 1) y z)
101                       (tak87 (- y 1) z x)
102                       (tak89 (- z 1) x y)))))
103  (define (tak17 x y z)
104    (cond ((not (< y x)) z)
105          (else (tak18 (tak66 (- x 1) y z)
106                       (tak98 (- y 1) z x)
107                       (tak6 (- z 1) x y)))))
108  (define (tak18 x y z)
109    (cond ((not (< y x)) z)
110          (else (tak19 (tak3 (- x 1) y z)
111                       (tak9 (- y 1) z x)
112                       (tak23 (- z 1) x y)))))
113  (define (tak19 x y z)
114    (cond ((not (< y x)) z)
115          (else (tak20 (tak40 (- x 1) y z)
116                       (tak20 (- y 1) z x)
117                       (tak40 (- z 1) x y)))))
118  (define (tak20 x y z)
119    (cond ((not (< y x)) z)
120          (else (tak21 (tak77 (- x 1) y z)
121                       (tak31 (- y 1) z x)
122                       (tak57 (- z 1) x y)))))
123  (define (tak21 x y z)
124    (cond ((not (< y x)) z)
125          (else (tak22 (tak14 (- x 1) y z)
126                       (tak42 (- y 1) z x)
127                       (tak74 (- z 1) x y)))))
128  (define (tak22 x y z)
129    (cond ((not (< y x)) z)
130          (else (tak23 (tak51 (- x 1) y z)
131                       (tak53 (- y 1) z x)
132                       (tak91 (- z 1) x y)))))
133  (define (tak23 x y z)
134    (cond ((not (< y x)) z)
135          (else (tak24 (tak88 (- x 1) y z)
136                       (tak64 (- y 1) z x)
137                       (tak8 (- z 1) x y)))))
138  (define (tak24 x y z)
139    (cond ((not (< y x)) z)
140          (else (tak25 (tak25 (- x 1) y z)
141                       (tak75 (- y 1) z x)
142                       (tak25 (- z 1) x y)))))
143  (define (tak25 x y z)
144    (cond ((not (< y x)) z)
145          (else (tak26 (tak62 (- x 1) y z)
146                       (tak86 (- y 1) z x)
147                       (tak42 (- z 1) x y)))))
148  (define (tak26 x y z)
149    (cond ((not (< y x)) z)
150          (else (tak27 (tak99 (- x 1) y z)
151                       (tak97 (- y 1) z x)
152                       (tak59 (- z 1) x y)))))
153  (define (tak27 x y z)
154    (cond ((not (< y x)) z)
155          (else (tak28 (tak36 (- x 1) y z)
156                       (tak8 (- y 1) z x)
157                       (tak76 (- z 1) x y)))))
158  (define (tak28 x y z)
159    (cond ((not (< y x)) z)
160          (else (tak29 (tak73 (- x 1) y z)
161                       (tak19 (- y 1) z x)
162                       (tak93 (- z 1) x y)))))
163  (define (tak29 x y z)
164    (cond ((not (< y x)) z)
165          (else (tak30 (tak10 (- x 1) y z)
166                       (tak30 (- y 1) z x)
167                       (tak10 (- z 1) x y)))))
168  (define (tak30 x y z)
169    (cond ((not (< y x)) z)
170          (else (tak31 (tak47 (- x 1) y z)
171                       (tak41 (- y 1) z x)
172                       (tak27 (- z 1) x y)))))
173  (define (tak31 x y z)
174    (cond ((not (< y x)) z)
175          (else (tak32 (tak84 (- x 1) y z)
176                       (tak52 (- y 1) z x)
177                       (tak44 (- z 1) x y)))))
178  (define (tak32 x y z)
179    (cond ((not (< y x)) z)
180          (else (tak33 (tak21 (- x 1) y z)
181                       (tak63 (- y 1) z x)
182                       (tak61 (- z 1) x y)))))
183  (define (tak33 x y z)
184    (cond ((not (< y x)) z)
185          (else (tak34 (tak58 (- x 1) y z)
186                       (tak74 (- y 1) z x)
187                       (tak78 (- z 1) x y)))))
188  (define (tak34 x y z)
189    (cond ((not (< y x)) z)
190          (else (tak35 (tak95 (- x 1) y z)
191                       (tak85 (- y 1) z x)
192                       (tak95 (- z 1) x y)))))
193  (define (tak35 x y z)
194    (cond ((not (< y x)) z)
195          (else (tak36 (tak32 (- x 1) y z)
196                       (tak96 (- y 1) z x)
197                       (tak12 (- z 1) x y)))))
198  (define (tak36 x y z)
199    (cond ((not (< y x)) z)
200          (else (tak37 (tak69 (- x 1) y z)
201                       (tak7 (- y 1) z x)
202                       (tak29 (- z 1) x y)))))
203  (define (tak37 x y z)
204    (cond ((not (< y x)) z)
205          (else (tak38 (tak6 (- x 1) y z)
206                       (tak18 (- y 1) z x)
207                       (tak46 (- z 1) x y)))))
208  (define (tak38 x y z)
209    (cond ((not (< y x)) z)
210          (else (tak39 (tak43 (- x 1) y z)
211                       (tak29 (- y 1) z x)
212                       (tak63 (- z 1) x y)))))
213  (define (tak39 x y z)
214    (cond ((not (< y x)) z)
215          (else (tak40 (tak80 (- x 1) y z)
216                       (tak40 (- y 1) z x)
217                       (tak80 (- z 1) x y)))))
218  (define (tak40 x y z)
219    (cond ((not (< y x)) z)
220          (else (tak41 (tak17 (- x 1) y z)
221                       (tak51 (- y 1) z x)
222                       (tak97 (- z 1) x y)))))
223  (define (tak41 x y z)
224    (cond ((not (< y x)) z)
225          (else (tak42 (tak54 (- x 1) y z)
226                       (tak62 (- y 1) z x)
227                       (tak14 (- z 1) x y)))))
228  (define (tak42 x y z)
229    (cond ((not (< y x)) z)
230          (else (tak43 (tak91 (- x 1) y z)
231                       (tak73 (- y 1) z x)
232                       (tak31 (- z 1) x y)))))
233  (define (tak43 x y z)
234    (cond ((not (< y x)) z)
235          (else (tak44 (tak28 (- x 1) y z)
236                       (tak84 (- y 1) z x)
237                       (tak48 (- z 1) x y)))))
238  (define (tak44 x y z)
239    (cond ((not (< y x)) z)
240          (else (tak45 (tak65 (- x 1) y z)
241                       (tak95 (- y 1) z x)
242                       (tak65 (- z 1) x y)))))
243  (define (tak45 x y z)
244    (cond ((not (< y x)) z)
245          (else (tak46 (tak2 (- x 1) y z)
246                       (tak6 (- y 1) z x)
247                       (tak82 (- z 1) x y)))))
248  (define (tak46 x y z)
249    (cond ((not (< y x)) z)
250          (else (tak47 (tak39 (- x 1) y z)
251                       (tak17 (- y 1) z x)
252                       (tak99 (- z 1) x y)))))
253  (define (tak47 x y z)
254    (cond ((not (< y x)) z)
255          (else (tak48 (tak76 (- x 1) y z)
256                       (tak28 (- y 1) z x)
257                       (tak16 (- z 1) x y)))))
258  (define (tak48 x y z)
259    (cond ((not (< y x)) z)
260          (else (tak49 (tak13 (- x 1) y z)
261                       (tak39 (- y 1) z x)
262                       (tak33 (- z 1) x y)))))
263  (define (tak49 x y z)
264    (cond ((not (< y x)) z)
265          (else (tak50 (tak50 (- x 1) y z)
266                       (tak50 (- y 1) z x)
267                       (tak50 (- z 1) x y)))))
268  (define (tak50 x y z)
269    (cond ((not (< y x)) z)
270          (else (tak51 (tak87 (- x 1) y z)
271                       (tak61 (- y 1) z x)
272                       (tak67 (- z 1) x y)))))
273  (define (tak51 x y z)
274    (cond ((not (< y x)) z)
275          (else (tak52 (tak24 (- x 1) y z)
276                       (tak72 (- y 1) z x)
277                       (tak84 (- z 1) x y)))))
278  (define (tak52 x y z)
279    (cond ((not (< y x)) z)
280          (else (tak53 (tak61 (- x 1) y z)
281                       (tak83 (- y 1) z x)
282                       (tak1 (- z 1) x y)))))
283  (define (tak53 x y z)
284    (cond ((not (< y x)) z)
285          (else (tak54 (tak98 (- x 1) y z)
286                       (tak94 (- y 1) z x)
287                       (tak18 (- z 1) x y)))))
288  (define (tak54 x y z)
289    (cond ((not (< y x)) z)
290          (else (tak55 (tak35 (- x 1) y z)
291                       (tak5 (- y 1) z x)
292                       (tak35 (- z 1) x y)))))
293  (define (tak55 x y z)
294    (cond ((not (< y x)) z)
295          (else (tak56 (tak72 (- x 1) y z)
296                       (tak16 (- y 1) z x)
297                       (tak52 (- z 1) x y)))))
298  (define (tak56 x y z)
299    (cond ((not (< y x)) z)
300          (else (tak57 (tak9 (- x 1) y z)
301                       (tak27 (- y 1) z x)
302                       (tak69 (- z 1) x y)))))
303  (define (tak57 x y z)
304    (cond ((not (< y x)) z)
305          (else (tak58 (tak46 (- x 1) y z)
306                       (tak38 (- y 1) z x)
307                       (tak86 (- z 1) x y)))))
308  (define (tak58 x y z)
309    (cond ((not (< y x)) z)
310          (else (tak59 (tak83 (- x 1) y z)
311                       (tak49 (- y 1) z x)
312                       (tak3 (- z 1) x y)))))
313  (define (tak59 x y z)
314    (cond ((not (< y x)) z)
315          (else (tak60 (tak20 (- x 1) y z)
316                       (tak60 (- y 1) z x)
317                       (tak20 (- z 1) x y)))))
318  (define (tak60 x y z)
319    (cond ((not (< y x)) z)
320          (else (tak61 (tak57 (- x 1) y z)
321                       (tak71 (- y 1) z x)
322                       (tak37 (- z 1) x y)))))
323  (define (tak61 x y z)
324    (cond ((not (< y x)) z)
325          (else (tak62 (tak94 (- x 1) y z)
326                       (tak82 (- y 1) z x)
327                       (tak54 (- z 1) x y)))))
328  (define (tak62 x y z)
329    (cond ((not (< y x)) z)
330          (else (tak63 (tak31 (- x 1) y z)
331                       (tak93 (- y 1) z x)
332                       (tak71 (- z 1) x y)))))
333  (define (tak63 x y z)
334    (cond ((not (< y x)) z)
335          (else (tak64 (tak68 (- x 1) y z)
336                       (tak4 (- y 1) z x)
337                       (tak88 (- z 1) x y)))))
338  (define (tak64 x y z)
339    (cond ((not (< y x)) z)
340          (else (tak65 (tak5 (- x 1) y z)
341                       (tak15 (- y 1) z x)
342                       (tak5 (- z 1) x y)))))
343  (define (tak65 x y z)
344    (cond ((not (< y x)) z)
345          (else (tak66 (tak42 (- x 1) y z)
346                       (tak26 (- y 1) z x)
347                       (tak22 (- z 1) x y)))))
348  (define (tak66 x y z)
349    (cond ((not (< y x)) z)
350          (else (tak67 (tak79 (- x 1) y z)
351                       (tak37 (- y 1) z x)
352                       (tak39 (- z 1) x y)))))
353  (define (tak67 x y z)
354    (cond ((not (< y x)) z)
355          (else (tak68 (tak16 (- x 1) y z)
356                       (tak48 (- y 1) z x)
357                       (tak56 (- z 1) x y)))))
358  (define (tak68 x y z)
359    (cond ((not (< y x)) z)
360          (else (tak69 (tak53 (- x 1) y z)
361                       (tak59 (- y 1) z x)
362                       (tak73 (- z 1) x y)))))
363  (define (tak69 x y z)
364    (cond ((not (< y x)) z)
365          (else (tak70 (tak90 (- x 1) y z)
366                       (tak70 (- y 1) z x)
367                       (tak90 (- z 1) x y)))))
368  (define (tak70 x y z)
369    (cond ((not (< y x)) z)
370          (else (tak71 (tak27 (- x 1) y z)
371                       (tak81 (- y 1) z x)
372                       (tak7 (- z 1) x y)))))
373  (define (tak71 x y z)
374    (cond ((not (< y x)) z)
375          (else (tak72 (tak64 (- x 1) y z)
376                       (tak92 (- y 1) z x)
377                       (tak24 (- z 1) x y)))))
378  (define (tak72 x y z)
379    (cond ((not (< y x)) z)
380          (else (tak73 (tak1 (- x 1) y z)
381                       (tak3 (- y 1) z x)
382                       (tak41 (- z 1) x y)))))
383  (define (tak73 x y z)
384    (cond ((not (< y x)) z)
385          (else (tak74 (tak38 (- x 1) y z)
386                       (tak14 (- y 1) z x)
387                       (tak58 (- z 1) x y)))))
388  (define (tak74 x y z)
389    (cond ((not (< y x)) z)
390          (else (tak75 (tak75 (- x 1) y z)
391                       (tak25 (- y 1) z x)
392                       (tak75 (- z 1) x y)))))
393  (define (tak75 x y z)
394    (cond ((not (< y x)) z)
395          (else (tak76 (tak12 (- x 1) y z)
396                       (tak36 (- y 1) z x)
397                       (tak92 (- z 1) x y)))))
398  (define (tak76 x y z)
399    (cond ((not (< y x)) z)
400          (else (tak77 (tak49 (- x 1) y z)
401                       (tak47 (- y 1) z x)
402                       (tak9 (- z 1) x y)))))
403  (define (tak77 x y z)
404    (cond ((not (< y x)) z)
405          (else (tak78 (tak86 (- x 1) y z)
406                       (tak58 (- y 1) z x)
407                       (tak26 (- z 1) x y)))))
408  (define (tak78 x y z)
409    (cond ((not (< y x)) z)
410          (else (tak79 (tak23 (- x 1) y z)
411                       (tak69 (- y 1) z x)
412                       (tak43 (- z 1) x y)))))
413  (define (tak79 x y z)
414    (cond ((not (< y x)) z)
415          (else (tak80 (tak60 (- x 1) y z)
416                       (tak80 (- y 1) z x)
417                       (tak60 (- z 1) x y)))))
418  (define (tak80 x y z)
419    (cond ((not (< y x)) z)
420          (else (tak81 (tak97 (- x 1) y z)
421                       (tak91 (- y 1) z x)
422                       (tak77 (- z 1) x y)))))
423  (define (tak81 x y z)
424    (cond ((not (< y x)) z)
425          (else (tak82 (tak34 (- x 1) y z)
426                       (tak2 (- y 1) z x)
427                       (tak94 (- z 1) x y)))))
428  (define (tak82 x y z)
429    (cond ((not (< y x)) z)
430          (else (tak83 (tak71 (- x 1) y z)
431                       (tak13 (- y 1) z x)
432                       (tak11 (- z 1) x y)))))
433  (define (tak83 x y z)
434    (cond ((not (< y x)) z)
435          (else (tak84 (tak8 (- x 1) y z)
436                       (tak24 (- y 1) z x)
437                       (tak28 (- z 1) x y)))))
438  (define (tak84 x y z)
439    (cond ((not (< y x)) z)
440          (else (tak85 (tak45 (- x 1) y z)
441                       (tak35 (- y 1) z x)
442                       (tak45 (- z 1) x y)))))
443  (define (tak85 x y z)
444    (cond ((not (< y x)) z)
445          (else (tak86 (tak82 (- x 1) y z)
446                       (tak46 (- y 1) z x)
447                       (tak62 (- z 1) x y)))))
448  (define (tak86 x y z)
449    (cond ((not (< y x)) z)
450          (else (tak87 (tak19 (- x 1) y z)
451                       (tak57 (- y 1) z x)
452                       (tak79 (- z 1) x y)))))
453  (define (tak87 x y z)
454    (cond ((not (< y x)) z)
455          (else (tak88 (tak56 (- x 1) y z)
456                       (tak68 (- y 1) z x)
457                       (tak96 (- z 1) x y)))))
458  (define (tak88 x y z)
459    (cond ((not (< y x)) z)
460          (else (tak89 (tak93 (- x 1) y z)
461                       (tak79 (- y 1) z x)
462                       (tak13 (- z 1) x y)))))
463  (define (tak89 x y z)
464    (cond ((not (< y x)) z)
465          (else (tak90 (tak30 (- x 1) y z)
466                       (tak90 (- y 1) z x)
467                       (tak30 (- z 1) x y)))))
468  (define (tak90 x y z)
469    (cond ((not (< y x)) z)
470          (else (tak91 (tak67 (- x 1) y z)
471                       (tak1 (- y 1) z x)
472                       (tak47 (- z 1) x y)))))
473  (define (tak91 x y z)
474    (cond ((not (< y x)) z)
475          (else (tak92 (tak4 (- x 1) y z)
476                       (tak12 (- y 1) z x)
477                       (tak64 (- z 1) x y)))))
478  (define (tak92 x y z)
479    (cond ((not (< y x)) z)
480          (else (tak93 (tak41 (- x 1) y z)
481                       (tak23 (- y 1) z x)
482                       (tak81 (- z 1) x y)))))
483  (define (tak93 x y z)
484    (cond ((not (< y x)) z)
485          (else (tak94 (tak78 (- x 1) y z)
486                       (tak34 (- y 1) z x)
487                       (tak98 (- z 1) x y)))))
488  (define (tak94 x y z)
489    (cond ((not (< y x)) z)
490          (else (tak95 (tak15 (- x 1) y z)
491                       (tak45 (- y 1) z x)
492                       (tak15 (- z 1) x y)))))
493  (define (tak95 x y z)
494    (cond ((not (< y x)) z)
495          (else (tak96 (tak52 (- x 1) y z)
496                       (tak56 (- y 1) z x)
497                       (tak32 (- z 1) x y)))))
498  (define (tak96 x y z)
499    (cond ((not (< y x)) z)
500          (else (tak97 (tak89 (- x 1) y z)
501                       (tak67 (- y 1) z x)
502                       (tak49 (- z 1) x y)))))
503  (define (tak97 x y z)
504    (cond ((not (< y x)) z)
505          (else (tak98 (tak26 (- x 1) y z)
506                       (tak78 (- y 1) z x)
507                       (tak66 (- z 1) x y)))))
508  (define (tak98 x y z)
509    (cond ((not (< y x)) z)
510          (else (tak99 (tak63 (- x 1) y z)
511                       (tak89 (- y 1) z x)
512                       (tak83 (- z 1) x y)))))
513  (define (tak99 x y z)
514    (cond ((not (< y x)) z)
515          (else (tak0 (tak0 (- x 1) y z)
516                      (tak0 (- y 1) z x)
517                      (tak0 (- z 1) x y)))))
518
519  (tak0 x y z))
520
521;;; call:  (tak0 18 12 6)
522
523(let ((input (with-input-from-file "input.txt" read)))
524  (time
525   (let loop ((n 500) (v 0))
526     (if (zero? n)
527         v
528         (loop (- n 1) (tak 18 12 (if input 6 0)))))))
529