From 32fbcf143a03f1b0fb15df76de410f2f5c291707 Mon Sep 17 00:00:00 2001 From: Lephe Date: Sat, 26 Oct 2019 13:51:54 +0200 Subject: [PATCH] more atomic committing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Proper coordinate rounding, as in Arond() * Forgotten EOL now consumed if found (still optional) * Convert unit tests images to 1-bit before comparing * Much better unit testing script * Add 17 test scripts from the 2019 TI-Planet and Planète Casio contest which consisted in reproducing an image with minimum code --- README.md | 2 + fx92/drawing.py | 14 ++--- fx92/parser.py | 5 ++ fx92/util.py | 5 ++ tests.py | 98 ++++++++++++++++++++++++++++------- tests/autovars.out | 1 + tests/autovars.txt | 3 ++ tests/contest2019/.gitignore | 2 + tests/contest2019/0326.png | Bin 0 -> 391 bytes tests/contest2019/0326.txt | 1 + tests/contest2019/1344.png | Bin 0 -> 547 bytes tests/contest2019/1344.txt | 1 + tests/contest2019/1367.png | Bin 0 -> 548 bytes tests/contest2019/1367.txt | 1 + tests/contest2019/1418.png | Bin 0 -> 566 bytes tests/contest2019/1418.txt | 1 + tests/contest2019/1550.txt | 1 + tests/contest2019/1610.txt | 1 + tests/contest2019/1722.txt | 1 + tests/contest2019/1958.png | Bin 0 -> 650 bytes tests/contest2019/1958.txt | 1 + tests/contest2019/2070.png | Bin 0 -> 645 bytes tests/contest2019/2070.txt | 1 + tests/contest2019/2227.png | Bin 0 -> 654 bytes tests/contest2019/2227.txt | 1 + tests/contest2019/2405.png | Bin 0 -> 658 bytes tests/contest2019/2405.txt | 1 + tests/contest2019/2559.png | Bin 0 -> 699 bytes tests/contest2019/2559.txt | 1 + tests/contest2019/2673.png | Bin 0 -> 705 bytes tests/contest2019/2673.txt | 1 + tests/contest2019/2805.png | Bin 0 -> 714 bytes tests/contest2019/2805.txt | 1 + tests/contest2019/3217.png | Bin 0 -> 763 bytes tests/contest2019/3217.txt | 1 + tests/contest2019/3270.png | Bin 0 -> 733 bytes tests/contest2019/3270.txt | 1 + tests/contest2019/m0069.png | Bin 0 -> 251 bytes tests/contest2019/m0069.txt | 1 + 39 files changed, 123 insertions(+), 24 deletions(-) create mode 100644 tests/contest2019/.gitignore create mode 100644 tests/contest2019/0326.png create mode 100644 tests/contest2019/0326.txt create mode 100644 tests/contest2019/1344.png create mode 100644 tests/contest2019/1344.txt create mode 100644 tests/contest2019/1367.png create mode 100644 tests/contest2019/1367.txt create mode 100644 tests/contest2019/1418.png create mode 100644 tests/contest2019/1418.txt create mode 100644 tests/contest2019/1550.txt create mode 100644 tests/contest2019/1610.txt create mode 100644 tests/contest2019/1722.txt create mode 100644 tests/contest2019/1958.png create mode 100644 tests/contest2019/1958.txt create mode 100644 tests/contest2019/2070.png create mode 100644 tests/contest2019/2070.txt create mode 100644 tests/contest2019/2227.png create mode 100644 tests/contest2019/2227.txt create mode 100644 tests/contest2019/2405.png create mode 100644 tests/contest2019/2405.txt create mode 100644 tests/contest2019/2559.png create mode 100644 tests/contest2019/2559.txt create mode 100644 tests/contest2019/2673.png create mode 100644 tests/contest2019/2673.txt create mode 100644 tests/contest2019/2805.png create mode 100644 tests/contest2019/2805.txt create mode 100644 tests/contest2019/3217.png create mode 100644 tests/contest2019/3217.txt create mode 100644 tests/contest2019/3270.png create mode 100644 tests/contest2019/3270.txt create mode 100644 tests/contest2019/m0069.png create mode 100644 tests/contest2019/m0069.txt diff --git a/README.md b/README.md index 7cb2f98..3d39dfe 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ echo -n "F908313200333500" | ./fx92.py -u - * `--save ` will save a screenshot of the output to the designated file. * `--quiet` will "hide" the window while executing. _(At the moment the window is still shown, but closed immediately, due to SDL subtleties.)_ +* `--stream ` will stream window frames as a series of bitmap images to + the specified directory. Use your favorite tool to make a GIF. ## Tests diff --git a/fx92/drawing.py b/fx92/drawing.py index 7048a04..8be972b 100644 --- a/fx92/drawing.py +++ b/fx92/drawing.py @@ -1,6 +1,8 @@ # fx-92 Scientifique Collège+ language interpreter: On-screen drawing from sdl2 import * +from fx92.util import rndcoord + import math import os @@ -88,8 +90,8 @@ class Window: x = self.width // 2 + x - 1 y = self.height // 2 - y - x = int(round(x)) - y = int(round(y)) + x = rndcoord(x) + y = rndcoord(y) SDL_RenderDrawPoint(self.r, x, y) @@ -140,8 +142,8 @@ class Window: self._point(x, y) def line(self, x1, y1, x2, y2, color): - x1, y1, x2, y2 = round(x1), round(y1), round(x2), round(y2) - x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) + x1, y1 = rndcoord(x1), rndcoord(y1) + x2, y2 = rndcoord(x2), rndcoord(y2) self._line(x1, y1, x2, y2, color) def linef(self, x, y, angle, dist, color): @@ -155,8 +157,8 @@ class Window: x2 = x + dist * cos y2 = y + dist * sin - x1, y1, x2, y2 = round(x), round(y), round(x2), round(y2) - x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) + x1, y1 = rndcoord(x), rndcoord(y) + x2, y2 = rndcoord(x2), rndcoord(y2) self._line(x1, y1, x2, y2, color) def wait(self, allow_any=False): diff --git a/fx92/parser.py b/fx92/parser.py index 178a4a6..a678ee1 100644 --- a/fx92/parser.py +++ b/fx92/parser.py @@ -152,6 +152,7 @@ class Parser: self.expect(T.EOL, optional=True) prg = self.program() self.expect(T.REPEAT_END) + self.expect(T.EOL, optional=True) return Node(N.REPEAT, arg, prg) if op.type == T.WHILE: @@ -160,6 +161,7 @@ class Parser: self.expect(T.EOL, optional=True) prg = self.program() self.expect(T.WHILE_END) + self.expect(T.EOL, optional=True) return Node(N.WHILE, cond, prg) if op.type == T.IF: @@ -168,6 +170,7 @@ class Parser: self.expect(T.EOL, optional=True) prg = self.program() self.expect(T.IF_END) + self.expect(T.EOL, optional=True) return Node(N.IF, cond, prg, None) if op.type == T.IFELSE: @@ -176,8 +179,10 @@ class Parser: self.expect(T.EOL, optional=True) p1 = self.program() self.expect(T.ELSE) + self.expect(T.EOL, optional=True) p2 = self.program() self.expect(T.IFELSE_END) + self.expect(T.EOL, optional=True) return Node(N.IF, cond, p1, p2) # arg -> expr PARAM diff --git a/fx92/util.py b/fx92/util.py index 04a6e5a..b02a880 100644 --- a/fx92/util.py +++ b/fx92/util.py @@ -63,3 +63,8 @@ def decimal_repr(x): dg = str(i) dg = dg[0] + "." + dg[1:] + "e" + str(true_exp) return sign + dg + +def rndcoord(x): + halfint = (int(x) != x) and (int(2*x) == 2*x) + sign = -1 if x < 0 else 1 + return int(round(x)) + int(halfint) * sign diff --git a/tests.py b/tests.py index 4674ffe..8de4c54 100755 --- a/tests.py +++ b/tests.py @@ -1,5 +1,6 @@ #! /usr/bin/python3 +import re import sys import glob import os.path @@ -9,60 +10,121 @@ from PIL import Image from PIL import ImageChops def imgequal(ref, out): - ref = Image.open(ref) - out = Image.open(out) + ref = Image.open(ref).convert("1") + out = Image.open(out).convert("1") diff = ImageChops.difference(ref, out) return diff.getbbox() is None -def runtest(program, refout=None, refimg=None): - st = subprocess.run("./fx92.py --quiet --save=/tmp/fx92-test.bmp".split() - + [program], stdout=subprocess.PIPE) +def readable_cmd(cmd): + result = "" + + for arg in cmd: + if " " not in arg and "'" not in arg and '"' not in arg: + a = arg + elif "'" not in arg: + a = "'" + arg + "'" + else: + a = a.replace(" ", "\\ ").replace("'", "\\'").replace('"', '\\"') + + result += " " + arg + + return result.strip() + +def indent(str, n): + return re.subn(r"^", " " * n, str, flags=re.MULTILINE)[0] + +def runtest(program, refout=None, refimg=None, kind="script"): + kind = "-u" if kind == "url" else "-s" + cmd = "./fx92.py --quiet --save=/tmp/fx92-test.bmp".split() \ + + [kind, program] + st = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + # Retrieve standard error + stderr = "" + if st.stderr: + stderr = st.stderr.decode().strip("\n") + stderr = indent(stderr, 4) if st.returncode != 0: - print(" -> Execution FAILED!") - return 0 + print("\x1b[41;1mFAILED\x1b[0m", program) + print(" " + readable_cmd(cmd)) + if stderr: + print(" Standard error:") + print(stderr) + else: + print(" Nothing on standard error") + print("") + return False - print(" Execution completed.") success = True + status = { "out": None, "img": None } if refout is not None: with open(refout, "rb") as fp: refout = fp.read() if st.stdout == refout: - print(" Output is correct.") + status["out"] = True else: - print(" -> Output is incorrect!") - print(" ref:", repr(refout)) - print(" out:", repr(st.stdout)) + status["out"] = (st.stdout, refout) success = False if refimg is not None: if imgequal(refimg, "/tmp/fx92-test.bmp"): - print(" Image is correct.") + status["img"] = True else: - print(" -> Image is incorrect!") + status["img"] = False success = False + if status["out"] is None and status["img"] is None: + print("PASSED", program) + elif success: + print("\x1b[43;1mPASSED\x1b[0m", program) + else: + print("\x1b[41;1mFAILED\x1b[0m", program) + + if status["out"] is None: + print(" (No reference output)") + elif status["out"] == True: + print(" Output is correct.") + else: + print(" Incorrect output, got:") + print(indent(status["out"][0], 4)) + print(" Expected:") + print(indent(status["out"][1], 4)) + + if status["img"] is None: + print(" (No reference image)") + elif status["img"] == True: + print(" Image is correct.") + else: + print(" Image is incorrect!") + + if stderr: + print(" Standard error:") + print(stderr) + + print("") return success def main(): - paths = glob.glob("tests/*.txt") + p1 = glob.glob("tests/*.txt") + p2 = glob.glob("tests/contest2019/*.txt") + paths = sorted(p1) + sorted(p2) print("Found {} tests.".format(len(paths))) total = 0 passed = 0 for t in paths: - print("\n{}:".format(t)) - refout = t[:-4] + ".out" refout = refout if os.path.isfile(refout) else None refimg = t[:-4] + ".png" refimg = refimg if os.path.isfile(refimg) else None - passed += runtest(t, refout=refout, refimg=refimg) + kind = "url" if t.startswith("tests/contest2019/") else "script" + passed += runtest(t, refout=refout, refimg=refimg, kind=kind) total += 1 if passed < total: diff --git a/tests/autovars.out b/tests/autovars.out index 0d3bfce..3b57e88 100644 --- a/tests/autovars.out +++ b/tests/autovars.out @@ -2,3 +2,4 @@ 0 90 160 +150 diff --git a/tests/autovars.txt b/tests/autovars.txt index 6a48f37..1f16e19 100644 --- a/tests/autovars.txt +++ b/tests/autovars.txt @@ -7,3 +7,6 @@ print theta rotate 70 print theta + +rotate 350 +print theta diff --git a/tests/contest2019/.gitignore b/tests/contest2019/.gitignore new file mode 100644 index 0000000..157fb56 --- /dev/null +++ b/tests/contest2019/.gitignore @@ -0,0 +1,2 @@ +# Ignore folder with streams +*/ diff --git a/tests/contest2019/0326.png b/tests/contest2019/0326.png new file mode 100644 index 0000000000000000000000000000000000000000..2b33e04e90818f35c4c2858faaea22d312ba080e GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^2Y^_ggAGV-J$Ez!NO2Z;L>4nJ=qZCRW5rVYGN2%P ziKnkC`(rLCZcz)XPj~kMg(OQ{BTAg}b8}PkN*J7rQWHy3QxwWGOEMJPJ$(bh8~MZ; z7#JBnT^vIyZoR#2$ag3}fH_dC@W1wKzCZ^BL00>^;2^hovH2ouo_Y?N;r$FO3>*vs z3e~gp41s3$H^uNsK7I0uaq?admuu|*7=P(AwEUgK? z3z%-Q9P(#)*v|EYt$GoX^?HU~>YS=axh zB5r%eY25!-htG6(5vX(jps96cq5w#2_P^*x-%nrVV_M=_SFI0xpQ6ad_)1G8M4^G< zzunI5R{P@o8&>iCe`&sh(eL*C+SC3FN)D_{FjqGK{ma0F4nJ=qZCRW5rVYGN2%P ziKnkC`(rLCZa&HTYuPG+LXst}5hc#~xw)x%B@E6*sfi`2DGKG8B^e6tp1uL$jeOz^ z42*LK}fa}Ger~m6`uG5K}C~WYctFbsdbZW`OJ*UqU&sjF7_#dO$ z)2FI4x~BwvG}KMM_OX0!Im?WB`HE`=m#8ptatKsuZJG1TGX3HH2iLs?(zRqBzKv`Q z^12&*gyq2g?+y1Z$X%Mj#KN)te?QmS55fs6Ul#n^De~qsSIBP}S%zT$&SL!)Zv|{^ zn;0UJnmG20X3V_m{)2Nvs9_%O$58eST!IPSoj%M=I-B_-TRAp-_0;=QyMt@X%_jnN z!U}&*8E;~FAJ@VupztG{^;=%S{5?mT7%EC)f0{5>G3oqa;Sm1kKiweu{YUXSRg02L z+otzV)DLW0sL%TK&x|O^mit^=Y8UoZh`#tM_U@AI-SWJjY6sL@_HmVz8ZI#TnWe7G z_@&$6^6Sp$FBpX9m6`6Y%?*!O%DtuLr#pLuM_V9cUsTI|`#-=9^wa#cW|*VF|aUjFbFUxFgP$Y0HcBd eRlvdKAH$!O>bZXPn|y(>$>8bg=d#Wzp$P!av(+a6 literal 0 HcmV?d00001 diff --git a/tests/contest2019/1344.txt b/tests/contest2019/1344.txt new file mode 100644 index 0000000..9e4f7df --- /dev/null +++ b/tests/contest2019/1344.txt @@ -0,0 +1 @@ +http://wes.casio.com/math/index.php?q=I-295A+U-000000000000+M-0E00000000+S-000410110000100E0010B300D365+E-F90B30004000F901F90B3435004400F901F90BA744004500F901F90B3245004200F901F90BA742004300F901F90B34004700F901F91547A53400F901F9083500323200F901F909F901F9113200F901F9053800F901F9064200F901F9053400F901F9064200F901F912F901F90AF901F908313000323000F901F909F901F9113200F901F9053500F901F9064200F901F9053700F901F9064200F901F912F901F90AF901F908313300313600F901F909F901F9113200F901F9053500F901F9064200F901F9053600F901F9064200F901F912F901F90AF901F9083130003700F901F9113400F901F90B40A631004000F901F909F901F9053300F901F9064500F901F9053100F901F9064400F901F9053100F901F9064500F901F9053300F901F9064500F901F9053100F901F90AF901F9053100F901F91540A53100F901F90848A631004900F901F916F901F91540A53200F901F908480049A73100F901F916F901F91540A53300F901F90848A731004900F901F916F901F912F901F90AF901F908480049A73100F901F909F901F9113400F901F9053300F901F9064500F901F9053400F901F9064500F901F912F901F916F901F91547A53400F901F90B313335004600F901F90AF901F908323700323200F901F909F901F9053100F901F906A74600F901F9053100F901F9064600F901F9053200F901F906A74600F901F9053300F901F9064600F901F9053300F901F906A74600F901F9053400F901F9064600F901F9053400F901F906A74600F901F9053600F901F9064600F901F9053500F901F906A74600F901F9053700F901F9064600F901F9113200F901F9053600F901F906A74600F901F9053800F901F9064600F901F912F901F906A74600F901F9053100F901F9064600F901F9053600F901F916F901F91547A53400F901F90AF901F9083836003100F901F909F901F9113500F901F9053200F901F9064200F901F912F901F9053400F901F9064200F901F9113300F901F9053200F901F90AF901F9053200F901F909F901F912F901F9053200F901F9064200F901F9053200F901F9064200F901F9053200F901F9064300F901F9053200F901F9064300F901F9053200F901F90AF901F90848A636004900F901F909F901F9113200F901F9053200F901F9064300F901F9053400F901F9064300F901F912F901F916F901F90AF901F90848004200F901F903F901F902 diff --git a/tests/contest2019/1367.png b/tests/contest2019/1367.png new file mode 100644 index 0000000000000000000000000000000000000000..36b66d5a5c876bbb59071d09093c9f33719c8e8a GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^2Y^_ggAGV-J$Ez!NO2Z;L>4nJ=qZCRW5rVYGN2%P ziKnkC`(rLCZa#?>tIXa5g(OQ{BTAg}b8}PkN*J7rQWHy3QxwWGOEMJPJ$(bh8~MZ; z7#Qbyx;TbZ+{;7>@*6kLST?8lAEVgQ zr|Jxh3``6x3>*w=4pq15PYlwEyS(Y<*1hX{jhJlaZJuzABS@%`g@q$lG%D=#oX;CR z)Yr}X`+M$QHl~vBR^21v+6T*O^R+`Jz4&Z;wT0k)sGRdC*+JBa6IT$hBx%O#G z+v^Or7c-g9ZA)sM&!G6M?cM?|D@Lbn&QT&vKAR_T+ndR>i`9uHv`$NZBCuw<`hmyI z|KA?Fe)aMKEheBc?fY5|{tZB#{rvU5tQnk}K1eqmE)cmg?*o@T{OVFx3mSCeqKot34kVZz}2Fiq>%yy z7_R@XRkVtq0HM-h{(7&l=Pl6DYf928vS4O_&QfAN7aW}-O6Lf3g9HeZASF-fwN<1y zwNw(Iap5ktF;C6_lLQg~%?9JrB3_f{?0cP&AX+*QAc#a))8NRaTEwIvKu7IRi#cFV zg6QoL0Xlq=wkxR;J}&*iRtd!|&03ZSY5deq)Km-7y3G|)mpA8{gz9wf?cs+0H73C1Z$Eq~| zigae66hL|!bXgViQM`oCDPz##|vF08}+qiHS?#0f7kAeGVu!(+Z7v0)W@$ z|5~OU(fl(2{Z#|@J3;*Yl?mbqlzPk?K8HAJjS2z)F1p08OQ$(i^VefqROTai<9Ig$ z+yH2p<#UhgwY+&`>Z=Yg5)1&SFa+1A%Bc|41m);FSA}4t4iG#Lb8fCwQ~qMGQiEG< z(g7YnH{=?$_ipc5vZENTAp5~k7z9Su= z;rvju68EV7Gt3;*55e1uU2-o_i>^}ZJ(m2&Q`WcRDzF~1pL$S$yF_}q;! z<_Ey*AlMsVb8dyO3Iu>xLU7gra?V9BjKLm>eCOQavgrU*cP^?U`v3$0A^;EpfCvCY k03ZSY5deq)Ks2QO0dKaQTfAhBRR91007*qoM6N<$f+u(j9{>OV literal 0 HcmV?d00001 diff --git a/tests/contest2019/1958.txt b/tests/contest2019/1958.txt new file mode 100644 index 0000000..d94472c --- /dev/null +++ b/tests/contest2019/1958.txt @@ -0,0 +1 @@ +http://wes.casio.com/math/index.php?q=I-295A+U-0007002548EA+M-0E00000000+S-000410110001100E0010B300DC40+E-F908A7333100313200F901F909F901F908A7333600313200F901F908A7333600313600F901F908A7323800313600F901F908A7323800313200F901F908A7333100313200F901F908A73331003700F901F908A73236003700F901F908A73236003800F901F908A73238003600F901F908A73238003400F901F908A73233003400F901F908A7323300313000F901F908A7323800313000F901F908A73238003900F901F908A7323600313100F901F908A7323600313400F901F908A7333100313400F901F908A7333100313200F901F90AF901F908C03800C0313100F901F909F901F905C03600F901F908C03800C03500F901F905C03600F901F908C038003100F901F905C03600F901F908C039003600F901F905C03500F901F908C0313000313000F901F905C03400F901F908C0313100313300F901F905C03300F901F908C0313200313500F901F905C03200F901F908C0313300313600F901F905C03100F901F90AF901F90B31004200F901F9113200F901F908343000313100F901F909F901F9083430A66033A842D0003900F901F9083430A66038A842D0003800F901F90AF901F9083430003700F901F909F901F9083430A66031A842D0003800F901F90531A84200F901F90AF901F9083430003300F901F909F901F9083430003000F901F9083430A66033A842D0003300F901F9083430A66033A842D0003500F901F905C031A84200F901F9083430A66031A842D0003400F901F90AF901F90BC031004200F901F912F901F90AF901F908C03330003100F901F909F901F911333600F901F905312E313200F901F906C0392E3900F901F912F901F90AF901F9073000F901F908C0333000C03100F901F909F901F911323800F901F9053100F901F906C031322E373500F901F912F901F90AF901F90832003900F901F909F901F9083130003100F901F9083135003000F901F908313600C03300F901F908313500C03400F901F908313500C0313200F901F908313400C0313300F901F908313200C0313200F901F908313200C03400F901F908313100C03200F901F9083134003200F901F9083134003600F901F9083133003700F901F908313500313000F901F908313500313300F901F908313200313600F901F90AF901F9083000A73400F901F909F901F90AF901F9083100A73500F901F909F901F90AF901F9083300A73200F901F909F901F90AF901F908393000393000F901F903F901F902 diff --git a/tests/contest2019/2070.png b/tests/contest2019/2070.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb2ab4036af1111db2be34ce7f5c341cb37b995 GIT binary patch literal 645 zcmV;00($+4P)H+d)s`f! z=ik{iW(y&NAEHI|>t8?sAOZjp0EhrU1OTE1^jYbT-L@_HJ2|_;`|H|K2EgleXVNEt zq(A@x0ESM5oN69IV16^e*r~9ax12Q5cD2GS2^C{C`7~g zp_U1I7lGLMs98Z+eh5A zvTGb{YiXRGd+;mN#?Pwef06(t#~NB!W6vNMf}2#h5<|7F{GJy8K(*?BXVjei@7~o| z_16NuZlHF20RUPl6gWT_6Aq3Bg?g{lwpAUI$`Y@Z`l+Nzdh z-M#(@PSbH5#|I!NKYRp$0RS)n00scS000;O00RK{=GV&~l2YovW@O9bTvvO$q;|e+ z$zXsft^_18NKdd@0&T6Oc?_Tg`lOV;kNo!$Q>_-imQeu%{1fnuh-b_*dcK%|5=gDC zo)yz+8p;z4V6Ohx5-sA#0Isq_{&P>*c?l$a&z-fTO+3&8sAY+~FOc>SqkTjv_SUiU z=P&{p;FTF~QsGgFd3%5mpniMA(}3dQaf3Yyp%& z+xrHMY|s)oqQ?M_Wq}=i08t(Tye^XO5dUryFoP7Z30^524HG;a1j=JZ&ql7B;Mz5K z&9X^rmwDCNJwsE9IW<6QhF@#8e}!=JHJ=bB;&<8ultQXS)tP_37vUg&hX%+~doKfw z2$`r!6Kp!d&4?HAV*oSJ|4OL&You3U5I-eQ+^Yl^b3|`9MLEJ<8|jWdnvDSlN+~ND zp(gTL=4H(y+{mdqi#a`gf%|G-2&Lj0qM6}un*G3;&pGCxs;qHsE zR&0b>7609Hj+iOjWdP|$*xd-qR~cdebCFMD7!HwR0P{w$TCW2J2m_gB58My~7ytkR o0AK(B3;=)u05AXm1_1EOAF5W0WGQy!t^fc407*qoM6N<$f~oriNB{r; literal 0 HcmV?d00001 diff --git a/tests/contest2019/2227.txt b/tests/contest2019/2227.txt new file mode 100644 index 0000000..c1659ae --- /dev/null +++ b/tests/contest2019/2227.txt @@ -0,0 +1 @@ +http://wes.casio.com/math/index.php?q=I-295A+U-000000000000+M-0E00000000+S-000410110000100E0010B300D365+E-F908A73430003000F901F909F901F9113400F901F9053300F901F906A7333400F901F905342E3500F901F906A7333100F901F9053300F901F906A7323600F901F912F901F9073000F901F90AF901F908480049A73200F901F909F901F9113400F901F9053100F901F906A7313400F901F9053400F901F906A7363000F901F905322E3500F901F906A7313600F901F912F901F90AF901F90848A631370049A6313700F901F909F901F90B31004200F901F9113500F901F90848A642004900F901F90848A7420049A74200F901F90B42A631004200F901F912F901F9113200F901F90848A642004900F901F90848A7420049A74200F901F912F901F90848A642004900F901F90AF901F90848A732380049A6323700F901F909F901F9113200F901F9053800F901F906A7393000F901F9053400F901F906A7393000F901F912F901F90AF901F90848A6350049A73900F901F909F901F90B37004200F901F9113200F901F9113200F901F9053500F901F906393000F901F9054200F901F906393000F901F912F901F90B42A731004200F901F90AF901F90848A6330049A73300F901F909F901F912F901F90AF901F90848A635380049A73600F901F909F901F9053200F901F908480049A73200F901F905A73200F901F908480049A73200F901F9053600F901F908480049A63400F901F905A73200F901F908480049A73400F901F9053500F901F908480049A63400F901F9053500F901F908480049A73400F901F905A73200F901F90AF901F90848A734330049A6313800F901F909F901F90848A6380049A73800F901F9053400F901F908480049A63500F901F90848A7310049A63100F901F90848A7320049A73200F901F908480049A73400F901F9053400F901F908480049A7313400F901F905A73300F901F908480049A6313300F901F90AF901F90848A7360049A6313100F901F909F901F908480049A63300F901F90848A6320049A63200F901F9053400F901F90848A6330049A73300F901F908480049A73300F901F90AF901F90848A733004900F901F909F901F905A73700F901F908480049A73400F901F9053600F901F90AF901F90848A7330049A63300F901F909F901F9053300F901F90848A6320049A63200F901F908480049A63300F901F90AF901F90848A632340049A7313100F901F909F901F90848A6330049A73300F901F90848A6330049A63300F901F90AF901F90531303000F901F903F901F902 diff --git a/tests/contest2019/2405.png b/tests/contest2019/2405.png new file mode 100644 index 0000000000000000000000000000000000000000..5dec5263c9090d9a1b6aed1268327dec38af113c GIT binary patch literal 658 zcmeAS@N?(olHy`uVBq!ia0vp^2Y^_ggAGV-J$Ez!NO2Z;L>4nJ=qZCRW5rVYGN2%P ziKnkC`(rLCZVrWOpESP%g(OQ{BTAg}b8}PkN*J7rQWHy3QxwWGOEMJPJ$(bh8~MZ; z7?^lGT^vIyZoR#8JMXZ9h|9&Gum9_3+C@5r?O55F*?eiYaVSFQy++%-W z`lr|N3~US%3<(Skj5rwymjB9rIy-S(o&R#@_vaStez!?H_&CMoR?>u7f-@Qzr>*0% zU0m5yIO9k5{Pnj^Fa)nUq_{#`H-O_|kZ7jq#YBr0K<6F^HI!X+mC5ix(ck|kuC@M< zOql&@!oGE!*13&Q^~<*(O*E2xFimUXv!-i27iTM9N{Hs#X&k*)dH<81@alM0hwTR5 zn>|*(NDtd{t8)4K{#7NXW3JDg&l8?)8s%!66k^vGXf||XYxLY?}H_Wh+%V10F$<9|@4e94@oM7ZJaQUMv zy1@O!<|F^L1ZGQ#HnsOGTYQVFDWxIR?f;~J=&+Q|c80do}IeK2vQ0d*+;ryRYxtzWYaUf1738 z{O!p#x22Ah@gJMDQDEDuAK8EZ@BZ1qC}!k%Qs8};y}40VyTpTw%J(Dp?EU^F>9J?; j3oiS0@#UWH9?Q?3wlVN+wB<8k;$iS~^>bP0l+XkK4<8s` literal 0 HcmV?d00001 diff --git a/tests/contest2019/2405.txt b/tests/contest2019/2405.txt new file mode 100644 index 0000000..eb47ca1 --- /dev/null +++ b/tests/contest2019/2405.txt @@ -0,0 +1 @@ +http://wes.casio.com/math/index.php?q=I-295A+U-000500151CCF+M-0E00000000+S-000410110011001E0010B300EA68+E-F909F901F90732373000F901F90B31004200F901F90B30004300F901F9113200F901F908A742003000F901F909F901F90B3242A643004400F901F9084400A73200F901F905A73200F901F90844A642003000F901F90844A63242003100F901F905A73300F901F90844A63442003300F901F9053300F901F90844A64200A73400F901F908A74200A73400F901F90AF901F90833A64400A73400F901F909F901F9053500F901F90833A644A64200A73800F901F90833A642A64300A73600F901F90AF901F90834A642A64300A7313000F901F909F901F90844A63400A7313000F901F90834A644A64200A7313300F901F9053100F901F90834A64400A7313500F901F9053700F901F90834A642A64300A7323300F901F90BA731004200F901F90B31004300F901F90AF901F912F901F9073000F901F9083100A73900F901F909F901F908A73700A73100F901F90AF901F908A7333700A73600F901F90B36004200F901F9113200F901F909F901F9113200F901F9053500F901F906393000F901F9054200F901F906393000F901F912F901F90B37004200F901F90AF901F908A7343000A73300F901F912F901F908A73435003200F901F909F901F9113200F901F9053800F901F906393000F901F9053400F901F906393000F901F912F901F90AF901F908A7333900A7323200F901F909F901F9113400F901F9053100F901F906323500F901F9053400F901F906323200F901F9053200F901F906323300F901F9053300F901F906323000F901F912F901F908A7333900A7323000F901F9113400F901F9053100F901F906323000F901F9053300F901F906353000F901F9053300F901F906323000F901F912F901F90AF901F908A73233003600F901F909F901F90B30004200F901F90B30004300F901F9113800F901F90632323500F901F90542A743A674324200F901F90631333500F901F90B31004300F901F91542FB033600F901F90B42A631004200F901F916F901F9054200F901F912F901F90AF901F908323400A7313900F901F9113400F901F909F901F9113200F901F9053200F901F906393000F901F91543A53300F901F90AF901F916F901F9053400F901F906393000F901F912F901F90AF901F90B43A631004300F901F9053400F901F912F901F9113200F901F9083331A6384400A73200F901F909F901F9083331A6334400A73100F901F90AF901F90B31004400F901F912F901F905383000F901F903F901F902 diff --git a/tests/contest2019/2559.png b/tests/contest2019/2559.png new file mode 100644 index 0000000000000000000000000000000000000000..6316950f6cdac0ba556fdf9c402a63b3d3a91e83 GIT binary patch literal 699 zcmV;s0!00ZP)IlAP`2EP2c~O@fQg;+!+vN&Phykqit8e zZ*HY^-h2NCV3dEp0>A(O7ytkR0AK(B3;YB9)8 z@u!Y8_jkYmB2hNH{-wxDBKO{70(t=XtPlh>A}r_J*JH==o|LV~0GIaxvtkOSk&Mix zVTOYS^KYru zpeyF}rITZnJ!F6>F{SG4(I0=caCT({3$gLBD*l!XFte;-XPE*t!D10^MoSsY+ePkn1f{`_i^56ay?OrEV#Qa>A}%k)|aZVSt6D z)=k-qCfG=%uC2E0=@qmz!tn(-BiW7&peRz$M8sRCK)GAPSjZG6Z;Z9#MA)t3Z#ibo zqg|63p!GypZv^F5h8Wy2=0y$%=vv%)Z35Ca$h00RJE000aCfB^t7 h000I6zyJU$`2aOU;$QOgLL&eG002ovPDHLkV1k%0B-8)^ literal 0 HcmV?d00001 diff --git a/tests/contest2019/2559.txt b/tests/contest2019/2559.txt new file mode 100644 index 0000000..d73f595 --- /dev/null +++ b/tests/contest2019/2559.txt @@ -0,0 +1 @@ +http://wes.casio.com/math/index.php?q=I-295A+U-0007001B151D+M-0E00000000+S-090410110001100E0010B3006005+E-F908C03238003900F901F909F901F908C0323800313000F901F9053500F901F908C03233003400F901F905C03500F901F908C03238003700F901F9053200F901F908C0323600313400F901F905C03500F901F908C0333100313200F901F9053300F901F908C0323800313600F901F905C03800F901F908C0333600313200F901F9053500F901F908C03331003700F901F9053200F901F90AF901F908C03800C0313100F901F909F901F905C03600F901F908C03800C03500F901F905C03600F901F908C038003100F901F905C03600F901F908C039003600F901F905C03500F901F908C0313000313000F901F905C03400F901F908C0313100313300F901F905C03300F901F90AF901F908333300C03500F901F909F901F9053200F901F908333500C03700F901F905C03200F901F908333300C03900F901F9053600F901F908333900C03500F901F905C03200F901F908333700C03800F901F90AF901F908343200C03500F901F909F901F908343200C03900F901F9053500F901F908343700C03500F901F905C03200F901F908343500C03700F901F90AF901F908333200313000F901F909F901F9083332003800F901F9083337003900F901F908343000313100F901F9083433003900F901F9083438003800F901F908343800313000F901F90AF901F9083337003500F901F909F901F9083337003300F901F9083430003000F901F9083433003300F901F90AF901F9083400313000F901F909F901F90837003600F901F9053500F901F908313500313000F901F908313500313300F901F908313200313600F901F905C03400F901F9083600313400F901F9083600313200F901F9053700F901F908313200313000F901F905C03500F901F9083131003800F901F90AF901F90832003900F901F909F901F9083130003100F901F9083131003400F901F9053300F901F9083134003600F901F9083134003000F901F9053100F901F908313600C03200F901F908313500C03400F901F908313500C0313300F901F905C03300F901F908313200C03400F901F9053400F901F905C03500F901F9083131003500F901F90AF901F908C0333000C0313200F901F909F901F911333600F901F905312E313200F901F906392E3900F901F912F901F90AF901F908C0333000C0313000F901F909F901F9073000F901F911323800F901F9053100F901F90631322E373500F901F912F901F90AF901F9083000343000F901F903F901F902 diff --git a/tests/contest2019/2673.png b/tests/contest2019/2673.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd71446020c617d918fda563c703f7f82f5ff6e GIT binary patch literal 705 zcmV;y0zUnTP)QD$`(q%c?{E^GF1F3pD$hQSWad@|M8!Yw2YY z3xi;Q163mbVE;QhT@gk3ekljEMxYwPYniupA1tc^2Dq$(tcasEMY0fDZG|6I0LzSm z0S>l4mi_Xn$xiK>N0r91O~U|&0$3GsEd#8q;JFDbc7SKbtvkQR01i#GlLLCM_qGF! z0Upo}oy-B{c_eq6F#xEPbm<(>GlUm-6yl=FAtBH-0<{d9kG`*bD}-&!vlD`~s>-PV ziUAx5zZN#1&<>5x>7^wi11PsE8oRAt`*jR(k@#mS!0uxWni<2(REQ9)NN<;um7fam z>eas|)clxPQCo=L<3tDpTokBl0+lkwXroNRROLQI?@?*VzYPPtu$8){9cn%9JR0p< zRU-^=ajSJx^?GV6MhF&O?aC?8PF8qJ5T5x*{FP&=02i**65r}@YlfN0G=$(6Re{=v zyc#lZ75~$(83QPqpeBHoM4nJ=qZCRW5rVYGN2%P ziKnkC`(rLCZU(NS6S6dcLXst}5hc#~xw)x%B@E6*sfi`2DGKG8B^e6tp1uL$jeOz^ z3`{PbE{-7;x8BaVn0Hu#$8~z<|Np1oteia6k}=2Gz%qQ*HZR_jo2obTdiDo-{d9V< z^w%>n1qKHW1_36976t}IF!NTl{hg-gB{J?`ji;HNO}`_kJMXh;dcHE_fy29u1Gp7T zH@iuNNbCQSS>oW*x_^32eq+{_pNkz>8NQr9ASYb?V5ijccUE4SnTiUmQ5*O^%zBx8 zt>cS}lY?MS+w=c{mZeuLwi>2287{iV(4cbB@!!3yQ}dFu(smpD>alWOmvwh-K_mlX zLrUPH@|RbVxZXDoAZ6=rzxbUalN0%G76e6VjC;r^k!?HDFVxUXI^eep6tPXH1 zF)TQKd0~fDLOKV7!bP8dDY6TC-B}z~zGByJDat;ow^Z5n!z0c9bo~n}Rv0D4C@~z{ zuai*CYgW|Vy3~-JVTEO^ zSHF4MKNryl3>yMOF8tegP04um&-8d>1|62hG=|e*9g?dZc5^U@#r@qNB{rGap-N!W qv)2p_4W<(#*j(3(F<{1i%>LgSt~YzMobmuBItEWyKbLh*2~7YUZX=KY literal 0 HcmV?d00001 diff --git a/tests/contest2019/2805.txt b/tests/contest2019/2805.txt new file mode 100644 index 0000000..2400888 --- /dev/null +++ b/tests/contest2019/2805.txt @@ -0,0 +1 @@ +http://wes.casio.com/math/index.php?q=I-295A+U-000000000000+M-0E00000000+S-000410110000100E0010B300D365+E-F90B3130004700F901F90AF901F9083500313100F901F909F901F90B36343630323036343230004200F901F90B31323435323534383433004000F901F9113200F901F911313100F901F90734356042A7478342A94700F901F90B8342A947004200F901F90540A7478340A94700F901F90B8340A947004000F901F912F901F90B32343632303234363032004200F901F90B34353131323335363531004000F901F912F901F90B342E35004200F901F9113200F901F90B30004000F901F90AF901F911333200F901F908362E35A642784000A7362E35A642774000F901F909F901F90B40A63930A938004000F901F912F901F90B362E34004200F901F912F901F90B31004600F901F9113200F901F90BA746004600F901F90AF901F9083736A73346003800F901F909F901F907393046A7363000F901F905332E3600F901F9073630A739304600F901F905332E3600F901F907383046A7393000F901F9053500F901F907393000F901F9053200F901F905A73300F901F912F901F90AF901F908323200313500F901F909F901F9113700F901F9073000F901F9054600F901F90732323500F901F90546743200F901F90B46A631A78346A936004600F901F912F901F9073000F901F9054600F901F90AF901F9083530003500F901F909F901F90B31333433323832343638363536004200F901F90B37383333323439333934323335004000F901F9113300F901F91546A53800F901F90B32343533323132313234313738004200F901F90B31383231333131333131333232004000F901F916F901F911313500F901F90734356042A7478342A94700F901F9056040A7478340A947D0D06031A62E34316032A788322C42A7478342A94700F901F90B8342A947004200F901F90B8340A947004000F901F912F901F90B37343633343638373435363738004200F901F90B32323332343333313531343133004000F901F90B31A646004600F901F912F901F90AF901F908363900A73600F901F909F901F90B3634323036343630004200F901F90B353432343632323232004000F901F9113200F901F911313000F901F90734356042A7478342A94700F901F90540A7478340A94700F901F90B8342A947004200F901F90B8340A947004000F901F912F901F90B363432303630343632004200F901F90B32323234353331313134004000F901F912F901F90AF901F905334700F901F903F901F902 diff --git a/tests/contest2019/3217.png b/tests/contest2019/3217.png new file mode 100644 index 0000000000000000000000000000000000000000..b11286b5af6ea113097150eff4dbc65297d6febc GIT binary patch literal 763 zcmeAS@N?(olHy`uVBq!ia0vp^2Y^_ggAGV-J$Ez!NO2Z;L>4nJ=qZCRW5rVYGN2%P ziKnkC`(vP1Q*qYRb%j77$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj3F!Z|B_3JEFkDI(yas|EFIH3pued-RM&+Ug8z`^wvAc_=YdL-v9pR_+s&| z$NmZHU+>y={LGPsC9!WM)NJ3cEEHmxbH(U_utQbbRig}Et+UlGm-MgI=xZ;T|K~GL zh}5w&@AYT?=UlN`f%yRY=0jbb;SW~2mcO+8RBJtJj*v!%{D!P$DL$)(GR%}28D2>_ zpWbq7Yh~TqnrQ1!+vio6$ur1Ikp1-bp1AJSXN#X{oL?&$d%46^*!$*k8@;!etK=9s zW~sWh`=$F#oIiP+Du<5OTDcEDZFRkM7&ub?MK+(EcfD)bBu3pH{i%^#c@jSAFbJ$M z{PvEqX!Fy^16IGjFZkT_DM{0XM<7jYp2_R4CHt?LZgrn+vsqU1fpYEPS2a!7c?#A( zUpdt!td@a6CWtR{ijywKo`!SA6OSK}W?<=glK+kI($_W8NvDHWt50*1xnX}sNlFh61zylX*7mT654ys@i;|$wBs2rl%$Mrdar;U*(VNmcp*xychmsR&N z_Ws243>yqtE{R)h7CDqG@}h*%q2XeGMy1sN*0=cI`nG5jjomMFqe8^zGT pz@W(Bz`-EE#L$9^xp3}Re!Z1ic{W=QF9fDi22WQ%mvv4FO#tJ4K6C&8 literal 0 HcmV?d00001 diff --git a/tests/contest2019/3217.txt b/tests/contest2019/3217.txt new file mode 100644 index 0000000..0e729dd --- /dev/null +++ b/tests/contest2019/3217.txt @@ -0,0 +1 @@ +http://wes.casio.com/math/index.php?q=I-295A+U-000000000000+M-0E00000000+S-000410110000100E0010B300D365+E-F9083400313700F901F90B3434004500F901F90B3534383433323533004200F901F909F901F911323400F901F906393000F901F90B2E318342004200F901F90531306042A7834200F901F90B42A635306032303331837842D0D0A633313330363483782E31A742004200F901F912F901F90AF901F905333000F901F90B36353533363448004200F901F911323100F901F911313600F901F90B2E358342004200F901F90848003532A7324CA93435A77A42A7834200F901F909F901F9053000F901F90AF901F90632322E3500F901F912F901F9053100F901F90B42A63132837848A73532D0D0A633333031303038383531837848A73338D0D0A634323538333833303537837848A73430004200F901F90B42A632343533353734373431837848A73432D0D0A631303831363731303434837848A745004200F901F90B42A6373937313836363830837848A73334D0D0A6383738303632313430837848A73336004200F901F912F901F9084800323200F901F9113800F901F90831360049A64200F901F90B42A731A78331307742004200F901F909F901F905C04200F901F912F901F90AF901F90845003800F901F909F901F9083435003500F901F9083432003700F901F9083431003200F901F9053500F901F90848003400F901F9083435003100F901F90848004200F901F9084500C03700F901F9083432004200F901F90848003100F901F90AF901F90B342E35004200F901F9113200F901F911343500F901F9063800F901F9082E35A642784C002E35A642774C00F901F909F901F912F901F90AF901F90B362E3335004200F901F912F901F90B35363432343635363030004200F901F90848003200F901F9113500F901F9083230220049A73100F901F911313200F901F90B2E358342004200F901F91542A5834200F901F909F901F9053000F901F90AF901F916F901F90534A93300F901F912F901F90B42A63136373739303934837842004200F901F912F901F90B3831393233323031004200F901F911313200F901F9083730004900F901F9113900F901F90B2E358342004200F901F9113200F901F908313430A7480045A77C42A7834200F901F909F901F9053000F901F90AF901F912F901F9053100F901F912F901F90B45A731004500F901F90B42A63333363836343730837845A73431D0D0A632333634343238837845A73338D0D0A6323633363835837845A73335004200F901F912F901F903F901F902 diff --git a/tests/contest2019/3270.png b/tests/contest2019/3270.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d71d6921f05bf741fe974c705d30266ab9646d GIT binary patch literal 733 zcmV<30wVp1P)I$00009a7bBm001r{ z001r{0eGc9b^rhX2XskIMF-;w8VD!^eKS|x0000PbVXQnLvL+uWo~o;Lvm$dbY)~9 zcWHEJAV*0}P*;Ht7XSbPS4l)cRCwC$oY`)~APhxA)&Kux`Vb95W(n9PA=7i8qU?&# z*w;WCVvGkuTK(_|5C9VN;$dovd(O+{jR&hfuvlC3i z^}Gj4pSX;lafDE9zkF>Flq}3Zd52QXK!aG=$6(yMdUUIau1+sdCdfcT>8C%%?LL*! zN;y=YS9&13`&KNBuTH7vZp^q$R`g$`&x6h_08%eWTM@q!krv;KO8a}DFKC!sOS7vB z&5#2?{duAh1GJlu9$WzjH~tyOGMR8EJ^dHUlaScZ{Q(IcXfz2O+JVG4nJ=qZCRW5rVYGN2%P ziKnkC`(rLCZgC0YRr9|Cg(OQ{BTAg}b8}PkN*J7rQWHy3QxwWGOEMJPJ$(bh8~Mb6 zib_3Q978H@y}iuH%fP^K*x