commit 70547a43d57539ef691b20c928733244d8a2d850
parent 4f13c7c5f3018c9a2e923eded8e2027ee1863d4b
Author: Metalympiáda <metalympiada@matfyz.cz>
Date: Wed, 26 Jun 2024 01:51:20 +0200
Finish the round 1
Diffstat:
4 files changed, 170 insertions(+), 18 deletions(-)
diff --git a/archive/1/problems b/archive/1/problems
@@ -0,0 +1,23 @@
+Ivana ovládol prúd nekontrolovateľnej zúrivosti na autorov Metalympiády, pretože sa oneskorilo zverejnenie zadania ďalšieho kola. Autori už zažili aj príjemnejšiu situáciu ako túto. Vzhľadom na obavy z jej ďalšej eskalácie a z Ivanovej kolekcie raketometov mu radšej obratom zvestovali radu:`V ďalšom kole budú opäť existovať správne odpovede na úlohy Metalympiády. Uff... a číselné odpovede na úlohy s prvočíselným poradovým čilsom budú prvočísla...'
+Na to Ivan odvetil:`To mi je na milú Jarmilu, vy oplanci sopľaví!'
+Nuž teda autori boli nútení ďalej napovedať. `Riešením prvej úlohy bude počet riešiteľových číselných odpovedí na toto kolo Metalympiády s párnou hodnotou.'
+`Nateraz vám odpúšťam. Trúby...'
+~Boris cestoval vlakom, kde sa mu zjavil boh. Poprosil boha o zdelenie tajomstva vesmíru, v ktorom sa nachádza a boh naňho prehovoril.
+`Toto je (2, 3, 1).'
+Borisovi bolo ihneď jasné, že pre túto úlohu mu zdelené poznanie nebude relevantné a poslal boha k čertom. Povzdychol si. `Ach, keby mi bol radšej povedal súčet číselných odpovedí na úlohy tohto kola Metalympiády!'
+Aké je hodnota čísla, ktoré by sa Boris radšej dozvedel od boha?
+~Vladislav sa dozvedel správne odpovede na úlohy predošlého kola Metalypiády. Nadšene, s vidinou výhry v očiach sa ich chystal odoslať ako odpovede pre toto kolo Metalympiády. Na jeho šťastie ho zahriakol Ivan. `Zadrž, ty kikimor! Veď tieto zadania sú iné textové reťazce ako minule a budú mať iné rozlúštenie. Ako máš zaručené, že množiny správnych odpovedí na ne majú čo i len prienik s minulými správnymi odpoveďami?'
+Poraďte Vladislavovi poradové číslo úlohy, kde je tento prienik neprázdny.
+~Vladislav chce udržiavať krok s digitálnou transformáciou spoločnosti a preto sa rozhodol, že sa naučí programovať. V praxi používané programovacie jazyky mu ale pripadali príliš zložité, tak si vzal kus kremeňa a vypálil doň vlastný procesor VLAD 2000.
+Má len 2 registre, A a B, ktoré vedia uchovať ľubovoľný počet znakov a vypísať ich na výstup.
+Tiež preň fungujú len 2 inštrukcie: malé písmeno zapíše nasledovný reťazec ohraničený z oboch strán znakom ' alebo zo začiatku *" a z konca "* do príslušného registra a veľké písmeno vypíše obsah tohto registra. Teda napr. program a'meta'b*"vl'ad"*AB vypíše metavl'ad.
+Napíšte program pre VLAD 2000 dlhý aspoň 1 znak, ktorý vypíše svoj zdrojový kód.
+~Jolana si prečítala zadania zvyšných úloh a rozhodla sa, že sa tiež zapojí do ich tvorby. Vymyslela nasledovnú:"Uveďte poradové číslo úlohy, zo zadania ktorej vyplýva riešenie tejto úlohy."
+Vyriešte Jolaninu úlohu.
+~(4, 6, 1)(3, 2, 13)(2, 4, 8)(4, 1, 5)(8, 2, 8)(6, 1, 6)(2, 6, 12)(3, 1, 9)(3, 2, 16)(3, 5, 14)(1, 3, 5)(3, 5, 3)
+~Boris vyvinul revolučnú umelú inteligenciu MetatronGPT postavenú na blockchaine, ktorá vie rozhodovať o pravdivosti slovenských viet. Nie vždy rozozná pravdivú vetu, ale vždy, keď nejakú vetu rozozná ako pravdivú, je takou naozaj.
+Napíšte pravdivú vetu, ktorú MetatronGPT nerozozná ako pravdivú.
+~Vladislav si kúpil lístok na prehliadku trikov slávneho kúzelníka Metapokustóna. Vystúpenie sa Metapokustón rozhodol začať svojim slávnym číslom s hypnotizovaním leva.
+Metapokustón doviezol klietku s levom a otvoril ju. Lev vyskočil vonku a zakúsol sa kúzelníkovi do ľavej ruky. Kúzelník začal kričať a dav začal tlieskať.
+Lev začal Metapokustóna hádzať po zemi, zatiaľ čo kričal:`Pomóc! Toto nie je show! Som vážne zranený! Je to hrozná bolesť! Prosím, pomôžte mi niekto!' Nakoniec kúzelníka lev celého zožral.
+Vladislav bol trikom veľmi ohromený, ale stále nemohol prísť na to, v čom trik spočíval. Vie však, že kúzelníci svoje tajomstvá nikdy neprezrádzajú.
diff --git a/archive/1/solutions b/archive/1/solutions
@@ -0,0 +1,8 @@
+Počet vašich odpovedí s párnou hodnotou (vrátane tejto odpovede).
+~Pre riešenie x musí platiť Σ + x = x, kde Σ je súčet číselných odpovedí na zvyšné úlohy Metalympiády. Špeciálne musí byť Σ rovné 0 a odpoveď konzistentná s úlohou 1 (teda napr. x prvočíslo).
+~Môže ísť o úlohy 1, 3 alebo 8. Keďže podľa zadania 1 musí ísť o prvočíslo, ostáva možnosť 3.
+~Takýto program je napr. a*"*b'a*"'BAb'"'BA"*b'a*"'BAb'"'BA
+~Riešenie tejto úlohy vyplýva z jej zadania. Odpoveďou je 5.
+~Trojice predstavujú poradové čísla úlohy tohto kola Metalymiády, vety v ňom a slova v nej. Po rozlúštení dostávame "Napíšte pre úlohu s číslom 6 tohto kola Metalympiády rozlúštenie jej zadania", čo je jej riešením. (Slovo (6, 1, 6) odkazuje samo na seba a musí byť doplnené tak, aby zadanie dávalo zmysel, teda ako 6.)
+~Napr. "Túto vetu MetatronGPT nerozozná ako pravdivú".
+~Správna odpoveď je ľubovoľná. Aby ale existovalo riešenie úlohy dva, musí ísť o mínus súčet všetkých číselných odpovedí, až na odpovede na úlohy 2 a 8.
diff --git a/metatron13.scm b/metatron13.scm
@@ -1,4 +1,5 @@
-(use-modules (db))
+(use-modules (db)
+ (srfi srfi-1))
(define (preprocess answer)
(string-delete #\. (string-downcase answer)))
@@ -41,14 +42,16 @@
(equal? s "desat")
(equal? s "deset"))
10)
- (else 0)))
+ ((equal? s "nula")
+ 0)
+ (else #f)))
(define (str->number s)
(let ((decimal (string->number s)))
(if decimal decimal (slovakoczech->number s))))
(define (count-decimal-digits n)
- (if (eq? n 0)
+ (if (or (not n) (eq? n 0))
0
(+ 1 (count-decimal-digits (quotient n 10)))))
@@ -56,7 +59,7 @@
(let* ((results (map (lambda (i) 0.0) (iota (length a))))
(answers (map preprocess a))
(numerical (map str->number answers))
- (sum (apply + numerical)))
+ (sum (apply + (map (lambda (n) (if n n 0)) numerical))))
(begin
(if (eq? (modulo (count-decimal-digits (list-ref numerical 0)) 2) 1)
(list-set! results 0 1.0))
@@ -73,10 +76,10 @@
(if (eq? (list-ref numerical 4) 1)
(list-set! results 4 1.0))
(if (or (eq? (list-ref numerical 5) 1)
- (equal? (list-ref answers 2) "jednociferné")
- (equal? (list-ref answers 2) "jednociferne"))
+ (equal? (list-ref answers 5) "jednociferné")
+ (equal? (list-ref answers 5) "jednociferne"))
(list-set! results 5 1.0))
- (if (eq? (list-ref numerical 6) (* 2 (apply + numerical)))
+ (if (eq? (list-ref numerical 6) (* 2 sum))
(list-set! results 6 1.0))
(if (eq? (list-ref numerical 7) 10)
(list-set! results 7 1.0))
@@ -86,6 +89,122 @@
(list-set! results 9 1.0))
results)))
+(define (string-get str i)
+ (if (< i (string-length str))
+ (string-ref str i)
+ #f))
+
+(define (substr str i)
+ (if (< i (string-length str))
+ (substring/read-only str i)
+ ""))
+
+(define (string-find-iter s t i)
+ (if (< i (string-length s))
+ (if (string-prefix? t (substring/read-only s i))
+ i
+ (string-find-iter s t (+ i 1)))
+ #f))
+
+(define (string-find s t)
+ (string-find-iter s t 0))
+
+(define (vlad2000-iter input i a b output)
+ (let ((c (string-get input i))
+ (str-lit (lambda (input i)
+ (let ((end (cond ((eq? (string-get input i) #\')
+ (list (string-index (substr input (+ i 1))
+ #\')
+ 1))
+ ((and (eq? (string-get input i) #\*)
+ (eq? (string-get input (+ i 1)) #\"))
+ (list (string-find (substr input (+ i 2))
+ "\"*")
+ 2))
+ ((list #f 0)))))
+ (if (car end)
+ (list (+ i (car end) (* 2 (cadr end)))
+ (substring input
+ (+ i (cadr end))
+ (+ i (cadr end) (car end))))
+ #f)))))
+ (if (< i (string-length input))
+ (cond ((eq? c #\a)
+ (let ((lit (str-lit input (+ i 1))))
+ (if lit
+ (vlad2000-iter input (car lit) (cadr lit) b output)
+ #f)))
+ ((eq? c #\b)
+ (let ((lit (str-lit input (+ i 1))))
+ (if lit
+ (vlad2000-iter input (car lit) a (cadr lit) output)
+ #f)))
+ ((eq? c #\A)
+ (vlad2000-iter input (+ i 1) a b (string-append output a)))
+ ((eq? c #\B)
+ (vlad2000-iter input (+ i 1) a b (string-append output b)))
+ (#f))
+ output)))
+
+(define (vlad2000 input)
+ (vlad2000-iter input 0 "" "" ""))
+
+(define (in-list? answer l)
+ (fold (lambda (a v) (or v (equal? a answer))) #f l))
+
+(define answers-1-6
+ (list "napíšte pre úlohu s číslom šesť tohto kola metalympiády rozlúštenie jej zadania"
+ "napíšte pre úlohu s číslom 6 tohto kola metalympiády rozlúštenie jej zadania"
+ "napíšte pre úlohu s číslom 6 tohoto kola metalympiády rozluštěnie jej zadania"))
+
+(define answer-1-6-half "napište pre úlohu s číslom (6, 1, 6) tohto kola metalympiády rozlúštenie jej zadania")
+
+(define answers-1-7
+ (list "metatrongpt neoznačí túto vetu za pravdivú"
+ "metatrongpt nerozozná túto vetu ako pravdivú"
+ "metatrongpt nerozozná tuto vetu ako pravdivú"
+ "metatrongpt túto vetu nerozozná ako pravdivú"
+ "túto vetu metatrongpt nerozozná ako pravdivú"
+ "tuto vetu metatrongpt nerozozná ako pravdivú"
+ "tuto pravdivú vetu metatrongpt nerozozná ako pravdivú"
+ "tato veta bude vyhodnocena podle umelé iteligencie metatrongpt jako veta nepravdiva"))
+
+(define (eval-round1 a)
+ (let* ((results (map (lambda (i) 0.0) (iota (length a))))
+ (answers (map preprocess a))
+ (numerical (map str->number answers))
+ (even-count (apply + (map (lambda (n) (if n (modulo (+ n 1) 2) 0))
+ numerical)))
+ (sum (apply + (map (lambda (n) (if n n 0)) numerical))))
+ (begin
+ (if (eq? (list-ref numerical 0) even-count)
+ (list-set! results 0 1.0))
+ (if (eq? (list-ref numerical 1) sum)
+ ; primality test
+ (if (or (eq? (list-ref numerical 1) 2)
+ (eq? (list-ref numerical 1) 3)
+ (eq? (list-ref numerical 1) 5))
+ (list-set! results 1 1.0)
+ (list-set! results 1 0.5)))
+ (if (eq? (list-ref numerical 2) 3)
+ (list-set! results 2 1.0)
+ (if (or (eq? (list-ref numerical 2) 1)
+ (eq? (list-ref numerical 2) 8))
+ (list-set! results 2 0.5)))
+ (if (and (< 0 (string-length (list-ref a 3)))
+ (equal? (list-ref a 3) (vlad2000 (list-ref a 3))))
+ (list-set! results 3 3.0))
+ (if (eq? (list-ref numerical 4) 5)
+ (list-set! results 4 1.0))
+ (if (in-list? (list-ref answers 5) answers-1-6)
+ (list-set! results 5 1.0)
+ (if (equal? (list-ref answers 5) answer-1-6-half)
+ (list-set! results 5 0.5)))
+ (if (in-list? (list-ref answers 6) answers-1-7)
+ (list-set! results 6 1.0))
+ (list-set! results 7 1.0)
+ results)))
+
(define (eval-user-round user rnd evaluator)
(let ((answers (select-answers-content user rnd)))
(if answers
@@ -95,5 +214,6 @@
(define users (select-all-users))
(for-each (lambda (u) (begin
- (eval-user-round u 0 eval-round0)))
+ (eval-user-round u 0 eval-round0)
+ (eval-user-round u 1 eval-round1)))
users)
diff --git a/routes.scm b/routes.scm
@@ -20,12 +20,12 @@
(define site-name "Metalympiáda")
(define round-name "Domáce kolo 2023/24")
(define deadline "letného slnovratu 2024")
-(define after-deadline #f)
+(define after-deadline #t)
(define announcement (if after-deadline
"Čoskoro pribudnú nové zadania. Deadline bol do "
"Riešenia je možné posielať do "))
-(define current-round 1)
+(define current-round 2)
(define footer
`(footer "Stránka Metalympiády je slobodný softvér pod licenciou AGPL: "
@@ -127,13 +127,14 @@
(strong (@ (class "start")) "Správna odpoveď:")
,solution)
,(if answers
- `(p (@ (class "text"))
- (strong (@ (class "start"))
- "Vaša odpoveď:")
- ,(let* ((a (list-ref answers index))
- (v (vector-ref a 1)))
- `(,(vector-ref a 0)
- (strong (@ (class "start "
+ (let* ((a (list-ref answers index))
+ (v (vector-ref a 1)))
+ `((p (@ (class "text"))
+ (strong (@ (class "start"))
+ "Vaša odpoveď:")
+ ,(vector-ref a 0))
+ (p (@ (class "text"))
+ (strong (@ (class "start "
,(if (> v 0.5)
"good"
"bad")))
@@ -224,7 +225,7 @@
(if (and so-far a) (append so-far (list a)) #f)))
'()
(iota (length problems))))
- (submitted (if answers
+ (submitted (if (and answers (not after-deadline))
(insert-answers answers user round) `(#f "Neplatné odpovede"))))
(render (lambda ()
(problem-page (if (car submitted) #f (cadr submitted)) user)))))