User:Thebigh/mysandbox: Difference between revisions

From Rosetta Code
Content added Content deleted
(expand)
m (tweak)
 
(23 intermediate revisions by the same user not shown)
Line 1: Line 1:
Some FRACTRAN programs in case we ever have a category for it
The '''Minkowski question-mark function''' converts the continued fraction representation of a number into


==A+B==
==header|FreeBASIC==


Input a number of the form 2^a 3^b
<lang freebasic>#define MAXITER 151
<lang fractran>
2/3
</lang>
The output is 2^(a+b)


==Empty program==
function minkowski( x as double ) as double
if x>1 or x<0 then return int(x)+minkowski(x-int(x))
dim as ulongint p = int(x)
dim as ulongint q = 1, r = p + 1, s = 1, m, n
dim as double d = 1, y = p
while true
d = d / 2.0
if y + d = y then exit while
m = p + r
if m < 0 or p < 0 then exit while
n = q + s
if n < 0 then exit while
if x < cast(double,m) / n then
r = m
s = n
else
y = y + d
p = m
q = n
end if
wend
return y + d
end function


A list of no fractions does nothing, then immediately stops.
function minkowski_inv( byval x as double ) as double
<lang fractran></lang>
if x>1 or x<0 then return int(x)+minkowski_inv(x-int(x))

if x=1 or x=0 then return x
==Integer Sequence==
redim as uinteger contfrac(0 to 0)
Given the number 1 as input the following program will, as its (3n-2)th step, produce the number 2^n.
dim as uinteger curr=0, count=1, i = 0
<lang fractran> 2/3, 9/2, 2/1</lang>
do

x *= 2
==Logical operations==
if curr = 0 then
It's not so hard to code up all sixteen possible two-input logic gates, so here they are. The input is 2^a 3^b where a,b are zero or one and the output is 5^1 for true and 5^0 for false. Gates that return true when all their inputs are false additionally require the flag 11 to be set as input (ie 2^a*3^b*11)- any FRACTRAN program with the number 1 as input either stops without doing anything or loops forever.
if x<1 then

count += 1
<lang fractran>
else
i += 1
5/6, 1/2, 1/3 AND gate
redim preserve contfrac(0 to i)
5/6, 5/2, 5/3 OR gate
1/22, 5/11 NOT gate (uses 11 as a halt flag, result of 2^a*11 is 5^not(a))
contfrac(i-1)=count
count = 1
1/6, 5/2, 5/3 XOR gate
1/66, 5/22, 5/33, 5/11 NAND gate (needs 11 flag)
curr = 1
5/66, 1/22, 1/33, 5/11 NXOR gate (needs flag)
x=x-1
endif
1/66, 1/22, 1/33, 5/11 NOR gate (needs flag)

else
so much for all the commonly encountered ones, but there's still another eight to go. Most are obscure and of limited utility.
if x>1 then

count += 1
x=x-1
1/2, 1/3 ZERO gate, returns false regardless of its input
1/6, 5/2, 1/3 "A and not B", true only if A is true and B is false
else
i += 1
5/2, 1/3 A , returns the state of A regardless of B
redim preserve contfrac(0 to i)
1/6, 1/2, 5/3 "B and not A", true only if B is true and A is false
contfrac(i-1)=count
1/2, 5/3 B , returns the state of B regardless of A
count = 1
1/66, 1/33, 5/11 "A or not B" (needs flag)
curr = 0
1/66, 1/22, 5/11 "B or not A" (needs flag)
5/66, 5/22, 5/33, 5/11 ONE gate, returns true regardless of its input, needs flag
endif

end if
NOT A and NOT B are omitted because the one-input NOT gate is already up there.
if x = int(x) then
</lang>
contfrac(i)=count
exit do
end if
loop until i = MAXITER
dim as double ret = 1.0/contfrac(i)
for j as integer = i-1 to 0 step -1
ret = contfrac(j) + 1.0/ret
next j
return 1./ret
end function


==Sort three variables==
print minkowski( 0.5*(1+sqr(5)) ), 5./3
FRACTRAN's only data type is positive integers. Suppose (a,b,c) are the integers to be sorted. Give the following as input:
print minkowski_inv( -5./9 ), (sqr(13)-7)/6
2^a 3^b 5^c
print minkowski(minkowski_inv(0.718281828)), minkowski_inv(minkowski(0.718281828))
<lang fractran>
1001/30, 143/6, 143/10, 143/15, 13/2, 13/3, 13/5
</lang>
</lang>
Returns 7^A 11^B 13^C where (A,B,C) are (a,b,c) in ascending order.

Latest revision as of 11:27, 28 November 2021

Some FRACTRAN programs in case we ever have a category for it

A+B

Input a number of the form 2^a 3^b <lang fractran> 2/3 </lang> The output is 2^(a+b)

Empty program

A list of no fractions does nothing, then immediately stops. <lang fractran></lang>

Integer Sequence

Given the number 1 as input the following program will, as its (3n-2)th step, produce the number 2^n. <lang fractran> 2/3, 9/2, 2/1</lang>

Logical operations

It's not so hard to code up all sixteen possible two-input logic gates, so here they are. The input is 2^a 3^b where a,b are zero or one and the output is 5^1 for true and 5^0 for false. Gates that return true when all their inputs are false additionally require the flag 11 to be set as input (ie 2^a*3^b*11)- any FRACTRAN program with the number 1 as input either stops without doing anything or loops forever.

<lang fractran> 5/6, 1/2, 1/3 AND gate 5/6, 5/2, 5/3 OR gate 1/22, 5/11 NOT gate (uses 11 as a halt flag, result of 2^a*11 is 5^not(a)) 1/6, 5/2, 5/3 XOR gate 1/66, 5/22, 5/33, 5/11 NAND gate (needs 11 flag) 5/66, 1/22, 1/33, 5/11 NXOR gate (needs flag) 1/66, 1/22, 1/33, 5/11 NOR gate (needs flag)

so much for all the commonly encountered ones, but there's still another eight to go. Most are obscure and of limited utility.

1/2, 1/3 ZERO gate, returns false regardless of its input 1/6, 5/2, 1/3 "A and not B", true only if A is true and B is false 5/2, 1/3 A , returns the state of A regardless of B 1/6, 1/2, 5/3 "B and not A", true only if B is true and A is false 1/2, 5/3 B , returns the state of B regardless of A 1/66, 1/33, 5/11 "A or not B" (needs flag) 1/66, 1/22, 5/11 "B or not A" (needs flag) 5/66, 5/22, 5/33, 5/11 ONE gate, returns true regardless of its input, needs flag

NOT A and NOT B are omitted because the one-input NOT gate is already up there. </lang>

Sort three variables

FRACTRAN's only data type is positive integers. Suppose (a,b,c) are the integers to be sorted. Give the following as input: 2^a 3^b 5^c <lang fractran> 1001/30, 143/6, 143/10, 143/15, 13/2, 13/3, 13/5 </lang> Returns 7^A 11^B 13^C where (A,B,C) are (a,b,c) in ascending order.