Nederlandstalige pagina.
De opgaven zijn hier te downloaden.
Voor het geval deze niet langer beschikbaar zijn, kun je ze hier lokaal vinden
Opdrachten A1 tot en met A5 staan hieronder uitgewerkt.
Opdrachten B1 tot en met B4 zijn niet langer beschikbaar.
Opdrachten C1 en C2 zijn knap lastige opdrachten die over p-adische getallen gaan. Daar wagen we een poging aan.
Opgave D is het competitieprogramma van dat jaar, te weten Sudoku. (Zie PLB2 special om te lezen dat we dat nog moeten maken) Het programma om de competitie te runnen of om dit programma te testen is volgens mij niet langer beschikbaar, want dat is nu het programma voor BOX. (Zie Codecup special voor BOX).
Het inkomertje.
Meta [
file: "infolym-2023-2024-a1.meta"
]
let options binary! 4
number: to WHOLE! input "Geef aantal tekens van de invoer: "
string: input "Geef een string met alleen ZNOW : "
Z: N: O: W: TO WHOLE! 0
for index NUMBER [
S: COPY CUT AT STRING INDEX 1
ANY [IF "Z" = S [INCREMENT Z]
IF "N" = S [INCREMENT N]
IF "O" = S [INCREMENT O]
IF "W" = S [INCREMENT W]
]
]
;write/line Z
;write/line N
;write/line O
;write/line W
WRITE/LINE (ABSOLUTE ( Z - N )) + ABSOLUTE ( W - O )
BYE
Nog een makkelijke. Gelukkig is de invoer maximaal 255 tekens, precies wat Meta aan kan.
Meta [
file: "infolym-2023-2024-a2.meta"
]
let occurs binary! 256
change/repeat occurs 0 256
alphabet= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
write {A2 - Letterteller.
Geef de invoer: }
string: ""
string: read/line
while 0 < count string [
S: COPY CUT STRING 1
ascii: first-of S
poke occurs ascii 1 + pick occurs ascii
ADVANCE STRING
]
;for i [65 90] [
; write copy cut at alphabet (i - 64) 1 write "occurs[" write i write "]= " write/line pick occurs i
;]
solution: ""
max-number: 0
for index [65 90] [
this: pick occurs index
;write "index: " write index write " max:" write max-number write " this:" write this write " " write/line solution
if this >= max-number [
either this = max-number [
solution: join/with solution copy cut at alphabet (index - 64) 1
][
solution: copy cut at alphabet (index - 64) 1
max-number: this
]
]
]
WRITE/LINE solution
BYE
Meta [
file: "infolym-2023-2024-a3.meta"
]
talstelsel= "0123456789abcdefghijklmnopqrstuvwxyz"
write/line count talstelsel
write/line "Talstelsels."
write/line "Geef de invoer:"
write/line "Grondtal van bron (B) in 10tallig, Getal G in grondtal B, Grondtal doel (D) in 10tallig."
B: to whole! read/line
G: to string! read/line
D: to whole! read/line
;write "B:" write B write " G:" write G write " D:" write/line D
dec: 0
while 0 < count G [
S: COPY CUT G 1
cnt: count FIND talstelsel S
num: 36 - cnt
;write "S:" write S write " cnt:" write cnt write " num:" write/line num
dec: dec * B + num
ADVANCE G
]
;write "dec: " write/line dec
re: 1
solution: ""
while dec > 0 [
re: remainder dec D
dec: divide dec d
;write "dec: " write dec write " re: " write/line re
solution: join/with to string! copy cut at talstelsel (re + 1) 1 solution
]
WRITE/LINE solution
BYE
Meta [
file: "infolym-2023-2024-a4.meta"
]
let occurs binary! 1000000
change/repeat occurs 0 1000000
write {A4 - De nacht van het nijlpaard.
Geef de invoer: }
string: ""
N: to whole! read/line
K: to whole! read/line
P: 0
min-positie: 1000000
max-positie: 0
repeat N [
P: to whole! read/line
poke occurs P 1
if P < min-positie [min-positie: P]
if P > max-positie [max-positie: P]
]
laatste-positie: min-positie
aantal-nijlpaarden: 1
for index [min-positie max-positie] [
actief: pick occurs index
if actief = 1 [
if index >= (laatste-positie + K) [
increment aantal-nijlpaarden
laatste-positie: index
]
]
]
WRITE/LINE aantal-nijlpaarden
BYE
Deze opgave draait om door krijgen van wat je moet berekenen
Meta [
file: "infolym-2023-2024-a5.meta"
]
write/line {
A5 - Lasersnijder.
Geef de invoer:
Getal N (maat NxN), Programma A linkerbenedenhoek, Programma B rechterbovenhoek.
0 is naar rechts, 1 is naar beneden.
}
N: to whole! read/line
programma-a: to string! read/line
programma-b: to string! read/line
max-zijde: 0
tel-zijde: 0
for index 2 * N [
A: to whole! COPY CUT programma-a 1
B: to whole! COPY CUT programma-b 1
If A != B [
either A > B [
increment tel-zijde
if tel-zijde > max-zijde [max-zijde: tel-zijde]
][
decrement tel-zijde
]
]
ADVANCE programma-a
advance programma-b
]
WRITE/LINE max-zijde
BYE
P-adisch. De oplossing ligt nog in stukken op het bureaublad. Het skelet van het programma geef ik hier alvast.
Meta [
file: "infolym-2023-2024-c1.meta"
]
write/line {
C1 - Breuk naar P-adisch getal.
Geef de invoer:
Getal G (Grondtal 2-36), T (Teller +/-), N (Noemer > 0), ggd(T, N)=1.
}
G: to whole! read/line
T: to whole64! read/line
N: to whole64! read/line
WRITE r WRITE "|" WRITE/LINE v
BYE
Meta [
Title: "Padic conversion"
file: padic.meta
description: {Converteer een rationaal getal naar de
bijbehorende p-adische representatie
Voorbeeldwaarden: precisie= 7, priemgetal= 5,
teller: 5, noemer: 3
Uitkomst is 3 1 3 1 3 2 0
Gevolgd algoritme is
;Let a/b be a rational number, let p be a prime, and let k = 0, 1, 2 ... p - 1.
;
;Step 1. For all k, compute a2 = (a/b - k)*(b/p) ...
; 1st term is the k for which a2 is an integer.
;
;Step 2. For all k, compute a3 = (a2/b - k)*(b/p) ...
; 2nd term is the k for which a3 is an integer.
;
;Step X. ... Xth term is the k for which aX is an integer....
}
]
; Initialisatie
precisie= 7
priemgetal= 5
teller: 5
noemer: 3
let cijfers binary! precisie
change/repeat cijfers 0 precisie
tel: teller
randwaarde: power 10 negate 8
float-noemer-over-priem: divide to floater! noemer priemgetal
for index precisie [
k: 0
cijfer-gevonden?: false
float-telover-noemer: divide to floater! tel noemer
until (
waarde: (float-telover-noemer - k) * float-noemer-over-priem
integer-waarde: either is-negative waarde [to whole! (-0.5 + waarde)]
[to whole! (0.5 + waarde)]
if randwaarde > ABSOLUTE (waarde - integer-waarde) [
cijfer-gevonden?: TRUE
poke cijfers index k
]
increment k
any [
k >= priemgetal
cijfer-gevonden?
]
)[]
either cijfer-gevonden? [
tel: waarde
][
write "Geen passend cijfer gevonden!" write/line k
]
]
for index [precisie 1][
WRITE pick cijfers index write " "
]
write/line ""
bye
De andere kant op. ChatGPT komt een heel eind in Python maar bij testen blijken de resultaten toch licht af te wijken van de opgegeven voorbeelden.
Al deze programma's kun je (in Linux) compileren met (delen van) het volgende script.
# Informatica Olympiade 2023-2024
# Opgave A1
# Roomba misplaatst na opdracht
cd ../..
./run scripts/infolymp/infolym-2324-a1.meta
cp program.com scripts/infolymp/2324/a1
cd scripts/infolymp/infolymp/2324
./a1
#
# Opgave A2
# Letterteller
cd ../..
./run scripts/infolymp/infolym-2324-a2.meta
cp program.com scripts/infolymp/2324/a2
cd scripts/infolymp/infolymp/2324
./a2
# Opgave A3
# Talstelsels
cd ../..
./run scripts/infolymp/infolym-2324-a3.meta
cp program.com scripts/infolymp/2324/a3
cd scripts/infolymp/infolymp/2324
./a3
# Opgave A4
# Nacht van het nijlpaard
cd ../..
./run scripts/infolymp/infolym-2324-a4.meta
cp program.com scripts/infolymp/2324/a4
cd scripts/infolymp/infolymp/2324
./a4
# Opgave A4
# Lasersnijder
cd ../..
./run scripts/infolymp/infolym-2324-a5.meta
cp program.com scripts/infolymp/2324/a5
cd scripts/infolymp/infolymp/2324
./a5