Data update

This commit is contained in:
Ingy döt Net 2025-08-11 18:05:26 -07:00
parent 4d5544505c
commit 4924dd0264
3073 changed files with 55820 additions and 4408 deletions

View file

@ -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"};

View file

@ -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();
}

View file

@ -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()
}

View file

@ -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 ""
]