diff --git a/README.md b/README.md index a4b6575..6fad957 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # PPJ -This branch contains the solution for the **nth task**. +This branch contains the solution for the **5th task**. -[Go back to main](/femsci/ppj/src/branch/nya) +[Go back to main](/femsci/ppj/src/branch/nya) \ No newline at end of file diff --git a/dev/meowmeow/Kitku.java b/dev/meowmeow/Kitku.java new file mode 100644 index 0000000..bf4e6ff --- /dev/null +++ b/dev/meowmeow/Kitku.java @@ -0,0 +1,31 @@ +/* + * TASK 5 + * archived at https://git.femboy.science/femsci/ppj/src/branch/task/5 + * by femsci + */ + +package dev.meowmeow; + +public class Kitku { + + public static void main(String[] args) { + // let's play with silly datestamps and serialization + // 2127 + 10 + + LimitedDate from = new LimitedDate(3, 2, 2000), + to = new LimitedDate(29, 11, 2127); + + System.out.printf("**Original**\n%s -> %s\n\n", from, to); + + // for more explicitness let's stress test the system by redundant serde ops + int spanRaw = new LimitedDateSpan(from, to).rawSpan(); + + LimitedDateSpan theActualSpanAbstraction = new LimitedDateSpan(spanRaw); + + // here we perform the another batch of deserialization operations :3 + LimitedDate fromde = theActualSpanAbstraction.dateFrom(), + tode = theActualSpanAbstraction.dateTo(); + + System.out.printf("**Reconstructed**\n%s -> %s\n", fromde, tode); + } +} diff --git a/dev/meowmeow/LimitedDate.java b/dev/meowmeow/LimitedDate.java new file mode 100644 index 0000000..8fa1362 --- /dev/null +++ b/dev/meowmeow/LimitedDate.java @@ -0,0 +1,51 @@ +/* + * TASK 5 + * archived at https://git.femboy.science/femsci/ppj/src/branch/task/5 + * by femsci + */ + +package dev.meowmeow; + +public class LimitedDate { + public LimitedDate(int day, int month, int year) { + if (year < 2000 || year > 2127) { + throw new IllegalArgumentException("year must be within [2000..2127]"); + } + + if (month < 1 || month > 12) { + throw new IllegalArgumentException("month must be within [1..12]"); + } + + if (day < 1 || day > 31) { + throw new IllegalArgumentException("day must be within [1..31]"); + } + this.day = day; + this.month = month; + this.year = year; + } + + private final int day, month, year; + + @Override + public String toString() { + return String.format("%02d.%02d.%04d", day, month, year); + } + + /* + * the structure (sadly java does not support unsigned integers): + * | octet 1 .| octet 2. | + * | 01234567 | 89abcdef | + * | Yyyyyyym | mmmddddd | + */ + public short toSillyDatestamp() { + int yr = year - 2000; + return (short) ((yr << 9) | (month << 5) | (day)); + } + + public static LimitedDate fromSillyDatestamp(short datestamp) { + int day = datestamp & 0x1f; + int month = (datestamp >> 5) & 0xf; + int year = (datestamp >> 9) & 0x7f; + return new LimitedDate(day, month, year + 2000); + } +} diff --git a/dev/meowmeow/LimitedDateSpan.java b/dev/meowmeow/LimitedDateSpan.java new file mode 100644 index 0000000..feff8dd --- /dev/null +++ b/dev/meowmeow/LimitedDateSpan.java @@ -0,0 +1,44 @@ +/* + * TASK 5 + * archived at https://git.femboy.science/femsci/ppj/src/branch/task/5 + * by femsci + */ + +package dev.meowmeow; + +public class LimitedDateSpan { + + // we still don't account for the transitions and abominable human-made + // exceptions + public LimitedDateSpan(LimitedDate from, LimitedDate to) { + this(from.toSillyDatestamp(), to.toSillyDatestamp()); + } + + LimitedDateSpan(short rawFrom, short rawTo) { + this((rawFrom << 16) | Short.toUnsignedInt(rawTo)); + } + + LimitedDateSpan(int raw) { + this.serializedData = raw; + } + + // let's pretend that we need some weird optimization scheme, despite GC being + // finally smart enough + + private final int serializedData; + + public LimitedDate dateFrom() { + return LimitedDate.fromSillyDatestamp((short) ((serializedData >> 16) & 0xffff)); + } + + public LimitedDate dateTo() { + return LimitedDate.fromSillyDatestamp((short) (serializedData & 0xffff)); + } + + int rawSpan() { + return serializedData; + } + + // span calc methods etc... + // years(), days()... +}