Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
5
Task/Man-or-boy-test/00-META.yaml
Normal file
5
Task/Man-or-boy-test/00-META.yaml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
category:
|
||||
- Recursion
|
||||
from: http://rosettacode.org/wiki/Man_or_boy_test
|
||||
note: Classic CS problems and programs
|
||||
225
Task/Man-or-boy-test/00-TASK.txt
Normal file
225
Task/Man-or-boy-test/00-TASK.txt
Normal file
|
|
@ -0,0 +1,225 @@
|
|||
<br>
|
||||
'''Background''': The '''man or boy test''' was proposed by computer scientist [[wp:Donald_Knuth|Donald Knuth]] as a means of evaluating implementations of the [[:Category:ALGOL 60|ALGOL 60]] programming language. The aim of the test was to distinguish compilers that correctly implemented "recursion and non-local references" from those that did not.
|
||||
|
||||
<blockquote style="font-style:italic">
|
||||
I have written the following simple routine, which may separate the 'man-compilers' from the 'boy-compilers'<br> — <span style="font-style:normal">Donald Knuth</span></blockquote>
|
||||
|
||||
'''Task''': Imitate [[#ALGOL 60 - Knuth's example|Knuth's example in Algol 60]] in another language, as far as possible.
|
||||
|
||||
'''Details''': Local variables of routines are often kept in [http://c2.com/cgi/wiki?ActivationRecord ''activation records''] (also ''call frames''). In many languages, these records are kept on a [[System stack|call stack]]. In Algol (and e.g. in [[Smalltalk]]), they are allocated on a [[heap]] instead. Hence it is possible to pass references to routines that still can use and update variables from their call environment, even if the routine where those variables are declared already returned. This difference in implementations is sometimes called the [[wp:Funarg_problem|Funarg Problem]].
|
||||
|
||||
In Knuth's example, each call to ''A'' allocates an activation record for the variable ''A''. When ''B'' is called from ''A'', any access to ''k'' now refers to this activation record. Now ''B'' in turn calls ''A'', but passes itself as an argument. This argument remains bound to the activation record. This call to ''A'' also "shifts" the variables ''x<sub>i</sub>'' by one place, so eventually the argument ''B'' (still bound to its particular
|
||||
activation record) will appear as ''x4'' or ''x5'' in a call to ''A''. If this happens when the expression ''x4 + x5'' is evaluated, then this will again call ''B'', which in turn will update ''k'' in the activation record it was originally bound to. As this activation record is shared with other instances of calls to ''A'' and ''B'', it will influence the whole computation.
|
||||
|
||||
So all the example does is to set up a convoluted calling structure, where updates to ''k'' can influence the behavior
|
||||
in completely different parts of the call tree.
|
||||
|
||||
Knuth used this to test the correctness of the compiler, but one can of course also use it to test that other languages can emulate the Algol behavior correctly. If the handling of activation records is correct, the computed value will be −67.
|
||||
|
||||
'''Performance and Memory''': Man or Boy is intense and can be pushed to challenge any machine. Memory (both stack and heap) not CPU time is the constraining resource as the recursion creates a proliferation activation records which will quickly exhaust memory and present itself through a stack error. Each language may have ways of adjusting the amount of memory or increasing the recursion depth. Optionally, show how you would make such adjustments.
|
||||
|
||||
The table below shows the result, call depths, and total calls for a range of ''k'':
|
||||
{| class="wikitable" style="font-size: 85%"
|
||||
! ''k''
|
||||
! 0
|
||||
! 1
|
||||
! 2
|
||||
! 3
|
||||
! 4
|
||||
! 5
|
||||
! 6
|
||||
! 7
|
||||
! 8
|
||||
! 9
|
||||
! 10
|
||||
! 11
|
||||
! 12
|
||||
! 13
|
||||
! 14
|
||||
! 15
|
||||
! 16
|
||||
! 17
|
||||
! 18
|
||||
! 19
|
||||
! 20
|
||||
! 21
|
||||
! 22
|
||||
! 23
|
||||
! 24
|
||||
! 25
|
||||
! 26
|
||||
! 27
|
||||
! 28
|
||||
! 29
|
||||
! 30
|
||||
|-
|
||||
! ''A''
|
||||
|align="right"| 1
|
||||
|align="right"| 0
|
||||
|align="right"| -2
|
||||
|align="right"| 0
|
||||
|align="right"| 1
|
||||
|align="right"| 0
|
||||
|align="right"| 1
|
||||
|align="right"| -1
|
||||
|align="right"| -10
|
||||
|align="right"| -30
|
||||
|align="right"| -67
|
||||
|align="right"| -138
|
||||
|align="right"| -291
|
||||
|align="right"| -642
|
||||
|align="right"| -1,446
|
||||
|align="right"| -3,250
|
||||
|align="right"| -7,244
|
||||
|align="right"| -16,065
|
||||
|align="right"| -35,601
|
||||
|align="right"| -78,985
|
||||
|align="right"| -175,416
|
||||
|align="right"| -389,695
|
||||
|align="right"| -865,609
|
||||
|align="right"| -1,922,362
|
||||
|align="right"| -4,268,854
|
||||
|align="right"| -9,479,595
|
||||
|align="right"| -21,051,458
|
||||
|align="right"| -46,750,171
|
||||
|align="right"| -103,821,058
|
||||
|align="right"| -230,560,902
|
||||
|align="right"| -512,016,658
|
||||
|-
|
||||
! ''A'' called
|
||||
|align="right"| 1
|
||||
|align="right"| 2
|
||||
|align="right"| 3
|
||||
|align="right"| 4
|
||||
|align="right"| 8
|
||||
|align="right"| 18
|
||||
|align="right"| 38
|
||||
|align="right"| 80
|
||||
|align="right"| 167
|
||||
|align="right"| 347
|
||||
|align="right"| 722
|
||||
|align="right"| 1,509
|
||||
|align="right"| 3,168
|
||||
|align="right"| 6,673
|
||||
|align="right"| 14,091
|
||||
|align="right"| 29,825
|
||||
|align="right"| 63,287
|
||||
|align="right"| 134,652
|
||||
|align="right"| 287,264
|
||||
|align="right"| 614,442
|
||||
|align="right"| 1,317,533
|
||||
|align="right"| 2,831,900
|
||||
|align="right"| 6,100,852
|
||||
|align="right"| 13,172,239
|
||||
|align="right"| 28,499,827
|
||||
|align="right"| 61,786,266
|
||||
|align="right"| 134,202,509
|
||||
|align="right"| 292,011,464
|
||||
|
|
||||
|
|
||||
|
|
||||
|-
|
||||
! ''A'' depth
|
||||
|align="right"| 1
|
||||
|align="right"| 2
|
||||
|align="right"| 3
|
||||
|align="right"| 4
|
||||
|align="right"| 8
|
||||
|align="right"| 16
|
||||
|align="right"| 32
|
||||
|align="right"| 64
|
||||
|align="right"| 128
|
||||
|align="right"| 256
|
||||
|align="right"| 512
|
||||
|align="right"| 1,024
|
||||
|align="right"| 2,048
|
||||
|align="right"| 4,096
|
||||
|align="right"| 8,192
|
||||
|align="right"| 16,384
|
||||
|align="right"| 32,768
|
||||
|align="right"| 65,536
|
||||
|align="right"| 131,072
|
||||
|align="right"| 262,144
|
||||
|align="right"| 524,288
|
||||
|align="right"| 1,048,576
|
||||
|align="right"| 2,097,152
|
||||
|align="right"| 4,194,304
|
||||
|align="right"| 8,388,608
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|-
|
||||
! ''B'' called
|
||||
|align="right"| 0
|
||||
|align="right"| 1
|
||||
|align="right"| 2
|
||||
|align="right"| 3
|
||||
|align="right"| 7
|
||||
|align="right"| 17
|
||||
|align="right"| 37
|
||||
|align="right"| 79
|
||||
|align="right"| 166
|
||||
|align="right"| 346
|
||||
|align="right"| 721
|
||||
|align="right"| 1,508
|
||||
|align="right"| 3,167
|
||||
|align="right"| 6,672
|
||||
|align="right"| 14,090
|
||||
|align="right"| 29,824
|
||||
|align="right"| 63,286
|
||||
|align="right"| 134,651
|
||||
|align="right"| 287,263
|
||||
|align="right"| 614,441
|
||||
|align="right"| 1,317,532
|
||||
|align="right"| 2,831,899
|
||||
|align="right"| 6,100,851
|
||||
|align="right"| 13,172,238
|
||||
|align="right"| 28,499,826
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|-
|
||||
! ''B'' depth
|
||||
|align="right"| 0
|
||||
|align="right"| 1
|
||||
|align="right"| 2
|
||||
|align="right"| 3
|
||||
|align="right"| 7
|
||||
|align="right"| 15
|
||||
|align="right"| 31
|
||||
|align="right"| 63
|
||||
|align="right"| 127
|
||||
|align="right"| 255
|
||||
|align="right"| 511
|
||||
|align="right"| 1,023
|
||||
|align="right"| 2,047
|
||||
|align="right"| 4,095
|
||||
|align="right"| 8,191
|
||||
|align="right"| 16,383
|
||||
|align="right"| 32,767
|
||||
|align="right"| 65,535
|
||||
|align="right"| 131,071
|
||||
|align="right"| 262,143
|
||||
|align="right"| 524,287
|
||||
|align="right"| 1,048,575
|
||||
|align="right"| 2,097,151
|
||||
|align="right"| 4,194,303
|
||||
|align="right"| 8,388,607
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|}
|
||||
<br>
|
||||
;Related tasks:
|
||||
* [[Jensen's Device]]
|
||||
<br>
|
||||
|
||||
9
Task/Man-or-boy-test/ALGOL-68/man-or-boy-test.alg
Normal file
9
Task/Man-or-boy-test/ALGOL-68/man-or-boy-test.alg
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
PROC a = (INT in k, PROC INT xl, x2, x3, x4, x5) INT:(
|
||||
INT k := in k;
|
||||
PROC b = INT: a(k-:=1, b, xl, x2, x3, x4);
|
||||
( k<=0 | x4 + x5 | b )
|
||||
);
|
||||
|
||||
test:(
|
||||
printf(($gl$,a(10, INT:1, INT:-1, INT:-1, INT:1, INT:0)))
|
||||
)
|
||||
11
Task/Man-or-boy-test/ALGOL-W/man-or-boy-test.alg
Normal file
11
Task/Man-or-boy-test/ALGOL-W/man-or-boy-test.alg
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
begin
|
||||
real procedure A (integer value k; real procedure x1, x2, x3, x4, x5);
|
||||
begin
|
||||
real procedure B;
|
||||
begin k:= k - 1;
|
||||
A (k, B, x1, x2, x3, x4)
|
||||
end;
|
||||
if k <= 0 then x4 + x5 else B
|
||||
end;
|
||||
write (r_format := "A", r_w := 8, r_d := 2, A (10, 1, -1, -1, 1, 0))
|
||||
end.
|
||||
36
Task/Man-or-boy-test/Ada/man-or-boy-test-1.ada
Normal file
36
Task/Man-or-boy-test/Ada/man-or-boy-test-1.ada
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
procedure Man_Or_Boy is
|
||||
function Zero return Integer is begin return 0; end Zero;
|
||||
function One return Integer is begin return 1; end One;
|
||||
function Neg return Integer is begin return -1; end Neg;
|
||||
|
||||
function A
|
||||
( K : Integer;
|
||||
X1, X2, X3, X4, X5 : access function return Integer
|
||||
) return Integer is
|
||||
M : Integer := K; -- K is read-only in Ada. Here is a mutable copy of
|
||||
function B return Integer is
|
||||
begin
|
||||
M := M - 1;
|
||||
return A (M, B'Access, X1, X2, X3, X4);
|
||||
end B;
|
||||
begin
|
||||
if M <= 0 then
|
||||
return X4.all + X5.all;
|
||||
else
|
||||
return B;
|
||||
end if;
|
||||
end A;
|
||||
begin
|
||||
Put_Line
|
||||
( Integer'Image
|
||||
( A
|
||||
( 10,
|
||||
One'Access, -- Returns 1
|
||||
Neg'Access, -- Returns -1
|
||||
Neg'Access, -- Returns -1
|
||||
One'Access, -- Returns 1
|
||||
Zero'Access -- Returns 0
|
||||
) ) );
|
||||
end Man_Or_Boy;
|
||||
30
Task/Man-or-boy-test/Ada/man-or-boy-test-2.ada
Normal file
30
Task/Man-or-boy-test/Ada/man-or-boy-test-2.ada
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
procedure Man_Or_Boy is
|
||||
function Zero return Integer is (0);
|
||||
function One return Integer is (1);
|
||||
function Neg return Integer is (-1);
|
||||
|
||||
function A
|
||||
(K : Integer;
|
||||
X1, X2, X3, X4, X5 : access function return Integer)
|
||||
return Integer is
|
||||
M : Integer := K; -- K is read-only in Ada. Here is a mutable copy of
|
||||
function B return Integer is
|
||||
begin
|
||||
M := M - 1;
|
||||
return A (M, B'Access, X1, X2, X3, X4);
|
||||
end B;
|
||||
begin
|
||||
return (if M <= 0 then X4.all + X5.all else B);
|
||||
end A;
|
||||
begin
|
||||
Put_Line
|
||||
(Integer'Image
|
||||
(A (K => 10,
|
||||
X1 => One'Access,
|
||||
X2 => Neg'Access,
|
||||
X3 => Neg'Access,
|
||||
X4 => One'Access,
|
||||
X5 => Zero'Access)));
|
||||
end Man_Or_Boy;
|
||||
41
Task/Man-or-boy-test/Ada/man-or-boy-test-3.ada
Normal file
41
Task/Man-or-boy-test/Ada/man-or-boy-test-3.ada
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
with Ada.Text_IO;
|
||||
use Ada.Text_IO;
|
||||
|
||||
procedure Man_Or_Boy is
|
||||
|
||||
function Zero return Integer is ( 0);
|
||||
function One return Integer is ( 1);
|
||||
function Neg return Integer is (-1);
|
||||
|
||||
function A (K: Integer;
|
||||
X1, X2, X3, X4, X5: access function return Integer) return Integer is
|
||||
M : Integer := K; -- K is read-only in Ada. Here is a mutable copy of K
|
||||
Res_A: Integer;
|
||||
function B return Integer is
|
||||
begin
|
||||
M := M - 1;
|
||||
Res_A := A (M, B'Access, X1, X2, X3, X4); -- set result of A
|
||||
return Res_A;
|
||||
end B;
|
||||
begin
|
||||
if M <= 0 then
|
||||
return X4.all + X5.all;
|
||||
else
|
||||
declare
|
||||
Dummy: constant Integer := B; -- throw away
|
||||
begin
|
||||
return Res_A;
|
||||
end;
|
||||
end if;
|
||||
end A;
|
||||
|
||||
begin
|
||||
|
||||
Put_Line (Integer'Image (A (K => 10,
|
||||
X1 => One 'Access,
|
||||
X2 => Neg 'Access,
|
||||
X3 => Neg 'Access,
|
||||
X4 => One 'Access,
|
||||
X5 => Zero'Access)));
|
||||
|
||||
end Man_Or_Boy;
|
||||
52
Task/Man-or-boy-test/Aime/man-or-boy-test.aime
Normal file
52
Task/Man-or-boy-test/Aime/man-or-boy-test.aime
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
integer
|
||||
F(list l)
|
||||
{
|
||||
l[1];
|
||||
}
|
||||
|
||||
integer
|
||||
eval(list l)
|
||||
{
|
||||
l[0](l);
|
||||
}
|
||||
|
||||
integer A(list);
|
||||
|
||||
integer
|
||||
B(list l)
|
||||
{
|
||||
A(list(B, l[1] = l[1] - 1, l, l[-5], l[-4], l[-3], l[-2]));
|
||||
}
|
||||
|
||||
integer
|
||||
A(list l)
|
||||
{
|
||||
integer x;
|
||||
|
||||
if (l[1] < 1) {
|
||||
x = eval(l[-2]) + eval(l[-1]);
|
||||
} else {
|
||||
x = B(l);
|
||||
}
|
||||
|
||||
x;
|
||||
}
|
||||
|
||||
integer
|
||||
main(void)
|
||||
{
|
||||
list f1, f0, fn1;
|
||||
|
||||
l_append(f1, F);
|
||||
l_append(f1, 1);
|
||||
|
||||
l_append(f0, F);
|
||||
l_append(f0, 0);
|
||||
|
||||
l_append(fn1, F);
|
||||
l_append(fn1, -1);
|
||||
|
||||
o_(A(list(B, 10, f1, fn1, fn1, f1, f0)), "\n");
|
||||
|
||||
0;
|
||||
}
|
||||
20
Task/Man-or-boy-test/AppleScript/man-or-boy-test.applescript
Normal file
20
Task/Man-or-boy-test/AppleScript/man-or-boy-test.applescript
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
on a(k, x1, x2, x3, x4, x5)
|
||||
script b
|
||||
set k to k - 1
|
||||
return a(k, b, x1, x2, x3, x4)
|
||||
end script
|
||||
if k ≤ 0 then
|
||||
return (run x4) + (run x5)
|
||||
else
|
||||
return (run b)
|
||||
end if
|
||||
end a
|
||||
|
||||
on int(x)
|
||||
script s
|
||||
return x
|
||||
end script
|
||||
return s
|
||||
end int
|
||||
|
||||
a(10, int(1), int(-1), int(-1), int(1), int(0))
|
||||
25
Task/Man-or-boy-test/BBC-BASIC/man-or-boy-test.basic
Normal file
25
Task/Man-or-boy-test/BBC-BASIC/man-or-boy-test.basic
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
HIMEM = PAGE + 200000000 : REM Increase recursion depth
|
||||
|
||||
FOR k% = 0 TO 20
|
||||
PRINT FNA(k%, ^FN1(), ^FN_1(), ^FN_1(), ^FN1(), ^FN0())
|
||||
NEXT
|
||||
END
|
||||
|
||||
DEF FNA(k%, x1%, x2%, x3%, x4%, x5%)
|
||||
IF k% <= 0 THEN = FN(x4%)(x4%) + FN(x5%)(x5%)
|
||||
LOCAL b{}
|
||||
DIM b{fn%, k%, x1%, x2%, x3%, x4%, x5%}
|
||||
b.fn% = !^FNB()
|
||||
b.k% = k%
|
||||
b.x1% = x1%
|
||||
b.x2% = x2%
|
||||
b.x3% = x3%
|
||||
b.x4% = x4%
|
||||
b.x5% = x5%
|
||||
DEF FNB(!(^b{}+4))
|
||||
b.k% -= 1
|
||||
= FNA(b.k%, b{}, b.x1%, b.x2%, b.x3%, b.x4%)
|
||||
|
||||
DEF FN0(d%) = 0
|
||||
DEF FN1(d%) = 1
|
||||
DEF FN_1(d%) = -1
|
||||
53
Task/Man-or-boy-test/C++/man-or-boy-test-1.cpp
Normal file
53
Task/Man-or-boy-test/C++/man-or-boy-test-1.cpp
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
#include <iostream>
|
||||
#include <tr1/memory>
|
||||
using std::tr1::shared_ptr;
|
||||
using std::tr1::enable_shared_from_this;
|
||||
|
||||
struct Arg {
|
||||
virtual int run() = 0;
|
||||
virtual ~Arg() { };
|
||||
};
|
||||
|
||||
int A(int, shared_ptr<Arg>, shared_ptr<Arg>, shared_ptr<Arg>,
|
||||
shared_ptr<Arg>, shared_ptr<Arg>);
|
||||
|
||||
class B : public Arg, public enable_shared_from_this<B> {
|
||||
private:
|
||||
int k;
|
||||
const shared_ptr<Arg> x1, x2, x3, x4;
|
||||
|
||||
public:
|
||||
B(int _k, shared_ptr<Arg> _x1, shared_ptr<Arg> _x2, shared_ptr<Arg> _x3,
|
||||
shared_ptr<Arg> _x4)
|
||||
: k(_k), x1(_x1), x2(_x2), x3(_x3), x4(_x4) { }
|
||||
int run() {
|
||||
return A(--k, shared_from_this(), x1, x2, x3, x4);
|
||||
}
|
||||
};
|
||||
|
||||
class Const : public Arg {
|
||||
private:
|
||||
const int x;
|
||||
public:
|
||||
Const(int _x) : x(_x) { }
|
||||
int run () { return x; }
|
||||
};
|
||||
|
||||
int A(int k, shared_ptr<Arg> x1, shared_ptr<Arg> x2, shared_ptr<Arg> x3,
|
||||
shared_ptr<Arg> x4, shared_ptr<Arg> x5) {
|
||||
if (k <= 0)
|
||||
return x4->run() + x5->run();
|
||||
else {
|
||||
shared_ptr<Arg> b(new B(k, x1, x2, x3, x4));
|
||||
return b->run();
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
std::cout << A(10, shared_ptr<Arg>(new Const(1)),
|
||||
shared_ptr<Arg>(new Const(-1)),
|
||||
shared_ptr<Arg>(new Const(-1)),
|
||||
shared_ptr<Arg>(new Const(1)),
|
||||
shared_ptr<Arg>(new Const(0))) << std::endl;
|
||||
return 0;
|
||||
}
|
||||
25
Task/Man-or-boy-test/C++/man-or-boy-test-2.cpp
Normal file
25
Task/Man-or-boy-test/C++/man-or-boy-test-2.cpp
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#include <functional>
|
||||
#include <iostream>
|
||||
|
||||
typedef std::function<int()> F;
|
||||
|
||||
static int A(int k, const F &x1, const F &x2, const F &x3, const F &x4, const F &x5)
|
||||
{
|
||||
F B = [=, &k, &B]
|
||||
{
|
||||
return A(--k, B, x1, x2, x3, x4);
|
||||
};
|
||||
|
||||
return k <= 0 ? x4() + x5() : B();
|
||||
}
|
||||
|
||||
static F L(int n)
|
||||
{
|
||||
return [n] { return n; };
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout << A(10, L(1), L(-1), L(-1), L(1), L(0)) << std::endl;
|
||||
return 0;
|
||||
}
|
||||
32
Task/Man-or-boy-test/C++/man-or-boy-test-3.cpp
Normal file
32
Task/Man-or-boy-test/C++/man-or-boy-test-3.cpp
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
#include <tr1/functional>
|
||||
#include <iostream>
|
||||
|
||||
typedef std::tr1::function<int()> F;
|
||||
|
||||
static int A(int k, const F &x1, const F &x2, const F &x3, const F &x4, const F &x5);
|
||||
|
||||
struct B_class {
|
||||
int &k;
|
||||
const F x1, x2, x3, x4;
|
||||
B_class(int &_k, const F &_x1, const F &_x2, const F &_x3, const F &_x4) :
|
||||
k(_k), x1(_x1), x2(_x2), x3(_x3), x4(_x4) { }
|
||||
int operator()() const { return A(--k, *this, x1, x2, x3, x4); }
|
||||
};
|
||||
|
||||
static int A(int k, const F &x1, const F &x2, const F &x3, const F &x4, const F &x5)
|
||||
{
|
||||
F B = B_class(k, x1, x2, x3, x4);
|
||||
return k <= 0 ? x4() + x5() : B();
|
||||
}
|
||||
|
||||
struct L {
|
||||
const int n;
|
||||
L(int _n) : n(_n) { }
|
||||
int operator()() const { return n; }
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
std::cout << A(10, L(1), L(-1), L(-1), L(1), L(0)) << std::endl;
|
||||
return 0;
|
||||
}
|
||||
23
Task/Man-or-boy-test/C-sharp/man-or-boy-test-1.cs
Normal file
23
Task/Man-or-boy-test/C-sharp/man-or-boy-test-1.cs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
|
||||
delegate T Func<T>();
|
||||
|
||||
class ManOrBoy
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
Console.WriteLine(A(10, C(1), C(-1), C(-1), C(1), C(0)));
|
||||
}
|
||||
|
||||
static Func<int> C(int i)
|
||||
{
|
||||
return delegate { return i; };
|
||||
}
|
||||
|
||||
static int A(int k, Func<int> x1, Func<int> x2, Func<int> x3, Func<int> x4, Func<int> x5)
|
||||
{
|
||||
Func<int> b = null;
|
||||
b = delegate { k--; return A(k, b, x1, x2, x3, x4); };
|
||||
return k <= 0 ? x4() + x5() : b();
|
||||
}
|
||||
}
|
||||
16
Task/Man-or-boy-test/C-sharp/man-or-boy-test-2.cs
Normal file
16
Task/Man-or-boy-test/C-sharp/man-or-boy-test-2.cs
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
|
||||
class ManOrBoy
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
Console.WriteLine(A(10, () => 1, () => -1, () => -1, () => 1, () => 0));
|
||||
}
|
||||
|
||||
static int A(int k, Func<int> x1, Func<int> x2, Func<int> x3, Func<int> x4, Func<int> x5)
|
||||
{
|
||||
Func<int> b = null;
|
||||
b = () => { k--; return A(k, b, x1, x2, x3, x4); };
|
||||
return k <= 0 ? x4() + x5() : b();
|
||||
}
|
||||
}
|
||||
43
Task/Man-or-boy-test/C/man-or-boy-test-1.c
Normal file
43
Task/Man-or-boy-test/C/man-or-boy-test-1.c
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/* man-or-boy.c */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
// --- thunks
|
||||
typedef struct arg
|
||||
{
|
||||
int (*fn)(struct arg*);
|
||||
int *k;
|
||||
struct arg *x1, *x2, *x3, *x4, *x5;
|
||||
} ARG;
|
||||
|
||||
// --- lambdas
|
||||
int f_1 (ARG* _) { return -1; }
|
||||
int f0 (ARG* _) { return 0; }
|
||||
int f1 (ARG* _) { return 1; }
|
||||
|
||||
// --- helper
|
||||
int eval(ARG* a) { return a->fn(a); }
|
||||
#define MAKE_ARG(...) (&(ARG){__VA_ARGS__})
|
||||
#define FUN(...) MAKE_ARG(B, &k, __VA_ARGS__)
|
||||
|
||||
int A(ARG*);
|
||||
|
||||
// --- functions
|
||||
int B(ARG* a)
|
||||
{
|
||||
int k = *a->k -= 1;
|
||||
return A(FUN(a, a->x1, a->x2, a->x3, a->x4));
|
||||
}
|
||||
|
||||
int A(ARG* a)
|
||||
{
|
||||
return *a->k <= 0 ? eval(a->x4) + eval(a->x5) : B(a);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int k = argc == 2 ? strtol(argv[1], 0, 0) : 10;
|
||||
printf("%d\n", A(FUN(MAKE_ARG(f1), MAKE_ARG(f_1), MAKE_ARG(f_1),
|
||||
MAKE_ARG(f1), MAKE_ARG(f0))));
|
||||
return 0;
|
||||
}
|
||||
11
Task/Man-or-boy-test/C/man-or-boy-test-2.c
Normal file
11
Task/Man-or-boy-test/C/man-or-boy-test-2.c
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
#include <stdio.h>
|
||||
#define INT(body) ({ int lambda(){ body; }; lambda; })
|
||||
main(){
|
||||
int a(int k, int xl(), int x2(), int x3(), int x4(), int x5()){
|
||||
int b(){
|
||||
return a(--k, b, xl, x2, x3, x4);
|
||||
}
|
||||
return k<=0 ? x4() + x5() : b();
|
||||
}
|
||||
printf(" %d\n",a(10, INT(return 1), INT(return -1), INT(return -1), INT(return 1), INT(return 0)));
|
||||
}
|
||||
47
Task/Man-or-boy-test/C/man-or-boy-test-3.c
Normal file
47
Task/Man-or-boy-test/C/man-or-boy-test-3.c
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
typedef struct frame
|
||||
{
|
||||
int (*fn)(struct frame*);
|
||||
union { int constant; int* k; } u;
|
||||
struct frame *x1, *x2, *x3, *x4, *x5;
|
||||
} FRAME;
|
||||
|
||||
FRAME* Frame(FRAME* f, int* k, FRAME* x1, FRAME* x2, FRAME *x3, FRAME *x4, FRAME *x5)
|
||||
{
|
||||
f->u.k = k;
|
||||
f->x1 = x1;
|
||||
f->x2 = x2;
|
||||
f->x3 = x3;
|
||||
f->x4 = x4;
|
||||
f->x5 = x5;
|
||||
return f;
|
||||
}
|
||||
|
||||
int F(FRAME* a) { return a->u.constant; }
|
||||
|
||||
int eval(FRAME* a) { return a->fn(a); }
|
||||
|
||||
int A(FRAME*);
|
||||
|
||||
int B(FRAME* a)
|
||||
{
|
||||
int k = (*a->u.k -= 1);
|
||||
FRAME b = { B };
|
||||
return A(Frame(&b, &k, a, a->x1, a->x2, a->x3, a->x4));
|
||||
}
|
||||
|
||||
int A(FRAME* a)
|
||||
{
|
||||
return *a->u.k <= 0 ? eval(a->x4) + eval(a->x5) : B(a);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int k = argc == 2 ? strtol(argv[1], 0, 0) : 10;
|
||||
FRAME a = { B }, f1 = { F, { 1 } }, f0 = { F, { 0 } }, fn1 = { F, { -1 } };
|
||||
|
||||
printf("%d\n", A(Frame(&a, &k, &f1, &fn1, &fn1, &f1, &f0)));
|
||||
return 0;
|
||||
}
|
||||
25
Task/Man-or-boy-test/Clipper/man-or-boy-test.clipper
Normal file
25
Task/Man-or-boy-test/Clipper/man-or-boy-test.clipper
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
Procedure Main()
|
||||
Local k
|
||||
For k := 0 to 20
|
||||
? "A(", k, ", 1, -1, -1, 1, 0) =", A(k, 1, -1, -1, 1, 0)
|
||||
Next
|
||||
Return
|
||||
|
||||
Static Function A(k, x1, x2, x3, x4, x5)
|
||||
Local ARetVal
|
||||
Local B := {|| --k, ARetVal := A(k, B, x1, x2, x3, x4) }
|
||||
If k <= 0
|
||||
ARetVal := Evaluate(x4) + Evaluate(x5)
|
||||
Else
|
||||
B:Eval()
|
||||
Endif
|
||||
Return ARetVal
|
||||
|
||||
Static Function Evaluate(x)
|
||||
Local xVal
|
||||
If ValType(x) == "B"
|
||||
xVal := x:Eval()
|
||||
Else
|
||||
xVal := x
|
||||
Endif
|
||||
Return xVal
|
||||
24
Task/Man-or-boy-test/Clojure/man-or-boy-test.clj
Normal file
24
Task/Man-or-boy-test/Clojure/man-or-boy-test.clj
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
(declare a)
|
||||
|
||||
(defn man-or-boy
|
||||
"Man or boy test for Clojure"
|
||||
[k]
|
||||
(let [k (atom k)]
|
||||
(a k
|
||||
(fn [] 1)
|
||||
(fn [] -1)
|
||||
(fn [] -1)
|
||||
(fn [] 1)
|
||||
(fn [] 0))))
|
||||
|
||||
(defn a
|
||||
[k x1 x2 x3 x4 x5]
|
||||
(let [k (atom @k)]
|
||||
(letfn [(b []
|
||||
(swap! k dec)
|
||||
(a k b x1 x2 x3 x4))]
|
||||
(if (<= @k 0)
|
||||
(+ (x4) (x5))
|
||||
(b)))))
|
||||
|
||||
(man-or-boy 10)
|
||||
16
Task/Man-or-boy-test/Common-Lisp/man-or-boy-test.lisp
Normal file
16
Task/Man-or-boy-test/Common-Lisp/man-or-boy-test.lisp
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
(defun man-or-boy (x)
|
||||
(a x (lambda () 1)
|
||||
(lambda () -1)
|
||||
(lambda () -1)
|
||||
(lambda () 1)
|
||||
(lambda () 0)))
|
||||
|
||||
(defun a (k x1 x2 x3 x4 x5)
|
||||
(labels ((b ()
|
||||
(decf k)
|
||||
(a k #'b x1 x2 x3 x4)))
|
||||
(if (<= k 0)
|
||||
(+ (funcall x4) (funcall x5))
|
||||
(b))))
|
||||
|
||||
(man-or-boy 10)
|
||||
7
Task/Man-or-boy-test/Crystal/man-or-boy-test.crystal
Normal file
7
Task/Man-or-boy-test/Crystal/man-or-boy-test.crystal
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
def a(k, x1, x2, x3, x4, x5)
|
||||
b = uninitialized -> typeof(k)
|
||||
b = ->() { k -= 1; a(k, b, x1, x2, x3, x4) }
|
||||
k <= 0 ? x4.call + x5.call : b.call
|
||||
end
|
||||
|
||||
puts a(10, -> {1}, -> {-1}, -> {-1}, -> {1}, -> {0})
|
||||
14
Task/Man-or-boy-test/D/man-or-boy-test-1.d
Normal file
14
Task/Man-or-boy-test/D/man-or-boy-test-1.d
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
import core.stdc.stdio: printf;
|
||||
|
||||
int a(int k, const lazy int x1, const lazy int x2, const lazy int x3,
|
||||
const lazy int x4, const lazy int x5) pure {
|
||||
int b() {
|
||||
k--;
|
||||
return a(k, b(), x1, x2, x3, x4);
|
||||
}
|
||||
return k <= 0 ? x4 + x5 : b();
|
||||
}
|
||||
|
||||
void main() {
|
||||
printf("%d\n", a(10, 1, -1, -1, 1, 0));
|
||||
}
|
||||
14
Task/Man-or-boy-test/D/man-or-boy-test-2.d
Normal file
14
Task/Man-or-boy-test/D/man-or-boy-test-2.d
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
int A(int k, int delegate() nothrow @safe[] x...) nothrow @safe {
|
||||
int b() nothrow @safe {
|
||||
k--;
|
||||
return A(k, &b, x[0], x[1], x[2], x[3]);
|
||||
}
|
||||
|
||||
return (k > 0) ? b() : x[3]() + x[4]();
|
||||
}
|
||||
|
||||
void main() {
|
||||
import std.stdio;
|
||||
|
||||
A(10, 1, -1, -1, 1, 0).writeln;
|
||||
}
|
||||
28
Task/Man-or-boy-test/D/man-or-boy-test-3.d
Normal file
28
Task/Man-or-boy-test/D/man-or-boy-test-3.d
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
auto mb(T)(T mob) nothrow @safe { // Embeding function.
|
||||
int b() nothrow @safe @nogc {
|
||||
static if (is(T == int))
|
||||
return mob;
|
||||
else
|
||||
return mob();
|
||||
}
|
||||
|
||||
return &b;
|
||||
}
|
||||
|
||||
int A(T)(int k, T x1, T x2, T x3, T x4, T x5) nothrow @safe {
|
||||
static if (is(T == int)) {
|
||||
return A(k, mb(x1), mb(x2), mb(x3), mb(x4), mb(x5));
|
||||
} else {
|
||||
int b() nothrow @safe {
|
||||
k--;
|
||||
return A(k, &b, x1, x2, x3, x4);
|
||||
}
|
||||
return (k <= 0) ? x4() + x5() : b();
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
import std.stdio;
|
||||
|
||||
A(10, 1, -1, -1, 1, 0).writeln;
|
||||
}
|
||||
40
Task/Man-or-boy-test/D/man-or-boy-test-4.d
Normal file
40
Task/Man-or-boy-test/D/man-or-boy-test-4.d
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
import std.stdio;
|
||||
|
||||
interface B {
|
||||
int run();
|
||||
}
|
||||
|
||||
int A(int k, int x1, int x2, int x3, int x4, int x5) {
|
||||
B mb(int a) {
|
||||
return new class() B {
|
||||
int run() {
|
||||
return a;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return A(k, mb(x1), mb(x2), mb(x3), mb(x4), mb(x5));
|
||||
}
|
||||
|
||||
int A(int k, B x1, B x2, B x3, B x4, B x5) {
|
||||
if (k <= 0) {
|
||||
return x4.run() + x5.run();
|
||||
} else {
|
||||
return (new class() B {
|
||||
int m;
|
||||
|
||||
this() {
|
||||
this.m = k;
|
||||
}
|
||||
|
||||
int run() {
|
||||
m--;
|
||||
return A(m, this, x1, x2, x3, x4);
|
||||
}
|
||||
}).run();
|
||||
}
|
||||
}
|
||||
|
||||
void main() {
|
||||
writeln(A(10, 1, -1, -1, 1, 0));
|
||||
}
|
||||
57
Task/Man-or-boy-test/D/man-or-boy-test-5.d
Normal file
57
Task/Man-or-boy-test/D/man-or-boy-test-5.d
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import std.bigint, std.functional;
|
||||
|
||||
// Adapted from C code by Goran Weinholt, adapted from Knuth code.
|
||||
BigInt A(in int k, in int x1, in int x2, in int x3,
|
||||
in int x4, in int x5) {
|
||||
static struct Inner {
|
||||
static BigInt c1_(in int k) {
|
||||
if (k > 5)
|
||||
return c1(k - 1) + c2(k - 1);
|
||||
static immutable t = [0, 0, 0, 1, 2, 3];
|
||||
return t[k].BigInt;
|
||||
}
|
||||
alias c1 = memoize!c1_;
|
||||
|
||||
static BigInt c2_(in int k) {
|
||||
if (k > 5)
|
||||
return c2(k - 1) + c3(k - 1);
|
||||
static immutable t = [0, 0, 1, 1, 1, 2];
|
||||
return t[k].BigInt;
|
||||
}
|
||||
alias c2 = memoize!c2_;
|
||||
|
||||
static BigInt c3_(in int k) {
|
||||
if (k > 5)
|
||||
return c3(k - 1) + c4(k);
|
||||
static immutable t = [0, 1, 1, 0, 0, 1];
|
||||
return t[k].BigInt;
|
||||
}
|
||||
alias c3 = memoize!c3_;
|
||||
|
||||
static BigInt c4_(in int k) {
|
||||
if (k > 5)
|
||||
return c1(k - 1) + c4(k - 1) - 1;
|
||||
static immutable t = [1, 1, 0, 0, 0, 0];
|
||||
return t[k].BigInt;
|
||||
}
|
||||
alias c4 = memoize!c4_;
|
||||
|
||||
static int c5(in int k) pure nothrow {
|
||||
return !!k;
|
||||
}
|
||||
}
|
||||
|
||||
with (Inner)
|
||||
return c1(k) * x1 + c2(k) * x2 + c3(k) * x3 +
|
||||
c4(k) * x4 + c5(k) * x5;
|
||||
}
|
||||
|
||||
void main() {
|
||||
import std.stdio, std.conv, std.range;
|
||||
|
||||
foreach (immutable i; 0 .. 40)
|
||||
writeln(i, " ", A(i, 1, -1, -1, 1, 0));
|
||||
|
||||
writefln("...\n500 %-(%s\\\n %)",
|
||||
A(500, 1, -1, -1, 1, 0).text.chunks(60));
|
||||
}
|
||||
29
Task/Man-or-boy-test/Delphi/man-or-boy-test.delphi
Normal file
29
Task/Man-or-boy-test/Delphi/man-or-boy-test.delphi
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
type
|
||||
TFunc<T> = reference to function: T;
|
||||
|
||||
function C(x: Integer): TFunc<Integer>;
|
||||
begin
|
||||
Result := function: Integer
|
||||
begin
|
||||
Result := x;
|
||||
end;
|
||||
end;
|
||||
|
||||
function A(k: Integer; x1, x2, x3, x4, x5: TFunc<Integer>): Integer;
|
||||
var
|
||||
b: TFunc<Integer>;
|
||||
begin
|
||||
b := function: Integer
|
||||
begin
|
||||
Dec(k);
|
||||
Result := A(k, b, x1, x2, x3, x4);
|
||||
end;
|
||||
if k <= 0 then
|
||||
Result := x4 + x5
|
||||
else
|
||||
Result := b;
|
||||
end;
|
||||
|
||||
begin
|
||||
Writeln(A(10, C(1), C(-1), C(-1), C(1), C(0))); // -67 output
|
||||
end.
|
||||
21
Task/Man-or-boy-test/Dyalect/man-or-boy-test.dyalect
Normal file
21
Task/Man-or-boy-test/Dyalect/man-or-boy-test.dyalect
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
func _C(i) {
|
||||
() => i
|
||||
}
|
||||
|
||||
func _A(k, x1, x2, x3, x4, x5) {
|
||||
var b
|
||||
b = () => {
|
||||
k -= 1
|
||||
_A(k, b, x1, x2, x3, x4)
|
||||
}
|
||||
if k <= 0 {
|
||||
x4() + x5()
|
||||
} else {
|
||||
b()
|
||||
}
|
||||
}
|
||||
|
||||
for i in 1..20 {
|
||||
let res = _A(i, _C(1), _C(-1), _C(-1), _C(1), _C(0))
|
||||
print("\(i)\t= \(res)")
|
||||
}
|
||||
27
Task/Man-or-boy-test/Dylan/man-or-boy-test.dylan
Normal file
27
Task/Man-or-boy-test/Dylan/man-or-boy-test.dylan
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
define method a
|
||||
(k :: <integer>, x1 :: <function>, x2 :: <function>, x3 :: <function>,
|
||||
x4 :: <function>, x5 :: <function>)
|
||||
=> (i :: <integer>)
|
||||
|
||||
local b() => (i :: <integer>)
|
||||
k := k - 1;
|
||||
a(k, b, x1, x2, x3, x4)
|
||||
end;
|
||||
|
||||
if (k <= 0) x4() + x5() else b() end if
|
||||
|
||||
end method a;
|
||||
|
||||
define method man-or-boy
|
||||
(x :: <integer>)
|
||||
=> (i :: <integer>)
|
||||
|
||||
a(x, method() 1 end,
|
||||
method() -1 end,
|
||||
method() -1 end,
|
||||
method() 1 end,
|
||||
method() 0 end)
|
||||
|
||||
end method man-or-boy;
|
||||
|
||||
format-out("%d\n", man-or-boy(10))
|
||||
15
Task/Man-or-boy-test/E/man-or-boy-test.e
Normal file
15
Task/Man-or-boy-test/E/man-or-boy-test.e
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
def a(var k, &x1, &x2, &x3, &x4, &x5) {
|
||||
def bS; def &b := bS
|
||||
bind bS {
|
||||
to get() {
|
||||
k -= 1
|
||||
return a(k, &b, &x1, &x2, &x3, &x4)
|
||||
}
|
||||
}
|
||||
return if (k <= 0) { x4 + x5 } else { b }
|
||||
}
|
||||
|
||||
def p := 1
|
||||
def n := -1
|
||||
def z := 0
|
||||
println(a(10, &p, &n, &n, &p, &z))
|
||||
10
Task/Man-or-boy-test/EMal/man-or-boy-test.emal
Normal file
10
Task/Man-or-boy-test/EMal/man-or-boy-test.emal
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
fun A = int by int k, fun x1, fun x2, fun x3, fun x4, fun x5
|
||||
fun B = int by block do return A(--k, B, x1, x2, x3, x4) end
|
||||
return when(k <= 0, x4() + x5(), B())
|
||||
end
|
||||
fun C = fun by int i
|
||||
return int by block do return i end
|
||||
end
|
||||
for int i = 0; i <= 11; i++
|
||||
writeLine("A(" + i + ") = " + A(i, C(1), C(-1), C(-1), C(1), C(0) ))
|
||||
end
|
||||
16
Task/Man-or-boy-test/EchoLisp/man-or-boy-test.l
Normal file
16
Task/Man-or-boy-test/EchoLisp/man-or-boy-test.l
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
;; copied from Scheme
|
||||
(define (A k x1 x2 x3 x4 x5)
|
||||
(define (B)
|
||||
(set! k (- k 1))
|
||||
(A k B x1 x2 x3 x4))
|
||||
(if (<= k 0)
|
||||
(+ (x4) (x5))
|
||||
(B)))
|
||||
|
||||
(A 10 (lambda () 1) (lambda () -1) (lambda () -1) (lambda () 1) (lambda () 0))
|
||||
→ -67
|
||||
(A 13 (lambda () 1) (lambda () -1) (lambda () -1) (lambda () 1) (lambda () 0))
|
||||
→ -642
|
||||
(A 14 ..)
|
||||
❗ InternalError : too much recursion - JS internal error (please, report it)-
|
||||
→ stack overflow using FireFox
|
||||
15
Task/Man-or-boy-test/Ela/man-or-boy-test.ela
Normal file
15
Task/Man-or-boy-test/Ela/man-or-boy-test.ela
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
open monad io unsafe.cell unsafe.console
|
||||
|
||||
liftM2 f m1 m2 = do
|
||||
x1 <- m1
|
||||
x2 <- m2
|
||||
return (f x1 x2)
|
||||
|
||||
a k x1 x2 x3 x4 x5 = do
|
||||
r <- return $ ref k
|
||||
let b = & do k <- return $ pred (valueof r)
|
||||
a k b x1 x2 x3 x4
|
||||
if k <= 0 then liftM2 (+) x4 x5 else b
|
||||
|
||||
_ = a 10 (!!1) (!! -1) (!! -1) (!!1) (!!0) >>= (putStr << show) ::: IO
|
||||
where (!!) f = & return f ::: IO
|
||||
25
Task/Man-or-boy-test/Elena/man-or-boy-test.elena
Normal file
25
Task/Man-or-boy-test/Elena/man-or-boy-test.elena
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import extensions;
|
||||
|
||||
A(k,x1,x2,x3,x4,x5)
|
||||
{
|
||||
var m := new ref<int>(k);
|
||||
|
||||
var b := { m -= 1; ^ A(m,this self,x1,x2,x3,x4) };
|
||||
|
||||
if (m <= 0)
|
||||
{
|
||||
^ x4() + x5()
|
||||
}
|
||||
else
|
||||
{
|
||||
^ b()
|
||||
}
|
||||
}
|
||||
|
||||
public program()
|
||||
{
|
||||
for(int n := 0, n <= 14, n += 1)
|
||||
{
|
||||
console.printLine(A(n,{^1},{^-1},{^-1},{^1},{^0}))
|
||||
}
|
||||
}
|
||||
20
Task/Man-or-boy-test/F-Sharp/man-or-boy-test-1.fs
Normal file
20
Task/Man-or-boy-test/F-Sharp/man-or-boy-test-1.fs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
[<EntryPoint>]
|
||||
let main (args : string[]) =
|
||||
let k = int(args.[0])
|
||||
|
||||
let l x = fun() -> x
|
||||
|
||||
let rec a k x1 x2 x3 x4 x5 =
|
||||
if k <= 0 then
|
||||
x4() + x5()
|
||||
else
|
||||
let k = ref k
|
||||
let rec b() =
|
||||
k := !k - 1
|
||||
a !k b x1 x2 x3 x4
|
||||
b()
|
||||
|
||||
a k (l 1) (l -1) (l -1) (l 1) (l 0)
|
||||
|> printfn "%A"
|
||||
|
||||
0
|
||||
55
Task/Man-or-boy-test/F-Sharp/man-or-boy-test-2.fs
Normal file
55
Task/Man-or-boy-test/F-Sharp/man-or-boy-test-2.fs
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
type Tramp<'t> =
|
||||
| Delay of (unit -> Tramp<'t>)
|
||||
| Bind of Tramp<'t> * ('t -> Tramp<'t>)
|
||||
| Return of 't
|
||||
| ReturnFrom of Tramp<'t>
|
||||
|
||||
type Tramp() =
|
||||
member this.Delay(f) = Delay f
|
||||
member this.Bind(x, f) = Bind(x, f)
|
||||
member this.Return(x) = Return x
|
||||
member this.ReturnFrom(x) = ReturnFrom x
|
||||
|
||||
let tramp = Tramp()
|
||||
|
||||
let run (tr : Tramp<'t>) =
|
||||
let rec loop tr stack =
|
||||
match tr with
|
||||
| Delay f -> loop (f()) stack
|
||||
| Bind(x, f) -> loop x (f :: stack)
|
||||
| Return x ->
|
||||
match stack with
|
||||
| [] -> x
|
||||
| f :: stack' -> loop (f x) stack'
|
||||
| ReturnFrom tr -> loop tr stack
|
||||
loop tr []
|
||||
|
||||
[<EntryPoint>]
|
||||
let main (args : string[]) =
|
||||
let k = int(args.[0])
|
||||
|
||||
let l x = fun() -> Return x
|
||||
|
||||
tramp {
|
||||
let rec a k x1 x2 x3 x4 x5 =
|
||||
tramp {
|
||||
if k <= 0 then
|
||||
let! x4' = x4()
|
||||
let! x5' = x5()
|
||||
return x4' + x5'
|
||||
else
|
||||
let k = ref k
|
||||
let rec b() =
|
||||
tramp {
|
||||
k := !k - 1
|
||||
return! a !k b x1 x2 x3 x4
|
||||
}
|
||||
return! b()
|
||||
}
|
||||
|
||||
return! a k (l 1) (l -1) (l -1) (l 1) (l 0)
|
||||
}
|
||||
|> run
|
||||
|> printfn "%A"
|
||||
|
||||
0
|
||||
14
Task/Man-or-boy-test/Fantom/man-or-boy-test.fantom
Normal file
14
Task/Man-or-boy-test/Fantom/man-or-boy-test.fantom
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
class ManOrBoy
|
||||
{
|
||||
Void main()
|
||||
{
|
||||
echo(A(10, |->Int|{1}, |->Int|{-1}, |->Int|{-1}, |->Int|{1}, |->Int|{0}));
|
||||
}
|
||||
|
||||
static Int A(Int k, |->Int| x1, |->Int| x2, |->Int| x3, |->Int| x4, |->Int| x5)
|
||||
{
|
||||
|->Int|? b
|
||||
b = |->Int| { k--; return A(k, b, x1, x2, x3, x4) }
|
||||
return k <= 0 ? x4() + x5() : b()
|
||||
}
|
||||
}
|
||||
7
Task/Man-or-boy-test/Forth/man-or-boy-test.fth
Normal file
7
Task/Man-or-boy-test/Forth/man-or-boy-test.fth
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
: A {: w^ k x1 x2 x3 xt: x4 xt: x5 | w^ B :} recursive
|
||||
k @ 0<= IF x4 x5 f+ ELSE
|
||||
B k x1 x2 x3 action-of x4 [{: B k x1 x2 x3 x4 :}L
|
||||
-1 k +!
|
||||
k @ B @ x1 x2 x3 x4 A ;] dup B !
|
||||
execute THEN ;
|
||||
10 [: 1e ;] [: -1e ;] 2dup swap [: 0e ;] A f.
|
||||
56
Task/Man-or-boy-test/Fortran/man-or-boy-test.f
Normal file
56
Task/Man-or-boy-test/Fortran/man-or-boy-test.f
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
module man_or_boy
|
||||
|
||||
implicit none
|
||||
|
||||
contains
|
||||
|
||||
recursive integer function A(k,x1,x2,x3,x4,x5) result(res)
|
||||
integer, intent(in) :: k
|
||||
interface
|
||||
recursive integer function x1()
|
||||
end function
|
||||
recursive integer function x2()
|
||||
end function
|
||||
recursive integer function x3()
|
||||
end function
|
||||
recursive integer function x4()
|
||||
end function
|
||||
recursive integer function x5()
|
||||
end function
|
||||
end interface
|
||||
integer :: m
|
||||
if ( k <= 0 ) then
|
||||
res = x4()+x5()
|
||||
else
|
||||
m = k
|
||||
res = B()
|
||||
end if
|
||||
|
||||
contains
|
||||
|
||||
recursive integer function B() result(res)
|
||||
m = m-1
|
||||
res = A(m,B,x1,x2,x3,x4)
|
||||
end function B
|
||||
|
||||
end function A
|
||||
|
||||
|
||||
recursive integer function one() result(res)
|
||||
res = 1
|
||||
end function
|
||||
|
||||
recursive integer function minus_one() result(res)
|
||||
res = -1
|
||||
end function
|
||||
|
||||
recursive integer function zero() result(res)
|
||||
res = 0
|
||||
end function
|
||||
|
||||
end module man_or_boy
|
||||
|
||||
program test
|
||||
use man_or_boy
|
||||
write (*,*) A(10,one,minus_one,minus_one,one,zero)
|
||||
end program test
|
||||
19
Task/Man-or-boy-test/Go/man-or-boy-test-1.go
Normal file
19
Task/Man-or-boy-test/Go/man-or-boy-test-1.go
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
package main
|
||||
import "fmt"
|
||||
|
||||
func a(k int, x1, x2, x3, x4, x5 func() int) int {
|
||||
var b func() int
|
||||
b = func() int {
|
||||
k--
|
||||
return a(k, b, x1, x2, x3, x4)
|
||||
}
|
||||
if k <= 0 {
|
||||
return x4() + x5()
|
||||
}
|
||||
return b()
|
||||
}
|
||||
|
||||
func main() {
|
||||
x := func(i int) func() int { return func() int { return i } }
|
||||
fmt.Println(a(10, x(1), x(-1), x(-1), x(1), x(0)))
|
||||
}
|
||||
24
Task/Man-or-boy-test/Go/man-or-boy-test-2.go
Normal file
24
Task/Man-or-boy-test/Go/man-or-boy-test-2.go
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func A(k int, x1, x2, x3, x4, x5 func() int) (a int) {
|
||||
var B func() int
|
||||
B = func() (b int) {
|
||||
k--
|
||||
a = A(k, B, x1, x2, x3, x4)
|
||||
b = a
|
||||
return
|
||||
}
|
||||
if k <= 0 {
|
||||
a = x4() + x5()
|
||||
} else {
|
||||
_ = B()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
K := func(x int) func() int { return func() int { return x } }
|
||||
fmt.Println(A(10, K(1), K(-1), K(-1), K(1), K(0)))
|
||||
}
|
||||
34
Task/Man-or-boy-test/Go/man-or-boy-test-3.go
Normal file
34
Task/Man-or-boy-test/Go/man-or-boy-test-3.go
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func eval(v interface{}) int {
|
||||
switch v := v.(type) {
|
||||
case int:
|
||||
return v
|
||||
case func() int:
|
||||
return v()
|
||||
}
|
||||
panic("bad type")
|
||||
return 0
|
||||
}
|
||||
|
||||
func A(k int, x1, x2, x3, x4, x5 interface{}) (a int) {
|
||||
var B func() int
|
||||
B = func() (b int) {
|
||||
k--
|
||||
a = A(k, B, x1, x2, x3, x4)
|
||||
b = a
|
||||
return
|
||||
}
|
||||
if k <= 0 {
|
||||
a = eval(x4) + eval(x5)
|
||||
} else {
|
||||
_ = B()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func main() {
|
||||
fmt.Println(A(10, 1, -1, -1, 1, 0))
|
||||
}
|
||||
49
Task/Man-or-boy-test/Go/man-or-boy-test-4.go
Normal file
49
Task/Man-or-boy-test/Go/man-or-boy-test-4.go
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
)
|
||||
|
||||
func A(k int) *big.Int {
|
||||
if k < 6 {
|
||||
var x1, x2, x3, x4 int64 = 1, -1, -1, 1
|
||||
c1 := []int64{0, 0, 0, 1, 2, 3}[k]
|
||||
c2 := []int64{0, 0, 1, 1, 1, 2}[k]
|
||||
c3 := []int64{0, 1, 1, 0, 0, 1}[k]
|
||||
c4 := []int64{1, 1, 0, 0, 0, 0}[k]
|
||||
t := c1*x1 + c2*x2 + c3*x3 + c4*x4
|
||||
return big.NewInt(t)
|
||||
}
|
||||
one := big.NewInt(1)
|
||||
c0 := big.NewInt(3)
|
||||
c1 := big.NewInt(2)
|
||||
c2 := big.NewInt(1)
|
||||
c3 := big.NewInt(0)
|
||||
for j := 5; j < k; j++ {
|
||||
c3.Sub(c3.Add(c3, c0), one)
|
||||
c0.Add(c0, c1)
|
||||
c1.Add(c1, c2)
|
||||
c2.Add(c2, c3)
|
||||
}
|
||||
return c0.Add(c0.Sub(c0.Sub(c0, c1), c2), c3)
|
||||
}
|
||||
|
||||
func p(k int) {
|
||||
fmt.Printf("A(%d) = ", k)
|
||||
if s := A(k).String(); len(s) < 60 {
|
||||
fmt.Println(s)
|
||||
} else {
|
||||
fmt.Printf("%s...%s (%d digits)\n",
|
||||
s[:6], s[len(s)-5:], len(s)-1)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
for i := 0; i < 40; i++ {
|
||||
p(i)
|
||||
}
|
||||
p(500)
|
||||
p(10000)
|
||||
p(1e6)
|
||||
}
|
||||
10
Task/Man-or-boy-test/Gosu/man-or-boy-test.gosu
Normal file
10
Task/Man-or-boy-test/Gosu/man-or-boy-test.gosu
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
function A(in_k: int, x1(): int, x2(): int, x3(): int, x4(): int, x5(): int): int {
|
||||
var k = in_k
|
||||
var B(): int // B is a function variable
|
||||
B = \ -> {
|
||||
k = k-1;
|
||||
return A(k, B, x1, x2, x3, x4)
|
||||
}
|
||||
return k<=0 ? x4()+x5() : B()
|
||||
}
|
||||
print(A(10, \ -> 1, \ -> -1, \ -> -1, \ -> 1, \ -> 0))
|
||||
8
Task/Man-or-boy-test/Groovy/man-or-boy-test-1.groovy
Normal file
8
Task/Man-or-boy-test/Groovy/man-or-boy-test-1.groovy
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
def a; a = { k, x1, x2, x3, x4, x5 ->
|
||||
def b; b = {
|
||||
a (--k, b, x1, x2, x3, x4)
|
||||
}
|
||||
k <= 0 ? x4() + x5() : b()
|
||||
}
|
||||
|
||||
def x = { n -> { it -> n } }
|
||||
1
Task/Man-or-boy-test/Groovy/man-or-boy-test-2.groovy
Normal file
1
Task/Man-or-boy-test/Groovy/man-or-boy-test-2.groovy
Normal file
|
|
@ -0,0 +1 @@
|
|||
println (a(10, x(1), x(-1), x(-1), x(1), x(0)))
|
||||
3
Task/Man-or-boy-test/Groovy/man-or-boy-test-3.groovy
Normal file
3
Task/Man-or-boy-test/Groovy/man-or-boy-test-3.groovy
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
(0..20).each { k ->
|
||||
printf ("%3d: %7d\n", k, a(k, x(1), x(-1), x(-1), x(1), x(0)))
|
||||
}
|
||||
20
Task/Man-or-boy-test/Haskell/man-or-boy-test.hs
Normal file
20
Task/Man-or-boy-test/Haskell/man-or-boy-test.hs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import Data.IORef (modifyIORef, newIORef, readIORef)
|
||||
|
||||
a
|
||||
:: (Enum a, Num b, Num a, Ord a)
|
||||
=> a -> IO b -> IO b -> IO b -> IO b -> IO b -> IO b
|
||||
a k x1 x2 x3 x4 x5 = do
|
||||
r <- newIORef k
|
||||
let b = do
|
||||
k <- pred ! r
|
||||
a k b x1 x2 x3 x4
|
||||
if k <= 0
|
||||
then (+) <$> x4 <*> x5
|
||||
else b
|
||||
where
|
||||
f !r = modifyIORef r f >> readIORef r
|
||||
|
||||
main :: IO ()
|
||||
main = a 10 # 1 # (-1) # (-1) # 1 # 0 >>= print
|
||||
where
|
||||
( # ) f = f . return
|
||||
23
Task/Man-or-boy-test/Icon/man-or-boy-test-1.icon
Normal file
23
Task/Man-or-boy-test/Icon/man-or-boy-test-1.icon
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
record mutable(value) # we need mutable integers
|
||||
# ... be obvious when we break normal scope rules
|
||||
procedure main(arglist) # supply the initial k value
|
||||
k := integer(arglist[1])|10 # .. or default to 10=default
|
||||
write("Man or Boy = ", A( k, 1, -1, -1, 1, 0 ) )
|
||||
end
|
||||
|
||||
procedure eval(ref) # evaluator to distinguish between a simple value and a code reference
|
||||
return if type(ref) == "co-expression" then @ref else ref
|
||||
end
|
||||
|
||||
procedure A(k,x1,x2,x3,x4,x5) # Knuth's A
|
||||
k := mutable(k) # make k mutable for B
|
||||
return if k.value <= 0 then # -> boy compilers may recurse and die here
|
||||
eval(x4) + eval(x5) # the crux of separating man .v. boy compilers
|
||||
else # -> boy compilers can run into trouble at k=5+
|
||||
B(k,x1,x2,x3,x4,x5)
|
||||
end
|
||||
|
||||
procedure B(k,x1,x2,x3,x4,x5) # Knuth's B
|
||||
k.value -:= 1 # diddle A's copy of k
|
||||
return A(k.value, create |B(k,x1,x2,x3,x4,x5),x1,x2,x3,x4) # call A with a new k and 5 x's
|
||||
end
|
||||
10
Task/Man-or-boy-test/Icon/man-or-boy-test-2.icon
Normal file
10
Task/Man-or-boy-test/Icon/man-or-boy-test-2.icon
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
record defercall(proc,arglist) # light weight alternative to co-expr for MoB
|
||||
|
||||
procedure eval(ref) # evaluator to distinguish between a simple value and a code reference
|
||||
return if type(ref) == "defercall" then ref.proc!ref.arglist else ref
|
||||
end
|
||||
|
||||
procedure B(k,x1,x2,x3,x4,x5) # Knuth's B
|
||||
k.value -:= 1 # diddle A's copy of k
|
||||
return A(k.value, defercall(B,[k,x1,x2,x3,x4,x5]),x1,x2,x3,x4)# call A with a new k and 5 x's
|
||||
end
|
||||
14
Task/Man-or-boy-test/Io/man-or-boy-test.io
Normal file
14
Task/Man-or-boy-test/Io/man-or-boy-test.io
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
Range
|
||||
|
||||
a := method(k, xs,
|
||||
b := block(
|
||||
k = k -1
|
||||
a(k, list(b, xs slice(0,4)) flatten))
|
||||
if(k <= 0,
|
||||
(xs at(3) call) + (xs at(4) call),
|
||||
b call))
|
||||
|
||||
f := method(x, block(x))
|
||||
1 to(500) foreach(k,
|
||||
(k .. " ") print
|
||||
a(k, list(1, -1, -1, 1, 0) map (x, f(x))) println)
|
||||
13
Task/Man-or-boy-test/J/man-or-boy-test-1.j
Normal file
13
Task/Man-or-boy-test/J/man-or-boy-test-1.j
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
A=:4 :0
|
||||
L=.cocreate'' NB. L is context where names are defined.
|
||||
k__L=:x
|
||||
'`x1__L x2__L x3__L x4__L x5__L'=:y
|
||||
if.k__L<:0 do.a__L=:(x4__L + x5__L)f.'' else. L B '' end.
|
||||
(coerase L)]]]a__L
|
||||
)
|
||||
|
||||
B=:4 :0
|
||||
L=.x
|
||||
k__L=:k__L-1
|
||||
a__L=:k__L A L&B`(x1__L f.)`(x2__L f.)`(x3__L f.)`(x4__L f.)
|
||||
)
|
||||
2
Task/Man-or-boy-test/J/man-or-boy-test-2.j
Normal file
2
Task/Man-or-boy-test/J/man-or-boy-test-2.j
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
10 A 1:`_1:`_1:`1:`0:
|
||||
_67
|
||||
21
Task/Man-or-boy-test/Java/man-or-boy-test-1.java
Normal file
21
Task/Man-or-boy-test/Java/man-or-boy-test-1.java
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
import java.util.function.DoubleSupplier;
|
||||
|
||||
public class ManOrBoy {
|
||||
|
||||
static double A(int k, DoubleSupplier x1, DoubleSupplier x2,
|
||||
DoubleSupplier x3, DoubleSupplier x4, DoubleSupplier x5) {
|
||||
|
||||
DoubleSupplier B = new DoubleSupplier() {
|
||||
int m = k;
|
||||
public double getAsDouble() {
|
||||
return A(--m, this, x1, x2, x3, x4);
|
||||
}
|
||||
};
|
||||
|
||||
return k <= 0 ? x4.getAsDouble() + x5.getAsDouble() : B.getAsDouble();
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(A(10, () -> 1.0, () -> -1.0, () -> -1.0, () -> 1.0, () -> 0.0));
|
||||
}
|
||||
}
|
||||
27
Task/Man-or-boy-test/Java/man-or-boy-test-2.java
Normal file
27
Task/Man-or-boy-test/Java/man-or-boy-test-2.java
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
public class ManOrBoy {
|
||||
interface Arg {
|
||||
public int run();
|
||||
}
|
||||
|
||||
public static int A(final int k, final Arg x1, final Arg x2,
|
||||
final Arg x3, final Arg x4, final Arg x5) {
|
||||
if (k <= 0)
|
||||
return x4.run() + x5.run();
|
||||
return new Arg() {
|
||||
int m = k;
|
||||
public int run() {
|
||||
m--;
|
||||
return A(m, this, x1, x2, x3, x4);
|
||||
}
|
||||
}.run();
|
||||
}
|
||||
public static Arg C(final int i) {
|
||||
return new Arg() {
|
||||
public int run() { return i; }
|
||||
};
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
System.out.println(A(10, C(1), C(-1), C(-1), C(1), C(0)));
|
||||
}
|
||||
}
|
||||
15
Task/Man-or-boy-test/JavaScript/man-or-boy-test-1.js
Normal file
15
Task/Man-or-boy-test/JavaScript/man-or-boy-test-1.js
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
function a(k, x1, x2, x3, x4, x5) {
|
||||
function b() {
|
||||
k -= 1;
|
||||
return a(k, b, x1, x2, x3, x4);
|
||||
}
|
||||
return (k > 0) ? b() : x4() + x5();
|
||||
}
|
||||
|
||||
// this uses lambda wrappers around the numeric arguments
|
||||
function x(n) {
|
||||
return function () {
|
||||
return n;
|
||||
};
|
||||
}
|
||||
alert(a(10, x(1), x(-1), x(-1), x(1), x(0)));
|
||||
6
Task/Man-or-boy-test/JavaScript/man-or-boy-test-2.js
Normal file
6
Task/Man-or-boy-test/JavaScript/man-or-boy-test-2.js
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
var x = n => () => n;
|
||||
|
||||
var a = (k, x1, x2, x3, x4, x5) => {
|
||||
var b = () => a(--k, b, x1, x2, x3, x4); //decrement k before use
|
||||
return (k > 0) ? b() : x4() + x5();
|
||||
};
|
||||
26
Task/Man-or-boy-test/Jsish/man-or-boy-test.jsish
Normal file
26
Task/Man-or-boy-test/Jsish/man-or-boy-test.jsish
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/* Knuth's Man or boy test (local references in recursion), in Jsish */
|
||||
/* As noted, needs a fair sized stack depth, default is 200 in jsish v2.8.24 */
|
||||
Interp.conf({maxDepth:2048});
|
||||
|
||||
function a(k, x1, x2, x3, x4, x5) {
|
||||
function b() {
|
||||
k -= 1;
|
||||
return a(k, b, x1, x2, x3, x4);
|
||||
}
|
||||
return (k > 0) ? b() : x4() + x5();
|
||||
}
|
||||
|
||||
// this uses lambda wrappers around the numeric arguments
|
||||
function x(n) {
|
||||
return function () {
|
||||
return n;
|
||||
};
|
||||
}
|
||||
|
||||
puts(a(10, x(1), x(-1), x(-1), x(1), x(0)));
|
||||
|
||||
/*
|
||||
=!EXPECTSTART!=
|
||||
-67
|
||||
=!EXPECTEND!=
|
||||
*/
|
||||
6
Task/Man-or-boy-test/Julia/man-or-boy-test.julia
Normal file
6
Task/Man-or-boy-test/Julia/man-or-boy-test.julia
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
function a(k, x1, x2, x3, x4, x5)
|
||||
b = ()-> a(k-=1, b, x1, x2, x3, x4);
|
||||
k <= 0 ? (x4() + x5()) : b();
|
||||
end
|
||||
|
||||
println(a(10, ()->1, ()->-1, ()->-1, ()->1, ()->0));
|
||||
16
Task/Man-or-boy-test/Kotlin/man-or-boy-test.kotlin
Normal file
16
Task/Man-or-boy-test/Kotlin/man-or-boy-test.kotlin
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
// version 1.1.3
|
||||
|
||||
typealias Func = () -> Int
|
||||
|
||||
fun a(k: Int, x1: Func, x2: Func, x3: Func, x4: Func, x5: Func): Int {
|
||||
var kk = k
|
||||
fun b(): Int = a(--kk, ::b, x1, x2, x3, x4)
|
||||
return if (kk <= 0) x4() + x5() else b()
|
||||
}
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
println(" k a")
|
||||
for (k in 0..12) {
|
||||
println("${"%2d".format(k)}: ${a(k, { 1 }, { -1 }, { -1 }, { 1 }, { 0 })}")
|
||||
}
|
||||
}
|
||||
15
Task/Man-or-boy-test/Lua/man-or-boy-test.lua
Normal file
15
Task/Man-or-boy-test/Lua/man-or-boy-test.lua
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
function a(k,x1,x2,x3,x4,x5)
|
||||
local function b()
|
||||
k = k - 1
|
||||
return a(k,b,x1,x2,x3,x4)
|
||||
end
|
||||
if k <= 0 then return x4() + x5() else return b() end
|
||||
end
|
||||
|
||||
function K(n)
|
||||
return function()
|
||||
return n
|
||||
end
|
||||
end
|
||||
|
||||
print(a(10, K(1), K(-1), K(-1), K(1), K(0)))
|
||||
6
Task/Man-or-boy-test/Mathematica/man-or-boy-test.math
Normal file
6
Task/Man-or-boy-test/Mathematica/man-or-boy-test.math
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
$RecursionLimit = 1665; (* anything less fails for k0 = 10 *)
|
||||
a[k0_, x1_, x2_, x3_, x4_, x5_] := Module[{k, b },
|
||||
k = k0;
|
||||
b = (k--; a[k, b, x1, x2, x3, x4]) &;
|
||||
If[k <= 0, x4[] + x5[], b[]]]
|
||||
a[10, 1 &, -1 &, -1 &, 1 &, 0 &]
|
||||
29
Task/Man-or-boy-test/Modula-3/man-or-boy-test.mod3
Normal file
29
Task/Man-or-boy-test/Modula-3/man-or-boy-test.mod3
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
MODULE Main;
|
||||
IMPORT IO;
|
||||
|
||||
TYPE Function = PROCEDURE ():INTEGER;
|
||||
|
||||
PROCEDURE A(k: INTEGER; x1, x2, x3, x4, x5: Function): INTEGER =
|
||||
|
||||
PROCEDURE B(): INTEGER =
|
||||
BEGIN
|
||||
DEC(k);
|
||||
RETURN A(k, B, x1, x2, x3, x4);
|
||||
END B;
|
||||
|
||||
BEGIN
|
||||
IF k <= 0 THEN
|
||||
RETURN x4() + x5();
|
||||
ELSE
|
||||
RETURN B();
|
||||
END;
|
||||
END A;
|
||||
|
||||
PROCEDURE F0(): INTEGER = BEGIN RETURN 0; END F0;
|
||||
PROCEDURE F1(): INTEGER = BEGIN RETURN 1; END F1;
|
||||
PROCEDURE Fn1(): INTEGER = BEGIN RETURN -1; END Fn1;
|
||||
|
||||
BEGIN
|
||||
IO.PutInt(A(10, F1, Fn1, Fn1, F1, F0));
|
||||
IO.Put("\n");
|
||||
END Main.
|
||||
11
Task/Man-or-boy-test/Nim/man-or-boy-test.nim
Normal file
11
Task/Man-or-boy-test/Nim/man-or-boy-test.nim
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
import sugar
|
||||
|
||||
proc a(k: int; x1, x2, x3, x4, x5: proc(): int): int =
|
||||
var k = k
|
||||
proc b(): int =
|
||||
dec k
|
||||
a(k, b, x1, x2, x3, x4)
|
||||
if k <= 0: x4() + x5()
|
||||
else: b()
|
||||
|
||||
echo a(10, () => 1, () => -1, () => -1, () => 1, () => 0)
|
||||
13
Task/Man-or-boy-test/OCaml/man-or-boy-test.ocaml
Normal file
13
Task/Man-or-boy-test/OCaml/man-or-boy-test.ocaml
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
let rec a k x1 x2 x3 x4 x5 =
|
||||
if k <= 0 then
|
||||
x4 () + x5 ()
|
||||
else
|
||||
let m = ref k in
|
||||
let rec b () =
|
||||
decr m;
|
||||
a !m b x1 x2 x3 x4
|
||||
in
|
||||
b ()
|
||||
|
||||
let () =
|
||||
Printf.printf "%d\n" (a 10 (fun () -> 1) (fun () -> -1) (fun () -> -1) (fun () -> 1) (fun () -> 0))
|
||||
44
Task/Man-or-boy-test/Objeck/man-or-boy-test.objeck
Normal file
44
Task/Man-or-boy-test/Objeck/man-or-boy-test.objeck
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
interface Arg {
|
||||
method : virtual : public : Run() ~ Int;
|
||||
}
|
||||
|
||||
class ManOrBoy {
|
||||
New() {}
|
||||
|
||||
function : A(mb : ManOrBoy, k : Int, x1 : Arg, x2 : Arg, x3 : Arg, x4 : Arg, x5 : Arg) ~ Int {
|
||||
if(k <= 0) {
|
||||
return x4->Run() + x5->Run();
|
||||
};
|
||||
|
||||
return Base->New(mb, k, x1, x2, x3, x4) implements Arg {
|
||||
@mb : ManOrBoy; @k : Int; @x1 : Arg; @x2 : Arg; @x3 : Arg; @x4 : Arg; @m : Int;
|
||||
|
||||
New(mb : ManOrBoy, k : Int, x1 : Arg, x2 : Arg, x3 : Arg, x4 : Arg) {
|
||||
@mb := mb; @k := k; @x1 := x1; @x2 := x2; @x3 := x3; @x4 := x4; @m := @k;
|
||||
}
|
||||
|
||||
method : public : Run() ~ Int {
|
||||
@m -= 1;
|
||||
return @mb->A(@mb, @m, @self, @x1, @x2, @x3, @x4);
|
||||
}
|
||||
}->Run();
|
||||
}
|
||||
|
||||
function : C(i : Int) ~ Arg {
|
||||
return Base->New(i) implements Arg {
|
||||
@i : Int;
|
||||
New(i : Int) {
|
||||
@i := i;
|
||||
}
|
||||
|
||||
method : public : Run() ~ Int {
|
||||
return @i;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function : Main(args : String[]) ~ Nil {
|
||||
mb := ManOrBoy->New();
|
||||
mb->A(mb, 10, C(1), C(-1), C(-1), C(1), C(0))->PrintLine();
|
||||
}
|
||||
}
|
||||
25
Task/Man-or-boy-test/Objective-C/man-or-boy-test-1.m
Normal file
25
Task/Man-or-boy-test/Objective-C/man-or-boy-test-1.m
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
|
||||
typedef NSInteger (^IntegerBlock)(void);
|
||||
|
||||
NSInteger A (NSInteger kParam, IntegerBlock x1, IntegerBlock x2, IntegerBlock x3, IntegerBlock x4, IntegerBlock x5) {
|
||||
__block NSInteger k = kParam;
|
||||
__block __weak IntegerBlock weak_B;
|
||||
IntegerBlock B;
|
||||
weak_B = B = ^ {
|
||||
return A(--k, weak_B, x1, x2, x3, x4);
|
||||
};
|
||||
return k <= 0 ? x4() + x5() : B();
|
||||
}
|
||||
|
||||
IntegerBlock K (NSInteger n) {
|
||||
return ^{return n;};
|
||||
}
|
||||
|
||||
int main (int argc, const char * argv[]) {
|
||||
@autoreleasepool {
|
||||
NSInteger result = A(10, K(1), K(-1), K(-1), K(1), K(0));
|
||||
NSLog(@"%d\n", result);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
24
Task/Man-or-boy-test/Objective-C/man-or-boy-test-2.m
Normal file
24
Task/Man-or-boy-test/Objective-C/man-or-boy-test-2.m
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
#import <Foundation/Foundation.h>
|
||||
|
||||
typedef NSInteger (^IntegerBlock)(void);
|
||||
|
||||
NSInteger A (NSInteger kParam, IntegerBlock x1, IntegerBlock x2, IntegerBlock x3, IntegerBlock x4, IntegerBlock x5) {
|
||||
__block NSInteger k = kParam;
|
||||
__block IntegerBlock B;
|
||||
B = ^ {
|
||||
return A(--k, B, x1, x2, x3, x4);
|
||||
};
|
||||
return k <= 0 ? x4() + x5() : B();
|
||||
}
|
||||
|
||||
IntegerBlock K (NSInteger n) {
|
||||
return [[^{return n;} copy] autorelease];
|
||||
}
|
||||
|
||||
int main (int argc, const char * argv[]) {
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSInteger result = A(10, K(1), K(-1), K(-1), K(1), K(0));
|
||||
NSLog(@"%d\n", result);
|
||||
[pool drain];
|
||||
return 0;
|
||||
}
|
||||
73
Task/Man-or-boy-test/Objective-C/man-or-boy-test-3.m
Normal file
73
Task/Man-or-boy-test/Objective-C/man-or-boy-test-3.m
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
@protocol IntegerFun <NSObject>
|
||||
-(NSInteger)call;
|
||||
@end
|
||||
|
||||
NSInteger A (NSInteger kParam, id<IntegerFun> x1, id<IntegerFun> x2, id<IntegerFun> x3, id<IntegerFun> x4, id<IntegerFun> x5);
|
||||
|
||||
@interface B_Class : NSObject <IntegerFun> {
|
||||
NSInteger *k;
|
||||
id<IntegerFun> x1, x2, x3, x4;
|
||||
}
|
||||
-(id)initWithK:(NSInteger *)k x1:(id<IntegerFun>)x1 x2:(id<IntegerFun>)x2 x3:(id<IntegerFun>)x3 x4:(id<IntegerFun>)x4;
|
||||
@end
|
||||
|
||||
@implementation B_Class
|
||||
-(id)initWithK:(NSInteger *)_k x1:(id<IntegerFun>)_x1 x2:(id<IntegerFun>)_x2 x3:(id<IntegerFun>)_x3 x4:(id<IntegerFun>)_x4 {
|
||||
if ((self = [super init])) {
|
||||
k = _k;
|
||||
x1 = [_x1 retain];
|
||||
x2 = [_x2 retain];
|
||||
x3 = [_x3 retain];
|
||||
x4 = [_x4 retain];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
-(void)dealloc {
|
||||
[x1 release];
|
||||
[x2 release];
|
||||
[x3 release];
|
||||
[x4 release];
|
||||
[super dealloc];
|
||||
}
|
||||
-(NSInteger)call {
|
||||
return A(--*k, self, x1, x2, x3, x4);
|
||||
}
|
||||
@end
|
||||
|
||||
NSInteger A (NSInteger k, id<IntegerFun> x1, id<IntegerFun> x2, id<IntegerFun> x3, id<IntegerFun> x4, id<IntegerFun> x5) {
|
||||
id<IntegerFun> B = [[[B_Class alloc] initWithK:&k x1:x1 x2:x2 x3:x3 x4:x4] autorelease];
|
||||
return k <= 0 ? [x4 call] + [x5 call] : [B call];
|
||||
}
|
||||
|
||||
@interface K : NSObject <IntegerFun> {
|
||||
NSInteger n;
|
||||
}
|
||||
-(id)initWithN:(NSInteger)n;
|
||||
@end
|
||||
|
||||
@implementation K
|
||||
-(id)initWithN:(NSInteger)_n {
|
||||
if ((self = [super init])) {
|
||||
n = _n;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
-(NSInteger)call {
|
||||
return n;
|
||||
}
|
||||
@end
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
NSInteger result = A(10,
|
||||
[[[K alloc] initWithN:1] autorelease],
|
||||
[[[K alloc] initWithN:-1] autorelease],
|
||||
[[[K alloc] initWithN:-1] autorelease],
|
||||
[[[K alloc] initWithN:1] autorelease],
|
||||
[[[K alloc] initWithN:0] autorelease]);
|
||||
NSLog(@"%ld\n", result);
|
||||
|
||||
[pool release];
|
||||
return 0;
|
||||
}
|
||||
30
Task/Man-or-boy-test/Odin/man-or-boy-test.odin
Normal file
30
Task/Man-or-boy-test/Odin/man-or-boy-test.odin
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
package main
|
||||
|
||||
import "core:fmt"
|
||||
import "core:os"
|
||||
import "core:strconv"
|
||||
|
||||
Arg :: struct {
|
||||
fn : proc (^Arg) -> int,
|
||||
k : ^int,
|
||||
x1, x2, x3, x4, x5 : ^Arg,
|
||||
}
|
||||
|
||||
B :: proc (a : ^Arg) -> int {
|
||||
a.k^ -= 1
|
||||
k := a.k^
|
||||
return A(&Arg { fn = B, k = &k, x1 = a, x2 = a.x1, x3 = a.x2, x4 = a.x3, x5 = a.x4 } )
|
||||
}
|
||||
|
||||
A :: proc (a : ^Arg) -> int {
|
||||
return a.x4->fn() + a.x5->fn() if a.k^ <= 0 else B(a)
|
||||
}
|
||||
|
||||
main :: proc () {
|
||||
f_1 :: proc (^Arg) -> int { return -1 }
|
||||
f0 :: proc (^Arg) -> int { return 0 }
|
||||
f1 :: proc (^Arg) -> int { return 1 }
|
||||
|
||||
k := strconv.atoi(os.args[1]) if len(os.args) == 2 else 10
|
||||
fmt.println(A(&Arg { fn = B, k = &k, x1 = &Arg { fn = f1 }, x2 = &Arg { fn = f_1 }, x3 = &Arg { fn = f_1 }, x4 = &Arg { fn = f1 }, x5 = &Arg { fn = f0 } }))
|
||||
}
|
||||
27
Task/Man-or-boy-test/Ol/man-or-boy-test.ol
Normal file
27
Task/Man-or-boy-test/Ol/man-or-boy-test.ol
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
; Because argument "k" is a small number, it's a value, not an object.
|
||||
; So we must 'pack' it in object - 'box' it; And 'unbox' when we try to get value.
|
||||
|
||||
(define (box x) (list x))
|
||||
(define (unbox x) (car x))
|
||||
(define (copy x) (box (unbox x)))
|
||||
|
||||
(define (A k x1 x2 x3 x4 x5)
|
||||
(define (B)
|
||||
(set-car! k (- (unbox k) 1))
|
||||
(A (copy k) B x1 x2 x3 x4))
|
||||
|
||||
(if (<= (unbox k) 0)
|
||||
(+ (x4) (x5))
|
||||
(B)))
|
||||
|
||||
(define (man-or-boy N)
|
||||
(A (box N)
|
||||
(lambda () 1)
|
||||
(lambda () -1)
|
||||
(lambda () -1)
|
||||
(lambda () 1)
|
||||
(lambda () 0)))
|
||||
|
||||
(print (man-or-boy 10))
|
||||
(print (man-or-boy 15))
|
||||
(print (man-or-boy 20))
|
||||
21
Task/Man-or-boy-test/Oz/man-or-boy-test.oz
Normal file
21
Task/Man-or-boy-test/Oz/man-or-boy-test.oz
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
declare
|
||||
fun {A K X1 X2 X3 X4 X5}
|
||||
ReturnA = {NewCell undefined}
|
||||
fun {B}
|
||||
ReturnB = {NewCell undefined}
|
||||
in
|
||||
K := @K - 1
|
||||
ReturnA := {A {NewCell @K} B X1 X2 X3 X4}
|
||||
ReturnB := @ReturnA
|
||||
@ReturnB
|
||||
end
|
||||
in
|
||||
if @K =< 0 then ReturnA := {X4} + {X5} else _ = {B} end
|
||||
@ReturnA
|
||||
end
|
||||
|
||||
fun {C V}
|
||||
fun {$} V end
|
||||
end
|
||||
in
|
||||
{Show {A {NewCell 10} {C 1} {C ~1} {C ~1} {C 1} {C 0}}}
|
||||
14
Task/Man-or-boy-test/PHP/man-or-boy-test-1.php
Normal file
14
Task/Man-or-boy-test/PHP/man-or-boy-test-1.php
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
function A($k,$x1,$x2,$x3,$x4,$x5) {
|
||||
$b = function () use (&$b,&$k,$x1,$x2,$x3,$x4) {
|
||||
return A(--$k,$b,$x1,$x2,$x3,$x4);
|
||||
};
|
||||
return $k <= 0 ? $x4() + $x5() : $b();
|
||||
}
|
||||
|
||||
echo A(10, function () { return 1; },
|
||||
function () { return -1; },
|
||||
function () { return -1; },
|
||||
function () { return 1; },
|
||||
function () { return 0; }) . "\n";
|
||||
?>
|
||||
22
Task/Man-or-boy-test/PHP/man-or-boy-test-2.php
Normal file
22
Task/Man-or-boy-test/PHP/man-or-boy-test-2.php
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
function A($k,$x1,$x2,$x3,$x4,$x5) {
|
||||
static $i = 0;
|
||||
$b = "myfunction_$i";
|
||||
$i++;
|
||||
eval('function '.$b.'() {
|
||||
static $k = '.$k.';
|
||||
return A(--$k, '.var_export($b,true).',
|
||||
'.var_export($x1,true).',
|
||||
'.var_export($x2,true).',
|
||||
'.var_export($x3,true).',
|
||||
'.var_export($x4,true).');
|
||||
}');
|
||||
return $k <= 0 ? $x4() + $x5() : $b();
|
||||
}
|
||||
|
||||
echo A(10, create_function('', 'return 1;'),
|
||||
create_function('', 'return -1;'),
|
||||
create_function('', 'return -1;'),
|
||||
create_function('', 'return 1;'),
|
||||
create_function('', 'return 0;')) . "\n";
|
||||
?>
|
||||
25
Task/Man-or-boy-test/Pascal/man-or-boy-test.pas
Normal file
25
Task/Man-or-boy-test/Pascal/man-or-boy-test.pas
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
program manorboy(output);
|
||||
|
||||
function zero: integer; begin zero := 0 end;
|
||||
function one: integer; begin one := 1 end;
|
||||
function negone: integer; begin negone := -1 end;
|
||||
|
||||
function A(
|
||||
k: integer;
|
||||
function x1: integer;
|
||||
function x2: integer;
|
||||
function x3: integer;
|
||||
function x4: integer;
|
||||
function x5: integer
|
||||
): integer;
|
||||
|
||||
function B: integer;
|
||||
begin k := k - 1;
|
||||
B := A(k, B, x1, x2, x3, x4)
|
||||
end;
|
||||
|
||||
begin if k <= 0 then A := x4 + x5 else A := B
|
||||
end;
|
||||
|
||||
begin writeln(A(10, one, negone, negone, one, zero))
|
||||
end.
|
||||
8
Task/Man-or-boy-test/Perl/man-or-boy-test.pl
Normal file
8
Task/Man-or-boy-test/Perl/man-or-boy-test.pl
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
sub A {
|
||||
my ($k, $x1, $x2, $x3, $x4, $x5) = @_;
|
||||
my($B);
|
||||
$B = sub { A(--$k, $B, $x1, $x2, $x3, $x4) };
|
||||
$k <= 0 ? &$x4 + &$x5 : &$B;
|
||||
}
|
||||
|
||||
print A(10, sub{1}, sub {-1}, sub{-1}, sub{1}, sub{0} ), "\n";
|
||||
25
Task/Man-or-boy-test/Phix/man-or-boy-test-1.phix
Normal file
25
Task/Man-or-boy-test/Phix/man-or-boy-test-1.phix
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
-->
|
||||
<span style="color: #008080;">without</span> <span style="color: #008080;">js</span> <span style="color: #000080;font-style:italic;">-- allocate()</span>
|
||||
<span style="color: #008080;">forward</span> <span style="color: #008080;">function</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">object</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x5</span><span style="color: #0000FF;">)</span>
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">B</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #004080;">object</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">kptr</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x4</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span>
|
||||
<span style="color: #004080;">integer</span> <span style="color: #000000;">k</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">peek4s</span><span style="color: #0000FF;">(</span><span style="color: #000000;">kptr</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span>
|
||||
<span style="color: #7060A8;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">kptr</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">kptr</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x4</span><span style="color: #0000FF;">},</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x4</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">object</span> <span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">x5</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;"><=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x4</span><span style="color: #0000FF;">)?</span><span style="color: #000000;">B</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x4</span><span style="color: #0000FF;">):</span><span style="color: #000000;">x4</span><span style="color: #0000FF;">)+</span>
|
||||
<span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x5</span><span style="color: #0000FF;">)?</span><span style="color: #000000;">B</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x5</span><span style="color: #0000FF;">):</span><span style="color: #000000;">x5</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
|
||||
<span style="color: #004080;">atom</span> <span style="color: #000000;">kptr</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">allocate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">poke4</span><span style="color: #0000FF;">(</span><span style="color: #000000;">kptr</span><span style="color: #0000FF;">,</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">B</span><span style="color: #0000FF;">({</span><span style="color: #000000;">kptr</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x4</span><span style="color: #0000FF;">})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">23</span> <span style="color: #008080;">do</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;">"A(%d) = %d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k</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;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<!--
|
||||
19
Task/Man-or-boy-test/Phix/man-or-boy-test-2.phix
Normal file
19
Task/Man-or-boy-test/Phix/man-or-boy-test-2.phix
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">constant</span> <span style="color: #000000;">first5</span> <span style="color: #0000FF;">=</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;">2</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: #008080;">function</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;"><</span><span style="color: #000000;">5</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #000000;">first5</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</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: #004080;">atom</span> <span style="color: #000000;">c0</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">c1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">c2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">c3</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">5</span> <span style="color: #008080;">to</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #000000;">c3</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">c0</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
|
||||
<span style="color: #000000;">c0</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">c1</span>
|
||||
<span style="color: #000000;">c1</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">c2</span>
|
||||
<span style="color: #000000;">c2</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">c3</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">c0</span><span style="color: #0000FF;">-</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">-</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">+</span><span style="color: #000000;">c3</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">40</span> <span style="color: #008080;">do</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;">"%d %d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">k</span><span style="color: #0000FF;">,</span><span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k</span><span style="color: #0000FF;">)})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<!--
|
||||
27
Task/Man-or-boy-test/Phix/man-or-boy-test-3.phix
Normal file
27
Task/Man-or-boy-test/Phix/man-or-boy-test-3.phix
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
(phixonline)-->
|
||||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
|
||||
<span style="color: #008080;">include</span> <span style="color: #004080;">mpfr</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
|
||||
<span style="color: #008080;">function</span> <span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">if</span> <span style="color: #000000;">k</span><span style="color: #0000FF;"><</span><span style="color: #000000;">5</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #7060A8;">mpz_init</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;">2</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;">k</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: #004080;">mpz</span> <span style="color: #000000;">c0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">3</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">c1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">c2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span>
|
||||
<span style="color: #000000;">c3</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">mpz_init</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">5</span> <span style="color: #008080;">to</span> <span style="color: #000000;">k</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span> <span style="color: #008080;">do</span>
|
||||
<span style="color: #7060A8;">mpz_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_sub_ui</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<span style="color: #7060A8;">mpz_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c1</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c2</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #7060A8;">mpz_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">c3</span><span style="color: #0000FF;">)</span>
|
||||
<span style="color: #008080;">return</span> <span style="color: #000000;">c0</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
|
||||
|
||||
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">20</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)&{</span><span style="color: #000000;">30</span><span style="color: #0000FF;">,</span><span style="color: #000000;">39</span><span style="color: #0000FF;">,</span><span style="color: #000000;">500</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10000</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1e6</span><span style="color: #0000FF;">}</span>
|
||||
<span style="color: #008080;">for</span> <span style="color: #000000;">k</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;">tests</span><span style="color: #0000FF;">)-(</span><span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">JS</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</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;">"A(%,d) = %s\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">],</span><span style="color: #7060A8;">mpz_get_short_str</span><span style="color: #0000FF;">(</span><span style="color: #000000;">A</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">]))})</span>
|
||||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
|
||||
<!--
|
||||
8
Task/Man-or-boy-test/PicoLisp/man-or-boy-test.l
Normal file
8
Task/Man-or-boy-test/PicoLisp/man-or-boy-test.l
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
(de a (K X1 X2 X3 X4 X5)
|
||||
(let (@K (cons K) B (cons)) # Explicit frame
|
||||
(set B
|
||||
(curry (@K B X1 X2 X3 X4) ()
|
||||
(a (dec @K) (car B) X1 X2 X3 X4) ) )
|
||||
(if (gt0 (car @K)) ((car B)) (+ (X4) (X5))) ) )
|
||||
|
||||
(a 10 '(() 1) '(() -1) '(() -1) '(() 1) '(() 0))
|
||||
13
Task/Man-or-boy-test/Python/man-or-boy-test-1.py
Normal file
13
Task/Man-or-boy-test/Python/man-or-boy-test-1.py
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#!/usr/bin/env python
|
||||
import sys
|
||||
sys.setrecursionlimit(1025)
|
||||
|
||||
def a(in_k, x1, x2, x3, x4, x5):
|
||||
k = [in_k]
|
||||
def b():
|
||||
k[0] -= 1
|
||||
return a(k[0], b, x1, x2, x3, x4)
|
||||
return x4() + x5() if k[0] <= 0 else b()
|
||||
|
||||
x = lambda i: lambda: i
|
||||
print(a(10, x(1), x(-1), x(-1), x(1), x(0)))
|
||||
13
Task/Man-or-boy-test/Python/man-or-boy-test-2.py
Normal file
13
Task/Man-or-boy-test/Python/man-or-boy-test-2.py
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
#!/usr/bin/env python
|
||||
import sys
|
||||
sys.setrecursionlimit(1025)
|
||||
|
||||
def a(k, x1, x2, x3, x4, x5):
|
||||
def b():
|
||||
b.k -= 1
|
||||
return a(b.k, b, x1, x2, x3, x4)
|
||||
b.k = k
|
||||
return x4() + x5() if b.k <= 0 else b()
|
||||
|
||||
x = lambda i: lambda: i
|
||||
print(a(10, x(1), x(-1), x(-1), x(1), x(0)))
|
||||
12
Task/Man-or-boy-test/Python/man-or-boy-test-3.py
Normal file
12
Task/Man-or-boy-test/Python/man-or-boy-test-3.py
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
#!/usr/bin/env python
|
||||
import sys
|
||||
sys.setrecursionlimit(1025)
|
||||
|
||||
def A(k, x1, x2, x3, x4, x5):
|
||||
def B():
|
||||
nonlocal k
|
||||
k -= 1
|
||||
return A(k, B, x1, x2, x3, x4)
|
||||
return x4() + x5() if k <= 0 else B()
|
||||
|
||||
print(A(10, lambda: 1, lambda: -1, lambda: -1, lambda: 1, lambda: 0))
|
||||
8
Task/Man-or-boy-test/R/man-or-boy-test-1.r
Normal file
8
Task/Man-or-boy-test/R/man-or-boy-test-1.r
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
n <- function(x) function()x
|
||||
|
||||
A <- function(k, x1, x2, x3, x4, x5) {
|
||||
B <- function() A(k <<- k-1, B, x1, x2, x3, x4)
|
||||
if (k <= 0) x4() + x5() else B()
|
||||
}
|
||||
|
||||
A(10, n(1), n(-1), n(-1), n(1), n(0))
|
||||
15
Task/Man-or-boy-test/R/man-or-boy-test-2.r
Normal file
15
Task/Man-or-boy-test/R/man-or-boy-test-2.r
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
call.by.name <- function(...) {
|
||||
cl <- as.list(match.call())
|
||||
sublist <- lapply(cl[2:(length(cl)-1)],
|
||||
function(name) substitute(substitute(evalq(.,.caller),
|
||||
list(.=substitute(name))),
|
||||
list(name=name)))
|
||||
names(sublist) <- enquote(cl[2:(length(cl)-1)])
|
||||
subcall <- do.call("call", c("list", lapply(sublist, enquote)))
|
||||
fndef <- cl[[length(cl)]]
|
||||
fndef[[3]] <- substitute({
|
||||
.caller <- parent.frame()
|
||||
eval(substitute(body, subcall))
|
||||
}, list(body=fndef[[3]], subcall=subcall))
|
||||
eval.parent(fndef)
|
||||
}
|
||||
11
Task/Man-or-boy-test/R/man-or-boy-test-3.r
Normal file
11
Task/Man-or-boy-test/R/man-or-boy-test-3.r
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
A <- call.by.name(x1, x2, x3, x4, x5,
|
||||
function(k, x1, x2, x3, x4, x5) {
|
||||
Aout <- NULL
|
||||
B <- function() {
|
||||
k <<- k - 1
|
||||
Bout <- Aout <<- A(k, B(), x1, x2, x3, x4)
|
||||
}
|
||||
if (k <= 0) Aout <- x4 + x5 else B()
|
||||
Aout
|
||||
}
|
||||
)
|
||||
3
Task/Man-or-boy-test/R/man-or-boy-test-4.r
Normal file
3
Task/Man-or-boy-test/R/man-or-boy-test-4.r
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
> options(expressions=10000)
|
||||
> mapply(A, 0:10, 1, -1, -1, 1, 0)
|
||||
[1] 1 0 -2 0 1 0 1 -1 -10 -30 -67
|
||||
18
Task/Man-or-boy-test/R/man-or-boy-test-5.r
Normal file
18
Task/Man-or-boy-test/R/man-or-boy-test-5.r
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
> print(A, useSource=FALSE)
|
||||
function (k, x1, x2, x3, x4, x5)
|
||||
{
|
||||
.caller <- parent.frame()
|
||||
eval(substitute({
|
||||
Aout <- NULL
|
||||
B <- function() {
|
||||
k <<- k - 1
|
||||
Bout <- Aout <<- A(k, B(), x1, x2, x3, x4)
|
||||
}
|
||||
if (k <= 0) Aout <- x4 + x5 else B()
|
||||
Aout
|
||||
}, list(x1 = substitute(evalq(., .caller), list(. = substitute(x1))),
|
||||
x2 = substitute(evalq(., .caller), list(. = substitute(x2))),
|
||||
x3 = substitute(evalq(., .caller), list(. = substitute(x3))),
|
||||
x4 = substitute(evalq(., .caller), list(. = substitute(x4))),
|
||||
x5 = substitute(evalq(., .caller), list(. = substitute(x5))))))
|
||||
}
|
||||
17
Task/Man-or-boy-test/REXX/man-or-boy-test.rexx
Normal file
17
Task/Man-or-boy-test/REXX/man-or-boy-test.rexx
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/*REXX program performs the "man or boy" test as far as possible for N. */
|
||||
do n=0 /*increment N from zero forever. */
|
||||
say 'n='n a(N,x1,x2,x3,x4,x5) /*display the result to the terminal. */
|
||||
end /*n*/ /* [↑] do until something breaks. */
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
a: procedure; parse arg k, x1, x2, x3, x4, x5
|
||||
if k<=0 then return f(x4) + f(x5)
|
||||
else return f(b)
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
b: k=k-1; return a(k, b, x1, x2, x3, x4)
|
||||
f: interpret 'v=' arg(1)"()"; return v
|
||||
x1: procedure; return 1
|
||||
x2: procedure; return -1
|
||||
x3: procedure; return -1
|
||||
x4: procedure; return 1
|
||||
x5: procedure; return 0
|
||||
11
Task/Man-or-boy-test/Racket/man-or-boy-test-1.rkt
Normal file
11
Task/Man-or-boy-test/Racket/man-or-boy-test-1.rkt
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
#lang racket
|
||||
|
||||
(define (A k x1 x2 x3 x4 x5)
|
||||
(define (B)
|
||||
(set! k (- k 1))
|
||||
(A k B x1 x2 x3 x4))
|
||||
(if (<= k 0)
|
||||
(+ (x4) (x5))
|
||||
(B)))
|
||||
|
||||
(A 10 (lambda () 1) (lambda () -1) (lambda () -1) (lambda () 1) (lambda () 0))
|
||||
10
Task/Man-or-boy-test/Racket/man-or-boy-test-2.rkt
Normal file
10
Task/Man-or-boy-test/Racket/man-or-boy-test-2.rkt
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#lang racket
|
||||
|
||||
(define (A k x1 x2 x3 x4 x5)
|
||||
(if (<= k 0)
|
||||
(+ (x4) (x5))
|
||||
(let B ()
|
||||
(set! k (- k 1))
|
||||
(A k B x1 x2 x3 x4))))
|
||||
|
||||
(A 10 (lambda () 1) (lambda () -1) (lambda () -1) (lambda () 1) (lambda () 0))
|
||||
7
Task/Man-or-boy-test/Raku/man-or-boy-test.raku
Normal file
7
Task/Man-or-boy-test/Raku/man-or-boy-test.raku
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
sub A($k is copy, &x1, &x2, &x3, &x4, &x5) {
|
||||
$k <= 0
|
||||
?? x4() + x5()
|
||||
!! (my &B = { A(--$k, &B, &x1, &x2, &x3, &x4) })();
|
||||
};
|
||||
|
||||
say A(10, {1}, {-1}, {-1}, {1}, {0});
|
||||
6
Task/Man-or-boy-test/Ruby/man-or-boy-test.rb
Normal file
6
Task/Man-or-boy-test/Ruby/man-or-boy-test.rb
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
def a(k, x1, x2, x3, x4, x5)
|
||||
b = lambda { k -= 1; a(k, b, x1, x2, x3, x4) }
|
||||
k <= 0 ? x4[] + x5[] : b[]
|
||||
end
|
||||
|
||||
puts a(10, lambda {1}, lambda {-1}, lambda {-1}, lambda {1}, lambda {0})
|
||||
39
Task/Man-or-boy-test/Rust/man-or-boy-test-1.rust
Normal file
39
Task/Man-or-boy-test/Rust/man-or-boy-test-1.rust
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
use std::cell::Cell;
|
||||
|
||||
trait Arg {
|
||||
fn run(&self) -> i32;
|
||||
}
|
||||
|
||||
impl Arg for i32 {
|
||||
fn run(&self) -> i32 { *self }
|
||||
}
|
||||
|
||||
struct B<'a> {
|
||||
k: &'a Cell<i32>,
|
||||
x1: &'a Arg,
|
||||
x2: &'a Arg,
|
||||
x3: &'a Arg,
|
||||
x4: &'a Arg,
|
||||
}
|
||||
|
||||
impl<'a> Arg for B<'a> {
|
||||
fn run(&self) -> i32 {
|
||||
self.k.set(self.k.get() - 1);
|
||||
a(self.k.get(), self, self.x1, self.x2, self.x3, self.x4)
|
||||
}
|
||||
}
|
||||
|
||||
fn a(k: i32, x1: &Arg, x2: &Arg, x3: &Arg, x4: &Arg, x5: &Arg) -> i32 {
|
||||
if k <= 0 {
|
||||
x4.run() + x5.run()
|
||||
} else {
|
||||
B{
|
||||
k: &Cell::new(k),
|
||||
x1, x2, x3, x4
|
||||
}.run()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
println!("{}", a(10, &1, &-1, &-1, &1, &0));
|
||||
}
|
||||
18
Task/Man-or-boy-test/Rust/man-or-boy-test-2.rust
Normal file
18
Task/Man-or-boy-test/Rust/man-or-boy-test-2.rust
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
use std::cell::Cell;
|
||||
|
||||
fn a(k: i32, x1: &Fn() -> i32, x2: &Fn() -> i32, x3: &Fn() -> i32, x4: &Fn() -> i32, x5: &Fn() -> i32) -> i32 {
|
||||
let k1 = Cell::new(k);
|
||||
struct B<'a> { f: &'a Fn(&B) -> i32 }
|
||||
let b = B {
|
||||
f: &|b| {
|
||||
k1.set(k1.get() - 1);
|
||||
return a(k1.get(), &||(b.f)(b), x1, x2, x3, x4)
|
||||
}
|
||||
};
|
||||
let b = ||(b.f)(&b);
|
||||
return if k <= 0 {x4() + x5()} else {b()}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
println!("{}", a(10, &||1, &||-1, &||-1, &||1, &||0));
|
||||
}
|
||||
22
Task/Man-or-boy-test/Rust/man-or-boy-test-3.rust
Normal file
22
Task/Man-or-boy-test/Rust/man-or-boy-test-3.rust
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
use std::cell::Cell;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
use std::rc::Weak;
|
||||
|
||||
fn a(k: i32, x1: &Fn() -> i32, x2: &Fn() -> i32, x3: &Fn() -> i32, x4: &Fn() -> i32, x5: &Fn() -> i32) -> i32 {
|
||||
let weak_holder: Rc<RefCell<Weak<Fn() -> i32>>> = Rc::new(RefCell::new(Weak::<fn() -> i32>::new()));
|
||||
let weak_holder2 = weak_holder.clone();
|
||||
let k_holder = Cell::new(k);
|
||||
let b: Rc<Fn() -> i32> = Rc::new(move || {
|
||||
let b = weak_holder2.borrow().upgrade().unwrap();
|
||||
k_holder.set(k_holder.get() - 1);
|
||||
return a(k_holder.get(), &*b, x1, x2, x3, x4);
|
||||
});
|
||||
weak_holder.replace(Rc::downgrade(&b));
|
||||
|
||||
return if k <= 0 {x4() + x5()} else {b()}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
println!("{}", a(10, &||1, &||-1, &||-1, &||1, &||0));
|
||||
}
|
||||
9
Task/Man-or-boy-test/Scala/man-or-boy-test.scala
Normal file
9
Task/Man-or-boy-test/Scala/man-or-boy-test.scala
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
def A(in_k: Int, x1: =>Int, x2: =>Int, x3: =>Int, x4: =>Int, x5: =>Int): Int = {
|
||||
var k = in_k
|
||||
def B: Int = {
|
||||
k = k-1
|
||||
A(k, B, x1, x2, x3, x4)
|
||||
}
|
||||
if (k<=0) x4+x5 else B
|
||||
}
|
||||
println(A(10, 1, -1, -1, 1, 0))
|
||||
9
Task/Man-or-boy-test/Scheme/man-or-boy-test.ss
Normal file
9
Task/Man-or-boy-test/Scheme/man-or-boy-test.ss
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
(define (A k x1 x2 x3 x4 x5)
|
||||
(define (B)
|
||||
(set! k (- k 1))
|
||||
(A k B x1 x2 x3 x4))
|
||||
(if (<= k 0)
|
||||
(+ (x4) (x5))
|
||||
(B)))
|
||||
|
||||
(A 10 (lambda () 1) (lambda () -1) (lambda () -1) (lambda () 1) (lambda () 0))
|
||||
5
Task/Man-or-boy-test/Sidef/man-or-boy-test-1.sidef
Normal file
5
Task/Man-or-boy-test/Sidef/man-or-boy-test-1.sidef
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
func a(k, x1, x2, x3, x4, x5) {
|
||||
func b { a(--k, b, x1, x2, x3, x4) };
|
||||
k <= 0 ? (x4() + x5()) : b();
|
||||
}
|
||||
say a(10, ->{1}, ->{-1}, ->{-1}, ->{1}, ->{0}); #=> -67
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue