Add SIN.04028 tutorial material, tutor prompt and conversation log

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 15:11:02 +02:00
co-authored by Claude Opus 5
parent bac80295b7
commit f615bef426
30 changed files with 8123 additions and 0 deletions
@@ -0,0 +1,88 @@
record Message(String type, String value) {}
Map<String, BlockingQueue<Message>> mailboxes =
new ConcurrentHashMap<>();
BlockingQueue<Message> mailbox(String name) {
return mailboxes.computeIfAbsent(
name,
_ -> new LinkedBlockingQueue<>()
);
}
String rot13(String text) {
var result = new StringBuilder();
for (var character : text.toCharArray()) {
if (character >= 'a' && character <= 'z')
character = (char) ('a' + (character - 'a' + 13) % 26);
else if (character >= 'A' && character <= 'Z')
character = (char) ('A' + (character - 'A' + 13) % 26);
result.append(character);
}
return result.toString();
}
void mediate(String from, String to) {
try {
while (true)
mailbox(to).put(mailbox(from).take());
} catch (InterruptedException _) {
Thread.currentThread().interrupt();
}
}
void runConsoleIn() {
try {
while (true) {
var text = IO.readln();
if (text == null)
return;
mailbox("consoleIn.outbox")
.put(new Message("TEXT", text));
}
} catch (InterruptedException _) {
Thread.currentThread().interrupt();
}
}
void runRot13() {
try {
while (true) {
var input = mailbox("rot13.inbox").take();
var output = new Message("TEXT", rot13(input.value()));
mailbox("rot13.outbox").put(output);
}
} catch (InterruptedException _) {
Thread.currentThread().interrupt();
}
}
void runConsoleOut() {
try {
while (true)
IO.println(mailbox("consoleOut.inbox").take().value());
} catch (InterruptedException _) {
Thread.currentThread().interrupt();
}
}
void main() throws InterruptedException {
Thread.ofVirtual().start(this::runConsoleIn);
Thread.ofVirtual().start(this::runRot13);
Thread.ofVirtual().start(this::runConsoleOut);
Thread.ofVirtual().start(
() -> mediate("consoleIn.outbox", "rot13.inbox")
);
Thread.ofVirtual().start(
() -> mediate("rot13.outbox", "consoleOut.inbox")
);
Thread.currentThread().join();
}