Meta Project

The Unofficial Meta Documentation

Informatica olympiade 2023-2024 NL

Nederlandstalige pagina.

De opgaven

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).

Opgaven A

A1 Misplaatste robot

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

A2 Letterteller

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

A3 Talstelsels

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

A4 De nacht van het nijlpaard

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

A5 Lasersnijder

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

Opgaven C

C1

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

C2

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.


Compileren van deze programma's

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