September 2017 Update

This commit is contained in:
Ingy döt Net 2017-09-23 10:01:46 +02:00
parent bba7bfd280
commit ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions

View file

@ -0,0 +1,12 @@
open import Data.Nat
open import Data.Nat.Show
open import IO
module Ackermann where
ack : -> ->
ack zero n = n + 1
ack (suc m) zero = ack m 1
ack (suc m) (suc n) = ack m (ack (suc m) n)
main = run (putStrLn (show (ack 3 9)))

View file

@ -0,0 +1,2 @@
agda --compile Ackermann.agda
./Ackermann

View file

@ -0,0 +1,12 @@
define ack(m, n) {
if ( m == 0 ) return (n+1);
if ( n == 0 ) return (ack(m-1, 1));
return (ack(m-1, ack(m, n-1)));
}
for (n=0; n<7; n++) {
for (m=0; m<4; m++) {
print "A(", m, ",", n, ") = ", ack(m,n), "\n";
}
}
quit

View file

@ -0,0 +1,5 @@
>M?f@h@gMf@h3yzp if m>0 and n>0 => replace m,n with m-1,m,n-1
>@h@g'b?1f@h@gM?f@hzp if m>0 and n=0 => replace m,n with m-1,1
_ii>Ag~1?~Lpz1~2h@g'd?g?Pfzp if m=0 => replace m,n with n+1
>I;
b < <

View file

@ -0,0 +1,10 @@
>Mf@Ph?@g@2h@Mf@Php if m>4 and n>0 => replace m,n with m-1,m,n-1
>~4~L#1~2hg'd?1f@hgM?f2h p if m>4 and n=0 => replace m,n with m-1,1
# q < /n+3 times \
#X~4K#?2Fg?PPP>@B@M"pb if m=4 => replace m,n with 2^(2^(....)))-3
# >~3K#?g?PPP~2BMMp>@MMMp if m=3 => replace m,n with 2^(n+3)-3
_ii>Ag~1?~Lpz1~2h@gX'#?g?P p M if m=0 => replace m,n with n+1
z I ~>~1K#?g?PP p if m=1 => replace m,n with n+2
f ; >2K#?g?~2.PPPp if m=2 => replace m,n with 2n+3
z b < < <
d <

View file

@ -1,32 +1,127 @@
using System;
class Program
using System.Numerics;
using System.IO;
using System.Diagnostics;
namespace Ackermann_Function
{
public static long Ackermann(long m, long n)
class Program
{
if(m > 0)
static void Main(string[] args)
{
if (n > 0)
return Ackermann(m - 1, Ackermann(m, n - 1));
else if (n == 0)
return Ackermann(m - 1, 1);
}
else if(m == 0)
{
if(n >= 0)
return n + 1;
}
throw new System.ArgumentOutOfRangeException();
}
static void Main()
{
for (long m = 0; m <= 3; ++m)
{
for (long n = 0; n <= 4; ++n)
int _m = 0;
int _n = 0;
Console.Write("m = ");
try
{
Console.WriteLine("Ackermann({0}, {1}) = {2}", m, n, Ackermann(m, n));
_m = Convert.ToInt32(Console.ReadLine());
}
catch (Exception)
{
Console.WriteLine("Please enter a number.");
}
Console.Write("n = ");
try
{
_n = Convert.ToInt32(Console.ReadLine());
}
catch (Exception)
{
Console.WriteLine("Please enter a number.");
}
//for (long m = 0; m <= 10; ++m)
//{
// for (long n = 0; n <= 10; ++n)
// {
// DateTime now = DateTime.Now;
// Console.WriteLine("Ackermann({0}, {1}) = {2}", m, n, Ackermann(m, n));
// Console.WriteLine("Time taken:{0}", DateTime.Now - now);
// }
//}
DateTime now = DateTime.Now;
Console.WriteLine("Ackermann({0}, {1}) = {2}", _m, _n, Ackermann(_m, _n));
Console.WriteLine("Time taken:{0}", DateTime.Now - now);
File.WriteAllText("number.txt", Ackermann(_m, _n).ToString());
Process.Start("number.txt");
Console.ReadKey();
}
public class OverflowlessStack<T>
{
internal sealed class SinglyLinkedNode
{
private const int ArraySize = 2048;
T[] _array;
int _size;
public SinglyLinkedNode Next;
public SinglyLinkedNode()
{
_array = new T[ArraySize];
}
public bool IsEmpty { get { return _size == 0; } }
public SinglyLinkedNode Push(T item)
{
if (_size == ArraySize - 1)
{
SinglyLinkedNode n = new SinglyLinkedNode();
n.Next = this;
n.Push(item);
return n;
}
_array[_size++] = item;
return this;
}
public T Pop()
{
return _array[--_size];
}
}
private SinglyLinkedNode _head = new SinglyLinkedNode();
public T Pop()
{
T ret = _head.Pop();
if (_head.IsEmpty && _head.Next != null)
_head = _head.Next;
return ret;
}
public void Push(T item)
{
_head = _head.Push(item);
}
public bool IsEmpty
{
get { return _head.Next == null && _head.IsEmpty; }
}
}
public static BigInteger Ackermann(BigInteger m, BigInteger n)
{
var stack = new OverflowlessStack<BigInteger>();
stack.Push(m);
while (!stack.IsEmpty)
{
m = stack.Pop();
skipStack:
if (m == 0)
n = n + 1;
else if (m == 1)
n = n + 2;
else if (m == 2)
n = n * 2 + 3;
else if (n == 0)
{
--m;
n = 1;
goto skipStack;
}
else
{
stack.Push(m - 1);
--n;
goto skipStack;
}
}
return n;
}
}
}

View file

@ -1,26 +1,29 @@
#define system.
#define extensions.
import extensions.
// --- Ackermann function ---
#symbol ackermann = (:m:n)
ackermann = (:m:n)
[
if((n < 0)||(m < 0))
[
InvalidArgumentException new; raise
].
m =>
0 ? [ n + 1 ]
> 0 ? [
n => 0 ? [ ackermann eval:(m - 1):1 ]
> 0 ? [ ackermann eval:(m - 1):(ackermann eval:m:(n-1)) ]
0 [ ^n + 1 ];
! [
n =>
0 [ ^ackermann eval(m - 1,1) ];
! [ ^ackermann eval(m - 1,ackermann eval(m,n-1)) ]
]
].
#symbol program =
program =
[
0 to:3 &doEach: (:i)
0 to:3 do(:i)
[
0 to:5 &doEach: (:j)
0 to:5 do(:j)
[
console writeLine:"A(":i:",":j:")=":(ackermann eval:i:j).
].
console printLine("A(",i,",",j,")=",ackermann eval(i,j))
]
].
console readChar.

View file

@ -0,0 +1,5 @@
A (m, n) = m == 0 ? n + 1 : n == 0 ? A (m - 1, 1) : A (m - 1, A (m, n - 1))
print A (0, 4)
print A (1, 4)
print A (2, 4)
print A (3, 4)

View file

@ -1,3 +1,7 @@
ack 0 n = n + 1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))
ack :: Int -> Int -> Int
ack 0 n = succ n
ack m 0 = ack (pred m) 1
ack m n = ack (pred m) (ack m (pred n))
main :: IO ()
main = mapM_ print $ uncurry ack <$> [(0, 0), (3, 4)]

View file

@ -1,5 +1,3 @@
package ackermann
fun A(m: Long, n: Long): Long = when {
m == 0L -> n + 1
m > 0L -> when {

View file

@ -0,0 +1,3 @@
fun ackermann( 0, n ) = n + 1
| ( m, 0 ) = ackermann( m - 1, 1 )
| ( m, n ) = ackermann( m - 1, ackermann(m, n - 1) )

View file

@ -0,0 +1,5 @@
fun jota x = map (fn x = x-1) ` iota x
fun test_tuples (x, y) = append_map (fn a = map (fn b = (b, a)) ` jota x) ` jota y
map ackermann (test_tuples(4,9))

View file

@ -1,7 +0,0 @@
proc Ackermann(m, n: int64): int64 =
if m == 0:
result = n + 1
elif n == 0:
result = Ackermann(m - 1, 1)
else:
result = Ackermann(m - 1, Ackermann(m, n - 1))

View file

@ -1,32 +0,0 @@
from strutils import parseInt
proc ackermann(m,n: int): int =
var res: int
if m == 0:
res += n + 1
elif m > 0 and n == 0:
res += ackermann(m-1, 1)
elif m > 0 and n > 0:
res += ackermann(m-1, ackermann(m, n-1))
return res
proc getnumber(): int =
try:
parseInt(readLine(stdin))
except EInvalidValue:
echo("Please enter an integer: ")
getnumber()
echo("First number please: ")
var first: int = getnumber()
while first < 0:
echo("Please enter a non-negative integer value.")
first = getnumber()
echo("Second number please: ")
var second: int = getnumber()
while second < 0:
echo("Please enter a non-negative integer value.")
second = getnumber()
echo("Result: " & $ackermann(first, second))

View file

@ -0,0 +1,25 @@
from strutils import parseInt
proc ackermann(m, n: int64): int64 =
if m == 0:
result = n + 1
elif n == 0:
result = ackermann(m - 1, 1)
else:
result = ackermann(m - 1, ackermann(m, n - 1))
proc getNumber(): int =
try:
result = stdin.readLine.parseInt
except ValueError:
echo "An integer, please!"
result = getNumber()
if result < 0:
echo "Please Enter a non-negative Integer: "
result = getNumber()
echo "First non-negative Integer please: "
let first = getNumber()
echo "Second non-negative Integer please: "
let second = getNumber()
echo "Reslut: ", $ackermann(first, second)

View file

@ -1,7 +0,0 @@
proc Ackermann(m, n: int64): int64 =
if m == 0:
result = n + 1
elif n == 0:
result = Ackermann(m - 1, 1)
else:
result = Ackermann(m - 1, Ackermann(m, n - 1))

View file

@ -0,0 +1,18 @@
# Task: Ackermann function
#
# A simple straightforward recursive implementation.
module ackermann_function
fun ack(m, n: Int): Int
do
if m == 0 then return n + 1
if n == 0 then return ack(m-1,1)
return ack(m-1, ack(m, n-1))
end
for m in [0..3] do
for n in [0..6] do
print ack(m,n)
end
print ""
end

View file

@ -0,0 +1,13 @@
loop m = 0 to 3
loop n = 0 to 6
say "Ackermann("m", "n") =" ackermann(m, n)
end
end
::routine ackermann
use strict arg m, n
-- give us some precision room
numeric digits 10000
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))

View file

@ -0,0 +1,17 @@
mata
function ackermann(m,n) {
if (m==0) {
return(n+1)
} else if (n==0) {
return(ackermann(m-1,1))
} else {
return(ackermann(m-1,ackermann(m,n-1)))
}
}
for (i=0; i<=3; i++) printf("%f\n",ackermann(i,4))
5
6
11
125
end

View file

@ -0,0 +1,21 @@
PROGRAM:ACKERMAN
:If not(M
:Then
:N+1→N
:Return
:Else
:If not(N
:Then
:1→N
:M-1→M
:prgmACKERMAN
:Else
:N-1→N
:M→L1(1+dim(L1
:prgmACKERMAN
:Ans→N
:L1(dim(L1))-1→M
:dim(L1)-1→dim(L1
:prgmACKERMAN
:End
:End

View file

@ -0,0 +1,6 @@
PROGRAM:AHANDLER
:0→dim(L1
:Prompt M
:Prompt N
:prgmACKERMAN
:Disp Ans