tasks a-s
This commit is contained in:
parent
47bf37c096
commit
b83f433714
12433 changed files with 156208 additions and 123 deletions
38
Task/Number-names/ALGOL-68/number-names-1.alg
Normal file
38
Task/Number-names/ALGOL-68/number-names-1.alg
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
PROC number words = (INT n)STRING:(
|
||||
# returns a string representation of n in words. Currently
|
||||
deals with anything from 0 to 999 999 999. #
|
||||
[]STRING digits = []STRING
|
||||
("zero","one","two","three","four","five","six","seven","eight","nine")[@0];
|
||||
[]STRING teens = []STRING
|
||||
("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen")[@0];
|
||||
[]STRING decades = []STRING
|
||||
("twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety")[@2];
|
||||
|
||||
PROC three digits = (INT n)STRING: (
|
||||
# does the conversion for n from 0 to 999. #
|
||||
INT tens = n MOD 100 OVER 10;
|
||||
INT units = n MOD 10;
|
||||
(n >= 100|digits[n OVER 100] + " " + "hundred" + (n MOD 100 /= 0|" and "|"")|"") +
|
||||
(tens /= 0|(tens = 1|teens[units]|decades[tens] + (units /= 0|"-"|""))|"") +
|
||||
(units /= 0 AND tens /= 1 OR n = 0|digits[units]|"")
|
||||
);
|
||||
INT m = n OVER 1 000 000;
|
||||
INT k = n MOD 1 000 000 OVER 1000;
|
||||
INT u = n MOD 1000;
|
||||
(m /= 0|three digits(m) + " million"|"") +
|
||||
(m /= 0 AND (k /= 0 OR u >= 100)|", "|"") +
|
||||
(k /= 0|three digits(k) + " thousand"|"") +
|
||||
((m /= 0 OR k /= 0) AND u > 0 AND u < 100|" and " |: k /= 0 AND u /= 0|", "|"") +
|
||||
(u /= 0 OR n = 0|three digits(u)|"")
|
||||
);
|
||||
|
||||
on logical file end(stand in, (REF FILE f)BOOL: GOTO stop iteration);
|
||||
on value error(stand in, (REF FILE f)BOOL: GOTO stop iteration);
|
||||
DO # until user hits EOF #
|
||||
INT n;
|
||||
print("n? ");
|
||||
read((n, new line));
|
||||
print((number words(n), new line))
|
||||
OD;
|
||||
stop iteration:
|
||||
SKIP
|
||||
89
Task/Number-names/ALGOL-68/number-names-2.alg
Normal file
89
Task/Number-names/ALGOL-68/number-names-2.alg
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
MODE EXCEPTION = STRUCT(STRING name, PROC VOID handler);
|
||||
EXCEPTION value error = ("Value Error", stop);
|
||||
|
||||
PROC raise = (EXCEPTION exception, STRING str error)VOID: (
|
||||
put(stand error, (name OF exception,": ",str error, new line));
|
||||
handler OF exception
|
||||
);
|
||||
|
||||
MODE LINT = LONG LONG INT;
|
||||
|
||||
BOOL locale euro := TRUE;
|
||||
|
||||
PROC spell integer = (LINT n)STRING: (
|
||||
[]STRING tens = []STRING (~, ~, "twenty", "thirty", "forty",
|
||||
"fifty", "sixty", "seventy", "eighty", "ninety")[@0];
|
||||
|
||||
[]STRING small = []STRING ("zero", "one", "two", "three", "four", "five",
|
||||
"six", "seven", "eight", "nine", "ten", "eleven",
|
||||
"twelve", "thirteen", "fourteen", "fifteen",
|
||||
"sixteen", "seventeen", "eighteen", "nineteen")[@0];
|
||||
|
||||
[]STRING bl = []STRING (~, ~, "m", "b", "tr", "quadr",
|
||||
"quint", "sext", "sept", "oct", "non", "dec")[@0];
|
||||
|
||||
PROC nonzero = (STRING c, LINT n)STRING:
|
||||
IF n = 0 THEN "" ELSE c + spell integer(n) FI;
|
||||
|
||||
PROC big =(INT e, LINT n)STRING:
|
||||
spell integer(n) +
|
||||
CASE e+1 IN
|
||||
#0# "",
|
||||
#1# " thousand"
|
||||
OUT
|
||||
" " +
|
||||
IF locale euro THEN # handle millard, billard & trillard etc #
|
||||
bl[e OVER 2 + 1 ]+"ill" + CASE e MOD 2 IN "ard" OUT "ion" ESAC
|
||||
ELSE
|
||||
bl[e]+"illion"
|
||||
FI
|
||||
ESAC;
|
||||
|
||||
PROC base1000 rev = (LINT in n, PROC (INT,LINT)VOID yield)VOID: (
|
||||
# generates the value of the digits of n in base 1000 #
|
||||
# (i.e. 3-digit chunks), in reverse. #
|
||||
LINT n := in n;
|
||||
FOR e FROM 0 WHILE n /= 0 DO
|
||||
LINT r = n MOD 1000;
|
||||
n := n OVER 1000;
|
||||
yield(e, r)
|
||||
OD
|
||||
);
|
||||
|
||||
IF n < 1000 THEN
|
||||
INT ssn := SHORTEN SHORTEN n;
|
||||
IF ssn < 0 THEN
|
||||
raise (value error, "spell integer: negative input"); ~
|
||||
ELIF ssn < 20 THEN
|
||||
small[ssn]
|
||||
ELIF ssn < 100 THEN
|
||||
INT a = ssn OVER 10,
|
||||
b = ssn MOD 10;
|
||||
tens[a] + nonzero("-", b)
|
||||
ELIF ssn < 1000 THEN
|
||||
INT a = ssn OVER 100,
|
||||
b = ssn MOD 100;
|
||||
small[a] + " hundred" + ( b NE 0 | " and" | "") + nonzero(" ", b)
|
||||
FI
|
||||
ELSE
|
||||
STRING out := "", sep:="";
|
||||
# FOR e, x IN # base1000 rev(n, # DO #
|
||||
(INT e, LINT x)VOID:
|
||||
IF x NE 0 THEN
|
||||
big(e,x) + sep +=: out;
|
||||
sep := IF e = 0 AND x < 100 THEN " and " ELSE ", " FI
|
||||
FI
|
||||
)
|
||||
# OD #;
|
||||
out
|
||||
FI
|
||||
);
|
||||
|
||||
PROC example = (LINT n)VOID:
|
||||
print((whole(n,0),": ", spell integer(n), new line));
|
||||
|
||||
# examples #
|
||||
LINT prod := 0;
|
||||
FOR i TO 6 DO prod := prod * 10**i + i; example(prod) OD;
|
||||
|
||||
example(1278); example(1572); example(2010)
|
||||
Loading…
Add table
Add a link
Reference in a new issue