Data update
This commit is contained in:
parent
4d5544505c
commit
4924dd0264
3073 changed files with 55820 additions and 4408 deletions
|
|
@ -0,0 +1,57 @@
|
|||
public program = PROGRAM;
|
||||
|
||||
CONSOLE = Console;
|
||||
|
||||
abstract INDEXERCLASS : interface<Indexer>
|
||||
{
|
||||
abstract ISAVAILABLE();
|
||||
abstract GETINDEX();
|
||||
abstract SETINDEX(INDEX);
|
||||
abstract NEWINDEX(OFFS);
|
||||
abstract GETVALUE();
|
||||
abstract GETLENGTH();
|
||||
|
||||
bool Available = ISAVAILABLE();
|
||||
int Index
|
||||
{
|
||||
get() = GETINDEX();
|
||||
|
||||
set(int INDEX)
|
||||
{
|
||||
SETINDEX(INDEX);
|
||||
}
|
||||
}
|
||||
appendIndex(int OFFS) { this self.Index := NEWINDEX(OFFS) }
|
||||
set Value(o) { NotSupportedException.raise() }
|
||||
get Value() = GETVALUE();
|
||||
get int Length() { ^ GETLENGTH() }
|
||||
}
|
||||
|
||||
PARALLELENUMERATOR(N) { ^ ParallelEnumerator.new(N) }
|
||||
|
||||
NEWDATE(Y,M,D) { ^ Date.new(Y,M,D) }
|
||||
NEWTEXTBUILDER() { ^ new TextBuilder() }
|
||||
|
||||
GETMONTH(D) { ^ D.Month }
|
||||
GETDAYOFWEEK(D) { ^D.DayOfWeek }
|
||||
GETDAYSTR(D) { ^ D.Day.toPrintable() }
|
||||
|
||||
READCHAR() { Console.readChar() }
|
||||
READINT(PROMPT) { ^ Console.write(PROMPT).readLine().toInt() }
|
||||
|
||||
WRITEPADDING(OUTPUT,S,SPACER,LEN) { OUTPUT.writePadding(S,SPACER,LEN) }
|
||||
WRITEPADDINGLEFT(OUTPUT,S,SPACER,LEN) { OUTPUT.writePaddingLeft(S,SPACER,LEN) }
|
||||
WRITELINE(OUTPUT) { OUTPUT.writeLine() }
|
||||
WRITE(OUTPUT,S) { OUTPUT.write(S) }
|
||||
WRITEARGS(OUTPUT,S1,S2) { OUTPUT.print(S1, S2) }
|
||||
WRITECOPIES(OUTPUT,S,N) { OUTPUT.writeCopies(S,N) }
|
||||
|
||||
ALLOCATE(COUNT) { ^ Array.allocate(COUNT) }
|
||||
|
||||
CLEAR(S) { S.clear() }
|
||||
|
||||
POPULATE(OBJ, ACTION) { ^ OBJ.populate(ACTION) }
|
||||
FOREACH(OBJ, ACTION) { ^ OBJ.forEach(ACTION) }
|
||||
|
||||
const MONTHNAMES = new string[]{"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"};
|
||||
const DAYNAMES = new string[]{"MO", "TU", "WE", "TH", "FR", "SA", "SU"};
|
||||
|
|
@ -0,0 +1,146 @@
|
|||
// --- UPPERCASE CODE --
|
||||
|
||||
CALENDARMONTHPRINTER
|
||||
{
|
||||
_DATE;
|
||||
_LINE;
|
||||
_MONTH;
|
||||
_YEAR;
|
||||
_ROW;
|
||||
|
||||
constructor NEW(YEAR, MONTH)
|
||||
{
|
||||
_MONTH := MONTH;
|
||||
_YEAR := YEAR;
|
||||
_LINE := NEWTEXTBUILDER();
|
||||
_ROW := 0;
|
||||
}
|
||||
|
||||
WRITETITLE()
|
||||
{
|
||||
_ROW := 0;
|
||||
_DATE := NEWDATE(_YEAR, _MONTH, 1);
|
||||
|
||||
FOREACH(DAYNAMES, (NAME)
|
||||
{ WRITEARGS(_LINE, " ", NAME) })
|
||||
}
|
||||
|
||||
WRITECALLINE()
|
||||
{
|
||||
CLEAR(_LINE);
|
||||
|
||||
if (GETMONTH(_DATE) == _MONTH)
|
||||
{
|
||||
WRITECOPIES(_LINE, " ",(GETDAYOFWEEK(_DATE) == 0) ? 6 : (GETDAYOFWEEK(_DATE) - 1));
|
||||
|
||||
do
|
||||
{
|
||||
WRITEPADDINGLEFT(_LINE, GETDAYSTR(_DATE), $32, 3);
|
||||
|
||||
_DATE := _DATE.addDays(1)
|
||||
}
|
||||
until(GETMONTH(_DATE) != _MONTH || GETDAYOFWEEK(_DATE) == 1)
|
||||
};
|
||||
|
||||
int LENGTH := _LINE.Length;
|
||||
if (LENGTH < 21)
|
||||
{ WRITECOPIES(_LINE, " ", 21 - LENGTH) };
|
||||
|
||||
_ROW += 1
|
||||
}
|
||||
|
||||
indexer() = new INDEXERCLASS
|
||||
{
|
||||
ISAVAILABLE() = _ROW < 7;
|
||||
|
||||
GETINDEX()= _ROW;
|
||||
|
||||
SETINDEX(INDEX)
|
||||
{
|
||||
if (INDEX <= _ROW)
|
||||
{ WRITETITLE() };
|
||||
|
||||
while (INDEX > _ROW)
|
||||
{ WRITECALLINE() }
|
||||
}
|
||||
|
||||
NEWINDEX(OFFS)
|
||||
{
|
||||
^ _ROW + OFFS
|
||||
}
|
||||
|
||||
GETLENGTH() { ^ 7 }
|
||||
|
||||
GETVALUE() = self;
|
||||
};
|
||||
|
||||
PRINTTITLETO(OUTPUT)
|
||||
{
|
||||
WRITEPADDING(OUTPUT, MONTHNAMES[_MONTH - 1], $32, 21)
|
||||
}
|
||||
|
||||
PRINTTO(OUTPUT)
|
||||
{
|
||||
WRITE(OUTPUT, *_LINE)
|
||||
}
|
||||
}
|
||||
|
||||
CALENDARCLASS
|
||||
{
|
||||
_YEAR;
|
||||
_ROWLENGTH;
|
||||
|
||||
constructor NEW(YEAR)
|
||||
{
|
||||
_YEAR := YEAR;
|
||||
_ROWLENGTH := 3
|
||||
}
|
||||
|
||||
PRINTTO(OUTPUT)
|
||||
{
|
||||
WRITEPADDING(OUTPUT, "[SNOOPY]", $32, _ROWLENGTH * 25);
|
||||
WRITELINE(OUTPUT);
|
||||
WRITEPADDING(OUTPUT, _YEAR.toPrintable(), $32, _ROWLENGTH * 25);
|
||||
WRITELINE(OUTPUT); WRITELINE(OUTPUT);
|
||||
|
||||
var ROWCOUNT := 12 / _ROWLENGTH;
|
||||
var MONTHS := POPULATE(ALLOCATE(ROWCOUNT), (I =>
|
||||
POPULATE(ALLOCATE(_ROWLENGTH), (J =>
|
||||
CALENDARMONTHPRINTER.NEW(_YEAR, I * _ROWLENGTH + J + 1)))));
|
||||
|
||||
FOREACH(MONTHS, (ROW)
|
||||
{
|
||||
FOREACH(ROW, (MONTH)
|
||||
{
|
||||
MONTH.PRINTTITLETO(OUTPUT);
|
||||
|
||||
WRITE(OUTPUT, " ")
|
||||
});
|
||||
|
||||
WRITELINE(OUTPUT);
|
||||
|
||||
FOREACH(PARALLELENUMERATOR(ROW), (LINE)
|
||||
{
|
||||
FOREACH(LINE, (PRINTER)
|
||||
{
|
||||
PRINTER.PRINTTO(OUTPUT);
|
||||
|
||||
WRITE(OUTPUT, " ")
|
||||
});
|
||||
|
||||
WRITELINE(OUTPUT);
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// --- PROGRAM ---
|
||||
|
||||
PROGRAM()
|
||||
{
|
||||
CALENDARCLASS CALENDER := CALENDARCLASS.NEW(READINT("ENTER THE YEAR:"));
|
||||
|
||||
CALENDER.PRINTTO(CONSOLE);
|
||||
|
||||
READCHAR();
|
||||
}
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
import system'text;
|
||||
import system'routines;
|
||||
import system'calendar;
|
||||
import extensions;
|
||||
import extensions'routines;
|
||||
|
||||
const MonthNames = new string[]{"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"};
|
||||
const DayNames = new string[]{"MO", "TU", "WE", "TH", "FR", "SA", "SU"};
|
||||
|
||||
class CalendarMonthPrinter
|
||||
{
|
||||
Date _date;
|
||||
TextBuilder _line;
|
||||
int _month;
|
||||
int _year;
|
||||
Reference<int> _row;
|
||||
|
||||
constructor(year, month)
|
||||
{
|
||||
_month := month;
|
||||
_year := year;
|
||||
_line := new TextBuilder();
|
||||
_row := 0;
|
||||
}
|
||||
|
||||
writeTitle()
|
||||
{
|
||||
_row.Value := 0;
|
||||
_date := Date.new(_year, _month, 1);
|
||||
|
||||
DayNames.forEach::(name)
|
||||
{ _line.print(" ",name) }
|
||||
}
|
||||
|
||||
writeLine()
|
||||
{
|
||||
_line.clear();
|
||||
|
||||
if (_date.Month == _month)
|
||||
{
|
||||
var dw := _date.DayOfWeek;
|
||||
|
||||
_line.writeCopies(" ",_date.DayOfWeek == 0 ? 6 : (_date.DayOfWeek - 1));
|
||||
|
||||
do
|
||||
{
|
||||
_line.writePaddingLeft(_date.Day.toPrintable(), $32, 3);
|
||||
|
||||
_date := _date.addDays(1)
|
||||
}
|
||||
until(_date.Month != _month || _date.DayOfWeek == 1)
|
||||
};
|
||||
|
||||
int length := _line.Length;
|
||||
if (length < 21)
|
||||
{ _line.writeCopies(" ", 21 - length) };
|
||||
|
||||
_row.append(1)
|
||||
}
|
||||
|
||||
indexer() = new Indexer
|
||||
{
|
||||
bool Available = _row < 7;
|
||||
|
||||
int Index
|
||||
{
|
||||
get() = _row.Value;
|
||||
|
||||
set(int index)
|
||||
{
|
||||
if (index <= _row)
|
||||
{ self.writeTitle() };
|
||||
|
||||
while (index > _row)
|
||||
{ self.writeLine() }
|
||||
}
|
||||
}
|
||||
|
||||
appendIndex(int index)
|
||||
{
|
||||
this self.Index := _row.Value + index
|
||||
}
|
||||
|
||||
get int Length() { ^ 7 }
|
||||
|
||||
get Value() = self;
|
||||
|
||||
set Value(o) { NotSupportedException.raise() }
|
||||
};
|
||||
|
||||
printTitleTo(output)
|
||||
{
|
||||
output.writePadding(MonthNames[_month - 1], $32, 21)
|
||||
}
|
||||
|
||||
printTo(output)
|
||||
{
|
||||
output.write(_line.Value)
|
||||
}
|
||||
}
|
||||
|
||||
class Calendar
|
||||
{
|
||||
int _year;
|
||||
int _rowLength;
|
||||
|
||||
constructor new(int year)
|
||||
{
|
||||
_year := year;
|
||||
_rowLength := 3
|
||||
}
|
||||
|
||||
printTo(output)
|
||||
{
|
||||
output.writePadding("[SNOOPY]", $32, _rowLength * 25);
|
||||
output.writeLine();
|
||||
output.writePadding(_year.toPrintable(), $32, _rowLength * 25);
|
||||
output.writeLine().writeLine();
|
||||
|
||||
var rowCount := 12 / _rowLength;
|
||||
var months := Array.allocate(rowCount).populate::(i =>
|
||||
Array.allocate(_rowLength)
|
||||
.populate::(j =>
|
||||
new CalendarMonthPrinter(_year, i * _rowLength + j + 1)));
|
||||
|
||||
months.forEach::(row)
|
||||
{
|
||||
var r := row;
|
||||
|
||||
row.forEach::(month)
|
||||
{
|
||||
month.printTitleTo(output);
|
||||
|
||||
output.write(" ")
|
||||
};
|
||||
|
||||
output.writeLine();
|
||||
|
||||
ParallelEnumerator.new(row).forEach::(line)
|
||||
{
|
||||
line.forEach::(printer)
|
||||
{
|
||||
printer.printTo(output);
|
||||
|
||||
output.write(" ")
|
||||
};
|
||||
|
||||
output.writeLine()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public program()
|
||||
{
|
||||
var calender := Calendar.new(console.write("ENTER THE YEAR:").readLine().toInt());
|
||||
|
||||
calender.printTo(console);
|
||||
|
||||
console.readChar()
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
Red [ "PRINT CALENDAR IN SIX MONTHS ACROSS AND FOR TWO ROWS - HINJO, 20 JULY 2025" ]
|
||||
|
||||
MONTHS: SYSTEM/LOCALE/MONTHS
|
||||
|
||||
; GET DAY FROM YEAR, MONTH, WEEK, AND WEEKDAY!
|
||||
GETDAY: FUNCTION [Y[INTEGER!] M[INTEGER!] W[INTEGER!] WD[INTEGER!]] [
|
||||
FD: TO-DATE REDUCE [1 M Y] ; FIRST DAY!
|
||||
SWD: FD/WEEKDAY + 1 IF SWD > 7 [SWD: 1] ; SHIFT FROM MON=1 TO SUN=1
|
||||
OFS: (W - 1) * 7 + (WD - SWD) ; OFFSET
|
||||
D: FD + OFS ; DATE
|
||||
EITHER D/MONTH = M [D/DAY][0] ; RETURN DAY OR ZERO!
|
||||
]
|
||||
|
||||
; CENTER STRING
|
||||
CENTR: FUNCTION [STR WID] [
|
||||
GAP: WID - LENGTH? STR
|
||||
LPAD: TO-INTEGER GAP / 2
|
||||
PAD/LEFT STR WID - LPAD
|
||||
PAD STR WID
|
||||
]
|
||||
|
||||
EITHER "" = Y: ASK "YEAR (ENTER FOR CURRENT): " [Y: NOW/YEAR][Y: TO-INTEGER Y]
|
||||
|
||||
PRINT CENTR "[ S N O O P Y ]" 130 ; PRINT SNOOPY BLOCK CENTERED
|
||||
PRINT CENTR TO-STRING Y 130 ; PRINT YEAR
|
||||
|
||||
FOREACH R [[1 2 3 4 5 6][7 8 9 10 11 12]] [
|
||||
; PRINT MONTH'S NAME
|
||||
FOREACH M R [
|
||||
PRIN REJOIN [CENTR UPPERCASE MONTHS/:M 21 " "]
|
||||
] PRINT ""
|
||||
|
||||
; PRINT FOR EACH WEEK ACROSS MONTHS
|
||||
FOREACH W [0 1 2 3 4 5 6] [
|
||||
; EACH MONTHS
|
||||
FOREACH M R [
|
||||
EITHER W = 0 [ ; PRINT WEEKDAYS
|
||||
FOREACH D ["SU" "MO" "TU" "WE" "TH" "FR" "SA"]
|
||||
[PRIN [FORM PAD D 3]]
|
||||
] [
|
||||
FOREACH WD [1 2 3 4 5 6 7] [ ; PRINT DATES
|
||||
; RECONSTRUCT THE DAY
|
||||
EITHER 0 < DT: GETDAY Y M W WD [
|
||||
PRIN [FORM PAD/LEFT DT 2]
|
||||
] [
|
||||
PRIN " "
|
||||
] PRIN " "
|
||||
]
|
||||
] PRIN " "
|
||||
] PRINT ""
|
||||
] PRINT ""
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue