Sync
This commit is contained in:
parent
6f050a029e
commit
776bba907c
3887 changed files with 59894 additions and 7280 deletions
11
Task/Ackermann-function/AutoIt/ackermann-function-1.autoit
Normal file
11
Task/Ackermann-function/AutoIt/ackermann-function-1.autoit
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
Func Ackermann($m, $n)
|
||||
If ($m = 0) Then
|
||||
Return $n+1
|
||||
Else
|
||||
If ($n = 0) Then
|
||||
Return Ackermann($m-1, 1)
|
||||
Else
|
||||
return Ackermann($m-1, Ackermann($m, $n-1))
|
||||
EndIf
|
||||
EndIf
|
||||
EndFunc
|
||||
18
Task/Ackermann-function/AutoIt/ackermann-function-2.autoit
Normal file
18
Task/Ackermann-function/AutoIt/ackermann-function-2.autoit
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
Global $ackermann[2047][2047] ; Set the size to whatever you want
|
||||
Func Ackermann($m, $n)
|
||||
If ($ackermann[$m][$n] <> 0) Then
|
||||
Return $ackermann[$m][$n]
|
||||
Else
|
||||
If ($m = 0) Then
|
||||
$return = $n + 1
|
||||
Else
|
||||
If ($n = 0) Then
|
||||
$return = Ackermann($m - 1, 1)
|
||||
Else
|
||||
$return = Ackermann($m - 1, Ackermann($m, $n - 1))
|
||||
EndIf
|
||||
EndIf
|
||||
$ackermann[$m][$n] = $return
|
||||
Return $return
|
||||
EndIf
|
||||
EndFunc ;==>Ackermann
|
||||
32
Task/Ackermann-function/COBOL/ackermann-function.cobol
Normal file
32
Task/Ackermann-function/COBOL/ackermann-function.cobol
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
IDENTIFICATION DIVISION.
|
||||
PROGRAM-ID. Ackermann.
|
||||
|
||||
DATA DIVISION.
|
||||
LINKAGE SECTION.
|
||||
01 M USAGE UNSIGNED-LONG.
|
||||
01 N USAGE UNSIGNED-LONG.
|
||||
|
||||
01 Return-Val USAGE UNSIGNED-LONG.
|
||||
|
||||
PROCEDURE DIVISION USING M N Return-Val.
|
||||
EVALUATE M ALSO N
|
||||
WHEN 0 ALSO ANY
|
||||
ADD 1 TO N GIVING Return-Val
|
||||
|
||||
WHEN NOT 0 ALSO 0
|
||||
SUBTRACT 1 FROM M
|
||||
CALL "Ackermann" USING BY CONTENT M BY CONTENT 1
|
||||
BY REFERENCE Return-Val
|
||||
|
||||
WHEN NOT 0 ALSO NOT 0
|
||||
SUBTRACT 1 FROM N
|
||||
CALL "Ackermann" USING BY CONTENT M BY CONTENT N
|
||||
BY REFERENCE Return-Val
|
||||
|
||||
SUBTRACT 1 FROM M
|
||||
CALL "Ackermann" USING BY CONTENT M
|
||||
BY CONTENT Return-Val BY REFERENCE Return-Val
|
||||
END-EVALUATE
|
||||
|
||||
GOBACK
|
||||
.
|
||||
8
Task/Ackermann-function/Chapel/ackermann-function.chapel
Normal file
8
Task/Ackermann-function/Chapel/ackermann-function.chapel
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
proc A(m:int, n:int):int {
|
||||
if m == 0 then
|
||||
return n + 1;
|
||||
else if n == 0 then
|
||||
return A(m - 1, 1);
|
||||
else
|
||||
return A(m - 1, A(m, n - 1));
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
MODULE NpctAckerman;
|
||||
|
||||
IMPORT StdLog;
|
||||
|
||||
VAR
|
||||
m,n: INTEGER;
|
||||
|
||||
PROCEDURE Ackerman (x,y: INTEGER):INTEGER;
|
||||
|
||||
BEGIN
|
||||
IF x = 0 THEN RETURN y + 1
|
||||
ELSIF y = 0 THEN RETURN Ackerman (x - 1 , 1)
|
||||
ELSE
|
||||
RETURN Ackerman (x - 1 , Ackerman (x , y - 1))
|
||||
END
|
||||
END Ackerman;
|
||||
|
||||
PROCEDURE Do*;
|
||||
BEGIN
|
||||
FOR m := 0 TO 3 DO
|
||||
FOR n := 0 TO 6 DO
|
||||
StdLog.Int (Ackerman (m, n));StdLog.Char (' ')
|
||||
END;
|
||||
StdLog.Ln
|
||||
END;
|
||||
StdLog.Ln
|
||||
END Do;
|
||||
|
||||
END NpctAckerman.
|
||||
|
|
@ -19,7 +19,7 @@ in {
|
|||
assert(m >= 0 && n >= 0);
|
||||
} out(result) {
|
||||
//assert(result >= 0);
|
||||
assert(cast()result >= 0);
|
||||
//assert(cast()result >= 0);
|
||||
} body {
|
||||
/*pure nothrow*/ static BigInt ack(in int m, /*in*/ BigInt n) {
|
||||
switch (m) {
|
||||
|
|
|
|||
|
|
@ -1,33 +1,30 @@
|
|||
#define std'dictionary'*.
|
||||
#define std'patterns'*.
|
||||
|
||||
#subject m, n.
|
||||
#define system.
|
||||
|
||||
// --- Ackermann function ---
|
||||
|
||||
#symbol Ackermann &m:anM &n:anN =
|
||||
#symbol ackermann = &&:m:n
|
||||
[
|
||||
#if anM
|
||||
ifequal:0 [ ^ anN + 1. ]
|
||||
| greater:0 ?
|
||||
[
|
||||
#if anN
|
||||
ifequal:0 [ ^ Ackermann &&m:(anM - 1) &n:1. ]
|
||||
| greater:0 ? [ ^ Ackermann &&m:(anM - 1) &n:(Ackermann &&m:anM &n:(anN - 1)). ].
|
||||
].
|
||||
|
||||
control fail.
|
||||
m =>
|
||||
0 ? [ n + 1 ]
|
||||
> 0 ? [
|
||||
n => 0 ? [ $self:(m - 1):1 ]
|
||||
> 0 ? [ $self:(m - 1):($self:m:(n-1)) ]
|
||||
]
|
||||
].
|
||||
|
||||
#symbol Program =
|
||||
#symbol program =
|
||||
[
|
||||
loop &&from:0 &to:3 run: anM =
|
||||
#var n := ackermann:3:5.
|
||||
|
||||
control from:0 &to:3 &do: &&:i
|
||||
[
|
||||
loop &&from:0 &to:5 run: anN =
|
||||
control from:0 &to:5 &do: &&:j
|
||||
[
|
||||
'program'output << "A(" << anM << "," << anN << ")=" << (Ackermann &&m:anM &n:anN) << "%n".
|
||||
console << "A(" << i << "," << j << ")=" << (ackermann:i:j).
|
||||
|
||||
console writeLine.
|
||||
].
|
||||
].
|
||||
|
||||
'program'Input get.
|
||||
console readChar.
|
||||
].
|
||||
|
|
|
|||
8
Task/Ackermann-function/Java/ackermann-function-1.java
Normal file
8
Task/Ackermann-function/Java/ackermann-function-1.java
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
import java.math.BigInteger;
|
||||
|
||||
public static BigInteger ack(BigInteger m, BigInteger n) {
|
||||
return m.equals(BigInteger.ZERO)
|
||||
? n.add(BigInteger.ONE)
|
||||
: ack(m.subtract(BigInteger.ONE),
|
||||
n.equals(BigInteger.ZERO) ? BigInteger.ONE : ack(m, n.subtract(BigInteger.ONE)));
|
||||
}
|
||||
9
Task/Ackermann-function/Java/ackermann-function-2.java
Normal file
9
Task/Ackermann-function/Java/ackermann-function-2.java
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
@FunctionalInterface
|
||||
public interface FunctionalField<FIELD extends Enum<?>> {
|
||||
public Object untypedField(FIELD field);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public default <VALUE> VALUE field(FIELD field) {
|
||||
return (VALUE) untypedField(field);
|
||||
}
|
||||
}
|
||||
46
Task/Ackermann-function/Java/ackermann-function-3.java
Normal file
46
Task/Ackermann-function/Java/ackermann-function-3.java
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.function.UnaryOperator;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public interface TailRecursive {
|
||||
public static <INPUT, INTERMEDIARY, OUTPUT> Function<INPUT, OUTPUT> new_(Function<INPUT, INTERMEDIARY> toIntermediary, UnaryOperator<INTERMEDIARY> unaryOperator, Predicate<INTERMEDIARY> predicate, Function<INTERMEDIARY, OUTPUT> toOutput) {
|
||||
return input ->
|
||||
$.new_(
|
||||
Stream.iterate(
|
||||
toIntermediary.apply(input),
|
||||
unaryOperator
|
||||
),
|
||||
predicate,
|
||||
toOutput
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
public static <INPUT1, INPUT2, INTERMEDIARY, OUTPUT> BiFunction<INPUT1, INPUT2, OUTPUT> new_(BiFunction<INPUT1, INPUT2, INTERMEDIARY> toIntermediary, UnaryOperator<INTERMEDIARY> unaryOperator, Predicate<INTERMEDIARY> predicate, Function<INTERMEDIARY, OUTPUT> toOutput) {
|
||||
return (input1, input2) ->
|
||||
$.new_(
|
||||
Stream.iterate(
|
||||
toIntermediary.apply(input1, input2),
|
||||
unaryOperator
|
||||
),
|
||||
predicate,
|
||||
toOutput
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
public enum $ {
|
||||
$$;
|
||||
|
||||
private static <INTERMEDIARY, OUTPUT> OUTPUT new_(Stream<INTERMEDIARY> stream, Predicate<INTERMEDIARY> predicate, Function<INTERMEDIARY, OUTPUT> function) {
|
||||
return stream
|
||||
.filter(predicate)
|
||||
.map(function)
|
||||
.findAny()
|
||||
.orElseThrow(RuntimeException::new)
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
145
Task/Ackermann-function/Java/ackermann-function-4.java
Normal file
145
Task/Ackermann-function/Java/ackermann-function-4.java
Normal file
|
|
@ -0,0 +1,145 @@
|
|||
import java.math.BigInteger;
|
||||
import java.util.Stack;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
public interface Ackermann {
|
||||
public static Ackermann new_(BigInteger number1, BigInteger number2, Stack<BigInteger> stack, boolean flag) {
|
||||
return $.new_(number1, number2, stack, flag);
|
||||
}
|
||||
public static void main(String... arguments) {
|
||||
$.main(arguments);
|
||||
}
|
||||
public BigInteger number1();
|
||||
public BigInteger number2();
|
||||
|
||||
public Stack<BigInteger> stack();
|
||||
|
||||
public boolean flag();
|
||||
|
||||
public enum $ {
|
||||
$$;
|
||||
|
||||
private static final BigInteger ZERO = BigInteger.ZERO;
|
||||
private static final BigInteger ONE = BigInteger.ONE;
|
||||
private static final BigInteger TWO = BigInteger.valueOf(2);
|
||||
private static final BigInteger THREE = BigInteger.valueOf(3);
|
||||
private static final BigInteger FOUR = BigInteger.valueOf(4);
|
||||
|
||||
private static Ackermann new_(BigInteger number1, BigInteger number2, Stack<BigInteger> stack, boolean flag) {
|
||||
return (FunctionalAckermann) field -> {
|
||||
switch (field) {
|
||||
case number1: return number1;
|
||||
case number2: return number2;
|
||||
case stack: return stack;
|
||||
case flag: return flag;
|
||||
default: throw new UnsupportedOperationException(
|
||||
field instanceof Field
|
||||
? "Field checker has not been updated properly."
|
||||
: "Field is not of the correct type."
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static final BinaryOperator<BigInteger> ACKERMANN =
|
||||
TailRecursive.new_(
|
||||
(BigInteger number1, BigInteger number2) ->
|
||||
new_(
|
||||
number1,
|
||||
number2,
|
||||
Stream.of(number1).collect(
|
||||
Collectors.toCollection(Stack::new)
|
||||
),
|
||||
false
|
||||
)
|
||||
,
|
||||
ackermann -> {
|
||||
BigInteger number1 = ackermann.number1();
|
||||
BigInteger number2 = ackermann.number2();
|
||||
Stack<BigInteger> stack = ackermann.stack();
|
||||
if (!stack.empty() && !ackermann.flag()) {
|
||||
number1 = stack.pop();
|
||||
}
|
||||
switch (number1.intValue()) {
|
||||
case 0:
|
||||
return new_(
|
||||
number1,
|
||||
number2.add(ONE),
|
||||
stack,
|
||||
false
|
||||
);
|
||||
case 1:
|
||||
return new_(
|
||||
number1,
|
||||
number2.add(TWO),
|
||||
stack,
|
||||
false
|
||||
);
|
||||
case 2:
|
||||
return new_(
|
||||
number1,
|
||||
number2.multiply(TWO).add(THREE),
|
||||
stack,
|
||||
false
|
||||
);
|
||||
default:
|
||||
if (ZERO.equals(number2)) {
|
||||
return new_(
|
||||
number1.subtract(ONE),
|
||||
ONE,
|
||||
stack,
|
||||
true
|
||||
);
|
||||
} else {
|
||||
stack.push(number1.subtract(ONE));
|
||||
return new_(
|
||||
number1,
|
||||
number2.subtract(ONE),
|
||||
stack,
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
ackermann -> ackermann.stack().empty(),
|
||||
Ackermann::number2
|
||||
)::apply
|
||||
;
|
||||
|
||||
private static void main(String... arguments) {
|
||||
System.out.println(ACKERMANN.apply(FOUR, TWO));
|
||||
}
|
||||
|
||||
private enum Field {
|
||||
number1,
|
||||
number2,
|
||||
stack,
|
||||
flag
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
private interface FunctionalAckermann extends FunctionalField<Field>, Ackermann {
|
||||
@Override
|
||||
public default BigInteger number1() {
|
||||
return field(Field.number1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public default BigInteger number2() {
|
||||
return field(Field.number2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public default Stack<BigInteger> stack() {
|
||||
return field(Field.stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public default boolean flag() {
|
||||
return field(Field.flag);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,3 @@
|
|||
(0..3).each do |m|
|
||||
(0..6).each { |n| print ack(m, n), ' ' }
|
||||
puts
|
||||
puts (0..6).map { |n| ack(m, n) }.join(' ')
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
(ackermann) m n
|
||||
0 3
|
||||
(zero?) m
|
||||
(add1) n
|
||||
(ackermann) integer1 integer2
|
||||
comment: takes two integers -> returns the result
|
||||
(zero?) integer1
|
||||
(add1) integer2
|
||||
|
||||
(ackermann) m n
|
||||
2 0
|
||||
(and) (positive?) m (zero?) n
|
||||
(ackermann) (sub1) m 1
|
||||
(ackermann) integer1 integer2
|
||||
comment: takes two integers -> returns the result
|
||||
(and) (positive?) integer1 (zero?) integer2
|
||||
(ackermann) (sub1) integer1 1
|
||||
|
||||
(ackermann) m n
|
||||
2 3
|
||||
(and) (positive?) m (positive?) n
|
||||
(ackermann) (sub1) m (ackermann) m (sub1) n
|
||||
(ackermann) integer1 integer2
|
||||
comment: takes two integers -> returns the result
|
||||
(and) (positive?) integer1 (positive?) integer2
|
||||
(ackermann) (sub1) integer1 (ackermann) integer1 (sub1) integer2
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue