Data update
This commit is contained in:
parent
8e4e15fa56
commit
72eb4943cb
1853 changed files with 35514 additions and 9441 deletions
79
Task/Four-is-magic/ALGOL-68/four-is-magic.alg
Normal file
79
Task/Four-is-magic/ALGOL-68/four-is-magic.alg
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
BEGIN # construct number names from a number #
|
||||
MODE NUMBER = LONG INT; # adjust to suit, must be at least 64 bits #
|
||||
OP TOINT = ( NUMBER n )INT: SHORTEN n; # adjust to suit #
|
||||
[]STRING units
|
||||
= ( "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" );
|
||||
[]STRING teens
|
||||
= ( "ten", "eleven", "twelve", "thirteen", "fourteen"
|
||||
, "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
|
||||
);
|
||||
[]STRING tens
|
||||
= ( "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" );
|
||||
[]STRING power suffix
|
||||
= ( "thousand", "million", "billion", "trillion", "quadrillion", "quintillion" );
|
||||
# returns n converted to a number name, n must be in range 1-99 #
|
||||
PROC two digits = ( INT n )STRING:
|
||||
IF n < 10
|
||||
THEN units[ n ]
|
||||
ELIF n < 20
|
||||
THEN teens[ n - 9 ]
|
||||
ELIF INT last1 = n MOD 10;
|
||||
last1 = 0
|
||||
THEN tens[ ( n OVER 10 ) - 1 ]
|
||||
ELSE tens[ ( n OVER 10 ) - 1 ] + " " + units[ last1 ]
|
||||
FI # two digits # ;
|
||||
# returns n converted to a number name, n must be in range 1-999 #
|
||||
PROC three digits = ( INT n )STRING:
|
||||
IF n < 100
|
||||
THEN two digits( n )
|
||||
ELIF STRING hundreds = units[ n OVER 100 ] + " hundred";
|
||||
INT last2 = n MOD 100;
|
||||
last2 = 0
|
||||
THEN hundreds
|
||||
ELSE hundreds + " " + two digits( last2 )
|
||||
FI # three digits # ;
|
||||
# returns the "name" of n #
|
||||
OP NAME = ( NUMBER n )STRING:
|
||||
IF n < 0 THEN "negative " + NAME - n
|
||||
ELIF n = 0 THEN "zero"
|
||||
ELSE # have a positive number to name #
|
||||
NUMBER v := n;
|
||||
STRING result := "";
|
||||
INT power pos := 0;
|
||||
WHILE v /= 0 DO
|
||||
IF INT v999 = TOINT ( v MOD 1000 );
|
||||
v999 /= 0
|
||||
THEN STRING component := three digits( v999 );
|
||||
IF power pos > 0 THEN
|
||||
component +:= " " + power suffix[ power pos ]
|
||||
FI;
|
||||
IF result /= "" THEN component +:= " " FI;
|
||||
component +=: result
|
||||
FI;
|
||||
power pos +:= 1;
|
||||
v OVERAB 1000
|
||||
OD;
|
||||
result
|
||||
FI # NAME # ;
|
||||
# returns the "x is y, y is z, ... four is magic" sequence derived from n #
|
||||
OP MAGIC = ( NUMBER n )STRING:
|
||||
BEGIN
|
||||
NUMBER v := n;
|
||||
STRING result := "";
|
||||
WHILE v /= 4 DO
|
||||
IF result /= "" THEN result +:= ", " FI;
|
||||
STRING v name = NAME v;
|
||||
v := ( UPB v name - LWB v name ) + 1;
|
||||
result +:= v name + " is " + NAME v
|
||||
OD;
|
||||
IF result /= "" THEN result +:= ", " FI;
|
||||
result + "four is magic"
|
||||
END # MAGIC # ;
|
||||
# test cases #
|
||||
[]NUMBER t = ( 0, 1, 2, 3, 4, 5, 100, 101, 272, 1701, 1968, 4077, 90 210
|
||||
, - 100 001, 987 654, - NUMBER( 8 007 006 005 004 003 )
|
||||
);
|
||||
FOR n FROM LWB t TO UPB t DO
|
||||
print( ( whole( t[ n ], -18 ), ": ", MAGIC t[ n ], newline ) )
|
||||
OD
|
||||
END
|
||||
|
|
@ -5,3 +5,6 @@
|
|||
while (/= n 4)
|
||||
do (format out "~A is ~R, " c (length c))
|
||||
finally (format out "four is magic.")))))
|
||||
(loop for n
|
||||
in '( -1 0 1 2 3 4 5 6 7 8 9 11 21 1995 1000000 1234567890 1100100100100 )
|
||||
do (print (integer-to-text n)))
|
||||
|
|
|
|||
67
Task/Four-is-magic/M2000-Interpreter/four-is-magic.m2000
Normal file
67
Task/Four-is-magic/M2000-Interpreter/four-is-magic.m2000
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
module Four_is_magic {
|
||||
numname=lambda ->{
|
||||
flush
|
||||
data "", "one", "two", "three", "four"
|
||||
data "five", "six", "seven", "eight", "nine", "ten"
|
||||
data "eleven", "twelve", "thirteen", "fourteen", "fifteen"
|
||||
data "sixteen", "seventeen","eighteen", "nineteen"
|
||||
dim lows(), tens(), lev()
|
||||
lows()=array([])
|
||||
data "", "", "twenty", "thirty", "forty","fifty", "sixty"
|
||||
data "seventy", "eighty", "ninety"
|
||||
tens()=array([])
|
||||
lev()=("", "thousand", "million", "billion")
|
||||
=lambda lows(), tens(), lev() (n as long) -> {
|
||||
if n=0 then ="zero": exit
|
||||
long i, tr : boolean t : string ret, prefix
|
||||
if n < 0 then prefix= "negative ": n-! else prefix=""
|
||||
while n>0 {push n mod 1000: n|div 1000}
|
||||
t=stack.size>1
|
||||
while not empty {
|
||||
tripn="" : read tr : if tr=0 then continue
|
||||
lt= tr mod 100 : h= tr div 100
|
||||
if lt<20 then
|
||||
tripn+=lows(lt)
|
||||
else
|
||||
tripn=tens(lt div 10)+if$(lt mod 10 >0 ->"-"+lows(lt mod 10),"")
|
||||
end if
|
||||
if h>0 then tripn = lows(h)+" hundred " + tripn
|
||||
if empty then if t and h = 0 then tripn = " and " + tripn
|
||||
ret+=tripn+" "+lev(stack.size)+" "
|
||||
}
|
||||
=prefix+trim$(ret)
|
||||
}
|
||||
}()
|
||||
TitleStr=lambda (s as string) ->{
|
||||
=ucase$(left$(s,1))+mid$(s, 2)
|
||||
}
|
||||
magic=lambda numname, TitleStr (n as integer)-> {
|
||||
first$=numname(n)
|
||||
count$=numname(len(first$))
|
||||
while first$<>"four"
|
||||
data first$+" is "+count$
|
||||
swap first$, count$
|
||||
count$=numname(len(first$))
|
||||
end while
|
||||
data "four is magic."
|
||||
=TitleStr(array([])#str$(", "))
|
||||
}
|
||||
document doc$
|
||||
for i=0 to 9
|
||||
doc$ = magic(i)+{
|
||||
}
|
||||
next
|
||||
doc$ = magic(23)+{
|
||||
}
|
||||
doc$ = magic(130)+{
|
||||
}
|
||||
doc$ = magic(151)+{
|
||||
}
|
||||
doc$ = magic(-7)+{
|
||||
}
|
||||
doc$ = magic(20140)+{
|
||||
}
|
||||
report doc$
|
||||
clipboard doc$
|
||||
}
|
||||
Four_is_magic
|
||||
Loading…
Add table
Add a link
Reference in a new issue