Calendar - for "REAL" programmers: Difference between revisions
Content added Content deleted
m (→{{header|FreeBASIC}}: this is the correct version) |
(Added Lua) |
||
Line 1,269: | Line 1,269: | ||
Note that this version of F will work fine with a left argument of 20 (why anyone felt that this was important to mention is perhaps best thought of as an issue lost in history). |
Note that this version of F will work fine with a left argument of 20 (why anyone felt that this was important to mention is perhaps best thought of as an issue lost in history). |
||
=={{header|Lua}}== |
|||
Tested with Lua 5.3.2 |
|||
<br> |
|||
Lua is case sensitive and all the keywords and library routines are in lower case. As with the D sample, we use a simple pre-processor to execute the (slightly modified) upper-cased source of the Lua solution for the standard Calendar task. |
|||
<br> |
|||
The upper case Lua source - stored in a file called UCCALENDAR.LUU: |
|||
<br> |
|||
<lang lua>FUNCTION PRINT_CAL(YEAR) |
|||
LOCAL MONTHS={"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE", |
|||
"JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"} |
|||
LOCAL DAYSTITLE="MO TU WE TH FR SA SU" |
|||
LOCAL DAYSPERMONTH={31,28,31,30,31,30,31,31,30,31,30,31} |
|||
LOCAL STARTDAY=((YEAR-1)*365+MATH.FLOOR((YEAR-1)/4)-MATH.FLOOR((YEAR-1)/100)+MATH.FLOOR((YEAR-1)/400))%7 |
|||
IF YEAR%4==0 AND YEAR%100~=0 OR YEAR%400==0 THEN |
|||
DAYSPERMONTH[2]=29 |
|||
END |
|||
LOCAL SEP=5 |
|||
LOCAL MONTHWIDTH=DAYSTITLE:LEN() |
|||
LOCAL CALWIDTH=3*MONTHWIDTH+2*SEP |
|||
FUNCTION CENTER(STR, WIDTH) |
|||
LOCAL FILL1=MATH.FLOOR((WIDTH-STR:LEN())/2) |
|||
LOCAL FILL2=WIDTH-STR:LEN()-FILL1 |
|||
RETURN STRING.REP(" ",FILL1)..STR..STRING.REP(" ",FILL2) |
|||
END |
|||
FUNCTION MAKEMONTH(NAME, SKIP,DAYS) |
|||
LOCAL CAL={ |
|||
CENTER(NAME,MONTHWIDTH), |
|||
DAYSTITLE |
|||
} |
|||
LOCAL CURDAY=1-SKIP |
|||
WHILE #CAL<9 DO |
|||
LINE={} |
|||
FOR I=1,7 DO |
|||
IF CURDAY<1 OR CURDAY>DAYS THEN |
|||
LINE[I]=" " |
|||
ELSE |
|||
LINE[I]=STRING.FORMAT("%2D",CURDAY) |
|||
END |
|||
CURDAY=CURDAY+1 |
|||
END |
|||
CAL[#CAL+1]=TABLE.CONCAT(LINE," ") |
|||
END |
|||
RETURN CAL |
|||
END |
|||
LOCAL CALENDAR={} |
|||
FOR I,MONTH IN IPAIRS(MONTHS) DO |
|||
LOCAL DPM=DAYSPERMONTH[I] |
|||
CALENDAR[I]=MAKEMONTH(MONTH, STARTDAY, DPM) |
|||
STARTDAY=(STARTDAY+DPM)%7 |
|||
END |
|||
PRINT(CENTER("[SNOOPY]",CALWIDTH):UPPER(),"\N") |
|||
PRINT(CENTER("--- "..YEAR.." ---",CALWIDTH):UPPER(),"\N") |
|||
FOR Q=0,3 DO |
|||
FOR L=1,9 DO |
|||
LINE={} |
|||
FOR M=1,3 DO |
|||
LINE[M]=CALENDAR[Q*3+M][L] |
|||
END |
|||
PRINT(TABLE.CONCAT(LINE,STRING.REP(" ",SEP)):UPPER()) |
|||
END |
|||
END |
|||
END |
|||
PRINT_CAL(1969) |
|||
</lang> |
|||
The following "one-liner" standard Lua source will down-case and run the program in the source file specified as it's parameter (file luu.lua): |
|||
<lang lua>do io.input( arg[ 1 ] ); local s = io.read( "*a" ):lower(); io.close(); assert( load( s ) )() end |
|||
</lang> |
|||
The following command will execute the UCCALENDAR.LUU source (replace lua532 with the appropriate command for your system): |
|||
<br> |
|||
<br> |
|||
lua532 luu.lua UCCALENDAR.LUU |
|||
<br> |
|||
{{out}} |
|||
<pre> |
|||
[SNOOPY] |
|||
--- 1969 --- |
|||
JANUARY FEBRUARY MARCH |
|||
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU |
|||
1 2 3 4 5 1 2 1 2 |
|||
6 7 8 9 10 11 12 3 4 5 6 7 8 9 3 4 5 6 7 8 9 |
|||
13 14 15 16 17 18 19 10 11 12 13 14 15 16 10 11 12 13 14 15 16 |
|||
20 21 22 23 24 25 26 17 18 19 20 21 22 23 17 18 19 20 21 22 23 |
|||
27 28 29 30 31 24 25 26 27 28 24 25 26 27 28 29 30 |
|||
31 |
|||
APRIL MAY JUNE |
|||
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU |
|||
1 2 3 4 5 6 1 2 3 4 1 |
|||
7 8 9 10 11 12 13 5 6 7 8 9 10 11 2 3 4 5 6 7 8 |
|||
14 15 16 17 18 19 20 12 13 14 15 16 17 18 9 10 11 12 13 14 15 |
|||
21 22 23 24 25 26 27 19 20 21 22 23 24 25 16 17 18 19 20 21 22 |
|||
28 29 30 26 27 28 29 30 31 23 24 25 26 27 28 29 |
|||
30 |
|||
JULY AUGUST SEPTEMBER |
|||
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU |
|||
1 2 3 4 5 6 1 2 3 1 2 3 4 5 6 7 |
|||
7 8 9 10 11 12 13 4 5 6 7 8 9 10 8 9 10 11 12 13 14 |
|||
14 15 16 17 18 19 20 11 12 13 14 15 16 17 15 16 17 18 19 20 21 |
|||
21 22 23 24 25 26 27 18 19 20 21 22 23 24 22 23 24 25 26 27 28 |
|||
28 29 30 31 25 26 27 28 29 30 31 29 30 |
|||
OCTOBER NOVEMBER DECEMBER |
|||
MO TU WE TH FR SA SU MO TU WE TH FR SA SU MO TU WE TH FR SA SU |
|||
1 2 3 4 5 1 2 1 2 3 4 5 6 7 |
|||
6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14 |
|||
13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21 |
|||
20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28 |
|||
27 28 29 30 31 24 25 26 27 28 29 30 29 30 31 |
|||
</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
Line 1,319: | Line 1,442: | ||
`${E}${C}${H}${O} $PROGRAM | ${T}${R} A-Z ${A}-${Z} | ${P}${E}${R}${L}`;</lang> |
`${E}${C}${H}${O} $PROGRAM | ${T}${R} A-Z ${A}-${Z} | ${P}${E}${R}${L}`;</lang> |
||
Although, if we are abusing the backticks and other innocent programs, why not just: <lang Perl>$_=$ARGV[0]//1969;`\143\141\154 $_ >&2`</lang> |
Although, if we are abusing the backticks and other innocent programs, why not just: <lang Perl>$_=$ARGV[0]//1969;`\143\141\154 $_ >&2`</lang> |
||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |
||
Uppercase is no challenge, who needs letters at all? |
Uppercase is no challenge, who needs letters at all? |