Calendar - for "REAL" programmers: Difference between revisions

→‎{{header|Lua}}: cat cal.lua | tr [a-z [A-Z]
(Added Lua version)
(→‎{{header|Lua}}: cat cal.lua | tr [a-z [A-Z])
Line 1,147:
 
=={{header|Lua}}==
<lang Lua>FUNCTION PRINT_CAL(YEAR)
<lang Lua>local months={"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE",
LOCAL MONTHS={"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE",
"JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"}
"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=MATH.FLOOR((YEAR-1)*365.2425)%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 daysTitle="MO TU WE TH FR DA SU"
LOCAL FILL1=MATH.FLOOR((WIDTH-STR:LEN())/2)
local daysPerMonth={31,28,31,30,31,30,31,31,30,31,30,31}
LOCAL FILL2=WIDTH-STR:LEN()-FILL1
local year=1969
RETURN STRING.REP(" ",FILL1)..STR..STRING.REP(" ",FILL2)
local startday=3
END
local sep=5
local monthwidth=daysTitle:len()
local calwidth=3*monthwidth+2*sep
 
FUNCTION MAKEMONTH(NAME, SKIP,DAYS)
function center(str, width)
LOCAL CAL={
local fill1=math.floor((width-str:len())/2)
CENTER(NAME,MONTHWIDTH),
local fill2=width-str:len()-fill1
DAYSTITLE
return string.rep(" ",fill1)..str..string.rep(" ",fill2)
}
end
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={}
function makeMonth(name, skip,days)
FOR I,MONTH IN IPAIRS(MONTHS) DO
local cal={
LOCAL DPM=DAYSPERMONTH[I]
center(name,monthwidth),
CALENDAR[I]=MAKEMONTH(MONTH, STARTDAY, DPM)
daysTitle
STARTDAY=(STARTDAY+DPM)%7
}
END
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),"\N")
PRINT(CENTER("--- "..YEAR.." ---",CALWIDTH),"\N")
 
FOR Q=0,3 DO
print(center("[SNOOPY]",calwidth))
FOR L=1,9 DO
print()
LINE={}
print(center("--- "..year.." ---",calwidth))
FOR M=1,3 DO
print("\n")
LINE[M]=CALENDAR[Q*3+M][L]
END
PRINT(TABLE.CONCAT(LINE,STRING.REP(" ",SEP)))
END
END
END
 
PRINT_CAL(1969)</lang>
for q=0,3 do
for l=1,9 do
line={}
for m=1,3 do
line[m]=calendar[q*3+m][l] or ""
end
print(table.concat(line,string.rep(" ",sep)))
end
end</lang>
{{out}}
<pre>
Line 1,251 ⟶ 1,254:
</pre>
 
=={{header|Perl}}==
Since we can't use <code>eval</code> or <code>print</code> (or any other keywords)
Anonymous user