Compare commits

..

55 Commits

Author SHA1 Message Date
03c8e7d0ec omg I never committed d24p2 2024-12-12 22:17:04 -08:00
fd48bea516 d25p1 2023-12-25 16:45:25 -08:00
95261557ea d24p2 2023-12-25 13:20:40 -08:00
b8c59949e9 d23p2 2023-12-25 02:26:26 -08:00
69e2bc3b20 d23p2 naive 2023-12-24 23:40:09 -08:00
e0a1757e9e d24p1 2023-12-24 23:39:29 -08:00
5204bf0d60 d23p1 2023-12-24 15:40:59 -08:00
0064376377 d22p2 2023-12-24 00:18:26 -08:00
6d19325d59 d22p1 2023-12-23 23:53:53 -08:00
6efe1f874e d21p2 2023-12-22 18:21:40 -08:00
9189483484 d21p1 2023-12-20 23:28:45 -08:00
63921cea50 d20p2 2023-12-20 03:58:35 -08:00
3475d23962 cleanup d20p1 2023-12-20 02:49:53 -08:00
a4856cf9ef d20p1 2023-12-20 02:48:21 -08:00
43a83d487b d19p2 2023-12-19 23:15:01 -08:00
cbe8fbde87 d19p2 half done still need to calculate volume of the polyhedroid or find a better way 2023-12-19 02:49:11 -08:00
7e0fd280cb d19p1 2023-12-19 01:10:33 -08:00
63a054505d d18p2 2023-12-18 00:40:31 -08:00
89b14c0db9 d18p1 2023-12-18 00:31:11 -08:00
c4713f768a don't look at this commit it's horrible visualization oh but maybe it has a better heuristics 2023-12-17 17:05:43 -08:00
ce7568e5fc d17p2 2023-12-17 11:30:10 -08:00
edcc8f4dba d17p1 2023-12-17 11:14:35 -08:00
2202ebf4a8 better d16p2 2023-12-15 23:47:00 -08:00
793bb420ea d16p2 2023-12-15 23:39:35 -08:00
e50db48a2c d16p1 2023-12-15 23:23:19 -08:00
227aa6713d Make d15p2 a little more readable and remove unneeded imports. 2023-12-15 00:42:27 -08:00
8683c9c8b3 d15 2023-12-15 00:17:21 -08:00
0f5dcc20ce d14p2 for real 2023-12-14 22:24:55 -08:00
a6c506874c first half of part2 seems to work I hate swipl tabling 2023-12-14 13:50:21 -08:00
db08023b9e d14p1 2023-12-14 02:01:31 -08:00
7a66d289ea d13p1 and d13p2 2023-12-13 00:32:49 -08:00
25ad602e9a d12 classic dynamic programming, removing special python features 2023-12-12 16:33:12 -08:00
3169d08eb3 d12 classic dynamic programming explainer in py 2023-12-12 16:26:49 -08:00
da1707b365 d12p2. It was actually good; swipl's memoization table just didn't work. 2023-12-12 11:50:35 -08:00
b2affa1b5c add bruteforce d12p2 2023-12-12 01:15:01 -08:00
be05074240 d12p1 2023-12-11 23:04:10 -08:00
a437ae1e1c cleanup d11 code 2023-12-11 19:14:46 -08:00
Duy Truong
963c06b3ba improved d11 implementation 2023-12-11 17:21:54 -08:00
Duy Truong
6707722fa8 faster d11 2023-12-11 12:37:35 -08:00
330c51da3a d11p2 2023-12-11 00:03:27 -08:00
3e01d3394d d11p1 2023-12-11 00:03:18 -08:00
c4c585b385 marginally more readable d8p2 2023-12-10 11:40:20 -08:00
668be81650 d10p2 cheese 2023-12-10 03:36:41 -08:00
e0b41e8bef d10p1 2023-12-10 02:33:41 -08:00
a2eca138aa idiomatic but slow d8p2 2023-12-09 22:01:20 -08:00
cd18e701c5 d8p2 final optimized general solution 2023-12-09 16:45:22 -08:00
a997d00c89 improve d8p2 readability 2023-12-09 11:41:52 -08:00
1a7326555a correct d8p2 and add debug print 2023-12-09 08:48:27 -08:00
65267a5850 simplify d9p2 2023-12-08 23:28:47 -08:00
7624131aa2 d9 2023-12-08 23:10:03 -08:00
bdf5fe807a actual proper d8p2 2023-12-08 20:21:08 -08:00
d9980e3b33 d8 2023-12-08 17:10:35 -08:00
Duy Truong
d5ee7282e9 shorten even more 2023-12-07 15:04:57 -08:00
Duy Truong
22548a4339 readability improvement 2023-12-07 13:43:09 -08:00
Duy Truong
bff06901be more efficient algo 2023-12-07 13:32:10 -08:00
97 changed files with 14291 additions and 16 deletions

View File

@@ -1,25 +1,19 @@
answer(Answer) :-
input(Input),
convert_input(Input, Hands, Bets),
input(Input), convert_input(Input, Hands, Bets),
convlist(score, Hands, Scores),
zip(Scores, Bets, ScoresBets),
sort(ScoresBets, SortedScoreBetsInv),
reverse(SortedScoreBetsInv, SortedScoreBets),
payout(SortedScoreBets, _, Answer).
% payout([Hand-Bet], _, Payout) computes total payout from [Hand-Bet] map.
payout([], 0, 0).
payout([_-Bet | Cdr], Rank, Payout) :-
payout(Cdr, LastRank, LastPayout),
Rank is LastRank + 1,
Payout is LastPayout + Rank*Bet.
sort(ScoresBets, SortedScoreBets),
length(Input, NHands), length(VarList, NHands),
scanl([_, Prev, Curr]>>(Curr is Prev + 1), VarList, 0, [_ | Ranks]),
zip(Ranks, SortedScoreBets, RankScoreBets),
foldl([Rank-(_-Bet), Prev, Sum]>>(Sum is Prev + Rank*Bet),
RankScoreBets, 0, Answer).
% score(Hand, Score) gets the score for one hand, that can be directly compared.
score([A, B, C, D, E], Score) :-
type([A, B, C, D, E], Type),
Score is E + 100*D + (100**2)*C + (100**3)*B + (100**4)*A + (100**5)*Type.
% type(Hand, MaxCount, Type)
type([1, 1, 1, 1, 1], 7).
type(Hand, 7) :- count_hand(Hand, 5, _).
type(Hand, 6) :- count_hand(Hand, 4, _).
@@ -30,7 +24,7 @@ type(Hand, 2) :- count_hand(Hand, 2, 4).
type(Hand, 1) :- count_hand(Hand, 1, _).
count_hand(Hand, NMaxCard, NUniqueCards) :-
convlist([X, X]>>(X =\= 1), Hand, NoJokerHand),
exclude(=:=(1), Hand, NoJokerHand),
maplist(count(NoJokerHand), NoJokerHand, Counts),
max_member(MaxCountNoJoker, Counts),
count(Hand, 1, NJokers),
@@ -48,8 +42,7 @@ card(84, 10). card(81, 12). card(75, 13). card(65, 14). % TQKA
card(Char, Card) :- Char >= 48, Char =< 57, Card is Char - 48.
% zip 2 lists into a map
zip([], [], []).
zip([A | ACdr], [B | BCdr], [A-B | ABCdr]) :- zip(ACdr, BCdr, ABCdr).
zip(List1, List2, Map) :- maplist([A, B, A-B]>>(true), List1, List2, Map).
% convert_input(InputList, Cards, Bets)
convert_input([], [], []).

801
08/input.pl Normal file
View File

@@ -0,0 +1,801 @@
:- op(700, xfx, to).
direction("lrlrrrlrrrlllrlrrllrlrrrlrlrrrlrlrrrlrlrrrlrrrlrllrrrlrlrlrrlrrlrlrrlrrlrrllrrrlrrrlrrlrrlrrlrrrllrrlrlrrlrlrrlrrlrlrrlrrllrlrrrlrrlrrrllrlrlrllrllrllrlrrllrrlrlrlrrlrllrrrllrrrlrrllrrrlrrrlrlrrrllrrrlrlrrrlllrrrlrlrlrrrlrrrlrrrlrlrrlllrrlrrrllrlrrrlrlrlllrrlrlrrrlrlrrrr").
gnk to lbv-qnp.
pjq to ghf-fjf.
klm to ttr-bql.
ldt to fxs-fbb.
tkh to nbh-jrn.
qnd to kjc-srd.
sng to bqp-lxn.
gms to jdn-nkm.
ntl to pts-dhk.
nbn to ffd-prl.
ncp to qkb-hmr.
nqt to rdk-bhc.
tdk to ghm-ghm.
bjs to tgc-gbj.
xnh to ggj-tkl.
nkv to gtc-ncp.
hfl to lqq-rvt.
hkc to bqm-nkp.
kch to gjg-gjg.
mfd to crd-vdp.
fnz to xsm-pqq.
nvt to tdn-jvt.
pcq to hld-bkq.
gpf to mnj-ngp.
pcx to lpd-bjk.
ccg to tts-tts.
bgg to tqp-nfg.
hsp to dvs-qqm.
tsx to gbv-kxm.
rkk to bnc-fnz.
hvj to rpd-mgb.
cxc to btd-vdn.
nbh to sqq-pjb.
cqn to srv-mcf.
lpd to ppr-rhs.
bkm to fjv-xtv.
kqv to pck-dxj.
vcl to pdn-mtc.
jvs to qqp-bdm.
mjt to jcx-nrr.
vsr to nqt-kng.
nkm to hnf-bfd.
hgj to bnt-kfk.
vmc to qnd-rkc.
djg to prd-lbd.
jct to nfm-njf.
fpx to njf-nfm.
hpd to snt-jxr.
qlk to kxv-klf.
hmr to tdk-cxj.
rql to qdp-gbq.
vdt to bgp-mxh.
pfv to tnh-lqv.
ttf to flv-skm.
qkl to jnb-skx.
rxc to qfp-vmv.
ngj to qpn-gsf.
mpz to jvh-bnb.
fpb to xnh-nms.
lqp to sng-vvm.
hqf to mnm-vhl.
xxj to prl-ffd.
kph to ttf-snq.
jdt to kch-jmc.
krk to pcx-bmg.
fjv to qlk-qsn.
mpg to ljg-pkd.
tch to rrq-qtl.
sds to jqr-bxr.
rkr to kvd-ngn.
tvj to xgs-pcq.
vsq to nhp-qqs.
rdk to xtd-mhb.
sgp to prp-xjd.
svn to bkm-nsv.
sjc to dgl-frh.
njx to trn-mhn.
rcg to bsn-dqr.
hxj to kdl-srr.
bqz to pql-frm.
nks to shm-shm.
fpj to stm-ctn.
sfm to pvc-tgm.
vss to mgv-jls.
dgl to nbb-bst.
xrq to lpn-mkf.
rsz to svm-xmg.
ttk to kst-mgq.
fjf to crc-rxf.
cmt to hph-kpl.
sdr to ltd-tvk.
bst to kqv-qph.
dgt to bcq-mlx.
qpn to mmd-lkl.
shm to frm-pql.
xdd to qcs-vmd.
snq to flv-skm.
tlf to qtc-grk.
cpb to dfx-gdn.
brj to ldr-cdr.
jnl to jtd-smv.
ftg to vrn-vrn.
gbj to vgh-djt.
tgs to fpb-qgt.
mhb to dkl-kmx.
gnh to sfq-jxk.
ltd to xjq-mbl.
pcr to jdd-ktl.
dmd to khc-kvh.
ftt to ltb-bld.
lmt to rkc-qnd.
jgt to fdt-vdd.
mdv to xts-mrf.
plv to kxc-cnm.
prj to shc-mnl.
pml to grx-qgj.
vvm to lxn-bqp.
ngn to gbg-xjx.
vcg to srv-mcf.
qfp to tjs-xpd.
lvx to fpx-jct.
rbc to drm-vhc.
xkt to ccg-flm.
sdh to bnf-gkn.
bvq to qsh-vsq.
smv to skn-hhj.
dbd to rsm-pkb.
dqr to hvs-dvc.
mnk to dxt-cld.
ffd to dlf-jpq.
gbg to tkp-kpm.
chk to mmt-mqc.
bxr to gmv-bgt.
sfd to xsp-sds.
prt to hdb-rcg.
qxj to qqt-bhg.
tgr to tqd-tjm.
gjg to rvq-tvj.
bfd to sgs-nch.
pnd to bpl-tkv.
jpg to gnq-qkp.
fdt to npf-sff.
dlx to xvp-bnr.
snt to qfr-rmt.
dnd to tvk-ltd.
ssf to llf-frv.
drk to ftg-lbt.
vqv to jvs-rrh.
xbv to dsc-nrl.
cvl to krf-njx.
xgp to bqj-rxc.
mlx to tbd-qsg.
jdf to ccg-ccg.
gvn to scn-pkh.
ncb to gkn-bnf.
llf to pnd-lmm.
shx to txm-prj.
knl to ksl-vqq.
jsk to sqd-mpg.
pps to khc-kvh.
nkj to dbd-rfb.
cnm to fcb-dhp.
txj to dbj-dlx.
qsh to qqs-nhp.
brc to pln-gms.
bhp to jnh-clp.
bql to sdr-dnd.
tgc to vgh-djt.
mhm to vhv-hfp.
ngp to hnn-hdx.
skm to sxh-ptr.
tfn to smk-gxl.
nsr to glb-pch.
rhs to xcx-rfh.
bnc to pqq-xsm.
xjx to kpm-tkp.
lft to tmh-ssp.
kvd to xjx-gbg.
skx to ngf-ntc.
ckq to fcl-mrm.
mtc to pbm-tgr.
rhv to tgs-kdv.
mmd to vmj-tfn.
psm to xdk-gsg.
kxm to rdn-xps.
pln to nkm-jdn.
hdk to skx-jnb.
xgs to hld-bkq.
fmb to phl-tfg.
lhh to xrf-stp.
ltb to tdc-bcx.
frv to lmm-pnd.
grk to fdh-cqd.
nrr to hns-kbj.
bgt to ldt-vbj.
srd to cbg-dmm.
knf to dvl-knl.
kxc to fcb-dhp.
ghb to nnj-qmh.
pgq to jjx-vsf.
skb to xxt-ntm.
lxp to prd-lbd.
prl to jpq-dlf.
frm to lbn-cpb.
ksl to fpt-ttc.
crc to rcl-hqf.
svm to bjs-xkd.
pxb to pmc-hpd.
jpq to mkj-mkc.
ttr to dnd-sdr.
cbh to ftd-jjq.
xps to nsp-lss.
kmx to qsl-sjc.
cld to mdp-ckq.
gxv to mkk-dbb.
bqp to tqh-lkn.
ftb to gjq-gxv.
kpl to drr-rsz.
mkf to sdh-ncb.
ssp to cbn-xcf.
xjq to nnd-tpt.
ntt to ndj-qfb.
plf to nbh-jrn.
xdk to gpf-fsg.
ntc to dgt-xrb.
sgj to qmh-nnj.
tnh to vgb-fdr.
dfx to hfc-ktx.
dbj to xvp-bnr.
vdd to sff-npf.
jkl to frt-cvl.
xsp to bxr-jqr.
dbp to psr-ljs.
khc to mjt-ktp.
tkp to vrx-gvn.
dkl to sjc-qsl.
dlp to xxj-nbn.
kln to hrp-jpm.
tpp to nhj-pcr.
qvf to qnp-lbv.
vmd to ctf-sfm.
nfm to qkl-hdk.
mcf to bjv-jxl.
pqg to xtq-qmc.
bgp to hft-ktd.
pts to ddg-rbc.
jls to shl-vpt.
dht to npc-krp.
tjm to khm-bxb.
trh to ndj-qfb.
ctf to pvc-tgm.
pmj to bhp-tdf.
aaa to mpf-vmm.
xcf to lvx-fnt.
frh to bst-nbb.
qll to hdb-rcg.
xvp to qhd-pml.
bnx to tlq-tsx.
bxb to jsj-kdq.
fpt to lbc-vjf.
fcb to tjk-mjd.
kng to rdk-bhc.
dbb to rfx-flk.
lqq to rtp-hgj.
lbt to vrn-rlt.
xkd to gbj-tgc.
lkn to xdd-cpc.
xhm to cnm-kxc.
dtc to qqt-bhg.
bpl to dms-gqc.
qpp to mrf-xts.
prk to nkp-bqm.
mgs to mpg-sqd.
stm to mts-ghd.
skd to mgv-jls.
qph to dxj-pck.
hdb to dqr-bsn.
dsc to vxm-chk.
tqf to gjt-fnj.
fxs to ghq-bvq.
sff to hkc-prk.
drr to xmg-svm.
rkp to xxn-ldq.
nnj to klg-hfl.
vjf to hmj-rdc.
lxn to tqh-lkn.
cxj to ghm-cmt.
hmc to gms-pln.
ljs to jdf-xkt.
xch to ttr-bql.
lkg to qxj-dtc.
qfb to mht-cfl.
rdn to lss-nsp.
dhs to shm-bqz.
nkt to gsg-xdk.
mch to htp-blc.
nvx to mgs-jsk.
qtc to fdh-fdh.
nnd to dgp-lbf.
gjv to xhm-plv.
gsg to fsg-gpf.
bnv to stm-ctn.
ldq to mch-gxs.
mhn to kph-pkc.
lbf to pps-dmd.
qdp to nkv-hsq.
mpf to mnk-lth.
dhq to cdr-ldr.
vmm to mnk-lth.
hft to brc-hmc.
ltr to nkt-psm.
hdx to gjc-ftt.
ghf to rxf-crc.
bkq to ftb-hjh.
bxx to njc-npk.
fvp to brg-ntj.
rdc to lht-vmg.
jkt to qpp-mdv.
pvp to ghb-sgj.
xxn to gxs-mch.
shc to gnh-pcj.
gsf to lkl-mmd.
krp to mgl-vgq.
jxk to tgn-tjp.
mgq to xrq-vbn.
fln to mgb-rpd.
dhp to mjd-tjk.
sqq to dvp-vcd.
hfh to cbh-jmm.
mbp to ndf-tfk.
klg to rvt-lqq.
npf to prk-hkc.
nms to ggj-tkl.
qqp to cgm-tch.
sfg to nvg-nsr.
rvq to xgs-pcq.
sqd to pkd-ljg.
jcx to hns-kbj.
qsn to kxv-klf.
glx to nkt-psm.
tjs to gjv-mpk.
qlj to xjd-prp.
nsv to fjv-xtv.
gxx to rfb-dbd.
hsr to brg-ntj.
hbf to cdc-nxl.
xss to psr-ljs.
qtl to tqf-hqm.
tkl to dnf-pvp.
brk to jkq-jkk.
scn to mfc-pmj.
gmv to vbj-ldt.
hns to lmt-vmc.
rgr to ntt-trh.
pnc to kch-kch.
xnk to jnl-qfh.
rrr to pqt-ngr.
tdn to kbc-ttk.
nqn to khn-ssf.
hmk to rrh-jvs.
rfb to pkb-rsm.
sfq to tgn-tjp.
jkq to svn-bdb.
ctn to mts-ghd.
qnt to tqp-nfg.
vhl to jjp-hbf.
rfh to plf-tkh.
ktd to brc-hmc.
vrx to scn-pkh.
bnt to jkl-jcl.
mdn to dlc-brk.
cbg to sks-pjq.
qfh to jtd-smv.
hvs to xgp-ccx.
nqh to bkx-vsr.
gqq to mbv-hmn.
lsn to ntm-xxt.
flq to rrr-qlt.
lxm to prt-qll.
hjh to gxv-gjq.
srv to jxl-bjv.
tmh to xcf-cbn.
prb to ktv-ndd.
jjq to qhq-qdb.
ksv to ntt-trh.
xkh to vjs-jgt.
sjp to qnt-bgg.
ntr to bnc-bnc.
pbm to tjm-tqd.
rpd to dvg-prb.
xpd to mpk-gjv.
nch to gkg-ngj.
ktp to jcx-nrr.
gqc to qnr-pfv.
mkc to vlf-sfd.
ntm to fbf-xnk.
tvk to mbl-xjq.
rmt to xkv-rhc.
nhp to dpm-mhm.
jnb to ngf-ntc.
rtp to bnt-kfk.
gjt to tkr-gpl.
tts to vfm-vfm.
flk to bnv-fpj.
cjj to qvf-gnk.
qkp to fbg-tpp.
xqt to jvt-tdn.
jvh to xkx-jkm.
ndj to cfl-mht.
jxx to brk-dlc.
xjd to smn-lkg.
jxl to kvb-rhv.
vmg to kkm-jkt.
fbg to nhj-pcr.
lkl to vmj-tfn.
nxl to xss-dbp.
src to ftg-lbt.
pdc to cqn-vcg.
bld to tdc-bcx.
nhj to ktl-jdd.
dgc to vfm-zzz.
ltx to qtc-grk.
ccx to bqj-rxc.
drm to dgb-pgx.
vqq to ttc-fpt.
bhc to xtd-mhb.
cdc to dbp-xss.
sxh to pnc-pnc.
kbc to kst-mgq.
dxt to ckq-mdp.
prp to smn-lkg.
sgs to ngj-gkg.
vbn to lpn-mkf.
bnf to kgk-pgk.
hld to ftb-hjh.
fgt to tcg-ntl.
vbt to dvs-qqm.
xvt to qll-prt.
sbh to bnb-jvh.
vgb to vss-skd.
xjj to cxc-pkx.
jkk to bdb-svn.
bsn to hvs-dvc.
dbx to qsr-hxj.
qsg to khj-vmp.
cpk to crd-vdp.
jgd to jmm-cbh.
vgh to cqm-dlp.
gbq to hsq-nkv.
grx to lsn-skb.
flm to tts-dgc.
ppr to xcx-rfh.
vdp to hvv-vdb.
gkn to pgk-kgk.
xda to bnb-jvh.
mnl to pcj-gnh.
mgb to prb-dvg.
fbb to bvq-ghq.
ntj to lxp-djg.
pqq to nvt-xqt.
tqp to tvg-fmv.
lqk to bpc-hsx.
mtg to tsm-pxb.
vsf to lxm-xvt.
hjb to bmg-pcx.
vmj to gxl-smk.
cxb to qlf-sjp.
hcp to ssf-khn.
qlh to hsx-bpc.
nfg to tvg-fmv.
pkb to lhh-hkj.
brg to djg-lxp.
tlq to kxm-gbv.
ddg to drm-vhc.
bqm to nvx-klt.
ktx to ljp-dvh.
xts to dhq-brj.
tfg to vqv-hmk.
jcd to vsf-jjx.
vfm to mpf-vmm.
lgj to njc-njc.
pqb to bgp-mxh.
cbn to lvx-fnt.
fcl to nqh-txn.
jnh to rkp-qdf.
lht to jkt-kkm.
mjd to pdc-prv.
qgt to xnh-nms.
kst to xrq-vbn.
kdv to fpb-qgt.
hfp to nnk-mbp.
bjk to ppr-rhs.
xxm to mfd-cpk.
qlt to pqt-ngr.
hmj to lht-vmg.
xdr to tcg-ntl.
nnk to tfk-ndf.
vjc to nsr-nvg.
mmm to qlf-sjp.
bnb to xkx-jkm.
ljg to vjc-sfg.
qqt to srf-xxm.
jpm to hsr-fvp.
gnq to fbg-tpp.
pjb to vcd-dvp.
nkp to klt-nvx.
gjc to ltb-bld.
mrf to dhq-brj.
srf to cpk-mfd.
fss to vxj-dhg.
xxz to tvj-rvq.
ndd to rgn-lsj.
tqd to khm-bxb.
xjb to pxb-tsm.
lsj to xch-klm.
jbj to jgd-hfh.
dms to qnr-pfv.
dlf to mkc-mkj.
hnn to ftt-gjc.
vxm to mqc-mmt.
lmm to tkv-bpl.
bmg to bjk-lpd.
qgj to lsn-skb.
frt to njx-krf.
skn to dht-dbm.
lbd to jxx-mdn.
kfk to jkl-jcl.
rrh to bdm-qqp.
nrl to chk-vxm.
lcx to vjs-jgt.
cnr to gbq-qdp.
tgn to pqb-vdt.
grt to dbj-dlx.
fdh to ntr-ntr.
crd to vdb-hvv.
dmm to pjq-sks.
vhc to pgx-dgb.
ftd to qdb-qhq.
npc to mgl-vgq.
prv to vcg-cqn.
tsm to pmc-hpd.
cqm to xxj-nbn.
bnr to pml-qhd.
nsp to cbr-gqq.
tjk to prv-pdc.
mst to knl-dvl.
vmp to jff-pqg.
tdf to jnh-clp.
mqc to hvj-fln.
vpt to bnx-jcc.
gkp to phl-tfg.
jjx to xvt-lxm.
mmt to fln-hvj.
crp to hfh-jgd.
dbm to krp-npc.
lqv to vgb-fdr.
xrf to gfv-phk.
rrq to tqf-hqm.
rxf to rcl-hqf.
jrn to pjb-sqq.
jtd to skn-hhj.
htp to jtr-vcl.
jmm to ftd-jjq.
mbl to nnd-tpt.
rcl to mnm-vhl.
lgs to qvf-gnk.
csc to cnr-rql.
mfc to bhp-tdf.
hsx to hsp-vbt.
gbv to rdn-xps.
vxj to qhv-lqp.
jkm to xjj-gmc.
mts to krk-hjb.
qdb to drk-src.
ggj to dnf-pvp.
xxt to xnk-fbf.
xsm to xqt-nvt.
qqm to xjb-mtg.
kdq to qlh-lqk.
hnb to tmh-ssp.
frj to vxj-dhg.
pql to lbn-cpb.
sks to ghf-fjf.
dlc to jkq-jkk.
jmc to gjg-xxz.
stp to gfv-phk.
qnp to lcx-xkh.
klf to cjj-lgs.
xsa to pqq-xsm.
ktv to rgn-lsj.
fdr to skd-vss.
pch to grt-txj.
ktl to xdr-fgt.
lbb to nrl-dsc.
xkv to jbj-crp.
khj to jff-pqg.
ngf to xrb-dgt.
dvh to qlj-sgp.
mrm to txn-nqh.
tgm to lgj-bxx.
mkk to rfx-flk.
rlt to fbh-lgl.
gxs to htp-blc.
xkx to gmc-xjj.
vmv to xpd-tjs.
mgl to ltx-tlf.
njc to nks-nks.
clp to qdf-rkp.
smk to nkj-gxx.
kpm to gvn-vrx.
bcq to tbd-qsg.
tpt to lbf-dgp.
cfa to frm-pql.
kvb to tgs-kdv.
bdm to cgm-tch.
jjp to cdc-nxl.
pmc to jxr-snt.
pgx to hcp-nqn.
lbc to rdc-hmj.
mbv to dbx-ddq.
kxv to lgs-cjj.
djt to dlp-cqm.
ldr to lft-hnb.
gxl to nkj-gxx.
smn to qxj-dtc.
dcj to gkp-fmb.
gdn to ktx-hfc.
kgk to phn-kln.
vbj to fbb-fxs.
ddq to qsr-hxj.
kjc to cbg-dmm.
blc to vcl-jtr.
qnr to lqv-tnh.
krf to trn-mhn.
jff to qmc-xtq.
mpk to plv-xhm.
pkc to ttf-snq.
vrn to fbh-fbh.
dvl to vqq-ksl.
xtd to kmx-dkl.
vdb to mxn-jpg.
fmv to rgr-ksv.
hmn to ddq-dbx.
trn to pkc-kph.
gkg to qpn-gsf.
mdp to mrm-fcl.
dhg to qhv-lqp.
bdb to nsv-bkm.
hph to drr-drr.
bkx to kng-nqt.
kvh to ktp-mjt.
vdn to glx-ltr.
tfk to cxb-mmm.
cqd to ntr-rkk.
hhj to dbm-dht.
vhv to nnk-mbp.
fbf to jnl-qfh.
pkx to btd-vdn.
phk to xbv-lbb.
qmh to klg-hfl.
shl to jcc-bnx.
fnt to jct-fpx.
hnf to nch-sgs.
lbv to lcx-xkh.
mkj to sfd-vlf.
ccl to rrr-qlt.
rsm to hkj-lhh.
hfc to ljp-dvh.
mxh to ktd-hft.
pvc to lgj-bxx.
mnj to hnn-hdx.
dhk to ddg-rbc.
jcl to frt-cvl.
fsg to ngp-mnj.
phl to hmk-vqv.
gfv to xbv-lbb.
txn to bkx-vsr.
gjq to dbb-mkk.
xcx to tkh-plf.
mht to knf-mst.
kdl to frj-fss.
mnm to jjp-hbf.
xmg to bjs-xkd.
qhq to drk-src.
dvc to ccx-xgp.
qqs to mhm-dpm.
tvg to ksv-rgr.
cgm to qtl-rrq.
qfr to rhc-xkv.
vlf to xsp-sds.
dnf to ghb-sgj.
qhv to sng-vvm.
rvt to hgj-rtp.
rgn to xch-klm.
qmc to flq-ccl.
tjp to vdt-pqb.
qkb to tdk-cxj.
snd to gkp-fmb.
cpc to qcs-vmd.
khn to llf-frv.
qlf to bgg-qnt.
vjs to fdt-vdd.
fnj to gpl-tkr.
mxn to gnq-qkp.
bqj to vmv-qfp.
npk to nks-dhs.
hja to xmg-svm.
hqm to fnj-gjt.
dvp to dcj-snd.
bcx to rkr-nth.
bhg to xxm-srf.
hsq to gtc-ncp.
txm to mnl-shc.
pqt to csc-xgc.
njf to qkl-hdk.
mgv to vpt-shl.
tkr to pgq-jcd.
lgl to sbh-mpz.
phn to hrp-jpm.
lbn to gdn-dfx.
jcc to tsx-tlq.
dxj to shx-chb.
khm to kdq-jsj.
xrb to bcq-mlx.
pcj to sfq-jxk.
dvs to xjb-mtg.
pck to chb-shx.
ttc to vjf-lbc.
pkd to vjc-sfg.
ghm to hph-hph.
chb to prj-txm.
qsr to kdl-srr.
tcg to dhk-pts.
ngr to csc-xgc.
vgq to ltx-tlf.
jqr to gmv-bgt.
tqh to cpc-xdd.
kkm to mdv-qpp.
lss to cbr-gqq.
dvg to ktv-ndd.
tbd to khj-vmp.
prd to mdn-jxx.
gpl to pgq-jcd.
tkv to gqc-dms.
rkc to srd-kjc.
qsl to dgl-frh.
jxr to rmt-qfr.
cfl to mst-knf.
bjv to rhv-kvb.
psr to jdf-xkt.
hpa to rvq-tvj.
qdf to ldq-xxn.
glb to grt-txj.
bpc to hsp-vbt.
flv to sxh-ptr.
jtr to mtc-pdn.
qcs to ctf-sfm.
srr to fss-frj.
dpm to hfp-vhv.
pdn to pbm-tgr.
vcd to dcj-snd.
kbj to lmt-vmc.
rhc to crp-jbj.
dgp to dmd-pps.
hvv to mxn-jpg.
lth to dxt-cld.
xtv to qsn-qlk.
cbr to mbv-hmn.
cdr to hnb-lft.
ghq to vsq-qsh.
tdc to nth-rkr.
xtq to flq-ccl.
gmc to cxc-pkx.
pgk to phn-kln.
nth to ngn-kvd.
pkh to pmj-mfc.
jdn to hnf-bfd.
fbh to sbh-sbh.
jdd to fgt-xdr.
hkj to xrf-stp.
klt to mgs-jsk.
ghd to hjb-krk.
hrp to fvp-hsr.
ptr to pnc-jdt.
ljp to sgp-qlj.
jvt to ttk-kbc.
zzz to vmm-mpf.
btd to glx-ltr.
gtc to qkb-hmr.
ndf to cxb-mmm.
dgb to nqn-hcp.
jsj to qlh-lqk.
nbb to kqv-qph.
xgc to rql-cnr.
qhd to grx-qgj.
rfx to fpj-bnv.
lpn to ncb-sdh.
nvg to pch-glb.

800
08/input.txt Normal file
View File

@@ -0,0 +1,800 @@
LRLRRRLRRRLLLRLRRLLRLRRRLRLRRRLRLRRRLRLRRRLRRRLRLLRRRLRLRLRRLRRLRLRRLRRLRRLLRRRLRRRLRRLRRLRRLRRRLLRRLRLRRLRLRRLRRLRLRRLRRLLRLRRRLRRLRRRLLRLRLRLLRLLRLLRLRRLLRRLRLRLRRLRLLRRRLLRRRLRRLLRRRLRRRLRLRRRLLRRRLRLRRRLLLRRRLRLRLRRRLRRRLRRRLRLRRLLLRRLRRRLLRLRRRLRLRLLLRRLRLRRRLRLRRRR
GNK = (LBV, QNP)
PJQ = (GHF, FJF)
KLM = (TTR, BQL)
LDT = (FXS, FBB)
TKH = (NBH, JRN)
QND = (KJC, SRD)
SNG = (BQP, LXN)
GMS = (JDN, NKM)
NTL = (PTS, DHK)
NBN = (FFD, PRL)
NCP = (QKB, HMR)
NQT = (RDK, BHC)
TDK = (GHM, GHM)
BJS = (TGC, GBJ)
XNH = (GGJ, TKL)
NKV = (GTC, NCP)
HFL = (LQQ, RVT)
HKC = (BQM, NKP)
KCH = (GJG, GJG)
MFD = (CRD, VDP)
FNZ = (XSM, PQQ)
NVT = (TDN, JVT)
PCQ = (HLD, BKQ)
GPF = (MNJ, NGP)
PCX = (LPD, BJK)
CCG = (TTS, TTS)
BGG = (TQP, NFG)
HSP = (DVS, QQM)
TSX = (GBV, KXM)
RKK = (BNC, FNZ)
HVJ = (RPD, MGB)
CXC = (BTD, VDN)
NBH = (SQQ, PJB)
CQN = (SRV, MCF)
LPD = (PPR, RHS)
BKM = (FJV, XTV)
KQV = (PCK, DXJ)
VCL = (PDN, MTC)
JVS = (QQP, BDM)
MJT = (JCX, NRR)
VSR = (NQT, KNG)
NKM = (HNF, BFD)
HGJ = (BNT, KFK)
VMC = (QND, RKC)
DJG = (PRD, LBD)
JCT = (NFM, NJF)
FPX = (NJF, NFM)
HPD = (SNT, JXR)
QLK = (KXV, KLF)
HMR = (TDK, CXJ)
RQL = (QDP, GBQ)
VDT = (BGP, MXH)
PFV = (TNH, LQV)
TTF = (FLV, SKM)
QKL = (JNB, SKX)
RXC = (QFP, VMV)
NGJ = (QPN, GSF)
MPZ = (JVH, BNB)
FPB = (XNH, NMS)
LQP = (SNG, VVM)
HQF = (MNM, VHL)
XXJ = (PRL, FFD)
KPH = (TTF, SNQ)
JDT = (KCH, JMC)
KRK = (PCX, BMG)
FJV = (QLK, QSN)
MPG = (LJG, PKD)
TCH = (RRQ, QTL)
SDS = (JQR, BXR)
RKR = (KVD, NGN)
TVJ = (XGS, PCQ)
VSQ = (NHP, QQS)
RDK = (XTD, MHB)
SGP = (PRP, XJD)
SVN = (BKM, NSV)
SJC = (DGL, FRH)
NJX = (TRN, MHN)
RCG = (BSN, DQR)
HXJ = (KDL, SRR)
BQZ = (PQL, FRM)
NKS = (SHM, SHM)
FPJ = (STM, CTN)
SFM = (PVC, TGM)
VSS = (MGV, JLS)
DGL = (NBB, BST)
XRQ = (LPN, MKF)
RSZ = (SVM, XMG)
TTK = (KST, MGQ)
FJF = (CRC, RXF)
CMT = (HPH, KPL)
SDR = (LTD, TVK)
BST = (KQV, QPH)
DGT = (BCQ, MLX)
QPN = (MMD, LKL)
SHM = (FRM, PQL)
XDD = (QCS, VMD)
SNQ = (FLV, SKM)
TLF = (QTC, GRK)
CPB = (DFX, GDN)
BRJ = (LDR, CDR)
JNL = (JTD, SMV)
FTG = (VRN, VRN)
GBJ = (VGH, DJT)
TGS = (FPB, QGT)
MHB = (DKL, KMX)
GNH = (SFQ, JXK)
LTD = (XJQ, MBL)
PCR = (JDD, KTL)
DMD = (KHC, KVH)
FTT = (LTB, BLD)
LMT = (RKC, QND)
JGT = (FDT, VDD)
MDV = (XTS, MRF)
PLV = (KXC, CNM)
PRJ = (SHC, MNL)
PML = (GRX, QGJ)
VVM = (LXN, BQP)
NGN = (GBG, XJX)
VCG = (SRV, MCF)
QFP = (TJS, XPD)
LVX = (FPX, JCT)
RBC = (DRM, VHC)
XKT = (CCG, FLM)
SDH = (BNF, GKN)
BVQ = (QSH, VSQ)
SMV = (SKN, HHJ)
DBD = (RSM, PKB)
DQR = (HVS, DVC)
MNK = (DXT, CLD)
FFD = (DLF, JPQ)
GBG = (TKP, KPM)
CHK = (MMT, MQC)
BXR = (GMV, BGT)
SFD = (XSP, SDS)
PRT = (HDB, RCG)
QXJ = (QQT, BHG)
TGR = (TQD, TJM)
GJG = (RVQ, TVJ)
BFD = (SGS, NCH)
PND = (BPL, TKV)
JPG = (GNQ, QKP)
FDT = (NPF, SFF)
DLX = (XVP, BNR)
SNT = (QFR, RMT)
DND = (TVK, LTD)
SSF = (LLF, FRV)
DRK = (FTG, LBT)
VQV = (JVS, RRH)
XBV = (DSC, NRL)
CVL = (KRF, NJX)
XGP = (BQJ, RXC)
MLX = (TBD, QSG)
JDF = (CCG, CCG)
GVN = (SCN, PKH)
NCB = (GKN, BNF)
LLF = (PND, LMM)
SHX = (TXM, PRJ)
KNL = (KSL, VQQ)
JSK = (SQD, MPG)
PPS = (KHC, KVH)
NKJ = (DBD, RFB)
CNM = (FCB, DHP)
TXJ = (DBJ, DLX)
QSH = (QQS, NHP)
BRC = (PLN, GMS)
BHP = (JNH, CLP)
BQL = (SDR, DND)
TGC = (VGH, DJT)
MHM = (VHV, HFP)
NGP = (HNN, HDX)
SKM = (SXH, PTR)
TFN = (SMK, GXL)
NSR = (GLB, PCH)
RHS = (XCX, RFH)
BNC = (PQQ, XSM)
XJX = (KPM, TKP)
LFT = (TMH, SSP)
KVD = (XJX, GBG)
SKX = (NGF, NTC)
CKQ = (FCL, MRM)
MTC = (PBM, TGR)
RHV = (TGS, KDV)
MMD = (VMJ, TFN)
PSM = (XDK, GSG)
KXM = (RDN, XPS)
PLN = (NKM, JDN)
HDK = (SKX, JNB)
XGS = (HLD, BKQ)
FMB = (PHL, TFG)
LHH = (XRF, STP)
LTB = (TDC, BCX)
FRV = (LMM, PND)
GRK = (FDH, CQD)
NRR = (HNS, KBJ)
BGT = (LDT, VBJ)
SRD = (CBG, DMM)
KNF = (DVL, KNL)
KXC = (FCB, DHP)
GHB = (NNJ, QMH)
PGQ = (JJX, VSF)
SKB = (XXT, NTM)
LXP = (PRD, LBD)
PRL = (JPQ, DLF)
FRM = (LBN, CPB)
KSL = (FPT, TTC)
CRC = (RCL, HQF)
SVM = (BJS, XKD)
PXB = (PMC, HPD)
JPQ = (MKJ, MKC)
TTR = (DND, SDR)
CBH = (FTD, JJQ)
XPS = (NSP, LSS)
KMX = (QSL, SJC)
CLD = (MDP, CKQ)
GXV = (MKK, DBB)
BQP = (TQH, LKN)
FTB = (GJQ, GXV)
KPL = (DRR, RSZ)
MKF = (SDH, NCB)
SSP = (CBN, XCF)
XJQ = (NND, TPT)
NTT = (NDJ, QFB)
PLF = (NBH, JRN)
XDK = (GPF, FSG)
NTC = (DGT, XRB)
SGJ = (QMH, NNJ)
TNH = (VGB, FDR)
DFX = (HFC, KTX)
DBJ = (XVP, BNR)
VDD = (SFF, NPF)
JKL = (FRT, CVL)
XSP = (BXR, JQR)
DBP = (PSR, LJS)
KHC = (MJT, KTP)
TKP = (VRX, GVN)
DKL = (SJC, QSL)
DLP = (XXJ, NBN)
KLN = (HRP, JPM)
TPP = (NHJ, PCR)
QVF = (QNP, LBV)
VMD = (CTF, SFM)
NFM = (QKL, HDK)
MCF = (BJV, JXL)
PQG = (XTQ, QMC)
BGP = (HFT, KTD)
PTS = (DDG, RBC)
JLS = (SHL, VPT)
DHT = (NPC, KRP)
TJM = (KHM, BXB)
TRH = (NDJ, QFB)
CTF = (PVC, TGM)
PMJ = (BHP, TDF)
AAA = (MPF, VMM)
XCF = (LVX, FNT)
FRH = (BST, NBB)
QLL = (HDB, RCG)
XVP = (QHD, PML)
BNX = (TLQ, TSX)
BXB = (JSJ, KDQ)
FPT = (LBC, VJF)
FCB = (TJK, MJD)
KNG = (RDK, BHC)
DBB = (RFX, FLK)
LQQ = (RTP, HGJ)
LBT = (VRN, RLT)
XKD = (GBJ, TGC)
LKN = (XDD, CPC)
XHM = (CNM, KXC)
DTC = (QQT, BHG)
BPL = (DMS, GQC)
QPP = (MRF, XTS)
PRK = (NKP, BQM)
MGS = (MPG, SQD)
STM = (MTS, GHD)
SKD = (MGV, JLS)
QPH = (DXJ, PCK)
HDB = (DQR, BSN)
DSC = (VXM, CHK)
TQF = (GJT, FNJ)
FXS = (GHQ, BVQ)
SFF = (HKC, PRK)
DRR = (XMG, SVM)
RKP = (XXN, LDQ)
NNJ = (KLG, HFL)
VJF = (HMJ, RDC)
LXN = (TQH, LKN)
CXJ = (GHM, CMT)
HMC = (GMS, PLN)
LJS = (JDF, XKT)
XCH = (TTR, BQL)
LKG = (QXJ, DTC)
QFB = (MHT, CFL)
RDN = (LSS, NSP)
DHS = (SHM, BQZ)
NKT = (GSG, XDK)
MCH = (HTP, BLC)
NVX = (MGS, JSK)
QTC = (FDH, FDH)
NND = (DGP, LBF)
GJV = (XHM, PLV)
GSG = (FSG, GPF)
BNV = (STM, CTN)
LDQ = (MCH, GXS)
MHN = (KPH, PKC)
LBF = (PPS, DMD)
QDP = (NKV, HSQ)
MPF = (MNK, LTH)
DHQ = (CDR, LDR)
VMM = (MNK, LTH)
HFT = (BRC, HMC)
LTR = (NKT, PSM)
HDX = (GJC, FTT)
GHF = (RXF, CRC)
BKQ = (FTB, HJH)
BXX = (NJC, NPK)
FVP = (BRG, NTJ)
RDC = (LHT, VMG)
JKT = (QPP, MDV)
PVP = (GHB, SGJ)
XXN = (GXS, MCH)
SHC = (GNH, PCJ)
GSF = (LKL, MMD)
KRP = (MGL, VGQ)
JXK = (TGN, TJP)
MGQ = (XRQ, VBN)
FLN = (MGB, RPD)
DHP = (MJD, TJK)
SQQ = (DVP, VCD)
HFH = (CBH, JMM)
MBP = (NDF, TFK)
KLG = (RVT, LQQ)
NPF = (PRK, HKC)
NMS = (GGJ, TKL)
QQP = (CGM, TCH)
SFG = (NVG, NSR)
RVQ = (XGS, PCQ)
SQD = (PKD, LJG)
JCX = (HNS, KBJ)
QSN = (KXV, KLF)
GLX = (NKT, PSM)
TJS = (GJV, MPK)
QLJ = (XJD, PRP)
NSV = (FJV, XTV)
GXX = (RFB, DBD)
HSR = (BRG, NTJ)
HBF = (CDC, NXL)
XSS = (PSR, LJS)
QTL = (TQF, HQM)
TKL = (DNF, PVP)
BRK = (JKQ, JKK)
SCN = (MFC, PMJ)
GMV = (VBJ, LDT)
HNS = (LMT, VMC)
RGR = (NTT, TRH)
PNC = (KCH, KCH)
XNK = (JNL, QFH)
RRR = (PQT, NGR)
TDN = (KBC, TTK)
NQN = (KHN, SSF)
HMK = (RRH, JVS)
RFB = (PKB, RSM)
SFQ = (TGN, TJP)
JKQ = (SVN, BDB)
CTN = (MTS, GHD)
QNT = (TQP, NFG)
VHL = (JJP, HBF)
RFH = (PLF, TKH)
KTD = (BRC, HMC)
VRX = (SCN, PKH)
BNT = (JKL, JCL)
MDN = (DLC, BRK)
CBG = (SKS, PJQ)
QFH = (JTD, SMV)
HVS = (XGP, CCX)
NQH = (BKX, VSR)
GQQ = (MBV, HMN)
LSN = (NTM, XXT)
FLQ = (RRR, QLT)
LXM = (PRT, QLL)
HJH = (GXV, GJQ)
SRV = (JXL, BJV)
TMH = (XCF, CBN)
PRB = (KTV, NDD)
JJQ = (QHQ, QDB)
KSV = (NTT, TRH)
XKH = (VJS, JGT)
SJP = (QNT, BGG)
NTR = (BNC, BNC)
PBM = (TJM, TQD)
RPD = (DVG, PRB)
XPD = (MPK, GJV)
NCH = (GKG, NGJ)
KTP = (JCX, NRR)
GQC = (QNR, PFV)
MKC = (VLF, SFD)
NTM = (FBF, XNK)
TVK = (MBL, XJQ)
RMT = (XKV, RHC)
NHP = (DPM, MHM)
JNB = (NGF, NTC)
RTP = (BNT, KFK)
GJT = (TKR, GPL)
TTS = (VFM, VFM)
FLK = (BNV, FPJ)
CJJ = (QVF, GNK)
QKP = (FBG, TPP)
XQT = (JVT, TDN)
JVH = (XKX, JKM)
NDJ = (CFL, MHT)
JXX = (BRK, DLC)
XJD = (SMN, LKG)
JXL = (KVB, RHV)
VMG = (KKM, JKT)
FBG = (NHJ, PCR)
LKL = (VMJ, TFN)
NXL = (XSS, DBP)
SRC = (FTG, LBT)
PDC = (CQN, VCG)
BLD = (TDC, BCX)
NHJ = (KTL, JDD)
DGC = (VFM, ZZZ)
LTX = (QTC, GRK)
CCX = (BQJ, RXC)
DRM = (DGB, PGX)
VQQ = (TTC, FPT)
BHC = (XTD, MHB)
CDC = (DBP, XSS)
SXH = (PNC, PNC)
KBC = (KST, MGQ)
DXT = (CKQ, MDP)
PRP = (SMN, LKG)
SGS = (NGJ, GKG)
VBN = (LPN, MKF)
BNF = (KGK, PGK)
HLD = (FTB, HJH)
FGT = (TCG, NTL)
VBT = (DVS, QQM)
XVT = (QLL, PRT)
SBH = (BNB, JVH)
VGB = (VSS, SKD)
XJJ = (CXC, PKX)
JKK = (BDB, SVN)
BSN = (HVS, DVC)
DBX = (QSR, HXJ)
QSG = (KHJ, VMP)
CPK = (CRD, VDP)
JGD = (JMM, CBH)
VGH = (CQM, DLP)
GBQ = (HSQ, NKV)
GRX = (LSN, SKB)
FLM = (TTS, DGC)
PPR = (XCX, RFH)
VDP = (HVV, VDB)
GKN = (PGK, KGK)
XDA = (BNB, JVH)
MNL = (PCJ, GNH)
MGB = (PRB, DVG)
FBB = (BVQ, GHQ)
NTJ = (LXP, DJG)
PQQ = (NVT, XQT)
TQP = (TVG, FMV)
LQK = (BPC, HSX)
MTG = (TSM, PXB)
VSF = (LXM, XVT)
HJB = (BMG, PCX)
VMJ = (GXL, SMK)
CXB = (QLF, SJP)
HCP = (SSF, KHN)
QLH = (HSX, BPC)
NFG = (TVG, FMV)
PKB = (LHH, HKJ)
BRG = (DJG, LXP)
TLQ = (KXM, GBV)
DDG = (DRM, VHC)
BQM = (NVX, KLT)
KTX = (LJP, DVH)
XTS = (DHQ, BRJ)
TFG = (VQV, HMK)
JCD = (VSF, JJX)
VFM = (MPF, VMM)
LGJ = (NJC, NJC)
PQB = (BGP, MXH)
CBN = (LVX, FNT)
FCL = (NQH, TXN)
JNH = (RKP, QDF)
LHT = (JKT, KKM)
MJD = (PDC, PRV)
QGT = (XNH, NMS)
KST = (XRQ, VBN)
KDV = (FPB, QGT)
HFP = (NNK, MBP)
BJK = (PPR, RHS)
XXM = (MFD, CPK)
QLT = (PQT, NGR)
HMJ = (LHT, VMG)
XDR = (TCG, NTL)
NNK = (TFK, NDF)
VJC = (NSR, NVG)
MMM = (QLF, SJP)
BNB = (XKX, JKM)
LJG = (VJC, SFG)
QQT = (SRF, XXM)
JPM = (HSR, FVP)
GNQ = (FBG, TPP)
PJB = (VCD, DVP)
NKP = (KLT, NVX)
GJC = (LTB, BLD)
MRF = (DHQ, BRJ)
SRF = (CPK, MFD)
FSS = (VXJ, DHG)
XXZ = (TVJ, RVQ)
NDD = (RGN, LSJ)
TQD = (KHM, BXB)
XJB = (PXB, TSM)
LSJ = (XCH, KLM)
JBJ = (JGD, HFH)
DMS = (QNR, PFV)
DLF = (MKC, MKJ)
HNN = (FTT, GJC)
VXM = (MQC, MMT)
LMM = (TKV, BPL)
BMG = (BJK, LPD)
QGJ = (LSN, SKB)
FRT = (NJX, KRF)
SKN = (DHT, DBM)
LBD = (JXX, MDN)
KFK = (JKL, JCL)
RRH = (BDM, QQP)
NRL = (CHK, VXM)
LCX = (VJS, JGT)
CNR = (GBQ, QDP)
TGN = (PQB, VDT)
GRT = (DBJ, DLX)
FDH = (NTR, NTR)
CRD = (VDB, HVV)
DMM = (PJQ, SKS)
VHC = (PGX, DGB)
FTD = (QDB, QHQ)
NPC = (MGL, VGQ)
PRV = (VCG, CQN)
TSM = (PMC, HPD)
CQM = (XXJ, NBN)
BNR = (PML, QHD)
NSP = (CBR, GQQ)
TJK = (PRV, PDC)
MST = (KNL, DVL)
VMP = (JFF, PQG)
TDF = (JNH, CLP)
MQC = (HVJ, FLN)
VPT = (BNX, JCC)
GKP = (PHL, TFG)
JJX = (XVT, LXM)
MMT = (FLN, HVJ)
CRP = (HFH, JGD)
DBM = (KRP, NPC)
LQV = (VGB, FDR)
XRF = (GFV, PHK)
RRQ = (TQF, HQM)
RXF = (RCL, HQF)
JRN = (PJB, SQQ)
JTD = (SKN, HHJ)
HTP = (JTR, VCL)
JMM = (FTD, JJQ)
MBL = (NND, TPT)
RCL = (MNM, VHL)
LGS = (QVF, GNK)
CSC = (CNR, RQL)
MFC = (BHP, TDF)
HSX = (HSP, VBT)
GBV = (RDN, XPS)
VXJ = (QHV, LQP)
JKM = (XJJ, GMC)
MTS = (KRK, HJB)
QDB = (DRK, SRC)
GGJ = (DNF, PVP)
XXT = (XNK, FBF)
XSM = (XQT, NVT)
QQM = (XJB, MTG)
KDQ = (QLH, LQK)
HNB = (TMH, SSP)
FRJ = (VXJ, DHG)
PQL = (LBN, CPB)
SKS = (GHF, FJF)
DLC = (JKQ, JKK)
JMC = (GJG, XXZ)
STP = (GFV, PHK)
QNP = (LCX, XKH)
KLF = (CJJ, LGS)
XSA = (PQQ, XSM)
KTV = (RGN, LSJ)
FDR = (SKD, VSS)
PCH = (GRT, TXJ)
KTL = (XDR, FGT)
LBB = (NRL, DSC)
XKV = (JBJ, CRP)
KHJ = (JFF, PQG)
NGF = (XRB, DGT)
DVH = (QLJ, SGP)
MRM = (TXN, NQH)
TGM = (LGJ, BXX)
MKK = (RFX, FLK)
RLT = (FBH, LGL)
GXS = (HTP, BLC)
XKX = (GMC, XJJ)
VMV = (XPD, TJS)
MGL = (LTX, TLF)
NJC = (NKS, NKS)
CLP = (QDF, RKP)
SMK = (NKJ, GXX)
KPM = (GVN, VRX)
BCQ = (TBD, QSG)
TPT = (LBF, DGP)
CFA = (FRM, PQL)
KVB = (TGS, KDV)
BDM = (CGM, TCH)
JJP = (CDC, NXL)
PMC = (JXR, SNT)
PGX = (HCP, NQN)
LBC = (RDC, HMJ)
MBV = (DBX, DDQ)
KXV = (LGS, CJJ)
DJT = (DLP, CQM)
LDR = (LFT, HNB)
GXL = (NKJ, GXX)
SMN = (QXJ, DTC)
DCJ = (GKP, FMB)
GDN = (KTX, HFC)
KGK = (PHN, KLN)
VBJ = (FBB, FXS)
DDQ = (QSR, HXJ)
KJC = (CBG, DMM)
BLC = (VCL, JTR)
QNR = (LQV, TNH)
KRF = (TRN, MHN)
JFF = (QMC, XTQ)
MPK = (PLV, XHM)
PKC = (TTF, SNQ)
VRN = (FBH, FBH)
DVL = (VQQ, KSL)
XTD = (KMX, DKL)
VDB = (MXN, JPG)
FMV = (RGR, KSV)
HMN = (DDQ, DBX)
TRN = (PKC, KPH)
GKG = (QPN, GSF)
MDP = (MRM, FCL)
DHG = (QHV, LQP)
BDB = (NSV, BKM)
HPH = (DRR, DRR)
BKX = (KNG, NQT)
KVH = (KTP, MJT)
VDN = (GLX, LTR)
TFK = (CXB, MMM)
CQD = (NTR, RKK)
HHJ = (DBM, DHT)
VHV = (NNK, MBP)
FBF = (JNL, QFH)
PKX = (BTD, VDN)
PHK = (XBV, LBB)
QMH = (KLG, HFL)
SHL = (JCC, BNX)
FNT = (JCT, FPX)
HNF = (NCH, SGS)
LBV = (LCX, XKH)
MKJ = (SFD, VLF)
CCL = (RRR, QLT)
RSM = (HKJ, LHH)
HFC = (LJP, DVH)
MXH = (KTD, HFT)
PVC = (LGJ, BXX)
MNJ = (HNN, HDX)
DHK = (DDG, RBC)
JCL = (FRT, CVL)
FSG = (NGP, MNJ)
PHL = (HMK, VQV)
GFV = (XBV, LBB)
TXN = (BKX, VSR)
GJQ = (DBB, MKK)
XCX = (TKH, PLF)
MHT = (KNF, MST)
KDL = (FRJ, FSS)
MNM = (JJP, HBF)
XMG = (BJS, XKD)
QHQ = (DRK, SRC)
DVC = (CCX, XGP)
QQS = (MHM, DPM)
TVG = (KSV, RGR)
CGM = (QTL, RRQ)
QFR = (RHC, XKV)
VLF = (XSP, SDS)
DNF = (GHB, SGJ)
QHV = (SNG, VVM)
RVT = (HGJ, RTP)
RGN = (XCH, KLM)
QMC = (FLQ, CCL)
TJP = (VDT, PQB)
QKB = (TDK, CXJ)
SND = (GKP, FMB)
CPC = (QCS, VMD)
KHN = (LLF, FRV)
QLF = (BGG, QNT)
VJS = (FDT, VDD)
FNJ = (GPL, TKR)
MXN = (GNQ, QKP)
BQJ = (VMV, QFP)
NPK = (NKS, DHS)
HJA = (XMG, SVM)
HQM = (FNJ, GJT)
DVP = (DCJ, SND)
BCX = (RKR, NTH)
BHG = (XXM, SRF)
HSQ = (GTC, NCP)
TXM = (MNL, SHC)
PQT = (CSC, XGC)
NJF = (QKL, HDK)
MGV = (VPT, SHL)
TKR = (PGQ, JCD)
LGL = (SBH, MPZ)
PHN = (HRP, JPM)
LBN = (GDN, DFX)
JCC = (TSX, TLQ)
DXJ = (SHX, CHB)
KHM = (KDQ, JSJ)
XRB = (BCQ, MLX)
PCJ = (SFQ, JXK)
DVS = (XJB, MTG)
PCK = (CHB, SHX)
TTC = (VJF, LBC)
PKD = (VJC, SFG)
GHM = (HPH, HPH)
CHB = (PRJ, TXM)
QSR = (KDL, SRR)
TCG = (DHK, PTS)
NGR = (CSC, XGC)
VGQ = (LTX, TLF)
JQR = (GMV, BGT)
TQH = (CPC, XDD)
KKM = (MDV, QPP)
LSS = (CBR, GQQ)
DVG = (KTV, NDD)
TBD = (KHJ, VMP)
PRD = (MDN, JXX)
GPL = (PGQ, JCD)
TKV = (GQC, DMS)
RKC = (SRD, KJC)
QSL = (DGL, FRH)
JXR = (RMT, QFR)
CFL = (MST, KNF)
BJV = (RHV, KVB)
PSR = (JDF, XKT)
HPA = (RVQ, TVJ)
QDF = (LDQ, XXN)
GLB = (GRT, TXJ)
BPC = (HSP, VBT)
FLV = (SXH, PTR)
JTR = (MTC, PDN)
QCS = (CTF, SFM)
SRR = (FSS, FRJ)
DPM = (HFP, VHV)
PDN = (PBM, TGR)
VCD = (DCJ, SND)
KBJ = (LMT, VMC)
RHC = (CRP, JBJ)
DGP = (DMD, PPS)
HVV = (MXN, JPG)
LTH = (DXT, CLD)
XTV = (QSN, QLK)
CBR = (MBV, HMN)
CDR = (HNB, LFT)
GHQ = (VSQ, QSH)
TDC = (NTH, RKR)
XTQ = (FLQ, CCL)
GMC = (CXC, PKX)
PGK = (PHN, KLN)
NTH = (NGN, KVD)
PKH = (PMJ, MFC)
JDN = (HNF, BFD)
FBH = (SBH, SBH)
JDD = (FGT, XDR)
HKJ = (XRF, STP)
KLT = (MGS, JSK)
GHD = (HJB, KRK)
HRP = (FVP, HSR)
PTR = (PNC, JDT)
LJP = (SGP, QLJ)
JVT = (TTK, KBC)
ZZZ = (VMM, MPF)
BTD = (GLX, LTR)
GTC = (QKB, HMR)
NDF = (CXB, MMM)
DGB = (NQN, HCP)
JSJ = (QLH, LQK)
NBB = (KQV, QPH)
XGC = (RQL, CNR)
QHD = (GRX, QGJ)
RFX = (FPJ, BNV)
LPN = (NCB, SDH)
NVG = (PCH, GLB)

16
08/part1.pl Normal file
View File

@@ -0,0 +1,16 @@
:- op(700, xfx, l).
:- op(700, xfx, r).
From l To :- From to To-_.
From r To :- From to _-To.
answer(Answer) :- path([], aaa, Path), length(Path, Answer).
path(_, zzz, []) :- !. % getting full path instead of just length for debugging
path(Directions, From, [Move | Cdr]) :-
next_step(Directions, Move, Remain),
G =.. [Move, From, To], G,
path(Remain, To, Cdr).
next_step([Move | Remain], Move, Remain).
next_step([], Move, Remain) :- direction(Str), atom_chars(Str, [Move | Remain]).

85
08/part2.cheese.pl Normal file
View File

@@ -0,0 +1,85 @@
:- table direction_loop/1.
:- op(700, xfx, l).
:- op(700, xfx, r).
From l To :- From to To-_.
From r To :- From to _-To.
% We want to satisfy {Offset_i + Stride_i*Loops_i + Sub_ij = Z}
answer() :-
starts(Starts),
maplist([S, S-Off-Stride-Loop]>>(zloop([], S, 0, [], Off, Stride, Loop)),
Starts, Events),
maplist(split, Events, EquationSets),
pick(EquationSets, Eqs),
index1(Eqs, IEqs),
write('Find N_i such that: '),
foldl(write_eq, IEqs, _, _),
write('Z\n'),
% foldl(satisfy, EquationsN, _, Answer),
true.
write_eq(I-(A-B-C), _, _) :-
writef('%t + %t*N%t ', [A, B, I]),
(C =\= 0 -> writef('+ %t ', [C]); true),
write('= ').
% satisfy((A-B-C), N, Z, Z) :- natnum(N), Z is A + B*N + C.
% [mma-2-2-[0-mmz], nna-3-6-[0-nnz, 3-nnz]] -> [2-2-0, 3-6-0, 3-6-3]
split(_-_-_-[], []).
split(A-Offset-Stride-[Sub-_ | Loop], [Offset-Stride-Sub | Cdr]) :-
split(A-Offset-Stride-Loop, Cdr).
% Everything above this is not needed to get the input answer
% starts(Starts),
% maplist([S, S-Off-Stride-Loop]>>(zloop([], S, 0, [], Off, Stride, Loop)),
% Starts, Loops).
% then find the LCD of the strides (which are equal to offsets).
zloop(_, _, _, Zs, Offset, Stride, Loop) :-
Zs = [FirstZIndex-Z | _], reverse(Zs, [LastZIndex-Z | ReversedZs]),
DeltaZ is LastZIndex - FirstZIndex, DeltaZ =\= 0,
direction_len(Len),
divmod(DeltaZ, Len, _, 0),
Offset = FirstZIndex, Stride = DeltaZ,
foldl([Idx-Z, NewIdx-Z, Off, Off]>>(NewIdx is Idx - Off),
ReversedZs, ReversedLoop, Offset, _),
reverse(ReversedLoop, Loop),
!.
zloop(Directions, Node, Index, Zs, Offset, Stride, Loop) :-
( is_end(Node)
-> append(Zs, [Index-Node], NewZs)
; NewZs = Zs
),
next_step(Directions, Move, Remain),
G =.. [Move, Node, To], G,
NewIndex is Index + 1,
zloop(Remain, To, NewIndex, NewZs, Offset, Stride, Loop).
starts(Starts) :- findall(X, X to _, Nodes), include(is_start, Nodes, Starts).
is_start(Node) :- atom_chars(Node, [_, _, a]).
is_end(Node) :- atom_chars(Node, [_, _, z]).
next_step([Move | Remain], Move, Remain).
next_step([], Move, Remain) :- direction_list([Move | Remain]).
direction_list(Dir) :- direction(Str), atom_chars(Str, Dir).
direction_len(Len) :- direction_list(D), length(D, Len).
% pick([[1,2,3], [4], [5,6]], X). X = [1,4,5]; X = [1,4,6]; X = [2,4,5]; ...
pick(ListOfLists, Items) :-
maplist([SubList, X]>>(member(X, SubList)), ListOfLists, Items).
index1(L, IL) :- reverse(L, RL), index1r(RL, IRL), reverse(IRL, IL).
index1r([X], [1-X]).
index1r([X, Y | Cdr], [NextI-X, I-Y | ICdr]) :-
index1r([Y | Cdr], [I-Y | ICdr]), NextI is I + 1.
same_elements([_]).
same_elements([X-_, Y-Z2 | Cdr]) :- X =:= Y, same_elements([Y-Z2 | Cdr]).
natnum(0).
natnum(N) :- natnum(N0), N is N0 + 1.

View File

@@ -0,0 +1,86 @@
% :- table step_at/2.
% :- table node_at/3.
:- table reachable_endnode/2.
:- op(700, xfx, l).
:- op(700, xfx, r).
From l To :- From to To-_.
From r To :- From to _-To.
answer(Answer) :-
starts(Starts),
routes(Starts, [Route1 | RestOfRoutes]),
foldl(unify2, RestOfRoutes, Route1, _-(_-Answer-_)).
% unify2 combines 2 routes into one with its own stride-offsets-dests
unify2(Route1, Route2, NewRoute) :-
once(findnsols(2, S, converge(Route1, Route2, S), SolutionPair)),
SolutionPair = [NewA-LenA-NewZ, _-LenB-_],
NewStride is LenB - LenA,
NewRoute = NewA-(NewStride-LenA-[0-NewZ]).
% Len = Stride1*X1 + Offset1 + Dest1 = Stride2*X2 + Offset2 + Dest2
% For performance, Route1's Stride should =< Route2's Stride
converge(Route1, Route2, NewA-Len-NewZ) :-
writef('Combining %t - %t\n', [Route1, Route2]),
Route1 = A1-(Stride1-Offset1-Dests1),
Route2 = A2-(Stride2-Offset2-Dests2),
natnum(X2),
pick([Dests1, Dests2], [Dest1-Z1, Dest2-Z2]),
0 is (Stride2*X2 + Offset2 + Dest2 - Offset1 - Dest1) mod Stride1,
Len is Stride2*X2 + Offset2 + Dest2,
atom_concat(A1, A2, NewA), atom_concat(Z1, Z2, NewZ).
routes(Starts, Routes) :-
maplist([S, S-Route]>>(route(S, Route)), Starts, Routes).
% route builds a route (Stride-Offset-Internals) for a particular starting node.
route(Start, Stride-FirstN-[0-FirstDest | Dests]) :-
direction_len(DirLen),
once(reachable_endnode(Start, FirstN-FirstDest)),
findall(ShiftedN-Dest,
( reachable_endnode(Start, N-Dest),
ShiftedN is N - FirstN,
ShiftedN =\= 0,
(0 is ShiftedN mod DirLen -> !; true)),
TmpDests),
last(TmpDests, Stride-LastDest),
append(Dests, [Stride-LastDest], TmpDests).
% Dest is reachable from Start after N steps
reachable_endnode(Start, N-Dest) :-
natnum(N),
node_at(N, Start, Dest),
is_end(Dest).
starts(Starts) :- findall(X, X to _, Nodes), include(is_start, Nodes, Starts).
is_start(Node) :- atom_chars(Node, [_, _, a]).
is_end(Node) :- atom_chars(Node, [_, _, z]).
% node_at(N, Dir, From, Dest) :- Dest is reached after moving N step from From.
node_at(0, Start, Start).
node_at(N, From, Dest) :-
N > 0,
PrevN is N - 1,
step_at(PrevN, PrevStep),
G =.. [PrevStep, PrevNode, Dest], G,
node_at(PrevN, From, PrevNode).
% Step is the N-th step (counting starts from 0).
step_at(N, Step) :-
direction_list(Dir),
length(Dir, DirLen),
divmod(N, DirLen, _, Remainder),
nth0(Remainder, Dir, Step).
direction_list(Dir) :- direction(Str), atom_chars(Str, Dir).
direction_len(Len) :- direction_list(D), length(D, Len).
% pick one item from each sublist of ListOfLists & put them into Items in order.
% [[1,2,3], [4], [5,6]] -> [1,4,5]; [1,4,6]; [2,4,5]; [2,4,6]; [3,4,5]; [3,4,6].
pick(ListOfLists, Items) :-
maplist([SubList, X]>>(member(X, SubList)), ListOfLists, Items).
natnum(0).
natnum(N) :- natnum(N0), N is N0 + 1.

25
08/part2.naive.pl Normal file
View File

@@ -0,0 +1,25 @@
:- op(700, xfx, l).
:- op(700, xfx, r).
From l To :- From to To-_.
From r To :- From to _-To.
answer(Answer) :- starts(Starts), path([], Starts, Answer).
path(_, EndNodes, []) :- all_ends(EndNodes), !.
path(Directions, FromList, Moves) :-
next_step(Directions, Move, Remain),
maplist(Move, FromList, ToList),
path(Remain, ToList, RemainingMoves),
Moves is RemainingMoves + 1.
next_step([Move | Remain], Move, Remain).
next_step([], Move, Remain) :- direction(Str), atom_chars(Str, [Move | Remain]).
starts(StartNodes) :-
findall(Node, Node to _, Nodes),
include(is_start, Nodes, StartNodes).
all_ends(Nodes) :- maplist(is_end, Nodes).
is_start(Node) :- atom_chars(Node, [_, _, a]).
is_end(Node) :- atom_chars(Node, [_, _, z]).

78
08/part2.naive2.pl Normal file
View File

@@ -0,0 +1,78 @@
:- table direction_loop/1.
:- op(700, xfx, l).
:- op(700, xfx, r).
From l To :- From to To-_.
From r To :- From to _-To.
answer(Answer) :-
starts(Starts),
maplist([S, S-Off-Stride-Loop]>>(zloop([], S, 0, [], Off, Stride, Loop)),
Starts, Events),
maplist([Node, Node-0-0]>>(true), Starts, StartPositions),
next_zevent(Events, StartPositions, Answer).
next_zevent(AllZEvents, CurrPositions, Index) :-
maplist(index_of, AllZEvents, CurrPositions, Candidates),
writef('curr=%t, cand=%t, idx=%t\n', [CurrPositions, Candidates, Index]),
( same_elements(Candidates)
-> Candidates = [Index-_ | _]
; min_member(_-Z, Candidates),
member(Z-NLoops-SubLoop, CurrPositions),
member(Z-Offset-Stride-Loop, AllZEvents),
next(Z-Offset-Stride-Loop, Z-NLoops-SubLoop, Z-NextNLoops-NextSubLoop),
select(Z-_-_, CurrPositions, Z-NextNLoops-NextSubLoop, NextPositions),
% writef('next=%t, z=%t, idx=%t\n', [NextPositions, Z, Index]),
next_zevent(AllZEvents, NextPositions, Index)
).
index_of(A-Offset-Stride-Loop, A-NLoops-SubLoop, Index-A) :-
nth0(SubLoop, Loop, LoopPosition-_),
Index is Offset + NLoops*Stride + LoopPosition.
next(A-_-_-Loop, A-NLoops-SubLoop, A-NextNLoops-NextSubLoop) :-
length(Loop, LoopLen),
( SubLoop < LoopLen - 1
-> NextNLoops is NLoops, NextSubLoop is SubLoop + 1
; NextNLoops is NLoops + 1, NextSubLoop is 0).
% Everything above this is not needed to get the input answer
% starts(Starts),
% maplist([S, S-Off-Stride-Loop]>>(zloop([], S, 0, [], Off, Stride, Loop)),
% Starts, Loops).
% then find the LCD of the strides (which are equal to offsets).
zloop(_, _, _, Zs, Offset, Stride, Loop) :-
Zs = [FirstZIndex-Z | _], reverse(Zs, [LastZIndex-Z | ReversedZs]),
DeltaZ is LastZIndex - FirstZIndex, DeltaZ =\= 0,
direction_len(Len),
divmod(DeltaZ, Len, _, 0),
Offset = FirstZIndex, Stride = DeltaZ,
foldl([Idx-Z, NewIdx-Z, Off, Off]>>(NewIdx is Idx - Off),
ReversedZs, ReversedLoop, Offset, _),
reverse(ReversedLoop, Loop),
!.
zloop(Directions, Node, Index, Zs, Offset, Stride, Loop) :-
( is_end(Node)
-> append(Zs, [Index-Node], NewZs)
; NewZs = Zs
),
next_step(Directions, Move, Remain),
G =.. [Move, Node, To], G,
NewIndex is Index + 1,
zloop(Remain, To, NewIndex, NewZs, Offset, Stride, Loop).
starts(Starts) :- findall(X, X to _, Nodes), include(is_start, Nodes, Starts).
is_start(Node) :- atom_chars(Node, [_, _, a]).
is_end(Node) :- atom_chars(Node, [_, _, z]).
next_step([Move | Remain], Move, Remain).
next_step([], Move, Remain) :- direction_list([Move | Remain]).
direction_list(Dir) :- direction(Str), atom_chars(Str, Dir).
direction_len(Len) :- direction_list(D), length(D, Len).
same_elements([_]).
same_elements([X-_, Y-Z2 | Cdr]) :- X =:= Y, same_elements([Y-Z2 | Cdr]).

63
08/part2.pl Normal file
View File

@@ -0,0 +1,63 @@
:- op(700, xfx, l).
:- op(700, xfx, r).
From l To :- From to To-_.
From r To :- From to _-To.
answer(Answer) :-
findall(Node, (Node to _, atom_chars(Node, [_, _, a])), Starts),
routes(Starts, [Route1 | RestOfRoutes]),
foldl(unify2, RestOfRoutes, Route1, _-(_-Answer-_)).
% unify2 combines 2 routes into one with its own stride-offsets-dests
unify2(Route1, Route2, NewRoute) :-
writef('Combining %t + %t', [Route1, Route2]),
once(findnsols(2, S, converge(Route1, Route2, S), SolutionPair)),
SolutionPair = [NewA-LenA-NewZ, _-LenB-_],
NewStride is LenB - LenA,
NewRoute = NewA-(NewStride-LenA-[0-NewZ]),
writef(' --> %t\n', [NewRoute]).
% Len = Stride1*X1 + Offset1 + Dest1 = Stride2*X2 + Offset2 + Dest2
% For performance, Route1's Stride should =< Route2's Stride
converge(Route1, Route2, NewA-Len-NewZ) :-
Route1 = A1-(Stride1-Offset1-Dests1),
Route2 = A2-(Stride2-Offset2-Dests2),
natnum(X2),
pick([Dests1, Dests2], [Dest1-Z1, Dest2-Z2]),
0 is (Stride2*X2 + Offset2 + Dest2 - Offset1 - Dest1) mod Stride1,
Len is Stride2*X2 + Offset2 + Dest2,
atom_concat(A1, A2, NewA), atom_concat(Z1, Z2, NewZ).
routes(Starts, Routes) :-
maplist([S, S-Route]>>(route_at(S, Route)), Starts, Routes).
% route_at(N, Node, Dests, AllDests) means going N steps will arrive at Node
% passing through Dests.
route_at(Start, Route) :- route_at(0, Start, [], Route).
route_at(N, FirstZ, [FirstZN-FirstZ | Zs], Stride-Offset-AllZs) :-
Stride is N - FirstZN, direction_looped(Stride),
Offset is FirstZN,
maplist({Offset}/[N-X, M-X]>>(M is N-Offset), [FirstZN-FirstZ | Zs], AllZs),
!.
route_at(N, Node, Dests, AllDests) :-
( atom_chars(Node, [_, _, z])
-> append(Dests, [N-Node], NextDests)
; NextDests = Dests),
Nplus1 is N + 1, step_at(N, Step), call(Step, Node, NextNode),
route_at(Nplus1, NextNode, NextDests, AllDests).
% Step is the N-th step (counting starts from 0).
step_at(N, Step) :-
direction_list(Dir), length(Dir, DirLen), Remainder is N mod DirLen,
nth0(Remainder, Dir, Step).
direction_looped(Len) :- direction_list(D), length(D, DLen), 0 is Len mod DLen.
direction_list(Dir) :- direction(Str), atom_chars(Str, Dir).
% pick one item from each sublist of ListOfLists & put them into Items in order.
% [[1,2,3], [4], [5,6]] -> [1,4,5]; [1,4,6]; [2,4,5]; [2,4,6]; [3,4,5]; [3,4,6].
pick(ListOfLists, Items) :-
maplist([SubList, X]>>(member(X, SubList)), ListOfLists, Items).
natnum(0).
natnum(N) :- natnum(N0), N is N0 + 1.

83
08/part2.unoptimized.pl Normal file
View File

@@ -0,0 +1,83 @@
:- op(700, xfx, l).
:- op(700, xfx, r).
From l To :- From to To-_.
From r To :- From to _-To.
answer(Answer) :-
starts(Starts),
routes(Starts, Routes),
collapse_routes(Routes, _-(_-Answer-_)).
collapse_routes([X], X).
collapse_routes(Routes, Collapsed) :-
writef('Collapsing: %t\n', [Routes]),
sort(2, @=<, Routes, [Route1, Route2 | CdrRoutes]),
unify2(Route1, Route2, NewRoute),
collapse_routes([NewRoute | CdrRoutes], Collapsed).
% unify2 combines 2 routes into one with its own stride-offsets-dests
unify2(Route1, Route2, Route12) :- unify2(Route1, Route2, 0-0-0-0, [], Route12).
unify2(Route1, Route2, N1-Dest1-N2-Dest2, Founds, NewRoute) :-
Route1 = A1-(Stride1-Offset1-Dests1),
Route2 = A2-(Stride2-Offset2-Dests2),
nth0(Dest1, Dests1, C1-Z1),
nth0(Dest2, Dests2, C2-Z2),
Len1 is Offset1 + Stride1*N1 + C1,
Len2 is Offset2 + Stride2*N2 + C2,
next(Dests1, N1-Dest1, NextN1-NextDest1),
( Len1 =:= Len2
-> ( Founds = [OldLen]
-> atom_concat(A1, A2, NewA), atom_concat(Z1, Z2, NewZ),
NewStride is Len1 - OldLen,
NewRoute = NewA-(NewStride-OldLen-[0-NewZ]),
!
; unify2(Route1, Route2, NextN1-NextDest1-N2-Dest2, [Len1], NewRoute)
)
; Len1 < Len2
-> unify2(Route1, Route2, NextN1-NextDest1-N2-Dest2, Founds, NewRoute)
; next(Dests2, N2-Dest2, NextN2-NextDest2),
unify2(Route1, Route2, N1-Dest1-NextN2-NextDest2, Founds, NewRoute)
).
% next(Dests, NumberOfLoops-WhichInternalZ, NextNumberOfLoops-NextInternalZ)
next(Dests, NLoops-Dest, NextNLoops-NextDest) :-
length(Dests, DestsLen),
( Dest < DestsLen - 1
-> NextNLoops is NLoops, NextDest is Dest + 1
; NextNLoops is NLoops + 1, NextDest is 0).
routes(Starts, Routes) :-
maplist([S, S-Route]>>(zloop(S, Route)), Starts, Routes).
% zloop builds a route (Stride-Offset-Internals for a particular starting node.
zloop(Node, Route) :- zloop([], Node, 0, [], Route).
zloop(_Direction, _Node, _Index, Zs, Stride-Offset-Dests) :-
Zs = [FirstZIndex-Z | _], reverse(Zs, [LastZIndex-Z | ReversedZs]),
DeltaZ is LastZIndex - FirstZIndex, DeltaZ =\= 0,
direction_len(Len),
divmod(DeltaZ, Len, _, 0),
Offset = FirstZIndex, Stride = DeltaZ,
foldl([Idx-Z, NewIdx-Z, Off, Off]>>(NewIdx is Idx - Off),
ReversedZs, ReversedDests, Offset, _),
reverse(ReversedDests, Dests),
!.
zloop(Directions, Node, Index, Zs, Route) :-
( is_end(Node)
-> append(Zs, [Index-Node], NewZs)
; NewZs = Zs
),
next_step(Directions, Move, Remain),
G =.. [Move, Node, To], G,
NewIndex is Index + 1,
zloop(Remain, To, NewIndex, NewZs, Route).
starts(Starts) :- findall(X, X to _, Nodes), include(is_start, Nodes, Starts).
is_start(Node) :- atom_chars(Node, [_, _, a]).
is_end(Node) :- atom_chars(Node, [_, _, z]).
next_step([Move | Remain], Move, Remain).
next_step([], Move, Remain) :- direction_list([Move | Remain]).
direction_list(Dir) :- direction(Str), atom_chars(Str, Dir).
direction_len(Len) :- direction_list(D), length(D, Len).

9
08/test.pl Normal file
View File

@@ -0,0 +1,9 @@
% cat input.txt \
% | sed -r -e 's~^(.*) = \((.*), (.*)\)$~\L\1 to \L\2-\L\3.~' \
% | sed -r -e 's~^([RL]+)$~:- op(700, xfx, to).\ndirection("\L\1").~' > input.pl
:- op(700, xfx, to).
direction("llr").
aaa to bbb-bbb.
bbb to aaa-zzz.
zzz to zzz-zzz.

9
08/test.txt Normal file
View File

@@ -0,0 +1,9 @@
RL
AAA = (BBB, CCC)
BBB = (DDD, EEE)
CCC = (ZZZ, GGG)
DDD = (DDD, DDD)
EEE = (EEE, EEE)
GGG = (GGG, GGG)
ZZZ = (ZZZ, ZZZ)

19
08/test2.pl Normal file
View File

@@ -0,0 +1,19 @@
:- op(700, xfx, to).
direction("lr").
mma to mmb-xxx.
mmb to xxx-mmz.
mmz to mmb-xxx.
nna to nnb-xxx.
nnb to nnc-nnc.
nnc to nnz-nnz.
nnz to nnb-nnb.
ooa to ooz-oob.
oob to ood-ooc.
ooc to ooa-oox.
ood to ooz-ood.
ooz to oob-ooz.
xxx to xxx-xxx.
% Routes = [mma-(2-2-[0-mmz]), nna-(6-3-[0-nnz, 3-nnz]), ooa-(8-1-[0-ooz, 1-ooz])].
% X = mmannaooa-(24-18-[0-mmznnzooz]).

10
08/test2.txt Normal file
View File

@@ -0,0 +1,10 @@
LR
11A = (11B, XXX)
11B = (XXX, 11Z)
11Z = (11B, XXX)
22A = (22B, XXX)
22B = (22C, 22C)
22C = (22Z, 22Z)
22Z = (22B, 22B)
XXX = (XXX, XXX)

202
09/input.pl Normal file
View File

@@ -0,0 +1,202 @@
input([
[28, 38, 58, 115, 255, 558, 1167, 2343, 4564, 8699, 16328, 30378, 56447, 105549, 199601, 381868, 735876, 1418100, 2712150, 5115341, 9472583],
[24, 34, 56, 103, 191, 343, 593, 990, 1602, 2520, 3862, 5777, 8449, 12101, 16999, 23456, 31836, 42558, 56100, 73003, 93875],
[12, 30, 66, 118, 187, 291, 486, 901, 1807, 3760, 7885, 16402, 33536, 67001, 130303, 246169, 451478, 804146, 1392500, 2347766, 3860393],
[11, 7, -1, -10, 4, 101, 392, 1052, 2337, 4631, 8595, 15584, 28661, 54781, 109041, 222274, 453659, 910327, 1775963, 3349730, 6094694],
[13, 26, 56, 110, 200, 360, 677, 1347, 2785, 5847, 12267, 25493, 52275, 105732, 211455, 420013, 833076, 1658291, 3323777, 6713131, 13636877],
[24, 36, 50, 68, 92, 124, 166, 220, 288, 372, 474, 596, 740, 908, 1102, 1324, 1576, 1860, 2178, 2532, 2924],
[4, 10, 18, 35, 81, 207, 523, 1232, 2664, 5299, 9766, 16819, 27345, 42607, 65306, 103013, 177906, 352348, 792280, 1916515, 4732055],
[2, 4, 15, 46, 115, 246, 479, 915, 1841, 4022, 9326, 21995, 51143, 115539, 252570, 534754, 1099830, 2205374, 4328183, 8346246, 15873877],
[6, 16, 41, 104, 240, 508, 1016, 1959, 3670, 6684, 11815, 20246, 33632, 54216, 84958, 129677, 193206, 281560, 402117, 563812, 777344],
[10, 24, 59, 127, 240, 410, 649, 969, 1382, 1900, 2535, 3299, 4204, 5262, 6485, 7885, 9474, 11264, 13267, 15495, 17960],
[1, 3, 19, 65, 161, 334, 621, 1072, 1753, 2749, 4167, 6139, 8825, 12416, 17137, 23250, 31057, 40903, 53179, 68325, 86833],
[1, 3, 14, 46, 118, 256, 493, 869, 1431, 2233, 3336, 4808, 6724, 9166, 12223, 15991, 20573, 26079, 32626, 40338, 49346],
[5, 20, 54, 111, 200, 339, 551, 863, 1338, 2203, 4189, 9270, 22068, 52271, 118490, 254073, 515553, 994838, 1837662, 3275301, 5689494],
[11, 19, 37, 74, 152, 315, 630, 1176, 2019, 3189, 4728, 6991, 11599, 23863, 58350, 151043, 385257, 945993, 2232085, 5082986, 11226568],
[-6, -5, -1, 6, 16, 29, 45, 64, 86, 111, 139, 170, 204, 241, 281, 324, 370, 419, 471, 526, 584],
[19, 44, 79, 123, 175, 234, 299, 369, 443, 520, 599, 679, 759, 838, 915, 989, 1059, 1124, 1183, 1235, 1279],
[20, 26, 41, 76, 144, 261, 459, 824, 1572, 3189, 6707, 14297, 30581, 65483, 140200, 299218, 633600, 1324592, 2722729, 5487182, 10824554],
[2, 13, 49, 134, 316, 686, 1400, 2714, 5060, 9211, 16601, 29879, 53781, 96407, 171038, 298877, 513930, 873445, 1482345, 2550372, 4520094],
[7, 22, 55, 116, 218, 381, 645, 1090, 1862, 3209, 5540, 9533, 16335, 27918, 47680, 81409, 138761, 235440, 396309, 659706, 1083288],
[23, 34, 43, 54, 73, 105, 151, 202, 234, 223, 220, 555, 2284, 8074, 23894, 62315, 149406, 340397, 757350, 1681105, 3771572],
[-2, 9, 31, 72, 157, 346, 769, 1701, 3724, 8065, 17266, 36441, 75513, 153008, 302220, 580858, 1085650, 1973817, 3493849, 6028622, 10154597],
[17, 35, 83, 175, 326, 554, 878, 1305, 1800, 2233, 2292, 1349, -1702, -8485, -20570, -37084, -47977, -18173, 145725, 659887, 1980386],
[6, 19, 49, 119, 273, 598, 1257, 2530, 4856, 8858, 15310, 24963, 38082, 53479, 66865, 68818, 44405, -18660, -94790, -14282, 809438],
[17, 21, 22, 20, 15, 7, -4, -18, -35, -55, -78, -104, -133, -165, -200, -238, -279, -323, -370, -420, -473],
[8, 23, 59, 139, 312, 672, 1383, 2710, 5056, 9005, 15371, 25253, 40096, 61758, 92583, 135480, 194008, 272467, 375995, 510671, 683624],
[9, 16, 34, 63, 103, 154, 216, 289, 373, 468, 574, 691, 819, 958, 1108, 1269, 1441, 1624, 1818, 2023, 2239],
[8, 19, 59, 140, 275, 481, 794, 1315, 2308, 4381, 8817, 18206, 37692, 77458, 157694, 318613, 640892, 1287715, 2591041, 5226414, 10560561],
[8, 21, 37, 57, 82, 107, 117, 88, -4, -163, -339, -377, 54, 1555, 5117, 12270, 25264, 47285, 82709, 137397, 219034],
[22, 34, 44, 52, 58, 62, 64, 64, 62, 58, 52, 44, 34, 22, 8, -8, -26, -46, -68, -92, -118],
[28, 57, 114, 220, 416, 779, 1446, 2651, 4785, 8494, 14832, 25483, 43057, 71450, 116238, 185052, 287858, 437047, 647230, 934638, 1316054],
[16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96],
[28, 39, 48, 62, 97, 180, 347, 630, 1022, 1413, 1518, 905, -557, -1064, 7553, 50137, 189888, 570667, 1494764, 3559032, 7883557],
[5, 0, 3, 30, 106, 262, 542, 1035, 1947, 3728, 7269, 14184, 27192, 50614, 91000, 157901, 264801, 430224, 679031, 1043922, 1567158],
[4, 21, 55, 119, 239, 461, 864, 1591, 2913, 5356, 9967, 18894, 36631, 72557, 145803, 294037, 588486, 1158435, 2229571, 4181885, 7634411],
[8, 11, 15, 33, 81, 182, 384, 805, 1728, 3777, 8206, 17321, 35023, 67400, 123199, 213865, 352632, 551879, 817609, 1139457, 1474069],
[6, 15, 30, 69, 162, 358, 754, 1560, 3223, 6658, 13679, 27799, 55705, 109973, 214073, 411584, 783020, 1476065, 2758724, 5110417, 9373988],
[18, 26, 37, 54, 84, 138, 231, 382, 614, 954, 1433, 2086, 2952, 4074, 5499, 7278, 9466, 12122, 15309, 19094, 23548],
[3, -2, -7, -12, -17, -22, -27, -32, -37, -42, -47, -52, -57, -62, -67, -72, -77, -82, -87, -92, -97],
[16, 32, 61, 121, 242, 466, 847, 1451, 2356, 3652, 5441, 7837, 10966, 14966, 19987, 26191, 33752, 42856, 53701, 66497, 81466],
[13, 35, 79, 160, 302, 554, 1015, 1865, 3399, 6061, 10475, 17470, 28096, 43628, 65555, 95551, 135425, 187047, 252247, 332684, 429682],
[13, 6, -9, -20, 11, 156, 538, 1364, 2981, 5967, 11279, 20495, 36207, 62647, 106658, 179157, 297277, 487420, 789503, 1262734, 1993315],
[14, 11, 18, 51, 141, 348, 790, 1714, 3660, 7803, 16602, 34939, 71995, 144184, 279550, 524126, 950858, 1671811, 2854498, 4743307, 7687145],
[2, 7, 22, 56, 123, 242, 437, 737, 1176, 1793, 2632, 3742, 5177, 6996, 9263, 12047, 15422, 19467, 24266, 29908, 36487],
[19, 34, 68, 128, 220, 349, 519, 733, 993, 1300, 1654, 2054, 2498, 2983, 3505, 4059, 4639, 5238, 5848, 6460, 7064],
[21, 48, 85, 132, 195, 292, 468, 836, 1684, 3739, 8772, 20876, 48964, 111327, 243473, 510946, 1029407, 1994954, 3728471, 6738732, 11810049],
[11, 27, 55, 108, 210, 394, 696, 1143, 1733, 2405, 2997, 3190, 2436, -132, -5810, -16455, -34641, -63841, -108637, -174960, -270362],
[12, 12, 12, 25, 90, 292, 791, 1869, 4012, 8064, 15537, 29266, 54829, 103647, 199701, 393835, 793523, 1623291, 3344337, 6885726, 14081159],
[5, 13, 31, 72, 164, 358, 736, 1410, 2499, 4070, 6039, 8076, 9700, 11088, 15835, 38309, 120943, 371965, 1044017, 2693426, 6497234],
[-1, -4, 4, 46, 162, 411, 867, 1607, 2698, 4206, 6273, 9338, 14615, 24985, 46510, 90835, 178809, 345728, 648682, 1176574, 2063472],
[8, 16, 23, 40, 92, 216, 455, 847, 1408, 2108, 2839, 3374, 3316, 2036, -1401, -8323, -20552, -40520, -71401, -117260, -183220],
[27, 54, 93, 143, 215, 340, 581, 1059, 2009, 3892, 7603, 14833, 28665, 54510, 101519, 184641, 327535, 566586, 956321, 1576571, 2541779],
[18, 25, 37, 63, 114, 201, 333, 515, 746, 1017, 1309, 1591, 1818, 1929, 1845, 1467, 674, -679, -2763, -5777, -9950],
[11, 23, 58, 131, 266, 508, 956, 1834, 3618, 7240, 14408, 28142, 53779, 101035, 188408, 352630, 668776, 1292502, 2547568, 5104551, 10339633],
[20, 30, 55, 112, 230, 464, 919, 1792, 3444, 6514, 12092, 22012, 39486, 70717, 129039, 244932, 488666, 1018738, 2181538, 4711697, 10130222],
[8, 15, 22, 29, 36, 43, 50, 57, 64, 71, 78, 85, 92, 99, 106, 113, 120, 127, 134, 141, 148],
[8, 17, 18, 5, -32, -110, -256, -510, -928, -1585, -2578, -4029, -6088, -8936, -12788, -17896, -24552, -33091, -43894, -57391, -74064],
[0, 6, 28, 73, 155, 304, 573, 1043, 1826, 3066, 4938, 7645, 11413, 16484, 23107, 31527, 41972, 54638, 69672, 87153, 107071],
[8, 14, 26, 39, 49, 61, 112, 320, 974, 2687, 6657, 15139, 32341, 66134, 131237, 254984, 487637, 921079, 1723959, 3210704, 5981290],
[-3, 6, 32, 88, 209, 468, 1005, 2092, 4276, 8669, 17497, 35106, 69812, 137381, 267702, 517614, 995199, 1904592, 3626038, 6854228, 12829699],
[16, 14, 18, 32, 52, 64, 53, 40, 180, 979, 3722, 11247, 29252, 68383, 147421, 297965, 571096, 1046604, 1845466, 3146378, 5207268],
[0, 19, 60, 146, 330, 708, 1432, 2721, 4864, 8205, 13096, 19800, 28322, 38142, 47820, 54439, 52848, 34663, -13020, -109250, -281238],
[19, 37, 70, 119, 185, 269, 372, 495, 639, 805, 994, 1207, 1445, 1709, 2000, 2319, 2667, 3045, 3454, 3895, 4369],
[8, 18, 30, 51, 92, 174, 350, 764, 1787, 4310, 10347, 24225, 54843, 119816, 252855, 516572, 1024178, 1975442, 3715028, 6825207, 12270294],
[9, 31, 64, 108, 163, 229, 306, 394, 493, 603, 724, 856, 999, 1153, 1318, 1494, 1681, 1879, 2088, 2308, 2539],
[27, 36, 46, 65, 110, 223, 504, 1178, 2725, 6116, 13214, 27417, 54640, 104755, 193632, 345950, 598975, 1007532, 1650430, 2638633, 4125506],
[-3, -9, -19, -25, -9, 63, 252, 660, 1449, 2882, 5441, 10155, 19412, 38768, 80661, 171586, 365345, 766697, 1572457, 3141343, 6110353],
[9, 13, 16, 19, 30, 81, 256, 730, 1819, 4041, 8188, 15409, 27304, 46029, 74412, 116080, 175597, 258613, 372024, 524143, 724882],
[8, 17, 26, 35, 44, 53, 62, 71, 80, 89, 98, 107, 116, 125, 134, 143, 152, 161, 170, 179, 188],
[13, 29, 69, 150, 300, 564, 1014, 1770, 3055, 5340, 9688, 18482, 36824, 75023, 152753, 305660, 595433, 1124631, 2057879, 3651414, 6293380],
[19, 39, 64, 101, 169, 299, 534, 929, 1551, 2479, 3804, 5629, 8069, 11251, 15314, 20409, 26699, 34359, 43576, 54549, 67489],
[26, 48, 79, 119, 168, 226, 293, 369, 454, 548, 651, 763, 884, 1014, 1153, 1301, 1458, 1624, 1799, 1983, 2176],
[16, 28, 45, 62, 80, 120, 240, 563, 1330, 3003, 6482, 13603, 28310, 59352, 126262, 272164, 590489, 1279633, 2753130, 5858989, 12311553],
[16, 27, 38, 49, 60, 71, 82, 93, 104, 115, 126, 137, 148, 159, 170, 181, 192, 203, 214, 225, 236],
[16, 26, 52, 107, 212, 412, 806, 1601, 3204, 6384, 12578, 24502, 47411, 91748, 178785, 352718, 706597, 1437520, 2962583, 6158201, 12843931],
[15, 23, 44, 100, 234, 527, 1138, 2396, 4995, 10379, 21457, 43857, 88008, 172421, 328611, 608145, 1092295, 1904695, 3227218, 5318970, 8537806],
[19, 35, 67, 125, 219, 359, 555, 817, 1155, 1579, 2099, 2725, 3467, 4335, 5339, 6489, 7795, 9267, 10915, 12749, 14779],
[14, 9, -2, -25, -60, -96, -107, -38, 250, 1146, 3714, 10678, 28555, 72047, 172745, 395881, 871826, 1854119, 3824278, 7677249, 15042442],
[0, 14, 48, 119, 263, 559, 1175, 2446, 5004, 10002, 19512, 37235, 69743, 128583, 233715, 418934, 740144, 1287614, 2203656, 3707527, 6129775],
[-6, -13, -11, 9, 54, 127, 233, 409, 798, 1797, 4331, 10342, 23629, 51210, 105348, 206191, 384454, 682459, 1149765, 1826027, 2697892],
[14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6],
[9, 15, 23, 41, 93, 228, 528, 1127, 2265, 4422, 8622, 17094, 34685, 71869, 151157, 320706, 682873, 1452897, 3076233, 6455943, 13379245],
[26, 38, 54, 85, 154, 309, 648, 1354, 2736, 5284, 9786, 17637, 31605, 57512, 107535, 206117, 399770, 772302, 1467138, 2718337, 4891512],
[7, 2, -4, -11, -19, -28, -38, -49, -61, -74, -88, -103, -119, -136, -154, -173, -193, -214, -236, -259, -283],
[17, 40, 72, 120, 202, 355, 665, 1340, 2867, 6327, 14000, 30508, 64985, 135242, 275772, 552897, 1092529, 2128842, 4085140, 7700052, 14210216],
[-3, -4, -7, -12, -19, -28, -39, -52, -67, -84, -103, -124, -147, -172, -199, -228, -259, -292, -327, -364, -403],
[9, 21, 38, 62, 99, 161, 268, 450, 749, 1221, 1938, 2990, 4487, 6561, 9368, 13090, 17937, 24149, 31998, 41790, 53867],
[2, 9, 39, 99, 204, 393, 760, 1519, 3132, 6545, 13600, 27720, 54996, 105835, 197349, 356668, 625334, 1064865, 1763453, 2843561, 4469892],
[20, 33, 49, 75, 125, 228, 457, 1004, 2337, 5480, 12453, 26893, 54846, 105671, 192927, 335020, 555266, 880875, 1340177, 1957191, 2742379],
[18, 21, 16, 6, 5, 57, 270, 860, 2190, 4774, 9202, 15936, 24945, 35235, 44593, 50493, 54394, 73951, 171296, 510662, 1464845],
[10, 11, 18, 38, 71, 100, 71, -142, -790, -2316, -5409, -10945, -19511, -29701, -33227, -2480, 138638, 579164, 1757487, 4641596, 11293649],
[25, 33, 43, 67, 138, 323, 742, 1611, 3346, 6797, 13731, 27756, 55976, 111792, 219447, 421300, 789851, 1449309, 2618271, 4700169, 8479106],
[27, 42, 62, 88, 120, 169, 286, 615, 1492, 3635, 8492, 18826, 39628, 79522, 153115, 285551, 522357, 951296, 1749478, 3279940, 6279276],
[-1, 11, 47, 125, 280, 574, 1106, 2022, 3525, 5885, 9449, 14651, 22022, 32200, 45940, 64124, 87771, 118047, 156275, 203945, 262724],
[13, 21, 51, 115, 225, 393, 631, 951, 1365, 1885, 2523, 3291, 4201, 5265, 6495, 7903, 9501, 11301, 13315, 15555, 18033],
[20, 35, 53, 83, 140, 245, 425, 713, 1148, 1775, 2645, 3815, 5348, 7313, 9785, 12845, 16580, 21083, 26453, 32795, 40220],
[10, 26, 63, 132, 248, 429, 694, 1074, 1663, 2751, 5098, 10427, 22235, 47044, 96239, 188667, 354200, 638496, 1109225, 1864062, 3040786],
[6, -1, -9, -15, -17, -13, 13, 141, 635, 2188, 6391, 16606, 39556, 88146, 186315, 377108, 735668, 1389501, 2549183, 4553679, 7935653],
[9, 15, 43, 117, 265, 514, 885, 1388, 2017, 2745, 3519, 4255, 4833, 5092, 4825, 3774, 1625, -1997, -7533, -15495, -26471],
[7, 22, 41, 65, 106, 207, 489, 1245, 3117, 7431, 16845, 36609, 76972, 157632, 315649, 618971, 1188707, 2234572, 4109585, 7392185, 13006510],
[10, 9, 5, -1, 3, 51, 224, 700, 1840, 4321, 9327, 18809, 35825, 64971, 112914, 189038, 306214, 481705, 738217, 1105107, 1619759],
[12, 16, 30, 69, 148, 282, 486, 775, 1164, 1668, 2302, 3081, 4020, 5134, 6438, 7947, 9676, 11640, 13854, 16333, 19092],
[1, 0, 10, 42, 98, 172, 270, 462, 979, 2368, 5718, 12970, 27324, 53756, 99658, 175614, 296325, 481696, 758098, 1159818, 1730710],
[8, 19, 38, 73, 142, 283, 562, 1079, 1973, 3430, 5708, 9217, 14739, 23954, 40566, 72513, 136014, 262573, 510546, 983505, 1858428],
[9, 24, 57, 114, 205, 359, 643, 1184, 2197, 4026, 7209, 12582, 21441, 35785, 58667, 94684, 150641, 236428, 366153, 559578, 843909],
[8, 14, 22, 32, 44, 58, 74, 92, 112, 134, 158, 184, 212, 242, 274, 308, 344, 382, 422, 464, 508],
[24, 34, 44, 54, 64, 74, 84, 94, 104, 114, 124, 134, 144, 154, 164, 174, 184, 194, 204, 214, 224],
[16, 30, 63, 126, 233, 405, 686, 1187, 2184, 4316, 8979, 19130, 40965, 87415, 185254, 389023, 807192, 1649322, 3307839, 6494862, 12463897],
[-7, -7, 1, 32, 121, 335, 787, 1666, 3321, 6479, 12739, 25563, 52073, 106047, 212569, 414805, 783321, 1428197, 2513885, 4276266, 7040633],
[-2, 1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58],
[13, 27, 38, 41, 36, 48, 177, 688, 2156, 5707, 13455, 29337, 60698, 121182, 235783, 449463, 842011, 1554867, 2842648, 5177133, 9461476],
[15, 42, 93, 182, 326, 549, 884, 1374, 2086, 3178, 5119, 9300, 19562, 45721, 111199, 268798, 632393, 1439844, 3177921, 6832092, 14389654],
[7, 28, 73, 151, 265, 408, 559, 679, 707, 556, 109, -785, -2315, -4712, -8253, -13265, -20129, -29284, -41231, -56537, -75839],
[8, 5, 13, 42, 97, 177, 284, 446, 766, 1532, 3473, 8340, 20149, 47680, 109278, 241921, 518597, 1082840, 2220086, 4508651, 9140126],
[17, 27, 40, 71, 149, 317, 632, 1165, 2001, 3239, 4992, 7387, 10565, 14681, 19904, 26417, 34417, 44115, 55736, 69519, 85717],
[24, 37, 47, 65, 117, 257, 594, 1347, 2963, 6367, 13474, 28217, 58615, 120994, 248715, 510261, 1046343, 2144574, 4386122, 8926186, 18016274],
[11, 16, 36, 80, 158, 277, 445, 706, 1254, 2711, 6703, 16929, 40991, 93338, 199774, 404089, 777493, 1431666, 2536382, 4342822, 7213860],
[0, -2, 8, 48, 141, 321, 657, 1303, 2580, 5096, 9915, 18799, 34571, 61685, 107144, 181982, 303624, 499562, 812938, 1310810, 2096097],
[4, 15, 39, 91, 211, 473, 995, 1967, 3741, 7078, 13740, 27774, 58093, 123376, 261026, 543285, 1106377, 2204300, 4310572, 8314176, 15899538],
[-7, 6, 36, 87, 163, 272, 446, 788, 1568, 3411, 7651, 16966, 36460, 75419, 150039, 287505, 531891, 952452, 1654990, 2797097, 4608209],
[13, 29, 56, 95, 152, 244, 405, 692, 1191, 2023, 3350, 5381, 8378, 12662, 18619, 26706, 37457, 51489, 69508, 92315, 120812],
[15, 27, 59, 125, 237, 417, 722, 1283, 2361, 4428, 8300, 15415, 28528, 53504, 103742, 210470, 445527, 969865, 2133765, 4678765, 10135083],
[20, 31, 57, 122, 274, 596, 1223, 2377, 4439, 8101, 14695, 26909, 50338, 96812, 191434, 387177, 794467, 1639641, 3377468, 6902112, 13932807],
[10, 37, 91, 200, 416, 820, 1528, 2716, 4696, 8091, 14175, 25464, 46666, 86122, 157896, 284700, 501870, 862641, 1445003, 2360456, 3765020],
[6, 24, 54, 95, 153, 251, 440, 812, 1516, 2778, 4926, 8421, 13895, 22197, 34448, 52106, 77042, 111628, 158838, 222363, 306741],
[9, 24, 49, 84, 125, 162, 193, 281, 693, 2172, 6405, 16762, 39393, 84782, 169869, 320863, 576881, 994560, 1653801, 2664816, 4176661],
[3, 10, 23, 57, 149, 386, 945, 2142, 4499, 8866, 16685, 30566, 55492, 101260, 187366, 352765, 675303, 1309938, 2562335, 5026719, 9836291],
[15, 29, 55, 109, 226, 481, 1024, 2134, 4299, 8344, 15672, 28779, 52397, 95981, 178896, 340733, 660899, 1294259, 2533505, 4914517, 9388784],
[14, 33, 78, 166, 331, 644, 1248, 2423, 4711, 9165, 17861, 34963, 68917, 136884, 273538, 548338, 1099300, 2198986, 4383250, 8701159, 17195603],
[7, 5, 5, 7, 11, 17, 25, 35, 47, 61, 77, 95, 115, 137, 161, 187, 215, 245, 277, 311, 347],
[0, 2, 9, 21, 38, 60, 87, 119, 156, 198, 245, 297, 354, 416, 483, 555, 632, 714, 801, 893, 990],
[8, 11, 29, 79, 200, 478, 1087, 2365, 4957, 10076, 19965, 38689, 73433, 136495, 248086, 439830, 758518, 1269449, 2059289, 3241351, 4974534],
[9, 26, 71, 154, 282, 459, 686, 961, 1279, 1632, 2009, 2396, 2776, 3129, 3432, 3659, 3781, 3766, 3579, 3182, 2534],
[-8, -9, -1, 23, 70, 147, 261, 419, 628, 895, 1227, 1631, 2114, 2683, 3345, 4107, 4976, 5959, 7063, 8295, 9662],
[14, 38, 88, 183, 349, 621, 1047, 1694, 2656, 4064, 6098, 9001, 13095, 18799, 26649, 37320, 51650, 70666, 95612, 127979, 169537],
[1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46, 49, 52, 55, 58, 61],
[10, 17, 33, 71, 156, 319, 593, 1016, 1655, 2681, 4550, 8393, 16823, 35591, 76964, 166498, 356232, 749489, 1545759, 3118955, 6149158],
[-2, 5, 20, 55, 147, 378, 896, 1945, 3924, 7507, 13868, 25067, 44665, 78648, 136752, 234293, 394618, 652305, 1057252, 1679807, 2617103],
[-2, -3, -3, 12, 76, 250, 640, 1443, 3044, 6202, 12405, 24581, 48599, 96524, 193673, 393656, 809674, 1677915, 3482413, 7194006, 14714566],
[-5, -2, 2, 11, 40, 131, 388, 1045, 2594, 6015, 13162, 27362, 54272, 103007, 187497, 327953, 552225, 896728, 1406510, 2133961, 3135644],
[-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21],
[6, 23, 51, 90, 140, 201, 273, 356, 450, 555, 671, 798, 936, 1085, 1245, 1416, 1598, 1791, 1995, 2210, 2436],
[22, 44, 78, 135, 237, 421, 758, 1410, 2772, 5783, 12540, 27421, 59046, 123639, 250801, 493519, 945638, 1772306, 3262446, 5917591, 10599023],
[24, 37, 60, 106, 197, 375, 727, 1435, 2867, 5730, 11311, 21837, 40990, 74618, 131688, 225532, 375442, 608675, 962934, 1489396, 2256363],
[12, 20, 49, 112, 222, 392, 635, 964, 1392, 1932, 2597, 3400, 4354, 5472, 6767, 8252, 9940, 11844, 13977, 16352, 18982],
[2, 7, 24, 61, 126, 227, 372, 569, 826, 1151, 1552, 2037, 2614, 3291, 4076, 4977, 6002, 7159, 8456, 9901, 11502],
[12, 11, 22, 60, 158, 379, 821, 1618, 2953, 5122, 8728, 15159, 27666, 53731, 110255, 234858, 510014, 1112985, 2415218, 5172306, 10872818],
[17, 24, 49, 120, 294, 677, 1456, 2952, 5715, 10719, 19792, 36560, 68444, 130715, 254454, 501802, 994701, 1968430, 3870295, 7539464, 14530122],
[25, 40, 65, 122, 253, 535, 1117, 2293, 4630, 9184, 17861, 34010, 63355, 115342, 204806, 353380, 588983, 939636, 1414390, 1959381, 2372399],
[25, 52, 90, 138, 195, 260, 332, 410, 493, 580, 670, 762, 855, 948, 1040, 1130, 1217, 1300, 1378, 1450, 1515],
[0, 2, 24, 87, 221, 468, 885, 1547, 2550, 4014, 6086, 8943, 12795, 17888, 24507, 32979, 43676, 57018, 73476, 93575, 117897],
[19, 32, 61, 117, 214, 369, 603, 947, 1457, 2242, 3509, 5629, 9228, 15307, 25395, 41739, 67535, 107204, 166717, 253973, 379234],
[23, 32, 38, 44, 60, 103, 197, 373, 669, 1130, 1808, 2762, 4058, 5769, 7975, 10763, 14227, 18468, 23594, 29720, 36968],
[4, 11, 19, 35, 76, 180, 439, 1069, 2539, 5797, 12662, 26510, 53500, 104832, 201057, 380617, 717363, 1357502, 2598934, 5062820, 10063437],
[10, 19, 23, 14, -24, -121, -314, -610, -897, -761, 888, 6598, 22021, 59353, 144459, 331532, 733040, 1580211, 3343069, 6963206, 14293206],
[3, 17, 48, 105, 201, 354, 600, 1028, 1847, 3495, 6800, 13203, 25053, 45984, 81384, 138966, 229451, 367373, 572016, 868493, 1288977],
[-4, -3, 10, 49, 132, 289, 583, 1147, 2252, 4449, 8873, 17855, 36050, 72341, 142802, 274973, 513588, 927669, 1618516, 2727541, 4442064],
[19, 39, 74, 133, 236, 422, 765, 1415, 2696, 5313, 10758, 22099, 45557, 93732, 192181, 392487, 797276, 1606233, 3197558, 6267150, 12058959],
[-7, -10, -13, -16, -19, -22, -25, -28, -31, -34, -37, -40, -43, -46, -49, -52, -55, -58, -61, -64, -67],
[21, 44, 74, 122, 221, 432, 849, 1603, 2865, 4848, 7808, 12044, 17897, 25748, 36015, 49149, 65629, 85956, 110646, 140222, 175205],
[18, 26, 39, 66, 116, 198, 321, 494, 726, 1026, 1403, 1866, 2424, 3086, 3861, 4758, 5786, 6954, 8271, 9746, 11388],
[21, 40, 78, 164, 356, 766, 1605, 3259, 6420, 12322, 23187, 43106, 79841, 148586, 279840, 535679, 1042583, 2055644, 4079972, 8092520, 15934162],
[20, 37, 62, 95, 136, 185, 242, 307, 380, 461, 550, 647, 752, 865, 986, 1115, 1252, 1397, 1550, 1711, 1880],
[0, 2, 15, 48, 121, 283, 642, 1407, 2942, 5832, 10961, 19602, 33519, 55081, 87388, 134409, 201132, 293726, 419715, 588164, 809877],
[8, 13, 15, 13, 15, 42, 131, 338, 755, 1592, 3455, 8105, 20256, 51423, 127543, 303162, 686530, 1482119, 3060047, 6065853, 11589253],
[12, 30, 59, 93, 125, 157, 214, 361, 722, 1498, 2987, 5640, 10262, 18599, 34737, 67942, 137708, 281702, 566759, 1101727, 2048287],
[-3, 10, 49, 127, 264, 492, 863, 1464, 2440, 4028, 6633, 11078, 19417, 37246, 79490, 183510, 436575, 1030078, 2361565, 5219525, 11107638],
[16, 33, 54, 90, 174, 378, 846, 1849, 3867, 7702, 14625, 26559, 46299, 77769, 126315, 199032, 305122, 456279, 667096, 955488, 1343124],
[19, 43, 88, 176, 343, 647, 1194, 2198, 4111, 7897, 15598, 31482, 64323, 131829, 269087, 544536, 1090317, 2160903, 4249054, 8320480, 16296305],
[22, 41, 67, 112, 212, 447, 969, 2039, 4084, 7808, 14445, 26357, 48398, 90840, 175255, 345646, 688410, 1366499, 2675535, 5132758, 9613680],
[12, 25, 47, 89, 162, 277, 445, 677, 984, 1377, 1867, 2465, 3182, 4029, 5017, 6157, 7460, 8937, 10599, 12457, 14522],
[5, 0, -7, -1, 49, 197, 534, 1225, 2596, 5304, 10634, 21018, 41034, 79540, 154415, 302881, 602927, 1215420, 2462671, 4968277, 9895903],
[-9, -14, -15, 1, 65, 237, 627, 1430, 2974, 5775, 10594, 18507, 31038, 50464, 80459, 127293, 201992, 324897, 538038, 942790, 1811370],
[2, 4, 0, -10, -11, 41, 233, 709, 1684, 3458, 6430, 11112, 18143, 28303, 42527, 61919, 87766, 121552, 164972, 219946, 288633],
[7, 26, 67, 150, 317, 656, 1342, 2714, 5434, 10819, 21508, 42739, 84695, 166680, 324376, 622208, 1174037, 2177180, 3967333, 7105608, 12513901],
[12, 22, 38, 64, 119, 247, 532, 1123, 2276, 4424, 8309, 15295, 28210, 53572, 107038, 225653, 493336, 1090494, 2385292, 5093646, 10548309],
[14, 12, 10, 19, 59, 159, 357, 700, 1244, 2054, 3204, 4777, 6865, 9569, 12999, 17274, 22522, 28880, 36494, 45519, 56119],
[2, 14, 43, 115, 280, 632, 1341, 2710, 5286, 10076, 18959, 35465, 66244, 123814, 231609, 433008, 806986, 1494370, 2740499, 4962479, 8852304],
[16, 36, 82, 165, 307, 556, 1007, 1841, 3405, 6374, 12066, 23034, 44170, 84820, 163047, 314653, 612780, 1210538, 2432293, 4964944, 10250289],
[10, 8, 10, 20, 58, 188, 557, 1451, 3382, 7223, 14402, 27147, 48738, 83665, 137509, 216252, 324578, 462546, 619794, 766166, 837338],
[9, 22, 46, 85, 154, 288, 571, 1200, 2601, 5616, 11777, 23672, 45407, 83249, 146871, 252546, 431725, 752582, 1369644, 2629419, 5280540],
[16, 20, 35, 87, 210, 449, 878, 1653, 3133, 6129, 12402, 25663, 53593, 111897, 232285, 477770, 971150, 1946550, 3840269, 7447123, 14183748],
[22, 44, 94, 197, 405, 821, 1643, 3250, 6376, 12465, 24392, 47913, 94545, 187207, 371116, 734593, 1448530, 2841203, 5540681, 10747619, 20760527],
[4, 15, 42, 101, 226, 487, 1024, 2115, 4318, 8768, 17778, 36006, 72647, 145461, 288069, 563007, 1084756, 2059673, 3853830, 7105719, 12909204],
[15, 23, 48, 115, 271, 611, 1319, 2724, 5371, 10107, 18182, 31365, 52075, 83527, 129893, 196478, 289911, 418351, 591708, 821879, 1122999],
[7, 6, 17, 48, 107, 202, 341, 532, 783, 1102, 1497, 1976, 2547, 3218, 3997, 4892, 5911, 7062, 8353, 9792, 11387],
[-4, 3, 25, 70, 153, 309, 619, 1270, 2682, 5750, 12268, 25628, 51937, 101824, 193553, 358902, 655155, 1190487, 2177891, 4048307, 7684230],
[-2, 4, 19, 40, 65, 112, 264, 766, 2210, 5847, 14057, 30979, 63235, 120551, 215877, 364424, 581237, 878545, 1269600, 1800115, 2661524],
[18, 30, 45, 58, 64, 58, 35, -10, -82, -186, -327, -510, -740, -1022, -1361, -1762, -2230, -2770, -3387, -4086, -4872],
[8, 20, 59, 143, 292, 523, 844, 1247, 1700, 2138, 2453, 2483, 2000, 697, -1826, -6077, -12688, -22432, -36241, -55225, -80692],
[11, 12, 8, -7, -28, -26, 65, 361, 1041, 2360, 4662, 8393, 14114, 22514, 34423, 50825, 72871, 101892, 139412, 187161, 247088],
[6, 6, 19, 54, 113, 189, 264, 307, 272, 96, -303, -1028, -2205, -3985, -6546, -10095, -14870, -21142, -29217, -39438, -52187],
[26, 40, 63, 112, 222, 455, 906, 1708, 3036, 5116, 8278, 13187, 21602, 38439, 76677, 167925, 383519, 874229, 1941697, 4162964, 8603981],
[12, 19, 31, 58, 110, 209, 412, 843, 1741, 3551, 7128, 14215, 28539, 58216, 120779, 253209, 531098, 1103839, 2256973, 4519124, 8840092],
[14, 28, 47, 71, 102, 153, 266, 539, 1162, 2462, 4957, 9419, 16946, 29043, 47712, 75551, 115862, 172768, 251339, 357727, 499310],
[19, 22, 38, 89, 208, 457, 958, 1941, 3833, 7447, 14380, 27796, 53861, 104226, 200137, 378978, 704206, 1279303, 2264473, 3888958, 6437241],
[20, 38, 83, 177, 353, 665, 1204, 2120, 3650, 6152, 10145, 16355, 25767, 39683, 59786, 88210, 127616, 181274, 253151, 348005, 471485],
[18, 33, 52, 75, 103, 147, 258, 596, 1573, 4137, 10313, 24197, 53757, 114135, 233848, 466630, 914030, 1767831, 3387708, 6439669, 12137157],
[16, 32, 61, 98, 136, 164, 171, 173, 281, 836, 2678, 7743, 20501, 51456, 125378, 299753, 704238, 1621680, 3648963, 8007452, 17127734],
[0, 9, 25, 62, 141, 293, 566, 1037, 1844, 3286, 6097, 12096, 25583, 56164, 124287, 271914, 582905, 1221701, 2506400, 5046590, 10003946],
[-4, 12, 56, 141, 280, 486, 772, 1151, 1636, 2240, 2976, 3857, 4896, 6106, 7500, 9091, 10892, 12916, 15176, 17685, 20456]
]).

200
09/input.txt Normal file
View File

@@ -0,0 +1,200 @@
28 38 58 115 255 558 1167 2343 4564 8699 16328 30378 56447 105549 199601 381868 735876 1418100 2712150 5115341 9472583
24 34 56 103 191 343 593 990 1602 2520 3862 5777 8449 12101 16999 23456 31836 42558 56100 73003 93875
12 30 66 118 187 291 486 901 1807 3760 7885 16402 33536 67001 130303 246169 451478 804146 1392500 2347766 3860393
11 7 -1 -10 4 101 392 1052 2337 4631 8595 15584 28661 54781 109041 222274 453659 910327 1775963 3349730 6094694
13 26 56 110 200 360 677 1347 2785 5847 12267 25493 52275 105732 211455 420013 833076 1658291 3323777 6713131 13636877
24 36 50 68 92 124 166 220 288 372 474 596 740 908 1102 1324 1576 1860 2178 2532 2924
4 10 18 35 81 207 523 1232 2664 5299 9766 16819 27345 42607 65306 103013 177906 352348 792280 1916515 4732055
2 4 15 46 115 246 479 915 1841 4022 9326 21995 51143 115539 252570 534754 1099830 2205374 4328183 8346246 15873877
6 16 41 104 240 508 1016 1959 3670 6684 11815 20246 33632 54216 84958 129677 193206 281560 402117 563812 777344
10 24 59 127 240 410 649 969 1382 1900 2535 3299 4204 5262 6485 7885 9474 11264 13267 15495 17960
1 3 19 65 161 334 621 1072 1753 2749 4167 6139 8825 12416 17137 23250 31057 40903 53179 68325 86833
1 3 14 46 118 256 493 869 1431 2233 3336 4808 6724 9166 12223 15991 20573 26079 32626 40338 49346
5 20 54 111 200 339 551 863 1338 2203 4189 9270 22068 52271 118490 254073 515553 994838 1837662 3275301 5689494
11 19 37 74 152 315 630 1176 2019 3189 4728 6991 11599 23863 58350 151043 385257 945993 2232085 5082986 11226568
-6 -5 -1 6 16 29 45 64 86 111 139 170 204 241 281 324 370 419 471 526 584
19 44 79 123 175 234 299 369 443 520 599 679 759 838 915 989 1059 1124 1183 1235 1279
20 26 41 76 144 261 459 824 1572 3189 6707 14297 30581 65483 140200 299218 633600 1324592 2722729 5487182 10824554
2 13 49 134 316 686 1400 2714 5060 9211 16601 29879 53781 96407 171038 298877 513930 873445 1482345 2550372 4520094
7 22 55 116 218 381 645 1090 1862 3209 5540 9533 16335 27918 47680 81409 138761 235440 396309 659706 1083288
23 34 43 54 73 105 151 202 234 223 220 555 2284 8074 23894 62315 149406 340397 757350 1681105 3771572
-2 9 31 72 157 346 769 1701 3724 8065 17266 36441 75513 153008 302220 580858 1085650 1973817 3493849 6028622 10154597
17 35 83 175 326 554 878 1305 1800 2233 2292 1349 -1702 -8485 -20570 -37084 -47977 -18173 145725 659887 1980386
6 19 49 119 273 598 1257 2530 4856 8858 15310 24963 38082 53479 66865 68818 44405 -18660 -94790 -14282 809438
17 21 22 20 15 7 -4 -18 -35 -55 -78 -104 -133 -165 -200 -238 -279 -323 -370 -420 -473
8 23 59 139 312 672 1383 2710 5056 9005 15371 25253 40096 61758 92583 135480 194008 272467 375995 510671 683624
9 16 34 63 103 154 216 289 373 468 574 691 819 958 1108 1269 1441 1624 1818 2023 2239
8 19 59 140 275 481 794 1315 2308 4381 8817 18206 37692 77458 157694 318613 640892 1287715 2591041 5226414 10560561
8 21 37 57 82 107 117 88 -4 -163 -339 -377 54 1555 5117 12270 25264 47285 82709 137397 219034
22 34 44 52 58 62 64 64 62 58 52 44 34 22 8 -8 -26 -46 -68 -92 -118
28 57 114 220 416 779 1446 2651 4785 8494 14832 25483 43057 71450 116238 185052 287858 437047 647230 934638 1316054
16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96
28 39 48 62 97 180 347 630 1022 1413 1518 905 -557 -1064 7553 50137 189888 570667 1494764 3559032 7883557
5 0 3 30 106 262 542 1035 1947 3728 7269 14184 27192 50614 91000 157901 264801 430224 679031 1043922 1567158
4 21 55 119 239 461 864 1591 2913 5356 9967 18894 36631 72557 145803 294037 588486 1158435 2229571 4181885 7634411
8 11 15 33 81 182 384 805 1728 3777 8206 17321 35023 67400 123199 213865 352632 551879 817609 1139457 1474069
6 15 30 69 162 358 754 1560 3223 6658 13679 27799 55705 109973 214073 411584 783020 1476065 2758724 5110417 9373988
18 26 37 54 84 138 231 382 614 954 1433 2086 2952 4074 5499 7278 9466 12122 15309 19094 23548
3 -2 -7 -12 -17 -22 -27 -32 -37 -42 -47 -52 -57 -62 -67 -72 -77 -82 -87 -92 -97
16 32 61 121 242 466 847 1451 2356 3652 5441 7837 10966 14966 19987 26191 33752 42856 53701 66497 81466
13 35 79 160 302 554 1015 1865 3399 6061 10475 17470 28096 43628 65555 95551 135425 187047 252247 332684 429682
13 6 -9 -20 11 156 538 1364 2981 5967 11279 20495 36207 62647 106658 179157 297277 487420 789503 1262734 1993315
14 11 18 51 141 348 790 1714 3660 7803 16602 34939 71995 144184 279550 524126 950858 1671811 2854498 4743307 7687145
2 7 22 56 123 242 437 737 1176 1793 2632 3742 5177 6996 9263 12047 15422 19467 24266 29908 36487
19 34 68 128 220 349 519 733 993 1300 1654 2054 2498 2983 3505 4059 4639 5238 5848 6460 7064
21 48 85 132 195 292 468 836 1684 3739 8772 20876 48964 111327 243473 510946 1029407 1994954 3728471 6738732 11810049
11 27 55 108 210 394 696 1143 1733 2405 2997 3190 2436 -132 -5810 -16455 -34641 -63841 -108637 -174960 -270362
12 12 12 25 90 292 791 1869 4012 8064 15537 29266 54829 103647 199701 393835 793523 1623291 3344337 6885726 14081159
5 13 31 72 164 358 736 1410 2499 4070 6039 8076 9700 11088 15835 38309 120943 371965 1044017 2693426 6497234
-1 -4 4 46 162 411 867 1607 2698 4206 6273 9338 14615 24985 46510 90835 178809 345728 648682 1176574 2063472
8 16 23 40 92 216 455 847 1408 2108 2839 3374 3316 2036 -1401 -8323 -20552 -40520 -71401 -117260 -183220
27 54 93 143 215 340 581 1059 2009 3892 7603 14833 28665 54510 101519 184641 327535 566586 956321 1576571 2541779
18 25 37 63 114 201 333 515 746 1017 1309 1591 1818 1929 1845 1467 674 -679 -2763 -5777 -9950
11 23 58 131 266 508 956 1834 3618 7240 14408 28142 53779 101035 188408 352630 668776 1292502 2547568 5104551 10339633
20 30 55 112 230 464 919 1792 3444 6514 12092 22012 39486 70717 129039 244932 488666 1018738 2181538 4711697 10130222
8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141 148
8 17 18 5 -32 -110 -256 -510 -928 -1585 -2578 -4029 -6088 -8936 -12788 -17896 -24552 -33091 -43894 -57391 -74064
0 6 28 73 155 304 573 1043 1826 3066 4938 7645 11413 16484 23107 31527 41972 54638 69672 87153 107071
8 14 26 39 49 61 112 320 974 2687 6657 15139 32341 66134 131237 254984 487637 921079 1723959 3210704 5981290
-3 6 32 88 209 468 1005 2092 4276 8669 17497 35106 69812 137381 267702 517614 995199 1904592 3626038 6854228 12829699
16 14 18 32 52 64 53 40 180 979 3722 11247 29252 68383 147421 297965 571096 1046604 1845466 3146378 5207268
0 19 60 146 330 708 1432 2721 4864 8205 13096 19800 28322 38142 47820 54439 52848 34663 -13020 -109250 -281238
19 37 70 119 185 269 372 495 639 805 994 1207 1445 1709 2000 2319 2667 3045 3454 3895 4369
8 18 30 51 92 174 350 764 1787 4310 10347 24225 54843 119816 252855 516572 1024178 1975442 3715028 6825207 12270294
9 31 64 108 163 229 306 394 493 603 724 856 999 1153 1318 1494 1681 1879 2088 2308 2539
27 36 46 65 110 223 504 1178 2725 6116 13214 27417 54640 104755 193632 345950 598975 1007532 1650430 2638633 4125506
-3 -9 -19 -25 -9 63 252 660 1449 2882 5441 10155 19412 38768 80661 171586 365345 766697 1572457 3141343 6110353
9 13 16 19 30 81 256 730 1819 4041 8188 15409 27304 46029 74412 116080 175597 258613 372024 524143 724882
8 17 26 35 44 53 62 71 80 89 98 107 116 125 134 143 152 161 170 179 188
13 29 69 150 300 564 1014 1770 3055 5340 9688 18482 36824 75023 152753 305660 595433 1124631 2057879 3651414 6293380
19 39 64 101 169 299 534 929 1551 2479 3804 5629 8069 11251 15314 20409 26699 34359 43576 54549 67489
26 48 79 119 168 226 293 369 454 548 651 763 884 1014 1153 1301 1458 1624 1799 1983 2176
16 28 45 62 80 120 240 563 1330 3003 6482 13603 28310 59352 126262 272164 590489 1279633 2753130 5858989 12311553
16 27 38 49 60 71 82 93 104 115 126 137 148 159 170 181 192 203 214 225 236
16 26 52 107 212 412 806 1601 3204 6384 12578 24502 47411 91748 178785 352718 706597 1437520 2962583 6158201 12843931
15 23 44 100 234 527 1138 2396 4995 10379 21457 43857 88008 172421 328611 608145 1092295 1904695 3227218 5318970 8537806
19 35 67 125 219 359 555 817 1155 1579 2099 2725 3467 4335 5339 6489 7795 9267 10915 12749 14779
14 9 -2 -25 -60 -96 -107 -38 250 1146 3714 10678 28555 72047 172745 395881 871826 1854119 3824278 7677249 15042442
0 14 48 119 263 559 1175 2446 5004 10002 19512 37235 69743 128583 233715 418934 740144 1287614 2203656 3707527 6129775
-6 -13 -11 9 54 127 233 409 798 1797 4331 10342 23629 51210 105348 206191 384454 682459 1149765 1826027 2697892
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6
9 15 23 41 93 228 528 1127 2265 4422 8622 17094 34685 71869 151157 320706 682873 1452897 3076233 6455943 13379245
26 38 54 85 154 309 648 1354 2736 5284 9786 17637 31605 57512 107535 206117 399770 772302 1467138 2718337 4891512
7 2 -4 -11 -19 -28 -38 -49 -61 -74 -88 -103 -119 -136 -154 -173 -193 -214 -236 -259 -283
17 40 72 120 202 355 665 1340 2867 6327 14000 30508 64985 135242 275772 552897 1092529 2128842 4085140 7700052 14210216
-3 -4 -7 -12 -19 -28 -39 -52 -67 -84 -103 -124 -147 -172 -199 -228 -259 -292 -327 -364 -403
9 21 38 62 99 161 268 450 749 1221 1938 2990 4487 6561 9368 13090 17937 24149 31998 41790 53867
2 9 39 99 204 393 760 1519 3132 6545 13600 27720 54996 105835 197349 356668 625334 1064865 1763453 2843561 4469892
20 33 49 75 125 228 457 1004 2337 5480 12453 26893 54846 105671 192927 335020 555266 880875 1340177 1957191 2742379
18 21 16 6 5 57 270 860 2190 4774 9202 15936 24945 35235 44593 50493 54394 73951 171296 510662 1464845
10 11 18 38 71 100 71 -142 -790 -2316 -5409 -10945 -19511 -29701 -33227 -2480 138638 579164 1757487 4641596 11293649
25 33 43 67 138 323 742 1611 3346 6797 13731 27756 55976 111792 219447 421300 789851 1449309 2618271 4700169 8479106
27 42 62 88 120 169 286 615 1492 3635 8492 18826 39628 79522 153115 285551 522357 951296 1749478 3279940 6279276
-1 11 47 125 280 574 1106 2022 3525 5885 9449 14651 22022 32200 45940 64124 87771 118047 156275 203945 262724
13 21 51 115 225 393 631 951 1365 1885 2523 3291 4201 5265 6495 7903 9501 11301 13315 15555 18033
20 35 53 83 140 245 425 713 1148 1775 2645 3815 5348 7313 9785 12845 16580 21083 26453 32795 40220
10 26 63 132 248 429 694 1074 1663 2751 5098 10427 22235 47044 96239 188667 354200 638496 1109225 1864062 3040786
6 -1 -9 -15 -17 -13 13 141 635 2188 6391 16606 39556 88146 186315 377108 735668 1389501 2549183 4553679 7935653
9 15 43 117 265 514 885 1388 2017 2745 3519 4255 4833 5092 4825 3774 1625 -1997 -7533 -15495 -26471
7 22 41 65 106 207 489 1245 3117 7431 16845 36609 76972 157632 315649 618971 1188707 2234572 4109585 7392185 13006510
10 9 5 -1 3 51 224 700 1840 4321 9327 18809 35825 64971 112914 189038 306214 481705 738217 1105107 1619759
12 16 30 69 148 282 486 775 1164 1668 2302 3081 4020 5134 6438 7947 9676 11640 13854 16333 19092
1 0 10 42 98 172 270 462 979 2368 5718 12970 27324 53756 99658 175614 296325 481696 758098 1159818 1730710
8 19 38 73 142 283 562 1079 1973 3430 5708 9217 14739 23954 40566 72513 136014 262573 510546 983505 1858428
9 24 57 114 205 359 643 1184 2197 4026 7209 12582 21441 35785 58667 94684 150641 236428 366153 559578 843909
8 14 22 32 44 58 74 92 112 134 158 184 212 242 274 308 344 382 422 464 508
24 34 44 54 64 74 84 94 104 114 124 134 144 154 164 174 184 194 204 214 224
16 30 63 126 233 405 686 1187 2184 4316 8979 19130 40965 87415 185254 389023 807192 1649322 3307839 6494862 12463897
-7 -7 1 32 121 335 787 1666 3321 6479 12739 25563 52073 106047 212569 414805 783321 1428197 2513885 4276266 7040633
-2 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58
13 27 38 41 36 48 177 688 2156 5707 13455 29337 60698 121182 235783 449463 842011 1554867 2842648 5177133 9461476
15 42 93 182 326 549 884 1374 2086 3178 5119 9300 19562 45721 111199 268798 632393 1439844 3177921 6832092 14389654
7 28 73 151 265 408 559 679 707 556 109 -785 -2315 -4712 -8253 -13265 -20129 -29284 -41231 -56537 -75839
8 5 13 42 97 177 284 446 766 1532 3473 8340 20149 47680 109278 241921 518597 1082840 2220086 4508651 9140126
17 27 40 71 149 317 632 1165 2001 3239 4992 7387 10565 14681 19904 26417 34417 44115 55736 69519 85717
24 37 47 65 117 257 594 1347 2963 6367 13474 28217 58615 120994 248715 510261 1046343 2144574 4386122 8926186 18016274
11 16 36 80 158 277 445 706 1254 2711 6703 16929 40991 93338 199774 404089 777493 1431666 2536382 4342822 7213860
0 -2 8 48 141 321 657 1303 2580 5096 9915 18799 34571 61685 107144 181982 303624 499562 812938 1310810 2096097
4 15 39 91 211 473 995 1967 3741 7078 13740 27774 58093 123376 261026 543285 1106377 2204300 4310572 8314176 15899538
-7 6 36 87 163 272 446 788 1568 3411 7651 16966 36460 75419 150039 287505 531891 952452 1654990 2797097 4608209
13 29 56 95 152 244 405 692 1191 2023 3350 5381 8378 12662 18619 26706 37457 51489 69508 92315 120812
15 27 59 125 237 417 722 1283 2361 4428 8300 15415 28528 53504 103742 210470 445527 969865 2133765 4678765 10135083
20 31 57 122 274 596 1223 2377 4439 8101 14695 26909 50338 96812 191434 387177 794467 1639641 3377468 6902112 13932807
10 37 91 200 416 820 1528 2716 4696 8091 14175 25464 46666 86122 157896 284700 501870 862641 1445003 2360456 3765020
6 24 54 95 153 251 440 812 1516 2778 4926 8421 13895 22197 34448 52106 77042 111628 158838 222363 306741
9 24 49 84 125 162 193 281 693 2172 6405 16762 39393 84782 169869 320863 576881 994560 1653801 2664816 4176661
3 10 23 57 149 386 945 2142 4499 8866 16685 30566 55492 101260 187366 352765 675303 1309938 2562335 5026719 9836291
15 29 55 109 226 481 1024 2134 4299 8344 15672 28779 52397 95981 178896 340733 660899 1294259 2533505 4914517 9388784
14 33 78 166 331 644 1248 2423 4711 9165 17861 34963 68917 136884 273538 548338 1099300 2198986 4383250 8701159 17195603
7 5 5 7 11 17 25 35 47 61 77 95 115 137 161 187 215 245 277 311 347
0 2 9 21 38 60 87 119 156 198 245 297 354 416 483 555 632 714 801 893 990
8 11 29 79 200 478 1087 2365 4957 10076 19965 38689 73433 136495 248086 439830 758518 1269449 2059289 3241351 4974534
9 26 71 154 282 459 686 961 1279 1632 2009 2396 2776 3129 3432 3659 3781 3766 3579 3182 2534
-8 -9 -1 23 70 147 261 419 628 895 1227 1631 2114 2683 3345 4107 4976 5959 7063 8295 9662
14 38 88 183 349 621 1047 1694 2656 4064 6098 9001 13095 18799 26649 37320 51650 70666 95612 127979 169537
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61
10 17 33 71 156 319 593 1016 1655 2681 4550 8393 16823 35591 76964 166498 356232 749489 1545759 3118955 6149158
-2 5 20 55 147 378 896 1945 3924 7507 13868 25067 44665 78648 136752 234293 394618 652305 1057252 1679807 2617103
-2 -3 -3 12 76 250 640 1443 3044 6202 12405 24581 48599 96524 193673 393656 809674 1677915 3482413 7194006 14714566
-5 -2 2 11 40 131 388 1045 2594 6015 13162 27362 54272 103007 187497 327953 552225 896728 1406510 2133961 3135644
-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21
6 23 51 90 140 201 273 356 450 555 671 798 936 1085 1245 1416 1598 1791 1995 2210 2436
22 44 78 135 237 421 758 1410 2772 5783 12540 27421 59046 123639 250801 493519 945638 1772306 3262446 5917591 10599023
24 37 60 106 197 375 727 1435 2867 5730 11311 21837 40990 74618 131688 225532 375442 608675 962934 1489396 2256363
12 20 49 112 222 392 635 964 1392 1932 2597 3400 4354 5472 6767 8252 9940 11844 13977 16352 18982
2 7 24 61 126 227 372 569 826 1151 1552 2037 2614 3291 4076 4977 6002 7159 8456 9901 11502
12 11 22 60 158 379 821 1618 2953 5122 8728 15159 27666 53731 110255 234858 510014 1112985 2415218 5172306 10872818
17 24 49 120 294 677 1456 2952 5715 10719 19792 36560 68444 130715 254454 501802 994701 1968430 3870295 7539464 14530122
25 40 65 122 253 535 1117 2293 4630 9184 17861 34010 63355 115342 204806 353380 588983 939636 1414390 1959381 2372399
25 52 90 138 195 260 332 410 493 580 670 762 855 948 1040 1130 1217 1300 1378 1450 1515
0 2 24 87 221 468 885 1547 2550 4014 6086 8943 12795 17888 24507 32979 43676 57018 73476 93575 117897
19 32 61 117 214 369 603 947 1457 2242 3509 5629 9228 15307 25395 41739 67535 107204 166717 253973 379234
23 32 38 44 60 103 197 373 669 1130 1808 2762 4058 5769 7975 10763 14227 18468 23594 29720 36968
4 11 19 35 76 180 439 1069 2539 5797 12662 26510 53500 104832 201057 380617 717363 1357502 2598934 5062820 10063437
10 19 23 14 -24 -121 -314 -610 -897 -761 888 6598 22021 59353 144459 331532 733040 1580211 3343069 6963206 14293206
3 17 48 105 201 354 600 1028 1847 3495 6800 13203 25053 45984 81384 138966 229451 367373 572016 868493 1288977
-4 -3 10 49 132 289 583 1147 2252 4449 8873 17855 36050 72341 142802 274973 513588 927669 1618516 2727541 4442064
19 39 74 133 236 422 765 1415 2696 5313 10758 22099 45557 93732 192181 392487 797276 1606233 3197558 6267150 12058959
-7 -10 -13 -16 -19 -22 -25 -28 -31 -34 -37 -40 -43 -46 -49 -52 -55 -58 -61 -64 -67
21 44 74 122 221 432 849 1603 2865 4848 7808 12044 17897 25748 36015 49149 65629 85956 110646 140222 175205
18 26 39 66 116 198 321 494 726 1026 1403 1866 2424 3086 3861 4758 5786 6954 8271 9746 11388
21 40 78 164 356 766 1605 3259 6420 12322 23187 43106 79841 148586 279840 535679 1042583 2055644 4079972 8092520 15934162
20 37 62 95 136 185 242 307 380 461 550 647 752 865 986 1115 1252 1397 1550 1711 1880
0 2 15 48 121 283 642 1407 2942 5832 10961 19602 33519 55081 87388 134409 201132 293726 419715 588164 809877
8 13 15 13 15 42 131 338 755 1592 3455 8105 20256 51423 127543 303162 686530 1482119 3060047 6065853 11589253
12 30 59 93 125 157 214 361 722 1498 2987 5640 10262 18599 34737 67942 137708 281702 566759 1101727 2048287
-3 10 49 127 264 492 863 1464 2440 4028 6633 11078 19417 37246 79490 183510 436575 1030078 2361565 5219525 11107638
16 33 54 90 174 378 846 1849 3867 7702 14625 26559 46299 77769 126315 199032 305122 456279 667096 955488 1343124
19 43 88 176 343 647 1194 2198 4111 7897 15598 31482 64323 131829 269087 544536 1090317 2160903 4249054 8320480 16296305
22 41 67 112 212 447 969 2039 4084 7808 14445 26357 48398 90840 175255 345646 688410 1366499 2675535 5132758 9613680
12 25 47 89 162 277 445 677 984 1377 1867 2465 3182 4029 5017 6157 7460 8937 10599 12457 14522
5 0 -7 -1 49 197 534 1225 2596 5304 10634 21018 41034 79540 154415 302881 602927 1215420 2462671 4968277 9895903
-9 -14 -15 1 65 237 627 1430 2974 5775 10594 18507 31038 50464 80459 127293 201992 324897 538038 942790 1811370
2 4 0 -10 -11 41 233 709 1684 3458 6430 11112 18143 28303 42527 61919 87766 121552 164972 219946 288633
7 26 67 150 317 656 1342 2714 5434 10819 21508 42739 84695 166680 324376 622208 1174037 2177180 3967333 7105608 12513901
12 22 38 64 119 247 532 1123 2276 4424 8309 15295 28210 53572 107038 225653 493336 1090494 2385292 5093646 10548309
14 12 10 19 59 159 357 700 1244 2054 3204 4777 6865 9569 12999 17274 22522 28880 36494 45519 56119
2 14 43 115 280 632 1341 2710 5286 10076 18959 35465 66244 123814 231609 433008 806986 1494370 2740499 4962479 8852304
16 36 82 165 307 556 1007 1841 3405 6374 12066 23034 44170 84820 163047 314653 612780 1210538 2432293 4964944 10250289
10 8 10 20 58 188 557 1451 3382 7223 14402 27147 48738 83665 137509 216252 324578 462546 619794 766166 837338
9 22 46 85 154 288 571 1200 2601 5616 11777 23672 45407 83249 146871 252546 431725 752582 1369644 2629419 5280540
16 20 35 87 210 449 878 1653 3133 6129 12402 25663 53593 111897 232285 477770 971150 1946550 3840269 7447123 14183748
22 44 94 197 405 821 1643 3250 6376 12465 24392 47913 94545 187207 371116 734593 1448530 2841203 5540681 10747619 20760527
4 15 42 101 226 487 1024 2115 4318 8768 17778 36006 72647 145461 288069 563007 1084756 2059673 3853830 7105719 12909204
15 23 48 115 271 611 1319 2724 5371 10107 18182 31365 52075 83527 129893 196478 289911 418351 591708 821879 1122999
7 6 17 48 107 202 341 532 783 1102 1497 1976 2547 3218 3997 4892 5911 7062 8353 9792 11387
-4 3 25 70 153 309 619 1270 2682 5750 12268 25628 51937 101824 193553 358902 655155 1190487 2177891 4048307 7684230
-2 4 19 40 65 112 264 766 2210 5847 14057 30979 63235 120551 215877 364424 581237 878545 1269600 1800115 2661524
18 30 45 58 64 58 35 -10 -82 -186 -327 -510 -740 -1022 -1361 -1762 -2230 -2770 -3387 -4086 -4872
8 20 59 143 292 523 844 1247 1700 2138 2453 2483 2000 697 -1826 -6077 -12688 -22432 -36241 -55225 -80692
11 12 8 -7 -28 -26 65 361 1041 2360 4662 8393 14114 22514 34423 50825 72871 101892 139412 187161 247088
6 6 19 54 113 189 264 307 272 96 -303 -1028 -2205 -3985 -6546 -10095 -14870 -21142 -29217 -39438 -52187
26 40 63 112 222 455 906 1708 3036 5116 8278 13187 21602 38439 76677 167925 383519 874229 1941697 4162964 8603981
12 19 31 58 110 209 412 843 1741 3551 7128 14215 28539 58216 120779 253209 531098 1103839 2256973 4519124 8840092
14 28 47 71 102 153 266 539 1162 2462 4957 9419 16946 29043 47712 75551 115862 172768 251339 357727 499310
19 22 38 89 208 457 958 1941 3833 7447 14380 27796 53861 104226 200137 378978 704206 1279303 2264473 3888958 6437241
20 38 83 177 353 665 1204 2120 3650 6152 10145 16355 25767 39683 59786 88210 127616 181274 253151 348005 471485
18 33 52 75 103 147 258 596 1573 4137 10313 24197 53757 114135 233848 466630 914030 1767831 3387708 6439669 12137157
16 32 61 98 136 164 171 173 281 836 2678 7743 20501 51456 125378 299753 704238 1621680 3648963 8007452 17127734
0 9 25 62 141 293 566 1037 1844 3286 6097 12096 25583 56164 124287 271914 582905 1221701 2506400 5046590 10003946
-4 12 56 141 280 486 772 1151 1636 2240 2976 3857 4896 6106 7500 9091 10892 12916 15176 17685 20456

25
09/part1.pl Normal file
View File

@@ -0,0 +1,25 @@
% :- use_module(library(readln)).
% :- initialization(start, main).
start :-
input(Input),
findall(P, (member(L, Input), predict(L, P)), Ps),
sum_list(Ps, Answer),
writef('Answer=%t\n', [Answer]).
predict(L, 0) :- maplist(=:=(0), L), !.
predict(L, X) :-
foldl([Li1, Li2, C, D]>>(Li2 is Li1 - C, D = Li1), L, [_ | NewL], 0, _),
predict(NewL, SubX),
last(L, LastL),
X is SubX + LastL.
% this does not work very lame readln cannot handle negative numbers
% input(Lines) :-
% readln(LineTmp),
% ( (last(LineTmp, end_of_file); LineTmp = [])
% -> Lines = []
% ; Line = LineTmp,
% input(CdrLine),
% Lines = [Line | CdrLine]
% ).

11
09/part2.pl Normal file
View File

@@ -0,0 +1,11 @@
start :-
input(Input),
maplist(predict, Input, Ps),
sum_list(Ps, Answer),
writef('Answer=%t\n', [Answer]).
predict(L, 0) :- maplist(=:=(0), L), !.
predict(L, X) :-
foldl([Li1, Li2, C, D]>>(Li2 is Li1 - C, D = Li1), L, [_ | NewL], 0, _),
predict(NewL, SubX),
L = [L1 | _], X is L1 - SubX.

5
09/test.pl Normal file
View File

@@ -0,0 +1,5 @@
input([
[0, 3, 6, 9, 12, 15],
[1, 3, 6, 10, 15, 21],
[10, 13, 16, 21, 30, 45]
]).

3
09/test.txt Normal file
View File

@@ -0,0 +1,3 @@
0 3 6 9 12 15
1 3 6 10 15 21
10 13 16 21 30 45

BIN
10/fill.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

142
10/input.linedrawing.pl Normal file
View File

@@ -0,0 +1,142 @@
input([
["└", "┐", "┐", "┐", "┌", "┘", "┌", "┐", "┐", "┌", "─", "┐", "┐", "─", "┌", "─", "┐", "┌", "┐", ".", "┌", "┌", ".", "┘", "┐", ".", "─", "┘", "─", "─", "┘", "┐", "┌", "│", "┐", "┌", ".", "┌", "┘", ".", "└", "─", "│", "┌", "│", "─", "┌", "│", "┌", "┘", "┐", "─", "┘", "┐", "┌", "─", "┘", "┌", "┌", "─", "┐", ".", "└", "┐", "┌", "└", "┐", "┘", "─", "┌", "┌", "│", "┐", "─", "─", "┐", ".", "└", "─", "─", "│", "┐", "┐", ".", "┌", "─", "┘", "┐", "┐", ".", "─", "┐", "┌", "┘", "┐", "┌", "┐", "┌", "┌", "─", "─", ".", "┌", "┌", "┘", "┐", "─", "┐", "─", "┌", "│", ".", "┌", "└", "─", "└", "─", "┌", "┐", ".", "┌", "│", "─", "┌", "┌", "┐", "┌", "│", "─", "┐", "─", "│", "┐", "─", ".", "┌", "┌", "─", "┐", "."],
["└", "─", "─", "┐", "┐", "─", "┌", "┘", "└", "│", "┐", "└", "┐", "┐", ".", "┌", "┘", "─", "┌", "─", "┐", ".", "│", ".", "┌", "┘", "┘", "┘", ".", "┌", "┌", "┌", "│", "┌", "┌", "─", "┐", "┐", "│", "─", "│", "┌", "┘", "─", "┌", "┘", "│", "└", "┌", "┘", "│", "─", "└", "─", "┘", "└", "└", "┌", "│", "└", "┐", "┐", "│", "┌", "┐", "└", "┐", "─", "│", "┘", "└", "─", "┘", "┐", "└", "└", "┌", "┐", "│", "┌", "└", "└", "─", "─", "┐", "┘", ".", "─", "┌", "─", "│", "─", "└", "─", "┐", "┘", "┌", "┐", "┘", "┐", "┌", "┘", "─", "┌", "─", "┐", "┐", "│", ".", "┌", "└", "┘", "┌", "┘", "┐", "└", "┘", "└", "│", "┐", ".", "└", "┐", "└", "└", "┐", "┌", "┘", "┌", "┘", "│", "└", "┘", "└", "┌", "┌", "┘", "┘", "│", "┐"],
[".", "│", "└", "│", "└", "┌", "┘", "┐", "─", "┘", "─", "┘", "│", "│", "─", "┐", "┘", "└", "└", "─", "┘", "─", "─", "─", "┘", "└", "┐", "┌", "┐", "└", "─", "└", "┌", "┐", "└", "┐", "└", "┐", "┐", "┘", "┌", "┐", "└", "┐", "─", "─", "┘", "┐", "┌", "┐", "│", ".", "┌", "┐", "└", "┌", ".", "└", "│", "─", "│", "┌", "└", "┘", "│", "└", "│", "┌", "│", "┌", "┌", "┘", "┘", "└", "┘", "┌", "┌", "┘", "─", "┐", "│", "│", "└", "┌", "┐", "┘", "┐", "┌", "┘", "┌", "─", "┐", ".", "└", "┐", "└", "│", "└", "┌", "┘", "┐", "└", "└", "│", "┐", "┘", "┌", "┘", "┌", "│", ".", "│", "│", "│", "┌", "┐", "┘", "┘", "│", "└", "─", "┐", "│", "┘", "┐", "└", "┘", ".", "┌", "┐", "─", "─", "┐", "└", "┐", "┘", "┐", "┌", "┘", "─"],
["┌", "┐", "┘", "│", ".", "└", "─", "┘", "─", "└", "┐", "┌", "┐", "┘", "┌", "┘", ".", "┐", "└", "┘", "│", "─", "┘", ".", ".", ".", "└", "│", "─", "│", "└", "│", "│", "│", "┌", "┘", "┌", "┘", ".", ".", "└", "─", "┌", "┘", "└", "└", "┐", "┐", "└", "└", "┘", "┐", "└", "┐", "┐", "┘", "│", "─", "┐", "┘", "│", "┌", "─", "─", "┐", "─", "┘", "┌", "└", "┐", "│", "┌", "┐", "┌", "┌", "┘", "└", "┘", "┘", "┌", "┘", "┐", "┐", "└", "─", "┐", "─", "└", "┐", "┌", ".", "│", "┘", ".", "│", "┌", "│", ".", "└", "─", "│", "┐", ".", ".", "│", "┌", "└", "─", "┌", "┘", "┌", "─", "┐", "─", "└", "┘", "┌", "└", "│", "─", "└", "│", "└", "│", "─", "│", "┌", "┐", "└", "└", "┐", "└", "└", ".", "│", "┌", "┌", "│", "│", "."],
["┘", "│", "─", "└", "┐", "┘", ".", "│", "│", "│", "└", ".", "┌", ".", "┌", "┘", ".", "│", "┐", "└", "┌", ".", "│", "┌", "┌", ".", "└", "└", "┐", "│", "└", "┌", "┘", "│", "│", "┌", "┘", "│", ".", "┐", ".", "└", "┐", "│", "┌", "└", "┌", "┐", "─", "└", ".", "─", "┘", "└", "┐", ".", "┌", "┐", "┘", "─", "└", "┘", "┘", "┐", "└", "│", "┌", "┘", "│", "│", "┘", "─", "─", "─", "┘", "┌", "┐", "┘", "└", "┘", "└", "└", "─", "┐", ".", "└", "┌", "┘", "┘", "┘", "└", "┐", "└", "┌", "┐", "┘", "┘", "┌", "┌", "┌", "─", "┐", "┐", "┐", "┌", "┌", "┐", "│", "│", "│", "└", "─", "┘", "┌", "│", "─", "─", "┐", "┘", "└", "┌", "└", "┐", ".", "┌", "┌", "┌", "┌", "┐", "│", "└", "┐", "┐", ".", "│", ".", "┘", "└", "─", "┐"],
["┘", "┐", "┌", "┐", "│", ".", "┌", "─", "│", "┐", "─", "┌", "┘", "┐", "└", "─", "┐", "┘", "┌", ".", ".", "┘", ".", "│", "┘", "┐", "│", "└", "└", "─", "│", "└", "┐", "└", "┘", "└", "─", "┐", "─", "─", "┐", "┘", "┘", "└", "┌", "┘", "│", "└", "┐", "┌", "┐", ".", "┌", "┘", "┐", "┐", "│", "└", "┘", "└", "┐", "┌", "└", "┌", "┌", "┌", "┐", "└", "┐", "┘", "─", "┐", "─", "│", "└", "└", "┘", ".", "│", "│", "│", ".", "└", "┘", "┐", "└", "┌", ".", "└", "┌", "│", "│", "─", "│", "│", "┌", "┌", "┌", "─", "┘", "┌", "┘", "─", "┘", "┐", "└", "─", ".", "┐", "┐", "─", "┘", "┐", "┌", "│", "└", "┘", "┌", "─", "┌", "─", "┐", "└", "─", "┌", "┌", "┐", "└", "┌", "│", "│", ".", "┌", "┐", "┘", ".", ".", "┐", ".", "┐"],
["└", "┌", ".", "└", "│", "─", "┘", "┐", "└", "┘", "─", "┐", ".", "┌", "│", "┘", ".", "┌", "└", "┐", "─", "└", "┌", "┐", "┌", "┐", "└", "─", "┘", ".", "┐", "┐", "└", "─", "┐", "┌", "─", "┘", "┐", ".", "┌", "┌", "┐", "┌", "│", "┌", "┌", "┐", "└", "─", "│", "┐", "┐", "┌", "┘", "─", "┘", "┌", "┌", ".", "│", "┐", "┌", "┌", "┐", "│", "│", "─", "│", "┐", "└", "┘", ".", "─", "┌", "└", "─", ".", "└", "─", "┌", "┘", "┐", "┐", "│", "┐", ".", ".", "└", "┌", "┐", "│", "┐", "│", "│", "┌", "┌", "┘", "┌", "─", "┘", "└", "│", "┌", "┘", "└", "└", "┌", ".", "┌", "┐", "│", "┌", "┘", "└", "┐", "┌", "┘", "└", "└", "└", "─", "└", "─", "│", "│", ".", "┌", "┘", "│", "│", "┐", "│", ".", "┌", "┌", "─", "┘", "┐", "│"],
["└", "│", "┐", "└", "│", "┐", "┌", "─", "┘", ".", "┘", "│", "┌", "┌", "┌", "─", "┌", "┘", "─", "┐", "┘", "┌", "└", "┘", "│", ".", "┌", "┘", "│", ".", "┌", "─", "─", "─", "┘", "└", "─", "─", "┐", "┘", ".", "└", "┘", "─", "┘", "┐", ".", "┌", "┐", "┘", "│", "└", "┐", "┐", "┘", "┐", ".", "┌", "┌", ".", "└", "┌", "┌", "┘", "│", "│", "│", "┐", "┌", "┐", "┐", "└", "│", "┐", "│", "┌", "┌", "─", "┘", ".", ".", "│", "│", "│", "─", "─", "─", "─", "┌", "┐", "┌", "─", "─", "┘", "└", "┐", "└", "┐", "│", ".", "│", "┌", "└", "─", "┘", ".", "┌", "┘", "─", "│", "┌", "└", "┐", "┐", "┌", "┘", "│", "┘", ".", "┌", "─", "┌", "┘", "┘", "└", "─", "┘", "└", "└", "┌", "│", "┐", "┐", "┌", "┐", "└", "─", ".", "└", "┌"],
["┐", "─", "─", "─", "└", "┌", "┐", "│", ".", "┌", "└", "┐", "┘", "└", "│", "┌", "┐", "└", "─", "└", "─", "┐", "┌", "└", "│", "┐", "┌", "┐", ".", "┌", "└", "┐", "┌", "┐", "┌", "─", "─", "─", "┘", ".", "┐", "─", "┐", ".", ".", "└", "└", "─", "┘", "┌", "└", "┘", "┌", "─", "┐", "┐", "┌", "┐", "┌", "┐", "│", "┌", "└", "┐", "└", "┘", "│", "┌", "│", "│", "┘", "┐", "└", "─", "┌", "─", "┐", "─", "└", ".", "┌", "┌", "┌", "┐", ".", ".", "┌", "┌", "┘", "│", "│", "┌", "─", "┐", "┌", "┘", "┌", "│", "│", ".", "└", "┐", ".", "│", "─", "┌", "│", ".", "┌", "┐", "└", "┘", "│", "┌", "┘", "┐", "│", "┘", ".", "│", ".", "─", "┐", "┐", "┌", "─", "┘", "─", "└", "│", "┘", "└", "┌", "─", "┘", "┐", "└", "┌", ".", "."],
["└", "┘", "┐", ".", "┌", "└", "┘", "└", "─", "─", "┐", "└", "┐", "│", "│", "─", "│", "┐", "└", "┌", "│", "┐", "┘", "┐", "┌", "─", "┘", "│", "┌", "┐", "│", "└", "┘", "│", "└", "─", "┐", "│", "└", "┌", "└", "─", "─", "┐", ".", ".", "│", "┘", "└", "┐", "└", "┌", "└", "┐", "└", "┐", "│", "│", "│", "└", "┐", "┌", "─", "┘", "┌", "─", "┘", "┌", "┘", "│", ".", "┌", "┐", "┌", "┘", "┐", "└", "┘", "┌", "└", "┐", "┌", "┘", "│", "┌", "┐", "┌", "┘", "┌", "┘", "└", "┘", "┘", "│", "│", "┌", "─", "┘", "│", "┐", "┐", "└", "┌", "┌", "┘", "┌", "─", "└", "│", "└", "┐", "│", "└", "┘", "┐", "─", "┐", "─", "┌", "┘", "└", "└", "└", "┐", "─", "┐", "┌", "┐", "┌", "─", ".", "│", "│", "┐", "┌", "┐", "┌", "┘", "┐", "."],
["└", "└", "┌", "─", "└", "┌", "─", "┐", "│", "│", "┘", "┌", "└", "─", "└", "└", "┌", "┐", "┐", "┐", "┌", "─", "─", "┌", "└", "┐", "┌", "┘", "│", "└", "─", "┐", "┌", "│", "┌", "┐", "└", "┐", "─", "┘", "┘", "┐", ".", "└", "─", "┌", "┐", ".", "┌", "┌", "┐", "─", "│", "└", "┐", "│", "│", "│", "│", "┌", "┘", "└", "─", "┐", "│", "┌", "┐", "│", "┌", "┘", "┌", "┐", "│", "│", "│", "┌", "┘", "┌", "┐", "┐", "┌", "└", "┐", "│", "│", "│", "└", "┐", "│", "└", "│", "┌", "┐", "│", "│", "│", "┌", "┐", "│", "┌", "┐", "─", "┘", "┘", "┐", "┘", "┐", "┐", "│", ".", "└", "─", "┐", "┘", "│", "┐", "└", "┌", "┘", ".", ".", "┌", "└", "─", "┐", "│", "┐", "│", "│", "┌", "─", "┐", "─", "┐", "─", "└", "┘", "┘", "─", "┐"],
["│", "─", "│", ".", "┌", "─", "┐", "└", "┐", "│", "┘", "┌", "┘", ".", "│", "┘", "│", "│", "└", "┌", "┐", "┌", "┐", "┘", "┌", "┘", "│", "└", "└", "─", "┐", "└", "─", "┘", "│", "└", "─", "┘", ".", "└", "┌", "┐", "┐", ".", "└", "│", "│", ".", "┌", "┘", "└", "┐", "┌", "─", "┘", "└", "┘", "└", "┘", "└", "┐", "┌", "─", "┘", "│", "│", "└", "┘", "└", "─", "┘", "└", "┐", "┘", "┐", "┘", "┐", "┌", "┐", "─", "┌", "┌", "┘", "│", "│", "└", "─", "┘", "└", "┐", "┌", "┘", "└", "┘", "│", "│", "│", "└", "┘", "│", "│", "┐", "┌", "│", "┌", "┘", "│", "─", "┌", "┘", ".", "┌", "─", "─", "┘", "┐", "┌", "└", "─", "┌", "┌", "─", "┐", "│", "└", "┘", "┌", "─", "┐", "┘", ".", "└", "└", "│", "┘", ".", "│", "┐", ".", "┐"],
["┘", "┐", "│", "┌", "┐", "─", "└", ".", "┌", "┌", "─", ".", ".", "┌", "┐", "┌", "│", "└", "┐", "│", "│", "─", "│", "│", "└", "┐", "└", "─", "─", "┐", "└", "─", "─", "┐", "└", "┐", "┌", "┐", "┌", "┐", "│", "│", "─", "┌", "┐", "│", "│", "─", "└", "─", "┐", "│", "└", "─", "─", "┐", "┌", "─", "─", "─", "┘", "└", "┐", "┌", "┘", "│", "┌", "─", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "─", "┘", "│", "┌", "┐", "└", "┐", "│", "│", "┌", "─", "─", "─", "┘", "└", "─", "─", "┐", "│", "│", "│", "┐", "┌", "┘", "└", "─", "─", "┐", ".", "┐", "│", "┐", "└", ".", "┌", "┌", "└", "─", "─", "┌", "┐", ".", "┌", "─", "┌", "─", "┘", "┐", "┘", "─", "┐", "┌", "┘", "┌", "─", "┐", "┘", "┘", "└", "│", "└", "│", "┌", "└"],
[".", "─", "┘", "└", "┘", ".", "│", "┐", "│", "│", "┘", "┌", "┌", "│", "│", "┌", "┘", "┌", "┘", "│", "│", "┐", "│", "─", "┌", "┘", "┌", "─", "─", "┘", "┌", "─", "─", "┘", "┌", "┘", "│", "│", "│", "│", "│", "│", ".", "│", "└", "┘", "└", "┐", "┐", "┌", "┘", "└", "┐", "┌", "─", "┘", "└", "─", "─", "┐", "┌", "─", "┘", "└", "─", "┘", "└", "─", "─", "─", "─", "┐", "┘", "│", "│", "└", "┐", "┌", "┘", "│", "└", "─", "┘", "└", "┘", "└", "┐", "┌", "┐", "┘", ".", "┌", "┐", "│", "└", "┘", "│", "┌", "┘", "┌", "─", "─", "─", "┘", "┌", "┌", "│", "┐", ".", "┌", "┌", "┌", "┐", "┌", "─", "┘", "┘", "┌", "┘", "┐", "│", "└", "┌", "─", "┐", "─", "│", "┘", "┘", "┐", ".", ".", ".", "┌", "┌", "┘", "┐", "┘", "┌", "└"],
["┐", "┌", "┘", ".", "└", "─", "┘", "┐", "┘", "└", "┐", "┌", "└", "│", "│", "└", "┐", "└", "┐", "│", "└", "┐", "┌", "─", "┘", "┌", "┘", "└", "┌", "┐", "└", "─", "─", "┐", "└", "┐", "│", "│", "│", "│", "│", "└", "┐", "└", "┐", "┌", "─", "┘", "┌", "┘", "┌", "─", "┘", "└", "─", "─", "─", "─", "┐", "│", "└", "─", "┐", "┌", "─", "─", "┐", "┌", "─", "─", "─", "┘", "┌", "┘", "└", "┐", "│", "└", "┐", "└", "─", "─", "┐", "┌", "─", "┐", "│", "│", "│", "┐", "┌", "┘", "└", "┘", "┌", "─", "┘", "│", "┌", "┘", "┌", "─", "┐", "─", "│", "│", "┌", "┐", "┐", "┌", "─", "┘", "│", "┐", ".", ".", "┌", "┘", "│", "┌", "│", ".", "┘", "└", "┐", "─", "└", "┐", "└", "│", "└", "─", "─", "┌", "│", "┘", "─", "┌", "─", "┘"],
["─", "┐", "─", "┌", "┘", "┌", "└", ".", "┘", "┌", "┐", "─", "┌", "┘", "└", "┐", "└", "┐", "└", "┘", "┌", "┘", "└", "─", "┐", "└", "─", "┐", "│", "└", "┐", "┌", "─", "┘", "┌", "┘", "│", "│", "│", "│", "│", "┌", "┘", "│", "│", "│", ".", "┌", "┘", "┌", "┘", "└", "┌", "┐", "┌", "─", "┐", "┌", "┘", "└", "┐", "┌", "┘", "└", "─", "┐", "└", "┘", "│", "┌", "┐", "─", "└", "─", "┐", "│", "│", "┌", "┘", "┌", "─", "┐", "└", "┘", "┌", "┘", "└", "┘", "└", "┐", "│", "┌", "─", "┐", "│", "┌", "┐", "│", "│", "┌", "┘", "┌", "┘", "┌", "┐", "┐", "│", "│", "─", "└", "┐", "┌", "┘", "┐", "─", "┌", "┐", "─", "┌", "│", "│", "┌", "│", "└", "┘", "┐", "┌", "┘", ".", "─", "─", "└", "─", "└", "┌", ".", "└", "┘", "┐", "│"],
["│", "│", ".", "┌", "┐", "┘", "│", "┌", "└", "┘", "│", "│", "└", "─", "┐", "│", "└", "└", "─", "┐", "└", "┐", "┌", "┐", "│", "┌", "─", "┘", "│", "┌", "┘", "└", "─", "┐", "│", "┌", "┘", "│", "│", "└", "┘", "│", "┘", "┌", "┘", "│", "┌", "┘", "┌", "┘", "┌", "┐", "│", "└", "┘", "┌", "┘", "└", "─", "┐", "└", "┘", "┌", "─", "─", "┘", "┌", "┐", "┌", "┘", "└", "┐", "┌", "─", "┘", "│", "│", "└", "┐", "└", "┐", "└", "┐", "┌", "┘", "┌", "┐", "┌", "┐", "│", "└", "┘", "┌", "┘", "└", "┘", "│", "│", "└", "┘", "┌", "┘", "┌", "┘", "└", "┐", "│", "│", "┘", "┌", "┘", "│", "┌", "┐", "┐", "│", "└", "─", "┐", ".", "└", "┐", "┘", ".", "└", "┌", "┐", ".", "└", "┘", "┌", "┘", "┌", "┐", "│", "┘", "┘", "─", "└", "┐"],
["─", "┐", "┐", "└", "┐", "┌", "┌", "│", "┘", "┌", "─", "─", "┌", "─", "┘", "└", "─", "─", "┐", "└", "┐", "│", "│", "└", "┘", "│", ".", "┌", "┘", "└", "┐", "┌", "─", "┘", "└", "┘", "┌", "┘", "└", "─", "┐", "└", "┐", "└", "┐", "└", "┘", "┌", "┘", "┘", "│", "│", "└", "┐", "┌", "┘", "┌", "─", "─", "┘", "┌", "┐", "└", "─", "┐", "└", "│", "└", "┘", "┌", "─", "┘", "└", "─", "┐", "│", "│", "┌", "┘", "└", "└", "┐", "│", "└", "─", "┘", "└", "┘", "│", "└", "┐", ".", "└", "┐", "┌", "┐", "└", "┘", "┌", "─", "┘", "─", "│", "┌", "─", "┘", "│", "│", "│", "└", "┐", "│", "│", "└", "┐", "└", "┐", "┌", "┘", "┐", "─", "│", "┘", "┐", "┌", "┘", ".", "┌", "└", "┐", "┘", "─", "└", "└", "┘", "└", "└", "│", ".", "│"],
["│", "└", "┐", "┘", "└", "┘", "┘", "│", ".", "└", "│", "┌", "└", "┐", "┌", "─", "─", "┐", "└", "─", "┘", "│", "└", "─", "┐", "└", "┐", "└", "┐", "┌", "┘", "└", "─", "─", "─", "┐", "│", "┌", "┐", "│", "│", "┌", "┘", "┌", "└", "┐", "┌", "┘", "┌", "┐", "│", "│", "┌", "┘", "└", "┐", "└", "┐", "┌", "─", "┘", "│", "┌", "─", "┘", "┌", "┘", "┌", "─", "┘", "┌", "─", "┐", "┌", "┘", "└", "┘", "└", "┐", "┌", "─", "┘", "└", "┐", "│", "┌", "─", "─", "┘", "┌", "┘", "┌", "┐", "└", "┘", "│", "┌", "─", "┘", "┌", "─", "┐", "│", "│", "┌", "┐", "│", "└", "┐", "┌", "┘", "└", "┘", "┌", "┘", "┌", "┘", "│", "─", "┌", "┐", "│", "┌", "─", "┐", "└", "┐", "─", "└", "│", "─", ".", "│", "┘", "┌", "─", "─", "│", "┐", "."],
["└", "│", ".", "┌", "┘", "┐", "┌", "─", "│", ".", "│", "┐", "┌", "└", "┘", "┌", "┐", "└", "─", "┐", "┌", "┘", "┌", "┐", "│", "┌", "┘", "┌", "┘", "└", "┐", "┌", "┐", "┌", "─", "┘", "│", "│", "│", "┌", "┘", "└", "─", "┐", "┌", "┘", "└", "┐", "│", "│", "│", "└", "┘", "┌", "─", "┘", "┌", "└", "┘", "┌", "─", "┘", "└", "─", "┐", "└", "┐", "└", "┐", "─", "│", "┌", "┘", "│", "┌", "─", "─", "─", "┘", "└", "─", "─", "┐", "└", "┐", "└", "─", "─", "┐", "└", "┐", "│", "└", "─", "┐", "│", "└", "─", "┐", "└", "┐", "└", "┘", "│", "│", "│", "└", "┐", "│", "└", "┐", "┌", "─", "┘", ".", "└", "┐", "└", "─", "┐", "┘", "┐", "│", "┌", "─", "┐", "┘", "│", "└", "┘", "│", ".", "│", "─", "└", "┐", "─", "└", "─", "┐"],
["│", "└", "┘", "─", ".", "└", "└", "─", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "└", "┐", "┌", "┘", "└", "─", "┘", "└", "┘", "└", "─", "┘", "┌", "─", "┘", "│", "│", "│", "┌", "┐", "└", "┘", "│", "└", "┐", "┌", "─", "┘", "└", "┐", "┌", "┘", "│", "│", "└", "─", "┐", "│", "─", "┌", "┐", "┌", "┐", "└", "─", "┐", "┌", "─", "┘", "┌", "┘", "┌", "┘", "┌", "┘", "│", "─", "│", "│", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "┌", "┘", "┌", "─", "┐", "│", "┌", "┘", "│", "┌", "─", "┘", "│", "┌", "─", "┘", "│", "└", "─", "┐", "└", "┘", "└", "┐", "│", "│", "┌", "┘", "└", "┐", "┌", "┐", "┘", "│", "┌", "─", "┘", "┌", "┐", "┐", "┘", ".", "┘", "┌", "─", "┘", "─", "┌", "┌", "┘", "└", "└", "┘", "┐", "┐", "│", "│"],
["│", "─", "└", "┌", "─", "─", "└", "┐", "│", "└", "┘", "│", "│", "│", "└", "─", "┐", "│", "└", "┐", "┌", "─", "─", "─", "─", "┐", "┌", "─", "┘", "┌", "┐", "│", "│", "└", "┘", "└", "─", "┐", "└", "┐", "│", "└", "┐", "┘", "─", "│", "│", "┌", "┘", "└", "┐", "┌", "┘", "└", "┐", "│", "│", "│", "└", "─", "─", "┘", "│", "┌", "┐", "│", "┌", "┘", "┌", "┘", "┌", "┘", "┌", "┘", "│", "│", "│", "│", "│", "│", "│", "│", "┌", "┘", "┐", "└", "┐", "└", "┘", "└", "─", "┘", "└", "┐", "┌", "┘", "└", "─", "─", "┐", "┌", "─", "┘", "┌", "┐", "┌", "┘", "│", "│", "│", "┌", "─", "┘", "│", "└", "┐", "│", "└", "─", "─", "┘", "└", "┐", "│", "┐", ".", "│", "┐", "│", ".", "┐", "└", "┘", "┐", "└", "┘", "│", "└", "┌", "┘"],
["┘", "─", "─", "┘", ".", "└", "└", "└", "└", "─", "┐", "└", "┘", "│", "┌", "┐", "│", "│", "┌", "└", "┘", "┐", "┌", "─", "┐", "│", "└", "─", "┐", "│", "│", "│", "└", "┐", "┘", "┌", "┐", "│", "┌", "┘", "└", "┐", "└", "┐", "┌", "┘", "└", "┘", "┌", "─", "┘", "└", "┐", "┌", "┘", "│", "│", "└", "─", "─", "─", "┐", "│", "│", "│", "│", "└", "─", "┘", "┌", "┘", "│", "└", "┐", "│", "│", "│", "│", "│", "│", "│", "│", "│", "┘", "│", "┐", "└", "─", "─", "─", "─", "┐", "┌", "┘", "│", "┌", "─", "─", "─", "┘", "│", "┌", "─", "┘", "└", "┘", "┌", "┘", "└", "┘", "│", "┌", "┐", "└", "┐", "│", "│", "┌", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "│", "┌", "┐", "┌", "┐", "┐", "┌", "│", "┐", ".", "│", "┌", "└", "┌"],
["│", "┌", "└", ".", "┌", "└", "│", "└", "┌", "┐", "└", "─", "┐", "└", "┘", "└", "┘", "└", "─", "─", "─", "┐", "│", "┌", "┘", "└", "─", "┐", "└", "┘", "│", "└", "┐", "│", "┌", "┘", "│", "│", "│", "┌", "┐", "└", "┐", "└", "┘", "┌", "─", "─", "┘", "┌", "┌", "┐", "│", "│", "│", "│", "│", "┌", "┐", "┌", "─", "┘", "└", "┘", "└", "┘", "┌", "─", "─", "┘", "┌", "─", "─", "┘", "└", "┘", "│", "│", "└", "┘", "│", "│", "└", "┐", "└", "┌", "┐", "│", "┌", "─", "─", "┘", "│", "┌", "┘", "│", "┌", "─", "┐", "┌", "┘", "└", "┐", ".", "┌", "┐", "└", "┐", "┌", "─", "┘", "│", "└", "┐", "│", "└", "┘", "└", "─", "─", "─", "┐", "┌", "┘", "│", "┌", "│", "└", "┘", "─", "┌", "┐", "─", "│", "└", "┘", "│", "┌", "┌", "┘"],
["│", "│", "┘", "┌", "┐", "┘", "┌", "─", "┘", "└", "─", "─", "┘", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "└", "┘", "└", "─", "┐", "┌", "┘", "┌", "─", "┘", "┌", "┘", "│", "│", "┌", "┘", "│", "│", "│", "│", "─", "│", "┌", "─", "┘", "┌", "┐", "┌", "┐", "│", "│", "│", "│", "┌", "┘", "│", "│", "│", "└", "─", "─", "─", "┐", "┌", "┐", "└", "─", "┐", "┌", "└", "─", "─", "─", "─", "┐", "│", "└", "┐", "┌", "┘", "└", "┐", "│", "┌", "┘", "└", "┐", "└", "─", "─", "┐", "└", "┘", "┌", "┘", "└", "┐", "│", "└", "┐", "┌", "┘", "┌", "┘", "└", "┐", "│", "└", "─", "┐", "│", "┌", "┘", "└", "┐", "┌", "─", "─", "─", "─", "┘", "└", "┐", "└", "┐", "┌", "┐", "└", "┌", "┘", "│", "┌", "│", "┐", "─", "┘", "└", "│", "┘"],
["│", "└", "┐", "─", "┌", "─", "└", "─", "─", "─", "─", "─", "┐", "│", "└", "┘", "│", "│", "└", "┘", "└", "─", "─", "─", "┐", "│", "└", "┐", "│", "┌", "┐", "└", "┐", "│", "│", "└", "┐", "│", "└", "┘", "│", "┌", "┘", "│", "┌", "┐", "│", "└", "┘", "│", "│", "│", "│", "│", "└", "┐", "│", "│", "└", "┐", "┌", "┐", "┌", "┘", "│", "└", "─", "┐", "│", "┌", "─", "┐", "┌", "┐", "┌", "┘", "└", "─", "┘", "│", "└", "┌", "│", "│", "│", "┌", "─", "┘", "┘", "┌", "┐", "└", "─", "┐", "│", "┌", "┐", "│", "└", "┐", "│", "│", "┌", "┘", "┌", "─", "┘", "└", "┐", "┌", "┘", "│", "│", "┌", "┐", "│", "│", "┌", "┐", "└", "┌", "┐", "┌", "┘", "┌", "┘", "│", "└", "┐", "└", "┐", "│", "┌", "│", "└", "┐", "┘", "│", "└", "└"],
["─", ".", "│", "└", "│", "┘", "│", ".", "┌", "─", "─", "─", "┘", "│", "┌", "─", "┘", "└", "─", "┐", "│", "┌", "─", "─", "┘", "└", "─", "┘", "│", "│", "│", "─", "│", "│", "│", "┌", "┘", "└", "┐", "┌", "┘", "└", "┐", "└", "┘", "│", "│", "┌", "─", "┘", "│", "│", "│", "│", "┌", "┘", "│", "└", "┐", "│", "│", "└", "┘", "┌", "┘", "┌", "┐", "└", "┘", "│", "┌", "┘", "│", "│", "└", "─", "─", "─", "┐", "└", "┐", "┌", "┘", "└", "┘", "└", "┐", "┌", "─", "┘", "│", "┌", "┐", "│", "└", "┘", "│", "│", "┌", "┘", "│", "│", "└", "┐", "└", "─", "┐", "─", "│", "│", "┐", "│", "│", "│", "│", "│", "└", "┘", "└", "─", "┘", "│", "│", "┌", "┘", "┌", "│", "┌", "┘", "┌", "┘", "└", "┐", "─", "┐", ".", "┌", "│", "─", "."],
["└", "─", "┐", ".", "│", ".", "┌", "┐", "└", "─", "┐", "┌", "┐", "│", "└", "┐", "┌", "─", "─", "┘", "┌", "┘", "┌", "┐", "┌", "┐", "┌", "┐", "└", "┘", "└", "─", "┘", "│", "│", "└", "┐", "┌", "┘", "│", "┐", "└", "└", "┐", "┌", "┘", "│", "│", "┌", "┐", "│", "│", "│", "│", "└", "┐", "│", "┌", "┘", "│", "└", "─", "┐", "│", "┌", "│", "└", "┐", "┌", "┘", "└", "─", "┘", "│", "┌", "┐", "┌", "┐", "│", "┌", "┘", "│", "┌", "─", "─", "─", "┘", "└", "─", "┐", "│", "│", "│", "│", "┌", "┐", "│", "│", "└", "┐", "│", "│", "┌", "┘", "┌", "─", "┘", "┌", "┘", "└", "┐", "│", "│", "│", "│", "│", "┌", "─", "─", "┐", "┌", "┘", "│", "│", "┌", "┐", "│", "└", "─", "┘", "┌", "─", "┘", "┘", "└", "│", "┐", "┘", "└", "┘"],
["┌", "┌", ".", "┌", "┌", "─", "└", "┌", "─", "─", "┘", "│", "│", "│", "┘", "│", "│", "┌", "─", "┐", "└", "┐", "│", "│", "│", "└", "┘", "└", "─", "─", "─", "┐", "┌", "┘", "│", "┌", "┘", "└", "┐", "└", "┐", "└", "┌", "┘", "│", "─", "│", "│", "│", "│", "│", "│", "│", "└", "┐", "│", "│", "└", "┐", "└", "┐", "┌", "│", "└", "┐", "│", "┌", "┘", "└", "─", "─", "─", "┐", "└", "┘", "│", "│", "└", "┘", "│", "│", "│", "│", "┌", "─", "─", "┐", "┌", "─", "┘", "└", "┘", "│", "│", "│", "└", "┘", "│", "┌", "┘", "│", "│", "│", "┌", "┘", "┌", "┐", "└", "┐", "┌", "┘", "│", "└", "┘", "└", "┘", "└", "─", "┐", "└", "┘", "┘", "│", "│", "│", "│", "│", "┌", "─", "─", "┘", "┘", "│", "│", "│", "└", "┘", ".", "┌", "┘"],
["┌", "└", "─", "┐", "┘", ".", ".", "└", "─", "┐", "┌", "┘", "└", "┘", "│", "└", "┘", "└", "┐", "└", "┐", "│", "│", "│", "│", "┌", "─", "─", "─", "─", "─", "┘", "└", "┐", "│", "│", "┌", "┐", "└", "┐", "└", "┐", "└", "┐", "│", "┌", "┘", "│", "│", "│", "│", "│", "│", "┌", "┘", "│", "│", ".", "└", "┐", "│", "┌", "┘", "┌", "┘", "│", "│", "┌", "┐", "┌", "┌", "┐", "└", "─", "┐", "│", "└", "─", "┐", "└", "┐", "│", "└", "┘", "┌", "─", "┘", "└", "─", "─", "─", "┐", "└", "┘", "└", "┐", "┌", "┘", "└", "┐", "│", "│", "│", "└", "┐", "│", "│", "┌", "┘", "└", "┐", "│", "┌", "─", "─", "─", "─", "┐", "└", "─", "┐", "┌", "┘", "│", "│", "│", "│", "│", "┌", "─", "┐", "│", "└", "┐", "┘", "┘", "│", "┌", "└", "┘"],
["─", "┐", "┘", ".", "│", "┌", "│", "┌", "└", "└", "┘", "┘", "┘", "└", "┘", "│", "┌", "┐", "└", "┐", "│", "└", "┘", "└", "┘", "└", "┐", "┌", "─", "─", "─", "─", "┐", "└", "┘", "└", "┘", "└", "┐", "└", "┐", "└", "┐", "│", "└", "┘", "┌", "┘", "│", "└", "┘", "│", "│", "│", "┌", "┘", "└", "┐", "┌", "┘", "└", "┘", "┌", "┘", "┌", "┘", "│", "│", "└", "─", "┘", "└", "─", "┐", "│", "│", "┌", "┐", "│", "┌", "┘", "└", "─", "┐", "└", "┐", "┌", "┐", "┐", "┌", "┐", "└", "─", "┐", "┌", "┘", "└", "─", "┐", "│", "│", "│", "│", "┌", "┘", "│", "│", "│", "┌", "┐", "└", "┘", "└", "─", "┐", "┌", "┐", "└", "─", "─", "┘", "└", "┐", "└", "┘", "└", "┘", "└", "┘", "┌", "┘", "┐", "┘", "│", ".", "┘", "└", "┐", "┐", "."],
["└", "│", "─", "─", "└", "┐", "│", "┐", ".", "└", "│", "─", "┌", "┘", ".", "┌", "┘", "│", "┌", "┘", "└", "─", "┐", "┐", "┌", "┐", "└", "┘", "┌", "─", "─", "─", "┘", "┌", "─", "─", "─", "─", "┘", "─", "│", "┌", "┘", "│", "┌", "┐", "└", "┐", "└", "┐", "┌", "┘", "│", "│", "│", "┌", "─", "┘", "└", "─", "─", "┐", "└", "┐", "│", "┌", "┘", "└", "─", "─", "┐", "┌", "─", "┘", "│", "└", "┘", "│", "│", "└", "┐", "┌", "─", "┘", "┌", "┘", "│", "│", "┌", "┘", "│", "┌", "─", "┘", "│", "┌", "┐", "┌", "┘", "└", "┘", "│", "│", "└", "┐", "│", "│", "│", "│", "└", "─", "─", "─", "─", "┘", "│", "│", "─", "┌", "┐", "└", "┌", "┘", "┌", "┐", "┌", "┐", "┌", "─", "┘", "┐", "│", "└", "┌", "┘", "└", "─", "└", "└", "┐"],
["│", "┘", "┘", "│", "└", "└", "┌", "┐", "┐", "│", "└", "│", "│", ".", "┌", "└", "┐", "│", "└", "─", "┐", "┌", "┘", "┌", "┘", "└", "─", "─", "┘", "┌", "┐", "┌", "┐", "└", "┐", "┘", "┌", "┐", "─", "┌", "┘", "└", "┐", "└", "┘", "└", "┐", "└", "─", "┘", "└", "┐", "│", "│", "│", "│", "┌", "┐", "┌", "─", "┐", "│", "┌", "┘", "│", "│", "┌", "─", "─", "┐", "│", "│", "┌", "┐", "└", "─", "┐", "│", "│", "┌", "┘", "└", "─", "┐", "│", "└", "│", "│", "│", "┌", "┘", "└", "─", "┐", "│", "│", "│", "└", "─", "─", "┐", "│", "│", "┌", "┘", "│", "│", "│", "└", "─", "┐", "┌", "─", "─", "┐", "│", "└", "─", "┘", "└", "─", "┘", "┌", "┘", "│", "│", "│", "└", "─", "─", "┐", "┘", "┐", "┐", "┘", "┐", "─", "└", "┌", "┌"],
[".", "┌", "─", "┐", "─", "└", "│", "┘", "└", "└", "┐", "└", "┌", "─", "─", "─", "┘", "└", "─", "─", "┘", "└", "┐", "└", "─", "─", "─", "─", "─", "┘", "└", "┘", "└", "┐", "└", "┐", "│", "└", "┐", "└", "─", "┐", "└", "┐", "┌", "┐", "└", "─", "┐", "┌", "─", "┘", "│", "│", "│", "└", "┘", "│", "└", "┐", "│", "│", "└", "┐", "│", "│", "└", "─", "┐", "│", "│", "│", "│", "└", "┐", "┌", "┘", "└", "┘", "│", "┌", "─", "┐", "│", "│", "┌", "┘", "│", "│", "│", "┌", "┐", "┌", "┘", "└", "┘", "│", "┌", "┐", "┌", "┘", "│", "│", "│", "┌", "┘", "└", "┘", "┌", "─", "┘", "│", "┌", "─", "┘", "└", "┐", "┌", "─", "─", "┐", "┌", "┘", "─", "└", "┘", "└", "┐", "┌", "─", "┘", "└", "└", "┘", "┌", "┘", "┐", "─", "┌", "│"],
["┐", "│", "┌", "└", "┐", ".", "│", "─", ".", "└", "┌", "─", "└", "─", "─", "─", "─", "─", "─", "─", "┐", "┌", "┘", "┌", "┐", "┌", "─", "─", "─", "─", "─", "─", "─", "┘", "┌", "┘", "│", "┌", "┘", "┌", "┐", "│", "┌", "┘", "│", "│", "┌", "┐", "│", "│", "┌", "┐", "│", "│", "│", "┌", "─", "┘", "┌", "│", "│", "└", "┐", "│", "│", "│", "┌", "┐", "│", "│", "│", "│", "└", "┐", "│", "│", "┌", "─", "─", "┘", "└", "┐", "│", "│", "│", "└", "┐", "│", "│", "│", "│", "│", "└", "─", "─", "┐", "│", "│", "│", "└", "┐", "│", "│", "│", "└", "┐", "┌", "┐", "└", "─", "┐", "│", "└", "─", "┐", "│", "│", "└", "─", "┐", "│", "└", "─", "─", "─", "┐", "┌", "┘", "└", "─", "┐", "─", "┘", "│", "┌", "┌", "└", ".", "─", "│"],
["└", "┘", ".", "└", "─", "┌", "┘", "┌", "└", "─", "┌", "┌", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "│", "└", "─", "┘", "│", "└", "─", "┐", "┌", "─", "─", "─", "─", "┐", "└", "─", "┘", "│", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "│", "└", "┘", "└", "┘", "│", "│", "│", "│", "│", "┌", "┐", "┌", "┘", "└", "┐", "│", "│", "│", "│", "│", "│", "│", "│", "│", "│", "┌", "┘", "│", "│", "└", "─", "┐", "┌", "┐", "│", "│", "│", "└", "┐", "│", "│", "│", "│", "│", "└", "┐", "┌", "┐", "│", "│", "│", "│", "┌", "┘", "└", "┘", "└", "─", "┘", "│", "│", "┌", "┐", "└", "┘", "┌", "┐", "└", "─", "┘", "┌", "┐", "│", "└", "─", "─", "─", "─", "┘", "│", "┌", "┐", "┌", "┘", ".", "└", "┘", ".", "│", "┘", "─", "└", "│"],
["│", "│", "┐", "│", "┐", "┘", "└", "─", "┘", "│", "│", "┌", "┘", "└", "┘", "│", "│", "│", "│", "│", "└", "─", "─", "┐", "│", "┌", "┐", "└", "┘", "┌", "─", "─", "─", "┘", "┌", "─", "┐", "│", "└", "┐", "└", "┘", "│", "└", "┐", "│", "└", "─", "─", "┐", "└", "│", "│", "│", "│", "└", "┘", "│", "└", "┐", "┌", "┘", "│", "│", "│", "│", "│", "│", "│", "└", "┘", "│", "│", "─", "│", "│", "┌", "─", "┘", "│", "└", "┘", "│", "│", ".", "│", "│", "│", "│", "│", "└", "┐", "│", "│", "└", "┘", "└", "┘", "└", "┘", "┌", "─", "─", "─", "─", "─", "┘", "└", "┘", "└", "┐", "┌", "┘", "│", "┌", "┐", "┌", "┘", "│", "└", "─", "┐", "┌", "┐", "┌", "┐", "└", "┘", "└", "┘", "┌", "┐", "┐", "┐", ".", "│", "└", "─", "┘", "│"],
["─", "└", "┘", "─", "┐", "─", "┘", "│", "└", "└", "─", "└", "┐", "┌", "┐", "└", "┘", "└", "┘", "│", "┌", "┐", "┌", "┘", "└", "┘", "│", "┌", "┐", "└", "─", "─", "─", "┐", "│", "┌", "┘", "└", "┐", "└", "┐", "┌", "┘", "┌", "┘", "└", "┐", "┌", "┐", "│", "┌", "┘", "│", "│", "└", "─", "┐", "│", "┌", "┘", "│", "┌", "┘", "└", "┘", "│", "│", "│", "│", "┌", "─", "┘", "└", "┐", "│", "│", "│", "┌", "┐", "└", "─", "┐", "│", "│", "┌", "┘", "│", "└", "┘", "└", "┐", "│", "│", "└", "─", "─", "─", "┐", "┌", "─", "┘", "┌", "┐", "┌", "─", "─", "─", "─", "┐", "┌", "┘", "└", "┐", "│", "│", "│", "└", "┐", "│", "┌", "─", "┘", "│", "│", "│", "│", "┌", "─", "─", "─", "┘", "└", "┐", "─", "┐", "└", "┐", "┘", ".", "┌"],
["│", ".", "┌", "└", "┐", "┐", "┌", "┌", "┘", "┐", ".", "└", "└", "┘", "└", "─", "─", "─", "┐", "└", "┘", "│", "└", "─", "─", "┐", "│", "│", "│", "┌", "─", "─", "┐", "└", "┘", "└", "┐", "┌", "┘", "┌", "┘", "└", "┐", "└", "┐", "┘", "│", "│", "│", "│", "└", "┐", "│", "└", "┐", "┌", "┘", "│", "│", "┌", "┘", "└", "─", "─", "┐", "│", "│", "│", "│", "└", "┐", "┌", "┐", "│", "│", "│", "│", "│", "│", "┌", "─", "┘", "│", "│", "└", "┐", "│", "└", "┌", "┐", "│", "│", "│", "┌", "─", "─", "─", "┘", "│", "┌", "┐", "│", "└", "┘", "┌", "─", "┐", "┌", "┘", "└", "─", "─", "┘", "└", "┘", "└", "─", "┘", "└", "┘", "┌", "┐", "│", "│", "│", "└", "┘", "┌", "─", "┐", "┌", "─", "┘", "─", "┐", "└", "┘", "┐", "─", "│"],
["│", ".", "│", "└", "│", "│", "│", "│", "─", "┌", "┐", "└", "└", "┌", "┐", "┌", "┐", "┌", "└", "─", "┐", "│", "┘", "┌", "┐", "│", "│", "│", "│", "└", "─", "┐", "└", "─", "─", "─", "┘", "└", "┐", "└", "┐", ".", "│", "┌", "┘", "┌", "┘", "│", "│", "│", "┐", "│", "└", "┐", "│", "└", "┐", "│", "│", "│", "┌", "┐", "┌", "─", "┘", "└", "┘", "│", "│", "┌", "┘", "│", "│", "│", "│", "│", "│", "│", "│", "└", "─", "┐", "│", "│", "┌", "┘", "└", "┐", "│", "└", "┘", "│", "│", "└", "─", "─", "┐", "┌", "┘", "│", "│", "└", "┐", "┐", "└", "┐", "└", "┘", "┌", "┐", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "│", "│", "└", "┘", "┌", "─", "┘", "│", "│", "└", "┐", "┘", "│", "│", "┐", "┐", "│", ".", "│"],
["└", "└", "┘", "┘", "┌", "│", "│", "│", ".", "└", "┌", "┌", "─", "┘", "└", "┘", "└", "─", "─", "─", "┘", "└", "─", "┘", "└", "┘", "│", "│", "│", "┌", "┐", "└", "─", "─", "─", "─", "─", "┐", "└", "┐", "│", "┌", "┘", "│", "┐", "│", "┌", "┘", "│", "│", "┌", "┘", "┌", "┘", "│", "┌", "┘", "│", "│", "│", "│", "│", "└", "┐", "┌", "─", "┐", "│", "│", "└", "┐", "│", "└", "┘", "│", "│", "│", "│", "└", "┐", "┌", "┘", "└", "┘", "└", "┐", "┌", "┘", "│", "┌", "┐", "│", "└", "┐", "┌", "┐", "│", "│", "┌", "┘", "└", "─", "┘", "┌", "┐", "└", "─", "┐", "│", "└", "┐", "│", "│", "│", "│", "│", "└", "┘", "│", "│", "┌", "┘", "│", "┌", "─", "┘", "┌", "─", "┐", "└", "─", "┘", "─", "┌", ".", "┌", "│", "└", "─", "│"],
["└", "│", "│", ".", ".", "┘", "┐", "┘", "─", "└", "┌", "└", "┐", "┌", "─", "┐", "┌", "─", "─", "─", "─", "┐", "┌", "─", "─", "┐", "└", "┘", "└", "┘", "└", "┐", "┌", "┌", "┐", "┌", "┐", "└", "┐", "└", "┘", "└", "┐", "└", "┐", "│", "│", "┌", "┘", "│", "└", "┐", "└", "┐", "│", "└", "┐", "│", "│", "└", "┘", "└", "┐", "└", "┘", "┌", "┘", "│", "│", "┌", "┘", "│", "┌", "─", "┘", "│", "│", "└", "┐", "│", "│", "┌", "─", "─", "─", "┘", "│", "┌", "┘", "│", "│", "└", "┐", "└", "┘", "│", "│", "│", "│", "┌", "─", "─", "─", "┘", "└", "─", "─", "┘", "│", "┌", "┘", "│", "│", "│", "└", "┘", "┌", "─", "┘", "│", "│", "┘", "│", "└", "─", "─", "┘", "┌", "┘", "┌", "─", "─", "─", "┐", "┐", "─", ".", "┐", "└", "└"],
["┌", "┌", "┌", "─", "┐", "─", "─", "┐", "┌", "─", "└", "┌", "┘", "│", "└", "└", "┘", "┌", "─", "─", "┐", "└", "┘", "┌", "┐", "└", "─", "─", "┐", "┌", "┐", "└", "─", "┘", "└", "┘", "└", "─", "┘", "┌", "┐", "│", "│", "┌", "┘", "│", "│", "└", "─", "┘", "│", "│", "┌", "┘", "│", "┌", "┘", "│", "└", "─", "─", "┐", "└", "┐", "┌", "┘", ".", "└", "┘", "└", "─", "┘", "│", "┌", "┐", "│", "└", "─", "┘", "└", "┘", "└", "┐", "┌", "┐", "┌", "┘", "└", "┐", "│", "└", "┐", "└", "─", "┐", "│", "│", "│", "│", "└", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "└", "─", "┘", "└", "┘", "┌", "┐", "└", "─", "─", "┘", "└", "─", "┘", "┌", "┐", "┌", "─", "┘", "└", "│", "┌", "─", "─", "┘", "┘", "┌", "─", "┐", "┌", "┘"],
["┌", "└", "└", "┐", "┌", "─", ".", "└", ".", "│", "┌", "┘", "┌", "┘", "─", "└", "┌", "┘", "┌", "┐", "└", "─", "─", "┘", "└", "─", "─", "─", "┘", "│", "└", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "└", "┐", "│", "└", "┐", "│", "└", "─", "┐", "┌", "─", "┘", "└", "┐", "│", "└", "┐", "│", "┌", "┐", "┌", "┘", "┌", "┘", "└", "─", "─", "─", "┐", "┌", "─", "─", "┘", "│", "│", "└", "─", "─", "┐", "┌", "┐", "┐", "│", "│", "│", "└", "┐", "┌", "┘", "└", "┐", "└", "┐", "┌", "┘", "│", "│", "└", "┘", "┌", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "┐", "│", "│", "┌", "─", "─", "┐", "┌", "─", "─", "┘", "│", "└", "┐", "┌", "┐", "│", "│", "┌", "┐", "└", "─", "┘", "│", "│", "└", "│"],
["└", "│", "└", "┐", "┘", "└", "┌", ".", "┌", "─", "└", "┐", "│", "─", "┌", "┐", "└", "┐", "│", "└", "┐", "┌", "┐", "┌", "─", "┐", "┌", "─", "┐", "│", "┌", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "└", "─", "┘", "└", "─", "─", "┘", "│", "┌", "─", "┐", "│", "│", "┌", "┘", "│", "│", "│", "│", "┐", "│", "┌", "┐", "┌", "┐", "┌", "┘", "└", "─", "─", "┐", "│", "└", "┐", "┌", "─", "┘", "│", "│", "┌", "┘", "│", "└", "┐", "│", "└", "┐", "┌", "┘", "┌", "┘", "└", "┐", "└", "┘", "┌", "┐", "└", "─", "─", "─", "─", "─", "┐", "┌", "─", "─", "─", "─", "─", "┐", "│", "│", "└", "┘", "┌", "─", "┘", "└", "─", "┐", "┐", "└", "┐", "└", "┘", "└", "┘", "└", "┘", "│", "┐", "─", "┌", "─", "┌", ".", "│"],
["┌", "│", "─", "│", ".", "─", "┘", "┌", "└", "└", "└", "└", "┘", "┐", "│", "│", "┌", "┘", "│", "┌", "└", "┘", "└", "┘", "┌", "┘", "└", "┐", "└", "┘", "└", "─", "─", "─", "─", "┐", "┌", "┐", "┌", "─", "┐", "┌", "┐", "┌", "─", "┐", "┌", "─", "┐", "│", "└", "┐", "│", "│", "│", "│", "┌", "┘", "│", "└", "┘", "┌", "┘", "│", "│", "│", "└", "┘", "┌", "─", "─", "─", "┘", "└", "┐", "│", "└", "─", "─", "┘", "│", "└", "─", "┘", "└", "│", "│", "│", "│", "│", "│", "└", "─", "┐", "│", "┌", "─", "┘", "└", "─", "─", "─", "┐", "┌", "┐", "└", "┘", "┌", "─", "┐", "┌", "┐", "│", "│", "└", "─", "┐", "└", "─", "─", "─", "┐", "└", "─", "┐", "│", "┌", "─", "─", "┐", "┌", "┐", "└", "┐", "─", "┌", "─", "└", "─", "│"],
["┘", ".", ".", "└", ".", "┘", ".", "│", "─", "└", "┌", "└", "┌", "─", "┘", "│", "└", "┐", "│", "┌", "─", "─", "─", "─", "┘", "┌", "─", "┘", "┘", "┌", "─", "─", "─", "─", "─", "┘", "│", "│", "│", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "┌", "┘", "└", "─", "┘", "└", "┘", "│", "│", "└", "┐", "└", "─", "┐", "└", "┐", "│", "│", "└", "┐", "┌", "└", "─", "┐", "┌", "─", "┐", "│", "│", "┌", "┐", "┌", "┐", "│", "┌", "─", "─", "─", "┘", "└", "┐", "│", "└", "─", "─", "┐", "│", "│", "└", "─", "┐", "┌", "┐", "┌", "┐", "└", "┘", "└", "─", "─", "┘", "└", "└", "┘", "└", "┘", "│", "┌", "┐", "└", "┐", "┌", "┐", "└", "│", "┌", "─", "┘", "│", "└", "─", "┐", "└", "┘", "└", "─", "┘", "─", "│", ".", ".", "─", "┘"],
["┌", "┌", ".", "┌", "┌", ".", "─", "─", "─", "─", "┘", "┘", "└", "─", "┐", "└", "┐", "└", "┘", "└", "─", "─", "─", "─", "┐", "│", "┌", "─", "┐", "└", "─", "┐", "┌", "─", "─", "─", "┘", "│", "│", "└", "─", "┘", "└", "┘", "└", "─", "┘", "└", "─", "─", "┐", "┌", "┐", "┌", "┘", "│", "┐", "└", "┐", "┌", "┘", ".", "└", "┘", "└", "┐", "│", "┌", "─", "─", "┘", "└", "┐", "└", "┘", "│", "│", "└", "┘", "└", "┘", "│", "┌", "┐", "┌", "┐", "┌", "┘", "│", "┌", "┐", "┌", "┘", "└", "┘", "┌", "┐", "└", "┘", "└", "┘", "└", "─", "─", "─", "─", "─", "─", "─", "┐", "┌", "┌", "┐", "└", "┘", "└", "┐", "└", "┘", "└", "┐", "│", "└", "─", "┐", "│", "┌", "┐", "└", "┐", "┘", "│", "│", "┘", "┌", "┐", "─", "│", ".", "┐"],
["─", "┘", "─", "─", "└", "│", "┌", "┘", "┘", ".", "│", "└", "└", "┐", "└", "┐", "│", "┌", "┐", "┌", "┐", "┌", "─", "┐", "└", "┘", "└", "┐", "└", "┐", "┌", "┘", "│", "┌", "─", "─", "─", "┘", "└", "┐", "┌", "─", "┐", "┌", "┐", "┌", "┐", "┌", "─", "┐", "└", "┘", "│", "└", "─", "┘", "┌", "─", "┘", "└", "─", "┐", "┌", "─", "─", "┘", "│", "└", "┐", "┌", "┐", "┌", "┘", "┌", "─", "┘", "└", "─", "─", "─", "┐", "│", "│", "│", "│", "└", "┘", "┌", "┘", "│", "└", "┘", "┌", "─", "─", "┘", "│", "─", "┌", "─", "─", "─", "─", "─", "┐", "┌", "┐", "┌", "─", "┘", "┌", "┘", "└", "┐", "┌", "┐", "└", "─", "─", "─", "┘", "│", "┌", "─", "┘", "└", "┘", "│", "┌", "┘", "│", "└", "│", "┘", "─", "│", "┐", "└", "┘", "┘"],
["│", ".", "│", "│", "└", "└", "┘", "┘", ".", "┌", "┐", "┐", "└", "┌", "┌", "┘", "└", "┘", "└", "┘", "│", "└", "┐", "│", "┌", "─", "┐", "└", "┐", "└", "┘", "┌", "┘", "└", "─", "─", "─", "─", "─", "┘", "└", "┐", "│", "│", "│", "│", "│", "└", "┐", "│", "┌", "┐", "│", "┌", "┐", "┌", "└", "─", "┐", "┌", "─", "┘", "└", "─", "─", "┐", "└", "┐", "└", "┘", "└", "┘", "│", "└", "┐", "┌", "─", "┐", "┌", "─", "┘", "│", "│", "│", "└", "─", "┐", "└", "┐", "└", "─", "┐", "└", "─", "─", "┐", "└", "┐", "│", "┌", "─", "┐", "┌", "┐", "└", "┘", "└", "┘", "└", "┌", "┘", "┌", "┐", "└", "┘", "└", "─", "─", "─", "─", "┐", "│", "└", "─", "─", "┐", "┘", "│", "└", "─", "┐", "┌", "┐", "┘", "┐", "│", "─", "┘", ".", "│"],
["└", "┐", "└", "└", "┐", "┐", "┘", ".", "┌", "─", "┐", "┐", "┐", "└", "└", "─", "─", "─", "─", "┐", "└", "─", "┘", "│", "└", "┐", "│", "┐", "└", "─", "─", "┘", "┘", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "─", "┘", "│", "│", "│", "│", "└", "─", "┘", "└", "┘", "│", "└", "┘", "└", "─", "┐", "┌", "┘", "└", "┐", "┌", "┌", "┌", "─", "┘", "┌", "┘", "└", "┌", "┐", "┌", "─", "─", "┘", "└", "┐", "│", "└", "┐", "┌", "┘", "│", "│", "┌", "┐", "│", "┌", "┘", "┌", "┐", "│", "┌", "─", "┐", "└", "┐", "│", "│", "└", "┐", "└", "┘", "└", "─", "─", "─", "─", "─", "┘", "┌", "┘", "└", "─", "─", "─", "─", "┐", "┌", "─", "┘", "└", "─", "─", "┐", "└", "┐", "│", "┌", "─", "┘", "┌", "┐", "┐", "┌", "┐", "┐", "─", "└", "│"],
["└", "┐", "│", "└", "└", "─", "┐", ".", "└", "┐", "└", "─", "┐", ".", "┌", "┌", "─", "┐", "│", "└", "─", "─", "┐", "│", "┌", "┘", "└", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "└", "┘", "└", "┘", "│", "│", "┌", "┐", "└", "┘", "│", "└", "─", "─", "─", "─", "┐", "└", "─", "─", "─", "─", "┘", "└", "─", "┐", "└", "┐", "┌", "┘", "┌", "┐", "│", ".", "┌", "┘", "└", "┘", "┌", "─", "┐", "┌", "┘", "│", "┌", "┘", "└", "┐", "│", "└", "┘", "│", "│", "└", "─", "┘", "└", "┘", "└", "┐", "│", "┌", "┘", "└", "┘", "┌", "┘", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "┌", "┐", "┌", "─", "─", "┐", "│", "└", "─", "┐", "┌", "┐", "┌", "└", "─", "┘", "└", "┘", "┌", "─", "┘", "│", "─", "┌", "┘", "┌", "─", "┘", "└"],
["│", ".", "┌", "┘", "┌", "│", "│", "┌", "┌", "│", "┌", "─", "┘", "┌", "┐", "└", "┐", "│", "┌", "┐", "┌", "┌", "┘", "│", "│", "┌", "┐", "└", "┘", "└", "┘", "│", "└", "─", "─", "─", "┐", "┌", "┘", "└", "┘", "└", "┐", "┌", "┘", "┌", "┐", "┌", "─", "┐", "└", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "┌", "┘", "└", "┐", "│", "│", "└", "┐", "└", "─", "┐", "┌", "┘", "┌", "┘", "└", "┐", "│", "│", "┌", "─", "┘", "└", "─", "┐", "│", "└", "┐", "┌", "─", "─", "─", "─", "┘", "│", "└", "┐", "┌", "┐", "│", "┌", "┘", "│", "│", "└", "┘", "└", "┘", "│", "└", "─", "┘", "└", "┘", "┌", "─", "┘", "└", "─", "┐", "└", "┘", "└", "─", "┐", "┌", "─", "─", "─", "┘", "┌", "┐", "│", "┘", "┘", "┌", "┐", "└", "─", "┘"],
["┌", "┌", "│", "│", "┌", "┌", "┌", "─", "─", "┘", "│", "┌", "─", "┘", "└", "─", "┘", "└", "┘", "└", "┐", "└", "┐", "│", "└", "┘", "└", "┐", "┌", "─", "┐", "└", "─", "─", "─", "─", "┘", "└", "─", "─", "─", "─", "┘", "└", "─", "┘", "│", "└", "┐", "└", "┐", "└", "┘", "└", "┘", "└", "┘", "│", "└", "─", "┘", "┌", "┐", "│", "│", "└", "┐", "│", "┌", "─", "┘", "└", "┐", "└", "┐", "┌", "┘", "│", "│", "└", "─", "┐", "┌", "─", "┘", "└", "─", "┘", "└", "─", "─", "─", "─", "┐", "│", "│", "└", "┘", "└", "┘", "└", "┐", "│", "└", "─", "─", "┐", "┌", "┘", "┌", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "┐", "└", "─", "─", "─", "─", "┘", "└", "─", "┐", "┌", "─", "┘", "└", "┘", "┌", "┐", "┐", "└", "┐", "└", "┘"],
["│", "─", "┌", "─", "┐", "│", "└", "─", "─", "┐", "│", "└", "─", "─", "─", "─", "─", "─", "─", "┐", "└", "┐", "│", "│", "└", "┌", "─", "┘", "│", "┘", "└", "─", "─", "─", "─", "─", "─", "─", "─", "─", "┐", "┌", "─", "─", "─", "┐", "└", "┐", "└", "┐", "└", "┐", "┌", "┐", "┌", "─", "┐", "└", "─", "─", "─", "┘", "│", "└", "┘", "┌", "│", "│", "└", "┐", "┌", "─", "┘", "┌", "┘", "└", "┐", "└", "┘", "┐", "┌", "┘", "│", "┌", "─", "─", "─", "┐", "┌", "─", "─", "┐", "┘", "│", "│", "┌", "┐", "┌", "┐", "┌", "┐", "│", "└", "─", "─", "─", "┘", "└", "┐", "└", "─", "┐", "┌", "─", "─", "┘", "└", "┘", "└", "┐", "└", "┌", "┐", "┘", "┌", "┐", "┌", "┘", "└", "─", "─", "─", "┐", "─", "┘", "└", "─", "┐", "┐", "┘"],
["│", "└", "└", "┐", "└", "─", "─", "─", "┐", "│", "│", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "└", "┐", "│", "│", "└", "┐", "└", "─", "─", "┘", "┌", "┐", "┌", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "│", "┌", "─", "─", "┘", "┌", "└", "─", "┘", "┌", "┘", "│", "│", "└", "┐", "└", "─", "─", "─", "─", "┐", "│", "┌", "─", "─", "┘", "│", ".", "│", "│", "┌", "┐", "│", "┌", "┐", "└", "─", "┐", "┌", "┘", "┌", "┘", "└", "─", "─", "┐", "└", "┘", "┌", "┐", "│", "┌", "┘", "│", "│", "│", "│", "│", "│", "│", "└", "─", "─", "─", "┐", "┌", "┐", "└", "─", "─", "┘", "│", "┌", "─", "┐", "┌", "─", "┐", "└", "─", "┘", "└", "┐", "│", "└", "┘", "┌", "─", "─", "┐", "┌", "┘", "┌", "┘", "┐", "└", "└", "─", "┐"],
["┌", "─", "─", "┘", "┌", "─", "─", "┐", "└", "┘", "│", "│", "│", "│", "│", "│", "│", "│", "│", ".", "│", "│", "└", "┐", "│", "┌", "┐", "┌", "┐", "│", "│", "└", "─", "─", "─", "┐", "┌", "─", "─", "─", "─", "┘", "└", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "└", "┐", "│", "└", "┐", "│", "┌", "┐", "─", "┌", "┐", "└", "┘", "└", "┐", "┌", "┐", "└", "┐", "│", "│", "│", "│", "└", "┘", "└", "┐", "┌", "┘", "└", "─", "┘", "┌", "┐", "┌", "┐", "└", "─", "┐", "│", "└", "┘", "└", "┐", "│", "│", "│", "│", "│", "│", "│", "┌", "┐", "┌", "┐", "└", "┘", "└", "─", "┐", "┌", "─", "┘", "└", "┐", "│", "└", "┐", "└", "─", "─", "─", "─", "┘", "│", "┌", "─", "┘", "┌", "┐", "└", "┘", ".", "┌", "┘", "│", "─", "─", "┘", "─"],
["│", "┌", "─", "┐", "│", "┘", "└", "└", "─", "┐", "│", "│", "│", "│", "│", "│", "└", "┘", "└", "─", "┘", "└", "─", "┘", "└", "┘", "└", "┘", "└", "┘", "└", "┐", ".", "┌", "─", "┘", "│", "┌", "─", "─", "─", "─", "─", "┘", "│", "│", "│", "└", "┘", "│", "│", "└", "┘", "┌", "└", "┘", "│", "└", "─", "┘", "└", "┐", "┌", "┐", "│", "│", "└", "┐", "│", "│", "└", "┘", "└", "┐", "┌", "┐", "│", "│", "─", "└", "┌", "┐", "│", "│", "│", "│", "┌", "─", "┘", "│", "┌", "─", "┐", "│", "│", "│", "└", "┘", "└", "┘", "└", "┘", "└", "┘", "│", "┌", "─", "─", "─", "┘", "│", "┌", "─", "─", "┘", "└", "─", "┘", "┌", "┌", "┐", "│", "┌", "┐", "│", "└", "─", "─", "┘", "│", "┌", "─", "┐", "┐", "─", "┘", "└", "─", "│", "."],
["└", "┘", "┌", "└", "┘", "┘", ".", "└", "┌", "┘", "└", "┘", "└", "┘", "└", "┘", "┌", "┐", "┌", "─", "┐", "┌", "┐", "┌", "─", "┐", "┌", "┐", "┌", "─", "┐", "└", "┐", "└", "─", "─", "┘", "└", "─", "─", "─", "┐", "┌", "┐", "│", "│", "│", "┌", "┐", "└", "─", "─", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "─", "┘", "│", "└", "┘", "└", "┐", "│", "│", "└", "┐", "┌", "┐", "└", "┘", "│", "│", "└", "┐", "┌", "┘", "└", "┘", "│", "│", "│", "└", "─", "┐", "│", "└", "┐", "│", "│", "│", "└", "┐", "┌", "┐", "┌", "─", "─", "─", "┐", "└", "┘", "┌", "┐", "┌", "┐", "│", "└", "─", "─", "─", "┐", "┌", "─", "─", "┘", "└", "┐", "│", "│", "│", "┌", "─", "─", "─", "┘", "└", "┐", "│", "└", "│", ".", "│", "└", "┘", "─"],
["│", "└", "│", "─", "┌", "┐", "┌", "┐", "└", "─", "┐", "┌", "┐", "┌", "─", "┐", "│", "│", "│", "┐", "│", "│", "│", "│", "┌", "┘", "│", "│", "└", "┐", "└", "┐", "└", "─", "─", "─", "┐", "┌", "┐", "┌", "┐", "└", "┘", "└", "┘", "│", "│", "│", "└", "─", "─", "─", "─", "─", "─", "┐", "┌", "┘", "│", "└", "─", "┐", "└", "┐", "┌", "┐", "│", "│", "└", "┐", "│", "│", "│", "┌", "┐", "│", "│", "┌", "┘", "└", "─", "─", "┐", "└", "┘", "└", "─", "─", "┘", "└", "─", "┘", "└", "┘", "└", "─", "┘", "│", "└", "┘", "┌", "─", "─", "┘", "┌", "─", "┘", "└", "┘", "└", "┘", "┌", "┐", "┌", "┐", "└", "┘", "┌", "─", "─", "─", "┘", "│", "└", "┘", "└", "┐", "┌", "┐", "┌", "─", "┘", "└", "─", "┐", "─", "│", "┘", "┘", "."],
["│", "┘", "┌", "─", "┘", "└", "┘", "└", "─", "─", "┘", "│", "└", "┘", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "│", "│", "└", "┐", "│", "│", "┌", "┘", "┌", "└", "┐", "┌", "─", "┐", "└", "┘", "└", "┘", "└", "─", "─", "─", "┐", "└", "┘", "└", "┐", "┌", "┐", "┌", "─", "─", "┐", "└", "┘", "└", "└", "─", "─", "┘", "┌", "┘", "│", "│", "│", "│", "┌", "┘", "│", "│", "│", "│", "└", "┘", "│", "│", "┘", ".", "┌", "─", "┘", "┌", "┐", "┌", "┐", "┌", "─", "─", "─", "─", "─", "┐", "┌", "┐", "┌", "┘", "┐", "┌", "┘", "┌", "─", "┐", "│", "┌", "─", "┐", "┌", "─", "┐", "│", "└", "┘", "│", "┌", "┐", "└", "─", "┐", "┌", "┐", "│", "┌", "─", "─", "┘", "│", "└", "┘", "┌", "─", "─", "─", "┘", "│", "│", "─", "┌", "┌"],
["│", "│", "└", "┐", "┌", "─", "┐", "┌", "─", "┐", "┌", "┘", "┌", "─", "┘", "┌", "┘", "└", "┘", "└", "─", "┘", "│", "│", "┌", "│", "│", "│", "│", "┌", "─", "─", "┘", "└", "┐", "└", "─", "┐", "┌", "─", "┐", "┌", "┐", "┐", "└", "─", "─", "┐", "└", "┘", "└", "┘", "┌", "┐", "└", "─", "─", "─", "─", "─", "─", "┐", "│", "┌", "┘", "│", "│", "│", "└", "┐", "└", "┘", "│", "│", "┘", "└", "└", "┘", "┌", "─", "┘", "┌", "─", "┘", "│", "│", "└", "┘", "└", "┌", "─", "─", "─", "┘", "│", "│", "│", "┌", "┐", "└", "┐", "│", ".", "└", "┘", "│", "└", "└", "┘", "┌", "┘", "└", "┐", "└", "└", "┘", "└", "─", "─", "┘", "│", "└", "┘", "└", "─", "┐", "┘", "│", "┌", "─", "┘", "┌", "─", "─", "─", "┐", "┘", "┐", ".", "│"],
[".", "─", "└", "└", "┘", "┌", "┘", "└", "┐", "└", "┘", "┘", "└", "┐", "┌", "┘", ".", "┌", "─", "─", "─", "─", "┘", "└", "┐", "│", "│", "│", "│", "└", "─", "─", "─", "─", "┘", "┌", "─", "┘", "│", "┌", "┘", "│", "└", "─", "─", "─", "┐", "│", "┌", "┐", "┌", "─", "┘", "│", "┌", "─", "┐", "┌", "─", "┐", "┌", "┘", "└", "┘", "┌", "│", "│", "└", "┐", "│", "┘", "─", "│", "│", "┐", "┐", ".", "┌", "└", "─", "─", "┘", "┐", "┌", "│", "└", "┐", "┌", "─", "┘", "┌", "─", "─", "┐", "│", "│", "│", "│", "└", "┐", "└", "┘", "┌", "─", "┐", "└", "─", "─", "┐", "└", "─", "┐", "└", "─", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "┌", "─", "─", "┐", "└", "─", "┘", "└", "┐", "┌", "┘", "┌", "─", "─", "┘", "└", "┐", "─", "┐"],
["│", ".", "│", "─", "└", "└", "┐", "┌", "┘", "┌", "─", "─", "┐", "└", "┘", "┌", "─", "┘", "┌", "┐", "┌", "─", "┐", "┌", "┘", "└", "┘", "└", "┘", "┌", "┐", "┐", "┌", "─", "─", "┘", "┌", "─", "┘", "└", "┐", "│", "┌", "─", "─", "─", "┘", "└", "┘", "└", "┘", "┌", "┐", "└", "┘", "┌", "└", "┘", "┌", "┘", "└", "─", "─", "─", "┐", "└", "┘", "┌", "┘", "└", "┐", "┘", "└", "┘", "─", "┐", "─", "┌", "─", "─", "─", "─", "┐", "┐", "└", "─", "┘", "└", "─", "─", "┘", "┌", "─", "┘", "│", "└", "┘", "│", "┌", "┘", "┌", "┐", "└", "┐", "│", "┌", "─", "─", "┘", "┌", "┐", "└", "─", "─", "┘", "│", "│", "│", "│", "│", "┌", "┘", "┌", "┐", "└", "─", "┐", "┌", "┐", "└", "┘", "┌", "┘", "│", "│", "│", "┘", "└", "┌", "┐"],
["┌", ".", "┘", "┐", "┌", "└", "└", "┘", "┌", "└", "─", "┐", "│", "┌", "─", "┘", "┌", "┐", "│", "│", "│", "┌", "┘", "│", "┌", "┐", "┌", "┐", "┌", "┘", "└", "┐", "└", "─", "─", "─", "┘", "┌", "─", "┐", "└", "┘", "└", "┐", "┘", "┌", "┐", "┌", "┐", "┌", "─", "┘", "└", "┐", "┌", "┌", "─", "┐", "└", "─", "─", "─", "─", "┐", "│", "│", "┌", "└", "─", "┐", "└", "┐", "┘", ".", "└", "─", "┌", "└", "─", "─", "─", "┐", "└", "─", "┐", "│", "┌", "─", "─", "─", "─", "┘", "┌", "─", "┘", "┌", "┐", "│", "│", "┌", "┘", "└", "─", "┘", "└", "┘", "┌", "─", "┐", "│", "└", "─", "─", "─", "─", "┘", "└", "┘", "└", "┘", "└", "─", "┘", "└", "─", "┐", "│", "│", "│", "┌", "┐", "└", "─", "─", "─", "┐", "┐", "─", "┌", "┘"],
["└", "┌", "│", "─", "┌", "┐", ".", "┌", "─", "─", "─", "┘", "│", "└", "┐", "┌", "┘", "│", "│", "│", "│", "│", "┌", "┘", "│", "│", "│", "│", "└", "─", "┐", "└", "─", "─", "─", "─", "─", "┘", "┌", "└", "┐", "┌", "─", "┘", "┌", "┘", "└", "┘", "│", "│", "┌", "─", "┐", "└", "┐", "└", "┐", "│", "┌", "─", "─", "┐", "┘", "│", "│", "┐", "┘", "┘", "└", "│", "┌", "┘", "└", "┐", "│", ".", "└", "┘", "│", "┌", "─", "┘", "┌", "┐", "└", "─", "┘", "┌", "┐", "┌", "┐", "┌", "┘", "┌", "─", "┘", "└", "┘", "└", "┘", "┌", "─", "─", "┐", "┌", "┐", "│", "┌", "┘", "│", "┌", "─", "─", "─", "┐", "┌", "┐", "┌", "┐", "┌", "─", "─", "─", "─", "─", "┘", "└", "┘", "└", "┘", "│", "┌", "─", "─", "─", "┘", ".", "└", "└", "┘"],
[".", "┌", "│", "│", "└", "│", ".", "└", "─", "─", "─", "┐", "└", "┐", "│", "│", "│", "└", "┘", "└", "┘", "└", "┘", "┌", "┘", "└", "┘", "└", "─", "┐", "└", "─", "─", "─", "─", "─", "─", "─", "─", "┐", "│", "└", "─", "─", "┘", "┌", "─", "┐", "└", "┘", "└", "┐", "└", "┐", "└", "─", "┘", "└", "┘", "┌", "┐", "│", "│", "│", "│", "┘", "└", "─", "─", "└", "┘", "┐", "┌", "┘", "┌", ".", "┐", "┌", "┌", "└", "─", "┐", "│", "└", "┐", "┌", "┐", "│", "│", "│", "│", "└", "┐", "└", "┐", "┌", "─", "─", "─", "─", "┘", "┌", "┐", "└", "┘", "└", "┘", "└", "─", "┘", "└", "─", "─", "┐", "│", "│", "│", "│", "│", "└", "─", "─", "─", "─", "┐", "┌", "┐", "┌", "─", "┐", "│", "└", "─", "─", "─", "┐", "┌", "┐", "┘", "┘"],
[".", "└", "─", "─", "─", "─", "┌", "─", "┘", "─", "┌", "└", "┐", "│", "└", "┘", "┌", "┐", "┌", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "─", "┐", "└", "─", "─", "┐", "┌", "─", "─", "─", "─", "─", "┘", "└", "─", "─", "─", "─", "┘", ".", "└", "─", "┐", "┌", "┘", ".", "└", "┐", "┌", "─", "┐", "┌", "┘", "└", "┘", "─", "└", "┘", "│", "│", ".", "└", "│", "┘", "│", "┘", ".", "└", "└", "┘", "┌", "─", "┌", "─", "┘", "│", "└", "│", "│", "│", "│", "│", "│", "│", "┌", "┘", "┐", "└", "┘", "┌", "┐", "┌", "─", "─", "┘", "└", "─", "─", "─", "─", "┐", "┌", "─", "─", "┐", "┌", "┘", "│", "│", "└", "┘", "└", "┐", "┌", "┐", "┌", "─", "┘", "│", "│", "│", "┌", "┘", "└", "─", "┐", "┌", "┐", "│", "┌", "└", "│", "┘"],
[".", "└", "┐", "└", "┐", "─", "┘", "─", "└", "┌", "─", "─", "┘", "└", "┐", "└", "│", "│", "└", "─", "─", "─", "─", "─", "┘", "│", "│", "┐", "└", "─", "─", "┐", "└", "┘", "┌", "─", "─", "─", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "─", "─", "┐", "│", "└", "┐", "┌", "┐", "└", "┘", ".", "└", "┘", "┌", "┐", "┌", "│", "┌", "└", "┘", "─", "┌", ".", "│", "┐", "┘", "│", ".", "┐", "┐", "┌", "┐", "┐", "└", "─", "┐", "└", "┐", "│", "│", "│", "│", "│", "│", "└", "┘", "┐", "┌", "┐", "┌", "┘", "│", "└", "─", "┐", "┌", "─", "─", "─", "─", "┐", "│", "└", "─", "┐", "│", "└", "┐", "│", "└", "─", "┐", "┌", "┘", "│", "│", "└", "─", "─", "┘", "└", "┘", "└", "─", "┐", "┐", "└", "┘", "└", "┘", "┐", "┌", "│", "┘"],
["┘", "└", "┘", "┐", "│", "│", "┌", "│", "│", "└", "─", "┐", "┌", "┐", "└", "─", "┘", "└", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "└", "┘", "┌", "┐", "┌", "┐", "└", "─", "┐", "│", "┌", "─", "─", "┘", "│", "└", "┘", "└", "┘", "└", "┘", "┌", "─", "┘", "└", "─", "┘", "│", "│", "┌", "┐", "┌", "─", "─", "┘", "└", "─", "┐", "┐", "│", "└", "┐", "┘", "┌", "└", "┌", "─", "└", "┐", "└", "└", "┐", "┘", "│", "│", "└", "│", "┌", "┘", "└", "┘", "└", "┘", "└", "┘", "─", "┌", "┐", "│", "│", "└", "┐", "└", "─", "┐", "└", "┘", "┌", "─", "─", "─", "┘", "└", "─", "┐", "│", "└", "─", "┘", "└", "─", "─", "┘", "└", "─", "┘", "└", "┐", "┌", "─", "┐", "┌", "─", "─", "┐", "└", "─", "┐", "─", "┘", "│", "│", "┌", "┐", "┘"],
["└", "│", "└", "─", "┐", "┘", "┌", "┌", "┌", "┐", "─", "└", "┘", "│", "┌", "┐", "┌", "┐", "└", "┘", "└", "┘", "└", "┘", "└", "─", "┐", "│", "└", "┘", "└", "─", "┐", "└", "┘", "└", "─", "─", "─", "┘", "┌", "┐", "┌", "─", "─", "─", "┘", "┌", "┐", "┘", "┌", "┐", "│", "└", "┘", "│", "│", "┌", "─", "─", "┐", "┌", "┘", "└", "┐", "┘", "└", "─", "┐", "┌", "│", "│", "└", ".", "─", "┌", "┘", "─", "│", "└", "┌", "└", "┘", "┌", "│", "┘", "│", "┌", "┐", "┐", "┌", "┘", "│", "│", "└", "─", "┘", "┌", "─", "┘", "┌", "┐", "└", "─", "─", "─", "─", "─", "┐", "│", "└", "─", "─", "─", "─", "─", "┐", "│", "─", "┌", "─", "┐", "│", "└", "┐", "│", "│", "┌", "┐", "└", "┐", "┌", "┘", "│", "│", "│", "─", "┘", "│", "┐"],
["┌", "│", "│", "┌", "┌", "┐", "┌", "┌", "│", "└", "─", "─", "┐", "└", "┘", "└", "┘", "└", "─", "─", "─", "─", "─", "─", "─", "┐", "│", "└", "─", "─", "─", "┐", "│", "┌", "┐", "┌", "─", "─", "─", "─", "┘", "└", "┘", "┌", "─", "─", "─", "┘", "└", "─", "┘", "└", "┘", "┌", "┐", "└", "┘", "└", "─", "┐", "└", "┘", "┘", "┐", "│", ".", "│", "┘", "│", "┌", "┌", "│", "┌", "┌", "┐", "│", "└", "─", "│", "┘", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "│", "┌", "┘", "┌", "┘", "└", "─", "┐", "┌", "┘", "┌", "┐", "│", "│", "┌", "┐", "─", "┌", "─", "─", "┘", "└", "┐", "┌", "─", "─", "─", "┐", "└", "┐", "┌", "┘", "┌", "┘", "└", "─", "┘", "└", "┘", "│", "└", "┐", "└", "┘", "┘", "─", "┌", "┌", "┐", "└", "│", "┐"],
["└", "└", "─", "┌", "└", "┐", "┐", "┘", "└", "─", "─", "┐", "│", "└", "┌", "┐", "┌", "─", "─", "┐", "┌", "─", "─", "─", "─", "┘", "└", "─", "─", "─", "┐", "│", "│", "│", "└", "┘", "┌", "┐", "┘", "┌", "─", "─", "─", "┘", "┌", "─", "─", "┐", "┌", "─", "┐", "┌", "┐", "│", "└", "┐", "┌", "┐", "┌", "┘", "┌", "┐", "┘", "┌", "┌", "─", "└", "┌", "┌", "─", "┐", "┘", "─", "┘", "└", ".", "│", "┘", "└", "─", "│", "└", "┘", "└", "┘", "│", "└", "┐", "│", "└", "┐", "│", "┌", "─", "─", "┘", "└", "─", "┘", "└", "┘", "└", "┘", "└", "┐", "└", "─", "─", "─", "┐", "│", "└", "─", "┐", "┐", "└", "┐", "│", "└", "┐", "│", "┘", "┌", "┐", "│", "┌", "─", "┘", "┌", "┘", "─", "└", "└", "┐", "│", "─", "─", "┐", "│", "┘"],
["│", "┐", ".", "─", "┐", ".", "│", "┐", "┌", "─", "─", "┘", "└", "┐", "│", "└", "┘", "┌", "┐", "└", "┘", "┌", "┐", "┌", "─", "┐", "┌", "┐", "┌", "┐", "└", "┘", "│", "└", "─", "─", "┘", "└", "─", "┘", "┌", "─", "─", "┐", "└", "─", "┐", "│", "│", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "│", "└", "─", "┘", "└", "─", "┐", "─", "─", "┌", "┌", "└", "┐", "│", ".", "│", "│", ".", "┌", "─", ".", "└", "┌", "└", "─", "─", "┐", "┌", "┘", "┌", "┘", "└", "─", "┘", "│", "└", "─", "┐", "┌", "┐", "┌", "┐", "┌", "─", "┐", "┌", "┐", "└", "─", "─", "─", "┐", "│", "└", "┐", "┌", "┘", "┌", "┐", "└", "┘", "┌", "┘", "└", "─", "┘", "└", "┐", "│", "┌", "─", "┘", "┌", "┐", "┘", "│", "┌", "┘", ".", "│", "─", "─", "┐"],
["┌", "┐", "└", "─", "│", "─", "└", "└", "│", "┌", "─", "─", "┐", "│", "└", "┐", "┌", "┘", "S", "┐", "┌", "┘", "└", "┘", "┘", "│", "│", "│", "│", "└", "─", "┐", "└", "─", "─", "─", "┐", "┌", "─", "┐", "│", "┌", "┐", "└", "─", "─", "┘", "└", "┘", "└", "─", "┘", "└", "┘", "│", "┌", "┘", "│", "┌", "─", "─", "─", "─", "┘", "┌", "┌", "─", "─", "┐", "│", "│", "┐", "┘", ".", "┐", "└", "│", "─", "┌", "│", "─", "└", "┌", "┘", "│", "┐", "└", "─", "─", "─", "┐", "└", "┐", ".", "└", "┘", "└", "┘", "└", "┘", "┌", "│", "│", "│", "┌", "─", "─", "┐", "└", "┘", "┌", "┘", "└", "┐", "│", "│", "┌", "┐", "│", "┌", "─", "─", "─", "┐", "└", "┘", "└", "─", "─", "┘", "│", "└", "┘", "┘", ".", ".", "└", "┐", "┐", "┘"],
["┐", "┐", "└", "┌", "─", "┘", "┌", "┌", "└", "┘", "┌", "─", "┘", "└", "─", "┘", "│", "┌", "─", "┘", "│", "┌", "─", "─", "─", "┘", "│", "│", "│", "┌", "─", "┘", "┌", "┐", "┌", "┐", "└", "┘", "┌", "│", "└", "┘", "└", "─", "─", "┐", "┌", "┐", "┌", "┐", "┌", "─", "─", "┐", "└", "┘", "┌", "┘", "└", "─", "─", "┐", "┌", "┐", "┐", "│", "┌", "┐", "└", "┘", "└", "┐", "└", "─", "─", "┌", "┐", ".", "─", "┌", "┐", "┐", "└", "┐", "│", "┌", "┐", "┌", "┐", "┐", "└", "┐", "└", "─", "┐", "┌", "┐", "┌", "─", "─", "┐", "│", "│", "└", "┘", "┌", "┐", "└", "─", "┐", "└", "─", "─", "┘", "│", "│", "│", "└", "┘", "└", "─", "─", "┐", "└", "┐", "┌", "┐", "┌", "─", "┐", "└", "┐", "│", "┐", "─", "│", "┐", "└", "┐", "."],
["┌", "┌", "┘", "│", "└", ".", "┌", "┘", "│", "┌", "│", "┌", "─", "┐", "┌", "─", "┘", "└", "─", "┐", "│", "└", "─", "─", "─", "─", "┘", "└", "┘", "└", "─", "─", "┘", "└", "┘", "└", "─", "─", "┐", "└", "─", "─", "┐", "┌", "┐", "└", "┘", "└", "┘", "└", "┘", "┌", "─", "┘", "┌", "┐", "└", "─", "─", "─", "┐", "└", "┘", "└", "┐", "└", "┘", "└", "┐", "┌", "─", "┘", "─", "│", "─", "┘", "┘", "┐", ".", "│", "│", "─", "│", "│", "│", "│", "│", "│", "│", "┌", "┐", "└", "─", "┐", "│", "│", "│", "└", "─", "┐", "│", "└", "┘", "┌", "─", "┘", "└", "─", "─", "┘", "┌", "┐", "┌", "─", "┘", "└", "┘", "┌", "┐", "┌", "─", "─", "┘", "┌", "└", "┘", "│", "└", "┐", "└", "─", "┘", "┐", "┌", "┐", "│", "┘", "┌", "└", "─"],
["└", "┘", "┌", "┘", "─", "└", "└", "┐", "┌", "└", "└", "┘", ".", "│", "│", "┌", "─", "─", "┐", "│", "│", "┌", "─", "─", "─", "─", "─", "┐", "┌", "┐", "┌", "┐", "┌", "─", "┐", "┌", "─", "┐", "└", "─", "─", "┐", "└", "┘", "└", "─", "─", "┐", "┌", "─", "─", "┘", "┌", "┐", "│", "└", "─", "─", "─", "┐", "└", "┐", "┌", "─", "┘", "┌", "─", "─", "┘", "└", "┐", "┘", "┘", "│", "│", "│", "└", "┌", "─", "│", "└", "─", "─", "┘", "└", "┘", "└", "┘", "└", "┘", "└", "─", "─", "┘", "└", "┘", "└", "┐", "┌", "┘", "└", "┐", "─", "└", "─", "─", "─", "─", "─", "─", "┘", "└", "┘", "┌", "─", "─", "─", "┘", "│", "│", "┌", "─", "─", "┐", "┌", "┐", "└", "┐", "└", "┐", "┌", "─", "┐", "┘", "┐", "┘", "┐", "─", "└", "┘"],
["│", "│", "└", "┘", ".", "│", "└", "┐", ".", "│", "┐", "┌", "─", "│", "│", "│", "┌", "┐", "└", "┘", "│", "└", "─", "─", "─", "─", "┐", "│", "│", "│", "│", "│", "└", "┐", "│", "└", "┐", "└", "┐", "┌", "┐", "│", "┐", "┌", "┐", "┌", "┐", "└", "┘", "┌", "┐", "─", "│", "└", "┘", "┌", "┐", "┌", "─", "┘", "└", "└", "┘", "┘", "┐", "└", "─", "─", "┐", "┌", "┘", ".", "┌", "─", "┐", "┘", "─", "└", "┌", "└", "─", "─", "─", "┐", "┌", "┐", "┌", "─", "─", "─", "─", "┐", "┌", "─", "─", "─", "┐", "│", "└", "─", "┐", "│", "┌", "┐", "┌", "─", "─", "─", "┐", "┌", "─", "─", "─", "┘", "┌", "─", "─", "┐", "└", "┘", "│", "┌", "─", "┘", "│", "│", "┌", "└", "┐", "└", "┘", "┌", "┘", ".", "│", ".", "─", "─", "└", "┌"],
["└", "└", "┐", ".", "┌", "│", ".", "│", "┌", "┌", "└", "┘", "┘", "└", "┘", "└", "┘", "└", "─", "─", "┘", "┌", "┌", "─", "─", "─", "┘", "└", "┘", "└", "┘", "└", "─", "┘", "└", "─", "┘", "└", "│", "│", "│", "└", "─", "┘", "└", "┘", "└", "─", "┐", "│", "└", "┐", "│", "┌", "─", "┘", "└", "┘", "┌", "─", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "└", "─", "─", "┘", "┌", "┘", "┘", ".", "│", ".", "┌", "─", "─", "─", "┘", "│", "│", "│", "┌", "─", "─", "─", "┘", "│", "┌", "─", "─", "┘", "└", "─", "─", "┘", "└", "┘", "│", "└", "─", "─", "┐", "└", "┘", "─", "┌", "┐", "│", "│", "┌", "┐", "└", "─", "─", "┘", "└", "─", "─", "┘", "└", "─", "┐", "│", "┌", "─", "┘", "└", "┌", "┌", "─", "└", "─", "┐", "┘"],
["┌", "┘", "┐", ".", "│", "│", "─", "┌", "┘", "│", "│", "┐", ".", "└", "┌", "─", "─", "─", "┐", "─", "┌", "┐", "└", "┐", "┌", "┐", "┌", "┐", "┌", "─", "┐", "┌", "┐", "┌", "─", "─", "─", "┐", "└", "┘", "└", "─", "─", "┐", "┌", "─", "─", "─", "┘", "└", "┐", "│", "│", "└", "┐", "┌", "┐", "┌", "┘", "┌", "┘", "│", "└", "┘", "│", "│", "│", "│", "┌", "┐", "┌", "┐", "┌", "┘", "└", "─", "┐", "┐", "─", "└", "┐", "┌", "┐", "┌", "┘", "└", "┘", "└", "─", "┐", "┌", "┐", "│", "└", "─", "─", "─", "─", "┐", "┌", "─", "─", "┐", "└", "─", "─", "─", "┘", "┘", "┌", "─", "┘", "└", "─", "┘", "│", "└", "┐", "┌", "─", "┐", "┌", "┐", "┌", "─", "─", "─", "┘", "└", "┘", "│", "│", ".", "└", "│", ".", "│", ".", "│", "┐"],
["┌", "└", "┌", "└", "─", "┐", "┐", ".", "│", "┌", "┌", "┘", ".", "│", "└", "┐", "┌", "┐", "└", "┐", "│", "│", "┌", "┘", "│", "└", "┘", "└", "┘", "┘", "└", "┘", "│", "└", "┐", "┌", "─", "┘", "┌", "┐", "│", "┌", "┐", "│", "│", "┌", "─", "─", "┐", "┌", "┘", "│", "│", "┌", "┘", "│", "│", "│", "┌", "┘", "┐", "└", "─", "┐", "│", "│", "└", "┘", "│", "│", "│", "└", "┘", "┘", "│", "└", ".", "│", "└", "└", "└", "┘", "└", "┘", "┌", "─", "─", "─", "─", "┘", "│", "│", "│", "┌", "─", "┐", "┌", "┐", "│", "│", "┌", "┐", "└", "─", "─", "─", "─", "┐", "┌", "┘", "┌", "┐", "┌", "┐", "┌", "┘", "┘", "└", "┘", "└", "│", "│", "│", "└", "─", "─", "┐", "┌", "┐", "└", "┌", "─", "┐", "┘", "┘", "─", "┐", "┌", "─", "┐"],
["┘", ".", "┘", "┘", ".", "│", "┐", "┌", "┐", "└", "┘", ".", "└", "┌", "┐", "└", "┘", "└", "┐", "│", "│", "│", "└", "─", "┘", "┘", "┌", "─", "─", "─", "─", "┐", "└", "─", "┘", "└", "─", "┐", "│", "│", "┌", "┘", "│", "└", "┘", "│", "┌", "─", "┘", "└", "┐", "└", "┘", "└", "┐", "│", "└", "┘", "└", "┐", "┌", "┐", "┌", "┘", "│", "│", "┌", "─", "┘", "└", "┘", "┌", "┐", "│", "│", "┘", "┌", "│", ".", "┌", "┌", "─", "─", "┐", "└", "─", "┐", "┌", "─", "┐", "│", "└", "┘", "└", "┐", "└", "┘", "└", "┘", "│", "│", "└", "┐", "┌", "─", "─", "─", "┘", "│", "┌", "┘", "└", "┘", "│", "│", "┌", "┐", "┘", "┌", "┐", "└", "┘", "│", "┌", "─", "─", "┘", "│", "└", "─", "┐", "┘", "┘", "┘", ".", ".", "│", "└", "┘", "│"],
["└", "┌", "│", "┘", "│", ".", "┌", "└", "┐", "┐", "└", "│", "│", "│", "│", "┌", "┐", "┌", "┘", "└", "┘", "│", "┌", "┐", "┌", "─", "┘", "┌", "┐", "┌", "┐", "└", "─", "─", "─", "─", "─", "┘", "│", "│", "└", "┐", "└", "┐", "└", "│", "│", "┌", "─", "─", "┘", "┌", "┐", "┌", "┘", "│", "┌", "┐", "┌", "┘", "│", "│", "└", "┐", "│", "│", "│", "┌", "┐", "┘", "┌", "┘", "└", "┐", "┌", "┐", "┌", "┌", "┐", "└", "└", "─", "┐", "│", "┌", "┐", "└", "┘", "│", "└", "┘", "┌", "┌", "┐", "└", "─", "─", "─", "┐", "│", "└", "┐", "└", "┘", "┌", "┐", "┌", "─", "┘", "└", "─", "─", "┐", "└", "┘", "│", "└", "─", "┘", "└", "─", "┐", "└", "┘", "┌", "─", "┐", "│", "┌", "─", "┘", ".", "┌", "┐", "┐", "─", "┘", "┐", ".", "│"],
[".", "└", "┘", "─", "└", "─", "┐", "┐", "┌", "┌", "─", "─", "─", "┘", "│", "│", "│", "└", "─", "─", "┐", "│", "│", "│", "│", "┌", "─", "┘", "└", "┘", "└", "─", "─", "─", "─", "─", "┐", "┌", "┘", "│", "┌", "┘", "┌", "┘", "┌", "┘", "└", "┘", "┌", "┐", "┌", "┘", "└", "┘", "┌", "│", "│", "└", "┘", "└", "│", "│", "│", "│", "└", "┘", "└", "┘", "│", "┌", "┘", "┌", "─", "┘", "│", "└", "┐", "│", "│", "┌", "─", "┐", "│", "└", "┘", "└", "┐", "┌", "┐", "┌", "─", "─", "┘", "└", "─", "─", "─", "┐", "└", "┘", "│", "└", "─", "─", "┘", "└", "┘", "┌", "─", "─", "─", "─", "┘", "┌", "┐", "│", "┌", "─", "─", "─", "─", "┘", "┘", "┌", "┘", "┌", "┘", "│", "│", "┌", "┐", "┌", "┐", "│", "┌", "┐", "└", "└", "┌", "┘"],
["┌", "│", "│", "┌", "│", "─", "┌", "─", "└", "└", "─", "─", "─", "┐", "└", "┘", "└", "─", "─", "┐", "│", "│", "│", "│", "└", "┘", "┌", "─", "┐", "┌", "─", "─", "─", "─", "─", "─", "┘", "│", "┌", "┘", "└", "┐", "│", "┘", "└", "┐", "┌", "─", "┘", "└", "┘", "┌", "─", "─", "─", "┘", "└", "─", "─", "┐", "│", "└", "┐", "└", "─", "┐", "┌", "─", "┘", "│", "┌", "┘", "─", "┌", "┘", "┌", "┘", "│", "│", "└", "┐", "│", "└", "┐", "┌", "─", "┘", "│", "│", "└", "─", "─", "┐", "┌", "┐", "┌", "┐", "└", "─", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "┌", "─", "┐", "┌", "┐", "│", "│", "│", "│", "┌", "─", "─", "┐", "┌", "┐", "└", "┐", "└", "┐", "│", "└", "┘", "└", "┘", "└", "─", "─", "┐", ".", "│", "└", "┘"],
["┌", "│", "┐", "┐", "│", "─", "│", "└", "┘", "┌", "┐", "┌", "┐", "└", "─", "─", "─", "─", "┐", "│", "│", "│", "│", "└", "┐", "┘", "└", "┐", "│", "└", "─", "┐", "┌", "─", "─", "─", "─", "┘", "└", "─", "─", "┘", "└", "┐", "┌", "┘", "└", "┐", "┌", "┐", "┌", "└", "─", "┐", "┌", "─", "─", "─", "─", "┘", "└", "┐", "│", "┌", "─", "┘", "└", "┐", "─", "│", "└", "─", "┐", "│", "┌", "┘", "┌", "┘", "└", "─", "┘", "│", "┌", "┘", "└", "─", "┐", "│", "│", "┌", "┐", "│", "└", "┘", "└", "┘", "└", "─", "─", "─", "─", "─", "─", "─", "─", "┐", "┌", "┐", "└", "┐", "│", "│", "└", "┘", "└", "┘", "└", "┘", "┌", "─", "┘", "│", "└", "─", "┘", "┌", "┘", "│", "┌", "─", "─", "┐", "┌", "┐", "┌", "┘", ".", "└", "┐", "│"],
["┌", "┘", "│", "└", ".", "┌", "─", "┐", "─", "│", "└", "┘", "│", "┌", "─", "─", "─", "┐", "│", "└", "┘", "│", "└", "┐", "│", "┌", "┐", "│", "└", "─", "┐", "└", "┘", "┌", "─", "─", "─", "─", "┐", "┌", "┐", "┌", "┐", "└", "┘", "┌", "─", "┘", "│", "│", "┌", "┐", "┌", "│", "└", "─", "─", "┐", "┐", "┌", "┐", "│", "│", "└", "┐", "┌", "┐", "└", "─", "┘", "┌", "─", "┘", "│", "└", "┐", "│", "┌", "─", "─", "┐", "└", "┘", "┌", "─", "─", "┘", "│", "│", "│", "└", "─", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "─", "┌", "┐", "┌", "─", "─", "┘", "│", "└", "─", "┘", "└", "┘", "┌", "─", "┐", "┌", "─", "─", "┘", "┌", "┐", "│", "┌", "─", "┐", "└", "─", "┘", "└", "─", "┐", "└", "┘", "│", "│", "┘", "│", ".", "└", "."],
["└", "─", "┘", "─", "┌", "┐", ".", "┘", ".", "└", "─", "┐", "│", "└", "─", "─", "┐", "│", "└", "─", "┐", "└", "┐", "│", "│", "│", "│", "└", "─", "┐", "│", "┌", "┐", "└", "─", "─", "─", "┐", "└", "┘", "│", "│", "│", "┌", "┐", "└", "┐", "┌", "┘", "└", "┘", "└", "─", "┘", "┌", "─", "┐", "└", "┐", "│", "└", "┘", "└", "┐", "└", "┘", "│", "┌", "┐", "┌", "┘", "┌", "┐", "│", "┌", "┘", "└", "┘", "┌", "┐", "└", "─", "┐", "│", "┌", "┐", "─", "│", "│", "│", "┌", "┐", "└", "┘", "└", "┘", "└", "┘", "│", "┌", "┘", "│", "└", "─", "─", "─", "┘", "┌", "┐", "┌", "┐", "┌", "┘", "┘", "│", "└", "─", "─", "─", "┘", "└", "┘", "└", "┐", "└", "─", "┐", "┌", "─", "┐", "└", "─", "┐", "└", "┘", "─", "┐", "─", "│", "┐"],
["└", "┐", "┐", "┌", "┌", "└", "┐", "└", "┌", "─", "─", "┘", "└", "─", "┐", "┐", "│", "└", "┐", "┘", "└", "┐", "└", "┘", "└", "┘", "│", "┌", "┐", "│", "│", "│", "│", "┌", "─", "─", "┐", "└", "─", "┐", "└", "┘", "└", "┘", "└", "┐", "└", "┘", "┌", "─", "─", "─", "─", "┐", "└", "┐", "└", "─", "┘", "└", "─", "─", "┐", "└", "┐", "┌", "┘", "│", "│", "│", "┐", "│", "│", "│", "│", "└", "┌", "─", "┘", "│", "┐", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "└", "┘", "└", "─", "─", "─", "─", "─", "┐", "│", "│", "┌", "┘", "┘", "┌", "┐", "┌", "─", "┘", "└", "┘", "│", "└", "─", "┐", "│", "┌", "─", "┐", "┌", "─", "─", "─", "─", "┘", "┌", "┐", "└", "┘", "┐", "│", "┌", "─", "┘", "┐", "┘", "┌", "└", "┐", "│", "│"],
[".", "│", "┌", "┌", "┐", "┘", "┐", "└", "└", "─", "─", "┐", "┌", "┐", "└", "┐", "└", "┐", "└", "┐", "┐", "└", "┐", "┌", "─", "┐", "└", "┘", "│", "│", "└", "┘", "│", "└", "─", "┐", "│", "┌", "┐", "└", "┐", "┌", "┐", "┌", "┌", "│", "┌", "┐", "└", "─", "─", "─", "┐", "│", "┌", "┘", "└", "┌", "┐", "└", "┌", "┐", "└", "┐", "│", "└", "┐", "│", "└", "┘", "┌", "┘", "│", "│", "└", "┐", "└", "─", "┐", "└", "┐", "└", "┐", "│", "│", "│", "└", "┐", "└", "┐", "┌", "─", "┐", "┌", "─", "─", "─", "┘", "└", "┘", "└", "─", "┐", "│", "│", "└", "─", "─", "─", "┐", "└", "─", "─", "┘", "└", "┘", ".", "│", "└", "─", "─", "─", "─", "─", "┘", "└", "┐", "┌", "┌", "┘", "└", "─", "─", "┐", "─", "┘", "─", "└", "─", "┐"],
["│", "─", "┌", "┘", "│", "│", "┌", "┐", ".", "┌", "┐", "└", "┘", "└", "┐", "└", "┐", "│", "┌", "┘", "┌", "┐", "└", "┘", "┌", "┘", "┌", "┐", "│", "└", "─", "┐", "│", "┌", "─", "┘", "│", "│", "└", "┐", "└", "┘", "└", "┐", "┌", "┘", "│", "└", "┐", "┌", "┐", "┌", "┘", "│", "│", "┌", "┐", "│", "└", "┐", "│", "└", "┐", "│", "│", "─", "│", "└", "┐", "┐", "└", "┐", "└", "┘", "┌", "┘", "┌", "─", "┘", "┌", "┘", "┌", "┘", "└", "┘", "│", "┌", "┘", "┌", "┘", "└", "┐", "│", "└", "─", "─", "─", "┐", "┌", "─", "─", "┐", "└", "┘", "└", "─", "─", "─", "─", "┘", "┌", "─", "─", "─", "┐", "┌", "─", "┘", "┌", "┐", "┌", "┐", "┌", "─", "─", "┐", "└", "┐", "│", "┌", "┐", "┌", "─", "┘", "┘", "─", "┐", "└", "─", "┘"],
["└", "└", "└", "┐", "└", "─", "┘", "│", "┌", "┘", "└", "─", "─", "┐", "└", "┐", "└", "┘", "└", "─", "┘", "└", "─", "─", "┘", "┌", "┘", "│", "└", "─", "─", "┘", "└", "┘", "┌", "┐", "└", "┘", "┌", "└", "─", "─", "─", "┘", "└", "─", "┘", "┘", "└", "┘", "│", "└", "┐", "│", "│", "│", "│", "└", "┐", "└", "┘", "┌", "┘", "│", "└", "─", "┘", "┌", "┘", "┌", "┐", "└", "┐", "┌", "┘", "┘", "└", "─", "┐", "│", "┌", "┘", "┌", "─", "─", "┘", "└", "┐", "│", "┌", "┌", "┘", "│", "┌", "─", "─", "─", "┘", "│", "┌", "─", "┘", "┌", "┐", "┌", "─", "─", "┐", "┌", "─", "┘", "┌", "─", "─", "┘", "│", "┌", "┐", "│", "│", "│", "│", "└", "─", "┐", "└", "─", "┘", "└", "┘", "│", "└", "─", "┐", "┌", "─", "┘", "┌", "┘", "│"],
["┘", ".", "└", "└", "─", "─", "┐", "│", "└", "─", "┐", "┌", "┐", "└", "┐", "└", "┐", "┌", "─", "─", "─", "─", "┐", "┌", "─", "┘", "┐", "└", "─", "─", "┐", "┌", "┐", "┌", "┘", "└", "─", "─", "─", "─", "┐", "┘", "┌", "┐", "┌", "─", "─", "─", "─", "┐", "└", "─", "┘", "└", "┘", "│", "│", "│", "└", "─", "┐", "└", "┐", "└", "─", "┐", "┌", "┘", "┌", "┘", "│", "┌", "┘", "└", "┐", "┌", "─", "─", "┘", "│", "└", "┐", "│", "┌", "┐", "┌", "┌", "┘", "└", "┐", "└", "┐", "│", "└", "─", "─", "─", "─", "┘", "└", "┐", "┌", "┘", "└", "┘", "┌", "┐", "└", "┘", "┌", "─", "┘", "┘", "┌", "┐", "└", "┘", "└", "┘", "└", "┘", "└", "─", "┐", "└", "─", "─", "─", "┐", "└", "│", "┌", "─", "┘", "┘", "┌", "┐", ".", "┌", "┘"],
["│", "┐", "│", "└", "┌", "─", "┘", "└", "─", "┐", "│", "│", "└", "┐", "└", "─", "┘", "│", "┌", "─", "─", "─", "┘", "│", "┌", "─", "─", "─", "─", "─", "┘", "│", "│", "│", "┌", "─", "─", "─", "─", "─", "┘", "┌", "┘", "└", "┘", "┌", "─", "─", "─", "┘", "┌", "─", "┐", "┌", "┐", "│", "│", "┌", "─", "┐", "└", "┐", "│", "┌", "─", "┘", "└", "┐", "└", "┐", "└", "┘", "┌", "─", "┘", "└", "─", "─", "┐", "└", "─", "┘", "│", "│", "└", "┐", "└", "─", "┐", "│", "┌", "┘", "└", "┐", "┌", "┐", "┌", "┐", "┌", "─", "┘", "│", "┐", "┌", "┐", "│", "└", "─", "─", "┘", "┌", "─", "┐", "│", "└", "─", "─", "─", "─", "─", "─", "─", "┐", "│", "┌", "─", "─", "┐", "│", "┐", "└", "┘", ".", "│", "└", "└", "┌", "┐", "┘", "┐"],
["│", "─", "└", "┘", "└", "┐", "┌", "─", "─", "┘", "└", "┘", "│", "└", "─", "─", "─", "┘", "└", "┐", "┌", "┐", "┌", "┘", "│", "┌", "─", "┐", "┌", "─", "┐", "│", "└", "┘", "└", "┐", "┌", "┐", "─", "┌", "─", "┘", "┌", "─", "─", "┘", "┌", "─", "─", "┐", "└", "┐", "│", "│", "│", "│", "│", "│", "┌", "┘", "┌", "┘", "│", "└", "─", "┐", "┌", "┘", "┌", "┘", "┌", "┐", "│", "┌", "┐", "┌", "┐", "─", "└", "─", "┐", "┌", "┘", "└", "┐", "│", "┌", "┐", "│", "│", "│", "┌", "┐", "└", "┘", "└", "┘", "│", "└", "─", "┐", "│", "┌", "┘", "└", "┘", "┌", "┐", "┌", "─", "┘", "┌", "┘", "│", "┌", "─", "─", "─", "─", "─", "─", "─", "┘", "│", "└", "─", "┐", "└", "┘", "┘", "┌", "└", "─", "┐", ".", "│", "┘", "┌", "─", "─"],
["┐", "│", "└", "┌", "─", "┘", "└", "─", "─", "┐", "┌", "┐", "┌", "─", "─", "─", "─", "─", "┐", "│", "│", "│", "└", "┐", "└", "┘", "┌", "└", "┘", "└", "└", "┘", "┌", "─", "┐", "└", "┘", "└", "┐", "│", "┌", "─", "┘", "─", "┌", "┐", "└", "┐", "┌", "┘", "┌", "┘", "└", "┘", "│", "│", "│", "│", "└", "┐", "└", "┐", "└", "─", "─", "┘", "└", "┐", "│", "┌", "┘", "└", "┘", "│", "│", "│", "│", "┌", "┐", "┌", "┘", "└", "┐", "┌", "┘", "└", "┘", "└", "┘", "│", "└", "┘", "└", "─", "─", "┐", "┌", "┘", "┌", "┐", "└", "┘", "└", "┐", "┌", "┐", "│", "│", "│", "┌", "─", "┘", "┌", "┘", "└", "┐", "┌", "─", "─", "─", "┐", "┌", "┐", "└", "─", "┐", "└", "┐", "└", "┘", "┐", "┐", "└", "│", "┌", "│", "┌", "┘", "┘", "│"],
["└", "┐", ".", "└", "─", "┐", "┌", "─", "─", "┘", "│", "│", "└", "─", "─", "─", "─", "┐", "│", "└", "┘", "└", "─", "┘", "┌", "─", "─", "─", "─", "┐", "┌", "┐", "└", "┐", "└", "─", "─", "┐", "└", "┘", "└", "─", "─", "─", "┘", "│", "┌", "┘", "└", "┐", "└", "─", "─", "┐", "│", "│", "│", "└", "┐", "└", "┐", "│", "┌", "┐", "┌", "─", "┐", "│", "│", "└", "─", "┐", "┌", "┘", "│", "│", "│", "│", "│", "└", "┐", "┌", "┘", "└", "┐", "┌", "┐", "┌", "┐", "└", "┐", "┌", "┐", "└", "┌", "┘", "└", "─", "┘", "└", "─", "─", "┐", "└", "┘", "└", "┘", "│", "│", "└", "─", "─", "┘", "┌", "┐", "└", "┘", "┌", "─", "─", "┘", "│", "└", "─", "┐", "└", "─", "┘", ".", "│", "└", "┘", "─", "└", "─", "┘", "┌", "┘", "┌", "│"],
["┌", "┌", "┌", "─", "─", "┘", "└", "─", "─", "┐", "│", "│", "┌", "┐", "┌", "┐", "┌", "┘", "└", "─", "─", "┐", "┌", "┐", "└", "─", "─", "─", "┐", "└", "┘", "└", "┐", "└", "─", "─", "┐", "└", "┐", "┌", "┐", "┌", "─", "┐", "┌", "┘", "│", "┌", "─", "┘", "┌", "┐", "┌", "┘", "└", "┘", "└", "┐", "│", "┌", "┘", "└", "┘", "│", "│", "┌", "┘", "│", "│", "┌", "─", "┘", "└", "┐", "└", "┘", "│", "│", "│", "┌", "┘", "│", "┌", "┐", "└", "┘", "└", "┘", "└", "┐", "│", "│", "└", "┐", "└", "┐", "┌", "┐", "┌", "─", "─", "─", "┘", "┌", "─", "─", "─", "┘", "│", "┌", "─", "─", "─", "┘", "└", "─", "─", "┘", "┌", "┐", "┌", "┘", "┌", "┐", "└", "─", "─", "─", "┐", ".", "│", "┘", "│", "└", "└", "┐", "┌", "─", "─", "┐"],
["│", "┘", "└", "─", "─", "─", "┐", "┌", "─", "┘", "│", "│", "│", "│", "│", "│", "└", "─", "─", "┐", "┌", "┘", "│", "│", "┌", "┐", "┌", "┐", "└", "─", "─", "┐", "└", "─", "─", "─", "┘", "┘", "└", "┘", "│", "│", "┌", "└", "┘", "┌", "│", "│", "┌", "─", "┘", "│", "└", "┐", "┌", "┐", "┌", "┘", "│", "└", "┐", "┌", "┐", "└", "┘", "└", "┐", "└", "┘", "└", "┐", "┌", "┐", "│", "┌", "─", "┘", "│", "│", "└", "┐", "│", "│", "└", "─", "─", "┐", "┌", "┐", "│", "│", "└", "┐", "│", "─", "└", "┘", "│", "└", "┐", "┌", "─", "┐", "└", "─", "─", "─", "─", "┘", "└", "┐", "┌", "┐", "┌", "┐", "┌", "─", "─", "┘", "└", "┘", "┌", "┘", "└", "─", "─", "─", "─", "┘", "┌", "─", ".", "┘", "│", "┘", "┌", "─", "┌", "┘", "."],
["└", ".", "│", "┌", "─", "─", "┘", "└", "─", "─", "┘", "└", "┘", "└", "┘", "│", "┐", "┌", "─", "┘", "└", "─", "┘", "│", "│", "│", "│", "│", "┌", "─", "┐", "│", "┌", "┐", "┌", "┐", "┌", "┐", "┌", "┐", "└", "┘", "┌", "─", "─", "─", "┘", "│", "└", "┐", "┌", "┘", "─", "│", "│", "└", "┘", ".", "└", "┐", "└", "┘", "│", "└", "┌", "┐", "└", "┐", "┌", "┐", "└", "┘", "│", "│", "│", "┌", "┐", "│", "└", "┐", "│", "└", "┘", "┌", "─", "─", "┘", "│", "└", "┘", "└", "─", "┘", "│", "┌", "─", "┐", "│", "┌", "┘", "└", "┐", "│", "┌", "┐", "┌", "─", "┐", "┌", "─", "┘", "│", "│", "│", "└", "┘", "┌", "─", "─", "┐", "┌", "┘", "┌", "┐", "┌", "┐", "┐", "┌", "┐", "─", "┐", "─", "┘", "┌", "─", "└", ".", "┘", "─", "┐"],
["┌", "─", "└", "└", "─", "┐", "┌", "┐", "┌", "─", "┐", "┌", "┐", "┌", "┐", "└", "┐", "└", "┐", "┌", "┐", "┌", "┐", "└", "┘", "└", "┘", "└", "┘", "┌", "┘", "└", "┘", "└", "┘", "└", "┘", "└", "┘", "└", "─", "┐", "└", "─", "─", "─", "┐", "└", "─", "┘", "└", "─", "┐", "│", "│", "┌", "┐", "┌", "┐", "│", "┌", "─", "┘", "┌", "┘", "└", "─", "┘", "│", "└", "─", "─", "┘", "│", "└", "┘", "│", "└", "┐", "│", "│", "┌", "─", "┘", "┌", "─", "┐", "└", "─", "┐", "┌", "─", "─", "┘", "└", "┐", "│", "│", "└", "─", "┐", "│", "└", "┘", "└", "┘", "─", "└", "┘", "┌", "┐", "│", "│", "│", "┌", "─", "┘", "┌", "┐", "└", "┘", "┌", "┘", "└", "┘", "└", "─", "┘", "│", ".", "┌", "┐", "└", "┘", "└", "│", "┌", "┘", "┌", "│"],
["┌", "┐", ".", "┌", "─", "┘", "│", "│", "│", "┌", "┘", "│", "└", "┘", "└", "┐", "│", "┘", "└", "┘", "└", "┘", "└", "─", "─", "─", "─", "─", "┐", "│", "┌", "┐", "┌", "┐", "┐", "┌", "┐", "┌", "─", "─", "─", "┘", "│", "┌", "┐", "┌", "│", "┌", "┐", "┌", "┐", "┌", "┘", "│", "│", "│", "└", "┘", "│", "│", "│", "┌", "┐", "└", "─", "─", "─", "┐", "│", "┌", "┐", "┌", "─", "┘", "┌", "─", "┘", "┌", "┘", "│", "│", "│", "┌", "┐", "└", "┐", "│", "┌", "─", "┘", "└", "─", "┐", "┘", "┌", "┘", "│", "└", "┐", "┌", "┘", "│", "┌", "─", "─", "─", "─", "─", "─", "┘", "└", "┘", "└", "┘", "└", "─", "─", "┘", "└", "┐", "│", "│", "┌", "─", "─", "─", "─", "─", "┘", "┐", "┘", "└", "┐", "┘", "┌", "┌", "┘", "┌", "─", "┐"],
["└", "┘", "─", "│", "┌", "┐", "│", "└", "┘", "│", "┌", "┘", "┌", "─", "─", "┘", "└", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "└", "┘", "└", "┘", "└", "─", "┘", "└", "┘", "┌", "─", "─", "─", "┐", "│", "│", "┌", "┘", "│", "└", "┘", "│", "│", "┌", "┘", "│", "└", "─", "┐", "│", "│", "│", "│", "│", "┌", "─", "─", "┐", "│", "└", "┘", "│", "└", "─", "┐", "└", "┐", "┌", "└", "┐", "│", "│", "│", "│", "└", "┐", "│", "│", "│", "┌", "┐", "┌", "─", "┘", "┌", "┘", "┌", "┘", ".", "│", "└", "┐", "└", "┘", ".", "┌", "─", "─", "─", "─", "─", "┐", "┌", "─", "─", "─", "─", "─", "─", "─", "┘", "┌", "┘", "└", "─", "─", "─", "─", "┐", "┌", "┐", "┐", "┘", "└", "┌", "┌", "└", "─", "└", "┘", "│"],
["└", "│", "┌", "┘", "│", "└", "┘", "┌", "─", "┘", "└", "┐", "│", "┌", "┐", "┌", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "┐", "┌", "┐", "┌", "─", "┐", "┌", "─", "─", "┐", "┌", "┐", "│", "┌", "─", "─", "┘", "│", "│", "└", "┐", "│", "┌", "┐", "└", "┘", "│", "┌", "┘", "┌", "┐", "│", "│", "│", "│", "│", "│", "└", "─", "┐", "│", "│", "┌", "─", "┘", "┌", "┐", "│", "┌", "┘", "┌", "┐", "│", "│", "│", "│", "│", "┌", "┘", "│", "│", "└", "┘", "│", "│", "┌", "┐", "└", "┐", "│", "┌", "┐", "│", "┌", "┘", "└", "┌", "┐", "└", "─", "─", "─", "─", "┐", "│", "└", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "─", "─", "─", "┘", "│", "└", "┐", "┐", "┌", "┐", "┘", "┌", "┌", "┘", "┘", "┐"],
["┌", "└", "│", "┌", "┘", "┌", "┐", "│", "┌", "─", "─", "┘", "└", "┘", "└", "┘", "┌", "─", "─", "─", "┐", "┌", "─", "┐", "┌", "─", "┘", "│", "│", "│", "┌", "┘", "│", "┌", "─", "┘", "│", "│", "│", "└", "─", "┐", "┌", "┘", "│", "┌", "┘", "│", "│", "└", "┐", "┌", "┘", "│", "┌", "┘", "│", "│", "└", "┘", "│", "│", "└", "┐", "┌", "┘", "└", "┘", "└", "┐", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "│", "│", "│", "│", "│", "│", "┌", "┘", "└", "┐", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "│", "│", "│", "└", "┐", "┌", "┘", "└", "┐", "┌", "┐", "┌", "┐", "│", "│", "┌", "─", "┐", "┌", "─", "─", "─", "─", "─", "─", "┘", "└", "┘", "│", "┌", "─", "─", "┘", "┌", "┘", "┌", "┐", "┘", ".", "└", "┐", "┌", "┐", "┐"],
["└", "└", "└", "┘", "└", "│", "│", "└", "┘", "┌", "┐", "┌", "─", "┐", "┌", "─", "┘", "┌", "┐", "┌", "┘", "└", "┐", "│", "└", "─", "─", "┘", "└", "┘", "└", "┐", "│", "└", "┐", "┌", "┘", "│", "└", "─", "┐", "│", "│", "┘", "└", "┘", "┌", "┘", "│", "┌", "┘", "└", "┐", "│", "└", "┐", "└", "┘", "┌", "┐", "│", "│", "│", "│", "└", "─", "─", "─", "┐", "│", "│", "└", "│", "│", "│", "└", "┐", "│", "│", "│", "│", "│", "│", "│", "└", "─", "┐", "│", "│", "┌", "┘", "│", "│", "└", "┐", "└", "┘", "│", "└", "┐", "│", "└", "─", "┐", "│", "│", "│", "│", "│", "│", "└", "┘", "┌", "┘", "└", "─", "─", "─", "─", "─", "─", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "┘", "┌", "┘", "└", "─", "┐", "└", "└", "┌", "┘", "└"],
["└", "┐", "┌", "┌", "┐", "│", "└", "─", "─", "┘", "│", "│", "┌", "┘", "└", "┐", "┌", "┘", "│", "│", "│", "┌", "┘", "└", "─", "─", "─", "─", "┐", "┌", "┐", "│", "│", "┌", "┘", "└", "┐", "└", "┐", "┌", "┘", "│", "└", "─", "┐", "│", "└", "┐", "│", "└", "─", "─", "┘", "│", "┌", "┘", "┘", "┌", "┘", "│", "│", "└", "┐", "│", "┌", "┐", "┌", "─", "┘", "│", "│", "┌", "┘", "│", "│", "┌", "┘", "│", "│", "│", "│", "└", "┘", "└", "┐", "┌", "┘", "└", "┘", "└", "─", "┘", "└", "┐", "│", "┐", "┌", "┘", "┌", "┘", "│", "┌", "─", "┘", "└", "┘", "│", "│", "└", "┘", "┌", "┐", "└", "─", "┐", "┌", "─", "─", "─", "─", "┐", "┌", "─", "┐", "┌", "─", "┘", "└", "┘", "┐", "│", "┌", "─", "─", "┘", "┐", ".", "│", ".", "│"],
["┌", "─", "─", "┘", "└", "┘", "┌", "─", "─", "┐", "└", "┘", "│", "┌", "┐", "└", "┘", "┌", "┘", "└", "┐", "└", "─", "─", "─", "─", "─", "┐", "└", "┘", "└", "┘", "│", "│", "┌", "┐", "│", "┌", "┘", "│", "┌", "┘", "┌", "┐", "│", "┌", "─", "┘", "└", "┐", "┌", "─", "┐", "└", "┘", "┌", "┐", "└", "┐", "└", "┘", "┌", "┘", "└", "┘", "│", "└", "─", "┐", "└", "┘", "│", "┌", "┘", "│", "└", "┐", "│", "│", "│", "└", "┐", "┌", "┐", "│", "│", "┌", "┐", "┌", "┐", "┌", "─", "─", "┘", "└", "┐", "│", "┌", "┘", "┌", "┘", "└", "─", "┐", "┌", "─", "┘", "└", "─", "─", "┘", "│", "┌", "─", "┘", "└", "┐", "┐", "┌", "┐", "└", "┘", "│", "└", "┘", "─", "┌", "─", "─", "─", "┘", "└", "┐", ".", "│", "┐", "└", "┐", "┐", "┌"],
["│", "┌", "─", "─", "─", "┐", "│", ".", "┌", "┘", "┌", "┐", "└", "┘", "└", "┐", "┌", "┘", "┌", "┐", "└", "─", "─", "─", "─", "─", "─", "┘", "┌", "┐", "┌", "─", "┘", "│", "│", "│", "│", "└", "┐", "│", "└", "┐", "│", "│", "│", "└", "─", "┐", "┌", "┘", "└", "┐", "└", "─", "┐", "│", "└", "─", "┘", "┌", "┐", "└", "─", "─", "┐", "└", "┐", "┌", "┘", "┌", "─", "┘", "└", "┐", "└", "┐", "│", "│", "│", "└", "┐", "│", "│", "└", "┘", "└", "┘", "└", "┘", "│", "│", "┌", "┐", "┌", "┐", "│", "│", "└", "┐", "└", "┐", "┌", "┐", "│", "└", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "└", "─", "─", "┐", "└", "─", "┘", "└", "─", "─", "┐", "┌", "─", "─", "┘", "┌", "─", "┐", "┌", "┐", "└", "─", "┐", "─", "┐", ".", "┌", "│"],
["└", "┘", "─", "┌", "─", "┘", "└", "┐", "└", "─", "┘", "└", "─", "─", "┐", "└", "┘", "┌", "┘", "│", "┌", "┐", "┌", "┐", "┌", "─", "─", "─", "┘", "│", "└", "─", "┐", "│", "│", "└", "┘", "┌", "┘", "└", "┐", "│", "│", "│", "│", "┌", "─", "┘", "└", "─", "┐", "│", "┌", "─", "┘", "└", "─", "─", "┐", "│", "└", "┐", "┌", "─", "┘", "┌", "┘", "│", ".", "└", "┐", "┌", "┐", "└", "┐", "│", "│", "│", "│", "┌", "┘", "│", "└", "─", "┐", "┌", "┐", "┌", "─", "┘", "│", "│", "│", "│", "│", "│", "└", "┐", "└", "┐", "│", "│", "│", "└", "┐", "│", "│", "└", "┘", "│", "└", "─", "─", "┐", "┌", "└", "┐", "┌", "┐", "┌", "─", "─", "┘", "│", "┌", "─", "─", "┘", "─", "└", "┘", "└", "─", "─", "┘", "─", "│", "─", "└", "┘"],
["└", "└", "┌", "┘", "┌", "─", "─", "┘", "┌", "─", "─", "┐", "┌", "─", "┘", "┌", "┐", "└", "┐", "└", "┘", "│", "│", "└", "┘", "┌", "─", "─", "─", "┘", "┌", "┐", "│", "│", "│", "┌", "┌", "┘", "┌", "┐", "│", "└", "┘", "└", "┘", "└", "┐", "┌", "─", "┐", "└", "┘", "└", "┐", "┌", "┐", "┌", "┌", "┘", "└", "┐", "│", "└", "─", "┐", "└", "┐", "└", "┐", "─", "│", "│", "└", "┐", "│", "│", "│", "└", "┘", "│", "┌", "┘", "┌", "─", "┘", "│", "│", "└", "─", "┐", "│", "│", "└", "┘", "│", "│", "┌", "┘", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "│", "┌", "─", "┘", "┌", "─", "┐", "│", "┌", "─", "┘", "│", "│", "└", "─", "┐", "│", "│", "│", "┌", "─", "─", "─", "─", "─", "─", "─", "─", "┐", "─", "─", "┘", "└", "│"],
["┌", "─", "└", "┐", "└", "┐", ".", ".", "└", "─", "┐", "└", "┘", "┌", "┐", "│", "└", "┐", "└", "─", "┐", "└", "┘", "┌", "─", "┘", "┌", "┐", "┌", "┐", "│", "│", "│", "│", "└", "┐", "│", "┌", "┘", "└", "┘", "┌", "┌", "─", "─", "─", "┘", "└", "┐", "└", "┐", "┌", "┐", "└", "┘", "└", "┐", "└", "┐", "┌", "┘", "│", "┌", "─", "┘", "┘", "└", "┐", "└", "┐", "└", "┘", "└", "└", "┘", "│", "└", "┐", "┌", "┘", "└", "┐", "└", "─", "┐", "│", "│", "┌", "─", "┘", "│", "└", "─", "┐", "└", "┘", "└", "┐", "│", "│", "└", "┘", "│", "│", "┌", "┘", "│", "└", "─", "┐", "└", "┐", "│", "│", "└", "┐", "┌", "┘", "│", "┌", "┐", "└", "─", "┘", "└", "┘", "┌", "┐", "┌", "─", "─", "─", "─", "─", "┘", "┐", ".", "└", "│", "│"],
["┘", "┘", "┌", "└", "┐", "│", "┐", "└", "└", "┐", "└", "┐", "┌", "┘", "│", "└", "┐", "└", "┐", "┌", "┘", "┌", "─", "┘", "┌", "┐", "│", "│", "│", "└", "┘", "│", "│", "└", "┐", "│", "│", "│", "│", "┌", "─", "─", "┘", "┌", "┐", "┌", "─", "─", "┘", "┌", "┘", "│", "│", "┌", "┐", "┌", "┘", "┌", "│", "└", "┐", "│", "└", "─", "┐", "┌", "┐", "└", "┐", "│", "┌", "┌", "─", "─", "┐", "│", "┌", "┘", "└", "┐", "┌", "┘", "┌", "─", "┘", "│", "│", "└", "┐", "┌", "┘", "┌", "┐", "└", "─", "─", "┐", "│", "└", "─", "─", "┐", "│", "│", "└", "┐", "└", "┐", "┌", "┘", "┌", "┘", "│", "│", "┌", "┘", "└", "┐", "│", "│", "└", "┐", "┌", "┐", "┌", "┐", "│", "│", "└", "─", "┐", "┌", "─", "┐", "└", "┌", "─", "┐", "─", "┐"],
["│", "┐", "└", "┐", "│", "│", "┘", "─", "└", "┘", ".", "│", "└", "┐", "└", "┐", "└", "┐", "│", "│", "┌", "┘", "┌", "─", "┘", "│", "│", "│", "└", "┐", "┘", "└", "┘", "└", "│", "│", "│", "└", "┐", "│", "┌", "┐", "┌", "┘", "│", "│", "┌", "─", "┐", "└", "┐", "│", "│", "│", "│", "└", "─", "┐", "└", "┐", "│", "│", "┌", "─", "┘", "│", "│", "┌", "┘", "└", "┐", "│", "┌", "─", "┘", "│", "│", "┌", "┐", "└", "┘", "┌", "┘", "┌", "┐", "│", "│", "┌", "┘", "│", "┌", "┘", "└", "─", "┐", "┌", "┘", "└", "─", "┐", "┌", "┘", "└", "┘", "└", "└", "┐", "│", "└", "┐", "└", "┐", "└", "┘", "│", "┌", "┐", "│", "│", "│", "┌", "┘", "│", "│", "│", "└", "┘", "└", "─", "─", "┘", "│", "┌", "┘", "┘", "└", "┐", "│", "└", "│"],
["┘", "┘", "│", "┌", "└", "┘", "│", "└", "┘", "┐", "└", "└", "─", "┘", ".", "└", "┐", "│", "│", "│", "└", "┐", "│", "─", "┌", "┘", "│", "└", "┐", "└", "─", "─", "─", "┐", "│", "│", "│", "┌", "┘", "└", "┘", "└", "┘", "┌", "┘", "└", "┘", "┌", "┘", "┌", "┘", "│", "│", "│", "│", "┌", "┐", "└", "┐", "│", "│", "└", "┘", "┐", "┌", "┘", "└", "┘", "┌", "┐", "└", "┘", "└", "┐", "└", "│", "└", "┘", "└", "─", "┐", "└", "┐", "│", "│", "│", "│", "│", "┌", "┘", "│", "┌", "─", "─", "┘", "└", "─", "─", "┐", "│", "└", "─", "─", "┐", ".", "┌", "└", "┘", "─", "└", "┐", "│", "┌", "─", "┘", "│", "│", "│", "│", "│", "└", "┐", "│", "│", "└", "─", "─", "─", "┐", "┌", "─", "┘", "└", "┐", ".", "│", "┌", "│", "─", "┘"],
["│", ".", "─", "┘", ".", "┌", "┐", "└", "┘", "┘", "└", "└", "└", "┌", "─", "─", "┘", "│", "│", "│", "┌", "┘", "│", "┌", "┘", "┌", "┘", "┌", "┘", "┌", "┐", "┌", "┐", "│", "└", "┘", "│", "│", "┌", "┐", "┌", "─", "─", "┘", "┌", "─", "┐", "└", "┐", "└", "─", "┘", "│", "│", "│", "│", "└", "┐", "│", "│", "└", "┐", "┌", "─", "┘", "┌", "─", "┐", "│", "└", "┐", "┌", "┐", "└", "┐", "└", "┐", "┌", "┐", "┌", "┘", "┌", "┘", "│", "│", "│", "└", "┘", "│", "┌", "┘", "└", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "│", "┌", "─", "┐", "└", "┐", "┌", "─", "─", "─", "─", "┘", "│", "└", "┐", "┌", "┘", "└", "┘", "│", "│", "┌", "┘", "│", "│", "┌", "┐", "┌", "┐", "└", "┘", "┌", "─", "┐", "│", "┐", "┌", "└", "┐", ".", "└"],
["─", "┘", ".", "│", "┌", "│", "┐", "─", "┐", ".", "┌", "─", "┘", "└", "─", "─", "┐", "│", "│", "│", "└", "┐", "│", "└", "┐", "│", "│", "└", "┐", "│", "│", "│", "│", "└", "─", "┐", "│", "│", "│", "└", "┘", "┌", "─", "┐", "└", "┐", "└", "┐", "└", "┐", "┌", "─", "┘", "│", "│", "└", "┐", "└", "┘", "└", "┐", "│", "└", "─", "┐", "│", ".", "│", "└", "┐", "│", "│", "│", "┌", "┘", "┌", "┘", "│", "│", "│", "│", "│", "┌", "┘", "│", "└", "─", "┐", "│", "│", "┌", "┐", "└", "┘", "│", "│", "└", "┘", ".", "│", "│", "┌", "┘", "┌", "┘", "└", "┐", "┌", "─", "─", "┐", "│", "┌", "│", "│", "┌", "┐", "┘", "└", "┘", "│", "┌", "┘", "│", "│", "└", "┘", "│", "┌", "─", "┘", "│", "└", "┘", "│", "┌", "│", "└", "┐", "┘"],
[".", ".", ".", "│", "└", "└", "┘", "└", "└", "┐", ".", "│", ".", "│", "└", "└", "└", "┘", "└", "┘", "┌", "┘", "│", "┌", "┘", "│", "┌", "─", "┘", "│", "│", "│", "└", "─", "┐", "│", "└", "┘", "└", "─", "─", "┘", "┘", "│", "┌", "┘", "┐", "└", "┐", "│", "└", "┐", "┌", "┘", "│", "┌", "┘", "┌", "─", "─", "┘", "└", "┐", "┌", "┘", "│", "┌", "┘", "┌", "┘", "│", "│", "│", "└", "┐", "└", "┐", "│", "│", "└", "┐", "│", "│", "┌", "┘", "┌", "─", "┘", "│", "│", "│", "└", "─", "─", "┘", "└", "─", "─", "┐", "└", "┘", "│", "┌", "┘", "┌", "┐", "│", "│", "┌", "─", "┘", "│", "┌", "┘", "└", "┘", "└", "┐", "┌", "─", "┘", "└", "┐", "│", "└", "─", "┐", "│", "└", "┐", "└", "┘", "┐", "┘", "┌", "┌", "┌", ".", "─", "."],
["│", "─", "┌", "┐", "─", "┌", "└", "└", "│", "─", "└", "┘", "┐", "┐", "│", ".", "└", "┘", "┘", "┘", "└", "┐", "│", "└", "┐", "│", "└", "┐", "┌", "┘", "│", "└", "─", "┐", "└", "┘", "┌", "─", "─", "─", "─", "─", "─", "┘", "│", "┌", "┌", "┐", "└", "┘", "┌", "┘", "│", "┌", "┘", "└", "┐", "│", "┌", "─", "─", "┐", "│", "└", "┐", "│", "└", "┐", "└", "┐", "│", "│", "└", "┐", "│", "┌", "┘", "│", "└", "┐", "│", "└", "┘", "└", "┐", "└", "─", "┐", "└", "┘", "└", "┐", "┌", "─", "┐", "┌", "─", "┐", "└", "─", "┐", "└", "┘", "┘", "│", "│", "│", "│", "│", "┌", "┐", "│", "└", "─", "─", "┐", "┌", "┘", "└", "┐", "┌", "┐", "│", "│", "┌", "┐", "│", "│", "┌", "┘", "─", "┌", "│", "┐", "┘", "│", "│", "┌", "┘", "┐"],
["│", "┌", "│", "┘", ".", "└", ".", "┌", "─", "┐", "│", "└", "┘", "─", "└", "┘", "┘", ".", "│", ".", "└", "│", "└", "┐", "│", "│", "┌", "┘", "│", "┌", "┘", "┌", "┐", "└", "─", "┐", "└", "─", "┐", "┌", "─", "─", "─", "┐", "└", "┐", "│", "└", "─", "┐", "└", "─", "┘", "│", "┌", "┐", "│", "│", "└", "┐", "┌", "┘", "└", "┐", "│", "└", "┐", "│", "┌", "┘", "│", "└", "┐", "└", "┘", "└", "┐", "│", "┌", "┘", "└", "┐", "┌", "─", "┘", "┌", "┐", "└", "─", "┐", "┌", "┘", "└", "┐", "│", "└", "┐", "│", "┌", "┐", "└", "─", "─", "─", "┘", "│", "│", "│", "└", "┘", "│", "│", "┘", "┌", "┐", "└", "┘", "┌", "─", "┘", "│", "│", "│", "└", "┘", "│", "│", "└", "┘", "┘", "┌", "└", "┘", "┘", "└", "┌", "┘", "└", "┘", "┘"],
["│", "└", "┘", "└", "─", "┘", "─", "─", "│", "└", "─", "┌", "┐", "┘", "└", "┐", "┘", "─", "┌", "┐", "│", "│", "┌", "┘", "│", "│", "└", "┐", "│", "└", "┐", "│", "│", "┌", "┐", "└", "┐", "┌", "┘", "│", "┌", "─", "─", "┘", "┌", "┘", "└", "─", "┐", "└", "─", "─", "─", "┘", "│", "│", "│", "│", "┌", "┘", "│", "┌", "┐", "│", "│", "┌", "┘", "└", "┘", "│", "└", "┐", "└", "─", "─", "┐", "│", "│", "└", "─", "┐", "│", "└", "┐", "┌", "┘", "│", "┌", "─", "┘", "└", "┐", "┌", "┘", "└", "┐", "│", "│", "│", "│", "┌", "┐", "┌", "┐", "┌", "┘", "└", "┘", "┌", "─", "┘", "└", "─", "┘", "└", "┐", "└", "│", "┌", "─", "┘", "│", "└", "┐", ".", "│", "└", "┐", "┘", ".", "│", "┘", "┐", "┌", "┌", "┘", "─", "│", "└", "│"],
["┌", "└", "┐", "┘", "└", "┌", ".", "└", "┌", "┐", "┐", ".", "└", "─", "┌", "┘", "┐", ".", "┐", "┐", "┐", "│", "│", "└", "└", "┘", "┘", "└", "┘", "┐", "│", "│", "│", "│", "└", "┐", "│", "│", "┌", "┘", "└", "─", "┐", "┌", "┘", "┌", "─", "─", "┘", "┌", "─", "─", "─", "┐", "│", "└", "┘", "└", "┘", "┌", "┘", "│", "│", "│", "│", "│", "┌", "─", "┐", "┌", "─", "┘", "┌", "─", "─", "┘", "└", "┘", "┌", "─", "┘", "│", "┌", "┘", "└", "┐", "│", "└", "─", "─", "┐", "│", "│", "┌", "─", "┘", "│", "│", "│", "└", "┘", "│", "│", "│", "└", "─", "┐", "│", "└", "┐", "┌", "┐", "┌", "─", "┐", "└", "┐", "└", "┘", "┌", "─", "┘", "┌", "┘", "─", "└", "┐", "│", "┐", "┐", "┘", "│", "┌", "┌", "┌", "┘", "┌", "─", "─", "─"],
["─", "┌", ".", "┌", "┘", "└", "┌", "┐", "└", "┐", "│", "┐", "│", ".", "┌", "└", "│", "┐", "┘", "│", "─", "└", "┘", "─", "┌", "─", "─", "─", "─", "─", "┘", "│", "└", "┘", "│", "└", "┘", "└", "┘", "┌", "─", "─", "┘", "└", "┐", "└", "┐", "┌", "┐", "│", "│", "┌", "─", "┘", "└", "─", "─", "┐", "┌", "┘", "┌", "┘", "│", "│", "│", "└", "┘", "┌", "┘", "└", "─", "┐", "└", "─", "─", "─", "─", "┐", "└", "┐", "┌", "┘", "└", "─", "┐", "│", "│", "┌", "─", "┐", "│", "│", "│", "└", "─", "┐", "│", "│", "└", "─", "┐", "│", "│", "│", "┌", "┐", "│", "┌", "─", "┘", "│", "│", "└", "┐", "└", "┐", "│", "┌", "┐", "└", "─", "┐", "└", "┐", "┘", "└", "│", "│", "│", "│", "┐", "│", "┌", "└", "┌", "┌", "┐", "└", "┐", "."],
[".", "─", "│", "└", "┐", "│", "┌", "│", "─", "┘", "─", "─", "┐", "┐", "┘", "└", "┘", "└", "┌", "│", "┐", "┌", "┘", "└", "└", "─", "─", "┐", "┌", "─", "┐", "└", "─", "─", "─", "─", "─", "─", "┐", "└", "─", "─", "┐", "┌", "┘", "┌", "┘", "│", "│", "│", "┌", "┘", "┌", "┐", "┌", "┐", "┌", "┘", "│", "┌", "┘", "┌", "┘", "│", "└", "─", "┐", "└", "┐", "┌", "─", "┘", "┌", "─", "┐", "┌", "─", "┘", "│", "└", "┘", "┌", "─", "─", "┘", "│", "│", "│", "┐", "└", "┘", "└", "┘", "│", "┌", "┘", "│", "│", "┌", "┐", "│", "│", "│", "│", "│", "└", "┘", "└", "┐", "┌", "┘", "│", "┌", "┘", "┌", "┘", "└", "┘", "└", "─", "┐", "└", "─", "┘", "└", "┌", "└", "┘", "┐", "┐", "┌", "┐", "┐", ".", "│", "│", "└", "┌", "┘", "┘"],
[".", "┌", "└", "│", ".", "─", "┘", "└", "┐", "│", ".", "┘", "└", "┐", "┐", "│", "┘", "┌", "│", "│", "─", "└", "┐", "┌", "─", "─", "─", "┘", "│", "│", "└", "┐", "┌", "─", "─", "─", "─", "─", "┘", "┌", "─", "─", "┘", "│", "┌", "┘", "┌", "┘", "│", "│", "└", "─", "┘", "│", "│", "└", "┘", "└", "│", "│", "─", "└", "┐", "└", "┐", "┌", "┘", "┌", "┘", "└", "┐", "┌", "┘", "┌", "┘", "└", "─", "─", "─", "─", "┐", "└", "─", "┐", "┌", "┘", "│", "└", "─", "─", "─", "┐", "┌", "─", "┘", "┌", "┘", "└", "┘", "│", "│", "└", "┘", "│", "│", "┌", "┐", "┌", "┘", "│", "┌", "┘", "└", "┐", "│", "┌", "─", "┐", "┌", "┐", "└", "─", "┐", "┘", "┐", "┘", "┌", "└", "┘", "┐", "┐", "└", "└", "─", "┌", "└", "─", "┘", "┘", "│"],
["┌", "│", "─", "─", "┐", "│", "┐", "─", "│", "─", "┐", "│", "┐", "┘", "└", "└", "┘", "└", "┐", "┘", "┌", "│", "─", "└", "─", "─", "─", "┐", "│", "┌", "─", "┘", "└", "─", "─", "─", "─", "─", "┐", "└", "┐", "┌", "┐", "│", "└", "┐", "│", ".", "└", "┘", "─", "┌", "─", "┘", "└", "─", "─", "┐", "│", "│", "┌", "─", "┘", "┌", "┘", "└", "┐", "│", "┌", "─", "┘", "└", "┐", "└", "┐", "┌", "┐", "┌", "┐", "┌", "┘", "┌", "─", "┘", "└", "┐", "│", "┌", "─", "┐", "┌", "┘", "└", "┐", "┌", "┘", "┌", "┌", "─", "┘", "└", "┐", "┌", "┘", "└", "┘", "│", "└", "┐", "│", "│", "┌", "┐", "│", "│", "└", "┐", "└", "┘", "│", "┌", "─", "┘", "┘", "┐", ".", "│", "│", "─", "│", "┌", "─", "└", "─", "─", "┌", ".", "│", "┘", "┌"],
["─", "┐", "─", "└", "┐", "└", "┘", "┐", "│", ".", "┌", "│", "└", "─", "┘", ".", "┌", ".", "└", "─", "─", "┐", "┐", "┘", "│", ".", "┌", "┘", "│", "│", "┌", "┐", "┌", "┐", "┌", "─", "─", "─", "┘", "└", "│", "│", "│", "│", "┌", "┘", "└", "┐", "┘", "┌", "─", "┘", "┌", "┐", "┌", "┐", "┌", "┘", "└", "┘", "└", "─", "┐", "│", "┌", "┐", "└", "┘", "│", "┌", "┐", "┌", "┘", "┌", "│", "│", "│", "│", "│", "│", "┌", "└", "┐", "┌", "─", "┘", "│", "│", "┌", "┘", "│", "┌", "─", "┘", "└", "─", "┐", "└", "─", "─", "┐", "│", "│", "┌", "─", "─", "┘", "┘", "│", "│", "│", "│", "│", "│", "│", "┌", "┘", "┘", ".", "│", "└", "┐", "│", "┌", "┐", "─", "┘", "┌", "─", "└", "┘", "┌", "┌", "┐", "└", "─", "┐", "└", "─", "┐"],
["│", "│", "┌", "┐", "└", "┐", "┐", "└", "┐", ".", "─", "┐", "─", "┐", "┐", "└", "│", "│", "┘", "┐", "┐", "└", "┌", "─", "┐", "┌", "│", "┌", "┘", "│", "│", "│", "│", "│", "└", "┐", "│", "─", "│", "┘", "└", "┘", "│", "│", "│", "┌", "┐", "│", "┌", "└", "─", "─", "┘", "│", "│", "│", "└", "┐", "┌", "─", "─", "─", "┘", "└", "┘", "│", "┌", "┐", "└", "┘", "│", "└", "─", "┐", "└", "┘", "│", "│", "│", "│", "┌", "┐", "│", "└", "─", "┐", "│", "│", "└", "┐", "│", "│", "┌", "┐", "┌", "┐", "└", "┐", ".", "┌", "┘", "│", "│", "└", "┐", "─", "┌", "─", "┘", "│", "└", "┘", "└", "┘", "│", "│", "┘", "─", "─", "└", "─", "┘", "┐", "└", "┘", "─", "─", "┌", "─", "│", "└", "└", "┘", "─", ".", "┌", "┐", "┐", "└", "┌"],
["─", "─", "┐", ".", "┌", "└", "─", "┌", "┘", ".", "└", ".", "│", "┌", "┌", "┘", "│", "┐", ".", "│", "┌", "┌", "└", "┐", "└", "└", "└", "┘", ".", "└", "┘", "│", "│", "└", "┐", "└", "─", "┐", "┐", "─", "│", "┘", "└", "┘", "│", "│", "└", "┘", "┌", "─", "─", "─", "─", "┘", "│", "└", "─", "┘", "└", "┐", "┌", "─", "┐", "┌", "┐", "└", "┘", "└", "─", "┐", "└", "┐", "┌", "┘", "└", "┌", "┘", "│", "│", "│", "│", "└", "┘", "┌", "─", "┘", "│", "└", "┐", "│", "│", "│", "│", "│", "│", "└", "┐", "└", "┐", "└", "┐", "│", "└", "┐", "│", "┘", "└", "┐", "┌", "┘", ".", "└", "└", "└", "│", "└", "┐", "┐", "└", "│", "┘", ".", "│", "┐", "│", "┐", ".", "┌", "─", "─", "└", "┐", "┘", "─", "┌", "┌", "│", "│", ".", "┐"],
["└", "│", "└", "┐", "┘", ".", "└", "┘", "─", "┐", "┌", "│", "┐", ".", "┌", "┐", ".", "│", "┌", "┘", "─", "│", "┌", "└", ".", "└", "┘", "┘", ".", "└", "┌", "┘", "│", "┌", "┘", "┌", "┐", "└", "┐", "┘", ".", "─", "┌", "─", "┘", "└", "┐", "┌", "┘", "┌", "┐", "┌", "─", "┐", "└", "─", "┐", "┌", "─", "┘", "└", "┐", "│", "│", "│", "┌", "─", "─", "┐", "└", "┐", "└", "┘", "┌", "─", "┘", "┌", "┘", "└", "┘", "│", "┌", "─", "┘", ".", "└", "└", "┐", "│", "└", "┘", "│", "│", "└", "┘", "┌", "┘", "┌", "┘", "─", "└", "┘", ".", "└", "┘", "│", "┌", "│", "│", "┘", "┐", ".", "│", "└", "│", "┌", "┘", "┐", "┌", "│", "─", "┘", "│", "─", "│", "─", "─", "┘", ".", "│", ".", "┌", "┐", "─", "│", "└", "│", "└", "┘", "┘"],
[".", "└", "┐", "┘", "└", "┐", "┌", "│", "│", "└", "└", "┐", "└", "└", "┐", "└", "┐", "└", "┘", "│", "─", "─", "┐", ".", "│", "┘", "│", "┐", "┌", "┐", "└", "┐", "│", "└", "┐", "│", "│", "┌", "┘", "┐", "┌", "┌", "└", "─", "┐", "┌", "┘", "└", "┐", "│", "│", "└", "┐", "└", "┐", "┌", "┘", "│", "┌", "┐", "┌", "┘", "│", "│", "│", "└", "─", "┐", "└", "─", "┘", "│", ".", "└", "─", "─", "┘", "┐", "┘", "┌", "│", "└", "┐", ".", "┘", "┘", "└", "│", "│", "┘", "┌", "┘", "│", "└", "└", "└", "─", "┘", "┘", "│", "│", "─", "└", "└", "┘", "─", "┌", "└", "┘", ".", "┌", "─", "─", ".", "└", "┘", "┘", "│", "┌", "│", "┐", "┌", "│", "┘", "│", "┐", "┘", "┐", "└", "│", "┐", "│", "└", "┘", "┘", "┌", "─", "┐", "┌", "─"],
["┐", "┘", "┌", "┘", "└", "┌", "┌", "┘", "│", "┘", "└", "┘", "│", "┌", "└", "┐", ".", "└", "─", "└", "─", "└", "└", "└", "─", "┌", "─", "└", "└", "─", "┌", "┘", "│", "┘", "│", "│", "└", "┘", "┐", "└", "│", "┘", "└", "└", "│", "│", "┘", "─", "└", "┘", "└", "─", "┘", "┘", "│", "│", "┌", "┘", "│", "│", "│", "┌", "┘", "│", "└", "─", "┐", "└", "─", "┐", "┘", "└", "┐", "│", "┘", "┘", "─", "┘", "─", "┐", "└", "─", "┘", "┐", "┘", "┐", "┌", "└", "┘", "└", "└", "┐", "│", "└", "│", "└", "└", "┐", ".", "└", "┌", "─", "┐", "┘", "│", "└", "┐", "┐", "└", "│", "└", "│", "└", "┐", "└", "│", "─", "┘", "─", "┐", "┘", "┐", ".", "┌", "─", "┘", "┌", "│", "┌", "└", "└", "┐", "└", "┌", "─", "┘", "│", ".", "┘", "│"],
["┐", "│", "┌", "┐", ".", "─", "┘", ".", "│", "│", "┌", "│", "┌", "┘", ".", "│", ".", "┌", "─", "┘", ".", "─", "─", "┐", "─", "┌", "─", "│", "┐", "┌", "└", "─", "┘", "─", "└", "┘", "│", ".", "┘", "┌", "┘", ".", "│", "└", "└", "┘", "┘", "└", "│", "│", "┌", "─", "─", "─", "┘", "│", "└", "─", "┘", "│", "│", "└", "┐", "└", "┐", "┌", "┘", "┌", "─", "┘", ".", "└", "─", "┘", "│", "┐", ".", "└", "│", "┐", "─", "┘", "─", "┘", "┌", "└", "┐", "└", "┘", ".", "└", "└", "┘", "┐", "─", "┘", "┌", "┘", "┐", "└", "┌", "┘", "┘", "─", "┌", "─", ".", "┌", ".", "┐", "─", "│", "┐", "┌", "┐", "│", "┌", "┘", "┌", "│", ".", "┌", "─", "┐", "┘", ".", "│", "└", "┘", "─", "│", "│", "─", "┐", "┘", ".", "─", "┌", "─", "│"],
["└", "│", "┐", "─", "┐", "│", "┌", "┐", "─", "─", "┌", "┌", "┐", "─", "─", "┘", "┌", "─", "┐", "└", "┐", ".", "│", "┐", "┐", "│", "└", "│", "┌", "┘", "└", "│", ".", "┐", "└", "┘", "┌", "┘", ".", "│", "└", "┐", "┌", "│", "─", "└", ".", "┌", "│", "┌", "└", "─", "─", "─", "┐", "└", "┐", "┌", "─", "┘", "│", "┘", "│", "┌", "┘", "└", "┐", "└", "─", "┐", "┐", "┘", "│", "─", "│", "─", "─", ".", "└", "└", "─", "┘", ".", "┌", "│", "┐", "│", "│", ".", "└", "└", "│", "┌", "┐", "┐", ".", "│", "─", "┌", "┌", "┐", "┘", "┘", "┌", "─", "┐", "─", "│", "┐", "│", "│", "┘", "┌", "┌", "└", "─", "│", ".", "┌", "┘", "┐", ".", "┐", "└", "┌", "┌", "─", "┌", "┘", "└", "└", "┘", "┘", ".", "└", "─", "┐", ".", "┐", "─"],
["└", "└", "┌", "─", "─", "┌", "┌", "│", "┌", "┐", "─", "┘", "┘", "┌", "│", ".", "│", "┌", "┘", "┘", "┌", "└", "┐", "└", "┌", "┐", "─", "│", ".", "┘", "─", "─", ".", "└", "─", "┌", "┐", ".", "┌", "┘", "┌", "│", "─", "┐", "┐", "│", ".", "┌", "└", "└", "┘", "┐", ".", "┌", "│", "┌", "┘", "└", "─", "┐", "│", "┌", "┘", "└", "─", "┐", "│", "┌", "┐", "│", "┘", "┌", "┘", "│", "┘", "│", "┘", "└", "─", "─", ".", "└", "┐", "┘", "└", "┘", "┐", "│", ".", "└", "│", "└", "─", "┘", "┌", "┐", "│", ".", "┌", "┘", "│", ".", "└", "┐", "┐", "┐", "┌", "┘", "─", "┐", "┐", "│", "─", "┐", "┘", "─", "┘", "─", "┘", "└", "┐", "┐", "│", "─", "┌", "│", "┐", ".", "┌", "─", "┐", "┘", "└", "┐", "─", "│", "┐", "│", ".", "└"],
["│", "─", "│", "┐", "│", ".", "│", "┌", "┐", "└", "│", "┘", "┌", "┌", "┐", "─", ".", "└", ".", "│", "│", "─", "└", ".", "┌", "┘", ".", "└", ".", "┘", "┐", "│", "┌", "┌", "┘", "│", "│", ".", "│", "─", "─", "│", "─", "┌", "┘", "─", "┐", "└", "└", "└", "└", "│", ".", "┌", "┘", "└", "┐", "┌", "┐", "│", "│", "└", "┐", "┌", "─", "┘", "└", "┘", "└", "┘", "└", "┘", "─", "┘", ".", "┘", "┐", "┌", "┐", "┐", "┐", ".", "│", "│", "┐", "┌", "┌", "┌", "┐", "┌", "┐", "└", "└", "┘", "└", ".", "└", "─", "┘", "┐", "└", "┐", "┌", "│", "│", "┐", "└", "└", "┐", "└", "┌", "─", "┘", "└", "─", "─", "└", "┐", ".", "└", "─", "┘", "│", "┌", "┌", "┘", "─", "│", "┐", "┌", "┌", "┐", "┌", "└", "┐", "─", "│", "┐", "┘", "│"],
["┌", "┌", "─", "─", "┐", "┌", "└", "└", "┘", "┌", "│", "┐", "┌", "┌", "─", ".", "│", ".", "─", "┐", "│", "┐", "└", "┌", "┐", "┘", "─", "└", "┐", "│", "└", "─", "┘", "┘", "┐", "│", "┐", "┐", "┘", "┘", ".", ".", "└", "└", "┐", "┌", "│", "┌", "└", "│", ".", "└", "─", "└", "┐", "┌", "┘", "│", "└", "┘", "└", "┐", "│", "│", ".", "┌", "┐", "┘", "┘", "┘", ".", ".", "└", "│", "┐", "┘", "─", "┌", "┌", "┐", "┌", "│", "│", "│", "┌", "└", "└", "┌", "┌", "┌", "│", ".", "│", "┐", "│", "─", "│", ".", "┌", "─", "┘", "┌", "─", "└", "└", "─", "┌", "┐", "└", "─", "┘", "┌", "─", "┘", "┐", "┐", "┌", "─", "│", "┐", "┘", "─", "┌", ".", "│", "┘", "┘", "└", "┘", "┘", "│", "┌", "│", "│", "└", "│", ".", "│", "─", "┘"],
["┌", "┐", "┐", "│", "└", "┌", "│", "┐", "┌", "┐", "└", "┐", "┐", "└", "│", ".", "┘", ".", "│", "┘", "└", "│", "─", "┐", "│", "│", "└", "└", "┌", "┌", "┘", "┘", "┘", "┐", "┌", "┘", "│", "│", "─", "─", "┐", "┌", "┐", ".", "┌", "└", "─", "│", "┌", "┘", "┐", "┐", "│", "─", "└", "┘", "┌", "┘", "┌", "┐", "┌", "┘", "│", "└", "─", "┘", "│", "┐", "┌", "┌", "┘", "┐", "┌", "─", "┐", "─", "─", "└", "│", "┐", "┌", "─", "─", "│", "┘", ".", "┌", "─", "─", "─", "┘", "─", "┌", "┐", "┘", "─", "─", "┐", "│", ".", "┌", "│", "┘", "─", "┐", "┌", "┐", "┘", ".", "┘", ".", "┌", "└", ".", "┌", "┌", "┌", "┘", "│", "┐", "└", "┌", "─", "┐", "└", "┐", ".", "┘", "│", "┌", "│", "└", "│", "│", "─", "└", "─", "┐", "┐", "│"],
["└", "─", "┘", "┘", "└", "─", "┘", "┘", "┘", "└", "┐", "┘", "└", "─", "└", "─", "┘", "┘", "┘", "┌", "┘", "┘", "└", "┌", "─", "└", "─", ".", "┌", "┐", ".", "│", "└", "└", "└", "─", "─", "┘", "┐", "┘", "─", "└", "┌", "└", "┐", "└", "│", "┘", "┘", "┘", "┌", "─", "┘", "┐", ".", ".", "└", "─", "┘", "└", "┘", "┘", "└", "─", "─", "─", "┘", "─", "└", "┌", "─", "└", "┘", "┘", "└", "┐", ".", "└", "└", "┘", "┘", "┘", "┘", "┘", "└", "┘", ".", "└", "│", "┘", "─", "└", "┌", "└", "┘", "└", "─", "└", "─", "─", "│", "┘", "┘", "─", "└", "└", "┘", "└", "│", "┘", "─", "│", ".", "─", "┘", "│", ".", "└", "│", "┘", "└", "│", "┘", "┘", ".", "┌", "┌", "─", "─", "┐", "└", "─", "┌", "┘", "─", "└", "┘", ".", "┘", "─"]
]).

142
10/input.pl Normal file
View File

@@ -0,0 +1,142 @@
input([
["L", "7", "7", "7", "F", "J", "F", "7", "7", "F", "-", "7", "7", "-", "F", "-", "7", "F", "7", ".", "F", "F", ".", "J", "7", ".", "-", "J", "-", "-", "J", "7", "F", "|", "7", "F", ".", "F", "J", ".", "L", "-", "|", "F", "|", "-", "F", "|", "F", "J", "7", "-", "J", "7", "F", "-", "J", "F", "F", "-", "7", ".", "L", "7", "F", "L", "7", "J", "-", "F", "F", "|", "7", "-", "-", "7", ".", "L", "-", "-", "|", "7", "7", ".", "F", "-", "J", "7", "7", ".", "-", "7", "F", "J", "7", "F", "7", "F", "F", "-", "-", ".", "F", "F", "J", "7", "-", "7", "-", "F", "|", ".", "F", "L", "-", "L", "-", "F", "7", ".", "F", "|", "-", "F", "F", "7", "F", "|", "-", "7", "-", "|", "7", "-", ".", "F", "F", "-", "7", "."],
["L", "-", "-", "7", "7", "-", "F", "J", "L", "|", "7", "L", "7", "7", ".", "F", "J", "-", "F", "-", "7", ".", "|", ".", "F", "J", "J", "J", ".", "F", "F", "F", "|", "F", "F", "-", "7", "7", "|", "-", "|", "F", "J", "-", "F", "J", "|", "L", "F", "J", "|", "-", "L", "-", "J", "L", "L", "F", "|", "L", "7", "7", "|", "F", "7", "L", "7", "-", "|", "J", "L", "-", "J", "7", "L", "L", "F", "7", "|", "F", "L", "L", "-", "-", "7", "J", ".", "-", "F", "-", "|", "-", "L", "-", "7", "J", "F", "7", "J", "7", "F", "J", "-", "F", "-", "7", "7", "|", ".", "F", "L", "J", "F", "J", "7", "L", "J", "L", "|", "7", ".", "L", "7", "L", "L", "7", "F", "J", "F", "J", "|", "L", "J", "L", "F", "F", "J", "J", "|", "7"],
[".", "|", "L", "|", "L", "F", "J", "7", "-", "J", "-", "J", "|", "|", "-", "7", "J", "L", "L", "-", "J", "-", "-", "-", "J", "L", "7", "F", "7", "L", "-", "L", "F", "7", "L", "7", "L", "7", "7", "J", "F", "7", "L", "7", "-", "-", "J", "7", "F", "7", "|", ".", "F", "7", "L", "F", ".", "L", "|", "-", "|", "F", "L", "J", "|", "L", "|", "F", "|", "F", "F", "J", "J", "L", "J", "F", "F", "J", "-", "7", "|", "|", "L", "F", "7", "J", "7", "F", "J", "F", "-", "7", ".", "L", "7", "L", "|", "L", "F", "J", "7", "L", "L", "|", "7", "J", "F", "J", "F", "|", ".", "|", "|", "|", "F", "7", "J", "J", "|", "L", "-", "7", "|", "J", "7", "L", "J", ".", "F", "7", "-", "-", "7", "L", "7", "J", "7", "F", "J", "-"],
["F", "7", "J", "|", ".", "L", "-", "J", "-", "L", "7", "F", "7", "J", "F", "J", ".", "7", "L", "J", "|", "-", "J", ".", ".", ".", "L", "|", "-", "|", "L", "|", "|", "|", "F", "J", "F", "J", ".", ".", "L", "-", "F", "J", "L", "L", "7", "7", "L", "L", "J", "7", "L", "7", "7", "J", "|", "-", "7", "J", "|", "F", "-", "-", "7", "-", "J", "F", "L", "7", "|", "F", "7", "F", "F", "J", "L", "J", "J", "F", "J", "7", "7", "L", "-", "7", "-", "L", "7", "F", ".", "|", "J", ".", "|", "F", "|", ".", "L", "-", "|", "7", ".", ".", "|", "F", "L", "-", "F", "J", "F", "-", "7", "-", "L", "J", "F", "L", "|", "-", "L", "|", "L", "|", "-", "|", "F", "7", "L", "L", "7", "L", "L", ".", "|", "F", "F", "|", "|", "."],
["J", "|", "-", "L", "7", "J", ".", "|", "|", "|", "L", ".", "F", ".", "F", "J", ".", "|", "7", "L", "F", ".", "|", "F", "F", ".", "L", "L", "7", "|", "L", "F", "J", "|", "|", "F", "J", "|", ".", "7", ".", "L", "7", "|", "F", "L", "F", "7", "-", "L", ".", "-", "J", "L", "7", ".", "F", "7", "J", "-", "L", "J", "J", "7", "L", "|", "F", "J", "|", "|", "J", "-", "-", "-", "J", "F", "7", "J", "L", "J", "L", "L", "-", "7", ".", "L", "F", "J", "J", "J", "L", "7", "L", "F", "7", "J", "J", "F", "F", "F", "-", "7", "7", "7", "F", "F", "7", "|", "|", "|", "L", "-", "J", "F", "|", "-", "-", "7", "J", "L", "F", "L", "7", ".", "F", "F", "F", "F", "7", "|", "L", "7", "7", ".", "|", ".", "J", "L", "-", "7"],
["J", "7", "F", "7", "|", ".", "F", "-", "|", "7", "-", "F", "J", "7", "L", "-", "7", "J", "F", ".", ".", "J", ".", "|", "J", "7", "|", "L", "L", "-", "|", "L", "7", "L", "J", "L", "-", "7", "-", "-", "7", "J", "J", "L", "F", "J", "|", "L", "7", "F", "7", ".", "F", "J", "7", "7", "|", "L", "J", "L", "7", "F", "L", "F", "F", "F", "7", "L", "7", "J", "-", "7", "-", "|", "L", "L", "J", ".", "|", "|", "|", ".", "L", "J", "7", "L", "F", ".", "L", "F", "|", "|", "-", "|", "|", "F", "F", "F", "-", "J", "F", "J", "-", "J", "7", "L", "-", ".", "7", "7", "-", "J", "7", "F", "|", "L", "J", "F", "-", "F", "-", "7", "L", "-", "F", "F", "7", "L", "F", "|", "|", ".", "F", "7", "J", ".", ".", "7", ".", "7"],
["L", "F", ".", "L", "|", "-", "J", "7", "L", "J", "-", "7", ".", "F", "|", "J", ".", "F", "L", "7", "-", "L", "F", "7", "F", "7", "L", "-", "J", ".", "7", "7", "L", "-", "7", "F", "-", "J", "7", ".", "F", "F", "7", "F", "|", "F", "F", "7", "L", "-", "|", "7", "7", "F", "J", "-", "J", "F", "F", ".", "|", "7", "F", "F", "7", "|", "|", "-", "|", "7", "L", "J", ".", "-", "F", "L", "-", ".", "L", "-", "F", "J", "7", "7", "|", "7", ".", ".", "L", "F", "7", "|", "7", "|", "|", "F", "F", "J", "F", "-", "J", "L", "|", "F", "J", "L", "L", "F", ".", "F", "7", "|", "F", "J", "L", "7", "F", "J", "L", "L", "L", "-", "L", "-", "|", "|", ".", "F", "J", "|", "|", "7", "|", ".", "F", "F", "-", "J", "7", "|"],
["L", "|", "7", "L", "|", "7", "F", "-", "J", ".", "J", "|", "F", "F", "F", "-", "F", "J", "-", "7", "J", "F", "L", "J", "|", ".", "F", "J", "|", ".", "F", "-", "-", "-", "J", "L", "-", "-", "7", "J", ".", "L", "J", "-", "J", "7", ".", "F", "7", "J", "|", "L", "7", "7", "J", "7", ".", "F", "F", ".", "L", "F", "F", "J", "|", "|", "|", "7", "F", "7", "7", "L", "|", "7", "|", "F", "F", "-", "J", ".", ".", "|", "|", "|", "-", "-", "-", "-", "F", "7", "F", "-", "-", "J", "L", "7", "L", "7", "|", ".", "|", "F", "L", "-", "J", ".", "F", "J", "-", "|", "F", "L", "7", "7", "F", "J", "|", "J", ".", "F", "-", "F", "J", "J", "L", "-", "J", "L", "L", "F", "|", "7", "7", "F", "7", "L", "-", ".", "L", "F"],
["7", "-", "-", "-", "L", "F", "7", "|", ".", "F", "L", "7", "J", "L", "|", "F", "7", "L", "-", "L", "-", "7", "F", "L", "|", "7", "F", "7", ".", "F", "L", "7", "F", "7", "F", "-", "-", "-", "J", ".", "7", "-", "7", ".", ".", "L", "L", "-", "J", "F", "L", "J", "F", "-", "7", "7", "F", "7", "F", "7", "|", "F", "L", "7", "L", "J", "|", "F", "|", "|", "J", "7", "L", "-", "F", "-", "7", "-", "L", ".", "F", "F", "F", "7", ".", ".", "F", "F", "J", "|", "|", "F", "-", "7", "F", "J", "F", "|", "|", ".", "L", "7", ".", "|", "-", "F", "|", ".", "F", "7", "L", "J", "|", "F", "J", "7", "|", "J", ".", "|", ".", "-", "7", "7", "F", "-", "J", "-", "L", "|", "J", "L", "F", "-", "J", "7", "L", "F", ".", "."],
["L", "J", "7", ".", "F", "L", "J", "L", "-", "-", "7", "L", "7", "|", "|", "-", "|", "7", "L", "F", "|", "7", "J", "7", "F", "-", "J", "|", "F", "7", "|", "L", "J", "|", "L", "-", "7", "|", "L", "F", "L", "-", "-", "7", ".", ".", "|", "J", "L", "7", "L", "F", "L", "7", "L", "7", "|", "|", "|", "L", "7", "F", "-", "J", "F", "-", "J", "F", "J", "|", ".", "F", "7", "F", "J", "7", "L", "J", "F", "L", "7", "F", "J", "|", "F", "7", "F", "J", "F", "J", "L", "J", "J", "|", "|", "F", "-", "J", "|", "7", "7", "L", "F", "F", "J", "F", "-", "L", "|", "L", "7", "|", "L", "J", "7", "-", "7", "-", "F", "J", "L", "L", "L", "7", "-", "7", "F", "7", "F", "-", ".", "|", "|", "7", "F", "7", "F", "J", "7", "."],
["L", "L", "F", "-", "L", "F", "-", "7", "|", "|", "J", "F", "L", "-", "L", "L", "F", "7", "7", "7", "F", "-", "-", "F", "L", "7", "F", "J", "|", "L", "-", "7", "F", "|", "F", "7", "L", "7", "-", "J", "J", "7", ".", "L", "-", "F", "7", ".", "F", "F", "7", "-", "|", "L", "7", "|", "|", "|", "|", "F", "J", "L", "-", "7", "|", "F", "7", "|", "F", "J", "F", "7", "|", "|", "|", "F", "J", "F", "7", "7", "F", "L", "7", "|", "|", "|", "L", "7", "|", "L", "|", "F", "7", "|", "|", "|", "F", "7", "|", "F", "7", "-", "J", "J", "7", "J", "7", "7", "|", ".", "L", "-", "7", "J", "|", "7", "L", "F", "J", ".", ".", "F", "L", "-", "7", "|", "7", "|", "|", "F", "-", "7", "-", "7", "-", "L", "J", "J", "-", "7"],
["|", "-", "|", ".", "F", "-", "7", "L", "7", "|", "J", "F", "J", ".", "|", "J", "|", "|", "L", "F", "7", "F", "7", "J", "F", "J", "|", "L", "L", "-", "7", "L", "-", "J", "|", "L", "-", "J", ".", "L", "F", "7", "7", ".", "L", "|", "|", ".", "F", "J", "L", "7", "F", "-", "J", "L", "J", "L", "J", "L", "7", "F", "-", "J", "|", "|", "L", "J", "L", "-", "J", "L", "7", "J", "7", "J", "7", "F", "7", "-", "F", "F", "J", "|", "|", "L", "-", "J", "L", "7", "F", "J", "L", "J", "|", "|", "|", "L", "J", "|", "|", "7", "F", "|", "F", "J", "|", "-", "F", "J", ".", "F", "-", "-", "J", "7", "F", "L", "-", "F", "F", "-", "7", "|", "L", "J", "F", "-", "7", "J", ".", "L", "L", "|", "J", ".", "|", "7", ".", "7"],
["J", "7", "|", "F", "7", "-", "L", ".", "F", "F", "-", ".", ".", "F", "7", "F", "|", "L", "7", "|", "|", "-", "|", "|", "L", "7", "L", "-", "-", "7", "L", "-", "-", "7", "L", "7", "F", "7", "F", "7", "|", "|", "-", "F", "7", "|", "|", "-", "L", "-", "7", "|", "L", "-", "-", "7", "F", "-", "-", "-", "J", "L", "7", "F", "J", "|", "F", "-", "-", "-", "-", "-", "J", "F", "7", "F", "-", "J", "|", "F", "7", "L", "7", "|", "|", "F", "-", "-", "-", "J", "L", "-", "-", "7", "|", "|", "|", "7", "F", "J", "L", "-", "-", "7", ".", "7", "|", "7", "L", ".", "F", "F", "L", "-", "-", "F", "7", ".", "F", "-", "F", "-", "J", "7", "J", "-", "7", "F", "J", "F", "-", "7", "J", "J", "L", "|", "L", "|", "F", "L"],
[".", "-", "J", "L", "J", ".", "|", "7", "|", "|", "J", "F", "F", "|", "|", "F", "J", "F", "J", "|", "|", "7", "|", "-", "F", "J", "F", "-", "-", "J", "F", "-", "-", "J", "F", "J", "|", "|", "|", "|", "|", "|", ".", "|", "L", "J", "L", "7", "7", "F", "J", "L", "7", "F", "-", "J", "L", "-", "-", "7", "F", "-", "J", "L", "-", "J", "L", "-", "-", "-", "-", "7", "J", "|", "|", "L", "7", "F", "J", "|", "L", "-", "J", "L", "J", "L", "7", "F", "7", "J", ".", "F", "7", "|", "L", "J", "|", "F", "J", "F", "-", "-", "-", "J", "F", "F", "|", "7", ".", "F", "F", "F", "7", "F", "-", "J", "J", "F", "J", "7", "|", "L", "F", "-", "7", "-", "|", "J", "J", "7", ".", ".", ".", "F", "F", "J", "7", "J", "F", "L"],
["7", "F", "J", ".", "L", "-", "J", "7", "J", "L", "7", "F", "L", "|", "|", "L", "7", "L", "7", "|", "L", "7", "F", "-", "J", "F", "J", "L", "F", "7", "L", "-", "-", "7", "L", "7", "|", "|", "|", "|", "|", "L", "7", "L", "7", "F", "-", "J", "F", "J", "F", "-", "J", "L", "-", "-", "-", "-", "7", "|", "L", "-", "7", "F", "-", "-", "7", "F", "-", "-", "-", "J", "F", "J", "L", "7", "|", "L", "7", "L", "-", "-", "7", "F", "-", "7", "|", "|", "|", "7", "F", "J", "L", "J", "F", "-", "J", "|", "F", "J", "F", "-", "7", "-", "|", "|", "F", "7", "7", "F", "-", "J", "|", "7", ".", ".", "F", "J", "|", "F", "|", ".", "J", "L", "7", "-", "L", "7", "L", "|", "L", "-", "-", "F", "|", "J", "-", "F", "-", "J"],
["-", "7", "-", "F", "J", "F", "L", ".", "J", "F", "7", "-", "F", "J", "L", "7", "L", "7", "L", "J", "F", "J", "L", "-", "7", "L", "-", "7", "|", "L", "7", "F", "-", "J", "F", "J", "|", "|", "|", "|", "|", "F", "J", "|", "|", "|", ".", "F", "J", "F", "J", "L", "F", "7", "F", "-", "7", "F", "J", "L", "7", "F", "J", "L", "-", "7", "L", "J", "|", "F", "7", "-", "L", "-", "7", "|", "|", "F", "J", "F", "-", "7", "L", "J", "F", "J", "L", "J", "L", "7", "|", "F", "-", "7", "|", "F", "7", "|", "|", "F", "J", "F", "J", "F", "7", "7", "|", "|", "-", "L", "7", "F", "J", "7", "-", "F", "7", "-", "F", "|", "|", "F", "|", "L", "J", "7", "F", "J", ".", "-", "-", "L", "-", "L", "F", ".", "L", "J", "7", "|"],
["|", "|", ".", "F", "7", "J", "|", "F", "L", "J", "|", "|", "L", "-", "7", "|", "L", "L", "-", "7", "L", "7", "F", "7", "|", "F", "-", "J", "|", "F", "J", "L", "-", "7", "|", "F", "J", "|", "|", "L", "J", "|", "J", "F", "J", "|", "F", "J", "F", "J", "F", "7", "|", "L", "J", "F", "J", "L", "-", "7", "L", "J", "F", "-", "-", "J", "F", "7", "F", "J", "L", "7", "F", "-", "J", "|", "|", "L", "7", "L", "7", "L", "7", "F", "J", "F", "7", "F", "7", "|", "L", "J", "F", "J", "L", "J", "|", "|", "L", "J", "F", "J", "F", "J", "L", "7", "|", "|", "J", "F", "J", "|", "F", "7", "7", "|", "L", "-", "7", ".", "L", "7", "J", ".", "L", "F", "7", ".", "L", "J", "F", "J", "F", "7", "|", "J", "J", "-", "L", "7"],
["-", "7", "7", "L", "7", "F", "F", "|", "J", "F", "-", "-", "F", "-", "J", "L", "-", "-", "7", "L", "7", "|", "|", "L", "J", "|", ".", "F", "J", "L", "7", "F", "-", "J", "L", "J", "F", "J", "L", "-", "7", "L", "7", "L", "7", "L", "J", "F", "J", "J", "|", "|", "L", "7", "F", "J", "F", "-", "-", "J", "F", "7", "L", "-", "7", "L", "|", "L", "J", "F", "-", "J", "L", "-", "7", "|", "|", "F", "J", "L", "L", "7", "|", "L", "-", "J", "L", "J", "|", "L", "7", ".", "L", "7", "F", "7", "L", "J", "F", "-", "J", "-", "|", "F", "-", "J", "|", "|", "|", "L", "7", "|", "|", "L", "7", "L", "7", "F", "J", "7", "-", "|", "J", "7", "F", "J", ".", "F", "L", "7", "J", "-", "L", "L", "J", "L", "L", "|", ".", "|"],
["|", "L", "7", "J", "L", "J", "J", "|", ".", "L", "|", "F", "L", "7", "F", "-", "-", "7", "L", "-", "J", "|", "L", "-", "7", "L", "7", "L", "7", "F", "J", "L", "-", "-", "-", "7", "|", "F", "7", "|", "|", "F", "J", "F", "L", "7", "F", "J", "F", "7", "|", "|", "F", "J", "L", "7", "L", "7", "F", "-", "J", "|", "F", "-", "J", "F", "J", "F", "-", "J", "F", "-", "7", "F", "J", "L", "J", "L", "7", "F", "-", "J", "L", "7", "|", "F", "-", "-", "J", "F", "J", "F", "7", "L", "J", "|", "F", "-", "J", "F", "-", "7", "|", "|", "F", "7", "|", "L", "7", "F", "J", "L", "J", "F", "J", "F", "J", "|", "-", "F", "7", "|", "F", "-", "7", "L", "7", "-", "L", "|", "-", ".", "|", "J", "F", "-", "-", "|", "7", "."],
["L", "|", ".", "F", "J", "7", "F", "-", "|", ".", "|", "7", "F", "L", "J", "F", "7", "L", "-", "7", "F", "J", "F", "7", "|", "F", "J", "F", "J", "L", "7", "F", "7", "F", "-", "J", "|", "|", "|", "F", "J", "L", "-", "7", "F", "J", "L", "7", "|", "|", "|", "L", "J", "F", "-", "J", "F", "L", "J", "F", "-", "J", "L", "-", "7", "L", "7", "L", "7", "-", "|", "F", "J", "|", "F", "-", "-", "-", "J", "L", "-", "-", "7", "L", "7", "L", "-", "-", "7", "L", "7", "|", "L", "-", "7", "|", "L", "-", "7", "L", "7", "L", "J", "|", "|", "|", "L", "7", "|", "L", "7", "F", "-", "J", ".", "L", "7", "L", "-", "7", "J", "7", "|", "F", "-", "7", "J", "|", "L", "J", "|", ".", "|", "-", "L", "7", "-", "L", "-", "7"],
["|", "L", "J", "-", ".", "L", "L", "-", "F", "7", "F", "7", "F", "7", "F", "J", "L", "7", "F", "J", "L", "-", "J", "L", "J", "L", "-", "J", "F", "-", "J", "|", "|", "|", "F", "7", "L", "J", "|", "L", "7", "F", "-", "J", "L", "7", "F", "J", "|", "|", "L", "-", "7", "|", "-", "F", "7", "F", "7", "L", "-", "7", "F", "-", "J", "F", "J", "F", "J", "F", "J", "|", "-", "|", "|", "F", "7", "F", "7", "F", "7", "F", "J", "F", "J", "F", "-", "7", "|", "F", "J", "|", "F", "-", "J", "|", "F", "-", "J", "|", "L", "-", "7", "L", "J", "L", "7", "|", "|", "F", "J", "L", "7", "F", "7", "J", "|", "F", "-", "J", "F", "7", "7", "J", ".", "J", "F", "-", "J", "-", "F", "F", "J", "L", "L", "J", "7", "7", "|", "|"],
["|", "-", "L", "F", "-", "-", "L", "7", "|", "L", "J", "|", "|", "|", "L", "-", "7", "|", "L", "7", "F", "-", "-", "-", "-", "7", "F", "-", "J", "F", "7", "|", "|", "L", "J", "L", "-", "7", "L", "7", "|", "L", "7", "J", "-", "|", "|", "F", "J", "L", "7", "F", "J", "L", "7", "|", "|", "|", "L", "-", "-", "J", "|", "F", "7", "|", "F", "J", "F", "J", "F", "J", "F", "J", "|", "|", "|", "|", "|", "|", "|", "|", "F", "J", "7", "L", "7", "L", "J", "L", "-", "J", "L", "7", "F", "J", "L", "-", "-", "7", "F", "-", "J", "F", "7", "F", "J", "|", "|", "|", "F", "-", "J", "|", "L", "7", "|", "L", "-", "-", "J", "L", "7", "|", "7", ".", "|", "7", "|", ".", "7", "L", "J", "7", "L", "J", "|", "L", "F", "J"],
["J", "-", "-", "J", ".", "L", "L", "L", "L", "-", "7", "L", "J", "|", "F", "7", "|", "|", "F", "L", "J", "7", "F", "-", "7", "|", "L", "-", "7", "|", "|", "|", "L", "7", "J", "F", "7", "|", "F", "J", "L", "7", "L", "7", "F", "J", "L", "J", "F", "-", "J", "L", "7", "F", "J", "|", "|", "L", "-", "-", "-", "7", "|", "|", "|", "|", "L", "-", "J", "F", "J", "|", "L", "7", "|", "|", "|", "|", "|", "|", "|", "|", "|", "J", "|", "7", "L", "-", "-", "-", "-", "7", "F", "J", "|", "F", "-", "-", "-", "J", "|", "F", "-", "J", "L", "J", "F", "J", "L", "J", "|", "F", "7", "L", "7", "|", "|", "F", "-", "-", "-", "-", "J", "F", "7", "F", "|", "F", "7", "F", "7", "7", "F", "|", "7", ".", "|", "F", "L", "F"],
["|", "F", "L", ".", "F", "L", "|", "L", "F", "7", "L", "-", "7", "L", "J", "L", "J", "L", "-", "-", "-", "7", "|", "F", "J", "L", "-", "7", "L", "J", "|", "L", "7", "|", "F", "J", "|", "|", "|", "F", "7", "L", "7", "L", "J", "F", "-", "-", "J", "F", "F", "7", "|", "|", "|", "|", "|", "F", "7", "F", "-", "J", "L", "J", "L", "J", "F", "-", "-", "J", "F", "-", "-", "J", "L", "J", "|", "|", "L", "J", "|", "|", "L", "7", "L", "F", "7", "|", "F", "-", "-", "J", "|", "F", "J", "|", "F", "-", "7", "F", "J", "L", "7", ".", "F", "7", "L", "7", "F", "-", "J", "|", "L", "7", "|", "L", "J", "L", "-", "-", "-", "7", "F", "J", "|", "F", "|", "L", "J", "-", "F", "7", "-", "|", "L", "J", "|", "F", "F", "J"],
["|", "|", "J", "F", "7", "J", "F", "-", "J", "L", "-", "-", "J", "F", "7", "F", "7", "F", "7", "F", "7", "L", "J", "L", "-", "7", "F", "J", "F", "-", "J", "F", "J", "|", "|", "F", "J", "|", "|", "|", "|", "-", "|", "F", "-", "J", "F", "7", "F", "7", "|", "|", "|", "|", "F", "J", "|", "|", "|", "L", "-", "-", "-", "7", "F", "7", "L", "-", "7", "F", "L", "-", "-", "-", "-", "7", "|", "L", "7", "F", "J", "L", "7", "|", "F", "J", "L", "7", "L", "-", "-", "7", "L", "J", "F", "J", "L", "7", "|", "L", "7", "F", "J", "F", "J", "L", "7", "|", "L", "-", "7", "|", "F", "J", "L", "7", "F", "-", "-", "-", "-", "J", "L", "7", "L", "7", "F", "7", "L", "F", "J", "|", "F", "|", "7", "-", "J", "L", "|", "J"],
["|", "L", "7", "-", "F", "-", "L", "-", "-", "-", "-", "-", "7", "|", "L", "J", "|", "|", "L", "J", "L", "-", "-", "-", "7", "|", "L", "7", "|", "F", "7", "L", "7", "|", "|", "L", "7", "|", "L", "J", "|", "F", "J", "|", "F", "7", "|", "L", "J", "|", "|", "|", "|", "|", "L", "7", "|", "|", "L", "7", "F", "7", "F", "J", "|", "L", "-", "7", "|", "F", "-", "7", "F", "7", "F", "J", "L", "-", "J", "|", "L", "F", "|", "|", "|", "F", "-", "J", "J", "F", "7", "L", "-", "7", "|", "F", "7", "|", "L", "7", "|", "|", "F", "J", "F", "-", "J", "L", "7", "F", "J", "|", "|", "F", "7", "|", "|", "F", "7", "L", "F", "7", "F", "J", "F", "J", "|", "L", "7", "L", "7", "|", "F", "|", "L", "7", "J", "|", "L", "L"],
["-", ".", "|", "L", "|", "J", "|", ".", "F", "-", "-", "-", "J", "|", "F", "-", "J", "L", "-", "7", "|", "F", "-", "-", "J", "L", "-", "J", "|", "|", "|", "-", "|", "|", "|", "F", "J", "L", "7", "F", "J", "L", "7", "L", "J", "|", "|", "F", "-", "J", "|", "|", "|", "|", "F", "J", "|", "L", "7", "|", "|", "L", "J", "F", "J", "F", "7", "L", "J", "|", "F", "J", "|", "|", "L", "-", "-", "-", "7", "L", "7", "F", "J", "L", "J", "L", "7", "F", "-", "J", "|", "F", "7", "|", "L", "J", "|", "|", "F", "J", "|", "|", "L", "7", "L", "-", "7", "-", "|", "|", "7", "|", "|", "|", "|", "|", "L", "J", "L", "-", "J", "|", "|", "F", "J", "F", "|", "F", "J", "F", "J", "L", "7", "-", "7", ".", "F", "|", "-", "."],
["L", "-", "7", ".", "|", ".", "F", "7", "L", "-", "7", "F", "7", "|", "L", "7", "F", "-", "-", "J", "F", "J", "F", "7", "F", "7", "F", "7", "L", "J", "L", "-", "J", "|", "|", "L", "7", "F", "J", "|", "7", "L", "L", "7", "F", "J", "|", "|", "F", "7", "|", "|", "|", "|", "L", "7", "|", "F", "J", "|", "L", "-", "7", "|", "F", "|", "L", "7", "F", "J", "L", "-", "J", "|", "F", "7", "F", "7", "|", "F", "J", "|", "F", "-", "-", "-", "J", "L", "-", "7", "|", "|", "|", "|", "F", "7", "|", "|", "L", "7", "|", "|", "F", "J", "F", "-", "J", "F", "J", "L", "7", "|", "|", "|", "|", "|", "F", "-", "-", "7", "F", "J", "|", "|", "F", "7", "|", "L", "-", "J", "F", "-", "J", "J", "L", "|", "7", "J", "L", "J"],
["F", "F", ".", "F", "F", "-", "L", "F", "-", "-", "J", "|", "|", "|", "J", "|", "|", "F", "-", "7", "L", "7", "|", "|", "|", "L", "J", "L", "-", "-", "-", "7", "F", "J", "|", "F", "J", "L", "7", "L", "7", "L", "F", "J", "|", "-", "|", "|", "|", "|", "|", "|", "|", "L", "7", "|", "|", "L", "7", "L", "7", "F", "|", "L", "7", "|", "F", "J", "L", "-", "-", "-", "7", "L", "J", "|", "|", "L", "J", "|", "|", "|", "|", "F", "-", "-", "7", "F", "-", "J", "L", "J", "|", "|", "|", "L", "J", "|", "F", "J", "|", "|", "|", "F", "J", "F", "7", "L", "7", "F", "J", "|", "L", "J", "L", "J", "L", "-", "7", "L", "J", "J", "|", "|", "|", "|", "|", "F", "-", "-", "J", "J", "|", "|", "|", "L", "J", ".", "F", "J"],
["F", "L", "-", "7", "J", ".", ".", "L", "-", "7", "F", "J", "L", "J", "|", "L", "J", "L", "7", "L", "7", "|", "|", "|", "|", "F", "-", "-", "-", "-", "-", "J", "L", "7", "|", "|", "F", "7", "L", "7", "L", "7", "L", "7", "|", "F", "J", "|", "|", "|", "|", "|", "|", "F", "J", "|", "|", ".", "L", "7", "|", "F", "J", "F", "J", "|", "|", "F", "7", "F", "F", "7", "L", "-", "7", "|", "L", "-", "7", "L", "7", "|", "L", "J", "F", "-", "J", "L", "-", "-", "-", "7", "L", "J", "L", "7", "F", "J", "L", "7", "|", "|", "|", "L", "7", "|", "|", "F", "J", "L", "7", "|", "F", "-", "-", "-", "-", "7", "L", "-", "7", "F", "J", "|", "|", "|", "|", "|", "F", "-", "7", "|", "L", "7", "J", "J", "|", "F", "L", "J"],
["-", "7", "J", ".", "|", "F", "|", "F", "L", "L", "J", "J", "J", "L", "J", "|", "F", "7", "L", "7", "|", "L", "J", "L", "J", "L", "7", "F", "-", "-", "-", "-", "7", "L", "J", "L", "J", "L", "7", "L", "7", "L", "7", "|", "L", "J", "F", "J", "|", "L", "J", "|", "|", "|", "F", "J", "L", "7", "F", "J", "L", "J", "F", "J", "F", "J", "|", "|", "L", "-", "J", "L", "-", "7", "|", "|", "F", "7", "|", "F", "J", "L", "-", "7", "L", "7", "F", "7", "7", "F", "7", "L", "-", "7", "F", "J", "L", "-", "7", "|", "|", "|", "|", "F", "J", "|", "|", "|", "F", "7", "L", "J", "L", "-", "7", "F", "7", "L", "-", "-", "J", "L", "7", "L", "J", "L", "J", "L", "J", "F", "J", "7", "J", "|", ".", "J", "L", "7", "7", "."],
["L", "|", "-", "-", "L", "7", "|", "7", ".", "L", "|", "-", "F", "J", ".", "F", "J", "|", "F", "J", "L", "-", "7", "7", "F", "7", "L", "J", "F", "-", "-", "-", "J", "F", "-", "-", "-", "-", "J", "-", "|", "F", "J", "|", "F", "7", "L", "7", "L", "7", "F", "J", "|", "|", "|", "F", "-", "J", "L", "-", "-", "7", "L", "7", "|", "F", "J", "L", "-", "-", "7", "F", "-", "J", "|", "L", "J", "|", "|", "L", "7", "F", "-", "J", "F", "J", "|", "|", "F", "J", "|", "F", "-", "J", "|", "F", "7", "F", "J", "L", "J", "|", "|", "L", "7", "|", "|", "|", "|", "L", "-", "-", "-", "-", "J", "|", "|", "-", "F", "7", "L", "F", "J", "F", "7", "F", "7", "F", "-", "J", "7", "|", "L", "F", "J", "L", "-", "L", "L", "7"],
["|", "J", "J", "|", "L", "L", "F", "7", "7", "|", "L", "|", "|", ".", "F", "L", "7", "|", "L", "-", "7", "F", "J", "F", "J", "L", "-", "-", "J", "F", "7", "F", "7", "L", "7", "J", "F", "7", "-", "F", "J", "L", "7", "L", "J", "L", "7", "L", "-", "J", "L", "7", "|", "|", "|", "|", "F", "7", "F", "-", "7", "|", "F", "J", "|", "|", "F", "-", "-", "7", "|", "|", "F", "7", "L", "-", "7", "|", "|", "F", "J", "L", "-", "7", "|", "L", "|", "|", "|", "F", "J", "L", "-", "7", "|", "|", "|", "L", "-", "-", "7", "|", "|", "F", "J", "|", "|", "|", "L", "-", "7", "F", "-", "-", "7", "|", "L", "-", "J", "L", "-", "J", "F", "J", "|", "|", "|", "L", "-", "-", "7", "J", "7", "7", "J", "7", "-", "L", "F", "F"],
[".", "F", "-", "7", "-", "L", "|", "J", "L", "L", "7", "L", "F", "-", "-", "-", "J", "L", "-", "-", "J", "L", "7", "L", "-", "-", "-", "-", "-", "J", "L", "J", "L", "7", "L", "7", "|", "L", "7", "L", "-", "7", "L", "7", "F", "7", "L", "-", "7", "F", "-", "J", "|", "|", "|", "L", "J", "|", "L", "7", "|", "|", "L", "7", "|", "|", "L", "-", "7", "|", "|", "|", "|", "L", "7", "F", "J", "L", "J", "|", "F", "-", "7", "|", "|", "F", "J", "|", "|", "|", "F", "7", "F", "J", "L", "J", "|", "F", "7", "F", "J", "|", "|", "|", "F", "J", "L", "J", "F", "-", "J", "|", "F", "-", "J", "L", "7", "F", "-", "-", "7", "F", "J", "-", "L", "J", "L", "7", "F", "-", "J", "L", "L", "J", "F", "J", "7", "-", "F", "|"],
["7", "|", "F", "L", "7", ".", "|", "-", ".", "L", "F", "-", "L", "-", "-", "-", "-", "-", "-", "-", "7", "F", "J", "F", "7", "F", "-", "-", "-", "-", "-", "-", "-", "J", "F", "J", "|", "F", "J", "F", "7", "|", "F", "J", "|", "|", "F", "7", "|", "|", "F", "7", "|", "|", "|", "F", "-", "J", "F", "|", "|", "L", "7", "|", "|", "|", "F", "7", "|", "|", "|", "|", "L", "7", "|", "|", "F", "-", "-", "J", "L", "7", "|", "|", "|", "L", "7", "|", "|", "|", "|", "|", "L", "-", "-", "7", "|", "|", "|", "L", "7", "|", "|", "|", "L", "7", "F", "7", "L", "-", "7", "|", "L", "-", "7", "|", "|", "L", "-", "7", "|", "L", "-", "-", "-", "7", "F", "J", "L", "-", "7", "-", "J", "|", "F", "F", "L", ".", "-", "|"],
["L", "J", ".", "L", "-", "F", "J", "F", "L", "-", "F", "F", "F", "7", "F", "7", "F", "7", "F", "7", "|", "L", "-", "J", "|", "L", "-", "7", "F", "-", "-", "-", "-", "7", "L", "-", "J", "|", "F", "J", "|", "|", "|", "F", "J", "|", "|", "L", "J", "L", "J", "|", "|", "|", "|", "|", "F", "7", "F", "J", "L", "7", "|", "|", "|", "|", "|", "|", "|", "|", "|", "|", "F", "J", "|", "|", "L", "-", "7", "F", "7", "|", "|", "|", "L", "7", "|", "|", "|", "|", "|", "L", "7", "F", "7", "|", "|", "|", "|", "F", "J", "L", "J", "L", "-", "J", "|", "|", "F", "7", "L", "J", "F", "7", "L", "-", "J", "F", "7", "|", "L", "-", "-", "-", "-", "J", "|", "F", "7", "F", "J", ".", "L", "J", ".", "|", "J", "-", "L", "|"],
["|", "|", "7", "|", "7", "J", "L", "-", "J", "|", "|", "F", "J", "L", "J", "|", "|", "|", "|", "|", "L", "-", "-", "7", "|", "F", "7", "L", "J", "F", "-", "-", "-", "J", "F", "-", "7", "|", "L", "7", "L", "J", "|", "L", "7", "|", "L", "-", "-", "7", "L", "|", "|", "|", "|", "L", "J", "|", "L", "7", "F", "J", "|", "|", "|", "|", "|", "|", "|", "L", "J", "|", "|", "-", "|", "|", "F", "-", "J", "|", "L", "J", "|", "|", ".", "|", "|", "|", "|", "|", "L", "7", "|", "|", "L", "J", "L", "J", "L", "J", "F", "-", "-", "-", "-", "-", "J", "L", "J", "L", "7", "F", "J", "|", "F", "7", "F", "J", "|", "L", "-", "7", "F", "7", "F", "7", "L", "J", "L", "J", "F", "7", "7", "7", ".", "|", "L", "-", "J", "|"],
["-", "L", "J", "-", "7", "-", "J", "|", "L", "L", "-", "L", "7", "F", "7", "L", "J", "L", "J", "|", "F", "7", "F", "J", "L", "J", "|", "F", "7", "L", "-", "-", "-", "7", "|", "F", "J", "L", "7", "L", "7", "F", "J", "F", "J", "L", "7", "F", "7", "|", "F", "J", "|", "|", "L", "-", "7", "|", "F", "J", "|", "F", "J", "L", "J", "|", "|", "|", "|", "F", "-", "J", "L", "7", "|", "|", "|", "F", "7", "L", "-", "7", "|", "|", "F", "J", "|", "L", "J", "L", "7", "|", "|", "L", "-", "-", "-", "7", "F", "-", "J", "F", "7", "F", "-", "-", "-", "-", "7", "F", "J", "L", "7", "|", "|", "|", "L", "7", "|", "F", "-", "J", "|", "|", "|", "|", "F", "-", "-", "-", "J", "L", "7", "-", "7", "L", "7", "J", ".", "F"],
["|", ".", "F", "L", "7", "7", "F", "F", "J", "7", ".", "L", "L", "J", "L", "-", "-", "-", "7", "L", "J", "|", "L", "-", "-", "7", "|", "|", "|", "F", "-", "-", "7", "L", "J", "L", "7", "F", "J", "F", "J", "L", "7", "L", "7", "J", "|", "|", "|", "|", "L", "7", "|", "L", "7", "F", "J", "|", "|", "F", "J", "L", "-", "-", "7", "|", "|", "|", "|", "L", "7", "F", "7", "|", "|", "|", "|", "|", "|", "F", "-", "J", "|", "|", "L", "7", "|", "L", "F", "7", "|", "|", "|", "F", "-", "-", "-", "J", "|", "F", "7", "|", "L", "J", "F", "-", "7", "F", "J", "L", "-", "-", "J", "L", "J", "L", "-", "J", "L", "J", "F", "7", "|", "|", "|", "L", "J", "F", "-", "7", "F", "-", "J", "-", "7", "L", "J", "7", "-", "|"],
["|", ".", "|", "L", "|", "|", "|", "|", "-", "F", "7", "L", "L", "F", "7", "F", "7", "F", "L", "-", "7", "|", "J", "F", "7", "|", "|", "|", "|", "L", "-", "7", "L", "-", "-", "-", "J", "L", "7", "L", "7", ".", "|", "F", "J", "F", "J", "|", "|", "|", "7", "|", "L", "7", "|", "L", "7", "|", "|", "|", "F", "7", "F", "-", "J", "L", "J", "|", "|", "F", "J", "|", "|", "|", "|", "|", "|", "|", "|", "L", "-", "7", "|", "|", "F", "J", "L", "7", "|", "L", "J", "|", "|", "L", "-", "-", "7", "F", "J", "|", "|", "L", "7", "7", "L", "7", "L", "J", "F", "7", "7", "F", "7", "F", "7", "F", "7", "F", "7", "F", "J", "|", "|", "L", "J", "F", "-", "J", "|", "|", "L", "7", "J", "|", "|", "7", "7", "|", ".", "|"],
["L", "L", "J", "J", "F", "|", "|", "|", ".", "L", "F", "F", "-", "J", "L", "J", "L", "-", "-", "-", "J", "L", "-", "J", "L", "J", "|", "|", "|", "F", "7", "L", "-", "-", "-", "-", "-", "7", "L", "7", "|", "F", "J", "|", "7", "|", "F", "J", "|", "|", "F", "J", "F", "J", "|", "F", "J", "|", "|", "|", "|", "|", "L", "7", "F", "-", "7", "|", "|", "L", "7", "|", "L", "J", "|", "|", "|", "|", "L", "7", "F", "J", "L", "J", "L", "7", "F", "J", "|", "F", "7", "|", "L", "7", "F", "7", "|", "|", "F", "J", "L", "-", "J", "F", "7", "L", "-", "7", "|", "L", "7", "|", "|", "|", "|", "|", "L", "J", "|", "|", "F", "J", "|", "F", "-", "J", "F", "-", "7", "L", "-", "J", "-", "F", ".", "F", "|", "L", "-", "|"],
["L", "|", "|", ".", ".", "J", "7", "J", "-", "L", "F", "L", "7", "F", "-", "7", "F", "-", "-", "-", "-", "7", "F", "-", "-", "7", "L", "J", "L", "J", "L", "7", "F", "F", "7", "F", "7", "L", "7", "L", "J", "L", "7", "L", "7", "|", "|", "F", "J", "|", "L", "7", "L", "7", "|", "L", "7", "|", "|", "L", "J", "L", "7", "L", "J", "F", "J", "|", "|", "F", "J", "|", "F", "-", "J", "|", "|", "L", "7", "|", "|", "F", "-", "-", "-", "J", "|", "F", "J", "|", "|", "L", "7", "L", "J", "|", "|", "|", "|", "F", "-", "-", "-", "J", "L", "-", "-", "J", "|", "F", "J", "|", "|", "|", "L", "J", "F", "-", "J", "|", "|", "J", "|", "L", "-", "-", "J", "F", "J", "F", "-", "-", "-", "7", "7", "-", ".", "7", "L", "L"],
["F", "F", "F", "-", "7", "-", "-", "7", "F", "-", "L", "F", "J", "|", "L", "L", "J", "F", "-", "-", "7", "L", "J", "F", "7", "L", "-", "-", "7", "F", "7", "L", "-", "J", "L", "J", "L", "-", "J", "F", "7", "|", "|", "F", "J", "|", "|", "L", "-", "J", "|", "|", "F", "J", "|", "F", "J", "|", "L", "-", "-", "7", "L", "7", "F", "J", ".", "L", "J", "L", "-", "J", "|", "F", "7", "|", "L", "-", "J", "L", "J", "L", "7", "F", "7", "F", "J", "L", "7", "|", "L", "7", "L", "-", "7", "|", "|", "|", "|", "L", "-", "-", "-", "-", "-", "-", "-", "-", "J", "L", "-", "J", "L", "J", "F", "7", "L", "-", "-", "J", "L", "-", "J", "F", "7", "F", "-", "J", "L", "|", "F", "-", "-", "J", "J", "F", "-", "7", "F", "J"],
["F", "L", "L", "7", "F", "-", ".", "L", ".", "|", "F", "J", "F", "J", "-", "L", "F", "J", "F", "7", "L", "-", "-", "J", "L", "-", "-", "-", "J", "|", "L", "-", "-", "-", "-", "-", "-", "-", "-", "J", "L", "7", "|", "L", "7", "|", "L", "-", "7", "F", "-", "J", "L", "7", "|", "L", "7", "|", "F", "7", "F", "J", "F", "J", "L", "-", "-", "-", "7", "F", "-", "-", "J", "|", "|", "L", "-", "-", "7", "F", "7", "7", "|", "|", "|", "L", "7", "F", "J", "L", "7", "L", "7", "F", "J", "|", "|", "L", "J", "F", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "7", "|", "|", "F", "-", "-", "7", "F", "-", "-", "J", "|", "L", "7", "F", "7", "|", "|", "F", "7", "L", "-", "J", "|", "|", "L", "|"],
["L", "|", "L", "7", "J", "L", "F", ".", "F", "-", "L", "7", "|", "-", "F", "7", "L", "7", "|", "L", "7", "F", "7", "F", "-", "7", "F", "-", "7", "|", "F", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "J", "L", "-", "J", "L", "-", "-", "J", "|", "F", "-", "7", "|", "|", "F", "J", "|", "|", "|", "|", "7", "|", "F", "7", "F", "7", "F", "J", "L", "-", "-", "7", "|", "L", "7", "F", "-", "J", "|", "|", "F", "J", "|", "L", "7", "|", "L", "7", "F", "J", "F", "J", "L", "7", "L", "J", "F", "7", "L", "-", "-", "-", "-", "-", "7", "F", "-", "-", "-", "-", "-", "7", "|", "|", "L", "J", "F", "-", "J", "L", "-", "7", "7", "L", "7", "L", "J", "L", "J", "L", "J", "|", "7", "-", "F", "-", "F", ".", "|"],
["F", "|", "-", "|", ".", "-", "J", "F", "L", "L", "L", "L", "J", "7", "|", "|", "F", "J", "|", "F", "L", "J", "L", "J", "F", "J", "L", "7", "L", "J", "L", "-", "-", "-", "-", "7", "F", "7", "F", "-", "7", "F", "7", "F", "-", "7", "F", "-", "7", "|", "L", "7", "|", "|", "|", "|", "F", "J", "|", "L", "J", "F", "J", "|", "|", "|", "L", "J", "F", "-", "-", "-", "J", "L", "7", "|", "L", "-", "-", "J", "|", "L", "-", "J", "L", "|", "|", "|", "|", "|", "|", "L", "-", "7", "|", "F", "-", "J", "L", "-", "-", "-", "7", "F", "7", "L", "J", "F", "-", "7", "F", "7", "|", "|", "L", "-", "7", "L", "-", "-", "-", "7", "L", "-", "7", "|", "F", "-", "-", "7", "F", "7", "L", "7", "-", "F", "-", "L", "-", "|"],
["J", ".", ".", "L", ".", "J", ".", "|", "-", "L", "F", "L", "F", "-", "J", "|", "L", "7", "|", "F", "-", "-", "-", "-", "J", "F", "-", "J", "J", "F", "-", "-", "-", "-", "-", "J", "|", "|", "|", "F", "J", "|", "|", "|", "F", "J", "|", "F", "J", "L", "-", "J", "L", "J", "|", "|", "L", "7", "L", "-", "7", "L", "7", "|", "|", "L", "7", "F", "L", "-", "7", "F", "-", "7", "|", "|", "F", "7", "F", "7", "|", "F", "-", "-", "-", "J", "L", "7", "|", "L", "-", "-", "7", "|", "|", "L", "-", "7", "F", "7", "F", "7", "L", "J", "L", "-", "-", "J", "L", "L", "J", "L", "J", "|", "F", "7", "L", "7", "F", "7", "L", "|", "F", "-", "J", "|", "L", "-", "7", "L", "J", "L", "-", "J", "-", "|", ".", ".", "-", "J"],
["F", "F", ".", "F", "F", ".", "-", "-", "-", "-", "J", "J", "L", "-", "7", "L", "7", "L", "J", "L", "-", "-", "-", "-", "7", "|", "F", "-", "7", "L", "-", "7", "F", "-", "-", "-", "J", "|", "|", "L", "-", "J", "L", "J", "L", "-", "J", "L", "-", "-", "7", "F", "7", "F", "J", "|", "7", "L", "7", "F", "J", ".", "L", "J", "L", "7", "|", "F", "-", "-", "J", "L", "7", "L", "J", "|", "|", "L", "J", "L", "J", "|", "F", "7", "F", "7", "F", "J", "|", "F", "7", "F", "J", "L", "J", "F", "7", "L", "J", "L", "J", "L", "-", "-", "-", "-", "-", "-", "-", "7", "F", "F", "7", "L", "J", "L", "7", "L", "J", "L", "7", "|", "L", "-", "7", "|", "F", "7", "L", "7", "J", "|", "|", "J", "F", "7", "-", "|", ".", "7"],
["-", "J", "-", "-", "L", "|", "F", "J", "J", ".", "|", "L", "L", "7", "L", "7", "|", "F", "7", "F", "7", "F", "-", "7", "L", "J", "L", "7", "L", "7", "F", "J", "|", "F", "-", "-", "-", "J", "L", "7", "F", "-", "7", "F", "7", "F", "7", "F", "-", "7", "L", "J", "|", "L", "-", "J", "F", "-", "J", "L", "-", "7", "F", "-", "-", "J", "|", "L", "7", "F", "7", "F", "J", "F", "-", "J", "L", "-", "-", "-", "7", "|", "|", "|", "|", "L", "J", "F", "J", "|", "L", "J", "F", "-", "-", "J", "|", "-", "F", "-", "-", "-", "-", "-", "7", "F", "7", "F", "-", "J", "F", "J", "L", "7", "F", "7", "L", "-", "-", "-", "J", "|", "F", "-", "J", "L", "J", "|", "F", "J", "|", "L", "|", "J", "-", "|", "7", "L", "J", "J"],
["|", ".", "|", "|", "L", "L", "J", "J", ".", "F", "7", "7", "L", "F", "F", "J", "L", "J", "L", "J", "|", "L", "7", "|", "F", "-", "7", "L", "7", "L", "J", "F", "J", "L", "-", "-", "-", "-", "-", "J", "L", "7", "|", "|", "|", "|", "|", "L", "7", "|", "F", "7", "|", "F", "7", "F", "L", "-", "7", "F", "-", "J", "L", "-", "-", "7", "L", "7", "L", "J", "L", "J", "|", "L", "7", "F", "-", "7", "F", "-", "J", "|", "|", "|", "L", "-", "7", "L", "7", "L", "-", "7", "L", "-", "-", "7", "L", "7", "|", "F", "-", "7", "F", "7", "L", "J", "L", "J", "L", "F", "J", "F", "7", "L", "J", "L", "-", "-", "-", "-", "7", "|", "L", "-", "-", "7", "J", "|", "L", "-", "7", "F", "7", "J", "7", "|", "-", "J", ".", "|"],
["L", "7", "L", "L", "7", "7", "J", ".", "F", "-", "7", "7", "7", "L", "L", "-", "-", "-", "-", "7", "L", "-", "J", "|", "L", "7", "|", "7", "L", "-", "-", "J", "J", "F", "7", "F", "7", "F", "7", "F", "-", "J", "|", "|", "|", "|", "L", "-", "J", "L", "J", "|", "L", "J", "L", "-", "7", "F", "J", "L", "7", "F", "F", "F", "-", "J", "F", "J", "L", "F", "7", "F", "-", "-", "J", "L", "7", "|", "L", "7", "F", "J", "|", "|", "F", "7", "|", "F", "J", "F", "7", "|", "F", "-", "7", "L", "7", "|", "|", "L", "7", "L", "J", "L", "-", "-", "-", "-", "-", "J", "F", "J", "L", "-", "-", "-", "-", "7", "F", "-", "J", "L", "-", "-", "7", "L", "7", "|", "F", "-", "J", "F", "7", "7", "F", "7", "7", "-", "L", "|"],
["L", "7", "|", "L", "L", "-", "7", ".", "L", "7", "L", "-", "7", ".", "F", "F", "-", "7", "|", "L", "-", "-", "7", "|", "F", "J", "L", "7", "F", "7", "F", "7", "F", "J", "L", "J", "L", "J", "|", "|", "F", "7", "L", "J", "|", "L", "-", "-", "-", "-", "7", "L", "-", "-", "-", "-", "J", "L", "-", "7", "L", "7", "F", "J", "F", "7", "|", ".", "F", "J", "L", "J", "F", "-", "7", "F", "J", "|", "F", "J", "L", "7", "|", "L", "J", "|", "|", "L", "-", "J", "L", "J", "L", "7", "|", "F", "J", "L", "J", "F", "J", "F", "7", "F", "7", "F", "7", "F", "7", "F", "J", "F", "7", "F", "-", "-", "7", "|", "L", "-", "7", "F", "7", "F", "L", "-", "J", "L", "J", "F", "-", "J", "|", "-", "F", "J", "F", "-", "J", "L"],
["|", ".", "F", "J", "F", "|", "|", "F", "F", "|", "F", "-", "J", "F", "7", "L", "7", "|", "F", "7", "F", "F", "J", "|", "|", "F", "7", "L", "J", "L", "J", "|", "L", "-", "-", "-", "7", "F", "J", "L", "J", "L", "7", "F", "J", "F", "7", "F", "-", "7", "L", "7", "F", "7", "F", "7", "F", "7", "F", "J", "F", "J", "L", "7", "|", "|", "L", "7", "L", "-", "7", "F", "J", "F", "J", "L", "7", "|", "|", "F", "-", "J", "L", "-", "7", "|", "L", "7", "F", "-", "-", "-", "-", "J", "|", "L", "7", "F", "7", "|", "F", "J", "|", "|", "L", "J", "L", "J", "|", "L", "-", "J", "L", "J", "F", "-", "J", "L", "-", "7", "L", "J", "L", "-", "7", "F", "-", "-", "-", "J", "F", "7", "|", "J", "J", "F", "7", "L", "-", "J"],
["F", "F", "|", "|", "F", "F", "F", "-", "-", "J", "|", "F", "-", "J", "L", "-", "J", "L", "J", "L", "7", "L", "7", "|", "L", "J", "L", "7", "F", "-", "7", "L", "-", "-", "-", "-", "J", "L", "-", "-", "-", "-", "J", "L", "-", "J", "|", "L", "7", "L", "7", "L", "J", "L", "J", "L", "J", "|", "L", "-", "J", "F", "7", "|", "|", "L", "7", "|", "F", "-", "J", "L", "7", "L", "7", "F", "J", "|", "|", "L", "-", "7", "F", "-", "J", "L", "-", "J", "L", "-", "-", "-", "-", "7", "|", "|", "L", "J", "L", "J", "L", "7", "|", "L", "-", "-", "7", "F", "J", "F", "-", "-", "-", "-", "J", "F", "7", "F", "7", "L", "-", "-", "-", "-", "J", "L", "-", "7", "F", "-", "J", "L", "J", "F", "7", "7", "L", "7", "L", "J"],
["|", "-", "F", "-", "7", "|", "L", "-", "-", "7", "|", "L", "-", "-", "-", "-", "-", "-", "-", "7", "L", "7", "|", "|", "L", "F", "-", "J", "|", "J", "L", "-", "-", "-", "-", "-", "-", "-", "-", "-", "7", "F", "-", "-", "-", "7", "L", "7", "L", "7", "L", "7", "F", "7", "F", "-", "7", "L", "-", "-", "-", "J", "|", "L", "J", "F", "|", "|", "L", "7", "F", "-", "J", "F", "J", "L", "7", "L", "J", "7", "F", "J", "|", "F", "-", "-", "-", "7", "F", "-", "-", "7", "J", "|", "|", "F", "7", "F", "7", "F", "7", "|", "L", "-", "-", "-", "J", "L", "7", "L", "-", "7", "F", "-", "-", "J", "L", "J", "L", "7", "L", "F", "7", "J", "F", "7", "F", "J", "L", "-", "-", "-", "7", "-", "J", "L", "-", "7", "7", "J"],
["|", "L", "L", "7", "L", "-", "-", "-", "7", "|", "|", "F", "7", "F", "7", "F", "7", "F", "7", "L", "7", "|", "|", "L", "7", "L", "-", "-", "J", "F", "7", "F", "-", "-", "-", "-", "-", "-", "-", "-", "J", "|", "F", "-", "-", "J", "F", "L", "-", "J", "F", "J", "|", "|", "L", "7", "L", "-", "-", "-", "-", "7", "|", "F", "-", "-", "J", "|", ".", "|", "|", "F", "7", "|", "F", "7", "L", "-", "7", "F", "J", "F", "J", "L", "-", "-", "7", "L", "J", "F", "7", "|", "F", "J", "|", "|", "|", "|", "|", "|", "|", "L", "-", "-", "-", "7", "F", "7", "L", "-", "-", "J", "|", "F", "-", "7", "F", "-", "7", "L", "-", "J", "L", "7", "|", "L", "J", "F", "-", "-", "7", "F", "J", "F", "J", "7", "L", "L", "-", "7"],
["F", "-", "-", "J", "F", "-", "-", "7", "L", "J", "|", "|", "|", "|", "|", "|", "|", "|", "|", ".", "|", "|", "L", "7", "|", "F", "7", "F", "7", "|", "|", "L", "-", "-", "-", "7", "F", "-", "-", "-", "-", "J", "L", "7", "F", "7", "F", "7", "F", "7", "L", "7", "|", "L", "7", "|", "F", "7", "-", "F", "7", "L", "J", "L", "7", "F", "7", "L", "7", "|", "|", "|", "|", "L", "J", "L", "7", "F", "J", "L", "-", "J", "F", "7", "F", "7", "L", "-", "7", "|", "L", "J", "L", "7", "|", "|", "|", "|", "|", "|", "|", "F", "7", "F", "7", "L", "J", "L", "-", "7", "F", "-", "J", "L", "7", "|", "L", "7", "L", "-", "-", "-", "-", "J", "|", "F", "-", "J", "F", "7", "L", "J", ".", "F", "J", "|", "-", "-", "J", "-"],
["|", "F", "-", "7", "|", "J", "L", "L", "-", "7", "|", "|", "|", "|", "|", "|", "L", "J", "L", "-", "J", "L", "-", "J", "L", "J", "L", "J", "L", "J", "L", "7", ".", "F", "-", "J", "|", "F", "-", "-", "-", "-", "-", "J", "|", "|", "|", "L", "J", "|", "|", "L", "J", "F", "L", "J", "|", "L", "-", "J", "L", "7", "F", "7", "|", "|", "L", "7", "|", "|", "L", "J", "L", "7", "F", "7", "|", "|", "-", "L", "F", "7", "|", "|", "|", "|", "F", "-", "J", "|", "F", "-", "7", "|", "|", "|", "L", "J", "L", "J", "L", "J", "L", "J", "|", "F", "-", "-", "-", "J", "|", "F", "-", "-", "J", "L", "-", "J", "F", "F", "7", "|", "F", "7", "|", "L", "-", "-", "J", "|", "F", "-", "7", "7", "-", "J", "L", "-", "|", "."],
["L", "J", "F", "L", "J", "J", ".", "L", "F", "J", "L", "J", "L", "J", "L", "J", "F", "7", "F", "-", "7", "F", "7", "F", "-", "7", "F", "7", "F", "-", "7", "L", "7", "L", "-", "-", "J", "L", "-", "-", "-", "7", "F", "7", "|", "|", "|", "F", "7", "L", "-", "-", "-", "-", "-", "-", "J", "F", "7", "F", "-", "J", "|", "L", "J", "L", "7", "|", "|", "L", "7", "F", "7", "L", "J", "|", "|", "L", "7", "F", "J", "L", "J", "|", "|", "|", "L", "-", "7", "|", "L", "7", "|", "|", "|", "L", "7", "F", "7", "F", "-", "-", "-", "7", "L", "J", "F", "7", "F", "7", "|", "L", "-", "-", "-", "7", "F", "-", "-", "J", "L", "7", "|", "|", "|", "F", "-", "-", "-", "J", "L", "7", "|", "L", "|", ".", "|", "L", "J", "-"],
["|", "L", "|", "-", "F", "7", "F", "7", "L", "-", "7", "F", "7", "F", "-", "7", "|", "|", "|", "7", "|", "|", "|", "|", "F", "J", "|", "|", "L", "7", "L", "7", "L", "-", "-", "-", "7", "F", "7", "F", "7", "L", "J", "L", "J", "|", "|", "|", "L", "-", "-", "-", "-", "-", "-", "7", "F", "J", "|", "L", "-", "7", "L", "7", "F", "7", "|", "|", "L", "7", "|", "|", "|", "F", "7", "|", "|", "F", "J", "L", "-", "-", "7", "L", "J", "L", "-", "-", "J", "L", "-", "J", "L", "J", "L", "-", "J", "|", "L", "J", "F", "-", "-", "J", "F", "-", "J", "L", "J", "L", "J", "F", "7", "F", "7", "L", "J", "F", "-", "-", "-", "J", "|", "L", "J", "L", "7", "F", "7", "F", "-", "J", "L", "-", "7", "-", "|", "J", "J", "."],
["|", "J", "F", "-", "J", "L", "J", "L", "-", "-", "J", "|", "L", "J", "F", "J", "|", "|", "|", "F", "J", "|", "|", "|", "L", "7", "|", "|", "F", "J", "F", "L", "7", "F", "-", "7", "L", "J", "L", "J", "L", "-", "-", "-", "7", "L", "J", "L", "7", "F", "7", "F", "-", "-", "7", "L", "J", "L", "L", "-", "-", "J", "F", "J", "|", "|", "|", "|", "F", "J", "|", "|", "|", "|", "L", "J", "|", "|", "J", ".", "F", "-", "J", "F", "7", "F", "7", "F", "-", "-", "-", "-", "-", "7", "F", "7", "F", "J", "7", "F", "J", "F", "-", "7", "|", "F", "-", "7", "F", "-", "7", "|", "L", "J", "|", "F", "7", "L", "-", "7", "F", "7", "|", "F", "-", "-", "J", "|", "L", "J", "F", "-", "-", "-", "J", "|", "|", "-", "F", "F"],
["|", "|", "L", "7", "F", "-", "7", "F", "-", "7", "F", "J", "F", "-", "J", "F", "J", "L", "J", "L", "-", "J", "|", "|", "F", "|", "|", "|", "|", "F", "-", "-", "J", "L", "7", "L", "-", "7", "F", "-", "7", "F", "7", "7", "L", "-", "-", "7", "L", "J", "L", "J", "F", "7", "L", "-", "-", "-", "-", "-", "-", "7", "|", "F", "J", "|", "|", "|", "L", "7", "L", "J", "|", "|", "J", "L", "L", "J", "F", "-", "J", "F", "-", "J", "|", "|", "L", "J", "L", "F", "-", "-", "-", "J", "|", "|", "|", "F", "7", "L", "7", "|", ".", "L", "J", "|", "L", "L", "J", "F", "J", "L", "7", "L", "L", "J", "L", "-", "-", "J", "|", "L", "J", "L", "-", "7", "J", "|", "F", "-", "J", "F", "-", "-", "-", "7", "J", "7", ".", "|"],
[".", "-", "L", "L", "J", "F", "J", "L", "7", "L", "J", "J", "L", "7", "F", "J", ".", "F", "-", "-", "-", "-", "J", "L", "7", "|", "|", "|", "|", "L", "-", "-", "-", "-", "J", "F", "-", "J", "|", "F", "J", "|", "L", "-", "-", "-", "7", "|", "F", "7", "F", "-", "J", "|", "F", "-", "7", "F", "-", "7", "F", "J", "L", "J", "F", "|", "|", "L", "7", "|", "J", "-", "|", "|", "7", "7", ".", "F", "L", "-", "-", "J", "7", "F", "|", "L", "7", "F", "-", "J", "F", "-", "-", "7", "|", "|", "|", "|", "L", "7", "L", "J", "F", "-", "7", "L", "-", "-", "7", "L", "-", "7", "L", "-", "7", "F", "7", "F", "7", "F", "J", "F", "-", "-", "7", "L", "-", "J", "L", "7", "F", "J", "F", "-", "-", "J", "L", "7", "-", "7"],
["|", ".", "|", "-", "L", "L", "7", "F", "J", "F", "-", "-", "7", "L", "J", "F", "-", "J", "F", "7", "F", "-", "7", "F", "J", "L", "J", "L", "J", "F", "7", "7", "F", "-", "-", "J", "F", "-", "J", "L", "7", "|", "F", "-", "-", "-", "J", "L", "J", "L", "J", "F", "7", "L", "J", "F", "L", "J", "F", "J", "L", "-", "-", "-", "7", "L", "J", "F", "J", "L", "7", "J", "L", "J", "-", "7", "-", "F", "-", "-", "-", "-", "7", "7", "L", "-", "J", "L", "-", "-", "J", "F", "-", "J", "|", "L", "J", "|", "F", "J", "F", "7", "L", "7", "|", "F", "-", "-", "J", "F", "7", "L", "-", "-", "J", "|", "|", "|", "|", "|", "F", "J", "F", "7", "L", "-", "7", "F", "7", "L", "J", "F", "J", "|", "|", "|", "J", "L", "F", "7"],
["F", ".", "J", "7", "F", "L", "L", "J", "F", "L", "-", "7", "|", "F", "-", "J", "F", "7", "|", "|", "|", "F", "J", "|", "F", "7", "F", "7", "F", "J", "L", "7", "L", "-", "-", "-", "J", "F", "-", "7", "L", "J", "L", "7", "J", "F", "7", "F", "7", "F", "-", "J", "L", "7", "F", "F", "-", "7", "L", "-", "-", "-", "-", "7", "|", "|", "F", "L", "-", "7", "L", "7", "J", ".", "L", "-", "F", "L", "-", "-", "-", "7", "L", "-", "7", "|", "F", "-", "-", "-", "-", "J", "F", "-", "J", "F", "7", "|", "|", "F", "J", "L", "-", "J", "L", "J", "F", "-", "7", "|", "L", "-", "-", "-", "-", "J", "L", "J", "L", "J", "L", "-", "J", "L", "-", "7", "|", "|", "|", "F", "7", "L", "-", "-", "-", "7", "7", "-", "F", "J"],
["L", "F", "|", "-", "F", "7", ".", "F", "-", "-", "-", "J", "|", "L", "7", "F", "J", "|", "|", "|", "|", "|", "F", "J", "|", "|", "|", "|", "L", "-", "7", "L", "-", "-", "-", "-", "-", "J", "F", "L", "7", "F", "-", "J", "F", "J", "L", "J", "|", "|", "F", "-", "7", "L", "7", "L", "7", "|", "F", "-", "-", "7", "J", "|", "|", "7", "J", "J", "L", "|", "F", "J", "L", "7", "|", ".", "L", "J", "|", "F", "-", "J", "F", "7", "L", "-", "J", "F", "7", "F", "7", "F", "J", "F", "-", "J", "L", "J", "L", "J", "F", "-", "-", "7", "F", "7", "|", "F", "J", "|", "F", "-", "-", "-", "7", "F", "7", "F", "7", "F", "-", "-", "-", "-", "-", "J", "L", "J", "L", "J", "|", "F", "-", "-", "-", "J", ".", "L", "L", "J"],
[".", "F", "|", "|", "L", "|", ".", "L", "-", "-", "-", "7", "L", "7", "|", "|", "|", "L", "J", "L", "J", "L", "J", "F", "J", "L", "J", "L", "-", "7", "L", "-", "-", "-", "-", "-", "-", "-", "-", "7", "|", "L", "-", "-", "J", "F", "-", "7", "L", "J", "L", "7", "L", "7", "L", "-", "J", "L", "J", "F", "7", "|", "|", "|", "|", "J", "L", "-", "-", "L", "J", "7", "F", "J", "F", ".", "7", "F", "F", "L", "-", "7", "|", "L", "7", "F", "7", "|", "|", "|", "|", "L", "7", "L", "7", "F", "-", "-", "-", "-", "J", "F", "7", "L", "J", "L", "J", "L", "-", "J", "L", "-", "-", "7", "|", "|", "|", "|", "|", "L", "-", "-", "-", "-", "7", "F", "7", "F", "-", "7", "|", "L", "-", "-", "-", "7", "F", "7", "J", "J"],
[".", "L", "-", "-", "-", "-", "F", "-", "J", "-", "F", "L", "7", "|", "L", "J", "F", "7", "F", "-", "-", "-", "-", "J", "F", "7", "F", "-", "7", "L", "-", "-", "7", "F", "-", "-", "-", "-", "-", "J", "L", "-", "-", "-", "-", "J", ".", "L", "-", "7", "F", "J", ".", "L", "7", "F", "-", "7", "F", "J", "L", "J", "-", "L", "J", "|", "|", ".", "L", "|", "J", "|", "J", ".", "L", "L", "J", "F", "-", "F", "-", "J", "|", "L", "|", "|", "|", "|", "|", "|", "|", "F", "J", "7", "L", "J", "F", "7", "F", "-", "-", "J", "L", "-", "-", "-", "-", "7", "F", "-", "-", "7", "F", "J", "|", "|", "L", "J", "L", "7", "F", "7", "F", "-", "J", "|", "|", "|", "F", "J", "L", "-", "7", "F", "7", "|", "F", "L", "|", "J"],
[".", "L", "7", "L", "7", "-", "J", "-", "L", "F", "-", "-", "J", "L", "7", "L", "|", "|", "L", "-", "-", "-", "-", "-", "J", "|", "|", "7", "L", "-", "-", "7", "L", "J", "F", "-", "-", "-", "7", "F", "7", "F", "7", "F", "7", "F", "-", "-", "7", "|", "L", "7", "F", "7", "L", "J", ".", "L", "J", "F", "7", "F", "|", "F", "L", "J", "-", "F", ".", "|", "7", "J", "|", ".", "7", "7", "F", "7", "7", "L", "-", "7", "L", "7", "|", "|", "|", "|", "|", "|", "L", "J", "7", "F", "7", "F", "J", "|", "L", "-", "7", "F", "-", "-", "-", "-", "7", "|", "L", "-", "7", "|", "L", "7", "|", "L", "-", "7", "F", "J", "|", "|", "L", "-", "-", "J", "L", "J", "L", "-", "7", "7", "L", "J", "L", "J", "7", "F", "|", "J"],
["J", "L", "J", "7", "|", "|", "F", "|", "|", "L", "-", "7", "F", "7", "L", "-", "J", "L", "7", "F", "7", "F", "7", "F", "7", "L", "J", "F", "7", "F", "7", "L", "-", "7", "|", "F", "-", "-", "J", "|", "L", "J", "L", "J", "L", "J", "F", "-", "J", "L", "-", "J", "|", "|", "F", "7", "F", "-", "-", "J", "L", "-", "7", "7", "|", "L", "7", "J", "F", "L", "F", "-", "L", "7", "L", "L", "7", "J", "|", "|", "L", "|", "F", "J", "L", "J", "L", "J", "L", "J", "-", "F", "7", "|", "|", "L", "7", "L", "-", "7", "L", "J", "F", "-", "-", "-", "J", "L", "-", "7", "|", "L", "-", "J", "L", "-", "-", "J", "L", "-", "J", "L", "7", "F", "-", "7", "F", "-", "-", "7", "L", "-", "7", "-", "J", "|", "|", "F", "7", "J"],
["L", "|", "L", "-", "7", "J", "F", "F", "F", "7", "-", "L", "J", "|", "F", "7", "F", "7", "L", "J", "L", "J", "L", "J", "L", "-", "7", "|", "L", "J", "L", "-", "7", "L", "J", "L", "-", "-", "-", "J", "F", "7", "F", "-", "-", "-", "J", "F", "7", "J", "F", "7", "|", "L", "J", "|", "|", "F", "-", "-", "7", "F", "J", "L", "7", "J", "L", "-", "7", "F", "|", "|", "L", ".", "-", "F", "J", "-", "|", "L", "F", "L", "J", "F", "|", "J", "|", "F", "7", "7", "F", "J", "|", "|", "L", "-", "J", "F", "-", "J", "F", "7", "L", "-", "-", "-", "-", "-", "7", "|", "L", "-", "-", "-", "-", "-", "7", "|", "-", "F", "-", "7", "|", "L", "7", "|", "|", "F", "7", "L", "7", "F", "J", "|", "|", "|", "-", "J", "|", "7"],
["F", "|", "|", "F", "F", "7", "F", "F", "|", "L", "-", "-", "7", "L", "J", "L", "J", "L", "-", "-", "-", "-", "-", "-", "-", "7", "|", "L", "-", "-", "-", "7", "|", "F", "7", "F", "-", "-", "-", "-", "J", "L", "J", "F", "-", "-", "-", "J", "L", "-", "J", "L", "J", "F", "7", "L", "J", "L", "-", "7", "L", "J", "J", "7", "|", ".", "|", "J", "|", "F", "F", "|", "F", "F", "7", "|", "L", "-", "|", "J", "F", "7", "F", "7", "F", "7", "F", "J", "|", "F", "J", "F", "J", "L", "-", "7", "F", "J", "F", "7", "|", "|", "F", "7", "-", "F", "-", "-", "J", "L", "7", "F", "-", "-", "-", "7", "L", "7", "F", "J", "F", "J", "L", "-", "J", "L", "J", "|", "L", "7", "L", "J", "J", "-", "F", "F", "7", "L", "|", "7"],
["L", "L", "-", "F", "L", "7", "7", "J", "L", "-", "-", "7", "|", "L", "F", "7", "F", "-", "-", "7", "F", "-", "-", "-", "-", "J", "L", "-", "-", "-", "7", "|", "|", "|", "L", "J", "F", "7", "J", "F", "-", "-", "-", "J", "F", "-", "-", "7", "F", "-", "7", "F", "7", "|", "L", "7", "F", "7", "F", "J", "F", "7", "J", "F", "F", "-", "L", "F", "F", "-", "7", "J", "-", "J", "L", ".", "|", "J", "L", "-", "|", "L", "J", "L", "J", "|", "L", "7", "|", "L", "7", "|", "F", "-", "-", "J", "L", "-", "J", "L", "J", "L", "J", "L", "7", "L", "-", "-", "-", "7", "|", "L", "-", "7", "7", "L", "7", "|", "L", "7", "|", "J", "F", "7", "|", "F", "-", "J", "F", "J", "-", "L", "L", "7", "|", "-", "-", "7", "|", "J"],
["|", "7", ".", "-", "7", ".", "|", "7", "F", "-", "-", "J", "L", "7", "|", "L", "J", "F", "7", "L", "J", "F", "7", "F", "-", "7", "F", "7", "F", "7", "L", "J", "|", "L", "-", "-", "J", "L", "-", "J", "F", "-", "-", "7", "L", "-", "7", "|", "|", "F", "J", "|", "|", "|", "F", "J", "|", "|", "L", "-", "J", "L", "-", "7", "-", "-", "F", "F", "L", "7", "|", ".", "|", "|", ".", "F", "-", ".", "L", "F", "L", "-", "-", "7", "F", "J", "F", "J", "L", "-", "J", "|", "L", "-", "7", "F", "7", "F", "7", "F", "-", "7", "F", "7", "L", "-", "-", "-", "7", "|", "L", "7", "F", "J", "F", "7", "L", "J", "F", "J", "L", "-", "J", "L", "7", "|", "F", "-", "J", "F", "7", "J", "|", "F", "J", ".", "|", "-", "-", "7"],
["F", "7", "L", "-", "|", "-", "L", "L", "|", "F", "-", "-", "7", "|", "L", "7", "F", "J", "S", "7", "F", "J", "L", "J", "J", "|", "|", "|", "|", "L", "-", "7", "L", "-", "-", "-", "7", "F", "-", "7", "|", "F", "7", "L", "-", "-", "J", "L", "J", "L", "-", "J", "L", "J", "|", "F", "J", "|", "F", "-", "-", "-", "-", "J", "F", "F", "-", "-", "7", "|", "|", "7", "J", ".", "7", "L", "|", "-", "F", "|", "-", "L", "F", "J", "|", "7", "L", "-", "-", "-", "7", "L", "7", ".", "L", "J", "L", "J", "L", "J", "F", "|", "|", "|", "F", "-", "-", "7", "L", "J", "F", "J", "L", "7", "|", "|", "F", "7", "|", "F", "-", "-", "-", "7", "L", "J", "L", "-", "-", "J", "|", "L", "J", "J", ".", ".", "L", "7", "7", "J"],
["7", "7", "L", "F", "-", "J", "F", "F", "L", "J", "F", "-", "J", "L", "-", "J", "|", "F", "-", "J", "|", "F", "-", "-", "-", "J", "|", "|", "|", "F", "-", "J", "F", "7", "F", "7", "L", "J", "F", "|", "L", "J", "L", "-", "-", "7", "F", "7", "F", "7", "F", "-", "-", "7", "L", "J", "F", "J", "L", "-", "-", "7", "F", "7", "7", "|", "F", "7", "L", "J", "L", "7", "L", "-", "-", "F", "7", ".", "-", "F", "7", "7", "L", "7", "|", "F", "7", "F", "7", "7", "L", "7", "L", "-", "7", "F", "7", "F", "-", "-", "7", "|", "|", "L", "J", "F", "7", "L", "-", "7", "L", "-", "-", "J", "|", "|", "|", "L", "J", "L", "-", "-", "7", "L", "7", "F", "7", "F", "-", "7", "L", "7", "|", "7", "-", "|", "7", "L", "7", "."],
["F", "F", "J", "|", "L", ".", "F", "J", "|", "F", "|", "F", "-", "7", "F", "-", "J", "L", "-", "7", "|", "L", "-", "-", "-", "-", "J", "L", "J", "L", "-", "-", "J", "L", "J", "L", "-", "-", "7", "L", "-", "-", "7", "F", "7", "L", "J", "L", "J", "L", "J", "F", "-", "J", "F", "7", "L", "-", "-", "-", "7", "L", "J", "L", "7", "L", "J", "L", "7", "F", "-", "J", "-", "|", "-", "J", "J", "7", ".", "|", "|", "-", "|", "|", "|", "|", "|", "|", "|", "F", "7", "L", "-", "7", "|", "|", "|", "L", "-", "7", "|", "L", "J", "F", "-", "J", "L", "-", "-", "J", "F", "7", "F", "-", "J", "L", "J", "F", "7", "F", "-", "-", "J", "F", "L", "J", "|", "L", "7", "L", "-", "J", "7", "F", "7", "|", "J", "F", "L", "-"],
["L", "J", "F", "J", "-", "L", "L", "7", "F", "L", "L", "J", ".", "|", "|", "F", "-", "-", "7", "|", "|", "F", "-", "-", "-", "-", "-", "7", "F", "7", "F", "7", "F", "-", "7", "F", "-", "7", "L", "-", "-", "7", "L", "J", "L", "-", "-", "7", "F", "-", "-", "J", "F", "7", "|", "L", "-", "-", "-", "7", "L", "7", "F", "-", "J", "F", "-", "-", "J", "L", "7", "J", "J", "|", "|", "|", "L", "F", "-", "|", "L", "-", "-", "J", "L", "J", "L", "J", "L", "J", "L", "-", "-", "J", "L", "J", "L", "7", "F", "J", "L", "7", "-", "L", "-", "-", "-", "-", "-", "-", "J", "L", "J", "F", "-", "-", "-", "J", "|", "|", "F", "-", "-", "7", "F", "7", "L", "7", "L", "7", "F", "-", "7", "J", "7", "J", "7", "-", "L", "J"],
["|", "|", "L", "J", ".", "|", "L", "7", ".", "|", "7", "F", "-", "|", "|", "|", "F", "7", "L", "J", "|", "L", "-", "-", "-", "-", "7", "|", "|", "|", "|", "|", "L", "7", "|", "L", "7", "L", "7", "F", "7", "|", "7", "F", "7", "F", "7", "L", "J", "F", "7", "-", "|", "L", "J", "F", "7", "F", "-", "J", "L", "L", "J", "J", "7", "L", "-", "-", "7", "F", "J", ".", "F", "-", "7", "J", "-", "L", "F", "L", "-", "-", "-", "7", "F", "7", "F", "-", "-", "-", "-", "7", "F", "-", "-", "-", "7", "|", "L", "-", "7", "|", "F", "7", "F", "-", "-", "-", "7", "F", "-", "-", "-", "J", "F", "-", "-", "7", "L", "J", "|", "F", "-", "J", "|", "|", "F", "L", "7", "L", "J", "F", "J", ".", "|", ".", "-", "-", "L", "F"],
["L", "L", "7", ".", "F", "|", ".", "|", "F", "F", "L", "J", "J", "L", "J", "L", "J", "L", "-", "-", "J", "F", "F", "-", "-", "-", "J", "L", "J", "L", "J", "L", "-", "J", "L", "-", "J", "L", "|", "|", "|", "L", "-", "J", "L", "J", "L", "-", "7", "|", "L", "7", "|", "F", "-", "J", "L", "J", "F", "-", "7", "F", "7", "F", "7", "F", "7", "F", "J", "L", "-", "-", "J", "F", "J", "J", ".", "|", ".", "F", "-", "-", "-", "J", "|", "|", "|", "F", "-", "-", "-", "J", "|", "F", "-", "-", "J", "L", "-", "-", "J", "L", "J", "|", "L", "-", "-", "7", "L", "J", "-", "F", "7", "|", "|", "F", "7", "L", "-", "-", "J", "L", "-", "-", "J", "L", "-", "7", "|", "F", "-", "J", "L", "F", "F", "-", "L", "-", "7", "J"],
["F", "J", "7", ".", "|", "|", "-", "F", "J", "|", "|", "7", ".", "L", "F", "-", "-", "-", "7", "-", "F", "7", "L", "7", "F", "7", "F", "7", "F", "-", "7", "F", "7", "F", "-", "-", "-", "7", "L", "J", "L", "-", "-", "7", "F", "-", "-", "-", "J", "L", "7", "|", "|", "L", "7", "F", "7", "F", "J", "F", "J", "|", "L", "J", "|", "|", "|", "|", "F", "7", "F", "7", "F", "J", "L", "-", "7", "7", "-", "L", "7", "F", "7", "F", "J", "L", "J", "L", "-", "7", "F", "7", "|", "L", "-", "-", "-", "-", "7", "F", "-", "-", "7", "L", "-", "-", "-", "J", "J", "F", "-", "J", "L", "-", "J", "|", "L", "7", "F", "-", "7", "F", "7", "F", "-", "-", "-", "J", "L", "J", "|", "|", ".", "L", "|", ".", "|", ".", "|", "7"],
["F", "L", "F", "L", "-", "7", "7", ".", "|", "F", "F", "J", ".", "|", "L", "7", "F", "7", "L", "7", "|", "|", "F", "J", "|", "L", "J", "L", "J", "J", "L", "J", "|", "L", "7", "F", "-", "J", "F", "7", "|", "F", "7", "|", "|", "F", "-", "-", "7", "F", "J", "|", "|", "F", "J", "|", "|", "|", "F", "J", "7", "L", "-", "7", "|", "|", "L", "J", "|", "|", "|", "L", "J", "J", "|", "L", ".", "|", "L", "L", "L", "J", "L", "J", "F", "-", "-", "-", "-", "J", "|", "|", "|", "F", "-", "7", "F", "7", "|", "|", "F", "7", "L", "-", "-", "-", "-", "7", "F", "J", "F", "7", "F", "7", "F", "J", "J", "L", "J", "L", "|", "|", "|", "L", "-", "-", "7", "F", "7", "L", "F", "-", "7", "J", "J", "-", "7", "F", "-", "7"],
["J", ".", "J", "J", ".", "|", "7", "F", "7", "L", "J", ".", "L", "F", "7", "L", "J", "L", "7", "|", "|", "|", "L", "-", "J", "J", "F", "-", "-", "-", "-", "7", "L", "-", "J", "L", "-", "7", "|", "|", "F", "J", "|", "L", "J", "|", "F", "-", "J", "L", "7", "L", "J", "L", "7", "|", "L", "J", "L", "7", "F", "7", "F", "J", "|", "|", "F", "-", "J", "L", "J", "F", "7", "|", "|", "J", "F", "|", ".", "F", "F", "-", "-", "7", "L", "-", "7", "F", "-", "7", "|", "L", "J", "L", "7", "L", "J", "L", "J", "|", "|", "L", "7", "F", "-", "-", "-", "J", "|", "F", "J", "L", "J", "|", "|", "F", "7", "J", "F", "7", "L", "J", "|", "F", "-", "-", "J", "|", "L", "-", "7", "J", "J", "J", ".", ".", "|", "L", "J", "|"],
["L", "F", "|", "J", "|", ".", "F", "L", "7", "7", "L", "|", "|", "|", "|", "F", "7", "F", "J", "L", "J", "|", "F", "7", "F", "-", "J", "F", "7", "F", "7", "L", "-", "-", "-", "-", "-", "J", "|", "|", "L", "7", "L", "7", "L", "|", "|", "F", "-", "-", "J", "F", "7", "F", "J", "|", "F", "7", "F", "J", "|", "|", "L", "7", "|", "|", "|", "F", "7", "J", "F", "J", "L", "7", "F", "7", "F", "F", "7", "L", "L", "-", "7", "|", "F", "7", "L", "J", "|", "L", "J", "F", "F", "7", "L", "-", "-", "-", "7", "|", "L", "7", "L", "J", "F", "7", "F", "-", "J", "L", "-", "-", "7", "L", "J", "|", "L", "-", "J", "L", "-", "7", "L", "J", "F", "-", "7", "|", "F", "-", "J", ".", "F", "7", "7", "-", "J", "7", ".", "|"],
[".", "L", "J", "-", "L", "-", "7", "7", "F", "F", "-", "-", "-", "J", "|", "|", "|", "L", "-", "-", "7", "|", "|", "|", "|", "F", "-", "J", "L", "J", "L", "-", "-", "-", "-", "-", "7", "F", "J", "|", "F", "J", "F", "J", "F", "J", "L", "J", "F", "7", "F", "J", "L", "J", "F", "|", "|", "L", "J", "L", "|", "|", "|", "|", "L", "J", "L", "J", "|", "F", "J", "F", "-", "J", "|", "L", "7", "|", "|", "F", "-", "7", "|", "L", "J", "L", "7", "F", "7", "F", "-", "-", "J", "L", "-", "-", "-", "7", "L", "J", "|", "L", "-", "-", "J", "L", "J", "F", "-", "-", "-", "-", "J", "F", "7", "|", "F", "-", "-", "-", "-", "J", "J", "F", "J", "F", "J", "|", "|", "F", "7", "F", "7", "|", "F", "7", "L", "L", "F", "J"],
["F", "|", "|", "F", "|", "-", "F", "-", "L", "L", "-", "-", "-", "7", "L", "J", "L", "-", "-", "7", "|", "|", "|", "|", "L", "J", "F", "-", "7", "F", "-", "-", "-", "-", "-", "-", "J", "|", "F", "J", "L", "7", "|", "J", "L", "7", "F", "-", "J", "L", "J", "F", "-", "-", "-", "J", "L", "-", "-", "7", "|", "L", "7", "L", "-", "7", "F", "-", "J", "|", "F", "J", "-", "F", "J", "F", "J", "|", "|", "L", "7", "|", "L", "7", "F", "-", "J", "|", "|", "L", "-", "-", "7", "F", "7", "F", "7", "L", "-", "-", "-", "-", "-", "-", "-", "-", "-", "J", "F", "-", "7", "F", "7", "|", "|", "|", "|", "F", "-", "-", "7", "F", "7", "L", "7", "L", "7", "|", "L", "J", "L", "J", "L", "-", "-", "7", ".", "|", "L", "J"],
["F", "|", "7", "7", "|", "-", "|", "L", "J", "F", "7", "F", "7", "L", "-", "-", "-", "-", "7", "|", "|", "|", "|", "L", "7", "J", "L", "7", "|", "L", "-", "7", "F", "-", "-", "-", "-", "J", "L", "-", "-", "J", "L", "7", "F", "J", "L", "7", "F", "7", "F", "L", "-", "7", "F", "-", "-", "-", "-", "J", "L", "7", "|", "F", "-", "J", "L", "7", "-", "|", "L", "-", "7", "|", "F", "J", "F", "J", "L", "-", "J", "|", "F", "J", "L", "-", "7", "|", "|", "F", "7", "|", "L", "J", "L", "J", "L", "-", "-", "-", "-", "-", "-", "-", "-", "7", "F", "7", "L", "7", "|", "|", "L", "J", "L", "J", "L", "J", "F", "-", "J", "|", "L", "-", "J", "F", "J", "|", "F", "-", "-", "7", "F", "7", "F", "J", ".", "L", "7", "|"],
["F", "J", "|", "L", ".", "F", "-", "7", "-", "|", "L", "J", "|", "F", "-", "-", "-", "7", "|", "L", "J", "|", "L", "7", "|", "F", "7", "|", "L", "-", "7", "L", "J", "F", "-", "-", "-", "-", "7", "F", "7", "F", "7", "L", "J", "F", "-", "J", "|", "|", "F", "7", "F", "|", "L", "-", "-", "7", "7", "F", "7", "|", "|", "L", "7", "F", "7", "L", "-", "J", "F", "-", "J", "|", "L", "7", "|", "F", "-", "-", "7", "L", "J", "F", "-", "-", "J", "|", "|", "|", "L", "-", "7", "F", "7", "F", "7", "F", "7", "-", "F", "7", "F", "-", "-", "J", "|", "L", "-", "J", "L", "J", "F", "-", "7", "F", "-", "-", "J", "F", "7", "|", "F", "-", "7", "L", "-", "J", "L", "-", "7", "L", "J", "|", "|", "J", "|", ".", "L", "."],
["L", "-", "J", "-", "F", "7", ".", "J", ".", "L", "-", "7", "|", "L", "-", "-", "7", "|", "L", "-", "7", "L", "7", "|", "|", "|", "|", "L", "-", "7", "|", "F", "7", "L", "-", "-", "-", "7", "L", "J", "|", "|", "|", "F", "7", "L", "7", "F", "J", "L", "J", "L", "-", "J", "F", "-", "7", "L", "7", "|", "L", "J", "L", "7", "L", "J", "|", "F", "7", "F", "J", "F", "7", "|", "F", "J", "L", "J", "F", "7", "L", "-", "7", "|", "F", "7", "-", "|", "|", "|", "F", "7", "L", "J", "L", "J", "L", "J", "|", "F", "J", "|", "L", "-", "-", "-", "J", "F", "7", "F", "7", "F", "J", "J", "|", "L", "-", "-", "-", "J", "L", "J", "L", "7", "L", "-", "7", "F", "-", "7", "L", "-", "7", "L", "J", "-", "7", "-", "|", "7"],
["L", "7", "7", "F", "F", "L", "7", "L", "F", "-", "-", "J", "L", "-", "7", "7", "|", "L", "7", "J", "L", "7", "L", "J", "L", "J", "|", "F", "7", "|", "|", "|", "|", "F", "-", "-", "7", "L", "-", "7", "L", "J", "L", "J", "L", "7", "L", "J", "F", "-", "-", "-", "-", "7", "L", "7", "L", "-", "J", "L", "-", "-", "7", "L", "7", "F", "J", "|", "|", "|", "7", "|", "|", "|", "|", "L", "F", "-", "J", "|", "7", "F", "J", "|", "|", "|", "F", "J", "|", "L", "J", "L", "-", "-", "-", "-", "-", "7", "|", "|", "F", "J", "J", "F", "7", "F", "-", "J", "L", "J", "|", "L", "-", "7", "|", "F", "-", "7", "F", "-", "-", "-", "-", "J", "F", "7", "L", "J", "7", "|", "F", "-", "J", "7", "J", "F", "L", "7", "|", "|"],
[".", "|", "F", "F", "7", "J", "7", "L", "L", "-", "-", "7", "F", "7", "L", "7", "L", "7", "L", "7", "7", "L", "7", "F", "-", "7", "L", "J", "|", "|", "L", "J", "|", "L", "-", "7", "|", "F", "7", "L", "7", "F", "7", "F", "F", "|", "F", "7", "L", "-", "-", "-", "7", "|", "F", "J", "L", "F", "7", "L", "F", "7", "L", "7", "|", "L", "7", "|", "L", "J", "F", "J", "|", "|", "L", "7", "L", "-", "7", "L", "7", "L", "7", "|", "|", "|", "L", "7", "L", "7", "F", "-", "7", "F", "-", "-", "-", "J", "L", "J", "L", "-", "7", "|", "|", "L", "-", "-", "-", "7", "L", "-", "-", "J", "L", "J", ".", "|", "L", "-", "-", "-", "-", "-", "J", "L", "7", "F", "F", "J", "L", "-", "-", "7", "-", "J", "-", "L", "-", "7"],
["|", "-", "F", "J", "|", "|", "F", "7", ".", "F", "7", "L", "J", "L", "7", "L", "7", "|", "F", "J", "F", "7", "L", "J", "F", "J", "F", "7", "|", "L", "-", "7", "|", "F", "-", "J", "|", "|", "L", "7", "L", "J", "L", "7", "F", "J", "|", "L", "7", "F", "7", "F", "J", "|", "|", "F", "7", "|", "L", "7", "|", "L", "7", "|", "|", "-", "|", "L", "7", "7", "L", "7", "L", "J", "F", "J", "F", "-", "J", "F", "J", "F", "J", "L", "J", "|", "F", "J", "F", "J", "L", "7", "|", "L", "-", "-", "-", "7", "F", "-", "-", "7", "L", "J", "L", "-", "-", "-", "-", "J", "F", "-", "-", "-", "7", "F", "-", "J", "F", "7", "F", "7", "F", "-", "-", "7", "L", "7", "|", "F", "7", "F", "-", "J", "J", "-", "7", "L", "-", "J"],
["L", "L", "L", "7", "L", "-", "J", "|", "F", "J", "L", "-", "-", "7", "L", "7", "L", "J", "L", "-", "J", "L", "-", "-", "J", "F", "J", "|", "L", "-", "-", "J", "L", "J", "F", "7", "L", "J", "F", "L", "-", "-", "-", "J", "L", "-", "J", "J", "L", "J", "|", "L", "7", "|", "|", "|", "|", "L", "7", "L", "J", "F", "J", "|", "L", "-", "J", "F", "J", "F", "7", "L", "7", "F", "J", "J", "L", "-", "7", "|", "F", "J", "F", "-", "-", "J", "L", "7", "|", "F", "F", "J", "|", "F", "-", "-", "-", "J", "|", "F", "-", "J", "F", "7", "F", "-", "-", "7", "F", "-", "J", "F", "-", "-", "J", "|", "F", "7", "|", "|", "|", "|", "L", "-", "7", "L", "-", "J", "L", "J", "|", "L", "-", "7", "F", "-", "J", "F", "J", "|"],
["J", ".", "L", "L", "-", "-", "7", "|", "L", "-", "7", "F", "7", "L", "7", "L", "7", "F", "-", "-", "-", "-", "7", "F", "-", "J", "7", "L", "-", "-", "7", "F", "7", "F", "J", "L", "-", "-", "-", "-", "7", "J", "F", "7", "F", "-", "-", "-", "-", "7", "L", "-", "J", "L", "J", "|", "|", "|", "L", "-", "7", "L", "7", "L", "-", "7", "F", "J", "F", "J", "|", "F", "J", "L", "7", "F", "-", "-", "J", "|", "L", "7", "|", "F", "7", "F", "F", "J", "L", "7", "L", "7", "|", "L", "-", "-", "-", "-", "J", "L", "7", "F", "J", "L", "J", "F", "7", "L", "J", "F", "-", "J", "J", "F", "7", "L", "J", "L", "J", "L", "J", "L", "-", "7", "L", "-", "-", "-", "7", "L", "|", "F", "-", "J", "J", "F", "7", ".", "F", "J"],
["|", "7", "|", "L", "F", "-", "J", "L", "-", "7", "|", "|", "L", "7", "L", "-", "J", "|", "F", "-", "-", "-", "J", "|", "F", "-", "-", "-", "-", "-", "J", "|", "|", "|", "F", "-", "-", "-", "-", "-", "J", "F", "J", "L", "J", "F", "-", "-", "-", "J", "F", "-", "7", "F", "7", "|", "|", "F", "-", "7", "L", "7", "|", "F", "-", "J", "L", "7", "L", "7", "L", "J", "F", "-", "J", "L", "-", "-", "7", "L", "-", "J", "|", "|", "L", "7", "L", "-", "7", "|", "F", "J", "L", "7", "F", "7", "F", "7", "F", "-", "J", "|", "7", "F", "7", "|", "L", "-", "-", "J", "F", "-", "7", "|", "L", "-", "-", "-", "-", "-", "-", "-", "7", "|", "F", "-", "-", "7", "|", "7", "L", "J", ".", "|", "L", "L", "F", "7", "J", "7"],
["|", "-", "L", "J", "L", "7", "F", "-", "-", "J", "L", "J", "|", "L", "-", "-", "-", "J", "L", "7", "F", "7", "F", "J", "|", "F", "-", "7", "F", "-", "7", "|", "L", "J", "L", "7", "F", "7", "-", "F", "-", "J", "F", "-", "-", "J", "F", "-", "-", "7", "L", "7", "|", "|", "|", "|", "|", "|", "F", "J", "F", "J", "|", "L", "-", "7", "F", "J", "F", "J", "F", "7", "|", "F", "7", "F", "7", "-", "L", "-", "7", "F", "J", "L", "7", "|", "F", "7", "|", "|", "|", "F", "7", "L", "J", "L", "J", "|", "L", "-", "7", "|", "F", "J", "L", "J", "F", "7", "F", "-", "J", "F", "J", "|", "F", "-", "-", "-", "-", "-", "-", "-", "J", "|", "L", "-", "7", "L", "J", "J", "F", "L", "-", "7", ".", "|", "J", "F", "-", "-"],
["7", "|", "L", "F", "-", "J", "L", "-", "-", "7", "F", "7", "F", "-", "-", "-", "-", "-", "7", "|", "|", "|", "L", "7", "L", "J", "F", "L", "J", "L", "L", "J", "F", "-", "7", "L", "J", "L", "7", "|", "F", "-", "J", "-", "F", "7", "L", "7", "F", "J", "F", "J", "L", "J", "|", "|", "|", "|", "L", "7", "L", "7", "L", "-", "-", "J", "L", "7", "|", "F", "J", "L", "J", "|", "|", "|", "|", "F", "7", "F", "J", "L", "7", "F", "J", "L", "J", "L", "J", "|", "L", "J", "L", "-", "-", "7", "F", "J", "F", "7", "L", "J", "L", "7", "F", "7", "|", "|", "|", "F", "-", "J", "F", "J", "L", "7", "F", "-", "-", "-", "7", "F", "7", "L", "-", "7", "L", "7", "L", "J", "7", "7", "L", "|", "F", "|", "F", "J", "J", "|"],
["L", "7", ".", "L", "-", "7", "F", "-", "-", "J", "|", "|", "L", "-", "-", "-", "-", "7", "|", "L", "J", "L", "-", "J", "F", "-", "-", "-", "-", "7", "F", "7", "L", "7", "L", "-", "-", "7", "L", "J", "L", "-", "-", "-", "J", "|", "F", "J", "L", "7", "L", "-", "-", "7", "|", "|", "|", "L", "7", "L", "7", "|", "F", "7", "F", "-", "7", "|", "|", "L", "-", "7", "F", "J", "|", "|", "|", "|", "|", "L", "7", "F", "J", "L", "7", "F", "7", "F", "7", "L", "7", "F", "7", "L", "F", "J", "L", "-", "J", "L", "-", "-", "7", "L", "J", "L", "J", "|", "|", "L", "-", "-", "J", "F", "7", "L", "J", "F", "-", "-", "J", "|", "L", "-", "7", "L", "-", "J", ".", "|", "L", "J", "-", "L", "-", "J", "F", "J", "F", "|"],
["F", "F", "F", "-", "-", "J", "L", "-", "-", "7", "|", "|", "F", "7", "F", "7", "F", "J", "L", "-", "-", "7", "F", "7", "L", "-", "-", "-", "7", "L", "J", "L", "7", "L", "-", "-", "7", "L", "7", "F", "7", "F", "-", "7", "F", "J", "|", "F", "-", "J", "F", "7", "F", "J", "L", "J", "L", "7", "|", "F", "J", "L", "J", "|", "|", "F", "J", "|", "|", "F", "-", "J", "L", "7", "L", "J", "|", "|", "|", "F", "J", "|", "F", "7", "L", "J", "L", "J", "L", "7", "|", "|", "L", "7", "L", "7", "F", "7", "F", "-", "-", "-", "J", "F", "-", "-", "-", "J", "|", "F", "-", "-", "-", "J", "L", "-", "-", "J", "F", "7", "F", "J", "F", "7", "L", "-", "-", "-", "7", ".", "|", "J", "|", "L", "L", "7", "F", "-", "-", "7"],
["|", "J", "L", "-", "-", "-", "7", "F", "-", "J", "|", "|", "|", "|", "|", "|", "L", "-", "-", "7", "F", "J", "|", "|", "F", "7", "F", "7", "L", "-", "-", "7", "L", "-", "-", "-", "J", "J", "L", "J", "|", "|", "F", "L", "J", "F", "|", "|", "F", "-", "J", "|", "L", "7", "F", "7", "F", "J", "|", "L", "7", "F", "7", "L", "J", "L", "7", "L", "J", "L", "7", "F", "7", "|", "F", "-", "J", "|", "|", "L", "7", "|", "|", "L", "-", "-", "7", "F", "7", "|", "|", "L", "7", "|", "-", "L", "J", "|", "L", "7", "F", "-", "7", "L", "-", "-", "-", "-", "J", "L", "7", "F", "7", "F", "7", "F", "-", "-", "J", "L", "J", "F", "J", "L", "-", "-", "-", "-", "J", "F", "-", ".", "J", "|", "J", "F", "-", "F", "J", "."],
["L", ".", "|", "F", "-", "-", "J", "L", "-", "-", "J", "L", "J", "L", "J", "|", "7", "F", "-", "J", "L", "-", "J", "|", "|", "|", "|", "|", "F", "-", "7", "|", "F", "7", "F", "7", "F", "7", "F", "7", "L", "J", "F", "-", "-", "-", "J", "|", "L", "7", "F", "J", "-", "|", "|", "L", "J", ".", "L", "7", "L", "J", "|", "L", "F", "7", "L", "7", "F", "7", "L", "J", "|", "|", "|", "F", "7", "|", "L", "7", "|", "L", "J", "F", "-", "-", "J", "|", "L", "J", "L", "-", "J", "|", "F", "-", "7", "|", "F", "J", "L", "7", "|", "F", "7", "F", "-", "7", "F", "-", "J", "|", "|", "|", "L", "J", "F", "-", "-", "7", "F", "J", "F", "7", "F", "7", "7", "F", "7", "-", "7", "-", "J", "F", "-", "L", ".", "J", "-", "7"],
["F", "-", "L", "L", "-", "7", "F", "7", "F", "-", "7", "F", "7", "F", "7", "L", "7", "L", "7", "F", "7", "F", "7", "L", "J", "L", "J", "L", "J", "F", "J", "L", "J", "L", "J", "L", "J", "L", "J", "L", "-", "7", "L", "-", "-", "-", "7", "L", "-", "J", "L", "-", "7", "|", "|", "F", "7", "F", "7", "|", "F", "-", "J", "F", "J", "L", "-", "J", "|", "L", "-", "-", "J", "|", "L", "J", "|", "L", "7", "|", "|", "F", "-", "J", "F", "-", "7", "L", "-", "7", "F", "-", "-", "J", "L", "7", "|", "|", "L", "-", "7", "|", "L", "J", "L", "J", "-", "L", "J", "F", "7", "|", "|", "|", "F", "-", "J", "F", "7", "L", "J", "F", "J", "L", "J", "L", "-", "J", "|", ".", "F", "7", "L", "J", "L", "|", "F", "J", "F", "|"],
["F", "7", ".", "F", "-", "J", "|", "|", "|", "F", "J", "|", "L", "J", "L", "7", "|", "J", "L", "J", "L", "J", "L", "-", "-", "-", "-", "-", "7", "|", "F", "7", "F", "7", "7", "F", "7", "F", "-", "-", "-", "J", "|", "F", "7", "F", "|", "F", "7", "F", "7", "F", "J", "|", "|", "|", "L", "J", "|", "|", "|", "F", "7", "L", "-", "-", "-", "7", "|", "F", "7", "F", "-", "J", "F", "-", "J", "F", "J", "|", "|", "|", "F", "7", "L", "7", "|", "F", "-", "J", "L", "-", "7", "J", "F", "J", "|", "L", "7", "F", "J", "|", "F", "-", "-", "-", "-", "-", "-", "J", "L", "J", "L", "J", "L", "-", "-", "J", "L", "7", "|", "|", "F", "-", "-", "-", "-", "-", "J", "7", "J", "L", "7", "J", "F", "F", "J", "F", "-", "7"],
["L", "J", "-", "|", "F", "7", "|", "L", "J", "|", "F", "J", "F", "-", "-", "J", "L", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "J", "L", "J", "L", "J", "L", "-", "J", "L", "J", "F", "-", "-", "-", "7", "|", "|", "F", "J", "|", "L", "J", "|", "|", "F", "J", "|", "L", "-", "7", "|", "|", "|", "|", "|", "F", "-", "-", "7", "|", "L", "J", "|", "L", "-", "7", "L", "7", "F", "L", "7", "|", "|", "|", "|", "L", "7", "|", "|", "|", "F", "7", "F", "-", "J", "F", "J", "F", "J", ".", "|", "L", "7", "L", "J", ".", "F", "-", "-", "-", "-", "-", "7", "F", "-", "-", "-", "-", "-", "-", "-", "J", "F", "J", "L", "-", "-", "-", "-", "7", "F", "7", "7", "J", "L", "F", "F", "L", "-", "L", "J", "|"],
["L", "|", "F", "J", "|", "L", "J", "F", "-", "J", "L", "7", "|", "F", "7", "F", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "7", "F", "7", "F", "-", "7", "F", "-", "-", "7", "F", "7", "|", "F", "-", "-", "J", "|", "|", "L", "7", "|", "F", "7", "L", "J", "|", "F", "J", "F", "7", "|", "|", "|", "|", "|", "|", "L", "-", "7", "|", "|", "F", "-", "J", "F", "7", "|", "F", "J", "F", "7", "|", "|", "|", "|", "|", "F", "J", "|", "|", "L", "J", "|", "|", "F", "7", "L", "7", "|", "F", "7", "|", "F", "J", "L", "F", "7", "L", "-", "-", "-", "-", "7", "|", "L", "-", "-", "-", "-", "-", "-", "-", "-", "J", "F", "7", "F", "-", "-", "-", "J", "|", "L", "7", "7", "F", "7", "J", "F", "F", "J", "J", "7"],
["F", "L", "|", "F", "J", "F", "7", "|", "F", "-", "-", "J", "L", "J", "L", "J", "F", "-", "-", "-", "7", "F", "-", "7", "F", "-", "J", "|", "|", "|", "F", "J", "|", "F", "-", "J", "|", "|", "|", "L", "-", "7", "F", "J", "|", "F", "J", "|", "|", "L", "7", "F", "J", "|", "F", "J", "|", "|", "L", "J", "|", "|", "L", "7", "F", "J", "L", "J", "L", "7", "F", "J", "|", "|", "|", "F", "J", "|", "|", "|", "|", "|", "|", "|", "F", "J", "L", "7", "F", "J", "|", "|", "|", "F", "J", "|", "|", "|", "|", "L", "7", "F", "J", "L", "7", "F", "7", "F", "7", "|", "|", "F", "-", "7", "F", "-", "-", "-", "-", "-", "-", "J", "L", "J", "|", "F", "-", "-", "J", "F", "J", "F", "7", "J", ".", "L", "7", "F", "7", "7"],
["L", "L", "L", "J", "L", "|", "|", "L", "J", "F", "7", "F", "-", "7", "F", "-", "J", "F", "7", "F", "J", "L", "7", "|", "L", "-", "-", "J", "L", "J", "L", "7", "|", "L", "7", "F", "J", "|", "L", "-", "7", "|", "|", "J", "L", "J", "F", "J", "|", "F", "J", "L", "7", "|", "L", "7", "L", "J", "F", "7", "|", "|", "|", "|", "L", "-", "-", "-", "7", "|", "|", "L", "|", "|", "|", "L", "7", "|", "|", "|", "|", "|", "|", "|", "L", "-", "7", "|", "|", "F", "J", "|", "|", "L", "7", "L", "J", "|", "L", "7", "|", "L", "-", "7", "|", "|", "|", "|", "|", "|", "L", "J", "F", "J", "L", "-", "-", "-", "-", "-", "-", "-", "-", "-", "-", "J", "F", "7", "F", "J", "F", "J", "L", "-", "7", "L", "L", "F", "J", "L"],
["L", "7", "F", "F", "7", "|", "L", "-", "-", "J", "|", "|", "F", "J", "L", "7", "F", "J", "|", "|", "|", "F", "J", "L", "-", "-", "-", "-", "7", "F", "7", "|", "|", "F", "J", "L", "7", "L", "7", "F", "J", "|", "L", "-", "7", "|", "L", "7", "|", "L", "-", "-", "J", "|", "F", "J", "J", "F", "J", "|", "|", "L", "7", "|", "F", "7", "F", "-", "J", "|", "|", "F", "J", "|", "|", "F", "J", "|", "|", "|", "|", "L", "J", "L", "7", "F", "J", "L", "J", "L", "-", "J", "L", "7", "|", "7", "F", "J", "F", "J", "|", "F", "-", "J", "L", "J", "|", "|", "L", "J", "F", "7", "L", "-", "7", "F", "-", "-", "-", "-", "7", "F", "-", "7", "F", "-", "J", "L", "J", "7", "|", "F", "-", "-", "J", "7", ".", "|", ".", "|"],
["F", "-", "-", "J", "L", "J", "F", "-", "-", "7", "L", "J", "|", "F", "7", "L", "J", "F", "J", "L", "7", "L", "-", "-", "-", "-", "-", "7", "L", "J", "L", "J", "|", "|", "F", "7", "|", "F", "J", "|", "F", "J", "F", "7", "|", "F", "-", "J", "L", "7", "F", "-", "7", "L", "J", "F", "7", "L", "7", "L", "J", "F", "J", "L", "J", "|", "L", "-", "7", "L", "J", "|", "F", "J", "|", "L", "7", "|", "|", "|", "L", "7", "F", "7", "|", "|", "F", "7", "F", "7", "F", "-", "-", "J", "L", "7", "|", "F", "J", "F", "J", "L", "-", "7", "F", "-", "J", "L", "-", "-", "J", "|", "F", "-", "J", "L", "7", "7", "F", "7", "L", "J", "|", "L", "J", "-", "F", "-", "-", "-", "J", "L", "7", ".", "|", "7", "L", "7", "7", "F"],
["|", "F", "-", "-", "-", "7", "|", ".", "F", "J", "F", "7", "L", "J", "L", "7", "F", "J", "F", "7", "L", "-", "-", "-", "-", "-", "-", "J", "F", "7", "F", "-", "J", "|", "|", "|", "|", "L", "7", "|", "L", "7", "|", "|", "|", "L", "-", "7", "F", "J", "L", "7", "L", "-", "7", "|", "L", "-", "J", "F", "7", "L", "-", "-", "7", "L", "7", "F", "J", "F", "-", "J", "L", "7", "L", "7", "|", "|", "|", "L", "7", "|", "|", "L", "J", "L", "J", "L", "J", "|", "|", "F", "7", "F", "7", "|", "|", "L", "7", "L", "7", "F", "7", "|", "L", "7", "F", "7", "F", "7", "F", "J", "L", "-", "-", "7", "L", "-", "J", "L", "-", "-", "7", "F", "-", "-", "J", "F", "-", "7", "F", "7", "L", "-", "7", "-", "7", ".", "F", "|"],
["L", "J", "-", "F", "-", "J", "L", "7", "L", "-", "J", "L", "-", "-", "7", "L", "J", "F", "J", "|", "F", "7", "F", "7", "F", "-", "-", "-", "J", "|", "L", "-", "7", "|", "|", "L", "J", "F", "J", "L", "7", "|", "|", "|", "|", "F", "-", "J", "L", "-", "7", "|", "F", "-", "J", "L", "-", "-", "7", "|", "L", "7", "F", "-", "J", "F", "J", "|", ".", "L", "7", "F", "7", "L", "7", "|", "|", "|", "|", "F", "J", "|", "L", "-", "7", "F", "7", "F", "-", "J", "|", "|", "|", "|", "|", "|", "L", "7", "L", "7", "|", "|", "|", "L", "7", "|", "|", "L", "J", "|", "L", "-", "-", "7", "F", "L", "7", "F", "7", "F", "-", "-", "J", "|", "F", "-", "-", "J", "-", "L", "J", "L", "-", "-", "J", "-", "|", "-", "L", "J"],
["L", "L", "F", "J", "F", "-", "-", "J", "F", "-", "-", "7", "F", "-", "J", "F", "7", "L", "7", "L", "J", "|", "|", "L", "J", "F", "-", "-", "-", "J", "F", "7", "|", "|", "|", "F", "F", "J", "F", "7", "|", "L", "J", "L", "J", "L", "7", "F", "-", "7", "L", "J", "L", "7", "F", "7", "F", "F", "J", "L", "7", "|", "L", "-", "7", "L", "7", "L", "7", "-", "|", "|", "L", "7", "|", "|", "|", "L", "J", "|", "F", "J", "F", "-", "J", "|", "|", "L", "-", "7", "|", "|", "L", "J", "|", "|", "F", "J", "F", "J", "|", "|", "|", "F", "J", "|", "|", "F", "-", "J", "F", "-", "7", "|", "F", "-", "J", "|", "|", "L", "-", "7", "|", "|", "|", "F", "-", "-", "-", "-", "-", "-", "-", "-", "7", "-", "-", "J", "L", "|"],
["F", "-", "L", "7", "L", "7", ".", ".", "L", "-", "7", "L", "J", "F", "7", "|", "L", "7", "L", "-", "7", "L", "J", "F", "-", "J", "F", "7", "F", "7", "|", "|", "|", "|", "L", "7", "|", "F", "J", "L", "J", "F", "F", "-", "-", "-", "J", "L", "7", "L", "7", "F", "7", "L", "J", "L", "7", "L", "7", "F", "J", "|", "F", "-", "J", "J", "L", "7", "L", "7", "L", "J", "L", "L", "J", "|", "L", "7", "F", "J", "L", "7", "L", "-", "7", "|", "|", "F", "-", "J", "|", "L", "-", "7", "L", "J", "L", "7", "|", "|", "L", "J", "|", "|", "F", "J", "|", "L", "-", "7", "L", "7", "|", "|", "L", "7", "F", "J", "|", "F", "7", "L", "-", "J", "L", "J", "F", "7", "F", "-", "-", "-", "-", "-", "J", "7", ".", "L", "|", "|"],
["J", "J", "F", "L", "7", "|", "7", "L", "L", "7", "L", "7", "F", "J", "|", "L", "7", "L", "7", "F", "J", "F", "-", "J", "F", "7", "|", "|", "|", "L", "J", "|", "|", "L", "7", "|", "|", "|", "|", "F", "-", "-", "J", "F", "7", "F", "-", "-", "J", "F", "J", "|", "|", "F", "7", "F", "J", "F", "|", "L", "7", "|", "L", "-", "7", "F", "7", "L", "7", "|", "F", "F", "-", "-", "7", "|", "F", "J", "L", "7", "F", "J", "F", "-", "J", "|", "|", "L", "7", "F", "J", "F", "7", "L", "-", "-", "7", "|", "L", "-", "-", "7", "|", "|", "L", "7", "L", "7", "F", "J", "F", "J", "|", "|", "F", "J", "L", "7", "|", "|", "L", "7", "F", "7", "F", "7", "|", "|", "L", "-", "7", "F", "-", "7", "L", "F", "-", "7", "-", "7"],
["|", "7", "L", "7", "|", "|", "J", "-", "L", "J", ".", "|", "L", "7", "L", "7", "L", "7", "|", "|", "F", "J", "F", "-", "J", "|", "|", "|", "L", "7", "J", "L", "J", "L", "|", "|", "|", "L", "7", "|", "F", "7", "F", "J", "|", "|", "F", "-", "7", "L", "7", "|", "|", "|", "|", "L", "-", "7", "L", "7", "|", "|", "F", "-", "J", "|", "|", "F", "J", "L", "7", "|", "F", "-", "J", "|", "|", "F", "7", "L", "J", "F", "J", "F", "7", "|", "|", "F", "J", "|", "F", "J", "L", "-", "7", "F", "J", "L", "-", "7", "F", "J", "L", "J", "L", "L", "7", "|", "L", "7", "L", "7", "L", "J", "|", "F", "7", "|", "|", "|", "F", "J", "|", "|", "|", "L", "J", "L", "-", "-", "J", "|", "F", "J", "J", "L", "7", "|", "L", "|"],
["J", "J", "|", "F", "L", "J", "|", "L", "J", "7", "L", "L", "-", "J", ".", "L", "7", "|", "|", "|", "L", "7", "|", "-", "F", "J", "|", "L", "7", "L", "-", "-", "-", "7", "|", "|", "|", "F", "J", "L", "J", "L", "J", "F", "J", "L", "J", "F", "J", "F", "J", "|", "|", "|", "|", "F", "7", "L", "7", "|", "|", "L", "J", "7", "F", "J", "L", "J", "F", "7", "L", "J", "L", "7", "L", "|", "L", "J", "L", "-", "7", "L", "7", "|", "|", "|", "|", "|", "F", "J", "|", "F", "-", "-", "J", "L", "-", "-", "7", "|", "L", "-", "-", "7", ".", "F", "L", "J", "-", "L", "7", "|", "F", "-", "J", "|", "|", "|", "|", "|", "L", "7", "|", "|", "L", "-", "-", "-", "7", "F", "-", "J", "L", "7", ".", "|", "F", "|", "-", "J"],
["|", ".", "-", "J", ".", "F", "7", "L", "J", "J", "L", "L", "L", "F", "-", "-", "J", "|", "|", "|", "F", "J", "|", "F", "J", "F", "J", "F", "J", "F", "7", "F", "7", "|", "L", "J", "|", "|", "F", "7", "F", "-", "-", "J", "F", "-", "7", "L", "7", "L", "-", "J", "|", "|", "|", "|", "L", "7", "|", "|", "L", "7", "F", "-", "J", "F", "-", "7", "|", "L", "7", "F", "7", "L", "7", "L", "7", "F", "7", "F", "J", "F", "J", "|", "|", "|", "L", "J", "|", "F", "J", "L", "7", "F", "7", "F", "7", "F", "J", "|", "F", "-", "7", "L", "7", "F", "-", "-", "-", "-", "J", "|", "L", "7", "F", "J", "L", "J", "|", "|", "F", "J", "|", "|", "F", "7", "F", "7", "L", "J", "F", "-", "7", "|", "7", "F", "L", "7", ".", "L"],
["-", "J", ".", "|", "F", "|", "7", "-", "7", ".", "F", "-", "J", "L", "-", "-", "7", "|", "|", "|", "L", "7", "|", "L", "7", "|", "|", "L", "7", "|", "|", "|", "|", "L", "-", "7", "|", "|", "|", "L", "J", "F", "-", "7", "L", "7", "L", "7", "L", "7", "F", "-", "J", "|", "|", "L", "7", "L", "J", "L", "7", "|", "L", "-", "7", "|", ".", "|", "L", "7", "|", "|", "|", "F", "J", "F", "J", "|", "|", "|", "|", "|", "F", "J", "|", "L", "-", "7", "|", "|", "F", "7", "L", "J", "|", "|", "L", "J", ".", "|", "|", "F", "J", "F", "J", "L", "7", "F", "-", "-", "7", "|", "F", "|", "|", "F", "7", "J", "L", "J", "|", "F", "J", "|", "|", "L", "J", "|", "F", "-", "J", "|", "L", "J", "|", "F", "|", "L", "7", "J"],
[".", ".", ".", "|", "L", "L", "J", "L", "L", "7", ".", "|", ".", "|", "L", "L", "L", "J", "L", "J", "F", "J", "|", "F", "J", "|", "F", "-", "J", "|", "|", "|", "L", "-", "7", "|", "L", "J", "L", "-", "-", "J", "J", "|", "F", "J", "7", "L", "7", "|", "L", "7", "F", "J", "|", "F", "J", "F", "-", "-", "J", "L", "7", "F", "J", "|", "F", "J", "F", "J", "|", "|", "|", "L", "7", "L", "7", "|", "|", "L", "7", "|", "|", "F", "J", "F", "-", "J", "|", "|", "|", "L", "-", "-", "J", "L", "-", "-", "7", "L", "J", "|", "F", "J", "F", "7", "|", "|", "F", "-", "J", "|", "F", "J", "L", "J", "L", "7", "F", "-", "J", "L", "7", "|", "L", "-", "7", "|", "L", "7", "L", "J", "7", "J", "F", "F", "F", ".", "-", "."],
["|", "-", "F", "7", "-", "F", "L", "L", "|", "-", "L", "J", "7", "7", "|", ".", "L", "J", "J", "J", "L", "7", "|", "L", "7", "|", "L", "7", "F", "J", "|", "L", "-", "7", "L", "J", "F", "-", "-", "-", "-", "-", "-", "J", "|", "F", "F", "7", "L", "J", "F", "J", "|", "F", "J", "L", "7", "|", "F", "-", "-", "7", "|", "L", "7", "|", "L", "7", "L", "7", "|", "|", "L", "7", "|", "F", "J", "|", "L", "7", "|", "L", "J", "L", "7", "L", "-", "7", "L", "J", "L", "7", "F", "-", "7", "F", "-", "7", "L", "-", "7", "L", "J", "J", "|", "|", "|", "|", "|", "F", "7", "|", "L", "-", "-", "7", "F", "J", "L", "7", "F", "7", "|", "|", "F", "7", "|", "|", "F", "J", "-", "F", "|", "7", "J", "|", "|", "F", "J", "7"],
["|", "F", "|", "J", ".", "L", ".", "F", "-", "7", "|", "L", "J", "-", "L", "J", "J", ".", "|", ".", "L", "|", "L", "7", "|", "|", "F", "J", "|", "F", "J", "F", "7", "L", "-", "7", "L", "-", "7", "F", "-", "-", "-", "7", "L", "7", "|", "L", "-", "7", "L", "-", "J", "|", "F", "7", "|", "|", "L", "7", "F", "J", "L", "7", "|", "L", "7", "|", "F", "J", "|", "L", "7", "L", "J", "L", "7", "|", "F", "J", "L", "7", "F", "-", "J", "F", "7", "L", "-", "7", "F", "J", "L", "7", "|", "L", "7", "|", "F", "7", "L", "-", "-", "-", "J", "|", "|", "|", "L", "J", "|", "|", "J", "F", "7", "L", "J", "F", "-", "J", "|", "|", "|", "L", "J", "|", "|", "L", "J", "J", "F", "L", "J", "J", "L", "F", "J", "L", "J", "J"],
["|", "L", "J", "L", "-", "J", "-", "-", "|", "L", "-", "F", "7", "J", "L", "7", "J", "-", "F", "7", "|", "|", "F", "J", "|", "|", "L", "7", "|", "L", "7", "|", "|", "F", "7", "L", "7", "F", "J", "|", "F", "-", "-", "J", "F", "J", "L", "-", "7", "L", "-", "-", "-", "J", "|", "|", "|", "|", "F", "J", "|", "F", "7", "|", "|", "F", "J", "L", "J", "|", "L", "7", "L", "-", "-", "7", "|", "|", "L", "-", "7", "|", "L", "7", "F", "J", "|", "F", "-", "J", "L", "7", "F", "J", "L", "7", "|", "|", "|", "|", "F", "7", "F", "7", "F", "J", "L", "J", "F", "-", "J", "L", "-", "J", "L", "7", "L", "|", "F", "-", "J", "|", "L", "7", ".", "|", "L", "7", "J", ".", "|", "J", "7", "F", "F", "J", "-", "|", "L", "|"],
["F", "L", "7", "J", "L", "F", ".", "L", "F", "7", "7", ".", "L", "-", "F", "J", "7", ".", "7", "7", "7", "|", "|", "L", "L", "J", "J", "L", "J", "7", "|", "|", "|", "|", "L", "7", "|", "|", "F", "J", "L", "-", "7", "F", "J", "F", "-", "-", "J", "F", "-", "-", "-", "7", "|", "L", "J", "L", "J", "F", "J", "|", "|", "|", "|", "|", "F", "-", "7", "F", "-", "J", "F", "-", "-", "J", "L", "J", "F", "-", "J", "|", "F", "J", "L", "7", "|", "L", "-", "-", "7", "|", "|", "F", "-", "J", "|", "|", "|", "L", "J", "|", "|", "|", "L", "-", "7", "|", "L", "7", "F", "7", "F", "-", "7", "L", "7", "L", "J", "F", "-", "J", "F", "J", "-", "L", "7", "|", "7", "7", "J", "|", "F", "F", "F", "J", "F", "-", "-", "-"],
["-", "F", ".", "F", "J", "L", "F", "7", "L", "7", "|", "7", "|", ".", "F", "L", "|", "7", "J", "|", "-", "L", "J", "-", "F", "-", "-", "-", "-", "-", "J", "|", "L", "J", "|", "L", "J", "L", "J", "F", "-", "-", "J", "L", "7", "L", "7", "F", "7", "|", "|", "F", "-", "J", "L", "-", "-", "7", "F", "J", "F", "J", "|", "|", "|", "L", "J", "F", "J", "L", "-", "7", "L", "-", "-", "-", "-", "7", "L", "7", "F", "J", "L", "-", "7", "|", "|", "F", "-", "7", "|", "|", "|", "L", "-", "7", "|", "|", "L", "-", "7", "|", "|", "|", "F", "7", "|", "F", "-", "J", "|", "|", "L", "7", "L", "7", "|", "F", "7", "L", "-", "7", "L", "7", "J", "L", "|", "|", "|", "|", "7", "|", "F", "L", "F", "F", "7", "L", "7", "."],
[".", "-", "|", "L", "7", "|", "F", "|", "-", "J", "-", "-", "7", "7", "J", "L", "J", "L", "F", "|", "7", "F", "J", "L", "L", "-", "-", "7", "F", "-", "7", "L", "-", "-", "-", "-", "-", "-", "7", "L", "-", "-", "7", "F", "J", "F", "J", "|", "|", "|", "F", "J", "F", "7", "F", "7", "F", "J", "|", "F", "J", "F", "J", "|", "L", "-", "7", "L", "7", "F", "-", "J", "F", "-", "7", "F", "-", "J", "|", "L", "J", "F", "-", "-", "J", "|", "|", "|", "7", "L", "J", "L", "J", "|", "F", "J", "|", "|", "F", "7", "|", "|", "|", "|", "|", "L", "J", "L", "7", "F", "J", "|", "F", "J", "F", "J", "L", "J", "L", "-", "7", "L", "-", "J", "L", "F", "L", "J", "7", "7", "F", "7", "7", ".", "|", "|", "L", "F", "J", "J"],
[".", "F", "L", "|", ".", "-", "J", "L", "7", "|", ".", "J", "L", "7", "7", "|", "J", "F", "|", "|", "-", "L", "7", "F", "-", "-", "-", "J", "|", "|", "L", "7", "F", "-", "-", "-", "-", "-", "J", "F", "-", "-", "J", "|", "F", "J", "F", "J", "|", "|", "L", "-", "J", "|", "|", "L", "J", "L", "|", "|", "-", "L", "7", "L", "7", "F", "J", "F", "J", "L", "7", "F", "J", "F", "J", "L", "-", "-", "-", "-", "7", "L", "-", "7", "F", "J", "|", "L", "-", "-", "-", "7", "F", "-", "J", "F", "J", "L", "J", "|", "|", "L", "J", "|", "|", "F", "7", "F", "J", "|", "F", "J", "L", "7", "|", "F", "-", "7", "F", "7", "L", "-", "7", "J", "7", "J", "F", "L", "J", "7", "7", "L", "L", "-", "F", "L", "-", "J", "J", "|"],
["F", "|", "-", "-", "7", "|", "7", "-", "|", "-", "7", "|", "7", "J", "L", "L", "J", "L", "7", "J", "F", "|", "-", "L", "-", "-", "-", "7", "|", "F", "-", "J", "L", "-", "-", "-", "-", "-", "7", "L", "7", "F", "7", "|", "L", "7", "|", ".", "L", "J", "-", "F", "-", "J", "L", "-", "-", "7", "|", "|", "F", "-", "J", "F", "J", "L", "7", "|", "F", "-", "J", "L", "7", "L", "7", "F", "7", "F", "7", "F", "J", "F", "-", "J", "L", "7", "|", "F", "-", "7", "F", "J", "L", "7", "F", "J", "F", "F", "-", "J", "L", "7", "F", "J", "L", "J", "|", "L", "7", "|", "|", "F", "7", "|", "|", "L", "7", "L", "J", "|", "F", "-", "J", "J", "7", ".", "|", "|", "-", "|", "F", "-", "L", "-", "-", "F", ".", "|", "J", "F"],
["-", "7", "-", "L", "7", "L", "J", "7", "|", ".", "F", "|", "L", "-", "J", ".", "F", ".", "L", "-", "-", "7", "7", "J", "|", ".", "F", "J", "|", "|", "F", "7", "F", "7", "F", "-", "-", "-", "J", "L", "|", "|", "|", "|", "F", "J", "L", "7", "J", "F", "-", "J", "F", "7", "F", "7", "F", "J", "L", "J", "L", "-", "7", "|", "F", "7", "L", "J", "|", "F", "7", "F", "J", "F", "|", "|", "|", "|", "|", "|", "F", "L", "7", "F", "-", "J", "|", "|", "F", "J", "|", "F", "-", "J", "L", "-", "7", "L", "-", "-", "7", "|", "|", "F", "-", "-", "J", "J", "|", "|", "|", "|", "|", "|", "|", "F", "J", "J", ".", "|", "L", "7", "|", "F", "7", "-", "J", "F", "-", "L", "J", "F", "F", "7", "L", "-", "7", "L", "-", "7"],
["|", "|", "F", "7", "L", "7", "7", "L", "7", ".", "-", "7", "-", "7", "7", "L", "|", "|", "J", "7", "7", "L", "F", "-", "7", "F", "|", "F", "J", "|", "|", "|", "|", "|", "L", "7", "|", "-", "|", "J", "L", "J", "|", "|", "|", "F", "7", "|", "F", "L", "-", "-", "J", "|", "|", "|", "L", "7", "F", "-", "-", "-", "J", "L", "J", "|", "F", "7", "L", "J", "|", "L", "-", "7", "L", "J", "|", "|", "|", "|", "F", "7", "|", "L", "-", "7", "|", "|", "L", "7", "|", "|", "F", "7", "F", "7", "L", "7", ".", "F", "J", "|", "|", "L", "7", "-", "F", "-", "J", "|", "L", "J", "L", "J", "|", "|", "J", "-", "-", "L", "-", "J", "7", "L", "J", "-", "-", "F", "-", "|", "L", "L", "J", "-", ".", "F", "7", "7", "L", "F"],
["-", "-", "7", ".", "F", "L", "-", "F", "J", ".", "L", ".", "|", "F", "F", "J", "|", "7", ".", "|", "F", "F", "L", "7", "L", "L", "L", "J", ".", "L", "J", "|", "|", "L", "7", "L", "-", "7", "7", "-", "|", "J", "L", "J", "|", "|", "L", "J", "F", "-", "-", "-", "-", "J", "|", "L", "-", "J", "L", "7", "F", "-", "7", "F", "7", "L", "J", "L", "-", "7", "L", "7", "F", "J", "L", "F", "J", "|", "|", "|", "|", "L", "J", "F", "-", "J", "|", "L", "7", "|", "|", "|", "|", "|", "|", "L", "7", "L", "7", "L", "7", "|", "L", "7", "|", "J", "L", "7", "F", "J", ".", "L", "L", "L", "|", "L", "7", "7", "L", "|", "J", ".", "|", "7", "|", "7", ".", "F", "-", "-", "L", "7", "J", "-", "F", "F", "|", "|", ".", "7"],
["L", "|", "L", "7", "J", ".", "L", "J", "-", "7", "F", "|", "7", ".", "F", "7", ".", "|", "F", "J", "-", "|", "F", "L", ".", "L", "J", "J", ".", "L", "F", "J", "|", "F", "J", "F", "7", "L", "7", "J", ".", "-", "F", "-", "J", "L", "7", "F", "J", "F", "7", "F", "-", "7", "L", "-", "7", "F", "-", "J", "L", "7", "|", "|", "|", "F", "-", "-", "7", "L", "7", "L", "J", "F", "-", "J", "F", "J", "L", "J", "|", "F", "-", "J", ".", "L", "L", "7", "|", "L", "J", "|", "|", "L", "J", "F", "J", "F", "J", "-", "L", "J", ".", "L", "J", "|", "F", "|", "|", "J", "7", ".", "|", "L", "|", "F", "J", "7", "F", "|", "-", "J", "|", "-", "|", "-", "-", "J", ".", "|", ".", "F", "7", "-", "|", "L", "|", "L", "J", "J"],
[".", "L", "7", "J", "L", "7", "F", "|", "|", "L", "L", "7", "L", "L", "7", "L", "7", "L", "J", "|", "-", "-", "7", ".", "|", "J", "|", "7", "F", "7", "L", "7", "|", "L", "7", "|", "|", "F", "J", "7", "F", "F", "L", "-", "7", "F", "J", "L", "7", "|", "|", "L", "7", "L", "7", "F", "J", "|", "F", "7", "F", "J", "|", "|", "|", "L", "-", "7", "L", "-", "J", "|", ".", "L", "-", "-", "J", "7", "J", "F", "|", "L", "7", ".", "J", "J", "L", "|", "|", "J", "F", "J", "|", "L", "L", "L", "-", "J", "J", "|", "|", "-", "L", "L", "J", "-", "F", "L", "J", ".", "F", "-", "-", ".", "L", "J", "J", "|", "F", "|", "7", "F", "|", "J", "|", "7", "J", "7", "L", "|", "7", "|", "L", "J", "J", "F", "-", "7", "F", "-"],
["7", "J", "F", "J", "L", "F", "F", "J", "|", "J", "L", "J", "|", "F", "L", "7", ".", "L", "-", "L", "-", "L", "L", "L", "-", "F", "-", "L", "L", "-", "F", "J", "|", "J", "|", "|", "L", "J", "7", "L", "|", "J", "L", "L", "|", "|", "J", "-", "L", "J", "L", "-", "J", "J", "|", "|", "F", "J", "|", "|", "|", "F", "J", "|", "L", "-", "7", "L", "-", "7", "J", "L", "7", "|", "J", "J", "-", "J", "-", "7", "L", "-", "J", "7", "J", "7", "F", "L", "J", "L", "L", "7", "|", "L", "|", "L", "L", "7", ".", "L", "F", "-", "7", "J", "|", "L", "7", "7", "L", "|", "L", "|", "L", "7", "L", "|", "-", "J", "-", "7", "J", "7", ".", "F", "-", "J", "F", "|", "F", "L", "L", "7", "L", "F", "-", "J", "|", ".", "J", "|"],
["7", "|", "F", "7", ".", "-", "J", ".", "|", "|", "F", "|", "F", "J", ".", "|", ".", "F", "-", "J", ".", "-", "-", "7", "-", "F", "-", "|", "7", "F", "L", "-", "J", "-", "L", "J", "|", ".", "J", "F", "J", ".", "|", "L", "L", "J", "J", "L", "|", "|", "F", "-", "-", "-", "J", "|", "L", "-", "J", "|", "|", "L", "7", "L", "7", "F", "J", "F", "-", "J", ".", "L", "-", "J", "|", "7", ".", "L", "|", "7", "-", "J", "-", "J", "F", "L", "7", "L", "J", ".", "L", "L", "J", "7", "-", "J", "F", "J", "7", "L", "F", "J", "J", "-", "F", "-", ".", "F", ".", "7", "-", "|", "7", "F", "7", "|", "F", "J", "F", "|", ".", "F", "-", "7", "J", ".", "|", "L", "J", "-", "|", "|", "-", "7", "J", ".", "-", "F", "-", "|"],
["L", "|", "7", "-", "7", "|", "F", "7", "-", "-", "F", "F", "7", "-", "-", "J", "F", "-", "7", "L", "7", ".", "|", "7", "7", "|", "L", "|", "F", "J", "L", "|", ".", "7", "L", "J", "F", "J", ".", "|", "L", "7", "F", "|", "-", "L", ".", "F", "|", "F", "L", "-", "-", "-", "7", "L", "7", "F", "-", "J", "|", "J", "|", "F", "J", "L", "7", "L", "-", "7", "7", "J", "|", "-", "|", "-", "-", ".", "L", "L", "-", "J", ".", "F", "|", "7", "|", "|", ".", "L", "L", "|", "F", "7", "7", ".", "|", "-", "F", "F", "7", "J", "J", "F", "-", "7", "-", "|", "7", "|", "|", "J", "F", "F", "L", "-", "|", ".", "F", "J", "7", ".", "7", "L", "F", "F", "-", "F", "J", "L", "L", "J", "J", ".", "L", "-", "7", ".", "7", "-"],
["L", "L", "F", "-", "-", "F", "F", "|", "F", "7", "-", "J", "J", "F", "|", ".", "|", "F", "J", "J", "F", "L", "7", "L", "F", "7", "-", "|", ".", "J", "-", "-", ".", "L", "-", "F", "7", ".", "F", "J", "F", "|", "-", "7", "7", "|", ".", "F", "L", "L", "J", "7", ".", "F", "|", "F", "J", "L", "-", "7", "|", "F", "J", "L", "-", "7", "|", "F", "7", "|", "J", "F", "J", "|", "J", "|", "J", "L", "-", "-", ".", "L", "7", "J", "L", "J", "7", "|", ".", "L", "|", "L", "-", "J", "F", "7", "|", ".", "F", "J", "|", ".", "L", "7", "7", "7", "F", "J", "-", "7", "7", "|", "-", "7", "J", "-", "J", "-", "J", "L", "7", "7", "|", "-", "F", "|", "7", ".", "F", "-", "7", "J", "L", "7", "-", "|", "7", "|", ".", "L"],
["|", "-", "|", "7", "|", ".", "|", "F", "7", "L", "|", "J", "F", "F", "7", "-", ".", "L", ".", "|", "|", "-", "L", ".", "F", "J", ".", "L", ".", "J", "7", "|", "F", "F", "J", "|", "|", ".", "|", "-", "-", "|", "-", "F", "J", "-", "7", "L", "L", "L", "L", "|", ".", "F", "J", "L", "7", "F", "7", "|", "|", "L", "7", "F", "-", "J", "L", "J", "L", "J", "L", "J", "-", "J", ".", "J", "7", "F", "7", "7", "7", ".", "|", "|", "7", "F", "F", "F", "7", "F", "7", "L", "L", "J", "L", ".", "L", "-", "J", "7", "L", "7", "F", "|", "|", "7", "L", "L", "7", "L", "F", "-", "J", "L", "-", "-", "L", "7", ".", "L", "-", "J", "|", "F", "F", "J", "-", "|", "7", "F", "F", "7", "F", "L", "7", "-", "|", "7", "J", "|"],
["F", "F", "-", "-", "7", "F", "L", "L", "J", "F", "|", "7", "F", "F", "-", ".", "|", ".", "-", "7", "|", "7", "L", "F", "7", "J", "-", "L", "7", "|", "L", "-", "J", "J", "7", "|", "7", "7", "J", "J", ".", ".", "L", "L", "7", "F", "|", "F", "L", "|", ".", "L", "-", "L", "7", "F", "J", "|", "L", "J", "L", "7", "|", "|", ".", "F", "7", "J", "J", "J", ".", ".", "L", "|", "7", "J", "-", "F", "F", "7", "F", "|", "|", "|", "F", "L", "L", "F", "F", "F", "|", ".", "|", "7", "|", "-", "|", ".", "F", "-", "J", "F", "-", "L", "L", "-", "F", "7", "L", "-", "J", "F", "-", "J", "7", "7", "F", "-", "|", "7", "J", "-", "F", ".", "|", "J", "J", "L", "J", "J", "|", "F", "|", "|", "L", "|", ".", "|", "-", "J"],
["F", "7", "7", "|", "L", "F", "|", "7", "F", "7", "L", "7", "7", "L", "|", ".", "J", ".", "|", "J", "L", "|", "-", "7", "|", "|", "L", "L", "F", "F", "J", "J", "J", "7", "F", "J", "|", "|", "-", "-", "7", "F", "7", ".", "F", "L", "-", "|", "F", "J", "7", "7", "|", "-", "L", "J", "F", "J", "F", "7", "F", "J", "|", "L", "-", "J", "|", "7", "F", "F", "J", "7", "F", "-", "7", "-", "-", "L", "|", "7", "F", "-", "-", "|", "J", ".", "F", "-", "-", "-", "J", "-", "F", "7", "J", "-", "-", "7", "|", ".", "F", "|", "J", "-", "7", "F", "7", "J", ".", "J", ".", "F", "L", ".", "F", "F", "F", "J", "|", "7", "L", "F", "-", "7", "L", "7", ".", "J", "|", "F", "|", "L", "|", "|", "-", "L", "-", "7", "7", "|"],
["L", "-", "J", "J", "L", "-", "J", "J", "J", "L", "7", "J", "L", "-", "L", "-", "J", "J", "J", "F", "J", "J", "L", "F", "-", "L", "-", ".", "F", "7", ".", "|", "L", "L", "L", "-", "-", "J", "7", "J", "-", "L", "F", "L", "7", "L", "|", "J", "J", "J", "F", "-", "J", "7", ".", ".", "L", "-", "J", "L", "J", "J", "L", "-", "-", "-", "J", "-", "L", "F", "-", "L", "J", "J", "L", "7", ".", "L", "L", "J", "J", "J", "J", "J", "L", "J", ".", "L", "|", "J", "-", "L", "F", "L", "J", "L", "-", "L", "-", "-", "|", "J", "J", "-", "L", "L", "J", "L", "|", "J", "-", "|", ".", "-", "J", "|", ".", "L", "|", "J", "L", "|", "J", "J", ".", "F", "F", "-", "-", "7", "L", "-", "F", "J", "-", "L", "J", ".", "J", "-"]
]).

140
10/input.txt Normal file
View File

@@ -0,0 +1,140 @@
L777FJF77F-77-F-7F7.FF.J7.-J--J7F|7F.FJ.L-|F|-F|FJ7-J7F-JFF-7.L7FL7J-FF|7--7.L--|77.F-J77.-7FJ7F7FF--.FFJ7-7-F|.FL-L-F7.F|-FF7F|-7-|7-.FF-7.
L--77-FJL|7L77.FJ-F-7.|.FJJJ.FFF|FF-77|-|FJ-FJ|LFJ|-L-JLLF|L77|F7L7-|JL-J7LLF7|FLL--7J.-F-|-L-7JF7J7FJ-F-77|.FLJFJ7LJL|7.L7LL7FJFJ|LJLFFJJ|7
.|L|LFJ7-J-J||-7JLL-J---JL7F7L-LF7L7L77JF7L7--J7F7|.F7LF.L|-|FLJ|L|F|FFJJLJFFJ-7||LF7J7FJF-7.L7L|LFJ7LL|7JFJF|.|||F7JJ|L-7|J7LJ.F7--7L7J7FJ-
F7J|.L-J-L7F7JFJ.7LJ|-J...L|-|L|||FJFJ..L-FJLL77LLJ7L77J|-7J|F--7-JFL7|F7FFJLJJFJ77L-7-L7F.|J.|F|.L-|7..|FL-FJF-7-LJFL|-L|L|-|F7LL7LL.|FF||.
J|-L7J.|||L.F.FJ.|7LF.|FF.LL7|LFJ||FJ|.7.L7|FLF7-L.-JL7.F7J-LJJ7L|FJ||J---JF7JLJLL-7.LFJJJL7LF7JJFFF-777FF7|||L-JF|--7JLFL7.FFFF7|L77.|.JL-7
J7F7|.F-|7-FJ7L-7JF..J.|J7|LL-|L7LJL-7--7JJLFJ|L7F7.FJ77|LJL7FLFFF7L7J-7-|LLJ.|||.LJ7LF.LF||-||FFF-JFJ-J7L-.77-J7F|LJF-F-7L-FF7LF||.F7J..7.7
LF.L|-J7LJ-7.F|J.FL7-LF7F7L-J.77L-7F-J7.FF7F|FF7L-|77FJ-JFF.|7FF7||-|7LJ.-FL-.L-FJ77|7..LF7|7||FFJF-JL|FJLLF.F7|FJL7FJLLL-L-||.FJ||7|.FF-J7|
L|7L|7F-J.J|FFF-FJ-7JFLJ|.FJ|.F---JL--7J.LJ-J7.F7J|L77J7.FF.LFFJ|||7F77L|7|FF-J..|||----F7F--JL7L7|.|FL-J.FJ-|FL77FJ|J.F-FJJL-JLLF|77F7L-.LF
7---LF7|.FL7JL|F7L-L-7FL|7F7.FL7F7F---J.7-7..LL-JFLJF-77F7F7|FL7LJ|F||J7L-F-7-L.FFF7..FFJ||F-7FJF||.L7.|-F|.F7LJ|FJ7|J.|.-77F-J-L|JLF-J7LF..
LJ7.FLJL--7L7||-|7LF|7J7F-J|F7|LJ|L-7|LFL--7..|JL7LFL7L7|||L7F-JF-JFJ|.F7FJ7LJFL7FJ|F7FJFJLJJ||F-J|77LFFJF-L|L7|LJ7-7-FJLLL7-7F7F-.||7F7FJ7.
LLF-LF-7||JFL-LLF777F--FL7FJ|L-7F|F7L7-JJ7.L-F7.FF7-|L7||||FJL-7|F7|FJF7|||FJF77FL7|||L7|L|F7|||F7|F7-JJ7J77|.L-7J|7LFJ..FL-7|7||F-7-7-LJJ-7
|-|.F-7L7|JFJ.|J||LF7F7JFJ|LL-7L-J|L-J.LF77.L||.FJL7F-JLJLJL7F-J||LJL-JL7J7J7F7-FFJ||L-JL7FJLJ|||LJ||7F|FJ|-FJ.F--J7FL-FF-7|LJF-7J.LL|J.|7.7
J7|F7-L.FF-..F7F|L7||-||L7L--7L--7L7F7F7||-F7||-L-7|L--7F---JL7FJ|F-----JF7F-J|F7L7||F---JL--7|||7FJL--7.7|7L.FFL--F7.F-F-J7J-7FJF-7JJL|L|FL
.-JLJ.|7||JFF||FJFJ||7|-FJF--JF--JFJ||||||.|LJL77FJL7F-JL--7F-JL-JL----7J||L7FJ|L-JLJL7F7J.F7|LJ|FJF---JFF|7.FFF7F-JJFJ7|LF-7-|JJ7...FFJ7JFL
7FJ.L-J7JL7FL||L7L7|L7F-JFJLF7L--7L7|||||L7L7F-JFJF-JL----7|L-7F--7F---JFJL7|L7L--7F-7|||7FJLJF-J|FJF-7-||F77F-J|7..FJ|F|.JL7-L7L|L--F|J-F-J
-7-FJFL.JF7-FJL7L7LJFJL-7L-7|L7F-JFJ|||||FJ|||.FJFJLF7F-7FJL7FJL-7LJ|F7-L-7||FJF-7LJFJLJL7|F-7|F7||FJFJF77||-L7FJ7-F7-F||F|LJ7FJ.--L-LF.LJ7|
||.F7J|FLJ||L-7|LL-7L7F7|F-J|FJL-7|FJ||LJ|JFJ|FJFJF7|LJFJL-7LJF--JF7FJL7F-J||L7L7L7FJF7F7|LJFJLJ||LJFJFJL7||JFJ|F77|L-7.L7J.LF7.LJFJF7|JJ-L7
-77L7FF|JF--F-JL--7L7||LJ|.FJL7F-JLJFJL-7L7L7LJFJJ||L7FJF--JF7L-7L|LJF-JL-7||FJLL7|L-JLJ|L7.L7F7LJF-J-|F-J|||L7||L7L7FJ7-|J7FJ.FL7J-LLJLL|.|
|L7JLJJ|.L|FL7F--7L-J|L-7L7L7FJL---7|F7||FJFL7FJF7||FJL7L7F-J|F-JFJF-JF-7FJLJL7F-JL7|F--JFJF7LJ|F-JF-7||F7|L7FJLJFJFJ|-F7|F-7L7-L|-.|JF--|7.
L|.FJ7F-|.|7FLJF7L-7FJF7|FJFJL7F7F-J|||FJL-7FJL7|||LJF-JFLJF-JL-7L7L7-|FJ|F---JL--7L7L--7L7|L-7|L-7L7LJ|||L7|L7F-J.L7L-7J7|F-7J|LJ|.|-L7-L-7
|LJ-.LL-F7F7F7FJL7FJL-JLJL-JF-J|||F7LJ|L7F-JL7FJ||L-7|-F7F7L-7F-JFJFJFJ|-||F7F7F7FJFJF-7|FJ|F-J|F-J|L-7LJL7||FJL7F7J|F-JF77J.JF-J-FFJLLJ77||
|-LF--L7|LJ|||L-7|L7F----7F-JF7||LJL-7L7|L7J-||FJL7FJL7|||L--J|F7|FJFJFJFJ||||||||FJ7L7LJL-JL7FJL--7F-JF7FJ|||F-J|L7|L--JL7|7.|7|.7LJ7LJ|LFJ
J--J.LLLL-7LJ|F7||FLJ7F-7|L-7|||L7JF7|FJL7L7FJLJF-JL7FJ||L---7||||L-JFJ|L7|||||||||J|7L----7FJ|F---J|F-JLJFJLJ|F7L7||F----JF7F|F7F77F|7.|FLF
|FL.FL|LF7L-7LJLJL---7|FJL-7LJ|L7|FJ|||F7L7LJF--JFF7|||||F7F-JLJLJF--JF--JLJ||LJ||L7LF7|F--J|FJ|F-7FJL7.F7L7F-J|L7|LJL---7FJ|F|LJ-F7-|LJ|FFJ
||JF7JF-JL--JF7F7F7F7LJL-7FJF-JFJ||FJ||||-|F-JF7F7||||FJ|||L---7F7L-7FL----7|L7FJL7|FJL7L--7LJFJL7|L7FJFJL7|L-7|FJL7F----JL7L7F7LFJ|F|7-JL|J
|L7-F-L-----7|LJ||LJL---7|L7|F7L7||L7|LJ|FJ|F7|LJ|||||L7||L7F7FJ|L-7|F-7F7FJL-J|LF|||F-JJF7L-7|F7|L7||FJF-JL7FJ||F7||F7LF7FJFJ|L7L7|F|L7J|LL
-.|L|J|.F---J|F-JL-7|F--JL-J|||-|||FJL7FJL7LJ||F-J||||FJ|L7||LJFJF7LJ|FJ||L---7L7FJLJL7F-J|F7|LJ||FJ||L7L-7-||7|||||LJL-J||FJF|FJFJL7-7.F|-.
L-7.|.F7L-7F7|L7F--JFJF7F7F7LJL-J||L7FJ|7LL7FJ||F7||||L7|FJ|L-7|F|L7FJL-J|F7F7|FJ|F---JL-7||||F7||L7||FJF-JFJL7|||||F--7FJ||F7|L-JF-JJL|7JLJ
FF.FF-LF--J|||J||F-7L7|||LJL---7FJ|FJL7L7LFJ|-|||||||L7||L7L7F|L7|FJL---7LJ||LJ||||F--7F-JLJ|||LJ|FJ|||FJF7L7FJ|LJLJL-7LJJ|||||F--JJ|||LJ.FJ
FL-7J..L-7FJLJ|LJL7L7||||F-----JL7||F7L7L7L7|FJ||||||FJ||.L7|FJFJ||F7FF7L-7|L-7L7|LJF-JL---7LJL7FJL7|||L7||FJL7|F----7L-7FJ|||||F-7|L7JJ|FLJ
-7J.|F|FLLJJJLJ|F7L7|LJLJL7F----7LJLJL7L7L7|LJFJ|LJ|||FJL7FJLJFJFJ||L-JL-7||F7|FJL-7L7F77F7L-7FJL-7||||FJ|||F7LJL-7F7L--JL7LJLJLJFJ7J|.JL77.
L|--L7|7.L|-FJ.FJ|FJL-77F7LJF---JF----J-|FJ|F7L7L7FJ|||F-JL--7L7|FJL--7F-J|LJ||L7F-JFJ||FJ|F-J|F7FJLJ||L7||||L----J||-F7LFJF7F7F-J7|LFJL-LL7
|JJ|LLF77|L||.FL7|L-7FJFJL--JF7F7L7JF7-FJL7LJL7L-JL7||||F7F-7|FJ||F--7||F7L-7||FJL-7|L|||FJL-7|||L--7||FJ|||L-7F--7|L-JL-JFJ|||L--7J77J7-LFF
.F-7-L|JLL7LF---JL--JL7L-----JLJL7L7|L7L-7L7F7L-7F-J|||LJ|L7||L7||L-7||||L7FJLJ|F-7||FJ|||F7FJLJ|F7FJ|||FJLJF-J|F-JL7F--7FJ-LJL7F-JLLJFJ7-F|
7|FL7.|-.LF-L-------7FJF7F-------JFJ|FJF7|FJ||F7||F7|||F-JF||L7|||F7||||L7||F--JL7|||L7|||||L--7|||L7|||L7F7L-7|L-7||L-7|L---7FJL-7-J|FFL.-|
LJ.L-FJFL-FFF7F7F7F7|L-J|L-7F----7L-J|FJ|||FJ||LJLJ|||||F7FJL7||||||||||FJ||L-7F7|||L7|||||L7F7||||FJLJL-J||F7LJF7L-JF7|L----J|F7FJ.LJ.|J-L|
||7|7JL-J||FJLJ|||||L--7|F7LJF---JF-7|L7LJ|L7|L--7L||||LJ|L7FJ|||||||LJ||-||F-J|LJ||.|||||L7||LJLJLJF-----JLJL7FJ|F7FJ|L-7F7F7LJLJF777.|L-J|
-LJ-7-J|LL-L7F7LJLJ|F7FJLJ|F7L---7|FJL7L7FJFJL7F7|FJ||L-7|FJ|FJLJ||||F-JL7|||F7L-7||FJ|LJL7||L---7F-JF7F----7FJL7|||L7|F-J||||F---JL7-7L7J.F
|.FL77FFJ7.LLJL---7LJ|L--7|||F--7LJL7FJFJL7L7J||||L7|L7FJ||FJL--7||||L7F7||||||F-J||L7|LF7|||F---J|F7|LJF-7FJL--JLJL-JLJF7|||LJF-7F-J-7LJ7-|
|.|L||||-F7LLF7F7FL-7|JF7||||L-7L---JL7L7.|FJFJ|||7|L7|L7|||F7F-JLJ||FJ||||||||L-7||FJL7|LJ||L--7FJ||L77L7LJF77F7F7F7F7FJ||LJF-J||L7J||77|.|
LLJJF|||.LFF-JLJL---JL-JLJ|||F7L-----7L7|FJ|7|FJ||FJFJ|FJ|||||L7F-7||L7|LJ||||L7FJLJL7FJ|F7|L7F7||FJL-JF7L-7|L7|||||LJ||FJ|F-JF-7L-J-F.F|L-|
L||..J7J-LFL7F-7F----7F--7LJLJL7FF7F7L7LJL7L7||FJ|L7L7|L7||LJL7LJFJ||FJ|F-J||L7||F---J|FJ||L7LJ||||F---JL--J|FJ|||LJF-J||J|L--JFJF---77-.7LL
FFF-7--7F-LFJ|LLJF--7LJF7L--7F7L-JLJL-JF7||FJ||L-J||FJ|FJ|L--7L7FJ.LJL-J|F7|L-JLJL7F7FJL7|L7L-7||||L--------JL-JLJF7L--JL-JF7F-JL|F--JJF-7FJ
FLL7F-.L.|FJFJ-LFJF7L--JL---J|L--------JL7|L7|L-7F-JL7|L7|F7FJFJL---7F--J||L--7F77|||L7FJL7L7FJ||LJF-------------7||F--7F--J|L7F7||F7L-J||L|
L|L7JLF.F-L7|-F7L7|L7F7F-7F-7|F----------JL-JL--J|F-7||FJ||||7|F7F7FJL--7|L7F-J||FJ|L7|L7FJFJL7LJF7L-----7F-----7||LJF-JL-77L7LJLJLJ|7-F-F.|
F|-|.-JFLLLLJ7||FJ|FLJLJFJL7LJL----7F7F-7F7F-7F-7|L7||||FJ|LJFJ|||LJF---JL7|L--J|L-JL||||||L-7|F-JL---7F7LJF-7F7||L-7L---7L-7|F--7F7L7-F-L-|
J..L.J.|-LFLF-J|L7|F----JF-JJF-----J|||FJ|||FJ|FJL-JLJ||L7L-7L7||L7FL-7F-7||F7F7|F---JL7|L--7||L-7F7F7LJL--JLLJLJ|F7L7F7L|F-J|L-7LJL-J-|..-J
FF.FF.----JJL-7L7LJL----7|F-7L-7F---J||L-JLJL-JL--7F7FJ|7L7FJ.LJL7|F--JL7LJ||LJLJ|F7F7FJ|F7FJLJF7LJLJL-------7FF7LJL7LJL7|L-7|F7L7J||JF7-|.7
-J--L|FJJ.|LL7L7|F7F7F-7LJL7L7FJ|F---JL7F-7F7F7F-7LJ|L-JF-JL-7F--J|L7F7FJF-JL---7||||LJFJ|LJF--J|-F-----7F7F-JFJL7F7L---J|F-JLJ|FJ|L|J-|7LJJ
|.||LLJJ.F77LFFJLJLJ|L7|F-7L7LJFJL-----JL7|||||L7|F7|F7FL-7F-JL--7L7LJLJ|L7F-7F-J|||L-7L7L-7L--7L7|F-7F7LJLJLFJF7LJL----7|L--7J|L-7F7J7|-J.|
L7LL77J.F-777LL----7L-J|L7|7L--JJF7F7F7F-J||||L-JLJ|LJL-7FJL7FFF-JFJLF7F--JL7|L7FJ||F7|FJF7|F-7L7||L7LJL-----JFJL----7F-JL--7L7|F-JF77F77-L|
L7|LL-7.L7L-7.FF-7|L--7|FJL7F7F7FJLJLJ||F7LJ|L----7L----JL-7L7FJF7|.FJLJF-7FJ|FJL7|LJ||L-JLJL7|FJLJFJF7F7F7F7FJF7F--7|L-7F7FL-JLJF-J|-FJF-JL
|.FJF||FF|F-JF7L7|F7FFJ||F7LJLJ|L---7FJLJL7FJF7F-7L7F7F7F7FJFJL7||L7L-7FJFJL7||F-JL-7|L7F----J|L7F7|FJ||LJLJ|L-JLJF-JL-7LJL-7F---JF7|JJF7L-J
FF||FFF--J|F-JL-JLJL7L7|LJL7F-7L----JL----JL-J|L7L7LJLJLJ|L-JF7||L7|F-JL7L7FJ||L-7F-JL-JL----7||LJLJL7|L--7FJF----JF7F7L----JL-7F-JLJF77L7LJ
|-F-7|L--7|L-------7L7||LF-J|JL---------7F---7L7L7L7F7F-7L---J|LJF||L7F-JFJL7LJ7FJ|F---7F--7J||F7F7F7|L---JL7L-7F--JLJL7LF7JF7FJL---7-JL-77J
|LL7L---7||F7F7F7F7L7||L7L--JF7F--------J|F--JFL-JFJ||L7L----7|F--J|.||F7|F7L-7FJFJL--7LJF7|FJ|||||||L---7F7L--J|F-7F-7L-JL7|LJF--7FJFJ7LL-7
F--JF--7LJ|||||||||.||L7|F7F7||L---7F----JL7F7F7F7L7|L7|F7-F7LJL7F7L7||||LJL7FJL-JF7F7L-7|LJL7|||||||F7F7LJL-7F-JL7|L7L----J|F-JF7LJ.FJ|--J-
|F-7|JLL-7||||||LJL-JL-JLJLJLJL7.F-J|F-----J|||LJ||LJFLJ|L-JL7F7||L7||LJL7F7||-LF7||||F-J|F-7|||LJLJLJLJ|F---J|F--JL-JFF7|F7|L--J|F-77-JL-|.
LJFLJJ.LFJLJLJLJF7F-7F7F-7F7F-7L7L--JL---7F7|||F7L------JF7F-J|LJL7||L7F7LJ||L7FJLJ|||L-7|L7|||L7F7F---7LJF7F7|L---7F--JL7|||F---JL7|L|.|LJ-
|L|-F7F7L-7F7F-7|||7||||FJ||L7L7L---7F7F7LJLJ|||L------7FJ|L-7L7F7||L7|||F7||FJL--7LJL--JL-JLJL-J|LJF--JF-JLJLJF7F7LJF---J|LJL7F7F-JL-7-|JJ.
|JF-JLJL--J|LJFJ|||FJ|||L7||FJFL7F-7LJLJL---7LJL7F7F--7LJLL--JFJ||||FJ||||LJ||J.F-JF7F7F-----7F7FJ7FJF-7|F-7F-7|LJ|F7L-7F7|F--J|LJF---J||-FF
||L7F-7F-7FJF-JFJLJL-J||F||||F--JL7L-7F-7F77L--7LJLJF7L------7|FJ|||L7LJ||JLLJF-JF-J||LJLF---J|||F7L7|.LJ|LLJFJL7LLJL--J|LJL-7J|F-JF---7J7.|
.-LLJFJL7LJJL7FJ.F----JL7||||L----JF-J|FJ|L---7|F7F-J|F-7F-7FJLJF||L7|J-||77.FL--J7F|L7F-JF--7||||L7LJF-7L--7L-7L-7F7F7FJF--7L-JL7FJF--JL7-7
|.|-LL7FJF--7LJF-JF7F-7FJLJLJF77F--JF-JL7|F---JLJLJF7LJFLJFJL---7LJFJL7JLJ-7-F----77L-JL--JF-J|LJ|FJF7L7|F--JF7L--J|||||FJF7L-7F7LJFJ|||JLF7
F.J7FLLJFL-7|F-JF7|||FJ|F7F7FJL7L---JF-7LJL7JF7F7F-JL7FF-7L----7||FL-7L7J.L-FL---7L-7|F----JF-JF7||FJL-JLJF-7|L----JLJLJL-JL-7|||F7L---77-FJ
LF|-F7.F---J|L7FJ|||||FJ||||L-7L-----JFL7F-JFJLJ||F-7L7L7|F--7J||7JJL|FJL7|.LJ|F-JF7L-JF7F7FJF-JLJLJF--7F7|FJ|F---7F7F7F-----JLJLJ|F---J.LLJ
.F||L|.L---7L7|||LJLJLJFJLJL-7L--------7|L--JF-7LJL7L7L-JLJF7||||JL--LJ7FJF.7FFL-7|L7F7||||L7L7F----JF7LJLJL-JL--7|||||L----7F7F-7|L---7F7JJ
.L----F-J-FL7|LJF7F----JF7F-7L--7F-----JL----J.L-7FJ.L7F-7FJLJ-LJ||.L|J|J.LLJF-F-J|L|||||||FJ7LJF7F--JL----7F--7FJ||LJL7F7F-J|||FJL-7F7|FL|J
.L7L7-J-LF--JL7L||L-----J||7L--7LJF---7F7F7F7F--7|L7F7LJ.LJF7F|FLJ-F.|7J|.77F77L-7L7||||||LJ7F7FJ|L-7F----7|L-7|L7|L-7FJ||L--JLJL-77LJLJ7F|J
JLJ7||F||L-7F7L-JL7F7F7F7LJF7F7L-7|F--J|LJLJLJF-JL-J||F7F--JL-77|L7JFLF-L7LL7J||L|FJLJLJLJ-F7||L7L-7LJF---JL-7|L-JL--JL-JL7F-7F--7L-7-J||F7J
L|L-7JFFF7-LJ|F7F7LJLJLJL-7|LJL-7LJL---JF7F---JF7JF7|LJ||F--7FJL7JL-7F||L.-FJ-|LFLJF|J|F77FJ||L-JF-JF7L-----7|L-----7|-F-7|L7||F7L7FJ|||-J|7
F||FF7FF|L--7LJLJL-------7|L---7|F7F----JLJF---JL-JLJF7LJL-7LJJ7|.|J|FF|FF7|L-|JF7F7F7FJ|FJFJL-7FJF7||F7-F--JL7F---7L7FJFJL-JLJ|L7LJJ-FF7L|7
LL-FL77JL--7|LF7F--7F----JL---7|||LJF7JF---JF--7F-7F7|L7F7FJF7JFF-LFF-7J-JL.|JL-|LJLJ|L7|L7|F--JL-JLJLJL7L---7|L-77L7|L7|JF7|F-JFJ-LL7|--7|J
|7.-7.|7F--JL7|LJF7LJF7F-7F7F7LJ|L--JL-JF--7L-7||FJ|||FJ||L-JL-7--FFL7|.||.F-.LFL--7FJFJL-J|L-7F7F7F-7F7L---7|L7FJF7LJFJL-JL7|F-JF7J|FJ.|--7
F7L-|-LL|F--7|L7FJS7FJLJJ||||L-7L---7F-7|F7L--JLJL-JLJ|FJ|F----JFF--7||7J.7L|-F|-LFJ|7L---7L7.LJLJLJF|||F--7LJFJL7||F7|F---7LJL--J|LJJ..L77J
77LF-JFFLJF-JL-J|F-J|F---J|||F-JF7F7LJF|LJL--7F7F7F--7LJFJL--7F77|F7LJL7L--F7.-F77L7|F7F77L7L-7F7F--7||LJF7L-7L--J|||LJL--7L7F7F-7L7|7-|7L7.
FFJ|L.FJ|F|F-7F-JL-7|L----JLJL--JLJL--7L--7F7LJLJLJF-JF7L---7LJL7LJL7F-J-|-JJ7.||-|||||||F7L-7|||L-7|LJF-JL--JF7F-JLJF7F--JFLJ|L7L-J7F7|JFL-
LJFJ-LL7FLLJ.||F--7||F-----7F7F7F-7F-7L--7LJL--7F--JF7|L---7L7F-JF--JL7JJ|||LF-|L--JLJLJLJL--JLJL7FJL7-L------JLJF---J||F--7F7L7L7F-7J7J7-LJ
||LJ.|L7.|7F-|||F7LJ|L----7|||||L7|L7L7F7|7F7F7LJF7-|LJF7F-JLLJJ7L--7FJ.F-7J-LFL---7F7F----7F---7|L-7|F7F---7F---JF--7LJ|F-J||FL7LJFJ.|.--LF
LL7.F|.|FFLJJLJLJL--JFF---JLJLJL-JL-JL|||L-JLJL-7|L7|F-JLJF-7F7F7F7FJL--JFJJ.|.F---J|||F---J|F--JL--JLJ|L--7LJ-F7||F7L--JL--JL-7|F-JLFF-L-7J
FJ7.||-FJ||7.LF---7-F7L7F7F7F-7F7F---7LJL--7F---JL7||L7F7FJFJ|LJ||||F7F7FJL-77-L7F7FJLJL-7F7|L----7F--7L---JJF-JL-J|L7F-7F7F---JLJ||.L|.|.|7
FLFL-77.|FFJ.|L7F7L7||FJ|LJLJJLJ|L7F-JF7|F7||F--7FJ||FJ|||FJ7L-7||LJ|||LJJ|L.|LLLJLJF----J|||F-7F7||F7L----7FJF7F7FJJLJL|||L--7F7LF-7JJ-7F-7
J.JJ.|7F7LJ.LF7LJL7|||L-JJF----7L-JL-7||FJ|LJ|F-JL7LJL7|LJL7F7FJ||F-JLJF7||JF|.FF--7L-7F-7|LJL7LJLJ||L7F---J|FJLJ||F7JF7LJ|F--J|L-7JJJ..|LJ|
LF|J|.FL77L||||F7FJLJ|F7F-JF7F7L-----J||L7L7L||F--JF7FJ|F7FJ||L7|||F7JFJL7F7FF7LL-7|F7LJ|LJFF7L---7|L7LJF7F-JL--7LJ|L-JL-7LJF-7|F-J.F77-J7.|
.LJ-L-77FF---J|||L--7||||F-JLJL-----7FJ|FJFJFJLJF7FJLJF||LJL||||LJLJ|FJF-J|L7||F-7|LJL7F7F--JL---7LJ|L--JLJF----JF7|F----JJFJFJ||F7F7|F7LLFJ
F||F|-F-LL---7LJL--7||||LJF-7F------J|FJL7|JL7F-JLJF---JL--7|L7L-7F-J|FJ-FJFJ||L7|L7F-J||L--7F7F7L---------JF-7F7||||F--7F7L7L7|LJLJL--7.|LJ
F|77|-|LJF7F7L----7||||L7JL7|L-7F----JL--JL7FJL7F7FL-7F----JL7|F-JL7-|L-7|FJFJL-J|FJL-7||F7|LJLJL--------7F7L7||LJLJLJF-J|L-JFJ|F--7F7FJ.L7|
FJ|L.F-7-|LJ|F---7|LJ|L7|F7|L-7LJF----7F7F7LJF-J||F7F|L--77F7||L7F7L-JF-J|L7|F--7LJF--J|||L-7F7F7F7-F7F--J|L-JLJF-7F--JF7|F-7L-JL-7LJ||J|.L.
L-J-F7.J.L-7|L--7|L-7L7||||L-7|F7L---7LJ|||F7L7FJLJL-JF-7L7|LJL7LJ|F7FJF7|FJLJF7L-7|F7-|||F7LJLJLJ|FJ|L---JF7F7FJJ|L---JLJL7L-7F-7L-7LJ-7-|7
L77FFL7LF--JL-77|L7JL7LJLJ|F7||||F--7L-7LJLJL7LJF----7L7L-JL--7L7FJ|||7||||LF-J|7FJ|||FJ|LJL-----7||FJJF7F-JLJ|L-7|F-7F----JF7LJ7|F-J7JFL7||
.|FF7J7LL--7F7L7L7L77L7F-7LJ||LJ|L-7|F7L7F7FF|F7L---7|FJLF7LF7L7|L7|LJFJ||L7L-7L7L7|||L7L7F-7F---JLJL-7||L---7L--JLJ.|L-----JL7FFJL--7-J-L-7
|-FJ||F7.F7LJL7L7|FJF7LJFJF7|L-7|F-J||L7LJL7FJ|L7F7FJ||F7|L7|L7||-|L77L7LJFJF-JFJFJLJ|FJFJL7|L---7F--7LJL----JF---7F-JF7F7F--7L7|F7F-JJ-7L-J
LLL7L-J|FJL--7L7LJL-JL--JFJ|L--JLJF7LJFL---JL-JJLJ|L7||||L7LJFJ|L-JFJF7L7FJJL-7|FJF--JL7|FFJ|F---J|F-JF7F--7F-JF--J|F7||||L-7L-JLJ|L-7F-JFJ|
J.LL--7|L-7F7L7L7F----7F-J7L--7F7FJL----7JF7F----7L-JLJ|||L-7L7L-7FJFJ|FJL7F--J|L7|F7FFJL7L7|L----JL7FJLJF7LJF-JJF7LJLJLJL-7L---7L|F-JJF7.FJ
|7|LF-JL-7||L7L-J|F---J|F-----J|||F-----JFJLJF---JF-7F7||F-7L7|F-JL7L7LJF-JL--7L-J||L7L-7|FJL7F7F7F-J|7F7|L--JF-7|L-------7|F--7|7LJ.|LLF7J7
|-LJL7F--JLJ|L---JL7F7FJ|F-7F-7|LJL7F7-F-JF--JF--7L7||||||FJFJ|L-7FJFJF7|F7F7-L-7FJL7|F7|||F7LJLJ|L-7|FJLJF7F-JFJ|F-------J|L-7LJJFL-7.|JF--
7|LF-JL--7F7F-----7|||L7LJFLJLLJF-7LJL7|F-J-F7L7FJFJLJ||||L7L7L--JL7|FJLJ||||F7FJL7FJLJLJ|LJL--7FJF7LJL7F7|||F-JFJL7F---7F7L-7L7LJ77L|F|FJJ|
L7.L-7F--J||L----7|LJL-JF----7F7L7L--7LJL---J|FJL7L--7|||L7L7|F7F-7||L-7FJ|||||L7FJL7F7F7L7F7LFJL-JL--7LJLJ||L--JF7LJF--J|L-7L-J.|LJ-L-JFJF|
FFF--JL--7||F7F7FJL--7F7L---7LJL7L--7L7F7F-7FJ|F-JF7FJLJL7|FJLJ||FJ||F-JL7LJ|||FJ|F7LJLJL7||L7L7F7F---JF---J|F---JL--JF7FJF7L---7.|J|LL7F--7
|JL---7F-J||||||L--7FJ||F7F7L--7L---JJLJ||FLJF||F-J|L7F7FJ|L7F7LJL7LJL7F7|F-J||L7||L--7F7||L7|-LJ|L7F-7L----JL7F7F7F--JLJFJL----JF-.J|JF-FJ.
L.|F--JL--JLJLJ|7F-JL-J|||||F-7|F7F7F7F7LJF---J|L7FJ-||LJ.L7LJ|LF7L7F7LJ|||F7|L7|LJF--J|LJL-J|F-7|FJL7|F7F-7F-J|||LJF--7FJF7F77F7-7-JF-L.J-7
F-LL-7F7F-7F7F7L7L7F7F7LJLJLJFJLJLJLJLJL-7L---7L-JL-7||F7F7|F-JFJL-J|L--J|LJ|L7||F-JF-7L-7F--JL7||L-7|LJLJ-LJF7|||F-JF7LJFJLJL-J|.F7LJL|FJF|
F7.F-J|||FJ|LJL7|JLJLJL-----7|F7F77F7F---J|F7F|F7F7FJ|||LJ|||F7L---7|F7F-JF-JFJ|||F7L7|F-JL-7JFJ|L7FJ|F------JLJLJL--JL7||F-----J7JL7JFFJF-7
LJ-|F7|LJ|FJF--JL-----------JLJLJL-JLJF---7||FJ|LJ||FJ|L-7|||||F--7|LJ|L-7L7FL7||||L7|||F7F-JFJFJ.|L7LJ.F-----7F-------JFJL----7F77JLFFL-LJ|
L|FJ|LJF-JL7|F7F----------7F7F-7F--7F7|F--J||L7|F7LJ|FJF7||||||L-7||F-JF7|FJF7|||||FJ||LJ||F7L7|F7|FJLF7L----7|L--------JF7F---J|L77F7JFFJJ7
FL|FJF7|F--JLJLJF---7F-7F-J|||FJ|F-J|||L-7FJ|FJ||L7FJ|FJ||LJ||L7FJLJL7FJ|||FJ|||||||FJL7FJ|||FJ||||L7FJL7F7F7||F-7F------JLJ|F--JFJF7J.L7F77
LLLJL||LJF7F-7F-JF7FJL7|L--JLJL7|L7FJ|L-7||JLJFJ|FJL7|L7LJF7||||L---7||L|||L7|||||||L-7||FJ||L7LJ|L7|L-7||||||LJFJL----------JF7FJFJL-7LLFJL
L7FF7|L--J||FJL7FJ|||FJL----7F7||FJL7L7FJ|L-7|L7|L--J|FJJFJ||L7|F7F-J||FJ||FJ||||LJL7FJLJL-JL7|7FJFJ|F-JLJ||LJF7L-7F----7F-7F-JLJ7|F--J7.|.|
F--JLJF--7LJ|F7LJFJL7L-----7LJLJ||F7|FJ|FJF7|F-JL7F-7LJF7L7LJFJLJ|L-7LJ|FJ|L7|||L7F7||F7F7F--JL7|FJFJL-7F-JL--J|F-JL77F7LJ|LJ-F---JL7.|7L77F
|F---7|.FJF7LJL7FJF7L------JF7F-J||||L7|L7|||L-7FJL7L-7|L-JF7L--7L7FJF-JL7L7|||L7||LJLJLJ||F7F7||L7L7F7|L7F7F7FJL--7L-JL--7F--JF-7F7L-7-7.F|
LJ-F-JL7L-JL--7LJFJ|F7F7F---J|L-7||LJFJL7||||F-JL-7|F-JL--7|L7F-JFJ|.L7F7L7||||FJ|L-7F7F-J||||||L7L7|||L7||LJ|L--7FL7F7F--J|F--J-LJL--J-|-LJ
LLFJF--JF--7F-JF7L7LJ||LJF---JF7|||FFJF7|LJLJL7F-7LJL7F7FFJL7|L-7L7L7-||L7|||LJ|FJF-J||L-7||LJ||FJFJ|||FJ||F-JF-7|F-J||L-7|||F--------7--JL|
F-L7L7..L-7LJF7|L7L-7LJF-JF7F7||||L7|FJLJFF---JL7L7F7LJL7L7FJ|F-JJL7L7LJLLJ|L7FJL7L-7||F-J|L-7LJL7||LJ||FJ|L-7L7||L7FJ|F7L-JLJF7F-----J7.L||
JJFL7|7LL7L7FJ|L7L7FJF-JF7|||LJ||L7||||F--JF7F--JFJ||F7FJF|L7|L-7F7L7|FF--7|FJL7FJF-J||L7FJF7L--7|L--7||L7L7FJFJ||FJL7||L7F7F7||L-7F-7LF-7-7
|7L7||J-LJ.|L7L7L7||FJF-J|||L7JLJL|||L7|F7FJ||F-7L7||||L-7L7||F-J||FJL7|F-J||F7LJFJF7||FJ|FJL-7FJL-7FJLJLL7|L7L7LJ|F7|||FJ|||LJL--J|FJJL7|L|
JJ|FLJ|LJ7LL-J.L7|||L7|-FJ|L7L---7|||FJLJLJFJLJFJFJ||||F7L7||LJ7FJLJF7LJL7L|LJL-7L7|||||FJ|F--JL--7|L--7.FLJ-L7|F-J|||||L7||L---7F-JL7.|F|-J
|.-J.F7LJJLLLF--J|||FJ|FJFJFJF7F7|LJ||F7F--JF-7L7L-J||||L7||L7F-JF-7|L7F7L7L7F7FJFJ|||LJ|FJL7F7F7FJ|F-7L7F----J|L7FJLJ||FJ||F7F7LJF-7|7FL7.L
-J.|F|7-7.F-JL--7|||L7|L7||L7||||L-7|||LJF-7L7L7L7F-J||L7LJL7|L-7|.|L7|||FJFJ|||||FJ|L-7||F7LJ||LJ.||FJFJL7F--7|F||F7JLJ|FJ||LJ|F-J|LJ|F|L7J
...|LLJLL7.|.|LLLJLJFJ|FJ|F-J|||L-7|LJL--JJ|FJ7L7|L7FJ|FJF--JL7FJ|FJFJ|||L7L7||L7||FJF-J|||L--JL--7LJ|FJF7||F-J|FJLJL7F-JL7|L-7|L7LJ7JFFF.-.
|-F7-FLL|-LJ77|.LJJJL7|L7|L7FJ|L-7LJF------J|FF7LJFJ|FJL7|F--7|L7|L7L7||L7|FJ|L7|LJL7L-7LJL7F-7F-7L-7LJJ|||||F7|L--7FJL7F7||F7||FJ-F|7J||FJ7
|F|J.L.F-7|LJ-LJJ.|.L|L7||FJ|FJF7L-7L-7F---7L7|L-7L-J|F7||L7FJL7|L7|FJ|L7LJL7|FJL7F-JF7L-7FJL7|L7|F7L---J|||LJ||JF7LJF-J|||LJ||LJJFLJJLFJLJJ
|LJL-J--|L-F7JL7J-F7||FJ||L7|L7||F7L7FJ|F--JFJL-7L---J||||FJ|F7||FJLJ|L7L--7||L-7|L7FJ|F-JL7FJL7||||F7F7FJLJF-JL-JL7L|F-J|L7.|L7J.|J7FFJ-|L|
FL7JLF.LF77.L-FJ7.777||LLJJLJ7||||L7||FJL-7FJF--JF---7|LJLJFJ|||||F-7F-JF--JLJF-J|FJL7|L--7||F-J|||LJ|||L-7|L7F7F-7L7LJF-JFJ-L7|77J|FFFJF---
-F.FJLF7L7|7|.FL|7J|-LJ-F-----J|LJ|LJLJF--JL7L7F7||F-JL--7FJFJ|||LJFJL-7L----7L7FJL-7||F-7|||L-7||L-7|||F7|F-J||L7L7|F7L-7L7JL||||7|FLFF7L7.
.-|L7|F|-J--77JLJLF|7FJLL--7F-7L------7L--7FJFJ|||FJF7F7FJ|FJFJ|L-7L7F-JF-7F-J|LJF--J|||7LJLJ|FJ||F7|||||LJL7FJ|FJFJLJL-7L-JLFLJ77F77.||LFJJ
.FL|.-JL7|.JL77|JF||-L7F---J||L7F-----JF--J|FJFJ||L-J||LJL||-L7L7FJFJL7FJFJL----7L-7FJ|L---7F-JFJLJ||LJ||F7FJ|FJL7|F-7F7L-7J7JFLJ77LL-FL-JJ|
F|--7|7-|-7|7JLLJL7JF|-L---7|F-JL-----7L7F7|L7|.LJ-F-JL--7||F-JFJL7|F-JL7L7F7F7FJF-JL7|F-7FJL7FJFF-JL7FJLJ|L7||F7||L7LJ|F-JJ7.||-|F-L--F.|JF
-7-L7LJ7|.F|L-J.F.L--77J|.FJ||F7F7F---JL||||FJL7JF-JF7F7FJLJL-7|F7LJ|F7FJF||||||FL7F-J||FJ|F-JL-7L--7||F--JJ|||||||FJJ.|L7|F7-JF-LJFF7L-7L-7
||F7L77L7.-7-77L||J77LF-7F|FJ|||||L7|-|JLJ|||F7|FL--J|||L7F---JLJ|F7LJ|L-7LJ||||F7|L-7||L7||F7F7L7.FJ||L7-F-J|LJLJ||J--L-J7LJ--F-|LLJ-.F77LF
--7.FL-FJ.L.|FFJ|7.|FFL7LLLJ.LJ||L7L-77-|JLJ||LJF----J|L-JL7F-7F7LJL-7L7FJLFJ||||LJF-J|L7||||||L7L7L7|L7|JL7FJ.LLL|L77L|J.|7|7.F--L7J-FF||.7
L|L7J.LJ-7F|7.F7.|FJ-|FL.LJJ.LFJ|FJF7L7J.-F-JL7FJF7F-7L-7F-JL7|||F--7L7LJF-JFJLJ|F-J.LL7|LJ||LJFJFJ-LJ.LJ|F||J7.|L|FJ7F|-J|-|--J.|.F7-|L|LJJ
.L7JL7F||LL7LL7L7LJ|--7.|J|7F7L7|L7||FJ7FFL-7FJL7||L7L7FJ|F7FJ|||L-7L-J|.L--J7JF|L7.JJL||JFJ|LLL-JJ||-LLJ-FLJ.F--.LJJ|F|7F|J|7J7L|7|LJJF-7F-
7JFJLFFJ|JLJ|FL7.L-L-LLL-F-LL-FJ|J||LJ7L|JLL||J-LJL-JJ||FJ|||FJ|L-7L-7JL7|JJ-J-7L-J7J7FLJLL7|L|LL7.LF-7J|L77L|L|L7L|-J-7J7.F-JF|FLL7LF-J|.J|
7|F7.-J.||F|FJ.|.F-J.--7-F-|7FL-J-LJ|.JFJ.|LLJJL||F---J|L-J||L7L7FJF-J.L-J|7.L|7-J-JFL7LJ.LLJ7-JFJ7LFJJ-F-.F.7-|7F7|FJF|.F-7J.|LJ-||-7J.-F-|
L|7-7|F7--FF7--JF-7L7.|77|L|FJL|.7LJFJ.|L7F|-L.F|FL---7L7F-J|J|FJL7L-77J|-|--.LL-J.F|7||.LL|F77.|-FF7JJF-7-|7||JFFL-|.FJ7.7LFF-FJLLJJ.L-7.7-
LLF--FF|F7-JJF|.|FJJFL7LF7-|.J--.L-F7.FJF|-77|.FLLJ7.F|FJL-7|FJL-7|F7|JFJ|J|JL--.L7JLJ7|.L|L-JF7|.FJ|.L777FJ-77|-7J-J-JL77|-F|7.F-7JL7-|7|.L
|-|7|.|F7L|JFF7-.L.||-L.FJ.L.J7|FFJ||.|--|-FJ-7LLLL|.FJL7F7||L7F-JLJLJLJ-J.J7F777.||7FFF7F7LLJL.L-J7L7F||7LL7LF-JL--L7.L-J|FFJ-|7FF7FL7-|7J|
FF--7FLLJF|7FF-.|.-7|7LF7J-L7|L-JJ7|77JJ..LL7F|FL|.L-L7FJ|LJL7||.F7JJJ..L|7J-FF7F|||FLLFFF|.|7|-|.F-JF-LL-F7L-JF-J77F-|7J-F.|JJLJJ|F||L|.|-J
F77|LF|7F7L77L|.J.|JL|-7||LLFFJJJ7FJ||--7F7.FL-|FJ77|-LJFJF7FJ|L-J|7FFJ7F-7--L|7F--|J.F---J-F7J--7|.F|J-7F7J.J.FL.FFFJ|7LF-7L7.J|F|L||-L-77|
L-JJL-JJJL7JL-L-JJJFJJLF-L-.F7.|LLL--J7J-LFL7L|JJJF-J7..L-JLJJL---J-LF-LJJL7.LLJJJJJLJ.L|J-LFLJL-L--|JJ-LLJL|J-|.-J|.L|JL|JJ.FF--7L-FJ-LJ.J-

140
10/lines.txt Normal file
View File

@@ -0,0 +1,140 @@
............................................................................................................................................
..................................┌─┐.......................................................................................................
................................┌┐└┐└┐......................................................................................................
................................││┌┘┌┘......................................................................................................
...............................┌┘││┌┘........................................................┌┐....┌─┐......................................
...............................└┐└┘└─┐...........................┌┐..........................││..┌─┘┌┘......................................
................................└─┐┌─┘.........................┌┐││..........................││.┌┘┌─┘.......................................
..............................┌───┘└──┐.......................┌┘│││.┌┐..................┌┐┌──┘└┐└┐│.........................................
..........................┌┐..└┐┌┐┌───┘.............┌─┐.┌┐┌┐..└┐└┘│.││............┌┐...┌┘││┌─┐┌┘.││.........................................
........................┌─┘│┌┐.└┘│└─┐...............└┐└┐│││└┐┌─┘┌─┘┌┘│...........┌┘│┌┐┌┘┌┘└┘.││┌─┘│.........................................
................┌┐......└┐┌┘│└─┐.│┌┐└┐.......┌┐..┌┐..└┐││││┌┘└─┐│┌┐│┌┘┌┐.........└┐│││└┐│..┌┐│││┌┐│┌┐.......................................
................││.┌┐...┌┘│.└─┐└─┘│└─┘..┌┐...││.┌┘└┐┌─┘└┘└┘└┐┌─┘││└┘└─┘└┐....┌┐..┌┘││└─┘└┐┌┘└┘│││└┘││.......................................
.............┌┐.│└┐││...└┐└──┐└──┐└┐┌┐┌┐││.┌┐││.└─┐│└──┐┌───┘└┐┌┘│┌─────┘┌┐┌─┘│┌┐└┐││┌───┘└──┐│││.┌┘└──┐....................................
.............││┌┘┌┘││...┌┘┌──┘┌──┘┌┘││││││.│└┘└┐.┌┘└┐┌─┘└──┐┌─┘└─┘└────┐.││└┐┌┘│└─┘└┘└┐┌┐..┌┐│└┘│┌┘┌───┘.......┌┐...........................
.............││└┐└┐│└┐┌─┘┌┘.┌┐└──┐└┐│││││└┐└┐┌─┘┌┘┌─┘└────┐│└─┐┌──┐┌───┘┌┘└┐│└┐└──┐┌─┐│││.┌┘└┘┌─┘│┌┘┌─┐...┌┐.┌─┘│...........................
............┌┘└┐└┐└┘┌┘└─┐└─┐│└┐┌─┘┌┘│││││┌┘.││.┌┘┌┘.┌┐┌─┐┌┘└┐┌┘└─┐└┘.┌┐.└─┐││┌┘┌─┐└┘┌┘└┘└┐│┌─┐│┌┐││┌┘┌┘┌┐.││.└┐┌┘..┌┐.......................
............└─┐│.└─┐└┐┌┐│┌─┘│┌┘└─┐│┌┘││└┘│.┌┘│┌┘┌┘┌┐│└┘┌┘└─┐└┘┌──┘┌┐┌┘└┐┌─┘││└┐└┐└┐┌┘┌┐┌┐│└┘┌┘└┘││└┘┌┘┌┘└┐││.┌┘│┌┐.│└─┐.....................
............┌─┘└──┐└┐││└┘│.┌┘└┐┌─┘└┘┌┘└─┐└┐└┐└┘┌┘.││└┐┌┘┌──┘┌┐└─┐.│└┘┌─┘└─┐││┌┘.└┐│└─┘└┘│└┐.└┐┌┐└┘┌─┘.│┌─┘││.└┐││└┐└┐┌┘.....................
............└┐┌──┐└─┘│└─┐└┐└┐┌┘└───┐│┌┐.│┌┘.└┐┌┘┌┐││┌┘└┐└┐┌─┘│┌─┘┌┘┌─┘┌─┐┌┘└┘└┐┌─┘└┐.┌──┘┌┘┌┐└┘│┌─┘┌─┐││┌┐│└┐┌┘└┘┌┘┌┘│......................
.............└┘┌┐└─┐┌┘┌┐│┌┘┌┘└┐┌┐┌─┘│││┌┘└─┐┌┘└┐│││└┘┌─┘.└┘┌─┘└─┐└┐└┐.│┌┘│┌───┘└──┐└┐└──┐└┐│└─┐│└─┐└┐└┘│││└┐│└┐┌─┘.└┐└─┐....................
........┌┐┌┐┌┐┌┘└┐┌┘└─┘└┘└─┘┌─┘│││┌┐└┘│└┐┌─┘└┐┌┘││└─┐│.┌┐┌┐└─┐┌─┘┌┘┌┘┌┘│.││┌┐┌┐┌┐┌┘┌┘┌─┐│┌┘│┌─┘│┌─┘.└─┐└┘└┐││┌┘└┐┌┐.│┌─┘┌┐..................
........│└┘│││└─┐│└┐┌────┐┌─┘┌┐││└┘└─┐└┐│└┐..││┌┘└┐┌┘└┐│││└──┘│┌┐│┌┘┌┘┌┘┌┘││││││││┌┘.└┐└┘└─┘└┐┌┘└──┐┌─┘┌┐┌┘│││┌─┘│└┐│└──┘└┐.................
........└─┐└┘│┌┐││.└┘.┌─┐│└─┐│││└┐.┌┐│┌┘└┐└┐┌┘└┘┌─┘└┐┌┘││└───┐││││└─┘┌┘.└┐│││││││││...└────┐┌┘│┌───┘│┌─┘└┘┌┘└┘│┌┐└┐││┌────┘┌┐...............
........┌┐└─┐└┘└┘└───┐│┌┘└─┐└┘│└┐│┌┘│││┌┐└┐└┘┌──┘.┌┐││.││┌┐┌─┘└┘└┘┌──┘┌──┘└┘││└┘││└┐.┌┐.┌──┘│┌┘│┌─┐┌┘└┐.┌┐└┐┌─┘│└┐│└┘└───┐┌┘│.....┌┐........
......┌─┘└──┘┌┐┌┐┌┐┌┐└┘└─┐┌┘┌─┘┌┘││┌┘││││.│┌─┘┌┐┌┐││││┌┘│││└───┐┌┐└─┐.└────┐│└┐┌┘└┐│┌┘└┐└──┐└┘┌┘└┐│└┐┌┘┌┘└┐│└─┐│┌┘└┐┌────┘└┐└┐┌┐.┌┘│........
......└─────┐│└┘││└┘└───┐│└┐│┌┐└┐││└┐│└┘│┌┘│┌┐│└┘│││││└┐││└┐┌┐┌┘│└─┐│┌─┐┌┐┌┘└─┘│..│││┌─┘.┌┐└─┐│┌┐│└┐││┌┘┌─┘└┐┌┘││┌┐││┌┐.┌┐┌┘┌┘│└┐└┐│........
........┌───┘│┌─┘└─┐.┌──┘└─┘│││.│││┌┘└┐┌┘└┐└┘││┌─┘││││┌┘│└┐││└┘┌┘┌┐└┘│┌┘││└───┐└┐┌┘└┘└┐┌─┘│┌┐│└┘││┌┘││└┐└─┐.││.│││││└┘└─┘││┌┘.│┌┘┌┘└┐.......
........└─┐┌┐│└┐┌──┘┌┘┌┐┌┐┌┐└┘└─┘││└┐┌┘│..└┐┌┘││┌┐││││└┐│┌┘│└─┐│.│└┐┌┘└─┘│┌┐┌┐│┌┘│┌───┘└─┐││││┌┐││└┐││┌┘┌─┘┌┘└┐│││││┌──┐┌┘││┌┐│└─┘┌─┘.......
.......┌──┘│││.││┌─┐└┐│││└┘└───┐┌┘│┌┘└┐└┐.┌┘│.│││││││└┐││└┐└┐.│└┐│┌┘└───┐└┘││└┘│.││┌──┐┌─┘└┘│││└┘│┌┘│││┌┘┌┐└┐┌┘│└┘└┘└─┐└┘.│││││┌──┘.........
.......└─┐┌┘└┘.└┘└┐└┐││││┌─────┘└┐││┌┐└┐└┐└┐│┌┘││││││┌┘││.└┐│┌┘┌┘││┌┐.┌┐└─┐│└─┐└┐│└┘┌─┘└───┐└┘└┐┌┘└┐│││└┐││┌┘└┐│┌────┐└─┐┌┘│││││┌─┐.........
.........└┘.....┌┐└┐│└┘└┘└┐┌────┐└┘└┘└┐└┐└┐│└┘┌┘│└┘│││┌┘└┐┌┘└┘┌┘┌┘││└─┘└─┐││┌┐│┌┘└─┐└┐┌┐.┌┐└─┐┌┘└─┐││││┌┘│││┌┐└┘└─┐┌┐└──┘└┐└┘└┘└┘┌┘.........
...............┌┘│┌┘└─┐.┌┐└┘┌───┘┌────┘.│┌┘│┌┐└┐└┐┌┘│││┌─┘└──┐└┐│┌┘└──┐┌─┘│└┘││└┐┌─┘┌┘││┌┘│┌─┘│┌┐┌┘└┘││└┐││││└────┘││.┌┐.┌┘┌┐┌┐┌─┘..........
...............└┐│└─┐┌┘┌┘└──┘┌┐┌┐└┐.┌┐.┌┘└┐└┘└┐└─┘└┐││││┌┐┌─┐│┌┘││┌──┐││┌┐└─┐││┌┘└─┐│.│││┌┘└─┐│││└──┐││┌┘│││└─┐┌──┐│└─┘└─┘┌┘│││└──┐.........
............┌───┘└──┘└┐└─────┘└┘└┐└┐│└┐└─┐└┐┌┐└─┐┌─┘│││└┘│└┐││└┐││└─┐││││└┐┌┘└┘│┌─┐││┌┘│││┌┐┌┘└┘│┌┐┌┘│││┌┘└┘┌─┘│┌─┘└┐┌──┐┌┘.└┘└┐┌─┘.........
............└───────┐┌┘┌┐┌───────┘┌┘│┌┘┌┐│┌┘││┌┐││┌┐│││┌─┘.││└┐│││┌┐││││└┐││┌──┘└┐│││└┐│││││└──┐│││└┐│││└┐┌┐└─┐│└─┐.│└─┐│└───┐┌┘└─┐.........
............┌┐┌┐┌┐┌┐│└─┘│└─┐┌────┐└─┘│┌┘│││┌┘││└┘└┘│││││┌┐┌┘└┐││││││││││┌┘││└─┐┌┐│││└┐│││││└┐┌┐││││┌┘└┘└─┘││┌┐└┘┌┐└─┘┌┐│└────┘│┌┐┌┘.........
...........┌┘└┘│││││└──┐│┌┐└┘┌───┘┌─┐│└┐└┘│└┐│└──┐.││││└┘│└┐┌┘│││││││└┘││.││┌─┘│└┘││.│││││└┐││└┘└┘└┘┌─────┘└┘└┐┌┘│┌┐┌┘│└─┐┌┐┌┐└┘└┘┌┐........
...........└┐┌┐└┘└┘│┌┐┌┘└┘│┌┐└───┐│┌┘└┐└┐┌┘┌┘└┐┌┐│┌┘││└─┐│┌┘│┌┘└┘││││┌─┘└┐│││┌┐└─┐││┌┘│└┘└┐││└───┐┌─┘┌┐┌────┐┌┘└┐│││└┐│┌─┘││││┌───┘└┐.......
............└┘└───┐└┘│└──┐│││┌──┐└┘└┐┌┘┌┘└┐└┐.││││└┐│└┐┌┘││┌┘└──┐││││└┐┌┐││││││┌─┘││└┐│.┌┐│││┌───┘│┌┐│└┘┌─┐┌┘└──┘└┘└─┘└┘┌┐│││└┘┌─┐┌─┘.......
.............┌┐┌┐.└─┐│.┌┐││││└─┐└───┘└┐└┐.│┌┘┌┘│││.│└┐│└┐│││┌┐┌─┘└┘││┌┘││││││││└─┐││┌┘└┐│└┘││└──┐┌┘││└┐.└┐└┘┌┐.┌┐┌┐┌┐┌┐┌┘││└┘┌─┘.│└┐........
...........┌─┘└┘└───┘└─┘└┘│││┌┐└─────┐└┐│┌┘│.│┌┘││┌┘┌┘│┌┘│││││└┐┌─┐││└┐│└┘││││└┐┌┘└┘└┐┌┘│┌┐│└┐┌┐││┌┘└─┘┌┐└─┐│└┐│││││└┘││┌┘│┌─┘┌─┐└─┘........
...........└┐┌─┐┌────┐┌──┐└┘└┘└┐.┌┐┌┐└┐└┘└┐└┐││┌┘│└┐└┐│└┐││└┘└┐└┘┌┘││┌┘│┌─┘││└┐││┌───┘│┌┘││└┐└┘││││┌───┘└──┘│┌┘│││└┘┌─┘││.│└──┘┌┘┌───┐......
...........┌┘│.└┘┌──┐└┘┌┐└──┐┌┐└─┘└┘└─┘┌┐.│┌┘││└─┘.│┌┘│┌┘│└──┐└┐┌┘.└┘└─┘│┌┐│└─┘└┘└┐┌┐┌┘└┐│└┐└─┐││││└────────┘└─┘└┘┌┐└──┘└─┘┌┐┌─┘.│┌──┘......
..........┌┘┌┘..┌┘┌┐└──┘└───┘│└────────┘└┐│└┐│└─┐┌─┘└┐│└┐│┌┐┌┘┌┘└───┐┌──┘││└──┐┌┐.│││└┐┌┘└┐└┐┌┘││└┘┌─────────────┐││┌──┐┌──┘│└┐┌┐││┌┐.......
..........└┐│.┌┐└┐│└┐┌┐┌─┐┌─┐│┌──────────┘└─┘└──┘│┌─┐││┌┘││││.│┌┐┌┐┌┘└──┐│└┐┌─┘││┌┘│└┐│└┐┌┘┌┘└┐└┘┌┐└─────┐┌─────┐││└┘┌─┘└─┐.└┐└┘└┘└┘│.......
...........└┘.││┌┘│.└┘└┘┌┘└┐└┘└────┐┌┐┌─┐┌┐┌─┐┌─┐│└┐││││┌┘│└┘┌┘│││└┘┌───┘└┐│└──┘│└─┘.││.││.└─┐│┌─┘└───┐┌┐└┘┌─┐┌┐││└─┐└───┐└─┐│┌──┐┌┐└┐......
............┌─┘│└┐│┌────┘┌─┘.┌─────┘│││┌┘│││┌┘│┌┘└─┘└┘││└┐└─┐└┐││└┐.└─┐┌─┐││┌┐┌┐│┌───┘└┐│└──┐││└─┐┌┐┌┐└┘└──┘.└┘└┘│┌┐└┐┌┐.│┌─┘│└─┐└┘└─┘......
............└─┐└┐└┘└────┐│┌─┐└─┐┌───┘││└─┘└┘└─┘└──┐┌┐┌┘│.└┐┌┘.└┘└┐│┌──┘└┐└┘││└┘└┘│┌┐┌┐┌┘│┌┐┌┘└┘┌┐└┘└┘└───────┐.┌┐└┘└┐└┘└┐│└─┐│┌┐└┐..........
..............└┐│┌┐┌┐┌─┐└┘└┐└┐┌┘│┌───┘└┐┌─┐┌┐┌┐┌─┐└┘│└─┘┌─┘└─┐┌──┘│└┐┌┐┌┘┌─┘└───┐││││└┘┌┘│└┘┌──┘│.┌─────┐┌┐┌─┘┌┘└┐┌┐└───┘│┌─┘└┘│┌┘..........
..............┌┘└┘└┘│└┐│┌─┐└┐└┘┌┘└─────┘└┐│││││└┐│┌┐│┌┐.└─┐┌─┘└──┐└┐└┘└┘.└┐┌─┐┌─┘│││└─┐└┐└─┐└──┐└┐│┌─┐┌┐└┘└┘.┌┘┌┐└┘└────┐│└──┐.│└─┐.........
........┌─┐...└────┐└─┘│└┐│.└──┘.┌┐┌┐┌┐┌─┘││││└─┘└┘│└┘└─┐┌┘└┐..┌─┘┌┘.┌┐┌──┘└┐│└┐┌┘││┌┐│┌┘┌┐│┌─┐└┐││└┐└┘└─────┘┌┘└────┐┌─┘└──┐└┐│┌─┘┌┐.......
........└┐└─┐..┌─┐.└──┐│┌┘└┐┌┐┌┐┌┘└┘└┘││┌┐└┘│└────┐└────┘└─┐└┐┌┘┌┐│.┌┘└┘┌─┐┌┘│┌┘└┐│└┘││└─┘└┘└┐│┌┘└┘┌┘┌┐┌┐┌┐┌┐┌┘┌┐┌──┐│└─┐┌┐.└─┘└┘┌─┘│.......
.........│┌─┘┌┐└┐│┌┐.┌┘││┌┐└┘└┘│└───┐┌┘└┘└┐┌┘┌┐┌─┐└┐┌┐┌┐┌┐┌┘┌┘└┐││└┐└─┐┌┘┌┘└┐││┌─┘└─┐│└┐┌────┘│└┐┌┐│┌┘││└┘└┘│└─┘└┘┌─┘└─┐└┘└─┐┌───┘┌┐│.......
......┌──┘│┌─┘└─┘└┘└┐└┐│└┘└┐┌─┐└────┘└────┘└─┘│└┐└┐└┘└┘└┘│└─┘┌┐││└┐│┌─┘└┐└┐┌┘││└─┐┌─┘└─┘└────┐│.└┘└┘└┐│└──┐┌┘┌────┘┌┐┌┐└────┘└─┐┌─┘└┘.......
..┌─┐.└──┐│└───────┐└┐││.┌─┘│.└─────────┐┌───┐└┐└┐└┐┌┐┌─┐└───┘│└┘.││└┐┌─┘┌┘└┐└┘.┌┘│┌───┐┌──┐.││┌┐┌┐┌┐│└───┘└┐└─┐┌──┘└┘└┐.┌┐.┌┐┌┘└───┐.......
..└┐└───┐││┌┐┌┐┌┐┌┐└┐││└┐└──┘┌┐┌────────┘│┌──┘.└─┘┌┘││└┐└────┐│┌──┘│.││┌┐│┌┐└─┐┌┘┌┘└──┐└┘┌┐│┌┘│││││││└───┐┌┐└──┘│┌─┐┌─┐└─┘└┐│└┘┌──┐┌┘.......
┌──┘┌──┐└┘│││││││││.││└┐│┌┐┌┐││└───┐┌────┘└┐┌┐┌┐┌┐└┐│└┐│┌┐.┌┐└┘└┐┌┐└┐││││└┘└┐┌┘└─┘┌┐┌┐└─┐│└┘└┐│││││││┌┐┌┐└┘└─┐┌─┘└┐│└┐└────┘│┌─┘┌┐└┘........
│┌─┐│..└─┐││││││└┘└─┘└─┘└┘└┘└┘└┐.┌─┘│┌─────┘│││└┘│.└┘.└┘│└─┘└┐┌┐││└┐││└┘└┐┌┐││..┌┐││││┌─┘│┌─┐│││└┘└┘└┘└┘│┌───┘│┌──┘└─┘.┌┐.┌┐│└──┘│┌─┐.......
└┘.└┘...┌┘└┘└┘└┘┌┐┌─┐┌┐┌─┐┌┐┌─┐└┐└──┘└───┐┌┐│││┌┐└──────┘┌┐┌─┘│└┘└┐││└┐┌┐└┘││└┐┌┘└┘│││└─┐│└┐│││└┐┌┐┌───┐└┘┌┐┌┐│└───┐┌──┘└┐│││┌───┘└┐│.......
....┌┐┌┐└─┐┌┐┌─┐│││.││││┌┘││└┐└┐└───┐┌┐┌┐└┘└┘│││└──────┐┌┘│└─┐└┐┌┐││└┐│││┌┐││┌┘└──┐└┘└──┘└─┘└┘└─┘│└┘┌──┘┌─┘└┘└┘┌┐┌┐└┘┌───┘│└┘└┐┌┐┌─┘└─┐.....
..┌─┘└┘└──┘│└┘┌┘│││┌┘│││└┐││┌┘.└┐┌─┐└┘└┘└───┐└┘└┐┌┐┌──┐└┘.└──┘┌┘││││┌┘││││└┘││..┌─┘┌┐┌┐┌─────┐┌┐┌┘.┌┘┌─┐│┌─┐┌─┐│└┘│┌┐└─┐┌┐│┌──┘│└┘┌───┘.....
..└┐┌─┐┌─┐┌┘┌─┘┌┘└┘└─┘││.││││┌──┘└┐└─┐┌─┐┌┐.└──┐└┘└┘┌┐└──────┐│┌┘│││└┐└┘││..└┘┌─┘┌─┘││└┘.┌───┘│││┌┐└┐│.└┘│.└┘┌┘└┐.└┘└──┘│└┘└─┐.│┌─┘┌───┐....
...└┘┌┘└┐└┘.└┐┌┘.┌────┘└┐││││└────┘┌─┘│┌┘│└───┐│┌┐┌─┘│┌─┐┌─┐┌┘└┘.││└┐│..││....└──┘..│└┐┌─┘┌──┐││││└┐└┘┌─┐└──┐└─┐└─┐┌┐┌┐┌┘┌──┐└─┘└┐┌┘┌──┘....
.....└┐┌┘┌──┐└┘┌─┘┌┐┌─┐┌┘└┘└┘┌┐.┌──┘┌─┘└┐│┌───┘└┘└┘┌┐└┘.└┘┌┘└───┐└┘┌┘└┐.└┘...┌────┐.└─┘└──┘┌─┘│└┘│┌┘┌┐└┐│┌──┘┌┐└──┘│││││┌┘┌┐└─┐┌┐└┘┌┘.......
......└┘.└─┐│┌─┘┌┐│││┌┘│┌┐┌┐┌┘└┐└───┘┌─┐└┘└┐.┌┐┌┐┌─┘└┐.┌─┐└────┐│..└─┐└┐.....└───┐└─┐.┌────┘┌─┘┌┐││┌┘└─┘└┘┌─┐│└────┘└┘└┘└─┘└─┐│││┌┐└───┐....
.......┌───┘│└┐┌┘│││││┌┘││││└─┐└─────┘.└┐┌─┘┌┘└┘││┌─┐└┐└┐│┌──┐.││....│┌┘.......┌─┘┌┐└─┘┌┐┌┐┌┘┌─┘└┘└┘┌──┐┌┐│┌┘│┌───┐┌┐┌┐┌─────┘└┘└┘│┌───┘....
.......└───┐└┐││.└┘└┘└┘┌┘└┘└─┐└────────┐│└──┘┌─┐└┘└┐└┐└─┘└┘┌┐│.││....└┘........└─┐│└┐┌┐││││└┐└┐┌────┘┌┐└┘└┘└─┘└──┐│││││└────┐┌┐┌─┐│└───┐....
...........└┐│└┘┌┐┌────┘┌┐┌─┐└──┐┌─────┘└────┘.└─┐┌┘.└┐┌─┐┌┘└┘.└┘..............┌─┘│.│││││││┌┘.└┘┌┐┌──┘└────┐┌──┐┌┘││└┘└┐┌┐┌─┘│││┌┘└─┐┌┐│....
.........┌──┘└┐.││└─────┘││.└──┐└┘┌───┐┌┐┌┐┌┐┌──┐│└┐┌┐└┘.└┘┌┐..................└─┐└┐││││││└┘.┌┐┌┘│└─┐┌────┐│└─┐│└┐│└─┐┌┘││└──┘└┘└─┐.└┘└┘....
.........└─┐┌┐└─┘└┐┌┐┌┐┌┐└┘┌┐┌┐└─┐│┌──┘│└┘└┘└┘┌─┘└─┘││┌┐┌──┘└─┐..................│┌┘└┘└┘└┘.┌┐││└┐└─┐└┘┌───┘└─┐│└─┘└──┘└─┘└┐┌─┐┌──┐└─┐.......
........┌┐.└┘│┌┐┌┐└┘└┘└┘└─┐│└┘└─┐└┘└───┘┌┐┌───┘┌┐.┌┐│└┘││┌──┐┌┘..................└┘....┌┐.┌┘││└─┘┌─┘┌┐└─────┐│└─────┐..┌─┐│└┐││┌┐└┐┌┘.......
........│└──┐└┘└┘└───────┐│└───┐│┌┐┌────┘└┘┌───┘└─┘└┘┌┐└┘└─┐└┘..................┌┐┌┐┌┐┌┘│┌┘┌┘└─┐┌┘┌┐││┌┐.┌──┘└┐┌───┐└┐┌┘┌┘└─┘└┘│└┐└┘........
........└──┐│.┌┐┌──┐┌────┘└───┐│││└┘┌┐.┌───┘┌──┐┌─┐┌┐│└┐┌┐┌┘┌┐......┌─┐.........│└┘└┘│└┐│└┐│┌──┘└─┘└┘└┘└┐└───┐│└─┐.└┐│└┐│.┌┐.┌─┘┌┘..........
........┌──┘└┐│└┘┌┐└┘┌┐┌─┐┌┐┌┐└┘│└──┘└─┘┌──┐└─┐││┌┘│││┌┘││└─┘└─┐....└┐│.........└──┐┌┘┌┘└─┘│└─┐┌┐┌┐┌─┐┌┐└───┐│└┐┌┘┌┐└┘┌┘└─┘└┐│┌─┘┌┐.........
........│┌──┐│└┐┌┘S┐┌┘└┘.││││└─┐└───┐┌─┐│┌┐└──┘└┘└─┘└┘│┌┘│┌────┘.┌──┐││...........┌┘│.└───┐└┐.└┘└┘└┘.│││┌──┐└┘┌┘└┐││┌┐│┌───┐└┘└──┘│.........
........└┘┌─┘└─┘│┌─┘│┌───┘│││┌─┘┌┐┌┐└┘.│└┘└──┐┌┐┌┐┌──┐└┘┌┘└──┐┌┐.│┌┐└┘└┐.......┌┐.└┐│┌┐┌┐.└┐└─┐┌┐┌──┐││└┘┌┐└─┐└──┘│││└┘└──┐└┐┌┐┌─┐└┐........
..........│┌─┐┌─┘└─┐│└────┘└┘└──┘└┘└──┐└──┐┌┐└┘└┘└┘┌─┘┌┐└───┐└┘└┐└┘└┐┌─┘.......││..││││││┌┐└─┐│││└─┐│└┘┌─┘└──┘┌┐┌─┘└┘┌┐┌──┘.└┘│└┐└─┘........
..........└┘.││┌──┐││┌─────┐┌┐┌┐┌─┐┌─┐└──┐└┘└──┐┌──┘┌┐│└───┐└┐┌─┘┌──┘└┐........│└──┘└┘└┘└┘└──┘└┘└┐┌┘└┐.└──────┘└┘┌───┘││┌──┐┌┐└┐└┐┌─┐.......
.............│││┌┐└┘│└────┐│││││└┐│└┐└┐┌┐│.┌┐┌┐└┘┌┐.│└┘┌┐┌─┘.└┘..└──┐┌┘.┌─┐....└───┐┌┐┌────┐┌───┐│└─┐│┌┐┌───┐┌───┘┌──┐└┘│┌─┘││.└┐└┘┌┘.......
.............└┘└┘└──┘.┌───┘└┘└┘└─┘└─┘.│││└─┘└┘└─┐│└┐│┌─┘└┘┌─┐┌┐┌┐┌┐┌┘└──┘┌┘....┌───┘│││┌───┘│┌──┘└──┘└┘│└──┐└┘.┌┐.│┌┐└──┘└──┘└─┐│┌─┘........
..............┌───┐.┌┐└┐┌┐┌┐┌─┐┌┐┌───┐└┘└──┐┌───┘└┐││└┐┌┐┌┘┌┘│└┘││││┌┐┌┐┌┘.....└┐┌┐┌┘└┘└─┐┌┐│└────┐┌──┐└───┘.┌─┘└─┘│└┐┌─┐┌┐┌───┘└┘..........
..............└┐┌┐└┐││┌┘│└┘└┘.└┘│└┐┌─┘┌┐.┌┐││┌──┐┌┘││┌┘│││┌┘.└─┐││└┘│││└┘.......└┘└┘┌────┘│││┌─┐┌┐││┌┐└────┐┌┘┌┐┌┐┌┘.└┘.│││└──┐┌┐...........
.............┌┐└┘└┐│││└─┘.┌────┐└─┘└─┐││┌┘│└┘│┌─┘└┐└┘└┐│└┘└┐┌┐┌┘││┌─┘└┘┌┐.......┌──┐└─┐┌─┐│└┘└┐└┘└┘││└┐┌───┘│┌┘└┘││┌┐.┌┐└┘│┌──┘│└─┐.........
.............││┌┐┌┘└┘│┌┐┌─┘┌┐┌┐└─────┘││└┐└┐.││┌──┘┌┐┌┘│┌┐┌┘││└┐│││┌┐.┌┘└┐┌┐.┌┐.└─┐│┌┐└┘.└┘.┌┐└───┐│└┐└┘┌┐┌─┘└──┐└┘│└─┘└─┐└┘┌─┐│┌─┘.........
.........┌───┘│││└──┐││││┌─┘└┘└─────┐┌┘│┌┘┌┘┌┘└┘┌┐┌┘└┘.││└┘.││.│└┘└┘│┌┘┌─┘│└┐││┌─┐│└┘└┐┌┐┌──┘└───┐└┘.└──┘└┘┌────┘┌┐│┌────┘.┌┘┌┘││┌┐┌┐.......
.........└───┐└┘└──┐││││└┘┌─┐┌──────┘│┌┘└┐│.└┐┌─┘└┘┌───┘└──┐│└┐└─┐┌─┘│┌┘.┌┘┌┘││└┐│└┐┌─┘││└──┐┌┐┌┐└─────────┘┌─┐┌┐││││┌──┐┌┐└┐└┐│└┘└┘└──┐....
.........┌┐┌┐└────┐││││└┐.└┐│└─┐┌────┘└──┘└┐┌┘└┐┌┐.└─┐┌────┘└┐│┌─┘└┐.│└─┐│┌┘┌┘└─┘│┌┘└─┐││┌┐.└┘└┘└────────┐┌┐└┐││└┘└┘└┘┌─┘│└─┘┌┘│┌──┐┌┐┌┘....
.........│└┘│┌───┐│└┘│└┐│┌┐│└─┐└┘┌────┐┌┐┌┐└┘┌─┘││┌┐.│└──┐.┌┐││└┐┌┐└─┘┌─┘│└┐│┌──┐└┘┌──┘│││└─┐┌┐┌┐┌┐.┌┐┌──┘│└─┘└┘┌─┐┌──┘┌┐│┌─┐└─┘└─┐└┘││.....
.........└─┐│└──┐│└─┐└┐││││└─┐│┌┐└───┐└┘│││┌┐└┐┌┘└┘└─┘┌─┐└┐│└┘└┐└┘│┌┐┌┘┌┐│┌┘└┘┌┐└─┐│┌┐.│││┌┐└┘└┘└┘│┌┘│└───┘┌┐┌┐┌┘.│└───┘└┘└┐└─┐┌─┐└─┐└┘.....
........┌──┘└─┐.│└┐.└┐└┘└┘│┌┐││││┌──┐└─┐└┘└┘└┐└┘┌────┐└┐└─┘└──┐└┐┌┘│││.││││.┌─┘│.┌┘│││┌┘│└┘└─────┐││┌┘.┌┐┌─┘└┘│└─┐│┌─┐┌────┘┌┐└┘.│┌─┘.......
...┌┐...└──┐┌┐└┐└┐└┐.└┐┌─┐└┘││└┘│└─┐│┌┐└┐┌┐..│┌┐└───┐│┌┘.┌┐.┌┐└┐│└┐│└┘┌┘││└┐└─┐└┐└┐│││└┐└┐┌─┐┌───┘└┘└─┐││└───┐└──┘└┘.│└─────┘└┐.┌┘└──┐......
..┌┘│.┌┐.┌┐└┘└┐└┐│┌┘┌┐└┘┌┘┌┐│└─┐│┌─┘││└┐└┘└┐┌┘│└┐┌┐┌┘││┌┐│└┐│└┐││.│└┐.└┐└┘┌┘┌─┘┌┘┌┘└┘│┌┘┌┘└┐│└───┐┌──┐└┘└────┘┌───┐┌─┘┌┐┌┐┌──┐└┐│┌┐┌─┘......
..└┐└─┘│┌┘└──┐└┐└┘└─┘└──┘┌┘│└──┘└┘┌┐└┘.└───┘└─┘.└┘│└┐││││└┐└┘┌┘│└─┘┌┘┌┐└┐┌┘.└─┐│┌┘┌──┘└┐│.┌┘│┌───┘│┌─┘┌┐┌──┐┌─┘┌──┘│┌┐││││└─┐└─┘└┘│└─┐......
...└──┐│└─┐┌┐└┐└┐┌────┐┌─┘.└──┐┌┐┌┘└────┐.┌┐┌────┐└─┘└┘││.└─┐└┐└─┐┌┘┌┘│┌┘└┐┌──┘│└┐│┌┐.┌┘└┐└┐│└────┘└┐┌┘└┘┌┐└┘┌─┘.┌┐└┘└┘└┘└─┐└───┐.│┌─┘......
....┌─┘└─┐││└┐└─┘│┌───┘│┌─────┘│││┌─────┘┌┘└┘┌───┘┌─┐┌┐││┌─┐└┐│┌─┘└┐└┐└┘┌─┘└──┐└─┘││└┐└─┐│┌┘└┐┌┐┌┐┌─┘│.┌┐│└──┘┌─┐│└───────┐│┌──┐│.└┘........
....└┐┌──┘└┘.└───┘└┐┌┐┌┘│┌─┐┌─┐│└┘└┐┌┐.┌─┘┌──┘┌──┐└┐││││││┌┘┌┘│└─┐┌┘┌┘┌┐│┌┐┌┐.└─┐┌┘└┐│┌┐│││┌┐└┘└┘│└─┐│┌┘└┘┌┐┌─┘┌┘│┌───────┘│└─┐└┘...........
...┌─┘└──┐┌┐┌─────┐│││└┐└┘.└┘.└┘┌─┐└┘└┐│┌─┘.┌┐└┐┌┘┌┘└┘││││└┐└┐└──┘└┐│┌┘└┘││││┌┐┌┘└┐┌┘└┘└┘│└┘└──┐┌┘┌┐└┘└┐┌┐│││┌─┘┌┘└┐┌───┐┌┐└─┐└┐............
...└─┐┌──┘││└────┐│└┘└─┘┌────┐┌┐└┐└──┐└┘└───┘│┌┘└┐└──┐│││└┐└┐│┌┐┌─┐││└─┐┌┘│││││└┐┌┘└┐┌┐┌┐└┐┌┐.┌┘└─┘└──┐└┘└┘││└──┘┌┐└┘┌──┘│└─┐└─┘............
..┌──┘└──┐││┌┐┌┐┌┘└──┐┌┐└───┐└┘└┐└──┐└┐┌┐┌─┐┌┘│┌─┘┌┐┌┘└┘└┐│┌┘└┘││┌┘││┌─┘└┐└┘│││┌┘│┌┐└┘└┘└┐││└┐└┐┌┐┌───┘┌───┘│┌───┘└──┘┌┐┌┘┌┐└───┐...........
..└───┐┌─┘││││││└──┐┌┘││┌┐┌┐└──┐└───┘.└┘││.└┘.││┌─┘│└┐┌┐┌┘│└┐┌┐└┘└┐└┘└┐┌┐│┌─┘││└┐││└──┐┌┐││└┐│.└┘│└┐┌─┐└────┘└┐┌┐┌┐┌──┘└┘┌┘└────┘...........
...┌──┘└──┘└┘└┘│.┌─┘└─┘│││││┌─┐│┌┐┌┐┌┐┌┐└┘┌───┘│└┐┌┘.││└┘.└┐└┘│.┌┐└┐┌┐└┘│││┌┐│└┐│└┘┌──┘│└┘└─┘│┌─┐│┌┘└┐│┌┐┌─┐┌─┘│││└┘┌──┐┌┘┌┐┌┐.┌┐...........
...└─┐┌┐┌─┐┌┐┌┐└┐└┐┌┐┌┐└┘└┘└┘┌┘└┘└┘└┘└┘└─┐└───┐└─┘└─┐││┌┐┌┐│┌─┘┌┘└─┘│└──┘│└┘│└┐││┌─┘┌─┐└─┐┌──┘└┐││└─┐│└┘└┘.└┘┌┐│││┌─┘┌┐└┘┌┘└┘└─┘│...........
...┌─┘│││┌┘│└┘└┐│.└┘└┘└─────┐│┌┐┌┐.┌┐┌───┘.┌┐.│┌┐┌┐┌┘│││└┘│││┌┐└───┐│┌┐┌─┘┌─┘┌┘│││┌┐└┐│┌─┘└─┐.┌┘│└┐┌┘│┌──────┘└┘└┘└──┘└┐.│┌─────┘...........
...│┌┐│└┘│┌┘┌──┘└───────────┘└┘└┘└─┘└┘┌───┐││┌┘│└┘││┌┘│└─┐│││││┌──┐│└┘│└─┐└┐.└┐││││└┐│││┌┐┌─┘┌┘┌┘.│└┐└┘.┌─────┐┌───────┘┌┘└────┐┌┐..........
..┌┘│└┘┌─┘└┐│┌┐┌──────────┐┌┐┌─┐┌──┐┌┐│┌──┘││└┐│┌┐└┘│┌┘┌┐││││││└─┐││┌─┘┌┐│┌┘┌┐│││││┌┘││└┘││┌┐└┐│┌┐│┌┘.┌┐└────┐│└────────┘┌┐┌───┘│└┐.........
..│┌┘┌┐│┌──┘└┘└┘┌───┐┌─┐┌─┘│││┌┘│┌─┘│││└─┐┌┘│┌┘││└┐┌┘│┌┘││└┘││└┐┌┘└┘└┐┌┘│││┌┘│││││││┌┘└┐┌┘│││┌┘││││└┐┌┘└┐┌┐┌┐││┌─┐┌──────┘└┘.┌──┘┌┘┌┐.......
..└┘.││└┘┌┐┌─┐┌─┘┌┐┌┘└┐│└──┘└┘└┐│└┐┌┘│└─┐││.└┘┌┘│┌┘└┐│└┐└┘┌┐││.│└───┐││.│││└┐│││││││└─┐││┌┘││└┐└┘│└┐│└─┐││││││└┘┌┘└──────────┘┌┐┌┘┌┘└─┐.....
...┌┐│└──┘││┌┘└┐┌┘││.┌┘└────┐┌┐││┌┘└┐└┐┌┘│└─┐.└┐│└──┘│┌┘.┌┘││└┐│┌┐┌─┘││┌┘││┌┘││││└┘└┐┌┘└┘└─┘└┐│.┌┘┌┘│┌─┘└┘││└┘┌┐└─┐┌────┐┌─┐┌─┘└┘.│┌──┘.....
┌──┘└┘┌──┐└┘│┌┐└┘┌┘└┐└─────┐└┘└┘││┌┐│┌┘│┌┘┌┐│┌─┘└┐┌─┐└┘┌┐└┐└┘┌┘└┘│└─┐└┘│┌┘│└┐│││└┐┌┐││┌┐┌┐┌──┘└┐│┌┘┌┘└─┐┌─┘└──┘│┌─┘└┐.┌┐└┘.└┘.┌───┘└┐.......
│┌───┐│.┌┘┌┐└┘└┐┌┘┌┐└──────┘┌┐┌─┘││││└┐│└┐│││└─┐┌┘└┐└─┐│└─┘┌┐└──┐└┐┌┘┌─┘└┐└┐│││└┐││└┘└┘└┘││┌┐┌┐││└┐└┐┌┐│└┐┌┐┌┐┌┘└──┐└─┘└──┐┌──┘┌─┐┌┐└─┐.....
└┘.┌─┘└┐└─┘└──┐└┘┌┘│┌┐┌┐┌───┘│└─┐││└┘┌┘└┐││││┌─┘└─┐│┌─┘└──┐│└┐┌─┘┌┘│.└┐┌┐└┐││││┌┘│└─┐┌┐┌─┘││││││└┐└┐│││└┐││└┘│└──┐.└┐┌┐┌──┘│┌──┘.└┘└──┘.....
..┌┘┌──┘┌──┐┌─┘┌┐└┐└┘││└┘┌───┘┌┐│││.┌┘┌┐│└┘└┘└┐┌─┐└┘└┐┌┐.┌┘└┐│└─┐└┐└┐.││└┐│││└┘│┌┘┌─┘││└─┐││└┘││┌┘┌┘│││┌┘││┌─┘┌─┐│┌─┘││└─┐.││┌────────┐.....
..└┐└┐..└─┐└┘┌┐│└┐└─┐└┘┌─┘┌┐┌┐││││└┐│┌┘└┘.┌───┘└┐└┐┌┐└┘└┐└┐┌┘│┌─┘.└┐└┐└┘.└┘│└┐┌┘└┐└─┐││┌─┘│└─┐└┘└┐│.└┘││┌┘│└─┐└┐││└┐┌┘│┌┐└─┘└┘┌┐┌─────┘.....
...└┐│....└┐┌┘│└┐└┐┌┘┌─┘┌┐│││└┘││└┐│││.┌──┘┌┐┌──┘┌┘││┌┐┌┘.│└┐│└─┐┌┐└┐│.┌──┐│┌┘└┐┌┘┌─┘││└┐┌┘┌┐└──┐│└──┐││└┐└┐┌┘┌┘││┌┘└┐││└┐┌┐┌┐││└─┐┌─┐......
....││.....│└┐└┐└┐││┌┘┌─┘│││└┐.└┘.│││└┐│┌┐┌┘││┌─┐└┐││││└─┐└┐││┌─┘││┌┘└┐│┌─┘││┌┐└┘┌┘┌┐││┌┘│┌┘└─┐┌┘└─┐┌┘└┘.└┐│└┐└┐└┘│┌┐│││┌┘│││└┘└──┘│┌┘......
....└┘.....└─┘.└┐│││└┐│.┌┘│└┐└───┐│││┌┘└┘└┘┌┘└┘┌┘┌┘││││┌┐└┐││└┘.┌┘└┘┌┐└┘└┐.│└┘└─┐└┐│││││┌┘│┌──┘└──┐│└──┐..└┘.└┐│┌─┘│││││└┐││└───┐┌─┘└┐......
.............┌──┘│││┌┘│┌┘┌┘┌┘┌┐┌┐│└┘││┌┐┌──┘┌─┐└┐└─┘││││└┐││└┐┌─┘┌─┐│└┐┌┐└┐└┐┌┐┌┘┌┘│││└┘│┌┘└┐┌┐┌┐┌┘│┌─┐└┐┌────┘│└┐┌┘└┘││┌┘││┌┐┌┐└┘┌─┐│......
.............└──┐│││└┐│└┐│.└┐││││└─┐│││└┘┌─┐└┐└┐└┐┌─┘││└┐└┘└┐│└─┐│.│└┐│││┌┘┌┘│││.│┌┘│└─┐││┌┐└┘││└┘.││┌┘┌┘└┐┌──┐│.││┌┐.└┘│┌┘││└┘│┌─┘.└┘......
................└┘└┘┌┘│┌┘│┌─┘│││└─┐│└┘└──┘.│┌┘.└┐│└┐┌┘│┌┘┌──┘└┐┌┘│┌┘┌┘│││└┐└┐││└┐││┌┘┌─┘│││└──┘└──┐└┘│┌┘┌┐││┌─┘│┌┘└┘└┐┌─┘└┐│└─┐│└┐..........
....................└┐│└┐│└┐┌┘│└─┐└┘┌──────┘│.┌┐└┘┌┘│┌┘└┐│┌──┐│└┐│└┐└┐││└┐│┌┘│└┐│└┘└┐└─┐└┘└┐┌─┐┌─┐└─┐└┘.│││││┌┐│└──┐┌┘└┐┌┐││┌┐││┌┘..........
.....................│└┐││┌┘│┌┘┌┐└─┐└─┐┌───┐└┐│└─┐└─┘│┌┐││└┐┌┘└┐│└┐│┌┘│└┐└┘└┐│┌┘└┐┌─┘┌┐└─┐┌┘└┐│└┐│┌┐└───┘│││└┘││.┌┐└┘┌─┘│││└┘││└┘...........
.....................│┌┘││└┐│└┐││┌┐└┐┌┘│┌──┘┌┘└─┐└───┘││││┌┘│┌┐││┌┘└┘.└┐└──┐││└─┐│└┐┌┘│┌─┘└┐┌┘└┐││││┌┐┌┐┌┘└┘┌─┘└─┘└┐.│┌─┘│└┐.│└┐............
.....................││.└┘.└┘.││││└┐││┌┘└─┐┌┘┌──┘┌───┐│└┘└┘┌┘│││││┌─┐┌─┘┌──┘└┘┌─┘│┌┘└┐│└──┐││┌─┘│││└┘│││└─┐.└┐┌┐┌─┐└┐└┘┌─┘┌┘.└┐│............
.....................└┘.┌─────┘│└┘.└┘└┘┌──┘└┐└┐┌┐│.┌─┘└──┐┌┘┌┘│││└┘┌┘└─┐└────┐└┐┌┘└─┐││┌─┐│││└─┐││└─┐│││┌┐│┌─┘││└┐└┐│┌┐└─┐└┐..││............
........................└──┐┌─┐└──────┐└──┐┌┘┌┘│││┌┘┌┐┌┐┌┘│┌┘┌┘│└─┐└┐┌─┘┌─┐┌─┘.└┘┌──┘│││.└┘└┘.┌┘││┌┐│││││└┘└┐┌┘│┌┘┌┘└┘└─┐└─┘..└┘............
.......................┌───┘│.└┐┌─────┘┌──┘│┌┘┌┘││└─┘││└┘.││.└┐└┐┌┘┌┘└┐┌┘┌┘└────┐└─┐┌┘│└───┐┌─┘┌┘└┘││└┘││┌┐┌┘│┌┘└┐│┌─┐┌┐└─┐.................
.......................└───┐│┌─┘└─────┐└┐┌┐│└┐│.└┘.┌─┘└──┐││┌─┘┌┘└┐│┌─┘└┐└┐┌┐┌┐┌┘┌─┘└┐│┌─┐┌┘└┐┌┘.┌─┘└┐┌┘└┘│└┐││┌┐││└┐└┘│┌─┘.................
..........................┌┘││┌┐┌┐┌───┘.││││┌┘└┐.┌─┘┌┐┌┐┌┘└┘└─┐│┌┐└┘│┌┐┌┘.││││││.└┐┌─┘││┌┘│┌─┘└─┐└──┐││┌──┘.│││││││┌┘..│└┐..................
..........................│┌┘│││││└┐....└┘│││┌┐│.└──┘│││└┐┌───┘└┘│┌┐└┘│└─┐└┘││││┌┐│└─┐││└┐││┌┐┌┐└┐.┌┘││└┐.┌─┘│└┘└┘││...└─┘..................
..........................└┘.└┘││└┐└─┐....└┘││└┘┌────┘│└─┘└┐┌─┐┌┐└┘└─┐└┐┌┘.┌┘││││└┘┌─┘│└┐││││││└┐└┐└┐│└┐│.└┐┌┘....│└┐.......................
..............................┌┘│┌┘┌┐└┐...┌─┘└┐┌┘┌┐┌─┐└─┐┌─┘└┐│││┌──┐└┐└┘┌─┘┌┘└┘│┌─┘..└┐│└┘││└┘┌┘┌┘.└┘.└┘..││.....│┌┘.......................
..............................└┐│└┐││┌┘...└─┐┌┘└┐││└┐└┐┌┘│┌┐┌┘│││└─┐└─┘..└──┘...│└┐....││.┌┘│..└─┘.........└┘.....└┘........................
..............................┌┘│.││└┘......││..└┘└─┘.││┌┘│││┌┘│└─┐└─┐..........└─┘....└┘.└┐│...............................................
..............................└─┘.└┘........└┘....┌───┘│└─┘││└┐└┐┌┘┌─┘.....................└┘...............................................
..................................................└───┐└┐┌─┘│.│┌┘└┐└─┐......................................................................
......................................................│┌┘└─┐│┌┘└─┐│┌┐│......................................................................
.....................................................┌┘└┐┌┐││└┐┌─┘└┘└┘......................................................................
.....................................................└┐┌┘│└┘└┐││.┌┐.........................................................................
......................................................└┘┌┘┌┐┌┘│└─┘│.........................................................................
........................................................└─┘└┘.└───┘.........................................................................

80
10/part1.bak Normal file
View File

@@ -0,0 +1,80 @@
% distance_from_ess(X-Y, 0) :- nth0_2(X-Y, ess).
distance_from_ess(X-Y, 1) :- ess(X-Y).
path(From, [Via], To, 1) :-
nth0_2(Via, Pipe),
G =.. [Pipe, Via, From, To], G.
path(From, [Via1, Via2 | Vias], To, Dist) :-
Dist1 is Dist - 1,
path(From, [Via1], Via2, 1),
path(Via1, [Via2 | Vias], To, Dist1).
vert(X-Y, X1-Y, X2-Y) :-
( X1 is X+1, X2 is X-1, points_up(X1-Y), points_down(X2-Y)
; X1 is X-1, X2 is X+1, points_down(X1-Y), points_up(X2-Y)),
valid(X1-Y), valid(X2-Y).
horz(X-Y, X-Y1, X-Y2) :-
( Y1 is Y+1, Y2 is Y-1, points_left(X-Y1), points_right(X-Y2)
; Y1 is Y-1, Y2 is Y+1, points_right(X-Y1), points_left(X-Y2)),
valid(X-Y1), valid(X-Y2).
el(X-Y, X1-Y1, X2-Y2) :-
( Y1 = Y, X1 is X-1, Y2 is Y+1, X2 = X, points_down(X1-Y1), points_left(X2-Y2)
; X1 = X, Y1 is Y+1, X2 is X-1, Y2 = Y, points_left(X1-Y1), points_down(X2-Y2)),
valid(X1-Y1), valid(X2-Y2).
jay(X-Y, X1-Y1, X2-Y2) :-
( Y1 = Y, X1 is X-1, Y2 is Y-1, X2 = X
; X1 = X, Y1 is Y-1, X2 is X-1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
seven(X-Y, X1-Y1, X2-Y2) :-
( Y1 = Y, X1 is X+1, Y2 is Y-1, X2 = X
; X1 = X, Y1 is Y-1, X2 is X+1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
eff(X-Y, X1-Y1, X2-Y2) :-
( Y1 = Y, X1 is X+1, Y2 is Y+1, X2 = X
; X1 = X, Y1 is Y+1, X2 is X+1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
dot(_, _, _) :- fail.
ess(X-Y, X1-Y1, X2-Y2) :-
nth0_2(X-Y, ess),
findall(Coord, ess_adjacent(Coord), [X1-Y1, X2-Y2]).
ess_adjacent(X1-Y1) :-
nth0_2(X-Y, ess),
( X1 is X-1, Y1 = Y, nth0_2(X1-Y1, El), points_down(El)
; X1 = X, Y1 is Y+1, nth0_2(X1-Y1, El), points_left(El)
; X1 is X+1, Y1 = Y, nth0_2(X1-Y1, El), points_up(El)
; X1 = X, Y1 is Y-1, nth0_2(X1-Y1, El), points_right(El)).
points_down(El) :- (El=ess; El=vert; El=seven; El=eff).
points_left(El) :- (El=ess; El=horz; El=jay; El=seven).
points_up(El) :- (El=ess; El=vert; El=el; El=jay).
points_right(El) :- (El=ess; El=horz; El=el; El=eff).
valid(X-Y) :-
input(Map), length(Map, NRows),
Map = [Row0 | _], length(Row0, NCols),
X >= 0, Y >= 0,
X < NRows, Y < NCols.
% Element is at (Row, Column) in the map.
nth0_2(Row-Column, Element) :-
input(Map),
nth0(Row, Map, SubList),
nth0(Column, SubList, Symbol),
symbol_predicate(Symbol, Element).
symbol_predicate("|", vert).
symbol_predicate("-", horz).
symbol_predicate("L", el).
symbol_predicate("J", jay).
symbol_predicate("7", seven).
symbol_predicate("F", eff).
symbol_predicate(".", dot).
symbol_predicate("S", ess).

98
10/part1.naive.pl Normal file
View File

@@ -0,0 +1,98 @@
% :- table valid/1.
:- table path/3.
answer(Answer) :-
pipe_at(From, ess),
once(path(From, Via, From)),
length(Via, ViaLen),
writef('%t -> %t\n', [From, Via]),
Answer is (ViaLen + 1) div 2 .
% path(From, Next, To, Dist) :-
% pipe_at(From, FromPipe),
% FromG =.. [FromPipe, From, Next
path(From, [Via], To) :-
pipe_at(Via, ViaPipe),
ViaG =.. [ViaPipe, Via, From, To], ViaG.
path(From, [Via1, Via2 | Vias], To) :-
path(From, [Via1], Via2),
path(Via1, [Via2 | Vias], To).
dot(_, _, _) :- fail.
vert(X-Y, X1-Y, X2-Y) :-
pipe_at(X-Y, vert),
( X1 is X+1, X2 is X-1
; X1 is X-1, X2 is X+1),
valid(X1-Y), valid(X2-Y).
horz(X-Y, X-Y1, X-Y2) :-
pipe_at(X-Y, horz),
( Y1 is Y+1, Y2 is Y-1
; Y1 is Y-1, Y2 is Y+1),
valid(X-Y1), valid(X-Y2).
el(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, el),
( Y1 = Y, X1 is X-1, Y2 is Y+1, X2 = X
; X1 = X, Y1 is Y+1, X2 is X-1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
jay(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, jay),
( Y1 = Y, X1 is X-1, Y2 is Y-1, X2 = X
; X1 = X, Y1 is Y-1, X2 is X-1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
seven(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, seven),
( Y1 = Y, X1 is X+1, Y2 is Y-1, X2 = X
; X1 = X, Y1 is Y-1, X2 is X+1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
eff(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, eff),
( Y1 = Y, X1 is X+1, Y2 is Y+1, X2 = X
; X1 = X, Y1 is Y+1, X2 is X+1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
ess(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, ess),
findall(Coord, ess_adjacent(Coord), [X1-Y1, X2-Y2]).
ess_adjacent(X1-Y1) :-
pipe_at(X-Y, ess),
( X1 is X-1, Y1 = Y, pipe_at(X1-Y1, El), points_down(El)
; X1 = X, Y1 is Y+1, pipe_at(X1-Y1, El), points_left(El)
; X1 is X+1, Y1 = Y, pipe_at(X1-Y1, El), points_up(El)
; X1 = X, Y1 is Y-1, pipe_at(X1-Y1, El), points_right(El)),
valid(X1-Y1).
points_down(El) :- (El=ess; El=vert; El=seven; El=eff).
points_left(El) :- (El=ess; El=horz; El=jay; El=seven).
points_up(El) :- (El=ess; El=vert; El=el; El=jay).
points_right(El) :- (El=ess; El=horz; El=el; El=eff).
valid(X-Y) :-
input(Map), length(Map, NRows),
Map = [Row0 | _], length(Row0, NCols),
X >= 0, Y >= 0,
X < NRows, Y < NCols.
% Element is at (Row, Column) in the map.
pipe_at(Row-Column, Element) :-
input(Map),
nth0(Row, Map, SubList),
nth0(Column, SubList, Symbol),
symbol_predicate(Symbol, Element).
symbol_predicate("|", vert).
symbol_predicate("-", horz).
symbol_predicate("L", el).
symbol_predicate("J", jay).
symbol_predicate("7", seven).
symbol_predicate("F", eff).
symbol_predicate(".", dot).
symbol_predicate("S", ess).

109
10/part1.pl Normal file
View File

@@ -0,0 +1,109 @@
:- table valid/1.
:- table pipe_at/2.
% :- table path/3.
% :- table path/5.
:- table vert/3. :- table horz/3. :- table el/3. :- table jay/3.
:- table seven/3. :- table eff/3. :- table ess/3.
answer(Answer) :-
pipe_at(From, ess),
once(path(From, Via, From)), length(Via, ViaLen),
% once((ess_adjacent(Curr), path(From, Curr, From, 1, ViaLen))),
% writef('%t -> %t\n', [From, Via]),
Answer is (ViaLen + 1) div 2 .
% path(From, Curr, To, Dist, Final) :-
% pipe_at(Curr, CurrPipe),
% writef('%t -> %t (%t)\n', [From, Curr, CurrPipe]),
% CurrG =.. [CurrPipe, Curr, From, Next], CurrG,
% ( Next = To
% -> Final = Dist
% ; NewDist is Dist + 1,
% path(Curr, Next, To, NewDist, Final)
% ).
path(From, [Via], To) :-
pipe_at(Via, ViaPipe),
ViaG =.. [ViaPipe, Via, From, To], ViaG.
path(From, [Via1, Via2 | Vias], To) :-
% writef('%t -> %t\n', [From, To]),
path(From, [Via1], Via2),
path(Via1, [Via2 | Vias], To).
dot(_, _, _) :- fail.
vert(X-Y, X1-Y, X2-Y) :-
pipe_at(X-Y, vert),
( X1 is X+1, X2 is X-1
; X1 is X-1, X2 is X+1),
valid(X1-Y), valid(X2-Y).
horz(X-Y, X-Y1, X-Y2) :-
pipe_at(X-Y, horz),
( Y1 is Y+1, Y2 is Y-1
; Y1 is Y-1, Y2 is Y+1),
valid(X-Y1), valid(X-Y2).
el(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, el),
( Y1 = Y, X1 is X-1, Y2 is Y+1, X2 = X
; X1 = X, Y1 is Y+1, X2 is X-1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
jay(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, jay),
( Y1 = Y, X1 is X-1, Y2 is Y-1, X2 = X
; X1 = X, Y1 is Y-1, X2 is X-1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
seven(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, seven),
( Y1 = Y, X1 is X+1, Y2 is Y-1, X2 = X
; X1 = X, Y1 is Y-1, X2 is X+1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
eff(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, eff),
( Y1 = Y, X1 is X+1, Y2 is Y+1, X2 = X
; X1 = X, Y1 is Y+1, X2 is X+1, Y2 = Y),
valid(X1-Y1), valid(X2-Y2).
ess(X-Y, X1-Y1, X2-Y2) :-
pipe_at(X-Y, ess),
findall(Coord, ess_adjacent(Coord), [X1-Y1, X2-Y2]).
ess_adjacent(X1-Y1) :-
pipe_at(X-Y, ess),
( X1 is X-1, Y1 = Y, pipe_at(X1-Y1, El), points_down(El)
; X1 = X, Y1 is Y+1, pipe_at(X1-Y1, El), points_left(El)
; X1 is X+1, Y1 = Y, pipe_at(X1-Y1, El), points_up(El)
; X1 = X, Y1 is Y-1, pipe_at(X1-Y1, El), points_right(El)),
valid(X1-Y1).
points_down(El) :- (El=ess; El=vert; El=seven; El=eff).
points_left(El) :- (El=ess; El=horz; El=jay; El=seven).
points_up(El) :- (El=ess; El=vert; El=el; El=jay).
points_right(El) :- (El=ess; El=horz; El=el; El=eff).
valid(X-Y) :-
input(Map), length(Map, NRows),
Map = [Row0 | _], length(Row0, NCols),
X >= 0, Y >= 0,
X < NRows, Y < NCols.
% Element is at (Row, Column) in the map.
pipe_at(Row-Column, Element) :-
input(Map),
nth0(Row, Map, SubList),
nth0(Column, SubList, Symbol),
symbol_predicate(Symbol, Element).
symbol_predicate("|", vert).
symbol_predicate("-", horz).
symbol_predicate("L", el).
symbol_predicate("J", jay).
symbol_predicate("7", seven).
symbol_predicate("F", eff).
symbol_predicate(".", dot).
symbol_predicate("S", ess).

128
10/part2.gimp.pl Normal file

File diff suppressed because one or more lines are too long

14
10/test.pl Normal file

File diff suppressed because one or more lines are too long

5
10/test.txt Normal file
View File

@@ -0,0 +1,5 @@
7-F7-
.FJ|7
SJLL7
|F--J
LJ.LJ

41
11/day11.pl Normal file
View File

@@ -0,0 +1,41 @@
% usase: swipl day11.pl input.txt 1000000
:- use_module(library(pio)).
:- initialization(main, main).
main([FileName, ExpandFactorArg | _]) :-
input(FileName, Map),
atom_number(ExpandFactorArg, ExpandFactor),
findall(Dist, distance(_, Map, _, ExpandFactor, Dist), Dists),
sum_list(Dists, Sum),
writef('Answer=%t\n', [Sum]).
% Dist is distance along Axis in Map between two row/col A & B (after expansion)
distance(Axis, Map, A-B, ExpandFactor, Dist) :-
true_coords(Axis, Map, ExpandFactor, TrueNs),
member(A-ACount, TrueNs), member(B-BCount, TrueNs), A < B,
Dist is (B - A) * ACount * BCount.
% TrueXs is the list of all coordinates after expanion along Axis in Map
true_coords(x, Map, ExpandFactor, TrueXs) :-
NextX = {ExpandFactor}/[Row, LastX-_, X-Count]>>(
sum_list(Row, Count),
(Count = 0 -> X is LastX + ExpandFactor; X is LastX + 1)),
scanl(NextX, Map, -1-0, Xs), Xs = [_ | TrueXs].
true_coords(y, [FirstRow | Map], ExpandFactor, TrueYs) :-
foldl(add_vectors, Map, FirstRow, CountY),
NextY = {ExpandFactor}/[Count, LastY-_, Y-Count]>>(
Count = 0 -> Y is LastY + ExpandFactor; Y is LastY + 1),
scanl(NextY, CountY, -1-0, Ys), Ys = [_ | TrueYs].
add_vectors([], [], []).
add_vectors([A | V1], [B | V2], [C | V]) :- C is A + B, add_vectors(V1, V2, V).
% Read file into 2D array Map. 1 corresponding to a galaxy and 0 otherwise.
input(FileName, Map) :- phrase_from_file(lines(Map), FileName).
lines([]) --> eos.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> "\n" ; eos.
line([1|Ls]) --> "#", line(Ls).
line([0|Ls]) --> ".", line(Ls).
eos([], []).

140
11/input.txt Normal file
View File

@@ -0,0 +1,140 @@
..........................#.........................#........................................................#..............................
.............#.....................................................#.........#......................#.......................................
..................................#....................................................................................#...........#........
....................#..........................#..................................................................#.........................
.......................................................#...............................................................................#....
.....................................#.........................#......#..............#......................................................
........#...............#......................................................#..........#................................#...............#
.........................................#................#..............................................#............#.....................
....#............................#..........................................................................................................
............#......................................#..............................................#............#............................
......................#.....................................................................#...............................................
.............................................................................#........#.........................................#...........
.................#.....................................................#.................................................#..............#...
................................#....................#.................................................#....................................
.......................................#.............................................................................#......................
..#.....................#...................................................................................................................
............................................#.....................#...........#.....................#.......................................
..................................................................................................................#..................#......
....................................#....................#................................................................................#.
.........#.....................................#..............#......................#......................................#...............
..............#..........................................................#......................#.....#.....................................
.......................................................................................................................................#....
..................................................................#.........................#...................#...........................
....#............................#.....#.....................................#................................................#.............
.......................#..........................#.........................................................................................
..................................................................................#.....#...................#.............#.................
................#.............................................#.................................#...........................................
#.....................................................................................................#...................................#.
...........#..............#.....#.............#.....................................................................#.......................
...........................................................................#................#.....................................#.........
...................................................#........................................................................................
..............#....................................................................................#........................................
.....................................#................................................#.......................#.............................
.....................................................................................................................................#.....#
........#................#....................................#.................................#.........#.................................
....................................................#..............#............#....................................#......................
....#...............#........#..........................................................#.......................................#...........
..........................................#.....#.......................#..........................#.....................................#..
.......................................................#....................................................................................
#......#...................................................................................................................#................
............#...............................................................................#..........#..........................#.........
............................................................................................................#...............................
.....................................#....................#........#............................#...........................................
........................#...........................................................#................................#....................#.
......#...............................................#.....................#........................#......................................
.................................#.....................................#..................................................#.................
...................#......................#..................#..........................#.............................................#.....
.............................#.....................#..............#...........................................#.............................
.........................................................#.......................................................................#..........
...............................................................................#.......................#.................................#..
............................................................................................................................................
............................................................................................................................................
.................#.............................................................................................#.......#.............#......
....#.....#....................................................#........#...............#....................................#..............
..................................#..........#........................................................#.....................................
............................................................................................................................................
...................#..............................................................................#......................#..................
............................................................................................................................................
..#..............................................#......#.....#...........................#..............#....................#.............
................#......#.........#..........................................................................................................
.........................................................................#......................................#.........................#.
....................................................#..............#............................#...........................................
.....#....................#..........................................................................#......................................
............#...........................#......#............................................................................................
............................................................................................................................................
.....................#.........................................................#.........................#........#.............#...........
.........#..............................................................#.....................#..........................................#..
......................................#...........#.....................................#...................................................
.#...............................#..........................................................................................................
..............#............#....................................#..................................#........................#...............
.....................................................................#...........................................#..........................
............................................................................................................................................
.........#........#........................#.....#........................#.......................................................#.....#...
............................................................................................................................................
...................................#........................................................................................................
..............#..........#..............#....................................#..........#.....#.............................................
....#........................................#............#...................................................................#.............
............................................................................................................................................
#........#......................................................#........#.................................................................#
....................#.........#..........................................................................#.......#......#...................
............................................................................................................................................
.......................................#..............#...........................................#.........................................
................................................#.............................................................#.......................#.....
.......................#...................#..............................#.................................................................
...............#...................#....................................................#.............................#.....................
....#......................................................................................................#................................
.............................#.........................................#....................#.............................#.....#...........
..............................................#..................................................#...................................#......
...................#...................#..........................................#.................................#.......................
............#.....................#....................#..................#.................................................................
...........................................#........................................................#.......................................
...........................................................................................................#................................
...#............................................................#.............................................................#.............
.........................#..............................................................#................................................#..
...............#............................................................................................................................
.......................................#.......#.............#..............................................................................
.....................#...........#.............................................#............#.................#.........#...........#.......
..........................................................................#.......................#.........................................
.......#............................................................................#.......................................................
....................................................#....................................................................................#..
.................#........................................#.....#...........................................................#...............
.#.........#..................................#.................................#..............#.........#.....#......#.....................
.....................#............#.......................................................#.........#.......................................
............................................................................#.......................................................#.......
.....................................................................................#....................................#.................
............................#................................................................#..................................#...........
.....#.........................................................#............................................................................
......................#..................#............................................................................#.....................
................................................................................#.....................................................#.....
#.................................#.......................................#.................................................................
...................#......#.......................#...............#...........................................#.............................
.............................................................#........................................#......................#..............
.................................................................................................#..........................................
..#..................................#....................................................................#......#..................#.......
..........................................................#..................#........................................#.....................
..................#........#........................................................#..........................................#............
.................................#.............#.......................#...................................................................#
................................................................................................#.........................#.................
....#.....#.................................................................................................................................
.......................#....................................................#...............................................................
....................................................#.......................................................................................
.............#..............................#..........................................#....................................................
...............................#............................................................................................#........#......
.#.......................................................#.........#...........#.................................#..........................
....................................#.............#..............................................................................#..........
.....................#.........................................................................#......#.....................................
..........................#...........................#.........#.................#.........................................................
..........#.................................#................................#..............................................................
....#...........................................................................................................#..................#........
........................................................................#..............#.....................................#..............
..................#.......................................#.................................................................................
........................................................................................................................................#...
....................................................#.......................#..........................#....................................
.....#..............................#.........................#..................................#..........................................
..........................#............................................#........................................#.......#...................
..........................................#.................................................................................................
......................................................................................................................................#.....
.......#...........................................#................................#........................................#..............
#..................#..........................#..........................#.....#............................#...............................
...................................#.....................................................................................#..................

35
11/part1.naive.pl Normal file
View File

@@ -0,0 +1,35 @@
:- op(700, xfx, before).
:- table galaxy/2.
:- table no_galaxy_row/2.
:- table no_galaxy_col/2.
:- use_module(library(pio)).
:- initialization(start, main).
start :-
input('input.txt', Map),
findall(Dist, (galaxy(Map, A), galaxy(Map, B), A before B,
distance(Map, A, B, Dist)),
Dists),
sum_list(Dists, Answer),
writef('Answer=%w\n', [Answer]).
distance(Map, X1-Y1, X2-Y2, Dist) :-
findall(X, no_galaxy_row(Map, X), EmptyXs),
findall(Y, no_galaxy_col(Map, Y), EmptyYs),
include(between(X1, X2), EmptyXs, ExpandedX), length(ExpandedX, RowsToAdd),
include(between(Y1, Y2), EmptyYs, ExpandedY), length(ExpandedY, ColsToAdd),
Dist is abs(X1 - X2) + abs(Y1 - Y2) + RowsToAdd + ColsToAdd.
between(End1, End2, N) :- End1 < N, N < End2; End1 > N, N > End2.
no_galaxy_row(Map, X) :- nth0(X, Map, Row), maplist([46]>>(true), Row).
no_galaxy_col(Map, Y) :- maplist({Y}/[Row]>>(nth0(Y, Row, 46)), Map).
galaxy(Map, X-Y) :- nth0(X, Map, Row), nth0(Y, Row, 35).
before(X1-Y1, X2-Y2) :- X1 < X2; X1 =:= X2, Y1 < Y2.
input(FileName, Map) :- phrase_from_file(lines(Map), FileName).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
eos([], []).
line([]) --> ( "\n" ; eos ), !.
line([L|Ls]) --> [L], line(Ls).

35
11/part2.naive.pl Normal file
View File

@@ -0,0 +1,35 @@
:- op(700, xfx, before).
:- table galaxy/2.
:- table no_galaxy_row/2.
:- table no_galaxy_col/2.
:- use_module(library(pio)).
:- initialization(start, main).
start :-
input('input.txt', Map),
findall(Dist, (galaxy(Map, A), galaxy(Map, B), A before B,
distance(Map, A, B, Dist)),
Dists),
sum_list(Dists, Answer),
writef('Answer=%w\n', [Answer]).
distance(Map, X1-Y1, X2-Y2, Dist) :-
findall(X, no_galaxy_row(Map, X), EmptyXs),
findall(Y, no_galaxy_col(Map, Y), EmptyYs),
include(between(X1, X2), EmptyXs, ExpandedX), length(ExpandedX, RowsToAdd),
include(between(Y1, Y2), EmptyYs, ExpandedY), length(ExpandedY, ColsToAdd),
Dist is abs(X1 - X2) + abs(Y1 - Y2) + RowsToAdd*999999 + ColsToAdd*999999.
between(End1, End2, N) :- End1 < N, N < End2; End1 > N, N > End2.
no_galaxy_row(Map, X) :- nth0(X, Map, Row), maplist([46]>>(true), Row).
no_galaxy_col(Map, Y) :- maplist({Y}/[Row]>>(nth0(Y, Row, 46)), Map).
galaxy(Map, X-Y) :- nth0(X, Map, Row), nth0(Y, Row, 35).
before(X1-Y1, X2-Y2) :- X1 < X2; X1 =:= X2, Y1 < Y2.
input(FileName, Map) :- phrase_from_file(lines(Map), FileName).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
eos([], []).
line([]) --> ( "\n" ; eos ), !.
line([L|Ls]) --> [L], line(Ls).

10
11/test.txt Normal file
View File

@@ -0,0 +1,10 @@
...#......
.......#..
#.........
..........
......#...
.#........
.........#
..........
.......#..
#...#.....

1000
12/input.txt Normal file

File diff suppressed because it is too large Load Diff

51
12/part1.pl Normal file
View File

@@ -0,0 +1,51 @@
% Usage: swipl part1.pl input.txt
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName | _]) :-
input(FileName, Lines),
foldl([Line, Prev, Curr]>>(count_resolutions(Line, N), Curr is Prev + N), Lines, 0, Ns),
writef('Res=%w\n', [Ns]).
count_resolutions(Line-Bads, N) :-
writef('Resolving %w\n', [Line-Bads]),
findall(Res, resolve(Line, Bads, Res), Resolutions),
length(Resolutions, N).
% Bads is list of contiguous blocks of bad items in Xs; w/unks resolved in Ys.
resolve([], [], []).
resolve([good|Xs], Bads, [good|Ys]) :- resolve(Xs, Bads, Ys).
resolve([unk|Xs], Bads, Ys) :-
resolve([good|Xs], Bads, Ys);
resolve([bad|Xs], Bads, Ys).
resolve([bad|Xs], [N|Bads], Ys) :-
length(BadsUnks, N),
(Next = good; Next = unk),
append(BadsUnks, [Next|RemainingXs], [bad|Xs]),
bads_or_unks(BadsUnks),
resolve([good|RemainingXs], Bads, RemainingYs),
nbads(BadRun, N), append(BadRun, RemainingYs, Ys).
% List contains all bads or unks
bads_or_unks([]).
bads_or_unks([bad|List]) :- bads_or_unks(List).
bads_or_unks([unk|List]) :- bads_or_unks(List).
% List contains exactly N bad items.
nbads([], 0).
nbads([bad|List], N) :- N > 0, Remain is N - 1, nbads(List, Remain).
% read input file into [(good;bad;unk)]-[list of bad runs]
input(FileName, Lines) :- phrase_from_file(lines(Lines), FileName).
lines([]) --> eos.
lines([Status-Parity|Lines]) --> status(Status), parity(Parity), lines(Lines).
status([good]) --> " ".
status([good|Cdr]) --> ".", status(Cdr).
status([bad|Cdr]) --> "#", status(Cdr).
status([unk|Cdr]) --> "?", status(Cdr).
parity([N]) --> number(N), ("\n"; eos).
parity([N|Cdr]) --> number(N), ",", parity(Cdr).

65
12/part2.pl Normal file
View File

@@ -0,0 +1,65 @@
% Usage: swipl part2.pl input.txt
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
test :- main(['test.txt']).
main([FileName | _]) :-
input(FileName, Lines),
concurrent_maplist(resolve_repeated, Lines, Ns),
sum_list(Ns, Count),
writef('Res=%w\n', [Count]).
resolve_repeated(Line-Bads, N) :-
append([Line, [?], Line, [?], Line, [?], Line, [?], Line], L5),
append([Bads, Bads, Bads, Bads, Bads], B5),
abolish_private_tables, table(resolve/2),
resolve(L5-B5, N).
% Bads is list of contiguous blocks of bad items in Xs; w/unks resolved in Y.
resolve([]-[], 1).
resolve([o|Xs]-Bads, Y) :- resolve(Xs-Bads, Y).
resolve([?|Xs]-Bads, Y) :-
findall(N, (resolve([o|Xs]-Bads, N); resolve([#|Xs]-Bads, N)), Ys),
sum_list(Ys, Y).
resolve([#|Xs]-[N|Bads], Y) :-
length(BadsUnks, N),
( append(BadsUnks, [], [#|Xs]),
RemainingXs = []
; append(BadsUnks, [Next|RemainingXs], [#|Xs]), (Next = o; Next = ?)
),
bads_or_unks(BadsUnks),
resolve(RemainingXs-Bads, Y).
% List contains all bads or unks
bads_or_unks([]).
bads_or_unks([#|List]) :- bads_or_unks(List).
bads_or_unks([?|List]) :- bads_or_unks(List).
% List contains exactly N bad items.
nbads([], 0).
nbads([#|List], N) :- N > 0, Remain is N - 1, nbads(List, Remain).
processed_line(1, Line-Bads, NewLine-NewBads) :-
append(Line, [o], NewLine),
NewBads = Bads.
% read input file into [(o;#;?)]-[list of bad runs]
input(FileName, Lines) :- phrase_from_file(lines(Lines), FileName).
lines([]) --> eos.
lines([Status-Parity|Lines]) --> status(Status), parity(Parity), lines(Lines).
status([]) --> " ".
status([o]) --> all_dots, " ".
status([o, #|Cdr]) --> all_dots, "#", status(Cdr).
status([o, ?|Cdr]) --> all_dots, "?", status(Cdr).
status([#|Cdr]) --> "#", status(Cdr).
status([?|Cdr]) --> "?", status(Cdr).
all_dots --> ".".
all_dots --> ".", all_dots.
parity([N]) --> number(N), ("\n"; eos).
parity([N|Cdr]) --> number(N), ",", parity(Cdr).

86
12/part2.py Normal file
View File

@@ -0,0 +1,86 @@
# This demonstrates classic dynamic programming and prioritizes explainability.
# Of course all of this would have been cleaner and would perform the same if
# we were to use recursion with memoization (e.g. @memoize.cache)
import sys
import dataclasses
@dataclasses.dataclass(frozen=True)
class Entry:
working: int
broken: int
def total(self):
return self.working + self.broken
def no_dot_between(l, start, end):
return not any(c for c in l[start+1 : end] if c == ".")
def process(springs, counts):
# entries[(i,j)] = how many ways if we have only first i springs and j nums,
# given if that one was chosen to be working or no.
entries = {}
# boundary conditions: when there's no spring and no count left, 1 choice
entries[(-1, -1)] = Entry(working=1, broken=0)
# boundary conditions: when there's no count left but still springs left
for i in range(len(springs)):
entries[(i, -1)] = Entry(
working=(entries[(i - 1, -1)].working
if springs[i] in (".", "?")
else 0),
broken=0)
# boundary conditions: when there's no springs left but there's still count
for j in range(len(counts)):
entries[(-1, j)] = Entry(working=0, broken=0)
# building the rest of the table
for i in range(len(springs)):
for j in range(len(counts)):
prev_entry_if_working = entries[(i - 1, j)]
prev_working_entry_if_broken = (
entries[(i-counts[j], j-1)].working
if i-counts[j] >= -1 and no_dot_between(springs, i-counts[j], i)
else 0)
if springs[i] == ".":
entries[(i, j)] = Entry(
working=(prev_entry_if_working.working +
prev_entry_if_working.broken),
broken=0)
elif springs[i] == "#":
entries[(i, j)] = Entry(
working=0,
broken=prev_working_entry_if_broken)
elif springs[i] == '?':
entries[(i, j)] = Entry(
working=(prev_entry_if_working.working +
prev_entry_if_working.broken),
broken=prev_working_entry_if_broken)
# import code; code.interact(
# local=locals(),
# banner=(f"springs[{i}]={springs[i]}, counts[{j}]={counts[j]} "
# f".={prev_entry_if_working}, "
# f"#={prev_working_entry_if_broken}\n"
# f"--> ({i}, {j}) = {entries[(i, j)]}"),
# exitmsg='')
return entries[(len(springs) - 1, len(counts) - 1)].total()
if __name__ == "__main__":
with open(sys.argv[1], "rt") as f:
lines = f.readlines()
total = 0
for line in lines:
springs, counts = line.strip().split(" ")
counts = [int(c) for c in counts.split(",")]
# delete these next 2 lines to have part 1 back
springs = "?".join([springs]*5)
counts = counts*5
n = process(springs, counts)
# print(f"{n} <-- {springs}-{counts}")
total += n
print(f"total = {total}")

6
12/test.txt Normal file
View File

@@ -0,0 +1,6 @@
???.### 1,1,3
.??..??...?##. 1,1,3
?#?#?#?#?#?#?#? 1,3,1,6
????.#...#... 4,1,1
????.######..#####. 1,6,5
?###???????? 3,2,1

1339
13/input.txt Normal file

File diff suppressed because it is too large Load Diff

44
13/part1.pl Normal file
View File

@@ -0,0 +1,44 @@
:- use_module(library(pio)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Blocks),
convlist(vert_reflect, Blocks, Vs),
convlist(horz_reflect, Blocks, Hs),
sum_list(Vs, V),
sum_list(Hs, H),
Answer is 100*V + H,
writef('Answer=%t\n', [Answer]).
vert_reflect(Block, N) :- reflect(Block, N).
horz_reflect(Block, N) :- maplist({N}/[Row]>>(reflect(Row, N)), Block).
reflect(Items, N) :- perfect_reflect(Items, N).
reflect(Items, N) :-
append(SubItems, [_|_], Items),
perfect_reflect(SubItems, N).
reflect(Items, N) :-
append(Prefix, SubItems, Items),
perfect_reflect(SubItems, SubN),
length(Prefix, Len), N is SubN + Len.
% reflect right down the middle. N is half list length.
perfect_reflect([A, A], 1).
perfect_reflect(Items, N) :-
append([[Item], OtherItems, [Item]], Items),
perfect_reflect(OtherItems, N_sub1),
N is N_sub1 + 1.
input(FileName, Blocks) :- phrase_from_file(blocks(Blocks), FileName).
blocks([]) --> eos, !.
blocks([Block|Blocks]) --> block(Block), blocks(Blocks).
block([Line]) --> line(Line), ("\n"; eos), !.
block([Line|Lines]) --> line(Line), block(Lines).
line([]) --> ("\n"; eos), !.
line([#|Chars]) --> "#", line(Chars).
line([o|Chars]) --> ".", line(Chars).
eos([], []).

55
13/part2.pl Normal file
View File

@@ -0,0 +1,55 @@
:- use_module(library(pio)).
:- use_module(library(clpfd)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Blocks),
convlist(almost_reflect, Blocks, Vs), sum_list(Vs, V),
maplist(transpose, Blocks, TBlocks),
convlist(almost_reflect, TBlocks, Hs), sum_list(Hs, H),
Answer is 100*V + H,
writef('Answer=%t\n', [Answer]).
almost_reflect(Items, N) :- almost_perfect_reflect(Items, N).
almost_reflect(Items, N) :-
append(SubItems, [_|_], Items),
almost_perfect_reflect(SubItems, N).
almost_reflect(Items, N) :-
append(Prefix, SubItems, Items),
almost_perfect_reflect(SubItems, SubN),
length(Prefix, Len), N is SubN + Len.
almost_perfect_reflect([A, B], 1) :- diff(A, B, 1).
almost_perfect_reflect(Items, N) :-
append([[A], OtherItems, [A]], Items),
almost_perfect_reflect(OtherItems, N_sub1),
N is N_sub1 + 1.
almost_perfect_reflect(Items, N) :-
append([[A], OtherItems, [B]], Items),
diff(A, B, 1),
perfect_reflect(OtherItems, N_sub1),
N is N_sub1 + 1.
% reflect right down the middle. N is half list length.
perfect_reflect([A, A], 1).
perfect_reflect(Items, N) :-
append([[Item], OtherItems, [Item]], Items),
perfect_reflect(OtherItems, N_sub1),
N is N_sub1 + 1.
diff(L1, L2, N) :-
foldl([A, B, Prev, Curr]>>(Curr is Prev + abs(A - B)), L1, L2, 0, N).
input(FileName, Blocks) :- phrase_from_file(blocks(Blocks), FileName).
blocks([]) --> eos, !.
blocks([Block|Blocks]) --> block(Block), blocks(Blocks).
block([Line]) --> line(Line), ("\n"; eos), !.
block([Line|Lines]) --> line(Line), block(Lines).
line([]) --> ("\n"; eos), !.
line([1|Chars]) --> "#", line(Chars).
line([0|Chars]) --> ".", line(Chars).
eos([], []).

15
13/test.txt Normal file
View File

@@ -0,0 +1,15 @@
#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#

100
14/input.txt Normal file
View File

@@ -0,0 +1,100 @@
#.O.O......##.......O.#O....O....O.O...O..O..##O#..O..#...##...........#..O..OO.O#O...OO.O..#...#..#
......O.#...#..O.O.....#O...#..OO.O.........O..O.#..O.#.O...O.##......O..O.#....#......O....O....O#O
...#...O..O..#.O...O##.O....##.....OOO#....#.O..O#O.OOO.........O....#.O...O.O...O...#.#..O..#.O.#.#
#...##...O.OO....OO.#..O#...O..#O.O...O.......#.##.###....O..O.O.#.#O........OO..##.................
...#O....#.O.....O.O..O.#.......#.#.#O....O....OOO.#.....O.#...#...O..##..##O.#O....O.#O.#O..#..O.OO
...O....O..#.....O..O..O#.O...O..#..OO###.O.....#.OO....O#......O#..........#....#.O#.O.O.#.....O.O.
....O...#..O.........O...OO#O......OOO..#..O....#..#...O...O..#...O.O..#O...#O.O...O..###..#.O.#....
...O.#O.#..##O.O.#...O...#....O..#.####....OO.#.#...........O.O...#..........O..O#.O..O....#.......#
........O.........O....OO...........##...O.#.OO.....#....#.O###.......O#O..#.#.O#..#....O..#......O.
O..#....O#O.#..O...............#..#..........OO#.#.#.#...#..#..O.#...#......O..#...O...O..O.......O.
OO#.O##OO......O.#..#O....O#......O..O...O...OO...#...........O...#......O....O.OOO#..#.....O.OO..O.
O.#.OO...#..#..O...#....#..O.O....O.OOO..O....#...O....O.O....O.O#........#.##.......O..O#.O....#...
......O..O..O..###.#..O..#...#..#.##O.#O.OO...O.O..#OO...O...O.#O..O..#....#O....OO#.#...O...O..#.#O
.#.#O..#O....O.##.#O.#O.O.O....#.....OO#O...OO....#O...O##..OO.OOO......#.....#..#O.OO...#..#....O..
..OO.#.#..#....#..#.......OO..OOO.#...#..O##.O..##O..O....OO#.OO...#O.##.#......#O#.O#..O##...#.....
O.#.....#.O.OO.O......##.........O.O#.O...#......O#.....O.....O#..O.#O..O.#......#..O..O.O..........
...O..O..O.#.##.O..#.........#...#O..#....O#...#..O###.O...#.......O...#.#.#...O.....#O...O....##O.#
.#OO..O........O.O...#.#.....O..O..OO.O....O..##....OO....O...O..O#..O.OO.#...O.O.#.O.#O....O.......
....O.O.O.O..O#..##..O.O.O..O.#.OO.O..#.OOO.O.#.OO.O.#O........#O..O.......O..O..#..O..#..#.O.#.....
.#.O..#.O#O.O.......O.#.#O.OO..O..OO..O#.O.O#O....##OO.......O..#O.O.O#.....#..#..#..O#O.......#O.O.
....O..O#....O#.#O..#.OOOO..#.......OO.......##...#O....O...#..#..#.O..OO..O.#..#.O....#.#.##OO.....
.#O..###..#O#.O#O....O.##..........O.#..O..O.OO.O##...#O.#.O.O...#..#O.........#...#..#.........#O..
#.#.......#O..#..##..O.#...#O#...#.#.O..O.OO##.O....#.....O..OOO.............O..##..#..#..O....#...#
#.#..O..........#.O.#O..O.#...#.#O#..O.#....#.#....#O.......#O.#.O.O.##..OO....O.##..O#....O.....O.O
.O...##...O..#..O#O...O#.....O.#O....OO.O.#O..#....OO.#.O.........#......#O.........O...#.O...#O.O#.
...O.....#........O.#O...#..#..##.......O.O#....#.O...OO##OOO#.#..O#OO..OO..##O....O.#.O...O....##..
............#.O.O#O..#..#..O.........#O..O....OO..#..#..O.#.O.#..O..O..O..#OO...O...OO#O.OO....#..O.
...O.O.....O..O.##.....OO..#O...O...O..O.#...#......O..O.......OO..OO....#OO.O..#........##.O.O....O
#O#......O.O.O#..O.O..OO..#O#..#OO.#...O...O.O.O....#..O#O..O###O.##OO#.O.O.......O.O#..#O.O.O.#...#
..O........OOO.O....OOOO......#.O...#.....O.O#......O#O.O.#O.....#..O....O#.O....O..#..O..O....O...#
...O......O..#....O...#O..OO..#.#OO.O...OOO......#.........#OOO.#.#........O...#OO.O.OOO....O.O#....
......#.O...OO#...#O.#..##.O.#..O..O..O.O.#.O.O.##.#O#O...#OOO...#..O....O..O...OOO..O..#.##....O..#
...O....O.#O.OO..#O...#.#....#O.##OO..#..OO..#....OO.O#....O.O..#.#..O...#.O.#.O.#..O..O..#..O#O.OO.
..O..O.O......O#..#..O..O..O#..#.......#.....#O..O...#O..O..OO#.#.##...OO#..##.O.O.O.O........####.#
#.O#......OO...#.###...OO......#..#.....#.#.##.O..#.#..OO..#...OO#.O#.#..O##....O.....#..#OOO.....#.
.#......O....O.#...O..##.O..#..#O...#.O#....#.O#....O.O#.O#.#.OO.O..O#....O....#...O.O#......O#OO...
....#O#...#.O#.....O.O..OO##O....#.O..O...O..O.OO#...O#.#...O.O.O.....O#..O...#O.....#...O#O...O#.#.
#..O..O..OO..#.O#.......O......#...O.#..#O#..#.O.#.O#...#O.....O.OO..#...O...O.##.....O....OO..#....
..#......O#O...#.........#...O#.#..O.#..O.O.......#O.#...OOO....O#....OO..OOO.......#O....OO........
O.O.#..#..#O........##OO...O.O#....#...#O.......#.O#O...O..O.O##.O..#..OOOO#...O.#O..O#...O.O#O..#O.
.....#O#.#O......OO..O.....#....#.#.O.O.##.O##.....O..O......#O#OOO.....#.....#OO..###.#...O.O.#.#..
#...##.OO.....O.....OO......#.O.O..O......#....##O##..OOO..#.....#...O.......O.......O....##........
.###..#...O..O.#.....O#........O...##O....#.O.#.O.O.#O.......O#..#...OO...O#.OO...O.....O.O.O..OO#.O
...O..#...#..##..#.O##.##O.....O.#..#O.......OO#..O#.OO...##O......OOO...O.O..O#...#.##..O...O..#..O
....O.......#..O#..#O..O....O.O....#...O....O.##.#OOOO....O.#...#O...O#.#.......#.......OO#.#...#.#.
#.OO.O##...O...##.O#..O#......#.#..OO.OO.#.O.O##.#....O.O.##O.....#O..#........#O#...#...#.....O#.#.
O.O.#..##.....##O.......O..OO..#.O......#.......#O....#.......O.#OO...O.O....#.##.....#.....OO......
O#..##..O........#.#..O.#.....#O....O#.....O...#O.......O.O.........O....O.#..O#.O.....#O.#.#.O.#.O.
...O.OO.OO.O..O...#.#.#.O.O.OOO......O.#.#.O.#..O..#.OO.O..##O.......O.........OOO#.O.O...#O.O....O.
O.##...#.#..O#.#..#..O...#...#...O..O..#..O...#O....O..#.##O....O..O..O.##O...O....O..##O..OO.#.....
...OOO.O....O.O.#....O#.OO..#.#.O.#.O#.O...O#O#......##..........#...O......O...#...O....O.#...#....
...#..##.O.#O#.O.#...#..O...O#O....##..OO##..#OO.........#...O#..O#.OOO...OO...#.O.#.OO##..#O#.#...#
O##...#......#O.O#...O....O...#O#.O...O.O.OOO....O.....##....O..#O.O....#.#...O........##OO#.O##...#
OO..#.....O..O#.O...O..OO....#.....##...#..O...#O..#.#O.#O.#O##...#....O....#.O.......#......O.....O
O.O....O##.OO...O.....#......#....O.#O.#...OO#.OO......OO...O#....OO#O...O....##....#...........O.O.
.....O..O.OO....O#..#....#.O....#....#O..##..O..#..........O.OO#.OOO...........O#O.O.......#......OO
.O.#.#.O..O.#....OOO.O..O....O...O......O.O.O..#O.#.#.....OOO.........#.O....#O.O..#O....O#........O
.##.OO#.O.....O..O..#.O..O.O.....O.O.#.O.....OOO.........O.O.O...#..O#..O..O..#O.O.#.#..O.#..#..O#.#
O...#..#..O...O...#..O..O.O.O...........#...#..#........#..OO.#O....#...#....O.........O.#.......#..
O..O###.##.#............#...OO#......#.O..O..#...O.O....O##...#.O.......#.#O..O........##...#.O....O
..#O#....##.O.....###..O.#O.O........#.......O.#...#O..#..OO...#.O...O.OO........###....##OO...O.O..
...O.....O..##....O.O##.OO...O.#.#.#.#.#......O.........O.O#....#.#..O.#.O#OO#.....O.OOO...O....OO..
#..#O...O....................O.#.......O.O...........#O.O....OO.O......O.O##O#.#O.O.O.O...O.O.#.O#O.
.O..O..#...OO.##.#...#.O#.O.###...O......O.......#.O##.O.....##.O......#.O...OO....O#.#..#..O.O.....
....O#.O.O...OO#.O.O#.O...#..........OO....#......O.O#.O.#......O...OOOO..O...##.#...O..#..O..##O.OO
...OO..#O.##O..O...#O.#..O..#.#.#..O#.O..#..#.....O...#.O#..........O....##.O...#O......OO.O..O.....
.#O##.O..#.OO#..O..##O..#.#...........O##.#O.OO#O.....O#..O.....O......O.....O..O...O.#..#..O...#O##
...........#.O#O.#O..O#.....##O....O.#....OO...#..OO..#.O.O#.#OOO....O...#O..#.O#......O.....#.##O..
..##.O.O...O.O..#.......#.O.OO..O....#....O.O.OO..#...O#O##.OO.O.#..#.#O.....##....O.O.O.....#..##.O
#.O.O...#....#..##..O.O.#O.....OO.#O...O......#.O.....OO..O.O.O.O...O..#....#OO.......#......O.#.O..
....#....OO..O##.O..O..OO.OOO.O.O.OO.O...##....O#O.....O....#.#.O...OO.O..#...#.OOO#O..#...OO......#
.O#.OO.O......##....#.#..O#OO..#....#....##O#.O.#...#O..#...OO......O...O#.#.O.O.O..O....O.#O.......
.##OO....##..O...##....O.#.#OOOO.O.#..O..O...#...O.O..O.OO..##..#O.O.......O#O....OO.OO.OO..........
.........O.#..#.....O..OO...#..O.OO...#.O.O.....#....O#..#.OOO.#...#..O.#....#O.......O.O...OO#..O..
#..OO#O......O.O...O#.#..#.O...##O#..O.....OO.O.##.O#O#...O#...#O.O.OO....#O#OO.O.#...O....##.......
OO..OO.....#OO.....O........O.......O#.O......O#.#O...#...O.##.#...O.....O.....O....#O...##O.......#
.#.OO..OOOO..O#O..O......O.#.OO.#.O.........O#OO..#.O.#..#O...O.........O#.#.O#O.OOO.O..#...#.O....#
O#...O#.#..O#.......O....#..#.O#.O.#....#....O..#......O...O...O..##.#O#O......O...#..#..OO..#.OOO..
#.....OO..O..#.OO..#...#.....O#.................##.......O.O..#...#O.O...OO....#OO#....O..O.O..O.O..
..#.......O#O..O.OOO.#........#..OO..O#.#.#..................O..OOO..#.O.....##O....O#..O.OO.O..#O.O
OO...OOO.....O..#O.##.O...#O...O....#......O.O..#OO#O..###O.......O...O..O..............O#....OO.O..
.O..O.#..O........#...##.....O...O##O.O..#.....O.#..#..OO#......O....#..OO.#......O...#O...##......O
...#.##O#.....O..O...O##O...#.O.#.O..O.O....#..O.O#....OO#OO..##.....#...O..##OO.O.O...O#O.....#O...
...#O.OO....O#...O...O....#O..................#.O.O..O.O...O..##O...O#.OO.#..#.#......O.#...O.......
..O...#O.##...O...O...O#O.O..#..O.#O#O....#.#O..#O....O...#.#......#.......#..OO.O.........###O##...
....#O...O.........O............#.OO##.O.O.OO.........O.#.O.#OO.....O..O..##...O#..........#.O..#.O.
.##.O#.O...O#O..#.O...#OO......O..OOOO.......O.O..#....#OO....O.O#O.......#O.....#OO.#.............#
..##..#OO#.......O....................O.........OO..#...O...O.###O..O.......#..O.#.....O.O...O.....O
....#......#..O..#.O.O..O..O...#O.O....#.....O..O.#..#O.#.O#.O#..#.....O.##.O..O#............#.#....
##..#...#..O.O.#O.......O#O..O..O...#O.O............#OO.OO.O...O..#..O..O.O#.O#.....O.O....#.####.#.
O...O#..O#..#.O...OO....#.....OO##.........O.O...O..#..OO#..##.O....O.#..O..O......O....O....O#....O
....#OO.O...OO.....O..##O.#.#..##.#.......O....#O..#......O.#....O.#...#O...O.OO..#OO....#....O.O#O.
...####..O.O....#.#O...#O........OO.O.#O.O.#....#.O...........#....#..O##.O.#OO..#..OO.....OO#.#.##.
.O.O..#....#..#O...#O.....O.#O..O.O#....#...#......#..O.O..#O.O.......#..#..OO..#...#....###O.#...OO
....O#.##...#...........#O.O.O...O.#.O#...#.#.OO#O.O.#OO#.....#...O.O#O.#....O.O.....O.O...#...#.OO.
O..O...OO.#...O.##....#.......##.O..#.##.OOO...#.......O..O.#...#..#....#O.O..O.....O.....O.O.##....
.#OO.##...O.#.............O.#...#....##...O.O.#..O..#O..#.###..OO.#OO#.O.........#...O.......#..#O.O
...O..O...OO.#...O#.#...O..#...O..OO....O.OO.OOO.O...O..O.##O.O.##...O.O.##...#O#....O..OO...#.#.#..
.#...#..O.O.##...#.#..O...OO.##.O....O.O......O.#..O#.#.#..O....#....#O.#..OO...O.OO#.O#...#.O..##..
#..O..#..........O.O#....#OO..#.#...#....#.....#....O....OO...O#....#.#.O##..##O#...#.......#.#O.O#O

42
14/part1.pl Normal file
View File

@@ -0,0 +1,42 @@
:- use_module(library(pio)).
:- use_module(library(clpfd)).
:- initialization(main, main).
:- table rocks/3.
main([FileName|_]) :-
input(FileName, Input),
transpose(Input, Rotated),
concurrent_maplist([Row, [#|Row]]>>(true), Rotated, Rocks),
/*concurrent_*/maplist(row_weight, Rocks, Weights),
sum_list(Weights, W),
writef('%t\n', [W]).
row_weight(Row, Weight) :-
phrase(rocks(Rocks), Row),
convlist([N-'#', N]>>(true), Rocks, RockCounts),
sum_list(RockCounts, Weight),
writef('>> %t <-- %t\n', [Weight, Row]).
rocks([0-0]) --> eos.
rocks([LastN-I, LastN-LastI|Rocks]) -->
[0], rocks([LastN-LastI|Rocks]),
{I is LastI + 1}.
rocks([N-I, LastN-LastI|Rocks]) -->
[1], rocks([LastN-LastI|Rocks]),
{I is LastI + 1, N is LastN + 1}.
rocks([0-I, N-'#', LastN-LastI|Rocks]) -->
[#], rocks([LastN-LastI|Rocks]),
{I is LastI + 1, N is LastN*(2*LastI - LastN + 1) / 2}.
% things below are for reading from input file
input(FileName, Input) :- phrase_from_file(lines(Input), FileName).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> "\n"; eos.
line([1|Chars]) --> "O", line(Chars).
line([0|Chars]) --> ".", line(Chars).
line(['#'|Chars]) --> "#", line(Chars).
eos([], []).

117
14/part2.pl Normal file
View File

@@ -0,0 +1,117 @@
:- use_module(library(pio)).
:- use_module(library(clpfd)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Input),
rolls(Input, 0, [], First-Cycle-Hist),
reverse(Hist, [_|TrueHist]),
BillionOffset is ((999999999 - First) mod Cycle) + First,
nth0(BillionOffset, TrueHist, BillionMap),
% maplist({TrueHist}/[M]>>(
% nth0(Nth, TrueHist, M),
% map_weight(M, W),
% writef('Weight(%t) = %t\n', [Nth, W]),
% print(M)), TrueHist),
write('======================\n'),
print(BillionMap),
map_weight(BillionMap, FinalWeight),
writef('First = %t, Cycle = %t, FinalOffset = %t, Answer = %t\n',
[First, Cycle, BillionOffset, FinalWeight]).
map_weight(Map, W) :- rotate(Map, Rotated), map_weight(Rotated, _, W).
map_weight([_], 0, 0).
map_weight([Row|Map], RowI, W) :-
map_weight(Map, PrevRowI, PrevW),
RowI is PrevRowI + 1,
include(['O']>>(true), Row, Rocks),
length(Rocks, NRocks),
W is PrevW + RowI*NRocks.
rolls(Map, N, Hist, First-Cycle-Hist) :-
match(Map, Hist, Cycle),
First is N - Cycle - 1,
!.
rolls(Map, N, Hist, X) :-
roll(Map, NewMap),
NextN is N + 1,
NewHist = [Map|Hist],
rolls(NewMap, NextN, NewHist, X).
match(Map, [Map|_], 1) :- !.
match(Map, [_|Entries], N) :-
match(Map, Entries, NextN),
N is NextN + 1.
% North is to the left
roll(Map, NewMap) :-
concurrent_maplist(collapse, Map, NorthCollapsed),
rotate(NorthCollapsed, West),
concurrent_maplist(collapse, West, WestCollapsed),
rotate(WestCollapsed, South),
concurrent_maplist(collapse, South, SouthCollapsed),
rotate(SouthCollapsed, East),
concurrent_maplist(collapse, East, EastCollapsed),
rotate(EastCollapsed, NewMap).
rotate(Map, NewMap) :-
transpose(Map, X),
concurrent_maplist(reverse, X, NewMap).
print(Map) :-
rotate(Map, RotMap),
append([[_|RealMap], [_]], RotMap),
maplist([X]>>(
append([_|Y], [_], X),
atomics_to_string(Y, S),
writef('%t\n', [S])), RealMap),
write('\n').
collapse(Row, NewRow) :-
phrase(rock_counts(Counts), Row),
phrase(condense(Zs), Counts),
phrase(reexpand(Zs), NewRow),
true.
reexpand([]) --> eos.
reexpand([N-Next|Rocks]) --> ['#'], stack(N, Next), reexpand(Rocks).
stack(0, 0) --> [], !.
stack(0, Z) --> {NextZ is Z - 1}, ['.'], stack(0, NextZ), !.
stack(N, Z) --> {NextZ is Z - 1, NextN is N - 1}, ['O'], stack(NextN, NextZ).
condense([]) --> [0-0-0].
condense([N-Next|Rocks]) --> [0-I-I, N-z-Next], condense(Rocks), !.
condense(Rocks) --> [_-_-_], condense(Rocks).
rock_counts([0-0-0]) --> [].
rock_counts([LastN-I-LastZ, LastN-LastI-LastZ|Rocks]) -->
['.'], rock_counts([LastN-LastI-LastZ|Rocks]),
{I is LastI + 1}.
rock_counts([N-I-LastZ, LastN-LastI-LastZ|Rocks]) -->
['O'], rock_counts([LastN-LastI-LastZ|Rocks]),
{I is LastI + 1, N is LastN + 1}.
rock_counts([0-I-I, LastN-z-Len, LastN-LastI-LastZ|Rocks]) -->
['#'], rock_counts([LastN-LastI-LastZ|Rocks]),
{I is LastI + 1, Len is I - LastZ - 1}.
% North is to the left
input(FileName, Input) :-
phrase_from_file(lines(Raw), FileName),
concurrent_maplist(pad, Raw, PaddedInput),
concurrent_maplist(reverse, PaddedInput, Reversed),
transpose(Reversed, Rotated),
concurrent_maplist(pad, Rotated, Input).
pad(Row, Rowx) :- append(['#'|Row], ['#'], Rowx).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> "\n"; eos.
line(['O'|Chars]) --> "O", line(Chars).
line(['.'|Chars]) --> ".", line(Chars).
line(['#'|Chars]) --> "#", line(Chars).
eos([], []).

10
14/test.txt Normal file
View File

@@ -0,0 +1,10 @@
O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....

1
15/input.txt Normal file

File diff suppressed because one or more lines are too long

26
15/part1.pl Normal file
View File

@@ -0,0 +1,26 @@
:- use_module(library(pio)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Input),
hashes(Input, Hash),
writef('Answer=%t\n', [Hash]).
hashes(Strs, Hash) :-
concurrent_maplist(reverse, Strs, RStrs),
concurrent_maplist(hash, RStrs, Hashes),
sum_list(Hashes, Hash).
hash([], 0).
hash([C|Str], Hash) :- hash(Str, Prev), Hash is (Prev + C)*17 mod 256.
% Input stuff
input(FileName, Input) :- phrase_from_file(string(Input), FileName).
string([]) --> (eos; "\n"), !.
string([Item|Items]) --> item(Item), string(Items).
item([]) --> (","; "\n"; eos), !.
item([C|Chars]) --> [C], item(Chars).
eos([], []).

47
15/part2.pl Normal file
View File

@@ -0,0 +1,47 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Actions),
perform_all(Actions, Boxes),
findall(Power, power_of_some_lens(Boxes, Power), Powers),
sum_list(Powers, Answer),
writef('Answer=%t\n', [Answer]).
power_of_some_lens(Boxes, Power) :-
nth1(BoxI, Boxes, _-Box),
nth1(LensI, Box, _-Focal),
Power is BoxI * LensI * Focal.
perform_all(Actions, FinalBoxes) :-
length(EmptyBoxes, 256),
foldl([N-[], N, NextN]>>(NextN is N + 1), EmptyBoxes, 0, _),
foldl(perform, Actions, EmptyBoxes, FinalBoxes).
perform(BoxN-Action-Label, Before, After) :-
nth0(BoxN, Before, BoxN-Box),
call(Action, Label, Box, NewBox),
select(BoxN-Box, Before, BoxN-NewBox, After).
remove(_, [], []).
remove(Label, [Label-_|Box], Box) :- !.
remove(Label, [Lens|Box], [Lens|NewBox]) :- remove(Label, Box, NewBox).
add(Focal, Label, Box, NewBox) :- select(Label-_, Box, Label-Focal, NewBox), !.
add(Focal, Label, Box, NewBox) :- append(Box, [Label-Focal], NewBox).
% Input stuff. [0-add(5)-"rn", 3-remove-"cm", ...]
input(Name, Actions) :- phrase_from_file(insts(Actions), Name).
insts([]) --> (eos; "\n"), !.
insts([Box-Action-LabelS|Items]) -->
item(Label-Action), insts(Items),
{reverse(Label, Rev), hash(Rev, Box), string_codes(LabelS, Label)}.
item([]-remove) --> "-", (","; "\n"; eos), !.
item([]-add(N)) --> "=", number(N), (","; "\n"; eos), !.
item([C|Chars]-X) --> [C], item(Chars-X).
hash([], 0).
hash([C|Str], Hash) :- hash(Str, Prev), Hash is (Prev + C)*17 mod 256.

1
15/test.txt Normal file
View File

@@ -0,0 +1 @@
rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7

110
16/input.txt Normal file
View File

@@ -0,0 +1,110 @@
\..../...................-......|..........|...-|.-.............|...................\/......-.................
../|....|.......-...............\....\...........-...............|.......|...........-........................
............................\........../|........./.......................................\.........|....|./||
..................\.//.............-.......\..-.|.......\.......\.............................-..-....|.......
../....\......|.|......|.....|./.-...|......-................//......|.../..-........\............\...........
...|...-.....\...............-.../.................|...............\-................/|...............\.......
|............................./...\.........\.............-....../-..|......|.|.../................\..........
.............-.|.../................|....................../................../..............................-
.......\.\....../.....|...........................-............/..-........-........................\......-..
.....-.\................-.....|\....-....|..../....|.....|.\............./.../.....\...............|....|.....
....|............................/............-|..|.........................-....................-....\.......
|....../......../../............................../....|......\..\....\\./.|................/......\......-./\
........-........./|............................./....\....-................../...|........|........-.........
..........\......./..................|..../.........../.........../........../...................|.-.\.......\
................-..........\....................................../.........\\........-...--..........|..\....
.-./...\......................\...../...\.\../.......|....................-...............\.-....\......./\..\
.......................-.......\..............................\............................\.|...-............
.......|...-..........-........-.......\.........././.-..|..../.....................\.........................
.....................\..|...../........\.....\\\..........\........................-............\..\...\......
....|.................|.........|.................................../.............-...........................
......................|................../....\..|...................-.\.......-\.........................|...
........-.........|.......\.................|................-..|../|\............../......................../
............|.\.................\..-...\.../...-....\...\...........|../..\........\.-........................
......./..............-..//................-.............../................/...-.......-......-............|.
........\|...\......-....|...........\....\./..........-......\......../..-...-...|........|/................\
....\....-../......-..................................|..\/../....-.....|...............\.-.....\............|
...................|..................|...........\............./.......-.......................\..\-../../...
....-..............-..\/.|.......................\.................../......|..-..\......|.........-/.........
........................./..\-..-.|..........-.....-............................\...................../.......
...../../..../....|...|..|...|.......\..\...\........-..../.../......................-....../..\..............
..........\.......\.....|.../.........../....|./.../......-..../.....|-...||......./..........|...\...........
...............................................-.........\.....|..................\|......................\...
.....................................\..................--......-........................-.//-....../-.-.....|
........../..../.....|....\........................|.................................../............./...-/...
........................-............./....-....-...-...........-..............|..............................
......|.....|........-./...\........|......................|........|.......|...-.....|.......................
..-.......-....../.............-..\...................................|.........|..........|............./....
.............................|.....\...........................././|......|................-....-.............
........../..................-..........\....\..../.....\.................-...........|.......................
................../..-......................|...........-|..............-......|......................-.......
-...........-..........|........-.......|\.././.|............................-/.|...........-/...............\
.../..-..........................--.........|...|.|...................................-|...\........|.........
........|.......-............|.........--.........-......./..../........-........\....../..../...........-....
..............-.............../...........................-................./......--..\..../.................
.......................--...........\..............\.......-.......-..|/.....\....-/......../........-........
.............|......|...............-...................\...............\..-.....................|.\.........\
.....\.-....\............\........|........|....\..............\............................................./
............................../...............././.......\.....\..........\|......-......|....|...........|...
................|............/.....|.........|.......\...../...|....-........|................................
./...\............\............|..-....\...\........................\..........\......\.-........../.....\....
.......-...|../..|..-.......-............................................-.....\.........-........../../......
...../.......-......../|..............|...................\......|............/|..........|..|...../..-...|..-
....-.........../../....../\.................................\./.....................-...........-............
.....|....................|.....|.......-..-.........\........|..............|...............-|.|....-/..-....
.\|............-../..\.\.....|....../...|.............\.............................................\.........
........|........../...\....-.......\..\.|-...........|./|./..........\|........--...\........\../............
\..-..-......./.\....../....\..|.........\-...-||/...-...\....\.......-.\.......-................\...\.....\..
................................\............../..-.......................-............./.....................
\............................/...........-......\..-.......-.........../............|...............|.........
......|..|........\.........................../.......-.............-.................../.....................
..........................|......|.../..........................\..................................-......-...
../...................-.........|...\...........-.|/..........|........-.-.................|.......|.........\
........................../......../..................\...........|......\.......................-............
...../..../\.../|....\....................................|....|......................|.........\...........-.
.|...../.....-.....................................|........||........|...........................//..........
........................\............|.............-..........................-......../..............|.......
...................\.........-.........\..........|......................../\...-......................\|.....
........././...........|.|..................../.....................-.............................-.|.|...-...
.-................................................-................-..\........-................../.\....|...|
.................../.|......\..\.\./.\.............|.......................................|..................
...............|............\\.....-..-.........\.....\-|..../............|\.......|.....\.\...../......\.....
...-.............../..........\.....-..|....../......................-.....\.................../.\...........\
...................-.....................................\....\....../....|..\...-................\......-....
.|..-............\........|.....|.\....\......-............\.|....|.\..............\|.|/...\.........|....../.
........../...........|.-/...\......./../.............../.\/......-/........................./......\..|......
........|......................................\..................|............................/........-.-...
...\....../................/...................\../...\\...................\.......|.................-........
.....................................|.........../.\..--.........|\..........|.....-..................|...\...
.../...........\-..-....................\.-..-..........................-........|..../.......................
.........../-.../.............../.\................-.-..\.......\/............\......../...\\\......../.......
.......-..\...\.....\..\...........................|..\.......//..................../../.........|.........-..
......./............../...../.............../............/...../.............\......-...........\...-|.......-
..|......\....................../..................\..................|.....................-....\............
../........................\............/.../...............|............-......................./............
.-...../......\............\............|..........................\../.....\.....................-|.../......
...........|.......\....\.............................\.....................--.....|......................../.
...|......./-.........................../.\......................|................|......|....|../...../......
...-............./..../................-......-....\\..|\...........|...................../....\|.\.-.....-...
............./..//...........|...\|........-/..../.............|......................../.../.................
......\........|........\...\.\........../..../..-.....-......./..|............-......................-.......
....-./............|......|........................./.........\......................................\........
...................................-.........-..../....|../...........\..-....-.|..................../...././.
-...........|.-.......|.../.................|......./.....\..\......|.................................\....\..
......\.....................-....................-......................................|.....................
................................\.......-...........|\......................./..........\-..-................|
....../......|..................\.....|....\...........\...........................................\.......|..
..............-..\..|\.../............\..\.....-.....|.|\......\...................|.........\...........-....
.-.-..\....././.........\.|...-....\....|....|............|..................../.............\................
...|..................................................-.............\../......................................
\................-....................-./.........../.......\./..\|..|....../..-\.-...\..../.....-....|.......
................|.................\|./................-..././\......../...................|....|....|.........
........-...............................................\........................\.........................../
....../..............................\....\...|........\.-........\...............|..../.........../...|......
../....................................|...|...............................\.\..|.............................
...|/|............|............/..........................\.......\.......-.../..--../...........\|...........
.......-..........\...........\/.....-./../................|.|........\\.................................-....
..|..\............\...|........../................................../...................|.\.............-.....
....-.......\/................../....|................-.././..|.........-..........\.|.........../...../..|...
/../.|..............||...\..........\....-.../.....\-..........-.......-........................-.../...\.....
../.|....|......../........-...........................\\......................\...................-..........

70
16/part1.pl Normal file
View File

@@ -0,0 +1,70 @@
:- use_module(library(pio)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Map),
propagate(Map, [0-0-3], FinalMap),
count(FinalMap, Answer),
write(Answer), nl.
count(Map, X) :-
findall(1, (nth0(_, Map, Row), nth0(_, Row, _-D), \+ D = [0,0,0,0]), Ls),
length(Ls, X).
% propagate(Map, Queue, NewMap). 'Dir' is 0/1/2/3 == light coming from N/E/S/W.
propagate(Map, [], Map).
propagate(Map, [X-Y-Dir|Queue], FinalMap) :-
( (nth0(X, Map, Row), nth0(Y, Row, Cell-Done), nth0(Dir, Done, 0))
-> replace(Dir, Done, 1, NewDone),
replace(Y, Row, Cell-NewDone, NewRow),
replace(X, Map, NewRow, NewMap),
call(Cell, X, Y, Dir, NewCells),
append(Queue, NewCells, NewQueue)
; NewQueue = Queue,
NewMap = Map
),
propagate(NewMap, NewQueue, FinalMap).
'.'(X, Y, 0, [NewX-Y-0]) :- NewX is X + 1.
'.'(X, Y, 1, [X-NewY-1]) :- NewY is Y - 1.
'.'(X, Y, 2, [NewX-Y-2]) :- NewX is X - 1.
'.'(X, Y, 3, [X-NewY-3]) :- NewY is Y + 1.
'/'(X, Y, 0, [X-NewY-1]) :- NewY is Y - 1.
'/'(X, Y, 1, [NewX-Y-0]) :- NewX is X + 1.
'/'(X, Y, 2, [X-NewY-3]) :- NewY is Y + 1.
'/'(X, Y, 3, [NewX-Y-2]) :- NewX is X - 1.
'\\'(X, Y, 0, [X-NewY-3]) :- NewY is Y + 1.
'\\'(X, Y, 1, [NewX-Y-2]) :- NewX is X - 1.
'\\'(X, Y, 2, [X-NewY-1]) :- NewY is Y - 1.
'\\'(X, Y, 3, [NewX-Y-0]) :- NewX is X + 1.
'|'(X, Y, 0, NewCells) :- '.'(X, Y, 0, NewCells).
'|'(X, Y, 2, NewCells) :- '.'(X, Y, 2, NewCells).
'|'(X, Y, 3, NewCells) :- '|'(X, Y, 1, NewCells).
'|'(X, Y, 1, [X1-Y-0, X2-Y-2]) :- X1 is X + 1, X2 is X - 1.
'-'(X, Y, 1, NewCells) :- '.'(X, Y, 1, NewCells).
'-'(X, Y, 3, NewCells) :- '.'(X, Y, 3, NewCells).
'-'(X, Y, 2, NewCells) :- '-'(X, Y, 0, NewCells).
'-'(X, Y, 0, [X-Y1-1, X-Y2-3]) :- Y1 is Y - 1, Y2 is Y + 1.
replace(I, List, Elem, NewList) :-
nth0(I, List, _, Rest),
nth0(I, NewList, Elem, Rest).
% Input stuff. Cell-(N,E,S,W) indicating which direction was already handled
input(Name, Map) :- phrase_from_file(lines(Map), Name).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> ("\n"; eos), !.
line([Char-[0,0,0,0]|Chars]) --> [C], line(Chars), {char_code(Char, C)}.
eos([], []).
% Debug stuff
print(Map) :- maplist([X]>>(write(X), nl), Map), nl.

78
16/part2.pl Normal file
View File

@@ -0,0 +1,78 @@
:- use_module(library(pio)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Map),
length(Map, Height), MaxX is Height - 1,
Map = [Row|_], length(Row, Width), MaxY is Width - 1,
findall([X-0-3], between(0, MaxX, X), S1),
findall([X-MaxY-1], between(0, MaxX, X), S2),
findall([0-Y-0], between(0, MaxY, Y), S3),
findall([MaxX-Y-2], between(0, MaxY, Y), S4),
append([S1, S2, S3, S4], Starts),
concurrent_maplist(
{Map}/[S, N]>>(propagate(Map, S, End), count(End, N)), Starts, Ns),
max_list(Ns, Answer),
nl, write(Answer), nl.
count(Map, X) :-
findall(1, (nth0(_, Map, Row), nth0(_, Row, _-D), \+ D = [0,0,0,0]), Ls),
length(Ls, X).
% propagate(Map, Queue, NewMap). 'Dir' is 0/1/2/3 == light coming from N/E/S/W.
propagate(Map, [], Map) :- write("."), flush_output.
propagate(Map, [X-Y-Dir|Queue], FinalMap) :-
( (nth0(X, Map, Row), nth0(Y, Row, Cell-Done), nth0(Dir, Done, 0))
-> replace(Dir, Done, 1, NewDone),
replace(Y, Row, Cell-NewDone, NewRow),
replace(X, Map, NewRow, NewMap),
call(Cell, X, Y, Dir, NewCells),
append(Queue, NewCells, NewQueue)
; NewQueue = Queue,
NewMap = Map
),
propagate(NewMap, NewQueue, FinalMap).
'.'(X, Y, 0, [NewX-Y-0]) :- NewX is X + 1.
'.'(X, Y, 1, [X-NewY-1]) :- NewY is Y - 1.
'.'(X, Y, 2, [NewX-Y-2]) :- NewX is X - 1.
'.'(X, Y, 3, [X-NewY-3]) :- NewY is Y + 1.
'/'(X, Y, 0, [X-NewY-1]) :- NewY is Y - 1.
'/'(X, Y, 1, [NewX-Y-0]) :- NewX is X + 1.
'/'(X, Y, 2, [X-NewY-3]) :- NewY is Y + 1.
'/'(X, Y, 3, [NewX-Y-2]) :- NewX is X - 1.
'\\'(X, Y, 0, [X-NewY-3]) :- NewY is Y + 1.
'\\'(X, Y, 1, [NewX-Y-2]) :- NewX is X - 1.
'\\'(X, Y, 2, [X-NewY-1]) :- NewY is Y - 1.
'\\'(X, Y, 3, [NewX-Y-0]) :- NewX is X + 1.
'|'(X, Y, 0, NewCells) :- '.'(X, Y, 0, NewCells).
'|'(X, Y, 2, NewCells) :- '.'(X, Y, 2, NewCells).
'|'(X, Y, 3, NewCells) :- '|'(X, Y, 1, NewCells).
'|'(X, Y, 1, [X1-Y-0, X2-Y-2]) :- X1 is X + 1, X2 is X - 1.
'-'(X, Y, 1, NewCells) :- '.'(X, Y, 1, NewCells).
'-'(X, Y, 3, NewCells) :- '.'(X, Y, 3, NewCells).
'-'(X, Y, 2, NewCells) :- '-'(X, Y, 0, NewCells).
'-'(X, Y, 0, [X-Y1-1, X-Y2-3]) :- Y1 is Y - 1, Y2 is Y + 1.
replace(I, List, Elem, NewList) :-
nth0(I, List, _, Rest),
nth0(I, NewList, Elem, Rest).
% Input stuff. Cell-(N,E,S,W) indicating which direction was already handled
input(Name, Map) :- phrase_from_file(lines(Map), Name).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> ("\n"; eos), !.
line([Char-[0,0,0,0]|Chars]) --> [C], line(Chars), {char_code(Char, C)}.
eos([], []).
% Debug stuff
print(Map) :- maplist([X]>>(write(X), nl), Map), nl.

10
16/test.txt Normal file
View File

@@ -0,0 +1,10 @@
.|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|....

141
17/input.txt Normal file
View File

@@ -0,0 +1,141 @@
332114151454212113454214512653223255653145556624424154456133366132437365465536664121621126441346245234461242215311265554234431413125424232423
424122453313324434224115136213521634564424342426236222533671444755341166437735256274463642146521245445525564224535224235252421321153331414212
413135332143231235543411242346121246426526353322253563266165247116731545675123735113725356164644235243456435165362223324541111145554434255422
342414155321154351141122633651163361322521331431171711732775134466255552673716661246145621631741136461146333345323514452212522243423331243533
233122133123434345314435544645431134453126541174227715665316662211115137412561563227455475361474445363563152111331443163553513522255241544413
311155314135534244231531535261532514433556673217725631772737642444271655435143741351644364131521776726224131145423362141264421135213424444312
125223544215111353343424155256123365154351463763766674147324253115775277444764475616636627512777314123411653155251461135612231241532431443541
154322542255554251655461341623214513115361722221264336433413737164732151366715314571755667734463471347653566243234254154662144543222435244125
252325122542331561151545613663525144424744652635577332743277337361111426356754123713326313135767754125231545141233212414322652635242142211243
454455312142515231552161246536164222446676131324746654761237342662724443133775752352417235142551513416366647642554343645133342433313112223215
211321313544336425166555444645646314661414271372414365632613313465526437351145461333343753254644114475234636422562331151621222261343242132553
333323312524514633125345124531441435312467416662235315752745412217643724364731152373347747421417475252352125265161445435134163426142233353211
143415113132116416143626162231614424513725134766666676741241522865823673657635526716525717332247166312254667317151665462144364126645223552411
123334222542663461264564446667515346467312356331546413675457588884644474545872866632331424544647524462746756437435461546521636115321425325224
535345333562155134222145436426256733221166524375121367788836878623525623827363242436426285231274677542316742253627612345624461262345554521442
513513214555346252356533625326334371762344355253554747668642823328845258872476637478333343444741446277731137761242516643141361443236463232215
314525145346116555121632636161213754311442177643444555582648638323545372736247584882637437532357337727176314174617322351326335323111115424155
142332123435235625634363646646665357435316213755777836867244734747572768533477723538834633673282641347553626573276175764552564465454441435441
115211236413132455511236635577446251412725323837876686385477828546337857552852634472863357843565343753573547723431623543642234642413143151542
344114335565255663416177255247156565162253555737563755723446262582337484754524764236238872364836885463427235157556711172742232315152424214355
322351245444122231555251374126727321177145723432388575878262785645433733687626542747657328463363325266561117334673213464515334316451252323323
114145243212231145266145633211575313262368663374456836668225838276887736247478522334345632464286642377734773245555273715255363521255411436125
455425264555563656334547167127221744428428767672557672528634562733434744234767632378343637854563773843778372227556167732575433414361653661645
523515321446441335631614642677743527678465286472244872478426436773365258245445623486253654722483532674422763615327372421556232261315262663663
243531332212553542512231776744326572857225588676323528368528574588687496986977437666235744834528878678885244665767573623253644364166116254113
444444112522431332452677416112527782362277632366487625237276747897354943947465889953376837548526737743346528781622556466746677544446126242133
551224351455343155254473223427545326426283637545435543486459335566488585644794556748393635283844433672572582847247363644233223765612263324266
624512252531155611465764114412153772872664238382223677844796388487978588349347899373747553577834454374823787527861133444621766341566356141365
122513321515254337477661465512352573543734686234338559996944463795463356755575964934753954988266763385387234286423462633175673633153162556456
536631433532656576652771312522342646633782573233279989744885775639388386544597879884345946975725737282827242738352524521432253763215654523115
322242133611462672545617461568524454733756842479444543488449547487568897468683955886935535694896858528355443457358667243642313225326142635412
433165134443115323655412565336574774363263823339637755748738478844753443366543756864599667497478638535364437368324232432351147613376615461324
255546365535224352467626565444446263832366733855339686844454779545954833997374664863737346696795866578234664656443247566163775227133522126211
332543346224456342457145637872588878872574934465846438696585998768959393446858386444585949749989395845243437522874257474667424163321432143662
562336531135536464571531445325786432525654973537497993963876555849853689467557948538984566573893374699522258566835263827361447616765121531241
134431331273426633773265462863548226445269397663747657533667545839948559886569784664389446348545683389848688445244623781735357464754775332441
455514441477666641215728225436682865472376638684673865686537967585959697777945778763958683986999446946735832744256768434443442331647672323162
642551661752757431115132444368754488566587583899343636597956846969766697666696549958595334986455854649598564858883536552667547462457766361136
523135446552147326745727437763658824294779583474959943837486894449889786848545858986984945998848759695488574225628248774221513366313255152244
662142534574774471476733285584773353469368338384693894458894844555764768998647478459784635737579344766346566445772776385244757261641646262231
426164675347223367356542678766487676449383835573944385678679999588547686484865465688679958436853663379986545474734678688476311743671535264562
636221515617411216247337338427225735479885464746489395486445598697885986665448699866884656794474879996386956934725254526364324475256241275663
631655547723135622724356638578268487796375786548339985946895559755594954857979446575876457888866863986588685442687887862434325557242465434334
526561675234753571754873872743282697865877868743798687568577798587569899574484554484486596454938697634387879836757377864647232634674626657136
224367751471353647528352332475353678438596388378986467455448887646465576695666985755458794657464949967358875375525855268833747673643621712113
555155247624263644685247526382749435467889975896454465589895886678995785898565848957859844445874878643778658535937624565377735216144455146652
326237275165115664286248564635235597494984939548556988958465866659979766684556496568777489668689659466945846453722248242466764614544772336545
252431512527441277652682654526537378589387973677795869974677788748496486946677468975449899885555473979374748343648488332525562346344443772553
334445255752755383853263265588439634448596738474455889458598988975979996868859879877898797766766846958879864596965328638267846232745551326455
331776676677775667763658323247548647473346994464947655845774859797686965997669898985478769844957676563749678677496544457376882437561732771415
524166432536425482552537234634638489648635668489984866757588557998759988879759786984579576979588678858478864969749575527756262527122755635643
621727645151575887576234428334879934367558864978956787976575789687695598659778579995684454959976779569644787946544773527367553271175577267671
146536267557111863546535476546756933855578657694848587666677867759855877966869976666895795977754986464958576833534434856257276637677672374622
627162456571435862223277266645437845769458457477859464885659565779885987687868765787589649788985577888968356376393555423832745685215266467517
356365425561522443354482823779863564644867657899958444967567857769895796968885877556985858769679467875486466963448536675724876383637637347332
662617714433245736446788383839477478955657876855994484679589576895957757596689789878757698854677478674545986936783367487553578825131414257161
332752445446138652863525378663559896379746684495687998757655759676957899686977876787997889474577748675663489587853377638443448848132472112131
453742717451167763344725476499465974694977569678544576559869769779787858777859878659995587547699787885775974835467735257544662734254664167234
637433522225172664387548695933565599774766649475487879985879567866859778897575697897755575969866878866559366585534438655344868386256513661571
546147626464562275655733897739395889457894577877799798775969558887665695975589685557965565588684599794655433543949864872227536744356275446534
466362637642348545833267889637543575568589757869745856956895658665988768997999655989667957999546697465848679934687374434356755244437463163527
432241752456735627523255338945585453647447657554545955769795789789997877986787567985578897759678944769468657795794576536268322838744716172531
362335524521283767267868233894954334695664994778485687755666859567896666877777856977986957755786769546887535444947538736628443346847462743523
242277366552744663233252489644883664499486849778665576798778978997766697987689796855857957659765978885748744987558355833587345887644235437312
561476674157528347537548599693576474885768577976886585698957697776687879979969876766765577555667674874858777897543556687327834848556466137735
266443423617535645753445779387753884547464964579665696566776797688777799889668699855885667595966647668866856763675976465687353888681336245316
572245756261228737774356774434644334465597956478659678566557786678987687767797677855856669659856465546998943449649767856528226362754511645257
765454637722232528732727987873694678786897686957758658776958776876669697776896797985686878577656659767548457559453559953286436834721254612345
715574444332523722776764939533778537899944495848987975789655786679777697866668686698596879975965745866774945968874839792274752686441541427615
345426643746658264878244879834877886854849486559776688568989799999769977869688867896566869679855957757568478643556858683764734437851357452275
155264155457638423874255465346979399784764447766558558566789767877968796988868867775556888798564684589499477496386865936552684743662561437775
556553777462428352772346536564948445645848965477587585797665668668998889899669897695759889687557667557584743537744477835564286662643223525755
641634624577764727436225779978964774555745645897796877559888677666767998968896788888689868597664985685858554356376665498623746875723662152372
273464717234862288588878479738499968679778769844967858766886688999898688976778797877666987697667878994996657354955977482446733867376656676652
551452257437387582588858645358387357746754779495965859595599878879877987668898767897997855656868855556757747486357487665847763562466422346611
563771242132683432222557436749937783648584568946588665665565698788787787998889676985866968796874695585557699853673538872377582853855131713461
621754271237543666875247946859748999855959977745986585788867866697696868789869768995576776679784564654855987787897358797454368778485716675345
164557236272472546822232846668399389759849987667659785676559867986867888878979688978688695876854496969468763957695738688223564746777531171265
242346713471432688725345548968585493977887799777998877589665998798978979687788866756996567759999475865446943768859868732555538748467434116221
724542325744422353827368477965435394957587656594657956589558869678779879978997989779557567777576965957979596983484379373273827325462765413315
134467152455573564745453678895499973399455464974855888996756898968898666769686667565559598686586858797879648838954569323385654838463315425344
677644725227283525233274374448443847867587946496756687655559798668967889678966568857686688687474797656795664978587359585475743444537567171372
336331514454173343536876798555466989966569868897467756888959675759587897868888779865575958968754759769695636436637498444722662454277255276665
245372163442533628423276455934688944899667958898697795685589868988659597757695978985568755897588876768955385979973858688872756554467423674135
251472373172465268687323637558467886966997454586679595656555799786788685987977899567657589878679656758649535738838795357634278627632741221151
165461424121142643385468264846788537647578965477849879999585588788675566556988859776968656866748767857679947367996538366526226283326214137262
552347532473355256876326459866563676749894796886745598856867798578859675999778699689958599985994868557485944545796355254658552388764762637577
411635777264744624762842767953597944883658696686489566856859985666787779576968666779658795444747587477754964887759644474728635835454465116123
525225774221277357825768273779533699948575746956759694897959969678678956879656896656877599855484649666456453586543836385766273838732235171565
413446335411722332567467583938598777437966488478684886785797667899976899669555696776775778568978567578544555855646936463366758257267556526367
232225126611437885288888224674796768654898896446868958777899786966689959778798898557578584894674968778348499974537656632752837285262221612562
312524227137512563356783624765555493696544874684948745994767775568987755855875779575947858745547754676685368397837548474384853754524257634625
164576266612155222885335524447458943676659664764845487449595699877699967897599959997454474895848957865889443963557382768878244863267411634354
343423173533275137862288876573755898763474747556889894445589898998965697755557969845649449784567454999596856689395535336738467324251433443313
324642722572242663573535885523747435878468838854477747966756946868979567855589567654976484995966698365838477364437873477732253364252715313424
633536551523473523243244283326385679995773658874569756469784895788454454466967676647864944477548686957835935734344472886742338655365237743545
126254446714213213436657334784236857866388445465965986588698754599946596568588549887968594867664769467935498667776266236524482164321464331744
632122261674245423458774627724266986994837445876996574698444995879887876557659858469744965457586679894948948458686783436673327143364537263243
465244311333114323725266442638884838436463333596776867596749549964879559765764848754756989656759354743483867679752528468865454711412437437215
261415356334624227658332247423732949399345845987468987484698858676956555788758758658656776848894849855333685652263222425756836554766646272443
521646365566326414152826643636235965753596433593485485995795654765798865954954774954854696879635646973347786334722533446758821117733417454123
252365462474552424777626563728632557857897556978697654768788568859684765969498588674456548639599966588966387644635645878744172627175772722511
322111677544534553154787663277355446646868855664534468569956798568597597797985774677475959647634668749666469868462232582736411761171527151611
612342244172321553733876453434327274768778644399663358375677775959999689866565698576678735898955879849469468533635274885381342774377452254623
651234151461371123426165832588863365476947993573539948648464444454868478568755779686456634875633856784657866623534635827356542713775643236154
426422164365351275264187473582686768433977556986656756547883959898696745877867456753466554348833684967659438745566626826373666115341437512356
251224616536545656545722482674755228883867595576787346349774537744798879665975566954395436673954998843688762228354424347472522235531376331326
335541164543114144761463764542372366287647948934896437773435546559497746964557357657989773374388363578827574482885664583611615165136533323225
261331415374732264655453647768254758542843666899665464693864936867468988485548354636569486458753866966873563534677586636515154572216163145356
313232345646561617413414322476366687653335889569688478593764445835478384478864579889578586636387865692637456447655326361775525421537351443252
354422624313221353436553153273228525734583687565383399578579988847365867834335367495554595854533343462877332872884662534165677211161214245532
542143423513624235434762263462784556783874775748777548864766786566666483439848384735573868946946858786326267558486871376536352777136111223641
563426221453513247534322123144884253486238658666956647949649676497797648994455393587476533436988875438823554657527344561756544414561541432165
142324116651521772664345223478653548388638657544743867958975353393743498698444676463749436355523368338437534752654673372352117774565612455142
521252364664151234171376543732684442243322874775475946689463578554843486635378489996373438934348323722334326883767125435113461472456453544434
366456342146455776343221412213427758323428237676455365546898955778897855479458369598384867528536647227825337245572327613615476534655616364436
456262313325465615634626471552134825254874668258282367564793649864648953456359464348433437556572444858443732283547165236722572136426516552255
215214555215121531363153365156745726838285476672588458468636756485794378474346453448633724336222848523788322461363427143622643764542154516631
445435243132162412737127746252357518384582434632727743323776457988789744747556744546232245626842323687453554237454472415624653454464312353566
413512155566552553344114742623626673426573822753222774627337845846626888678573728525426326742682452368847826463175721614615753615514521215131
121335422224363443354722134157661571538463676346636753673773667735542264247284835668253673727235386467366265255634467667311151641335353324222
124223214542653663566665314176475124517877488374766545574687862278742556456474375457627645727273436443464373242226321257155151623466354226535
224342321546661552253517421437534637164144462465386448554748656436426565223525648357863358822784435247243523427371615216772115551454466464444
152151341446215313532274524113276662527567472536387628785437566568247675623344644462557726773438776443134255637564367716346225361466131111152
441131264554242642424433222772464422143526743636387232724335464526838833628275276362774824878543373332675711255316334646112165166145436225355
222223346255612511131365546422132224534414716137367462626727462537235434658525224753354265433542656353255435456465556334646626646616114541252
122254524154564644355156315711257331373433572663242435353634872647446868386788243424223288834522715673434774222724734714143326426614126132222
512124425315656654512332445376341167415722616144652756353244273445678654828624424884532254424714514364625764637237362662611534611466615252341
144321153255241633164514444655277754717616621362745215268637475632553485326364864874882263216537664313267663452313553535362633636242154324325
215522151121146641113121366265573756214663745551174365226877835824533746627332877664426625513336257243467577673364646532514644421421452544444
335313335414162252122432222633336424453112573546364534773326574784656537542222587263555442637622533151434567664221616224322511431465543243151
554515254153443453616316365142667412367456471655714423572426445365634244714461517246763535321157222422452237455335224412113513116341541551245
242342552224414663454122443156612324424462742634773552556733543127575614737735454524176471342351442215257671354234543465566226442453421214332
423332221231152525435143325351441332245166165545746441225161776522365226425741716113757265346324464231517554455663426161163531133151125441514
424112342444153352442235323533255342273475361517511641775633616543162217257766644611574212127347362451473365646541415632262325644422215452323
535123215132355441452363223224326111142177116662677154564514756736116151566423375123522315721736346462721611643433515643226113553235433255245
224211552121124334331251616112654554353552524371574216334214517671732613731631733667464726623341735667366531311523356541525225553551524513511
133135253512342521415314125243161342522122244673535175332435771431335676512526131661651773762677772541211631242452526663421451534253432541324
332331532553424153415425566412652656345152461311365447431514137764335267535631223555617762772366325564623566653643641356522511155115525413323
124122513322542451532212635122623231342565341643435327641416177253251451471617514752111736553524423266211413554453514154155451335251224234321
114322223311332542521324344432242254215112631121532433351616521421133465333644152516113467545556154614445514451441162115222213523543445151233

132
17/part1.pl Normal file
View File

@@ -0,0 +1,132 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
% :- table cost/3.
% :- table to_key/2.
main([FileName|_]) :-
input(FileName, Map),
solve(Map, N, Gs, Width, Height),
dict_pairs(Gs, _, GList), transpose_pairs(GList, Gx), max_member(Max-_, Gx),
visualize(Width, Height, Gs, Max, OutMap),
print(OutMap),
write(N), write(" - "), write(Max), nl.
solve(Map, N, EndGs, Width, Height) :-
length(Map, Height), EndX is Height - 1,
Start1 = 0-0-horz, Start2 = 0-0-vert,
to_key(Start1, K1), to_key(Start2, K2), Gs = cost{}.put(K1, 0).put(K2, 0),
Map = [Row0|_], length(Row0, Width), EndY is Width - 1,
heur(0-0, EndX-EndY, Heur0),
list_to_heap([Heur0-Start1, Heur0-Start2], Queue),
astar(Map, Gs, Queue, EndX-EndY, N, EndGs).
from_key(Key, X-Y-Dir) :-
X is Key div 10000,
Y is (Key mod 10000) div 10,
(Key mod 2 =:= 0 -> Dir = horz; Dir = vert).
replace(I, List, E, NewList) :- nth0(I, List, _, R), nth0(I, NewList, E, R).
display(0, " ", _).
display(G, "▗ ", Max) :- 0 < G, G =< (Max div 4).
display(G, "▝▖", Max) :- (Max div 4) < G, G =< 2*(Max div 4).
display(G, "▞▖", Max) :- 2*(Max div 4) < G, G =< 3*(Max div 4).
display(G, "▞▞", Max) :- 3*(Max div 4) < G, G =< 4*(Max div 4).
display(G, "▟▞", Max) :- 4*(Max div 4) < G, G =< 5*(Max div 4).
display(G, "▟▛", Max) :- 5*(Max div 4) < G, G =< 6*(Max div 4).
display(G, "█▛", Max) :- 6*(Max div 4) < G, G =< 7*(Max div 4).
display(G, "██", Max) :- 7*(Max div 4) < G.
put_g(Key-G, OldMap, NewMap) :-
from_key(Key, X-Y-_),
nth0(X, OldMap, OldRow), nth0(Y, OldRow, OldG), NewG is G + OldG,
replace(Y, OldRow, NewG, NewRow),
replace(X, OldMap, NewRow, NewMap).
visualize(Width, Height, Gs, Max, OutMap) :-
length(Row, Width), maplist(=(0), Row),
length(Map, Height), maplist(=(Row), Map),
dict_pairs(Gs, _, GList),
foldl(put_g, GList, Map, GMap),
maplist(
{Max}/[OldRow, NewRow]>>(
maplist(
{Max}/[G, Unicode]>>(
display(G, Unicode, Max)), OldRow, NewRow)),
GMap, OutMap).
astar(_Map, Gs, PQueue, DestX-DestY, N, Gs) :-
get_from_heap(PQueue, _, X-Y-From, _), X = DestX, Y = DestY,
to_key(DestX-DestY-From, FromKey), N = Gs.FromKey, !.
astar(Map, Gs, PQueue, DestX-DestY, N, EndGs) :-
get_from_heap(PQueue, _, X-Y-From, PQueueAfterPop),
to_key(X-Y-From, CurrentKey), CurrentG = Gs.CurrentKey,
findall(To-Cost, next(Map, X-Y-From, To, Cost), Neighbors),
foldl(add_neighbor(CurrentG, DestX-DestY),
Neighbors, PQueueAfterPop-Gs, NewPQueue-NewGs),
astar(Map, NewGs, NewPQueue, DestX-DestY, N, EndGs).
add_neighbor(CurrentG, DestX-DestY, (X-Y-Dir)-Cost, HeapIn-GsIn, HeapOut-GsOut) :-
NewGCandidate is CurrentG + Cost,
to_key(X-Y-Dir, Key), ExistingG = GsIn.get(Key, 9999999),
( NewGCandidate < ExistingG
-> NewG = NewGCandidate, GsOut = GsIn.put(Key, NewG),
heur(X-Y, DestX-DestY, Heur), Weight is NewG + Heur,
( get_from_heap(HeapIn, _, X-Y-Dir, _), HeapOut = HeapIn
; add_to_heap(HeapIn, Weight, X-Y-Dir, HeapOut)
)
; GsOut = GsIn, HeapOut = HeapIn
).
to_key(X-Y-horz, Key) :- Key is 0 + Y*10 + X* 10000.
to_key(X-Y-vert, Key) :- Key is 1 + Y*10 + X* 10000.
next(Map, X-Y-horz, NextX-Y-vert, Cost) :-
LowX1 is X - 3, HighX1 is X - 1,
LowX2 is X + 1, HighX2 is X + 3,
(between(LowX1, HighX1, NextX); between(LowX2, HighX2, NextX)),
vert(Map, X-Y, NextX, Cost).
next(Map, X-Y-vert, X-NextY-horz, Cost) :-
LowY1 is Y - 3, HighY1 is Y - 1,
LowY2 is Y + 1, HighY2 is Y + 3,
(between(LowY1, HighY1, NextY); between(LowY2, HighY2, NextY)),
horz(Map, X-Y, NextY, Cost).
vert(Map, X-Y, NextX, Cost) :-
cost(Map, NextX-Y, _),
findall(
Ci,
( (X < NextX -> between(X, NextX, Xi); between(NextX, X, Xi)),
Xi =\= X,
cost(Map, Xi-Y, Ci)),
Costs),
sum_list(Costs, Cost).
% Cost = Costs.
horz(Map, X-Y, NextY, Cost) :-
cost(Map, X-NextY, _),
findall(
Ci,
( (Y < NextY -> between(Y, NextY, Yi); between(NextY, Y, Yi)),
Yi =\= Y,
cost(Map, X-Yi, Ci)),
Costs),
sum_list(Costs, Cost).
% Cost = Costs.
heur(X1-Y1, X2-Y2, Dist) :- Dist is abs(X1 - X2) + abs(Y1 - Y2).
cost(Map, X-Y, Cost) :- nth0(X, Map, Row), nth0(Y, Row, Cost).
print(Map) :- maplist([X]>>(atomic_list_concat(X, N), write(N), nl), Map).
input(Name, Map) :- phrase_from_file(lines(Map), Name).
lines([]) --> eos, !.
lines([Nums|Lines]) -->
line(Line), lines(Lines),
{maplist([C, N]>>(N is C - 48), Line, Nums)}.
line(Nums) --> digits(Nums), "\n".

132
17/part2.pl Normal file
View File

@@ -0,0 +1,132 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
% :- table cost/3.
% :- table to_key/2.
main([FileName|_]) :-
input(FileName, Map),
solve(Map, N, Gs, Width, Height),
dict_pairs(Gs, _, GList), transpose_pairs(GList, Gx), max_member(Max-_, Gx),
visualize(Width, Height, Gs, Max, OutMap),
print(OutMap),
write(N), write(" - "), write(Max), nl.
solve(Map, N, EndGs, Width, Height) :-
length(Map, Height), EndX is Height - 1,
Start1 = 0-0-horz, Start2 = 0-0-vert,
to_key(Start1, K1), to_key(Start2, K2), Gs = cost{}.put(K1, 0).put(K2, 0),
Map = [Row0|_], length(Row0, Width), EndY is Width - 1,
heur(0-0, EndX-EndY, Heur0),
list_to_heap([Heur0-Start1, Heur0-Start2], Queue),
astar(Map, Gs, Queue, EndX-EndY, N, EndGs).
from_key(Key, X-Y-Dir) :-
X is Key div 10000,
Y is (Key mod 10000) div 10,
(Key mod 2 =:= 0 -> Dir = horz; Dir = vert).
replace(I, List, E, NewList) :- nth0(I, List, _, R), nth0(I, NewList, E, R).
display(0, " ", _).
display(G, "▗ ", Max) :- 0 < G, G =< (Max div 4).
display(G, "▝▖", Max) :- (Max div 4) < G, G =< 2*(Max div 4).
display(G, "▞▖", Max) :- 2*(Max div 4) < G, G =< 3*(Max div 4).
display(G, "▞▞", Max) :- 3*(Max div 4) < G, G =< 4*(Max div 4).
display(G, "▟▞", Max) :- 4*(Max div 4) < G, G =< 5*(Max div 4).
display(G, "▟▛", Max) :- 5*(Max div 4) < G, G =< 6*(Max div 4).
display(G, "█▛", Max) :- 6*(Max div 4) < G, G =< 7*(Max div 4).
display(G, "██", Max) :- 7*(Max div 4) < G.
put_g(Key-G, OldMap, NewMap) :-
from_key(Key, X-Y-_),
nth0(X, OldMap, OldRow), nth0(Y, OldRow, OldG), NewG is G + OldG,
replace(Y, OldRow, NewG, NewRow),
replace(X, OldMap, NewRow, NewMap).
visualize(Width, Height, Gs, Max, OutMap) :-
length(Row, Width), maplist(=(0), Row),
length(Map, Height), maplist(=(Row), Map),
dict_pairs(Gs, _, GList),
foldl(put_g, GList, Map, GMap),
maplist(
{Max}/[OldRow, NewRow]>>(
maplist(
{Max}/[G, Unicode]>>(
display(G, Unicode, Max)), OldRow, NewRow)),
GMap, OutMap).
astar(_Map, Gs, PQueue, DestX-DestY, N, Gs) :-
get_from_heap(PQueue, _, X-Y-From, _), X = DestX, Y = DestY,
to_key(DestX-DestY-From, FromKey), N = Gs.FromKey, !.
astar(Map, Gs, PQueue, DestX-DestY, N, EndGs) :-
get_from_heap(PQueue, _, X-Y-From, PQueueAfterPop),
to_key(X-Y-From, CurrentKey), CurrentG = Gs.CurrentKey,
findall(To-Cost, next(Map, X-Y-From, To, Cost), Neighbors),
foldl(add_neighbor(CurrentG, DestX-DestY),
Neighbors, PQueueAfterPop-Gs, NewPQueue-NewGs),
astar(Map, NewGs, NewPQueue, DestX-DestY, N, EndGs).
add_neighbor(CurrentG, DestX-DestY, (X-Y-Dir)-Cost, HeapIn-GsIn, HeapOut-GsOut) :-
NewGCandidate is CurrentG + Cost,
to_key(X-Y-Dir, Key), ExistingG = GsIn.get(Key, 9999999),
( NewGCandidate < ExistingG
-> NewG = NewGCandidate, GsOut = GsIn.put(Key, NewG),
heur(X-Y, DestX-DestY, Heur), Weight is NewG + Heur,
( get_from_heap(HeapIn, _, X-Y-Dir, _), HeapOut = HeapIn
; add_to_heap(HeapIn, Weight, X-Y-Dir, HeapOut)
)
; GsOut = GsIn, HeapOut = HeapIn
).
to_key(X-Y-horz, Key) :- Key is 0 + Y*10 + X* 10000.
to_key(X-Y-vert, Key) :- Key is 1 + Y*10 + X* 10000.
next(Map, X-Y-horz, NextX-Y-vert, Cost) :-
LowX1 is X - 10, HighX1 is X - 4,
LowX2 is X + 4, HighX2 is X + 10,
(between(LowX1, HighX1, NextX); between(LowX2, HighX2, NextX)),
vert(Map, X-Y, NextX, Cost).
next(Map, X-Y-vert, X-NextY-horz, Cost) :-
LowY1 is Y - 10, HighY1 is Y - 4,
LowY2 is Y + 4, HighY2 is Y + 10,
(between(LowY1, HighY1, NextY); between(LowY2, HighY2, NextY)),
horz(Map, X-Y, NextY, Cost).
vert(Map, X-Y, NextX, Cost) :-
cost(Map, NextX-Y, _),
findall(
Ci,
( (X < NextX -> between(X, NextX, Xi); between(NextX, X, Xi)),
Xi =\= X,
cost(Map, Xi-Y, Ci)),
Costs),
sum_list(Costs, Cost).
% Cost = Costs.
horz(Map, X-Y, NextY, Cost) :-
cost(Map, X-NextY, _),
findall(
Ci,
( (Y < NextY -> between(Y, NextY, Yi); between(NextY, Y, Yi)),
Yi =\= Y,
cost(Map, X-Yi, Ci)),
Costs),
sum_list(Costs, Cost).
% Cost = Costs.
heur(X1-Y1, X2-Y2, Dist) :- Dist is abs(X1 - X2) + abs(Y1 - Y2).
cost(Map, X-Y, Cost) :- nth0(X, Map, Row), nth0(Y, Row, Cost).
print(Map) :- maplist([X]>>(atomic_list_concat(X, N), write(N), nl), Map).
input(Name, Map) :- phrase_from_file(lines(Map), Name).
lines([]) --> eos, !.
lines([Nums|Lines]) -->
line(Line), lines(Lines),
{maplist([C, N]>>(N is C - 48), Line, Nums)}.
line(Nums) --> digits(Nums), "\n".

13
17/test.txt Normal file
View File

@@ -0,0 +1,13 @@
2413432311323
3215453535623
3255245654254
3446585845452
4546657867536
1438598798454
4457876987766
3637877979653
4654967986887
4564679986453
1224686865563
2546548887735
4322674655533

604
18/input.txt Normal file
View File

@@ -0,0 +1,604 @@
R 2 (#3e6b80)
U 6 (#2b1de3)
R 4 (#1465b0)
U 2 (#549d23)
R 6 (#aa9992)
U 6 (#27e7f3)
R 7 (#aa9990)
U 6 (#5a3933)
R 5 (#1465b2)
U 5 (#23ade3)
R 4 (#49b5b2)
U 6 (#39ad53)
R 7 (#54c4f2)
U 5 (#491513)
R 9 (#4f5960)
U 5 (#357be3)
R 3 (#4f2140)
U 6 (#258b43)
R 4 (#4f9570)
U 3 (#1ea371)
R 8 (#7be6c0)
U 5 (#67bd61)
R 5 (#a31240)
U 6 (#6bf7d1)
R 5 (#a31242)
U 4 (#3464a1)
R 3 (#7be6c2)
U 4 (#33f091)
R 5 (#5c0530)
U 6 (#4c4e11)
R 2 (#611e90)
U 3 (#128231)
R 6 (#5ecef2)
D 9 (#6eb251)
R 5 (#5e54d2)
U 9 (#1e8081)
R 3 (#73a8b0)
U 10 (#6dc731)
R 3 (#84d470)
U 2 (#6b91a1)
R 7 (#64edf0)
U 5 (#4da881)
R 10 (#710072)
D 5 (#4aa4f1)
R 7 (#4dd192)
D 6 (#4aa4f3)
R 3 (#2af062)
D 6 (#6fabe1)
R 5 (#177cc0)
U 5 (#26ba61)
R 5 (#5a3aa0)
U 9 (#3b5401)
R 5 (#012590)
U 2 (#747f11)
R 4 (#753b32)
U 7 (#965a31)
R 4 (#753b30)
U 3 (#20c281)
R 5 (#225830)
U 4 (#7a4da1)
R 4 (#716560)
U 6 (#036ca1)
R 5 (#55fd00)
D 4 (#064ad1)
R 4 (#93a480)
D 6 (#411d21)
R 3 (#990d00)
D 6 (#4af4a1)
R 3 (#0f8880)
D 4 (#0f56c3)
R 3 (#7f2590)
U 7 (#0f56c1)
R 7 (#374e40)
U 6 (#4af4a3)
R 2 (#161a20)
U 3 (#5277d1)
R 5 (#7c6760)
U 4 (#528313)
R 4 (#525840)
U 4 (#267643)
L 10 (#525842)
U 5 (#501273)
L 4 (#447950)
D 10 (#69cdc3)
L 3 (#530a00)
U 10 (#590643)
L 5 (#243450)
D 5 (#74a853)
L 6 (#7c2a42)
U 5 (#1d9673)
L 3 (#3f8d62)
U 8 (#606b43)
L 5 (#576480)
D 8 (#63d243)
L 5 (#86ad60)
U 4 (#63d241)
L 7 (#0be9f0)
U 8 (#4b0801)
L 2 (#64f9c0)
U 4 (#478081)
R 9 (#20b940)
U 4 (#a60cd1)
L 9 (#02c6a0)
U 5 (#0d8be1)
L 4 (#8226e0)
D 6 (#013a81)
L 3 (#5cf860)
D 4 (#985951)
L 5 (#162d72)
D 2 (#1c2c31)
L 2 (#654f82)
D 4 (#51b4e1)
R 10 (#401a32)
D 5 (#32c291)
L 7 (#84ff82)
D 2 (#25cf41)
L 3 (#43b090)
D 4 (#6208d1)
L 3 (#a428a0)
U 9 (#6208d3)
L 3 (#07d9c0)
U 9 (#6e8a01)
L 2 (#3ab640)
U 3 (#187711)
L 4 (#162d70)
U 6 (#8e5a81)
L 6 (#049580)
D 6 (#a81333)
L 2 (#342030)
D 3 (#233073)
L 7 (#510730)
D 4 (#15cbf3)
R 3 (#507520)
D 5 (#3be881)
R 6 (#52f2a0)
D 3 (#a52711)
L 3 (#0d7680)
D 5 (#1db6c3)
L 5 (#5f0450)
U 5 (#6c6d73)
L 2 (#47abc0)
D 5 (#707733)
L 5 (#771be2)
D 2 (#151c53)
L 3 (#413da2)
D 3 (#768703)
R 11 (#640b02)
D 2 (#37b343)
R 4 (#4ac8d0)
D 5 (#016421)
L 2 (#907990)
D 5 (#016423)
L 3 (#412220)
U 5 (#0f5603)
L 9 (#5e11d0)
D 5 (#24abb1)
L 7 (#1ab552)
U 2 (#06e641)
L 2 (#9e07e2)
U 4 (#06e643)
L 6 (#51f692)
U 4 (#763581)
L 8 (#3716a0)
U 4 (#1360d1)
R 5 (#567bc0)
U 2 (#222831)
R 9 (#7d2160)
U 6 (#72b991)
L 6 (#4a6840)
U 3 (#3ef773)
L 4 (#626a10)
U 4 (#4c3d93)
L 4 (#6fa5e2)
D 4 (#6e0b33)
L 4 (#6fa5e0)
U 3 (#38aaf3)
L 5 (#223552)
U 5 (#025c33)
L 4 (#4205c2)
D 4 (#49ddd3)
L 3 (#3aa782)
D 4 (#028fd3)
L 5 (#76e842)
D 3 (#028fd1)
L 3 (#9bc962)
U 4 (#6bde73)
L 9 (#9d6be0)
U 6 (#2db831)
L 5 (#1192c0)
U 3 (#6b5c33)
L 4 (#152940)
U 4 (#746923)
L 5 (#8648a0)
U 3 (#4cb8d1)
L 3 (#877170)
U 5 (#24ca21)
L 4 (#877172)
D 3 (#6e4261)
L 2 (#691310)
D 6 (#655001)
R 6 (#7e7740)
D 3 (#1562b1)
L 6 (#261a00)
D 4 (#700e91)
L 4 (#6ade10)
U 9 (#4a1251)
L 3 (#5a7c00)
U 7 (#5a30e1)
L 6 (#15a832)
U 3 (#152e01)
L 3 (#643622)
U 5 (#977db1)
L 7 (#4b7bc2)
U 2 (#546691)
L 7 (#8cd5a2)
U 7 (#5b7a31)
R 3 (#6c85f2)
U 6 (#6996a1)
R 8 (#458692)
U 3 (#370e51)
R 6 (#7bc6d2)
U 4 (#07aa01)
R 4 (#389dc2)
U 6 (#3de6d3)
R 6 (#54ece2)
U 5 (#625703)
R 10 (#0e9512)
D 5 (#1e8793)
R 3 (#873d92)
U 4 (#2eb4b3)
R 5 (#2d3432)
U 5 (#26b2f1)
R 2 (#2c8c52)
U 3 (#2ff4c1)
R 7 (#0e68f2)
U 3 (#32b371)
R 8 (#0e68f0)
U 4 (#5d6fb1)
R 3 (#128622)
U 5 (#06af41)
R 6 (#a95192)
U 4 (#274af1)
R 3 (#3af302)
U 6 (#50fff3)
R 6 (#3f9cf2)
U 2 (#50fff1)
R 3 (#4734a2)
U 3 (#1a5051)
L 12 (#986ce0)
U 3 (#224b61)
R 9 (#2d66c0)
U 4 (#6f2a31)
R 6 (#0aba80)
U 7 (#0ecb81)
R 4 (#606870)
U 3 (#0ecb83)
L 3 (#4e78e0)
U 3 (#4563f1)
L 11 (#8bed00)
U 3 (#3298c1)
L 5 (#5a39d0)
U 2 (#51d641)
L 8 (#8e6ee0)
U 4 (#233851)
R 4 (#31c7a0)
U 9 (#728831)
R 3 (#670cd0)
U 4 (#1f3621)
L 7 (#8df230)
U 4 (#44a361)
R 7 (#2aed30)
U 7 (#2a0161)
R 4 (#1db2c0)
U 3 (#6387c1)
R 3 (#1886b0)
D 3 (#128c21)
R 3 (#acb330)
D 3 (#3a9d01)
L 4 (#3658a0)
D 6 (#00ec51)
R 4 (#682712)
D 6 (#2440e1)
R 5 (#45f812)
D 9 (#6298d1)
R 3 (#778f22)
U 4 (#6298d3)
R 2 (#271462)
U 10 (#0d5ff1)
L 4 (#6a69e2)
U 5 (#0d5ff3)
R 6 (#24b5e2)
U 3 (#2440e3)
R 5 (#5f3192)
U 4 (#41c313)
R 3 (#236852)
U 7 (#6e15c1)
R 8 (#5187b2)
D 5 (#6e15c3)
R 2 (#65a3d2)
D 4 (#41c311)
R 11 (#3dfa02)
D 4 (#26ca51)
R 5 (#4e3912)
D 6 (#797803)
R 5 (#2f8ee2)
U 5 (#2a9b83)
R 8 (#3d6702)
D 5 (#4646e3)
R 3 (#3d6700)
D 2 (#43a1c3)
R 4 (#592f22)
D 3 (#9d61c1)
R 4 (#1f90f2)
D 5 (#172261)
R 7 (#5a7ba2)
D 8 (#797801)
R 6 (#4e4ad2)
D 8 (#28fda1)
R 5 (#55a862)
D 4 (#28fda3)
R 5 (#1665a2)
D 6 (#3fca41)
R 9 (#850700)
D 3 (#43f8f1)
R 3 (#3cbd90)
D 6 (#620311)
R 8 (#70b2b2)
D 6 (#25cb11)
R 3 (#336c52)
D 4 (#8da331)
R 4 (#336c50)
D 5 (#0594c1)
R 3 (#4a2b92)
U 8 (#31cac1)
R 5 (#392742)
D 8 (#233743)
R 6 (#798b32)
D 4 (#233741)
R 6 (#4fcde2)
D 4 (#1ffd91)
L 9 (#207ed2)
U 5 (#9314d1)
L 9 (#056d22)
D 5 (#56c131)
L 9 (#431340)
D 6 (#94bbb1)
R 8 (#357120)
D 2 (#19ca71)
R 8 (#8bebb0)
D 6 (#4257c1)
R 8 (#0c4fc0)
D 3 (#380131)
R 3 (#07a260)
D 3 (#02a841)
L 11 (#100a10)
D 2 (#07ad11)
L 4 (#4a2b90)
D 3 (#10d091)
R 6 (#609d22)
D 2 (#69a281)
R 9 (#320ed2)
D 5 (#0782c1)
R 2 (#67c382)
D 2 (#19a311)
R 7 (#14e152)
D 3 (#4ee351)
R 5 (#14e150)
D 8 (#54dae1)
R 3 (#428ba2)
D 5 (#0a5431)
R 3 (#1880e2)
D 2 (#2fc091)
R 9 (#440bc0)
D 6 (#758b11)
R 6 (#6a54b0)
D 3 (#31f8d1)
L 6 (#37e190)
D 5 (#0c4af1)
L 4 (#6acc62)
D 2 (#161df1)
L 4 (#72f272)
D 4 (#161df3)
L 7 (#088332)
D 4 (#182831)
L 8 (#82d720)
D 3 (#371df1)
L 7 (#7207b0)
D 6 (#206d61)
R 4 (#0c1082)
D 2 (#796721)
R 6 (#220252)
D 7 (#2948a1)
R 7 (#5f2c02)
U 7 (#137d21)
R 3 (#0fe252)
D 2 (#0164d1)
R 6 (#1ce912)
D 6 (#4e0983)
R 2 (#7d7c72)
D 11 (#598c93)
R 4 (#581202)
D 8 (#0ffba3)
L 4 (#500e32)
D 2 (#42bcf3)
R 4 (#31e852)
D 8 (#2d8913)
R 4 (#1d67d2)
D 5 (#5a03c3)
R 9 (#45c0b0)
D 4 (#3a1e53)
L 9 (#687430)
D 4 (#3a1e51)
L 4 (#25b1b0)
D 8 (#613e03)
L 7 (#4ea210)
D 8 (#366193)
L 3 (#4cb7c2)
D 8 (#452333)
L 6 (#675322)
D 6 (#6ae223)
L 3 (#0d88b2)
D 2 (#23a4a3)
L 8 (#60f512)
D 5 (#568a53)
L 3 (#0cbd02)
D 3 (#4bad03)
L 4 (#588672)
D 4 (#72dfa3)
L 2 (#960472)
D 9 (#394403)
L 5 (#28bcc2)
D 6 (#4eb073)
L 6 (#04e992)
D 3 (#22c803)
L 3 (#a76142)
D 5 (#22c801)
R 10 (#171512)
D 3 (#25f2f3)
R 6 (#581600)
D 7 (#3d0f33)
L 8 (#142a40)
D 4 (#6eb893)
L 5 (#142a42)
U 4 (#02a243)
L 9 (#522a40)
U 2 (#4d2a01)
L 4 (#081760)
D 7 (#17c601)
R 4 (#081762)
D 6 (#497a01)
R 5 (#2fbb50)
D 3 (#4be663)
R 4 (#3b3140)
D 2 (#48f803)
R 3 (#69ec82)
U 3 (#80c993)
R 5 (#3f05f2)
U 8 (#5d5463)
R 4 (#50d1c2)
D 3 (#472973)
R 3 (#1b68a2)
D 5 (#5ebab3)
R 7 (#464fd2)
D 3 (#64c0a1)
L 7 (#4062d2)
D 6 (#8e33b3)
L 5 (#1c3382)
D 6 (#8e33b1)
L 4 (#50b882)
D 4 (#64c0a3)
L 2 (#2bcfb2)
D 7 (#84fc61)
L 3 (#413452)
U 10 (#84fc63)
L 3 (#47ad42)
U 2 (#03ba03)
L 3 (#7197b2)
U 5 (#81aa33)
L 8 (#5c0552)
D 5 (#235433)
L 5 (#4236f2)
D 5 (#4e9bc3)
L 5 (#3740a0)
D 2 (#1e7f23)
L 10 (#3740a2)
U 3 (#5f66a3)
R 4 (#4236f0)
U 7 (#164f83)
R 4 (#5d1a30)
U 3 (#1192e1)
R 4 (#4c67a0)
U 5 (#954a91)
L 8 (#3348c0)
U 3 (#306c01)
L 4 (#694200)
U 8 (#52c163)
L 3 (#6abee0)
U 3 (#26c123)
L 4 (#6abee2)
U 4 (#4c3413)
L 9 (#4e8800)
U 5 (#1192e3)
L 3 (#2bb700)
U 4 (#21ceb1)
L 12 (#4ec360)
U 3 (#21ceb3)
L 4 (#32f940)
U 8 (#5d5f73)
L 4 (#1dcf10)
U 9 (#3cf413)
L 3 (#7cc870)
U 8 (#5f0953)
L 4 (#376c70)
U 6 (#01d623)
L 5 (#697e50)
U 5 (#99e693)
L 5 (#6f63b0)
U 3 (#576c53)
R 10 (#7fa030)
U 3 (#1fd933)
L 5 (#4eb2d2)
U 6 (#39a1f3)
L 4 (#3f0452)
D 4 (#42ffd3)
L 3 (#5b9d52)
U 7 (#25c2d3)
L 8 (#5ba250)
D 7 (#40d763)
L 5 (#5ba252)
D 3 (#5f2a73)
L 7 (#477ce2)
D 3 (#2652d1)
L 5 (#453770)
D 5 (#758781)
L 11 (#453772)
D 3 (#937381)
L 2 (#119e62)
D 5 (#131891)
R 5 (#3285e2)
U 3 (#211fd3)
R 11 (#8349d2)
U 4 (#211fd1)
R 4 (#3246c2)
U 3 (#2515f3)
R 9 (#5a5bd0)
D 7 (#6fbf83)
R 4 (#6a5680)
D 3 (#6fbf81)
R 9 (#329240)
D 7 (#750063)
R 5 (#5e71f2)
D 9 (#3358d3)
L 6 (#1d2652)
D 4 (#6a8ee3)
L 3 (#4e9cd2)
U 6 (#3e8623)
L 2 (#3607d2)
U 5 (#379d43)
L 6 (#3cf342)
U 3 (#853b63)
L 3 (#737102)
D 3 (#1de1b3)
L 2 (#66ff82)
D 10 (#634163)
L 3 (#2eff02)
U 6 (#2ac343)
L 2 (#528a42)
U 7 (#4d81d3)
L 3 (#2ea1e2)
D 5 (#19e063)
L 6 (#8b5a82)
D 7 (#4b8e33)
L 4 (#5e41d0)
D 2 (#159903)
L 5 (#31f3c0)
D 9 (#537013)
L 2 (#31f3c2)
D 7 (#4b7b43)
L 4 (#5bd890)
D 10 (#1be163)
L 5 (#0c3340)
D 3 (#540d83)
L 9 (#2449f0)
U 6 (#9411c1)
L 7 (#766db0)
U 7 (#9411c3)
L 4 (#37ee30)
D 3 (#516ad3)
L 3 (#0991b0)
D 2 (#98a733)
L 5 (#0ea042)
D 3 (#513f83)
L 2 (#a0c682)
D 8 (#616323)
L 4 (#a0c680)
D 3 (#4555b3)
L 3 (#79e032)
U 9 (#673de3)
L 4 (#5904b0)
U 7 (#495bd3)
L 3 (#5904b2)
U 2 (#49a633)
L 5 (#76a9c2)
U 10 (#10de23)

27
18/part1.pl Normal file
View File

@@ -0,0 +1,27 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Moves),
area(Moves, Area),
write(Area), nl.
area(Moves, Area) :-
area(Moves, 0, A1), MainArea is abs(A1),
convlist([r-N, N]>>(true), Moves, Horzs), sum_list(Horzs, Horz),
convlist([u-N, N]>>(true), Moves, Verts), sum_list(Verts, Vert),
Area is MainArea + Horz + Vert + 1.
area([], _, 0).
area([u-Len|Moves], H, Area) :- NewH is H + Len, area(Moves, NewH, Area).
area([d-Len|Moves], H, Area) :- NewH is H - Len, area(Moves, NewH, Area).
area([r-Len|Moves], H, Area) :- area(Moves, H, Area2), Area is Area2 + H*Len.
area([l-Len|Moves], H, Area) :- area(Moves, H, Area2), Area is Area2 - H*Len.
input(FileName, Moves) :- phrase_from_file(moves(Moves), FileName).
moves([]) --> eos, !.
moves([Move|Moves]) --> move(Move), moves(Moves).
move(DirAtom-Len) -->
alpha_to_lower(Dir), " ", number(Len), " (#", xdigits(_Color), ")", ("\n"; eos),
{char_code(DirAtom, Dir)}.

31
18/part2.pl Normal file
View File

@@ -0,0 +1,31 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Moves),
area(Moves, Area),
write(Area), nl.
area(Moves, Area) :-
area(Moves, 0, A1), MainArea is abs(A1),
convlist([r-N, N]>>(true), Moves, Horzs), sum_list(Horzs, Horz),
convlist([u-N, N]>>(true), Moves, Verts), sum_list(Verts, Vert),
Area is MainArea + Horz + Vert + 1.
area([], _, 0).
area([u-Len|Moves], H, Area) :- NewH is H + Len, area(Moves, NewH, Area).
area([d-Len|Moves], H, Area) :- NewH is H - Len, area(Moves, NewH, Area).
area([r-Len|Moves], H, Area) :- area(Moves, H, Area2), Area is Area2 + H*Len.
area([l-Len|Moves], H, Area) :- area(Moves, H, Area2), Area is Area2 - H*Len.
input(FileName, Moves) :- phrase_from_file(moves(Moves), FileName).
moves([]) --> eos, !.
moves([Move|Moves]) --> move(Move), moves(Moves).
move(DirAtom-Len) -->
alpha_to_lower(_), " ", number(_), " (#", xinteger(Hex), ")", ("\n"; eos),
{DirNum is Hex /\ 15, dir(DirNum, DirAtom), Len is Hex >> 4}.
dir(0, r).
dir(1, d).
dir(2, l).
dir(3, u).

14
18/test.txt Normal file
View File

@@ -0,0 +1,14 @@
R 6 (#70c710)
D 5 (#0dc571)
L 2 (#5713f0)
D 2 (#d2c081)
R 2 (#59c680)
D 2 (#411b91)
L 5 (#8ceee2)
U 2 (#caa173)
L 1 (#1b58a2)
U 2 (#caa171)
R 2 (#7807d2)
U 3 (#a77fa3)
L 2 (#015232)
U 2 (#7a21e3)

733
19/input.txt Normal file
View File

@@ -0,0 +1,733 @@
vvr{a>520:jq,s<3691:R,a>325:A,R}
dmg{s<1730:A,x<3350:R,R}
ctv{s<3757:R,R}
xhh{a<3542:A,A}
cpx{m<1847:A,R}
qqg{a<911:nf,lpf}
mnr{a>1914:A,x>752:A,A}
ktx{m<1153:R,A}
mkz{a>2959:A,a<2378:rlr,R}
br{x>2184:A,s>3693:A,s>3530:R,A}
fpk{a<2465:A,a>2524:A,A}
ffs{a>536:A,a>328:A,s>3058:R,R}
zcl{m>2554:pz,a>2167:gr,qs}
lpf{a>1643:hc,x>3626:xxp,mth}
vl{x>2958:R,R}
nrs{m>2481:R,x>3117:A,m<1978:R,R}
sv{m<1749:R,rl}
tv{x<219:R,a<1429:A,m<2884:R,A}
nl{m>1827:A,m>1345:A,x>2928:A,R}
vj{x>439:A,s<2318:A,a<806:A,R}
kd{s>767:jhv,x<1090:bk,A}
ts{s<3148:rxp,a>1365:lr,bkt}
bl{m<2736:A,s<571:R,dv}
brp{a<923:R,a<1279:R,a<1574:A,R}
bgt{a<1575:R,s<3923:fbv,s<3953:A,pdj}
djn{s>322:A,m<1056:A,a<1988:A,A}
rqq{s<3130:A,m<2434:A,A}
lz{x>3622:A,x>3296:qt,s>3010:R,A}
pts{x>1771:R,R}
kpp{s>1217:A,s<1204:R,R}
bnq{s>3121:A,x>490:A,a>2141:R,A}
hxf{s>2885:R,a>1520:A,s>2880:A,A}
khd{s>3265:bc,a<1211:ffs,R}
gv{m>3417:A,a>2938:R,m<3354:A,R}
lk{m<2377:xk,s<3132:R,A}
cs{s<960:A,x>3655:R,R}
mh{a>1468:A,s>2418:R,x<508:vj,vgr}
cnt{x<766:R,x>1060:R,A}
zt{a>3624:R,x<1504:R,s>271:A,A}
fpt{m<1199:bnq,x<958:R,x<1153:A,mrg}
jkq{a>1783:qnp,a>1626:A,R}
fnc{x<3093:fzx,x>3571:cp,m<3233:zpz,xxl}
kmg{m<1640:lvj,x>2199:xv,R}
lkm{m>722:xbm,R}
pgd{s<2128:brp,jj}
shm{m>919:R,s<3189:R,R}
xfr{m>761:R,s>2748:A,m>323:A,R}
rgl{a<1202:R,R}
qgd{a<746:hzp,rgl}
vkj{m<2086:R,x>850:A,a>3710:R,R}
cm{s<1657:R,R}
lvj{s>2173:R,a>747:R,A}
vz{a<2716:A,R}
nsm{m<2126:A,a>1310:A,x>2771:A,A}
pk{x>2292:A,A}
jm{s<363:A,A}
hp{a>2641:trf,mh}
nlr{s>2969:A,x>1304:A,A}
hx{m<3078:R,R}
pjv{x>253:grc,x<97:R,x<193:A,hz}
xrb{x>3443:kn,A}
tx{a>1279:A,dcf}
qjb{m>1551:qfg,qrq}
ftr{s>2830:nmq,td}
jvn{s>3843:R,A}
gsz{s<2923:rfs,ts}
xhx{x<2340:lj,A}
gbn{m<882:A,A}
qvl{a>1697:hr,a<1466:A,a<1601:A,ll}
jh{m>173:R,s<564:A,s<797:A,R}
vgf{x>497:A,x>320:A,R}
lgk{a>3109:R,A}
lbx{x>1134:A,R}
nxp{s>840:A,R}
gkh{m<545:A,m>610:A,m>569:A,R}
zpz{x<3332:jk,m>2774:A,R}
sqt{x<399:R,m<3088:A,s<477:A,A}
mpf{a>3316:A,A}
ckv{m<3213:A,a<842:A,s<2396:A,A}
lpq{s<2685:A,A}
fg{m>3358:R,x>3763:A,R}
cf{a>1252:A,x>346:A,x>212:A,R}
bcv{s>3187:cxd,x>2785:R,x>2752:nsm,zn}
pq{x>2944:A,R}
vc{x>2389:cqz,m>1620:bd,bdr}
jgb{x<2002:A,R}
nfb{s<2319:A,a>3483:hj,m>1700:R,A}
zh{m<664:A,s<2311:A,A}
hrs{a<340:R,x>1096:A,R}
stl{a<1757:cfp,qrl}
lg{x<2142:R,m>1798:bx,x>3110:rg,A}
nrd{x<2026:qh,m>1735:mrk,pn}
cmk{s>292:A,A}
szf{a<996:A,x>1757:bqq,s<1243:R,A}
tg{a>989:A,s<936:R,s<1091:R,R}
ktl{x<2556:R,x<2639:A,R}
nb{m<3571:A,s>1051:R,R}
vx{a<2247:A,x<2460:A,a<2331:R,A}
in{s<2569:qj,csb}
rvc{m<1417:A,s>2822:A,m>3074:R,A}
hcv{a<3271:A,A}
blq{m<1523:mz,rq}
dvv{m<1558:rx,rn}
pdj{m>1764:R,s>3971:R,R}
tzf{s>3567:R,m<631:A,a<3273:R,R}
vvp{a<2271:nrc,m>2025:ls,a>3004:znl,ftr}
dx{s>3049:qdv,m>1362:hpq,m<759:A,xrl}
fgb{a>3186:pq,s>3045:A,rz}
zfr{s<3704:pg,a<1503:kkc,a>1606:rj,mcm}
hk{s<3670:A,a<2667:R,R}
vbs{m>2005:jgb,pts}
mmr{m>2322:R,m>1991:A,s>1195:A,R}
jsj{a<846:R,A}
gr{x>1637:A,m>1437:A,tzf}
smr{x>553:xkj,a>3828:pjv,s<2877:rvn,lk}
kkh{a<979:A,a<1290:R,m<3262:R,R}
rfs{s<2782:zfq,s>2869:rlj,vvp}
hld{m<2626:R,R}
pdr{s>3716:R,x<1984:A,R}
bpl{m>2642:R,m<2208:A,R}
rsb{s>2186:A,klj}
svh{m>1897:A,a<3228:A,s<2449:trr,A}
nvc{a>1611:sfr,A}
kx{x>637:A,x>614:A,A}
qh{x>1954:pdr,sl}
mr{x>2233:R,x>2163:A,R}
ndm{a<2304:R,A}
fb{m>2610:A,m>1344:A,A}
qm{m>2943:R,a>2109:R,R}
dv{a<678:A,R}
nbv{a<1299:R,m>2259:R,s>2404:A,R}
ls{a>2854:mpf,zqx}
xc{m>2101:R,s<2882:R,a>1165:A,R}
lct{m<2076:bs,s>2785:mkf,m>2855:A,bks}
dk{a<3506:A,A}
qmn{x>325:qf,a>449:kl,a<295:A,vm}
ncg{a<1018:lct,a<1371:rnd,x<2673:jkq,nvc}
zmq{m<2525:R,A}
thd{a>2757:gj,a<2405:qrn,m>2056:bmz,kr}
tts{m<3228:R,s>640:R,a>3171:A,A}
trr{a>3548:R,s<2437:R,R}
clc{s<2527:R,s>2549:A,A}
jtv{m<2950:A,s<210:R,R}
ghv{m>1136:xkd,s<1218:ql,m<502:gvn,szf}
jq{s<3727:A,m<1398:R,A}
ql{x<2601:lbx,dz}
rvn{x<189:vvb,hxn}
xx{x>2241:A,m>1897:A,R}
ccd{s<3621:A,R}
lts{s<3872:A,m>835:A,s<3931:R,A}
rn{s>925:R,R}
ngb{s<2880:A,R}
xxv{a<2094:A,s<2881:R,R}
kr{x>2351:A,s>258:R,a>2619:bdp,A}
mz{x<3454:fgb,zzp}
hd{a>2529:A,dmg}
hz{x>224:R,m<2084:R,A}
gh{m<971:A,m>1211:R,A}
jr{a>2700:R,m>1234:A,x<355:A,A}
jc{x<739:A,a<917:R,s<2457:ck,mnr}
bpj{x>330:rqq,R}
xfj{s<1260:ht,m<2092:jd,xhx}
bz{s<3823:A,R}
cxd{a<874:A,R}
bs{s>2688:A,m>1007:A,x<2651:A,R}
htn{m>977:R,a<2308:A,x<2327:A,A}
jhv{a>996:R,s<967:A,s<1075:R,A}
bcr{a<3147:ndm,tp}
pkj{m<2510:gbn,a>981:jjx,A}
zzp{s>2986:shm,x>3786:rpv,mb}
bc{s>3370:A,a<923:R,x>2579:R,A}
tj{x<2848:rb,s>1693:A,A}
fvl{s>1450:css,s>1274:fr,a>1541:ngh,rmz}
frc{m<2984:A,m<3157:sqt,tts}
lb{m>1612:A,A}
bp{m>2003:A,x>3015:cs,tg}
nnl{a<1000:R,s<3854:A,s>3945:A,R}
rl{m<3088:A,x<463:A,a>1631:A,R}
gvn{s>1250:A,s>1235:fhj,fqn}
rnf{m<733:R,x<1676:R,A}
cp{a<3134:fg,m>3460:A,kmc}
pd{s>637:vb,s<564:pt,R}
rz{x<3098:R,m>826:R,m<293:A,A}
zc{a>689:vmd,a<339:A,llk}
zl{s<3450:R,A}
rj{s<3855:A,m<1825:lcq,x>558:qn,R}
tp{a<3484:R,x>2024:R,a>3761:A,R}
jbz{m<3184:cnt,R}
fs{s<1772:A,m>908:nl,a>2631:A,A}
sfr{a>1871:A,a<1714:A,R}
lv{a>3338:A,s<314:R,x>2326:R,R}
hjj{m<1335:R,m>2001:R,a<2651:R,A}
sm{x>2614:R,m<621:A,A}
qdv{x<2058:R,R}
xsg{m>2409:qb,x<1022:bg,mgj}
vvb{x<121:A,m<1386:R,R}
szz{x>1786:xs,s<2260:stl,x<596:qg,zk}
sr{m>1474:A,gbk}
xxp{s<2328:A,x<3808:A,A}
fxk{s>3196:A,btj}
mgg{m>2309:R,a<2169:R,x<1003:jr,R}
rc{x>853:R,x>554:R,x<304:tk,A}
vzk{a>830:A,m<1128:kh,x>558:R,npn}
dd{x<2364:R,hk}
jvf{s<1220:kkh,m<3274:qgd,a>869:tx,dxb}
xn{a<1700:rjg,A}
vf{a>1341:A,s>3229:R,A}
dxb{m>3699:R,s<1248:R,m<3525:sml,A}
zd{s>1372:cbd,zc}
qb{x>1140:R,a>3588:R,a<3369:A,R}
ck{s>2389:R,x>753:A,m>2076:A,R}
bk{m<1112:A,x>422:A,x<254:R,A}
bdp{s>119:R,m<885:A,R}
xfq{m>1857:km,a<2650:rvk,m<1229:svp,fnm}
jjx{a<1105:R,A}
hh{x>2723:A,x>2324:R,R}
vxv{s<3855:A,a<1221:R,A}
hj{m<1924:A,A}
zj{a>2161:A,a<1948:mmr,a>2043:A,R}
lcq{m<760:A,R}
zmm{a>1990:vx,m>3237:nq,m<2768:R,zrk}
qrn{m>1714:qm,a>2144:htn,djn}
zk{a<2467:lkf,txv}
gsm{a>2592:sm,m<700:A,a>2099:R,R}
vhm{m>3185:R,m>2612:A,x<2721:R,R}
lss{a>1698:dd,ldr}
gf{a<589:ggp,a>940:xc,A}
qrl{a<2989:mgg,s>2068:rsb,x>881:xjq,cnz}
nz{x>640:zl,m<654:A,gh}
ljc{m<2348:xqn,m<3307:hvc,zpt}
ptz{a<1956:kmk,x>332:ks,dxr}
lj{s>1269:A,A}
rjr{a>1905:A,s<3610:A,R}
bkt{s<3288:xm,gkz}
jjq{s<2376:R,a<3384:R,m>3288:A,A}
fzx{x<2811:A,s<786:R,sjr}
hcz{a<1441:A,A}
ng{x>2025:A,a<1962:R,m>2393:A,A}
kg{x<1581:R,x<1788:R,R}
hc{a<1965:A,m<2176:R,R}
zrk{x>2229:A,R}
cgp{x>715:A,m>3614:A,R}
vmd{s>1327:R,A}
jsk{x>2685:bcv,m>1553:qgx,m>700:khd,mx}
kkc{m<1471:hcz,a>1447:A,x>594:A,tv}
ph{s<2709:R,a>615:A,R}
bqq{m>918:A,s<1255:A,x>2567:R,R}
dn{a>3209:zt,fc}
vm{x<119:R,a<356:R,A}
bvz{s<3732:zcl,fvj}
vgr{x>557:A,s>2325:R,A}
kl{m>1917:R,a>623:R,s<3697:R,A}
css{x<2079:flp,a>2235:vp,ttl}
qsf{s>458:rfh,s<225:A,x<1109:jm,A}
jjl{a<1765:qv,x>2506:tf,x>1208:zv,ljc}
xr{s>1663:A,R}
zqx{m<3112:A,R}
mm{x<2642:A,A}
bmm{a>1287:vf,m>2723:cf,tpd}
bx{s>1379:R,m<3154:A,a>2029:A,R}
hb{s>3578:A,a>1601:A,R}
npn{a>418:R,R}
gn{a<1162:dxm,a<1473:lz,xrb}
pj{x>3259:bgb,m<2105:rqc,hn}
cfp{m<1402:pgd,nn}
rx{a>2279:R,m<809:R,s<927:A,A}
dj{s<2516:R,R}
bj{s<3719:fls,pj}
ttl{a<753:djc,s>1593:tj,qr}
zp{m<862:A,R}
hzp{a<266:R,A}
hnb{m<729:A,m>1432:A,m>1081:A,R}
dfv{s<899:R,m>1776:bss,A}
gx{x<420:R,s<739:A,x>875:A,R}
lp{m>1603:A,x<2185:A,R}
khp{m<1240:R,s<3695:R,x>2040:R,A}
dxr{s<2453:A,x>300:A,dj}
rqc{m>859:mrq,a>1818:jvn,m<375:A,A}
cbf{a>1801:A,x<2146:R,A}
dxm{a<741:A,x<3647:lvx,s>3125:zm,cpx}
zdf{x>918:hrs,s<3499:bpj,x<510:qmn,vvr}
rk{a<1622:kjn,x>2035:lx,R}
mkf{s<2843:R,m>3082:R,R}
tpd{s>3176:R,a>1225:R,x>394:R,A}
tzq{m>2428:ngb,vl}
qj{s<1179:jjl,s>1877:szz,fvl}
xm{s<3237:R,a<738:A,A}
mf{a>1552:A,s<2401:R,R}
rlr{x>3280:A,x>2759:R,R}
hxn{a>3691:R,s<2707:R,s<2802:R,A}
lt{a>3090:R,s<71:A,A}
xk{a>3660:R,A}
zqm{a>928:A,A}
qs{m>1136:R,rnf}
jl{m<3203:A,m>3526:R,s>3891:A,A}
lx{a<1729:A,x>2216:A,m>1412:A,R}
gc{m<3522:R,a<2626:A,R}
pzc{a<3024:vtg,m>1682:R,m<1377:A,rrf}
gbk{m<654:R,s<1217:A,s<1223:R,A}
lvx{a<927:R,m>2149:R,x>3327:A,A}
fhj{s<1242:R,A}
xqn{m<896:pv,x<621:hq,pzc}
hq{s<661:cr,a>3031:R,s<1000:R,A}
xtz{s>2914:A,s>2909:R,R}
mpv{s>3459:bj,a>2014:blq,tgr}
rmz{m<2196:ghv,jvf}
fc{a<2548:kg,s>166:R,a<2930:A,lt}
rpv{x>3861:R,a<3150:R,s<2725:R,R}
nq{a>1505:R,m<3509:R,R}
qz{a<1558:R,m<3088:A,m>3640:R,R}
pg{a<1524:cdc,s>3406:A,m<1803:R,R}
nn{m<2341:fm,s>2091:nnd,x>667:R,A}
qnp{a<1882:A,s<2689:R,A}
kb{x<1708:A,A}
km{m>3254:R,x>2185:R,s>3646:cbf,R}
qhp{x<1902:bvz,ksc}
tf{m>2474:fnc,lh}
mrk{m>2540:gth,nh}
btj{a<3349:R,x>877:A,R}
cv{s>1227:ss,sr}
dlr{m<1789:gsm,m>2852:rtx,a>2963:bxj,zj}
xbm{s<3216:R,A}
cx{a>1657:R,x>1871:R,A}
cb{a<2526:R,A}
llk{m>2126:A,A}
hjb{m>3625:R,m>3514:R,A}
bq{a<1187:pkj,m<1393:lkm,x<695:bmm,svf}
fn{x>151:R,m<2679:A,A}
vp{a>2870:ff,m>2322:hd,s<1637:vjv,fs}
rlj{s>2896:qd,a>2284:zdx,a<1323:gf,jg}
ggp{m<1794:R,s<2883:A,x<1856:R,A}
znl{m>856:A,a<3666:hcv,sf}
svp{x>2155:xhh,a<3541:ctv,s<3726:ccd,bz}
mgj{x<1387:A,x<1600:R,R}
lkf{x>1081:qk,x>777:jf,x<686:mrc,jc}
rjg{a<1443:R,x>1229:R,s<1556:R,A}
mbg{a<622:A,x<834:A,x<867:R,R}
bss{a<3054:A,x>2187:A,a<3492:R,A}
xkd{a<562:kpp,R}
qr{s<1530:jdd,x<3305:R,R}
qfg{a<2318:R,fn}
jf{x>919:A,a>935:A,mbg}
bg{s>2516:R,A}
cbd{m>2449:A,a>1041:cn,a<450:R,xp}
xl{s<2925:hx,a>3207:R,R}
vrg{a>1289:hb,cj}
mtb{s>2981:hrh,A}
gfm{s<3070:R,m>3645:R,m>3357:R,R}
zfq{a<1584:js,lpq}
fbv{a<2481:A,x>1644:A,R}
rxp{a<1460:dx,bcr}
dlj{a>3193:A,x>2205:A,A}
nrc{a<941:rvc,s>2824:R,cx}
vjv{a<2589:R,s<1539:A,s<1591:A,R}
prg{x>943:R,x>469:R,a>1828:A,R}
cn{s>1408:A,m>1058:R,A}
hvc{x<696:frc,x<972:tt,qsf}
flp{a>2225:fq,a<1241:fj,s<1733:xn,prg}
bkf{m<1041:A,A}
dl{a>1330:R,s<2427:R,x<1467:A,A}
sn{m>3136:gfm,grr}
rfh{x>1129:R,A}
td{m>1204:R,m>773:A,a<2619:R,A}
jg{x<1834:A,a<1719:hxf,x<2218:ng,xxv}
jrj{a<386:A,R}
nv{m>210:R,R}
pjx{s<2086:mm,a<3090:fb,x>2720:R,sfp}
ll{s<2174:A,s<2409:R,R}
pn{x>2063:rjr,m>970:khp,a>1997:A,fhq}
gj{a>3526:R,a<3207:mr,lv}
nj{m<2883:A,s<3049:R,s>3494:R,cgp}
xq{a<3632:R,s>2980:R,R}
mrq{m<1543:R,m>1844:A,R}
rm{a>3252:hv,R}
fxx{a<1183:kmg,m<2218:qvl,zmm}
grr{a<2906:R,s<2997:R,m>2839:R,R}
kjn{x>2064:R,m>2516:R,x>1756:R,A}
bvd{s>3355:A,a>1525:R,R}
nf{x>3448:jrj,R}
hs{a<3135:R,s>399:R,A}
dln{s<561:mv,x>2863:nxp,s<800:A,A}
kmc{s>639:A,m>2835:R,R}
sfp{a>3626:A,x<2148:A,R}
ff{a<3401:R,a>3684:A,m>1555:hh,zp}
jz{a<3162:xt,a<3530:vq,s<3365:smr,svn}
tgr{x>3121:gn,x>2865:tzq,s>2899:jsk,ncg}
gl{s<739:pd,x>1894:dfv,a>2666:zmq,dvv}
grc{x<435:A,A}
sml{s<1264:R,m>3363:A,x<2284:A,A}
mkc{x<760:A,a<631:A,a>1386:R,kq}
xp{s>1423:A,x<2579:R,R}
vq{m>1343:fxk,nz}
mrg{m<1518:R,m<1658:R,A}
js{a>944:xg,x>2026:ph,s<2666:R,R}
kh{a<318:R,x<621:R,a<659:A,R}
rg{x>3435:R,R}
fhq{x<2040:A,a>704:R,m>551:A,R}
kq{m<2577:R,s<894:A,x<1039:A,A}
qd{m>2322:R,s<2906:A,x>1957:A,xtz}
ksc{x<2099:nrd,x>2265:lss,xfq}
kzv{a>2414:xj,lg}
kk{a<617:R,R}
jk{s>538:A,m<2863:A,R}
xg{a>1210:R,x>1982:R,x>1800:R,A}
cl{a>2733:R,clc}
bd{m<2716:A,a<3313:R,m<3413:A,fbm}
xjq{s<1984:A,m<1511:A,bpl}
rvk{a>1155:bkf,m<813:br,m<1432:A,zkh}
nd{s>452:kd,x>1163:kk,vzk}
fvj{s>3841:bgt,m<2521:bb,tz}
ks{m>2382:R,ntz}
tt{a<2850:R,A}
qgx{s>3258:zqm,s<3027:R,ktl}
ss{m>2041:A,ft}
rq{x<3120:xl,m>2642:sn,rtf}
jdd{s>1486:R,m>2101:A,m>762:A,A}
qx{a>3696:qrp,s>3657:A,R}
bks{a<607:A,R}
xs{a>2441:fh,x>2963:qqg,fxx}
mrc{m>2461:ckv,m>1428:kx,m>724:tq,A}
rb{m<2468:R,x>2419:R,x<2271:R,A}
ht{s<1252:R,A}
qk{x<1328:mf,x<1549:dl,nbv}
djc{m<1600:cm,a>283:nrs,R}
fh{s<2220:pjx,lgk}
bdr{a>3328:jfn,m>707:R,R}
rtx{x<1386:R,m>3269:gc,gb}
xkj{a>3749:A,a<3675:dtp,s<3004:pht,vkj}
pv{m>323:R,x>502:jh,s>514:nv,vz}
vv{a>3320:R,s<636:R,s>948:A,R}
sg{s>601:bp,cmk}
cr{a<2514:R,R}
gb{a<2813:A,R}
bmz{s<196:A,a<2556:fpk,s>307:pk,R}
bb{m>1091:A,R}
zdx{s>2879:R,a<3102:vk,A}
jfn{a<3606:A,A}
nbp{m>818:A,A}
kn{s>2923:R,A}
fr{a<1594:zd,a>2929:vc,kzv}
xj{m<2544:hjj,R}
hv{m>1991:R,A}
qrp{x>874:A,x>389:R,A}
cnc{m<985:A,R}
cnz{m<2037:hnb,A}
vmb{a>1700:jz,nm}
mv{m<1362:R,A}
gkz{s>3342:jsj,x>1892:xx,m<1670:R,kb}
xt{m>1817:nj,a<2551:fpt,ktx}
fj{a>463:A,A}
mx{m>253:gkh,s<3140:R,m>137:R,R}
jd{m>842:lb,m>451:kkv,s<1266:A,A}
cqz{s<1368:A,m<1575:A,R}
svf{s<3263:R,R}
sl{m<2246:A,R}
zrq{x>2077:lsm,x<1840:A,a>1618:R,bvd}
pz{m>3317:hjb,s>3590:A,x<1658:R,jvc}
csb{x<1439:vmb,x>2420:mpv,s<3414:gsz,qhp}
kmk{x>328:kpg,R}
qrq{a>1614:A,s<2403:zh,x>114:R,nbp}
fq{x>909:xr,a>2931:A,A}
lr{a>2309:rm,a>1791:vbs,s>3276:zrq,rk}
lsm{x>2277:R,a>1618:R,R}
klj{x>1054:R,m>2202:A,x>399:A,R}
mb{a<3099:R,s<2735:R,R}
fqn{m<210:R,A}
jj{s<2200:A,A}
pht{a>3714:R,A}
tz{x<1673:R,a<1378:A,A}
rrf{a>3595:A,a>3246:A,R}
nmq{a>2748:R,a<2542:R,x<2016:R,A}
fls{a<2084:vrg,mkz}
fbm{a>3544:R,A}
fnm{s>3733:dlj,lp}
zpt{s>665:xb,m>3543:hs,gv}
bxj{m>2343:R,A}
zkh{a<571:A,s>3679:A,a>921:R,A}
cdc{m>1919:A,R}
ngh{s>1238:xfj,s<1208:dlr,cv}
cj{a>700:A,R}
bgb{a>2604:dk,m>1677:jl,x>3687:lts,R}
dz{m<718:R,x<3415:R,R}
nnd{x>1061:R,m>2920:A,a>798:R,R}
hn{m<2984:A,a>2031:A,vxv}
dtp{x<945:A,a<3591:A,R}
qv{x>2355:sg,m<1752:nd,nxg}
vtg{a>2512:R,m<1657:A,x>981:R,A}
hr{x>2303:A,m<1178:A,A}
txv{s<2416:nfb,s<2487:svh,a>3134:xsg,cl}
mth{a>1241:R,A}
sf{s<2826:A,a<3808:A,a<3934:R,A}
hrh{m>2319:A,x>461:A,m>839:R,A}
tk{s>3674:A,s>3485:A,A}
ldr{m<1530:R,s<3738:hld,x<2358:rrr,nnl}
kpg{a>779:R,m>2426:R,R}
mcm{m>1928:qz,a>1571:R,a>1536:A,vgf}
kkv{s<1268:R,R}
ntz{x>354:R,R}
qg{x>390:hp,x<245:qjb,ptz}
rrr{s<3885:A,m<2398:R,R}
rtf{a>3255:xq,x>3511:A,s<3159:A,R}
ft{x>2278:R,m<1043:R,a<2670:R,R}
dcf{x>2425:A,x<1158:A,A}
vb{s<704:R,x<1816:R,R}
zv{s>491:gl,x<2068:dn,thd}
xb{s>882:nb,gx}
gth{s>3795:R,m<3296:A,A}
nxg{x>1262:bl,s>410:mkc,a>704:jtv,jbz}
rnd{x<2587:R,m<2247:xfr,vhm}
sjr{a>2727:R,A}
pt{s>532:R,R}
fm{x>631:A,x>335:A,s<2100:R,A}
gq{s>681:R,a<2732:R,m>1215:A,R}
svn{m<1967:qx,rc}
xv{s<2249:A,A}
zn{s<3051:A,x>2727:A,A}
hpq{s<2983:R,m<3115:R,A}
nh{a<1716:A,R}
qn{m>2908:R,s<3927:A,R}
lh{x<3047:dln,gq}
zch{x>1081:nlr,A}
np{x>876:zch,a<1580:mtb,sv}
tq{a>1139:A,a<709:R,R}
vk{m>1771:R,a>2624:A,R}
qt{a<1334:R,x>3407:R,R}
qf{s<3748:R,A}
zm{s<3247:R,x<3878:A,R}
xrl{a<807:A,a<1157:A,s>2999:A,R}
jvc{s<3505:R,s>3546:A,R}
trf{m>2082:jjq,a<3517:cnc,R}
nm{a<835:zdf,a<1402:bq,s>3203:zfr,np}
xxl{a<3140:cb,a<3432:vv,A}
{x=3161,m=1141,a=51,s=441}
{x=240,m=174,a=555,s=1269}
{x=639,m=25,a=2025,s=345}
{x=97,m=1410,a=1572,s=1133}
{x=763,m=1918,a=625,s=2037}
{x=83,m=1395,a=433,s=2841}
{x=359,m=652,a=831,s=129}
{x=979,m=204,a=1976,s=1629}
{x=3112,m=122,a=816,s=305}
{x=523,m=2334,a=108,s=1286}
{x=267,m=152,a=480,s=389}
{x=278,m=917,a=1419,s=2422}
{x=207,m=1337,a=600,s=282}
{x=128,m=913,a=3232,s=189}
{x=1359,m=15,a=1792,s=2028}
{x=87,m=2807,a=3202,s=104}
{x=4,m=240,a=686,s=1790}
{x=2332,m=537,a=1657,s=289}
{x=1739,m=75,a=2757,s=1320}
{x=2127,m=44,a=1389,s=224}
{x=564,m=3263,a=177,s=447}
{x=424,m=915,a=1856,s=18}
{x=632,m=1638,a=665,s=315}
{x=950,m=993,a=136,s=11}
{x=154,m=611,a=405,s=1090}
{x=1784,m=1239,a=506,s=878}
{x=379,m=332,a=89,s=1091}
{x=2234,m=315,a=1158,s=2140}
{x=971,m=283,a=56,s=1089}
{x=39,m=101,a=256,s=995}
{x=259,m=25,a=829,s=2383}
{x=2681,m=876,a=676,s=109}
{x=1783,m=2119,a=299,s=25}
{x=2735,m=1444,a=94,s=572}
{x=710,m=2673,a=372,s=1524}
{x=171,m=221,a=1344,s=234}
{x=250,m=547,a=40,s=2485}
{x=1282,m=1141,a=823,s=1862}
{x=3,m=557,a=1924,s=1310}
{x=23,m=1217,a=133,s=2587}
{x=2073,m=75,a=246,s=250}
{x=591,m=646,a=510,s=610}
{x=1057,m=1782,a=1460,s=360}
{x=715,m=2817,a=1441,s=1769}
{x=132,m=478,a=1510,s=1669}
{x=3098,m=1549,a=915,s=2968}
{x=1913,m=570,a=542,s=381}
{x=311,m=935,a=277,s=290}
{x=486,m=148,a=240,s=61}
{x=428,m=1469,a=26,s=1175}
{x=520,m=979,a=84,s=413}
{x=244,m=1671,a=2482,s=6}
{x=53,m=1426,a=3,s=202}
{x=787,m=1504,a=1281,s=1676}
{x=27,m=2265,a=1142,s=202}
{x=1876,m=170,a=2306,s=2130}
{x=699,m=48,a=228,s=634}
{x=684,m=1694,a=287,s=1244}
{x=1140,m=919,a=845,s=1543}
{x=2313,m=183,a=948,s=1856}
{x=345,m=325,a=399,s=673}
{x=758,m=79,a=523,s=1105}
{x=271,m=1196,a=611,s=1465}
{x=495,m=2296,a=543,s=873}
{x=1054,m=273,a=1040,s=975}
{x=2372,m=642,a=415,s=303}
{x=2865,m=216,a=208,s=1772}
{x=219,m=29,a=689,s=561}
{x=885,m=150,a=816,s=1035}
{x=2293,m=1052,a=546,s=527}
{x=1384,m=461,a=264,s=911}
{x=1125,m=652,a=3475,s=1492}
{x=193,m=823,a=511,s=719}
{x=3393,m=26,a=15,s=111}
{x=611,m=1012,a=114,s=839}
{x=527,m=159,a=3961,s=465}
{x=214,m=416,a=1332,s=348}
{x=21,m=1247,a=1356,s=112}
{x=3308,m=387,a=587,s=16}
{x=171,m=1571,a=2145,s=1685}
{x=1334,m=970,a=133,s=102}
{x=567,m=348,a=318,s=624}
{x=344,m=911,a=593,s=326}
{x=976,m=584,a=270,s=339}
{x=879,m=796,a=565,s=1348}
{x=1427,m=1060,a=751,s=1071}
{x=2412,m=582,a=407,s=1668}
{x=21,m=147,a=1452,s=681}
{x=457,m=404,a=1617,s=338}
{x=1810,m=1236,a=19,s=174}
{x=55,m=674,a=530,s=327}
{x=423,m=348,a=1067,s=424}
{x=2836,m=2279,a=3116,s=73}
{x=792,m=2863,a=1457,s=1643}
{x=537,m=910,a=2132,s=2005}
{x=895,m=1383,a=86,s=632}
{x=302,m=891,a=61,s=303}
{x=24,m=28,a=438,s=458}
{x=1134,m=104,a=219,s=623}
{x=208,m=1184,a=280,s=2224}
{x=1884,m=762,a=2518,s=588}
{x=1712,m=2692,a=580,s=1996}
{x=597,m=1108,a=1198,s=889}
{x=29,m=1692,a=456,s=2358}
{x=604,m=1656,a=149,s=374}
{x=995,m=1575,a=1300,s=1043}
{x=513,m=64,a=348,s=670}
{x=2016,m=148,a=288,s=240}
{x=2208,m=388,a=726,s=69}
{x=521,m=1808,a=2767,s=856}
{x=512,m=103,a=439,s=1943}
{x=148,m=935,a=787,s=477}
{x=1153,m=2337,a=238,s=3068}
{x=692,m=2215,a=1089,s=134}
{x=2260,m=1675,a=2775,s=1847}
{x=625,m=3316,a=1996,s=2999}
{x=2263,m=2373,a=2421,s=349}
{x=13,m=2202,a=316,s=132}
{x=1414,m=2836,a=2224,s=206}
{x=2597,m=203,a=741,s=1575}
{x=3420,m=1012,a=637,s=768}
{x=278,m=1222,a=1586,s=463}
{x=511,m=816,a=71,s=381}
{x=538,m=320,a=395,s=2388}
{x=522,m=741,a=2172,s=1418}
{x=112,m=619,a=1875,s=1458}
{x=462,m=2079,a=252,s=54}
{x=2828,m=121,a=297,s=19}
{x=444,m=1444,a=85,s=88}
{x=1328,m=43,a=1168,s=241}
{x=1963,m=162,a=135,s=915}
{x=350,m=994,a=223,s=3064}
{x=130,m=790,a=895,s=52}
{x=317,m=83,a=265,s=478}
{x=215,m=2935,a=703,s=2731}
{x=1274,m=1313,a=455,s=2270}
{x=18,m=1971,a=1987,s=1992}
{x=2444,m=646,a=1462,s=232}
{x=1054,m=44,a=241,s=1037}
{x=212,m=1389,a=1490,s=574}
{x=301,m=3887,a=1190,s=300}
{x=3405,m=2067,a=2279,s=976}
{x=503,m=1631,a=933,s=303}
{x=1877,m=2443,a=2986,s=2055}
{x=559,m=1073,a=2167,s=1286}
{x=2473,m=1614,a=1850,s=503}
{x=357,m=430,a=1105,s=15}
{x=601,m=271,a=891,s=290}
{x=1958,m=6,a=250,s=796}
{x=635,m=507,a=262,s=853}
{x=337,m=949,a=2590,s=53}
{x=3419,m=3441,a=1089,s=592}
{x=132,m=992,a=482,s=306}
{x=979,m=958,a=2428,s=572}
{x=20,m=60,a=1124,s=3558}
{x=189,m=406,a=1382,s=546}
{x=1264,m=12,a=716,s=239}
{x=916,m=2214,a=69,s=146}
{x=631,m=2307,a=1969,s=421}
{x=1277,m=864,a=1780,s=490}
{x=306,m=2550,a=53,s=2171}
{x=120,m=1296,a=474,s=301}
{x=1566,m=869,a=894,s=2050}
{x=698,m=2308,a=687,s=492}
{x=2410,m=2671,a=806,s=1228}
{x=988,m=3291,a=459,s=229}
{x=1481,m=204,a=646,s=2167}
{x=238,m=593,a=497,s=186}
{x=317,m=187,a=772,s=129}
{x=53,m=3624,a=751,s=554}
{x=503,m=59,a=699,s=2483}
{x=59,m=1139,a=442,s=334}
{x=297,m=473,a=2519,s=554}
{x=254,m=1241,a=1477,s=280}
{x=117,m=1332,a=251,s=571}
{x=543,m=2228,a=606,s=473}
{x=1241,m=822,a=1544,s=2650}
{x=656,m=665,a=2678,s=2842}
{x=111,m=1574,a=537,s=807}
{x=152,m=641,a=16,s=325}
{x=2814,m=230,a=2633,s=224}
{x=4,m=856,a=2263,s=32}
{x=1837,m=124,a=221,s=3059}
{x=320,m=311,a=1653,s=15}
{x=265,m=307,a=930,s=2960}
{x=796,m=87,a=2572,s=741}
{x=602,m=585,a=2755,s=381}
{x=455,m=441,a=610,s=1380}
{x=552,m=1554,a=1800,s=39}
{x=1707,m=170,a=92,s=789}
{x=772,m=490,a=1173,s=763}
{x=2930,m=2475,a=1873,s=1826}
{x=1571,m=572,a=1883,s=1534}
{x=2008,m=2416,a=155,s=799}
{x=2060,m=1868,a=372,s=41}
{x=1899,m=104,a=7,s=456}
{x=37,m=718,a=642,s=1394}
{x=2078,m=1001,a=2864,s=791}
{x=124,m=890,a=2174,s=2418}
{x=996,m=2173,a=318,s=2194}

54
19/part1.pl Normal file
View File

@@ -0,0 +1,54 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Workflows, Parts),
concurrent_maplist(wf(Workflows, in), Parts, Scores),
sum_list(Scores, Score),
write(Score), nl.
wf(_, accept, [x-X, m-M, a-A, s-S], Score) :- Score is X + M + A + S, !.
wf(_, reject, _Part, 0) :- !.
wf(Workflows, WorkflowName, Part, Score) :-
member(WorkflowName-Rules, Workflows),
rule(Workflows, Rules, Part, Score).
rule(Workflows, [EndRule], Part, Score) :- wf(Workflows, EndRule, Part, Score).
rule(Workflows, [Attr-Cond-N-Dest|Rules], Part, Score) :-
( satisfy(Attr-Cond-N, Part)
-> wf(Workflows, Dest, Part, Score)
; rule(Workflows, Rules, Part, Score)
).
satisfy(Attr-Cond-N, Part) :- member(Attr-M, Part), call(Cond, M, N).
% input parsing stuff below
input(FileName, Workflows, Parts) :-
phrase_from_file((workflows(Workflows), parts(Parts)), FileName).
workflows([]) --> "\n", !.
workflows([Name-Rules|Ws]) -->
string_without("{", NameStr), "{", rules(Rules), "}\n", workflows(Ws),
{atom_codes(Name, NameStr)}.
rules([End]) --> dest(End).
rules([Rule|Rules]) --> rule(Rule), ",", rules(Rules).
rule(Attr-Cond-N-Dest) --> attr(Attr), cond(Cond), number(N), ":", dest(Dest).
attr(x) --> "x".
attr(m) --> "m".
attr(a) --> "a".
attr(s) --> "s".
cond('>') --> ">".
cond('<') --> "<".
dest(reject) --> "R", !.
dest(accept) --> "A", !.
dest(Dest) --> endrule(Dest).
endrule(Rule) --> string_without(",}", RuleStr), {atom_codes(Rule, RuleStr)}.
parts([]) --> eos, !.
parts([[x-X, m-M, a-A, s-S]|Parts]) -->
"{x=", number(X), ",m=", number(M), ",a=", number(A), ",s=", number(S),
"}\n", parts(Parts).

83
19/part2.pl Normal file
View File

@@ -0,0 +1,83 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Workflows),
findall(
Count-Limit,
(
wf(Workflows, in, Route, Limit),
Limit = [x-Xmin-Xmax, m-Mmin-Mmax, a-Amin-Amax, s-Smin-Smax],
Count is (Xmax - Xmin)*(Mmax - Mmin)*(Amax - Amin)*(Smax - Smin),
write(Route), write(" - "), write(Limit), write(" - "), write(Count), nl
),
Limits),
length(Limits, LenLimits), write("lenlimits = "), write(LenLimits), nl,
maplist([Count-Limit, Count]>>(true), Limits, CountsOnly),
sum_list(CountsOnly, Answer), write("answer = "), write(Answer), nl,
true.
choices(Limit, N) :-
foldl([_-Min-Max, V0, V]>>(V is V0*(Max - Min + 1)), Limit, 1, N).
or_limits([Limit], Limit).
or_limits([Limit1, Limit2 | Limits], Limit) :-
findall(
Attr-Min-Max,
( member(Attr-Min1-Max1, Limit1), member(Attr-Min2-Max2, Limit2),
Min is min(Min1, Min2), Max is max(Max1, Max2)),
NewLimit),
or_limits([NewLimit|Limits], Limit).
% x -> [Min, Max)
wf(_, accept, [accept], [x-1-4001, m-1-4001, a-1-4001, s-1-4001]).
wf(Workflows, WorkflowName, [WorkflowName|Route], Limits) :-
\+ WorkflowName = accept, \+ WorkflowName = reject,
member(WorkflowName-Rules, Workflows),
with_rule(Workflows, Rules, Route, Limits).
with_rule(Workflows, [EndRule], Route, Limits) :-
wf(Workflows, EndRule, Route, Limits).
with_rule(Workflows, [Attr-Cond-N-Dest|Rules], Route, NewLimits) :-
% Either take the first route with its limit
( wf(Workflows, Dest, Route, Limits),
member(Attr-Min-Max, Limits),
combine(Min-Max, Cond-N, NewMin-NewMax)
% ...or skip the first route, given we satisfy its reverse limits
; with_rule(Workflows, Rules, Route, Limits),
member(Attr-Min-Max, Limits),
negate(Cond-N, NotCond-NotN),
combine(Min-Max, NotCond-NotN, NewMin-NewMax)
),
select(Attr-Min-Max, Limits, Attr-NewMin-NewMax, NewLimits).
negate('<'-N, '>'-NewN) :- NewN is N - 1.
negate('>'-N, '<'-NewN) :- NewN is N + 1.
combine(Min-Max, '<'-N, Min-NewMax) :- NewMax is min(N, Max), Min < NewMax.
combine(Min-Max, '>'-N, NewMin-Max) :- NewMin is max(N+1, Min), NewMin < Max.
% input parsing stuff below
input(FileName, Workflows) :-
phrase_from_file((workflows(Workflows), remainder(_)), FileName).
workflows([]) --> "\n", !.
workflows([Name-Rules|Ws]) -->
string_without("{", NameStr), "{", rules(Rules), "}\n", workflows(Ws),
{atom_codes(Name, NameStr)}.
rules([End]) --> dest(End).
rules([Rule|Rules]) --> rule(Rule), ",", rules(Rules).
rule(Attr-Cond-N-Dest) --> attr(Attr), cond(Cond), number(N), ":", dest(Dest).
attr(x) --> "x".
attr(m) --> "m".
attr(a) --> "a".
attr(s) --> "s".
cond('>') --> ">".
cond('<') --> "<".
dest(reject) --> "R", !.
dest(accept) --> "A", !.
dest(Dest) --> endrule(Dest).
endrule(Rule) --> string_without(",}", RuleStr), {atom_codes(Rule, RuleStr)}.

17
19/test.txt Normal file
View File

@@ -0,0 +1,17 @@
px{a<2006:qkq,m>2090:A,rfg}
pv{a>1716:R,A}
lnx{m>1548:A,A}
rfg{s<537:gd,x>2440:R,A}
qs{s>3448:A,lnx}
qkq{x<1416:A,crn}
crn{x>2662:A,R}
in{s<1351:px,qqz}
qqz{s>2770:qs,m<1801:hdj,R}
gd{a>3333:R,R}
hdj{m>838:A,pv}
{x=787,m=2655,a=1222,s=2876}
{x=1679,m=44,a=2067,s=496}
{x=2036,m=264,a=79,s=2244}
{x=2461,m=1339,a=466,s=291}
{x=2127,m=1623,a=2188,s=1013}

58
20/graphviz.dot Normal file
View File

@@ -0,0 +1,58 @@
hb -> mj
mx -> mt, NANDxz
xh -> qc
tg -> cq
kp -> NANDxz, nj
mj -> NANDjj, lv
cq -> jm
mt -> sj, NANDxz
NANDjj -> hb, lz, NANDrk, xv, vj, vh, lv
rm -> NANDbz, xq
hx -> NANDbz
xv -> lz
xx -> kp, NANDxz
pt -> vx
NANDxz -> bq, gr, sj, rv, NANDzf
vx -> NANDgf, cv
xb -> NANDxz, bq
xk -> NANDgf, rd
lv -> zk
NANDrk -> NANDgh
kn -> NANDgf, tz
NANDgh -> rx
sj -> vp
jm -> vm, NANDbz
rr -> rv, NANDxz
tz -> rz
gg -> kn
NANDcd -> NANDgh
qc -> kh, NANDbz
kb -> NANDgf
vp -> NANDxz, xx
fb -> NANDbz, tg
rd -> cp
qn -> vh, NANDjj
xr -> NANDjj
tp -> rm, NANDbz
cp -> gg
NANDbz -> NANDqx, cq, xh, fb, tg
qq -> pt, NANDgf
xq -> NANDbz, hx
gx -> NANDjj, qv
bq -> rr
cv -> NANDgf, kb
zk -> NANDjj, xv
NANDzf -> NANDgh
NANDqx -> NANDgh
vh -> gx
qv -> xr, NANDjj
lz -> qn
broadcaster -> fb, xk, gr, vj
nj -> NANDxz
gr -> NANDxz, xb
kh -> tp, NANDbz
vm -> NANDbz, xh
rz -> qq, NANDgf
NANDgf -> tz, NANDcd, rd, xk, pt, cp, gg
rv -> mx
vj -> hb, NANDjj

58
20/input.txt Normal file
View File

@@ -0,0 +1,58 @@
%hb -> mj
%mx -> mt, xz
%xh -> qc
%tg -> cq
%kp -> xz, nj
%mj -> jj, lv
%cq -> jm
%mt -> sj, xz
&jj -> hb, lz, rk, xv, vj, vh, lv
%rm -> bz, xq
%hx -> bz
%xv -> lz
%xx -> kp, xz
%pt -> vx
&xz -> bq, gr, sj, rv, zf
%vx -> gf, cv
%xb -> xz, bq
%xk -> gf, rd
%lv -> zk
&rk -> gh
%kn -> gf, tz
&gh -> rx
%sj -> vp
%jm -> vm, bz
%rr -> rv, xz
%tz -> rz
%gg -> kn
&cd -> gh
%qc -> kh, bz
%kb -> gf
%vp -> xz, xx
%fb -> bz, tg
%rd -> cp
%qn -> vh, jj
%xr -> jj
%tp -> rm, bz
%cp -> gg
&bz -> qx, cq, xh, fb, tg
%qq -> pt, gf
%xq -> bz, hx
%gx -> jj, qv
%bq -> rr
%cv -> gf, kb
%zk -> jj, xv
&zf -> gh
&qx -> gh
%vh -> gx
%qv -> xr, jj
%lz -> qn
broadcaster -> fb, xk, gr, vj
%nj -> xz
%gr -> xz, xb
%kh -> tp, bz
%vm -> bz, xh
%rz -> qq, gf
&gf -> tz, cd, rd, xk, pt, cp, gg
%rv -> mx
%vj -> hb, jj

82
20/part1.pl Normal file
View File

@@ -0,0 +1,82 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Circuit),
run1000(Circuit, Answer),
write(Answer), nl.
% part1
run1000(Circuit, Answer) :-
length(Range, 1000),
foldl(
{Circuit}/[_, In-Lin-Hin, Out-Lout-Hout]>>(
run([button-l-broadcaster], In, Out, L-H),
Lout is L+Lin, Hout is H+Hin),
Range, Circuit-0-0, _-Lx-Hx),
Answer is Lx*Hx.
% code to run one circuit
run([], Circuit, Circuit, 0-0).
run([Src-Level-Target|Pulses], CircuitIn, CircuitOut, Ls-Hs) :-
( member(Type-Target-State-Dests, CircuitIn)
-> /*write([Src, Level, Target]), write(" -> "),
write([Type, Target, State, Dests]), write(" = "),*/
call(Type, Src, Level, State, NewState, Out),
send(Target, Out, Dests, AdditionalPulses),
% write(NewState-AdditionalPulses), nl,
select(Type-Target-State-Dests, CircuitIn,
Type-Target-NewState-Dests, Circuit1),
append(Pulses, AdditionalPulses, NewPulses),
run(NewPulses, Circuit1, CircuitOut, NextLs-NextHs)
; run(Pulses, CircuitIn, CircuitOut, NextLs-NextHs)
),
call(Level, NextLs-NextHs, Ls-Hs).
l(L1s-H1s, L2s-H1s) :- L2s is L1s + 1.
h(L1s-H1s, L1s-H2s) :- H2s is H1s + 1.
broadcaster(_, l, x, x, l).
ff(_, h, State, State, none).
ff(_, l, 0, 1, h).
ff(_, l, 1, 0, l).
nand(Src, Level, State, NewState, OutLevel) :-
select(Src-_, State, Src-Level, NewState),
(maplist([_-h]>>(true), NewState) -> OutLevel = l; OutLevel = h).
send(_, none, _, []).
send(From, Level, Dests, Pulses) :-
\+ Level = none,
maplist({Level}/[Dest, From-Level-Dest]>>(true), Dests, Pulses).
% input initialization
prefill_nands([], Circuit, Circuit).
prefill_nands([_-Src-_-Dests|Nodes], CircuitIn, CircuitOut) :-
convlist(
{CircuitIn}/[Dest, Dest]>>(member(nand-Dest-_-_, CircuitIn)),
Dests, NandDests),
foldl(fill_one_nand(Src), NandDests, CircuitIn, Circuit1),
prefill_nands(Nodes, Circuit1, CircuitOut).
fill_one_nand(Src, Nand, CIn, COut) :-
select(nand-Nand-State-Dests, CIn, nand-Nand-[Src-l|State]-Dests, COut).
% input parsing stuff below
input(FileName, Circuit) :-
phrase_from_file(modules(EmptyCircuit), FileName),
prefill_nands(EmptyCircuit, EmptyCircuit, Circuit).
modules([]) --> eos, !.
modules([Module|Modules]) --> module(Module), "\n", modules(Modules).
module(broadcaster-broadcaster-x-Dests) --> "broadcaster -> ", dests(Dests).
module(ff-Name-0-Dests) --> "%", node(Name), " -> ", dests(Dests).
module(nand-Name-[]-Dests) --> "&", node(Name), " -> ", dests(Dests).
dests([Dest]) --> node(Dest).
dests([Dest|Dests]) --> node(Dest), ", ", dests(Dests).
node(Name) --> string_without(", \n", NameStr), {atom_codes(Name, NameStr)}.

82
20/part2.pl Normal file
View File

@@ -0,0 +1,82 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
% This code was only used to confirm the theory. Don't run it. Look at part2.txt.
run_until(Circuit, _, Node, State, N) :- member(_-Node-State-_, Circuit), write(N), nl, !.
run_until(Circuit, Init, Node, State, N) :-
maplist(extract(Circuit), [xr, qv, gx, vh, qn, lz, xv, zk, lv, mj, hb, vj], S1),
maplist(extract(Circuit), [nj, kp, xx, vp, sj, mt, mx, rv, rr, bq, xb, gr], S2),
maplist(extract(Circuit), [hx, xq, rm, tp, kh, qc, xh, vm, jm, cq, tg, fb], S3),
maplist(extract(Circuit), [kb, cv, vx, pt, qq, rz, tz, kn, gg, cp, rd, xk], S4),
write(N), write(": "),
string_codes(Str1, S1), string_codes(Str2, S2), string_codes(Str3, S3), string_codes(Str4, S4),
write(Str1), write(" "), write(Str2), write(" "), write(Str3), write(" "), write(Str4), nl,
run([Init], Circuit, CircuitNext),
NextN is N + 1,
run_until(CircuitNext, Init, Node, State, NextN).
extract(Circuit, Cell, AsciiState) :-
member(_-Cell-StateX-_, Circuit),
AsciiState is StateX + 48.
% code to run one circuit
run([], Circuit, Circuit) :- !.
run([Src-Level-Target|Pulses], CircuitIn, CircuitOut) :-
( member(Type-Target-State-Dests, CircuitIn)
-> /*write([Src, Level, Target]), write(" -> "),
write([Type, Target, State, Dests]), write(" = "),*/
call(Type, Src, Level, State, NewState, Out),
send(Target, Out, Dests, AdditionalPulses),
% write(NewState-AdditionalPulses), nl,
select(Type-Target-State-Dests, CircuitIn,
Type-Target-NewState-Dests, Circuit1),
append(Pulses, AdditionalPulses, NewPulses),
run(NewPulses, Circuit1, CircuitOut)
; run(Pulses, CircuitIn, CircuitOut)
).
broadcaster(_, l, x, x, l).
ff(_, h, State, State, none).
ff(_, l, 0, 1, h).
ff(_, l, 1, 0, l).
nand(Src, Level, State, NewState, OutLevel) :-
select(Src-_, State, Src-Level, NewState),
(maplist([_-h]>>(true), NewState) -> OutLevel = l; OutLevel = h).
send(_, none, _, []).
send(From, Level, Dests, Pulses) :-
\+ Level = none,
maplist({Level}/[Dest, From-Level-Dest]>>(true), Dests, Pulses).
% input initialization
prefill_nands([], Circuit, Circuit).
prefill_nands([_-Src-_-Dests|Nodes], CircuitIn, CircuitOut) :-
convlist(
{CircuitIn}/[Dest, Dest]>>(member(nand-Dest-_-_, CircuitIn)),
Dests, NandDests),
foldl(fill_one_nand(Src), NandDests, CircuitIn, Circuit1),
prefill_nands(Nodes, Circuit1, CircuitOut).
fill_one_nand(Src, Nand, CIn, COut) :-
select(nand-Nand-State-Dests, CIn, nand-Nand-[Src-l|State]-Dests, COut).
% input parsing stuff below
input(FileName, Circuit) :-
phrase_from_file(modules(EmptyCircuit), FileName),
prefill_nands(EmptyCircuit, EmptyCircuit, Circuit).
modules([]) --> eos, !.
modules([Module|Modules]) --> module(Module), "\n", modules(Modules).
module(broadcaster-broadcaster-x-Dests) --> "broadcaster -> ", dests(Dests).
module(ff-Name-0-Dests) --> "%", node(Name), " -> ", dests(Dests).
module(nand-Name-[]-Dests) --> "&", node(Name), " -> ", dests(Dests).
dests([Dest]) --> node(Dest).
dests([Dest|Dests]) --> node(Dest), ", ", dests(Dests).
node(Name) --> string_without(", \n", NameStr), {atom_codes(Name, NameStr)}.

1015
20/part2.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 52 KiB

16
20/part2.txt Normal file
View File

@@ -0,0 +1,16 @@
gh <- [qx, zf, cd, rk]
Each of the 4 wings is a 12-bit counter, with custom resets at...
xr, qv, gx, vh, qn, lz, xv, zk, lv, mj, hb, vj (jj) <- (111010010101) vj, qv, zk, gx, xr, qn, mj
nj, kp, xx, vp, sj, mt, mx, rv, rr, bq, xb, gr (xz) <- (111101101011) gr, nj, vp, rr, xb, xx, mt, kp, mx
hx, xq, rm, tp, kh, qc, xh, vm, jm, cq, tg, fb (bz) <- (111111011001) vm, kh, xq, tp, fb, qc, jm, hx, rm
kb, cv, vx, pt, qq, rz, tz, kn, gg, cp, rd, xk (gf) <- (111011010001) rz, cv, qq, kb, kn, xk, vx
111010010101 = 3733
111101101011 = 3947
111111011001 = 4057
111011010001 = 3793
All 4 are primes.
LCD = 226732077152351

5
20/test.txt Normal file
View File

@@ -0,0 +1,5 @@
broadcaster -> a, b, c
%a -> b
%b -> c
%c -> inv
&inv -> a

5
20/test2.txt Normal file
View File

@@ -0,0 +1,5 @@
broadcaster -> a
%a -> inv, con
&inv -> b
%b -> con
&con -> output

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

131
21/input.txt Normal file
View File

@@ -0,0 +1,131 @@
...................................................................................................................................
.#....................#..#......##.#..#.#..#.#..#.#.........#....................##......##...#....#.....#..#.....#........#.......
.........#......#.#.........#...#.#...##..#.......#..#...................#........#..........#.#..##...#...#.......................
..#...#...#..#..#.#..#......#.....#...#....##..............................#......#.....#........#.......#.#.......#..#......#.....
............#................#...#.............#.........................#..................#....#..............#......##..#.......
.##....#...#....#............#.#..................#.#...#.................#......#.....#..........#.....#.#.#...........#..........
..###....#.#.#....#....##............##.#...#...............................#.#..#.#.........#....................#.#....###.#.....
..#....##.......#...##..#......#.....................#..........#...#............#.........#.........##......#......#..#......#....
....................#......##.............#.#.................................#.....#..#.#..#....#...##........#....#..............
................#...........#.#.....#.#....#.................#.....#...................#..............#....#..#......#......#......
.....#.....#...........#.............#.##......#.#..............#................#........#..#..#....#....#....#.#..........#.#....
..#......#..........#.............#..........#...#.................#.##..................#.##.....#......##.......#...#.........##.
.......#..#..#.......#.......#...##.#....#.....#...........#...#....#..#..............#.............#......#..#....................
..#..#.........#.......#...#..............#.............#......#....#...................#..........##.....##.##.....#.....#.#......
.....#....###....#......#..#..#..#........#..#............#.....#.....#.#.#..................#.......#...........##................
.........#....#.....#...........#..##..##.......................#..#.......#.............#....##...##...#...#...##........#...#....
.#...#..#.....#.......#.#......#.......#.#.............#..#.#.....#.#.#......#.........#.........#...........#..#.....##....#......
.....#.#.#...............#...........###.#..............#.#..#......#...................#...#....##.........#..#..#.#...#.#........
......#..........#....##.....#.......#.....#..........#......###....#.......#...........#......#..............#.........#..#.#.....
...#......#............#............#.#..#........#.....#.......#..............#.............#.........#...........#...............
..............##........#.##..#....................#.......#...............#...#.............#...#..##.........#.......#.........#.
..........##....#..#.........#...#..............#.....##..#.....................#...........##.......................#...........#.
......#..........##..............#...................#...#..#.....#.....#.......#...............#.........#..#......#........#.....
....#.#.............#.....#...#.....#.#........#.#...#...###..#........#..#...#.............#.........#.....................##.....
....#...#.........#..............#..............#.......####.........#..............##...........###.......#.....#........##..#..#.
..#...#...........#.#...#...#...............................#............#....................#...#....#..#...#.#...........#..#...
..#.....##..#.#.........................................#.........#....#......#....#..#....................#.#........#..........#.
..#...#..#...#......#.#.......#...............#.#......##..#..#.........#.............#......................#....##...##.#........
...#.#.#..............#...##..............#...#............#...............#...........#.#.........#..#.......#.#.#...........#....
............#.....#....#.....##...............#......#..........#.....#........#........#..............#...#.#.....#.#.............
............#........##.................#......#...............................#.#.#................#...#.................#..#.....
......#...#....#............#.........#.......#....#...................#........#..........#...............#...........#...........
........#............#......##.......#...........#.......#.............#.....................................#...........#.........
..........#.....#.........#.#.......................#..........##.........#....#........#.....#..........##..................##....
..........#........................#.............#.......##..#......#..........#...........#.............#....#..#..#....#......#..
......#........#........#.........#.......#....#..................#.........##.....#......#....................#...#.........#.....
...#..#....#....#.................#...#.....#.....##....................#.......##.....#...#...##.......................##.....#...
...##........#.....................#.........#..##....#.................###........#.......#..............#...#...#.......#....##..
.......#...........##.............#......##.............##.##........##...#..#..#.#.......#..#.#...........#...#...................
.........#.......##.............#............##.....#........#...............#.#.....#.....#.#..............#.......##...#.........
.......##...#....#...........#...........#..............#..#..#.........####..........#....##.................#..............#.....
....#..........................#..........#.............#..........#...#...........#.......#............................##.........
...#...#.....###.................................##...............................#....#...#..##.................................#.
..#....#.#......#............#...#......##.....#.....#..##...#.........#.....#.............#......#...#............#...............
......#.....#.##................#.......##.##........#.........................#..............................................#....
.#....#..................#.#...............#..#......##.......##...............#....####..........#...#........................#...
...#........#..........#.................#....#.........#....#.....#.........#.....#.#.......##.......#................#..##.......
.#.......#.#..#............##...........#......#.#.......................#.........#.....#.....#.....###...............#.#..##.....
.......................#...#...........#.........#....###.......................#.........###.#.#....#......#........##............
..#....................#.................#.#.##.#........#..#......#....#......##......#............#..#..............#....#....#..
.......................##.##.#..#.....###....#..#.#...#............#........#.....#....#.#.....#..#....#......................##...
....#.....#.........##..#....#..#.........#...#...#..##........#......###.....#..................#......................#..........
.#.#................#..#.#...#........................#....##..#.............#...#.#.......#........#.#.....##................#....
.##..#..........#..#.#........##............#.......#..........#....#.#...#....##.#...#..##...........#.......................#....
.#.#.##..................#............#.#......#.........#............#.#....#..#.........##..#..................##...........##.#.
..............#..........#...#...##..........#.....................#..#..............#.....#.#...........#.....#....#.......#......
..###.........#........###...#...........#..##.##..###....#...#................#.....#......#...##...................#...........#.
..#...........#.................##........#.........#...#.....##......##...#.........#......#.............#...#..#.................
..#.............#..........#.#.............#.....#............#....#.#......#....................#.#.......#.#.....#............##.
..........#...........#...#...#...#................#......#................#..........................##.##.....#..#..#.#..........
..............#....#......#............#.....#.......#..#..........................#..#...............................#............
............#.............#...........##...#.##..#.........#....#.....#..#.....#...............##....#.................#...........
...........#.....#.##..............#....#..........#......#.......#..##....##.......#.........#.......#....#...#..........#........
......#...#...#..............#.#...##.#..#........#.....#.......#...#.........#.....#.....##.........#.#...........................
..............#..#........#......##.......#......#...#.#........#.............#...##.............#.#.#...............##....#.......
.................................................................S.................................................................
.........#.....#.#.#..........#.#.............#..#.....................##......##.#.............#.#.......#.........#...#..........
.........#......#......#......#..........#...........................#...#......#..........#..#.#..........#......#..#..#...#......
........#.#...............##...............................#.#..............#.#....##..#...#...#....#..#.................#.........
.............#..#....#............#........#.#......#........#.......#....#......#...#.#..........#....##......#.#.................
............#..........#.............#.#..............#.....#.....#...#...#........#.#........#.#........#.#.......................
.................#........#......#....#.#................#..............#.....#.#.....#.............#.#........#.#...#.............
...........#....#.##...........#..#...................................#.#...#........#.......#.........#...#..##..##...............
.....................#.#..#...#.#..........#....##...#.................#...............#.......................#...................
..............#..#.............#.#...........#....#.......#.........#.......#.........#...#.#.........##............#..............
....#.............##....#......#..........................##.........#.#.........#.....#...#..............#........................
....#............#...........#.####....#...#.......#..#.........#...#.............#...........#...#...........#.##...........#.#...
..##..............#...............#...#.#..#....##.....................#..#.....#.............#....#.......#..###.............##.#.
.....#.##........#....#...##.#..###...#......#..##.#.....#..#.#.#........##......#............#.......#.....#....#...........##....
.#......................#.#.......#........#.#.#.........##.....#.....#..#........#..#..#...#..##.......#...............#..........
.....#...#.............................#.....#.....#......##......#...##........#.#.........................###.........#..........
...#........#...................#....#...........#..#....#...#.........#...........##.#..#..#..#...........##............#.........
......##..#..........##..#..#...........#......#...#........#.....#........#...........#........#............#........#.......#....
.......#.......................#....#......###..#..#..#.........#.##..#................#.....#...............................#.....
...#.........#............................................#...#....#...........#.#..................#.....##.......#...#........#..
..##..###.......#........#................#.....#..................##.........#..#..#...........#..##...###.........###...#...#....
..........#.....#.............#.#..#.#...........##.........#..............................#..#.......#.#................#.#.#.....
.......#..................#............##.............#..............#.#........#.#..............#...#..........................#..
...#.......#.....#..........................#...#...#...........#..#.............#.........#..........#.............#........#.....
..............#................##......#.#......#........................####...#.....#....#....#..................#.#.#........#..
........#.....#.#....#....................##......................................#...#..#.......#..........................##.....
...#.#.........#.#..#.............#...#....##.......#......................##...#.#.........#.....#..........#.....................
..#.#......#...#......##............#......#....#.#..#.#..........#....#......##..#................................#...............
........###..##....##...........................#.#.#.##..###........#....#............#........##.........#...#...................
....#............................#.#.........#.........#...#.......#.................#..#......#.........#..#.....#...#.#....#...#.
..#.#..........#..........#.........#..#...#..........#.....#....................#.#..#.......#...........#............#...........
.......#.....#...........##.........#.....#..........#....#..#......#...........#...##....#......................#....#.......#....
..##......#...##.............................##..........#....#..............#..........#..............##..#....##.#........##.....
....#......#....#.#..................#..........#....#.#..##.#.##........#.............................#...............#.......#.#.
.............#..#......#.................#.#..#....####........#......#......#....#.#.....................#.#.#.#..#...............
.##......#........##........#.............#.#.###.....#.............#.......#..##....#...#....................##..###.......#......
....#.#......##.#.......#......#......................#.......#.........#..#...........#................#.........#..#...#....#....
..........#....#..#...........#.................#...#..#.....................#.#........##.......#.#....#..#................##...#.
......#....#.......#.......#..#...........#......#............#......#................#..........#...#.......##...#....#.#.........
...#..##...##....#..#.......#....#.................#.#.....#....#........#..#.....####.#...........#..#............#...#..##.....#.
..#......#...................#...............................#............#.....##.............#..#...#..##.#......#...............
....#.........#.........#..............................#...#....#..#.#..............#...............#..##.........#.......#....#...
.....#.........#....#.............#............................#.................##............#...#......#..........#.....#.....#.
...#.#....#.......##...#....#............................##.#...#.......#...##...................#..........#.#....................
...........#..#.###.....##...#.........#...........#..#.#.........#.#.#.......#.................#....#............###.........#..#.
.##..........#..#......#.....##.##.#...##.........#.................#....#.#.....#.................#.....#...#....#.....###..#.#...
......#.#..##.#.......#...#..#........................#..#..........#.#....#..##........#...#.#.............#.#....................
.......#.#.............#..#.........................#.##..........##......................#...##.........#....#..........#..###....
...............#..#...#.........#.........#.................#.#......#....................#.........#.......................#.#....
.....#.................#.#...............##............................####...................##....#......#.#....##..#..#.......#.
....#..#.......#.#...#.......................##.........#..#.......#.#.#............#...........#.###............#......#...##.....
..#.#..........#..#.......#...#.........#....#.........#....#...#.......#.#..........##..##........................#..........##...
....#...##......##......#.......#....###..............................#.##........................#......##.......#............#...
...........#......#.#......#.............................#..........#...............#......##...............#.#........###.......#.
..............#......#.....#.........#.....##....#..................#..##.......#.........##.#..##..................#....#.........
....#...#...##.......###.......#....#...........#.#.............#...#.............#.#...#.#..................#..#.........#........
................#.........#....#....#.##.....#...###..........#.......#...........#..#....#.............#....................##....
.......................##..............#...#.#....##.#............#.#........#......##....#.......#........#.#.......#....#..#..#..
..#....#..#............#.#...................#.....................................#.......##.#............##..#........#..........
.....#............#.......##.........##...#........#........................................#................#.......#..........#..
......#.#.....#.......#............##......#.#..#....#.........................#...............#..#.......##....###......###.......
..#...................#.#...#.....#.......#..................................#..#....#......#.#...#..#..#......#.#.#....#....#.....
...#....#....#.....#.....#.............................#.##..............#.....#..#.........#...#.....#........#.......#......##...
.....#.......#.....#...#..#....#................#.......................#..#...#........#..........#....#..#....................#..
......#.............#.#...#.##.......#...#.....#.....#.#.#...............#.....##.#....#...............................#.#.....#...
...................................................................................................................................

47
21/part1.pl Normal file
View File

@@ -0,0 +1,47 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Map, Starting),
nsteps(Map, 64, [Starting], Ends), length(Ends, Answer),
write(Answer), nl.
nsteps(Map, N, Starts, Reachables) :-
length(Range, N),
foldl({Map}/[_, SIn, SOut]>>(step(Map, SIn, SOut)), Range, Starts, Reachables).
step(Map, CurrentCells, NextCells) :-
maplist(neighbors(Map), CurrentCells, NeighborsOfCells),
foldl(
[Neighbors, SetIn, SetOut]>>(
list_to_ord_set(Neighbors, NeighborsSet),
ord_union(SetIn, NeighborsSet, SetOut)),
NeighborsOfCells, [], NextCells).
neighbors(Map, X-Y, Neighbors) :-
findall(X1-Y1, neighbor(Map, X-Y, X1-Y1), Neighbors).
neighbor(Map, X-Y, X1-Y1) :-
( X1 is X, Y1 is Y+1; X1 is X, Y1 is Y-1;
X1 is X+1, Y1 is Y; X1 is X-1, Y1 is Y ),
nth0(X1, Map, Row), nth0(Y1, Row, '.').
replace(I, List, E, NewList) :- nth0(I, List, _, R), nth0(I, NewList, E, R).
% input parsing stuff below
input(FileName, Map, StartX-StartY) :-
phrase_from_file(lines(MapS), FileName),
nth0(StartX, MapS, Row), nth0(StartY, Row, s),
select(s, Row, '.', NewRow), replace(StartX, MapS, NewRow, Map).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> "\n"; eos.
line([s|Chars]) --> "S", line(Chars).
line(['.'|Chars]) --> ".", line(Chars).
line(['#'|Chars]) --> "#", line(Chars).
% Debug stuff
print(Map) :- maplist([X]>>(atomics_to_string(X, XStr), write(XStr), nl), Map).

11
21/test.txt Normal file
View File

@@ -0,0 +1,11 @@
...........
.....###.#.
.###.##..#.
..#.#...#..
....#.#....
.##..S####.
.##..#...#.
.......##..
.##.#.####.
.##..##.##.
...........

1479
22/input.txt Normal file

File diff suppressed because it is too large Load Diff

100
22/part1.pl Normal file
View File

@@ -0,0 +1,100 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- op(700, xfx, [supports, is_way_above]).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Bricks),
stack(Bricks, Stacked),
support_listing(Stacked, LookDown, LookUp),
max_member(MaxN-_-_-_, Bricks),
findall(N, (between(0, MaxN, N), can_remove(N, LookDown, LookUp)), Ns),
length(Ns, Answer),
write(Answer), nl.
can_remove(N, LookDown, LookUp) :-
BeingSupporteds = LookUp.N,
write(N), write("("), write(LookDown.N), write(") supporting "),
write(BeingSupporteds), nl,
maplist(supported_by_more_than_one(LookDown), BeingSupporteds).
supported_by_more_than_one(LookDown, N) :- LookDown.N > 1.
% StackedBricks is sorted by decreasing top edge
support_listing(StackedBricks, SupportedCount, SupportingMap) :-
findall(
N=SupportedListLen,
( append(_, [Brick1|Belows], StackedBricks),
supported_by(Brick1, Belows, SupportedList),
length(SupportedList, SupportedListLen),
Brick1 = N-_-_-_),
SupportedLists),
SupportedCount = brick{}.put(SupportedLists),
sort(2, @=<, StackedBricks, StackSortedByBottoms),
findall(
M=SupportingList,
( append(_, [Brick2|Aboves], StackSortedByBottoms),
supporting(Brick2, Aboves, SupportingList),
Brick2 = M-_-_-_),
SupportingLists),
SupportingMap = brick{}.put(SupportingLists).
% Aboves need to be sorted by increasing bot edge
supporting(_Brick, [], []).
supporting(Brick, [Above|_], []) :- Above is_way_above Brick, !.
supporting(Brick, [Above|Aboves], Supportings) :-
supporting(Brick, Aboves, NextSupportings),
( Brick supports Above
-> Above = N-_-_-_, Supportings = [N|NextSupportings]
; Supportings = NextSupportings).
% Belows need to be sorted decreasing by top edge
supported_by(_Brick, [], []).
supported_by(Brick, [Below|_], []) :- Brick is_way_above Below, !.
supported_by(Brick, [Below|Belows], SupportedBy) :-
supported_by(Brick, Belows, NextSupportedBy),
( Below supports Brick
-> Below = N-_-_-_, SupportedBy = [N|NextSupportedBy]
; SupportedBy = NextSupportedBy).
is_way_above(_-_-_-(Z2bot-_), _-_-_-(_-Z1top)) :- Z2bot > Z1top + 1.
supports(Brick1, Brick2) :-
overlap(Brick1, Brick2),
Brick1 = _-_-_-(_-Z1top), Brick2 = _-_-_-(Z2bot-_), Z2bot =:= Z1top + 1.
stack(Bricks, StackedBricks) :-
empty_heap(H0), foldl(stack1, Bricks, H0, Heap),
heap_to_list(Heap, HeapList),
maplist([_-Brick, Brick]>>(true), HeapList, StackedBricks).
stack1(Brick, Heap, NewHeap) :-
( max_of_heap(Heap, OldZtop, OldTop), overlap(Brick, OldTop)
; empty_heap(Heap), OldZtop is 0),
Brick = N-X-Y-(Zbot-Ztop),
NewZbot is OldZtop + 1, NewZtop is NewZbot + (Ztop - Zbot),
add_to_maxheap(Heap, NewZtop, N-X-Y-(NewZbot-NewZtop), NewHeap),
!.
stack1(Brick, Heap, NewHeap) :-
get_from_maxheap(Heap, LastZtop, LastTopBrick, HeapWithoutTop),
stack1(Brick, HeapWithoutTop, NewHeapWithoutTop),
add_to_maxheap(NewHeapWithoutTop, LastZtop, LastTopBrick, NewHeap).
overlap(_-(Xa1-Xa2)-(Ya1-Ya2)-_, _-(Xb1-Xb2)-(Yb1-Yb2)-_) :-
Xa1 =< Xb2, Xa2 >= Xb1, Ya1 =< Yb2, Ya2 >= Yb1.
% input parsing stuff below. Brick indexing is for debugging.
input(FileName, SortedBricks) :-
phrase_from_file(bricks(0, Bricks), FileName),
sort(2, @=<, Bricks, SortedBricks).
bricks(_, []) --> eos, !.
bricks(N, [Line|Lines]) --> {Next is N+1}, brick(N, Line), bricks(Next, Lines).
brick(N, N-(X1-X2)-(Y1-Y2)-(Z1-Z2)) -->
number(X1), ",", number(Y1), ",", number(Z1), "~",
number(X2), ",", number(Y2), ",", number(Z2), "\n".
% maxheap wrapper. PriX = -Pri, which is the Ztop
max_of_heap(H, Pri, Key) :- min_of_heap(H, PriX, Key), Pri is -PriX.
add_to_maxheap(H0, Pri, Key, H) :- PriX is -Pri, add_to_heap(H0, PriX, Key, H).
get_from_maxheap(H0, Pri, Key, H) :- get_from_heap(H0, PriX, Key, H), Pri is -PriX.
% Can probably do 2 maps, one by top edges and one by bottom edges and lookup

112
22/part2.pl Normal file
View File

@@ -0,0 +1,112 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- op(700, xfx, [supports, is_way_above]).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Bricks),
stack(Bricks, StackedBricks),
support_listing(StackedBricks, Supporters, SupportMap),
length(Bricks, Len), TopBrick is Len - 1,
findall(
Goners,
( between(0, TopBrick, Brick),
remove(SupportMap, [Brick], Supporters, Goners)),
GonerCounts),
sum_list(GonerCounts, Answer),
write(Answer), nl.
remove(_, [], _, -1).
remove(SupportMap, [N|ToKills], Supporters, Goners) :-
SupportedByN = SupportMap.N,
foldl(decrement_supporter_count, SupportedByN, Supporters, NewSupporters),
convlist({NewSupporters}/[X, X]>>(is_goner(NewSupporters, X)),
SupportedByN, ToKillMore),
append(ToKills, ToKillMore, ToKillNext),
remove(SupportMap, ToKillNext, NewSupporters, NextGoners),
Goners is NextGoners + 1.
is_goner(Supporters, M) :- Supporters.M =< 0.
decrement_supporter_count(M, Supporters, NewSupporters) :-
NewCount is Supporters.M - 1,
NewSupporters = Supporters.put(M, NewCount).
% StackedBricks is sorted by decreasing top edge
support_listing(StackedBricks, SupportedCount, SupportingMap) :-
findall(
N=SupportedListLen,
( append(_, [Brick1|Belows], StackedBricks),
supported_by(Brick1, Belows, SupportedList),
length(SupportedList, SupportedListLen),
Brick1 = N-_-_-_),
SupportedLists),
SupportedCount = brick{}.put(SupportedLists),
sort(2, @=<, StackedBricks, StackSortedByBottoms),
findall(
M=SupportingList,
( append(_, [Brick2|Aboves], StackSortedByBottoms),
supporting(Brick2, Aboves, SupportingList),
Brick2 = M-_-_-_),
SupportingLists),
SupportingMap = brick{}.put(SupportingLists).
% Aboves need to be sorted by increasing bot edge
supporting(_Brick, [], []).
supporting(Brick, [Above|_], []) :- Above is_way_above Brick, !.
supporting(Brick, [Above|Aboves], Supportings) :-
supporting(Brick, Aboves, NextSupportings),
( Brick supports Above
-> Above = N-_-_-_, Supportings = [N|NextSupportings]
; Supportings = NextSupportings).
% Belows need to be sorted decreasing by top edge
supported_by(_Brick, [], []).
supported_by(Brick, [Below|_], []) :- Brick is_way_above Below, !.
supported_by(Brick, [Below|Belows], SupportedBy) :-
supported_by(Brick, Belows, NextSupportedBy),
( Below supports Brick
-> Below = N-_-_-_, SupportedBy = [N|NextSupportedBy]
; SupportedBy = NextSupportedBy).
is_way_above(_-_-_-(Z2bot-_), _-_-_-(_-Z1top)) :- Z2bot > Z1top + 1.
supports(Brick1, Brick2) :-
overlap(Brick1, Brick2),
Brick1 = _-_-_-(_-Z1top), Brick2 = _-_-_-(Z2bot-_), Z2bot =:= Z1top + 1.
stack(Bricks, StackedBricks) :-
empty_heap(H0), foldl(stack1, Bricks, H0, Heap),
heap_to_list(Heap, HeapList),
maplist([_-Brick, Brick]>>(true), HeapList, StackedBricks).
stack1(Brick, Heap, NewHeap) :-
( max_of_heap(Heap, OldZtop, OldTop), overlap(Brick, OldTop)
; empty_heap(Heap), OldZtop is 0),
Brick = N-X-Y-(Zbot-Ztop),
NewZbot is OldZtop + 1, NewZtop is NewZbot + (Ztop - Zbot),
add_to_maxheap(Heap, NewZtop, N-X-Y-(NewZbot-NewZtop), NewHeap),
!.
stack1(Brick, Heap, NewHeap) :-
get_from_maxheap(Heap, LastZtop, LastTopBrick, HeapWithoutTop),
stack1(Brick, HeapWithoutTop, NewHeapWithoutTop),
add_to_maxheap(NewHeapWithoutTop, LastZtop, LastTopBrick, NewHeap).
overlap(_-(Xa1-Xa2)-(Ya1-Ya2)-_, _-(Xb1-Xb2)-(Yb1-Yb2)-_) :-
Xa1 =< Xb2, Xa2 >= Xb1, Ya1 =< Yb2, Ya2 >= Yb1.
% input parsing stuff below. Brick indexing is for debugging.
input(FileName, SortedBricks) :-
phrase_from_file(bricks(0, Bricks), FileName),
sort(2, @=<, Bricks, SortedBricks).
bricks(_, []) --> eos, !.
bricks(N, [Line|Lines]) --> {Next is N+1}, brick(N, Line), bricks(Next, Lines).
brick(N, N-(X1-X2)-(Y1-Y2)-(Z1-Z2)) -->
number(X1), ",", number(Y1), ",", number(Z1), "~",
number(X2), ",", number(Y2), ",", number(Z2), "\n".
% maxheap wrapper. PriX = -Pri, which is the Ztop
max_of_heap(H, Pri, Key) :- min_of_heap(H, PriX, Key), Pri is -PriX.
add_to_maxheap(H0, Pri, Key, H) :- PriX is -Pri, add_to_heap(H0, PriX, Key, H).
get_from_maxheap(H0, Pri, Key, H) :- get_from_heap(H0, PriX, Key, H), Pri is -PriX.
% Can probably do 2 maps, one by top edges and one by bottom edges and lookup

7
22/test.txt Normal file
View File

@@ -0,0 +1,7 @@
1,0,1~1,2,1
0,0,2~2,0,2
0,2,3~2,2,3
0,0,4~0,2,4
2,0,5~2,2,5
0,1,6~2,1,6
1,1,8~1,1,9

141
23/input.txt Normal file
View File

@@ -0,0 +1,141 @@
#.###########################################################################################################################################
#...###...#...#...#...###.....#...#...#.................#...#.......#.......###.....#.......#...#.....#####...#...#.....#.....###.....#.....#
###.###.#.#.#.#.#.#.#.###.###.#.#.#.#.#.###############.#.#.#.#####.#.#####.###.###.#.#####.#.#.#.###.#####.#.#.#.#.###.#.###.###.###.#.###.#
#...#...#.#.#.#.#.#.#.#...#...#.#.#.#.#...........#.....#.#.#.#.....#...#...#...#...#...#...#.#.#.#...#.....#...#.#.#...#...#.#...#...#...#.#
#.###.###.#.#.#.#.#.#.#.###.###.#.#.#.###########.#.#####.#.#.#.#######.#.###.###.#####.#.###.#.#.#.###.#########.#.#.#####.#.#.###.#####.#.#
#...#.#...#.#.#.#.#.#.#...#.#...#...#.#...###...#.#.....#.#...#.....#...#.#...#...###...#...#.#.#.#.###.......#...#.#.....#.#.#...#.#.....#.#
###.#.#.###.#v#.#.#.#.###.#.#.#######.#.#.###.#.#.#####.#.#########.#.###.#.###.#####.#####.#.#.#.#.#########.#.###.#####.#.#.###.#.#.#####.#
###...#.#...#.>.#.#.#.#...#...#.......#.#.#...#.#...#...#.....#.....#...#.#...#...#...#.....#.#.#.#.#.....#...#.#...#.....#.#.#...#...#.....#
#######.#.###v###.#.#.#.#######.#######.#.#.###.###.#.#######.#.#######.#.###.###.#.###.#####.#.#.#.#.###.#.###.#.###.#####.#.#.#######.#####
###...#...#...###.#.#.#.#.......#...###.#.#...#.###.#...#.....#...###...#.#...#...#...#.#...#.#.#.#.#...#.#...#.#...#.#...#.#.#.....#...#...#
###.#.#####.#####.#.#.#.#.#######.#.###.#.###.#.###.###.#.#######.###.###.#.###.#####.#.#.#.#.#.#.#.###.#.###.#.###.#.#.#.#.#.#####.#.###.#.#
#...#.......#...#.#.#...#...>.>.#.#.#...#.#...#...#.#...#.#.....#...#.#...#...#.....#.#.#.#.#.#.#.#.>.>.#.....#.#...#.#.#.#.#...#...#.###.#.#
#.###########.#.#.#.#########v#.#.#.#.###.#.#####.#.#.###.#.###.###.#.#.#####.#####.#.#.#.#.#.#.#.###v#########.#.###.#.#.#.###.#.###.###.#.#
#.............#.#.#...#.......#...#.#.#...#...#...#.#.###...#...#...#.#...#...#...#...#.#.#...#.#.###.#...#...#...#...#.#.#.#...#.###...#.#.#
###############.#.###.#.###########.#.#.#####.#.###.#.#######.###.###.###.#.###.#.#####.#.#####.#.###.#.#.#.#.#####.###.#.#.#.###.#####.#.#.#
#...............#.....#.......#.....#.#...#...#...#.#.#.>.>.#...#.###.#...#...#.#.....#.#.#.....#.#...#.#.#.#...#...#...#.#.#.....#...#...#.#
#.###########################.#.#####.###.#.#####.#.#.#.#v#.###.#.###.#.#####.#.#####.#.#.#.#####.#.###.#.#.###.#.###.###.#.#######.#.#####.#
#.....................#...#...#...#...#...#...###.#.#...#.#.#...#...#.#.#.>.>.#.#.....#.#.#.#...#.#...#.#.#.#...#.#...###.#.#.......#.......#
#####################.#.#.#.#####.#.###.#####.###.#.#####.#.#.#####.#.#.#.#v###.#.#####.#.#.#.#.#.###.#.#.#.#.###.#.#####.#.#.###############
#.....................#.#.#.....#.#...#.#...#.#...#.#.....#...###...#.#.#.#.#...#.....#...#...#...###...#...#...#...#...#...#...............#
#.#####################.#.#####.#.###.#.#.#.#.#.###.#.###########.###.#.#.#.#.#######.#########################.#####.#.###################.#
#...................#...#.......#.#...#...#...#.....#.........#...#...#.#.#.#.#.....#.......#...#...###.........#...#.#.###.......#.........#
###################.#.###########.#.#########################.#.###.###.#.#.#.#.###.#######.#.#.#.#.###.#########.#.#.#.###.#####.#.#########
#...#...............#...........#...#...#...###...#...........#.....###...#.#.#...#.........#.#.#.#...#...........#...#...#...#...#.........#
#.#.#.#########################.#####.#.#.#.###.#.#.#######################.#.###.###########.#.#.###.###################.###.#.###########.#
#.#.#...#.........#.....#.......###...#.#.#.#...#.#.....#.....#...#...#...#...###...#...#...#.#.#...#.#...................#...#...#...#.....#
#.#.###.#.#######.#.###.#.#########.###.#.#.#.###.#####.#.###.#.#.#.#.#.#.#########.#.#.#.#.#.#.###.#.#.###################.#####.#.#.#.#####
#.#...#...#...#...#...#.#.........#...#.#.#.#.#...#...#.#.#...#.#.#.#.#.#.#...#...#...#.#.#.#.#.....#.#.........#...###...#...#...#.#.#.....#
#.###.#####.#.#.#####.#.#########.###.#.#.#.#.#.###.#.#v#.#.###.#.#.#.#.#.#.#.#.#.#####v#.#.#.#######.#########.#.#.###.#.###.#.###.#.#####.#
#...#...#...#...###...#...........#...#.#.#.#.#...#.#.>.>.#...#.#...#.#.#.#.#...#.....>.>.#...#.......#...#.....#.#...#.#.#...#...#.#.#.....#
###.###.#.#########.###############.###.#.#.#.###.#.###v#####.#.#####.#.#.#.###########v#######.#######.#.#.#####.###.#.#.#.#####.#.#.#.#####
###...#.#.........#.#.............#...#...#...###...###.....#...#.....#.#...#.....#...#.#.......#.....#.#.#.....#...#.#.#.#...#...#.#.#...###
#####.#.#########.#.#.###########.###.#####################.#####.#####.#####.###.#.#.#.#.#######.###.#.#.#####.###.#.#.#.###.#.###.#.###v###
#.....#...........#...#...........###.......#.............#.....#.#...#.#.....###...#.#.#...#...#...#.#.#.###...#...#...#.#...#...#.#...>.###
#.#####################.###################.#.###########.#####.#.#.#.#.#.###########.#.###.#.#.###.#.#.#.###v###.#######.#.#####.#.#####v###
#.................#...#...#.......#...#.....#.#.....#...#...#...#...#...#.........#...#.#...#.#.#...#.#.#.#.>.>...###.....#...###.#.#.....###
#################.#.#.###.#.#####.#.#.#.#####.#.###.#.#.###.#.###################.#.###.#.###.#.#.###.#.#.#.#v#######.#######.###.#.#.#######
#.................#.#.#...#.#.....#.#...#...#.#.#...#.#...#...#.....#.............#.....#.#...#.#.#...#.#...#.....#...#.....#...#...#.......#
#.#################.#.#.###.#.#####.#####.#.#.#.#.###.###.#####.###.#.###################.#.###.#.#.###.#########.#.###.###.###.###########.#
#.....#.....###...#.#.#.....#.....#.......#.#.#.#.#...###...###.#...#...#...............#.#.#...#.#...#.###.....#.#...#...#...#.#...........#
#####.#.###v###.#.#.#.###########.#########.#.#.#.#.#######.###.#.#####.#.#############.#.#.#.###.###.#.###.###.#.###.###.###.#.#.###########
#####...###.>.#.#.#.#.#...###.....#.........#...#...#...###...#.#.....#.#.#.............#...#.....###...#...###.#.#...#...###...#...........#
###########v#.#.#.#.#.#.#.###v#####.#################.#.#####.#.#####.#.#.#.#############################.#####.#.#.###.###################.#
###...#...#.#.#.#.#.#.#.#.#.>.>.....#.....#...#...###.#.#...#...#.....#...#.........#.......###...........#####.#.#...#.#...........#.......#
###.#.#.#.#.#.#.#.#.#.#.#.#.#v#######.###.#.#.#.#.###.#.#.#.#####.#################.#.#####.###.###############.#.###.#.#.#########.#.#######
#...#...#...#...#...#...#...#.###...#...#...#.#.#.....#...#.......#...###.........#...#.....#...#.............#...###...#.........#.#...#####
#.###########################.###.#.###.#####.#.###################.#.###.#######.#####.#####.###.###########.###################.#.###.#####
#...#.........#...#...#.....#...#.#.#...#...#.#.........#...........#...#.....###.#...#...###.....#.........#.....#...............#...#.....#
###.#.#######.#.#.#.#.#.###.###.#.#.#.###.#.#.#########.#.#############.#####.###.#.#.###.#########.#######.#####.#.#################.#####.#
#...#.#.......#.#.#.#.#...#...#...#...#...#...###...###...#...#.........#...#...#...#.....#.....###.......#.#...#.#...#.....#.......#.......#
#.###.#.#######.#.#.#.###.###.#########.#########.#.#######.#.#.#########.#.###.###########.###.#########.#.#.#.#.###.#.###.#.#####.#########
#.....#.....###.#.#.#.###.#...#...#...#...###...#.#.###...#.#.#...###...#.#.#...#...###...#...#.#.........#...#...###...#...#.#.....#.......#
###########v###.#.#.#.###.#.###.#.#.#.###v###.#.#.#.###.#.#.#.###v###.#.#.#.#.###.#.###.#.###.#.#.#######################.###.#.#####.#####.#
#.........#.>.#.#.#.#...#.#.#...#.#.#...>.>.#.#.#.#.#...#.#.#...>.>.#.#.#.#...#...#...#.#.#...#.#.............#.........#.....#.....#.#.....#
#.#######.#v#.#.#.#.###.#.#.#.###.#.#####v#.#.#.#.#.#.###.#.#####v#.#.#.#.#####.#####.#.#.#.###.#############.#.#######.###########.#.#.#####
#...#...#...#...#.#.###.#.#.#.###...#...#.#.#.#...#.#.###.#.#.....#.#.#.#.....#.#.....#.#.#...#.###...........#.#.......#.......###...#...###
###.#.#.#########.#.###.#.#.#.#######.#.#.#.#.#####.#.###.#.#.#####.#.#.#####.#.#.#####.#.###.#.###v###########.#.#######.#####.#########.###
###.#.#...###.....#...#...#...###...#.#.#.#.#.....#.#.###...#.....#...#.#...#.#.#.#.....#.#...#...>.>.....#.....#.###...#.....#.........#...#
###.#.###.###.#######.###########.#.#.#.#.#.#####.#.#.###########.#####.#.#.#v#.#.#.#####.#.#######v#####.#.#####.###.#.#####.#########.###.#
###...###...#.....#...#.......#...#.#.#.#.#.#...#.#...#...#...###.#...#...#.>.>.#.#...#...#.....###.#.....#...#...#...#...###.........#.....#
###########.#####.#.###.#####.#.###.#.#.#.#.#.#.#.#####.#.#.#.###.#.#.#######v###.###.#.#######.###.#.#######.#.###.#####.###########.#######
#...#.......#...#...###.....#.#...#.#.#...#...#...#.....#...#.....#.#.......#...#.....#...#...#.#...#...#...#.#...#...#...#...#.......#...###
#.#.#.#######.#.###########.#.###.#.#.#############.###############.#######.###.#########.#.#.#.#.#####.#.#.#.###.###.#.###.#.#.#######.#.###
#.#.#.........#.....#...#...#.....#...#...........#.#...#...........#.......###.........#.#.#...#...#...#.#.#...#...#.#.###.#.#.........#...#
#.#.###############.#.#.#.#############.#########.#.#.#.#.###########.#################.#.#.#######.#.###.#.###.###.#.#.###.#.#############.#
#.#.........#.......#.#.#.............#...#.......#.#.#...###.........#...............#.#...#...#...#.###.#.###.#...#.#.###.#.#####.........#
#.#########.#.#######.#.#############.###.#.#######.#.#######.#########.#############.#.#####.#.#.###.###.#.###.#.###.#.###.#.#####v#########
#.#.......#.#...#...#.#.....#.......#.#...#.....###...###...#.........#.............#...#.....#.#...#.....#...#.#...#.#.#...#...#.>.#.......#
#.#.#####.#.###.#.#.#.#####.#.#####.#.#.#######.#########.#.#########.#############.#####.#####.###.#########.#.###.#.#.#.#####.#.#v#.#####.#
#...#.....#.....#.#...#.....#.....#...#...#.....#...#.....#...#.......#.......#...#...###...#...###.#...#...#...###...#.#.#...#.#.#.#.#.....#
#####.###########.#####.#########.#######.#.#####.#.#.#######.#.#######.#####.#.#.###.#####.#.#####.#.#.#.#.###########.#.#.#.#.#.#.#.#.#####
#.....#.........#.....#.#.........#...###.#.#...#.#.#.....#...#.......#.....#.#.#.....#...#.#.#.....#.#.#.#...#...#...#...#.#.#...#...#.....#
#.#####.#######.#####.#.#.#########.#.###.#.#.#.#.#.#####.#.#########.#####.#.#.#######.#.#.#.#.#####.#.#.###.#.#.#.#.#####.#.#############.#
#.....#.#.......#...#.#.#.......###.#.#...#...#.#.#.#...#.#.#.........#...#.#...###.....#.#.#.#.....#.#.#.#...#.#.#.#.#...#.#.....#.......#.#
#####.#.#.#######.#.#.#.#######v###.#.#.#######.#.#.#.#.#.#.#.#########.#.#.#######.#####.#.#.#####.#.#.#.#.###.#.#.#.#.#.#v#####.#.#####.#.#
#.....#.#...###...#.#.#...#...>.>.#.#.#.....#...#.#.#.#.#.#.#.......###.#...#.....#.....#.#.#.#...#.#.#.#.#...#.#.#.#...#.>.#...#.#.....#.#.#
#.#####.###.###.###.#.###.#.###v#.#.#.#####.#.###.#.#.#.#.#.#######v###.#####.###.#####.#.#.#.#.#.#v#.#.#.###.#.#.#.#######v#.#.#.#####.#.#.#
#.......#...#...###.#.###...#...#...#.....#.#.#...#.#.#.#.#.......>.>.#.......###.#...#.#...#.#.#.>.>.#...#...#.#.#.......#...#.#.......#...#
#########v###.#####.#.#######.###########.#.#.#.###.#.#.#.#########v#.###########.#.#.#.#####.#.###v#######.###.#.#######.#####.#############
###...###.>.#.....#.#...#.....#...###.....#.#...###...#.#.#.........#.....###...#.#.#.#.#.....#.#...###...#...#.#.#.....#.#.....###.....#...#
###.#.###v#.#####.#.###.#.#####.#.###.#####.###########.#.#.#############.###.#.#v#.#.#.#.#####.#.#####.#.###.#.#.#.###.#.#.#######.###.#.#.#
#...#.....#.......#.#...#...#...#...#.....#.........###...#.............#...#.#.>.>.#...#...#...#.......#...#.#.#.#...#.#.#.......#.#...#.#.#
#.#################.#.#####.#.#####.#####.#########.###################.###.#.###v#########.#.#############.#.#.#.###.#.#.#######.#.#.###.#.#
#...#...#.........#.#.#...#...#####.....#...#.....#.#.........#...#.....###.#...#...###...#...###...........#...#.#...#.#.#.......#.#...#.#.#
###.#.#.#.#######.#.#.#.#.#############.###.#.###.#.#.#######.#.#.#.#######.###.###.###.#.#######.###############.#.###.#.#.#######.###.#.#.#
###...#.#.#.......#...#.#...............###...#...#.#.......#...#...#.....#.....###.....#.....#...#.............#...###...#.......#.#...#.#.#
#######.#.#.###########.#######################.###.#######.#########.###.###################.#.###.###########.#################.#.#.###.#.#
#.....#...#...........#.......................#.....#.......#.....#...#...#...............#...#.....#...........###.....###...###...#.....#.#
#.###.###############.#######################.#######.#######.###.#.###.###.#############.#.#########.#############.###.###.#.#############.#
#...#.............#...###...............#...#.###...#.#.....#.#...#.#...###.............#.#.#.........#...#...#.....#...#...#...............#
###.#############.#.#####.#############.#.#.#.###.#.#.#.###.#.#.###.#.#################.#.#.#.#########.#.#.#.#.#####.###.###################
#...#...........#.#.#...#.............#.#.#.#.#...#.#...###...#.....#...#...#...........#...#...#.....#.#.#.#...#...#.#...#...#.............#
#.###.#########.#.#.#.#.#############.#.#.#.#.#.###.###################.#.#.#.#################.#.###.#.#.#.#####.#.#.#.###.#.#.###########.#
#.....#.........#...#.#.###...........#...#...#...#.....###...#...#...#...#.#.................#...###...#...#...#.#...#.....#...#...........#
#######.#############.#.###.#####################.#####.###.#.#.#.#.#.#####.#################.###############.#.#.###############.###########
###...#...........#...#...#...#.......###...#...#.....#...#.#.#.#...#.#...#.#.................###.............#.#.#...#...#...###...........#
###.#.###########.#.#####.###.#.#####.###.#.#.#.#####.###.#.#.#.#####.#.#.#.#.###################.#############.#.#.#.#.#.#.#.#############.#
#...#...#...#.....#...#...###.#.#.....#...#...#.#...#...#.#.#.#.#...#...#...#...............#...#.......#.....#...#.#.#.#.#.#.###...#.......#
#.#####.#.#.#v#######.#.#####.#.#.#####.#######.#.#.###.#.#.#.#v#.#.#######################.#.#.#######.#.###.#####.#.#.#.#.#.###.#.#.#######
#...#...#.#.#.>.#...#.#.....#...#.....#.#.......#.#.###.#.#.#.>.>.#.#.......#...#.........#.#.#.#.....#...###.....#.#.#.#.#.#.#...#...#.....#
###.#.###.#.#v#.#.#.#.#####.#########.#.#.#######.#.###.#.#.###v###.#.#####.#.#.#.#######.#.#.#.#.###.###########.#.#.#.#.#.#.#.#######.###.#
#...#...#.#.#.#.#.#...#.....#.........#.#.......#.#.#...#...#...###...#...#.#.#.#.......#...#.#.#...#...#.........#.#.#.#.#.#.#.......#.#...#
#.#####.#.#.#.#.#.#####.#####.#########.#######.#.#.#.#######.#########.#.#.#.#.#######.#####.#.###.###.#.#########.#.#.#.#.#.#######.#.#.###
#.....#...#.#.#.#.#.....#...#...#.....#.#.......#.#.#.......#.....#.....#...#.#.........#...#.#.###.#...#.....#...#.#.#.#...#.......#...#...#
#####.#####.#.#.#.#.#####.#.###.#.###.#.#.#######.#.#######.#####.#.#########.###########.#.#.#.###.#.#######v#.#.#.#.#.###########.#######.#
#.....#...#...#.#.#.#...#.#...#.#...#...#...#...#.#.#.......###...#.#.......#.......#...#.#.#.#.#...#...#...>.>.#.#.#.#.......#.....#...#...#
#.#####.#.#####.#.#.#.#.#.###.#.###.#######.#.#.#.#.#.#########.###.#.#####.#######.#.#.#.#.#.#.#.#####.#.###v###.#.#.#######.#.#####.#.#v###
#.......#.....#...#...#.#.#...#.....#.......#.#...#.#...#.......#...#.#.....#.......#.#...#.#.#.#.#...#...#...#...#.#.#...#...#...#...#.>.###
#############.#########.#.#.#########.#######.#####.###.#.#######.###.#.#####.#######.#####.#.#.#.#.#.#####.###.###.#.#.#.#.#####.#.#####v###
#...#.....#...###.......#.#.....#...#.......#.....#.#...#.......#...#.#.#...#.......#.....#...#.#.#.#.....#.#...#...#.#.#.#...#...#.#.....###
#.#.#.###.#.#####.#######.#####.#.#.#######.#####.#.#.#########.###.#.#.#.#.#######v#####.#####.#.#.#####.#.#.###.###.#.#.###.#.###.#.#######
#.#.#...#...#.....#.....#.#.....#.#.#...#...#...#.#.#.#.........###.#.#.#.#.#...#.>.>.....#.....#.#.....#.#.#...#.###.#.#.#...#.....#.....###
#.#.###.#####.#####.###.#.#.#####.#.#.#.#v###.#.#.#.#.#.###########.#.#.#.#.#.#.#.#v#######.#####.#####.#.#.###.#.###.#.#.#.#############.###
#.#.....#...#...#...#...#.#...#...#...#.>.>...#...#...#...........#.#.#.#.#.#.#...#.......#.#...#.#.....#.#.###.#...#...#...###...###...#...#
#.#######.#.###.#.###.###.###.#.#########v#######################.#.#.#.#.#.#.###########.#.#.#.#.#.#####.#.###.###.###########.#.###.#.###.#
#.........#...#.#...#...#.#...#.###.....#.........#.......#.......#...#...#...#...........#...#.#.#.....#.#...#.....#.....#...#.#.#...#...#.#
#############.#.###.###.#.#.###.###.###.#########.#.#####.#.###################.###############.#.#####.#.###.#######.###.#.#.#.#.#.#####.#.#
#.............#...#.###...#.....#...###.#.........#.....#.#...#...#.....#.....#...............#.#.#.....#...#...#...#.#...#.#.#.#...#####.#.#
#.###############.#.#############.#####.#.#############.#.###.#.#.#.###.#.###.###############.#.#.#.#######.###.#.#.#.#.###.#.#.#########.#.#
#...............#.#.#...#...#.....#...#.#.....#.........#.....#.#.#...#...#...#...........#...#...#.......#.....#.#...#.#...#.#.........#...#
###############.#.#.#.#.#.#.#.#####.#.#.#####.#.###############.#.###.#####.###.#########.#.#############.#######.#####.#.###.#########.#####
#.........#.....#...#.#.#.#.#.....#.#.#.......#.........#.....#.#.#...#.....###.........#...###...........###...#...#...#.#...#...#.....#...#
#.#######.#.#########.#.#.#.#####.#.#.#################.#.###.#.#.#.###.###############.#######.#############.#.###.#.###.#.###.#.#v#####.#.#
#.#...###...#...###...#.#.#...#...#.#.#.....#...#...#...#...#.#.#.#...#.#...#...#####...#.....#...........#...#...#.#.#...#...#.#.>.#...#.#.#
#.#.#.#######.#.###.###.#.###.#.###.#.#.###.#.#.#.#.#.#####.#.#.#.###.#.#.#.#.#.#####v###.###.###########.#.#####.#.#.#.#####.#.###v#.#.#.#.#
#...#.....#...#.....#...#.#...#.###.#.#...#.#.#.#.#.#...###.#.#.#.#...#.#.#.#.#...#.>.>.#.#...#...#.......#.....#...#.#...###.#.#...#.#.#.#.#
#########.#.#########.###.#.###v###.#.###.#.#.#.#.#.###v###.#.#.#.#.###.#.#.#.###.#.###.#.#.###.#.#.###########.#####.###.###.#.#.###.#.#.#.#
#...#.....#.........#...#.#.#.>.>.#.#...#.#.#.#.#.#.#.>.>.#.#.#.#.#.#...#.#.#...#.#...#...#...#.#.#.....#.....#.....#...#.#...#.#.#...#...#.#
#.#.#.#############.###.#.#.#.###.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.###.#.###.#.###.#######.#.#.#####v#.###.#####.###.#.#.###.#.#.#######.#
#.#.#.......#...###...#...#.#.#...#...#.#.#.#.#.#.#.#.###.#.#.#.#.#.#...#.#.#...#.#...#.......#.#...#.>.>.###...#...###.#.#...#.#.#.#.......#
#.#.#######.#.#.#####.#####.#.#.#####.#.#.#.#.#.#.#.#.###.#.#.#.#.#.###.#.#.#.###.#.###.#######.###.#.#########.#.#####.#.###.#.#.#.#.#######
#.#.........#.#.#...#.....#...#...#...#...#.#.#...#.#.#...#.#.#.#.#.#...#.#.#...#.#.###.#...#...#...#...#.......#.....#.#.#...#.#.#.#.#...###
#.###########.#.#.#.#####.#######.#.#######.#.#####.#.#.###.#.#.#.#.#.###.#.###.#.#.###.#.#.#.###.#####.#.###########.#.#.#.###.#.#.#.#.#.###
#.#...#...#...#.#.#.#...#.......#.#.....#...#.....#.#.#...#.#.#.#.#.#...#.#.#...#.#...#.#.#.#.###...#...#.......#.....#...#...#.#...#...#...#
#.#.#.#.#.#.###.#.#.#.#.#######.#.#####.#.#######.#.#.###.#.#.#.#.#.###.#.#.#.###.###.#.#.#.#.#####.#.#########.#.###########.#.###########.#
#.#.#.#.#.#...#.#.#.#.#.#.......#.#.....#.#...#...#.#...#.#.#.#.#.#.###.#.#.#...#...#.#.#.#.#...#...#.......###.#.......#...#...###...#...#.#
#.#.#.#.#.###.#.#.#.#.#.#.#######.#.#####.#.#.#.###.###.#.#.#.#.#.#.###.#.#.###.###.#.#.#.#.###.#.#########.###.#######.#.#.#######.#.#.#.#.#
#.#.#.#.#.#...#.#.#.#.#.#.......#.#.....#.#.#.#.#...#...#.#.#.#.#.#.#...#.#...#...#.#.#.#.#...#.#...#.....#...#...#.....#.#.........#...#...#
#.#.#.#.#.#.###.#.#.#.#.#######.#.#####.#.#.#.#.#.###.###.#.#.#.#.#.#.###.###.###.#.#.#.#.###.#.###.#.###.###.###.#.#####.###################
#...#...#...###...#...#.........#.......#...#...#.....###...#...#...#.....###.....#...#...###...###...###.....###...#####...................#
###########################################################################################################################################.#

51
23/part1.pl Normal file
View File

@@ -0,0 +1,51 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Map),
nth1(1, Map, Row1), nth1(StartY, Row1, '.'),
findall(N, route(Map, visited{}, 1-StartY, N), Ns),
max_list(Ns, Answer),
format('~w <- ~w', [Answer, Ns]), nl.
route(Map, _, X-_, 0) :- length(Map, Height), X =:= Height.
route(Map, Visiteds, X-Y, N) :-
Key is X*1000 + Y, NextVisiteds = Visiteds.put(Key, true),
neighbor(Map, X-Y, X1-Y1, Dist),
NeighborKey is X1*1000 + Y1, \+ _= Visiteds.get(NeighborKey),
route(Map, NextVisiteds, X1-Y1, N1),
N is N1 + Dist.
neighbor(Map, X-Y, NextX-NextY, Dist) :-
( X1 is X + 1, Y1 = Y;
X1 is X - 1, Y1 = Y;
X1 = X, Y1 is Y + 1;
X1 = X, Y1 is Y - 1
),
nth1(X1, Map, Row1), nth1(Y1, Row1, Cell1),
( Cell1 = '.' -> NextX = X1, NextY = Y1, Dist = 1
; Cell1 = '>' -> NextX = X1, NextY is Y1 + 1, Dist = 2
; Cell1 = 'v' -> NextX is X1 + 1, NextY = Y1, Dist = 2
),
( NextX =\= X; NextY =\= Y ).
% input parsing stuff below. Brick indexing is for debugging.
input(FileName, Map) :- phrase_from_file(lines(Map), FileName).
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> ("\n"; eos), !.
line([C|Chars]) --> [Ascii], line(Chars), {atom_codes(C, [Ascii])}.
% debug
print(Map) :-
findall(
X,
( nth1(X, Map, Line),
format('~3d', [X]), write(" "),
atomic_list_concat(Line, Str), write(Str), nl
),
_),
nl.

90
23/part2.pl Normal file
View File

@@ -0,0 +1,90 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
:- op(700, xfx, is_key_of).
main([FileName|_]) :-
input(FileName, Map, Start, End),
graph(Map, Start, End, Graph),
StartKey is_key_of Start, EndKey is_key_of End,
findall(Dist, walk(Graph, visited{}, StartKey, EndKey, Dist), Dists),
max_list(Dists, Answer),
write(Answer), nl.
walk(_, _, Node, Node, 0).
walk(Graph, Visited, Start, End, Dist) :-
member(Next-NextDist, Graph.get(Start)), \+ _ = Visited.get(Next),
NextVisited = Visited.put(Next, true),
walk(Graph, NextVisited, Next, End, RemainingDist),
Dist is NextDist + RemainingDist.
graph(Map, Start, End, Graph) :-
branch_points(Map, Branches), Nodes = [Start, End|Branches],
findall(
Key-Dists,
( member(Node, Nodes),
dists_from(Map, Nodes, Node, Dists),
Key is_key_of Node),
GraphList),
dict_pairs(Graph, edge, GraphList).
branch_points(Map, Points) :- findall(Point, branch_point(Map, Point), Points).
branch_point(Map, X-Y) :-
nth1(X, Map, Row), nth1(Y, Row, Cell), Cell = '.',
findall(X1-Y1, cell_neighbor(Map, 0-0, X-Y, X1-Y1), Neighbors),
length(Neighbors, N), N > 2.
dists_from(Map, Nodes, N1, Dists) :-
findall(
Key-Dist, (
member(N2, Nodes), \+ N1 = N2,
nobranch_dist(Map, 0-0, N1, N2, Dist),
Key is_key_of N2),
Dists).
is_key_of(Key, X-Y) :- Key is X*1000 + Y.
% nobranch_dist(X1-Y1, X2-Y2, Dist) :- true.
nobranch_dist(_, _, X-Y, X-Y, 0).
nobranch_dist(Map, FromX-FromY, X1-Y1, X2-Y2, Dist) :-
findall(Xn-Yn, cell_neighbor(Map, FromX-FromY, X1-Y1, Xn-Yn), Neighbors),
length(Neighbors, NeighborCount),
\+ (NeighborCount =\= 1, FromX =\= 0), % on a route or at beginning
member(Neighbor, Neighbors),
nobranch_dist(Map, X1-Y1, Neighbor, X2-Y2, NextDist),
Dist is NextDist + 1.
% cell_neighbor finds an adjacent neighbor
cell_neighbor(Map, FromX-FromY, X-Y, X1-Y1) :-
( X1 is X + 1, Y1 = Y;
X1 is X - 1, Y1 = Y;
X1 = X, Y1 is Y + 1;
X1 = X, Y1 is Y - 1
),
nth1(X1, Map, Row1), nth1(Y1, Row1, '.'),
\+ (X1 = FromX, Y1 = FromY).
% input parsing stuff below. Brick indexing is for debugging.
input(FileName, Map, 1-StartY, EndX-EndY) :-
phrase_from_file(lines(Map), FileName),
length(Map, EndX),
nth1(1, Map, StartRow), nth1(StartY, StartRow, '.'),
nth1(EndX, Map, EndRow), nth1(EndY, EndRow, '.').
lines([]) --> eos, !.
lines([Line|Lines]) --> line(Line), lines(Lines).
line([]) --> ("\n"; eos), !.
line(['#'|Chars]) --> "#", line(Chars).
line(['.'|Chars]) --> ("."; ">"; "v"), line(Chars).
% debug
print(Map) :-
findall(
X,
( nth1(X, Map, Line),
format('~3d', [X]), write(" "),
atomic_list_concat(Line, Str), write(Str), nl
),
_),
nl.

23
23/test.txt Normal file
View File

@@ -0,0 +1,23 @@
#.#####################
#.......#########...###
#######.#########.#.###
###.....#.>.>.###.#.###
###v#####.#v#.###.#.###
###.>...#.#.#.....#...#
###v###.#.#.#########.#
###...#.#.#.......#...#
#####.#.#.#######.#.###
#.....#.#.#.......#...#
#.#####.#.#.#########v#
#.#...#...#...###...>.#
#.#.#v#######v###.###v#
#...#.>.#...>.>.#.###.#
#####v#.#.###v#.#.###.#
#.....#...#...#.#.#...#
#.#########.###.#.#.###
#...###...#...#...#.###
###.###.#.###v#####v###
#...#...#.#.>.>.#.>.###
#.###.###.#.###.#.#v###
#.....###...###...#...#
#####################.#

300
24/input.txt Normal file
View File

@@ -0,0 +1,300 @@
320870677764563, 335750934489987, 282502845957937 @ -40, -24, 10
219235623600942, 408022798608755, 245679379684914 @ 127, -45, 66
171834827764229, 225154401936948, 232302441670972 @ -122, -521, 95
399408000414510, 365475460204869, 325051385807860 @ -110, -35, -35
382531108862210, 229601570088564, 368913364777462 @ -119, 127, -107
149909452680584, 220522474055239, 215024246295982 @ 198, -73, 190
234205136344037, 217641496634781, 245767047966874 @ 50, 126, 57
154245972353770, 254717416188789, 165260557711000 @ 191, 37, 220
369540770291762, 356366422983125, 93794725449906 @ -15, 24, 216
226276010405492, 209995120939680, 310956910929616 @ -25, 99, -149
268638972773930, 269486309393569, 248987782583720 @ -21, 26, 50
361178860307414, 374454477296229, 399143377389604 @ -6, 7, -83
202257892924214, 270170054947827, 246834210935308 @ -51, -252, 15
277024186353899, 205267962954879, 342506025642424 @ -178, 112, -245
285916480116416, 388917502500415, 279882602663788 @ 60, -19, 31
145282209670550, 224173312800453, 249344095056520 @ 236, -215, -56
208447142984970, 231890691603339, 298351303820520 @ 61, 67, -75
161755191939510, 174118992755389, 243050626677760 @ 55, 212, -35
318313224606524, 381722223896712, 347955048413278 @ 27, -11, -39
305673336971274, 370290487695419, 422379794963756 @ 29, -13, -129
328180566576385, 213760869384648, 251670316230916 @ -34, 151, 55
230518001853761, 324986205789729, 203877601589479 @ 28, -118, 142
144072041563378, 90185316765691, 182011664702202 @ 217, 456, 233
185151810500310, 221100644135477, 245109663655204 @ 91, 60, 43
373850664858040, 293374889307828, 175368782897875 @ -89, 49, 154
328502469179556, 412212496772722, 260184335059001 @ 7, -55, 50
223132851962520, 223914729021163, 327185491912702 @ 76, 119, -80
198895082054102, 271680428770347, 234537752577403 @ 69, -56, 76
252972518344820, 389690617977839, 374418656922750 @ -153, -532, -403
192164383825878, 82139993028623, 120091254828574 @ 55, 519, 466
156955794165198, 191592767579977, 233413147425100 @ 64, -100, 79
165008537629302, 183661085826489, 248545405693408 @ -68, 52, -182
373129120338738, 368249004318254, 320596847750514 @ -71, -33, -27
275929675024853, 194671117708439, 343770846827540 @ -120, 152, -201
173580271204630, 203823601071863, 239810510444710 @ -139, -204, -11
189671912659874, 259317534315745, 248510443915264 @ 33, -150, 16
172552678412603, 76290981681303, 250440858733279 @ 148, 428, 40
127051067028085, 224685590300118, 27951449994759 @ 286, 13, 860
231732307446206, 111700054896778, 381283992852198 @ 93, 285, -115
196775286792290, 250152880582527, 165723767492786 @ -39, -179, 422
198162199765890, 326088593352961, 293740956136336 @ 121, -46, -20
181567111184732, 234940800451055, 284267674024586 @ 60, -61, -144
343894774969218, 251446196757409, 324645022076636 @ -155, 62, -88
154322997480050, 321666831724779, 170189917536370 @ 193, -37, 182
269135111242526, 422914585575117, 44342942222152 @ 18, -177, 368
174234267626414, 206600028766149, 247203043132680 @ 48, 7, -6
301438105099034, 196682335636041, 242355832704292 @ -37, 168, 65
52382227177535, 137282743662489, 90222907787860 @ 304, 242, 231
287281969399048, 189476966098213, 378020645240557 @ -65, 174, -200
329003376176988, 435916939135103, 202654481427582 @ 20, -61, 110
183674690012150, 191781746274329, 227891029018460 @ -72, 68, 123
366646274315090, 480902014044223, 227077161038699 @ -39, -136, 86
209229044274730, 190608724313417, 187400386715900 @ 136, 185, 129
261618567625850, 400563976485889, 144954360500820 @ 12, -178, 228
264216158312450, 334972046672343, 305882984918398 @ 41, -21, -22
466350980510496, 230380017371646, 332577962045002 @ -125, 145, -23
266431863912996, 290874605525783, 509046541048002 @ -10, -7, -418
132224880034084, 176627699412807, 220106637500956 @ 263, 196, 127
300469550083263, 426413462614973, 209018833990362 @ 40, -66, 105
311030442665825, 223508982594159, 255317416767895 @ -72, 120, 42
517047998068110, 239075216009569, 372653857063880 @ -166, 138, -60
170904351760141, 270353076576237, 209565974699113 @ 128, -122, 160
290157904191917, 379443622665012, 427270086392227 @ 42, -29, -140
173867272759940, 201864684820176, 243051222520867 @ 31, 15, 12
241502019378006, 260671504666073, 310914265664160 @ 100, 108, -6
271283475933083, 246303519670521, 255211216146782 @ 78, 130, 57
388021238794645, 216488511621914, 298488270181975 @ -184, 135, -26
335856195264706, 301351728593361, 283609538939852 @ -7, 61, 23
247561156076045, 271177759902429, 244748631170605 @ -154, -146, 38
276696780291055, 333024920521025, 305604257091590 @ -134, -214, -111
190855793421101, 153164710734612, 127049898278632 @ 28, 293, 523
443492983001086, 525011795745025, 422682967987684 @ -88, -142, -107
501694282984570, 467198174503214, 473605302628600 @ -239, -163, -221
335390812504546, 362603263870063, 309797115541008 @ -23, -24, -13
202304759605965, 213333718249183, 246143159635191 @ -94, -12, 8
177782812262045, 206513164309989, 236356130506975 @ -40, -66, 54
388319746430552, 513573144680169, 445043621805025 @ -53, -158, -146
194320135718360, 233248821891459, 202359964193575 @ 107, 80, 144
216771660023300, 171002079515199, 475642130495202 @ -54, 217, -838
234091788605150, 329933100121089, 222620683383130 @ -105, -358, 118
270608669158866, 301404666421918, 259633482142765 @ -7, -15, 34
257130045685842, 324015469970377, 192079653460084 @ 29, -36, 145
177501821940794, 206397724473173, 236757119637960 @ 117, 108, 69
258491080589540, 328713305053641, 347685992911240 @ 96, 54, -31
300241327661250, 317780474139381, 395082844930752 @ -119, -101, -264
166701742849052, 170048803933150, 279009405626079 @ 99, 231, -190
232167716240370, 309180901229489, 364847973540700 @ 82, 9, -110
272472196902758, 211620478899945, 169919557370053 @ 13, 146, 176
155257558622970, 215412500302073, 224645492519800 @ 151, -144, 154
165140630756911, 183872378821537, 189847493429559 @ 88, 138, 392
222481991685145, 381866546445014, 402626810510600 @ 106, -67, -141
195176269606298, 148450429795245, 252663005801584 @ 75, 275, 26
208907792419362, 350794355038735, 294502109591690 @ 89, -129, -36
163731694743470, 222695183641289, 249450695542684 @ 126, -48, -5
209099853718520, 241562956480389, 283990363935025 @ 11, -10, -82
161530626632686, 237419576114933, 319638596916810 @ 175, 68, -106
159481040133596, 158629339034865, 210459590512168 @ 58, 434, 405
123469770101234, 257476537375091, 234494092643914 @ 273, -27, 76
292278978987570, 239866606409241, 199533371820276 @ -149, 43, 162
380447223996379, 374529302108629, 538133423675973 @ -100, -58, -318
192314223519770, 237171949514439, 327368019710830 @ 101, 57, -140
164228470258070, 152786375782989, 233781247174300 @ 40, 443, 75
172857923598290, 361486110825537, 216740814450508 @ 111, -514, 143
215968779962610, 275822816042585, 255939903446892 @ 71, 5, 35
224072378959655, 219760339836420, 250116723554098 @ -94, 25, 13
341826278658070, 323384093598739, 317050311826650 @ -197, -105, -94
358061026812176, 333431655135129, 501927131792690 @ -36, 22, -226
362057930007880, 364175461079693, 291565175187926 @ -44, -16, 12
254480531220540, 261585394784649, 315221878253440 @ -61, -14, -125
239345238738065, 232921068298368, 52215243122876 @ 66, 115, 351
174121671759746, 253098934851105, 265802255418028 @ 127, -32, -18
336492062606489, 22227894726016, 480141325107541 @ -6, 371, -194
159311142016790, 144443435124894, 222453887189935 @ 117, 461, 172
264027680313710, 285411784271013, 175063578354076 @ 91, 96, 135
162835672903750, 194990375099697, 241394520022980 @ 16, -74, -31
306159412517226, 349026413686307, 514099559091684 @ 29, 11, -229
361674598186586, 541486806728355, 358055452228678 @ -143, -392, -123
387616545088370, 458824259273879, 187757363559110 @ -39, -84, 125
169441075829130, 63304826516582, 231410285377464 @ 161, 425, 83
25747427352685, 141237559854084, 110612909830610 @ 344, 241, 221
224941003813670, 293572180292369, 343069410375740 @ 66, -10, -117
230260619234115, 246354839816571, 227616486618513 @ -64, -32, 98
122374062836488, 129460749486351, 248910762647847 @ 283, 340, 32
257926150662427, 296587117999220, 269098859305457 @ 52, 35, 30
356168259600515, 496710404337273, 355767267199108 @ -164, -366, -137
499138453043411, 241721200046286, 383865072357541 @ -150, 135, -72
354351640576530, 333708262751349, 240972379666960 @ -43, 13, 70
414646107949045, 490351310759496, 391588852973424 @ -74, -125, -85
182510517018696, 196037200020145, 254600487937890 @ -88, 18, -106
203067123583136, 283551214233744, 250446375434740 @ 75, -53, 39
252810044109290, 237002938926201, 75981980028076 @ 46, 109, 315
336333829055570, 388442894436689, 291634558906300 @ 18, -7, 22
395076042194198, 359212075803360, 298728466148813 @ -51, 13, 12
158785266271843, 234903117684176, 269092839411151 @ 82, -559, -374
309601884465086, 412842250362681, 306976533326464 @ -32, -144, -28
294030373468330, 396089847565113, 280064088752700 @ 46, -35, 29
331545729822620, 256988945451264, 265060418520925 @ -81, 75, 30
190647571880991, 101485268249820, 252635532573594 @ 68, 439, 17
286448585468055, 517134354733154, 186333249962180 @ 38, -205, 135
153617721701820, 178833230713415, 252336845995825 @ 151, 156, -146
337398961767230, 377411392580169, 378982185725528 @ 6, -8, -72
195250366116408, 193178125048569, 472013133254368 @ 50, 142, -707
185967157561902, 242667813003287, 287987773258452 @ 59, -61, -133
178872203125295, 113519768889594, 13727599749985 @ 166, 275, 340
319415310905105, 435440863922004, 41521512187915 @ -32, -155, 342
251586814655345, 344865748855428, 269612063292298 @ 26, -89, 17
269246730728402, 271578178622193, 279439460804668 @ -88, -31, -32
135533496860438, 278285521115205, 214907869435324 @ 219, 68, 103
276812075909858, 466037129861747, 395316831883066 @ 57, -127, -104
236930960411706, 243177338144695, 356325165559341 @ 65, 96, -112
380460503419598, 324370013927517, 371388836906704 @ -82, 19, -90
427398362574065, 546630525363764, 426883192743950 @ -72, -163, -111
177868966679682, 217731875079305, 213146155346340 @ -143, -315, 324
290284806845247, 119840422044798, 184970876358517 @ -52, 301, 166
340880756829785, 288068023675589, 315817226541790 @ -36, 62, -23
185573708687938, 225251128591507, 128884524503130 @ 137, 113, 264
186685995213874, 219001269459803, 214926674026246 @ -47, -91, 202
199184710396145, 215180367747336, 203151616358728 @ -174, -101, 307
171076784522930, 146981293827499, 60098514063820 @ 177, 233, 271
270206225348270, 249412790853189, 300466015667500 @ -44, 51, -57
234689751989636, 218746599271293, 241908203795056 @ -60, 68, 53
336725151372856, 147342236950433, 199748653670338 @ -16, 234, 118
171003890899833, 195424392282388, 258493155527802 @ -28, -15, -187
149412455352770, 330619018965931, 331721336873716 @ 201, -121, -125
290849090590752, 279180853742381, 288711681503108 @ -65, 6, -25
163782604097570, 201369533990859, 276104464321110 @ -39, -239, -634
383466451055234, 487708948895409, 243501681722620 @ -31, -108, 69
278873443047818, 270949972855161, 295581748376284 @ -178, -79, -103
275483328204728, 359753199304611, 281769098655988 @ 55, -12, 23
155550526665711, 194627020895100, 222697531404203 @ 142, 13, 182
272548165774242, 183113072391357, 219832002893320 @ -71, 184, 109
365051505965124, 358358344604291, 369447127951585 @ -13, 20, -56
226749420175018, 136295903261165, 369261631685233 @ 49, 278, -188
347337565099555, 206264170469455, 435941166700880 @ -14, 168, -141
195173574972300, 288059724160556, 314475702179696 @ 131, 29, -45
290901181489325, 322228161855234, 270950972726635 @ -44, -53, 14
160976286106050, 217995178956129, 225852181163340 @ 97, -185, 147
194862657814148, 311950660223715, 37627659899164 @ 58, -229, 695
187756065196068, 189433672405609, 237753933445096 @ 95, 162, 67
314662593059606, 457342368237267, 280627472484196 @ 19, -109, 27
267078738018370, 395588665670289, 329017002090900 @ 41, -98, -51
198453105662012, 204180092239497, 125941083981442 @ 60, 118, 388
325515244603174, 193963026836233, 83616169017080 @ -40, 176, 284
306120915804898, 216669056599065, 224566702076996 @ -47, 136, 93
262952419990622, 189332097246832, 339944472270492 @ -123, 161, -225
430090980639770, 542562712338489, 554533524742700 @ -264, -407, -453
153428204187620, 258973851297351, 146351712685552 @ 176, -321, 621
267157324234725, 253300767826406, 247830886471870 @ -44, 39, 49
172772522836510, 205083962044941, 244745265268276 @ -34, -101, -35
196853173091800, 235959594193899, 277157185859790 @ 124, 103, 8
252233329257530, 150771238871169, 214260239540880 @ 99, 226, 98
260490329235010, 420724181636745, 466676682577804 @ 41, -152, -257
184101537716370, 206927897278749, 158088282864140 @ 61, 73, 383
371707477810145, 476446047030789, 395602648788850 @ -32, -114, -91
274680779584238, 328310092921155, 187337441960652 @ 27, -11, 143
199636505804290, 225659286596792, 281910746142349 @ -119, -121, -230
401663498069128, 324128314956575, 308385593557516 @ -122, 11, -17
306117741289910, 332540256531302, 198589750550180 @ 21, 21, 119
303752166745505, 329304097065024, 339365273624437 @ 16, 17, -48
154413399453767, 281779422496148, 262521206679621 @ 162, -631, -148
236991415564934, 260590948682271, 232297491880996 @ -113, -105, 83
169296005492162, 193449873692505, 238539375195412 @ -55, -36, 13
283385836439282, 243921272996229, 338818675191694 @ -207, -8, -242
360218974366508, 393941699996637, 490793199709315 @ -57, -66, -236
164882077279529, 201483737546733, 335070662943802 @ 124, 70, -427
428414485445962, 492485352755959, 272973136766672 @ -67, -103, 41
264897981595185, 404913442349664, 276336971338210 @ 88, -23, 37
124722508278926, 2134756155381, 110913025404874 @ 227, 384, 208
536832023822247, 453183106296689, 554060222944721 @ -356, -198, -382
319673051050466, 266571988792245, 210279914314000 @ 17, 103, 104
150821661312904, 219455030985091, 231399996053480 @ 194, -19, 89
158037715359790, 284936450761794, 164842330369291 @ 181, -53, 238
255633864100187, 315497864599284, 295466891366890 @ -90, -183, -91
392762975015658, 291483914154943, 229288562346068 @ -35, 89, 83
309403838076114, 336694805164365, 277758585027766 @ 17, 16, 28
287207150932613, 479713650170448, 553028229703657 @ -40, -331, -480
269836626986969, 417558006790458, 212469813227848 @ -6, -215, 115
196645388374976, 244570813283961, 249157458432502 @ 87, 34, 41
339693128219614, 399751916312913, 284680478974716 @ 8, -26, 27
187559549440250, 195622840636569, 254727426356500 @ -148, 13, -116
304935421756516, 348400992185367, 261097863957704 @ 10, -11, 45
394511030167381, 223826480972951, 305918192064792 @ -110, 140, -13
223011594988398, 194915959669899, 221220518871005 @ -131, 112, 134
235558411474303, 407906141462802, 340419559289067 @ -22, -401, -198
168807003005795, 353652818048826, 276081152261755 @ 126, -489, -86
146617870930743, 156137711671265, 286804418224879 @ 220, 330, -284
286018415412552, 353012603278297, 251064479342937 @ 23, -30, 56
447713232441308, 372146255273187, 341273315411916 @ -153, -32, -49
209718676758750, 247605970547674, 218062472885396 @ -19, -63, 135
343626695642120, 155974548843997, 172127764933794 @ -24, 224, 150
345109049048735, 227227570932339, 273481589457805 @ -136, 112, 10
188575330043159, 118850415966657, 305893691628208 @ 134, 298, -45
326608598650070, 151338233232649, 416515828832310 @ -99, 242, -231
360202364064386, 436602737274865, 326789378915772 @ -27, -81, -22
213268194460580, 241549002519749, 394962709612380 @ 84, 80, -217
197614206616568, 139979243625984, 357286465189054 @ 15, 337, -399
227981330842760, 156692554162989, 177379530796580 @ -57, 262, 263
157229517762970, 231523131346089, 46953217581800 @ 167, -44, 890
305219322429448, 177060442180047, 49658860244982 @ -22, 199, 342
152688286391810, 215257107452481, 216706409125996 @ 171, -167, 232
177207555863420, 203871290203365, 289811933188528 @ -74, -84, -479
190420105339073, 167303615894628, 216289073804446 @ 110, 219, 117
266399617296604, 299362499051479, 325520686693096 @ -20, -33, -95
481245676627650, 436807969705569, 314107082127180 @ -202, -116, -19
401026926420116, 374922905725809, 350888777956543 @ -101, -38, -62
256839644239620, 270114181543499, 257354063805598 @ 26, 47, 40
412259775717406, 242736865487561, 424824610687152 @ -86, 128, -130
66312913166752, 101998933996761, 60120199695721 @ 283, 274, 250
506958247823068, 361333863900433, 280005516982136 @ -152, 18, 33
298773017825360, 317212540408089, 312439900056100 @ 12, 22, -21
220796554287875, 214622218414014, 268263970137525 @ -96, 37, -66
189208611146850, 404126141855649, 112689238573260 @ 52, -656, 531
234488363250114, 231264618839649, 204011914548812 @ 65, 112, 126
283632869172150, 177048553588739, 391393075492010 @ -121, 197, -300
502765928206235, 353125800556389, 304677713378740 @ -156, 22, 7
137557454494001, 97473160546677, 94622893468780 @ 242, 470, 559
254064108665930, 262174096766589, 289808760599414 @ 21, 52, -18
182103896038108, 247435234271202, 351160194849282 @ -25, -299, -735
249420082303430, 42226989901413, 97645217504204 @ 36, 421, 303
284785302989480, 255729203245377, 252686569800496 @ -94, 26, 37
233601301711332, 322776864011749, 366444377930614 @ 70, -28, -128
155098520524958, 244934576541158, 226621458469431 @ 165, -241, 122
146746875809578, 160303698184733, 228748383224514 @ 205, 224, 86
326652196225864, 355170482041167, 311279979189430 @ -38, -41, -26
277275275212730, 369459942642369, 282937479061000 @ 59, -14, 24
295687269134249, 340949989963329, 238600197559195 @ 60, 42, 74
279992481783853, 333185439596083, 324914479814764 @ 64, 36, -17
241428276856914, 266598398788449, 362846190951676 @ -40, -38, -260
259307794913743, 295678437418021, 269285719406143 @ 8, -10, 16
240223936950226, 473763454154241, 220230835580308 @ 77, -206, 97
318558193417106, 334499570437515, 230529981435367 @ 25, 36, 82
275715901048290, 73132232580276, 217625216713160 @ 41, 331, 99
193044713426762, 394683970973463, 372101396303146 @ 145, -80, -99
145897314675055, 223949571890769, 176036980234010 @ 232, -230, 585
161440895273330, 237913221256553, 291149659043788 @ 171, 45, -65
264388423069872, 379242075888111, 338900807126713 @ -5, -164, -110
335398015038338, 259239092404812, 434897503751132 @ 9, 115, -129
236716202526674, 332397372379329, 276349416527020 @ 79, -18, 19
322665826998882, 358742494848305, 303038334161388 @ -13, -25, -7
428381456361421, 547609324289011, 198413346560546 @ -70, -160, 113
157290994488974, 206478542217105, 303245653405090 @ 157, 26, -311
395914211954640, 425947992394193, 312165656677126 @ -184, -190, -44
244618900201418, 557301378477177, 207722519450068 @ -51, -810, 147
279386951121298, 308300290814141, 289436636980500 @ -31, -36, -21
306161107858370, 145704637204577, 363514529004748 @ -99, 258, -170
157069989582566, 150135411048405, 169136269193176 @ 168, 309, 356
149210988438152, 134368802376762, 209337851128249 @ 203, 605, 318
332584662588854, 503022806009046, 148583395713307 @ -43, -235, 192
470742777193259, 423305548535160, 228962588950855 @ -160, -77, 84
250671602810546, 250908746265621, 243056875754412 @ -135, -50, 47
531229816428916, 231708023716351, 470967021948546 @ -196, 143, -168
237893080628802, 139019131653901, 131107424449688 @ 73, 254, 227
218711687951546, 159752359004265, 320741448667460 @ 78, 229, -76
165313081944257, 184601129061069, 299424839638243 @ 168, 182, -58
307210181456654, 421282787395425, 479731549148236 @ 37, -54, -177
305412361284452, 343104362104491, 360276884155534 @ -56, -75, -130
368644982396221, 368636169652378, 540142064185444 @ -22, 5, -233
296336361357714, 453921261262757, 388278886187068 @ 53, -79, -77
431597308261298, 363087620944641, 307225389042377 @ -231, -86, -34
302152593338480, 335110106105791, 293583504813410 @ 36, 29, 14

20
24/lol.txt Normal file

File diff suppressed because one or more lines are too long

35
24/part1.pl Normal file
View File

@@ -0,0 +1,35 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Hails),
maplist(xyline, Hails, Lines),
findall(
[N1, N2, X, Y], (
member(N1-L1-X1assert, Lines), member(N2-L2-X2assert, Lines), N1 < N2,
intersect(L1, L2, X-Y), call(X1assert, X), call(X2assert, X),
X >= 200000000000000, X =< 400000000000000,
Y >= 200000000000000, Y =< 400000000000000),
Intersects),
length(Intersects, Answer),
write(Answer), nl.
intersect(A1-B1-C1, A2-B2-C2, X-Y) :-
Det is A1*B2 - A2*B1, Det =\= 0,
X is (B2*C1 - B1*C2) / Det,
Y is (-A2*C1 + A1*C2) / Det.
xyline(N-(X-Y-_-Dx-Dy-_), N-(A-B-C)-Xassert) :-
A = Dy, B is -Dx, C is X*Dy - Y*Dx,
( Dx >= 0 -> Xassert = =<(X); Xassert = >=(X) ).
% input parsing stuff below. Brick indexing is for debugging.
% assumption: no same hail. There are parallels, but no same
input(FileName, Hails) :- phrase_from_file(hails(0, Hails), FileName).
hails(_, []) --> eos, !.
hails(N, [N-(X-Y-Z-Dx-Dy-Dz)|Hails]) -->
blanks, number(X), ",", blanks, number(Y), ",", blanks, number(Z), " @",
blanks, number(Dx), ",", blanks, number(Dy), ",", blanks, number(Dz), "\n",
{NextN is N + 1}, hails(NextN, Hails).

35
24/part2.pl Normal file
View File

@@ -0,0 +1,35 @@
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Hails),
maplist(xyline, Hails, Lines),
findall(
[N1, N2, X, Y], (
member(N1-L1-X1assert, Lines), member(N2-L2-X2assert, Lines), N1 < N2,
intersect(L1, L2, X-Y), call(X1assert, X), call(X2assert, X),
X >= 200000000000000, X =< 400000000000000,
Y >= 200000000000000, Y =< 400000000000000),
Intersects),
length(Intersects, Answer),
write(Answer), nl.
intersect(A1-B1-C1, A2-B2-C2, X-Y) :-
Det is A1*B2 - A2*B1, Det =\= 0,
X is (B2*C1 - B1*C2) / Det,
Y is (-A2*C1 + A1*C2) / Det.
xyline(N-(X-Y-_-Dx-Dy-_), N-(A-B-C)-Xassert) :-
A = Dy, B is -Dx, C is X*Dy - Y*Dx,
( Dx >= 0 -> Xassert = =<(X); Xassert = >=(X) ).
% input parsing stuff below. Brick indexing is for debugging.
% assumption: no same hail. There are parallels, but no same
input(FileName, Hails) :- phrase_from_file(hails(0, Hails), FileName).
hails(_, []) --> eos, !.
hails(N, [N-(X-Y-Z-Dx-Dy-Dz)|Hails]) -->
blanks, number(X), ",", blanks, number(Y), ",", blanks, number(Z), " @",
blanks, number(Dx), ",", blanks, number(Dy), ",", blanks, number(Dz), "\n",
{NextN is N + 1}, hails(NextN, Hails).

27
24/test.txt Normal file
View File

@@ -0,0 +1,27 @@
19, 13, 30 @ -2, 1, -2
18, 19, 22 @ -1, -1, -2
20, 25, 34 @ -2, -2, -4
12, 31, 28 @ -1, -2, -1
20, 19, 15 @ 1, -5, -3
Using first 3 rays
x + a*t1 = 19 - 2t1, y + b*t1 = 13 + t1, z + c*t1 = 30 - 2t1,
x + a*t2 = 18 - t2, y + b*t2 = 19 - t2, z + c*t2 = 22 - 2t2,
x + a*t3 = 20 - 2t3, y + b*t3 = 25 - 2t3, z + c*t3 = 34 - 4t3
9 eqs, 9 unks, thus solution in 3 points.
--> a = -3, b = 1, c = 2, t1 = 5, t2 = 3, t3 = 4, x = 24, y = 13, z = 10
x+a*t1 == 320870677764563-40*t1, y+b*t1 == 335750934489987-24*t1, z+c*t1 == 282502845957937+10*t1,
x+a*t2 == 219235623600942+127*t2, y+b*t2 == 408022798608755-45*t2, z+c*t2 == 245679379684914+66*t2,
x+a*t3 == 171834827764229-122*t3, y+b*t3 == 225154401936948-521*t3, z+c*t3 == 232302441670972+95*t3
sage: x, y, z, a, b, c, t1, t2, t3 = var('x, y, z, a, b, c, t1, t2, t3')
sage: solve([
....: x+a*t1 == 320870677764563-40*t1, y+b*t1 == 335750934489987-24*t1, z+c*t1 == 282502845957937+10*t1,
....: x+a*t2 == 219235623600942+127*t2, y+b*t2 == 408022798608755-45*t2, z+c*t2 == 245679379684914+66*t2,
....: x+a*t3 == 171834827764229-122*t3, y+b*t3 == 225154401936948-521*t3, z+c*t3 == 232302441670972+95*t3],
....: x,y,z,a,b,c,t1,t2,t3)
[[x == 149412455352770, y == 174964385672289, z == 233413147425100, a == 201, b == 202, c == 79, t1 == 711444906273, t2 == 943556327678, t3 == 69419109633]]
sage: 149412455352770+174964385672289+233413147425100
557789988450159

1205
25/input.txt Normal file

File diff suppressed because it is too large Load Diff

91
25/part1.pl Normal file
View File

@@ -0,0 +1,91 @@
% This needs more stack. Try --stack_limit=4G
:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- initialization(main, main).
main([FileName|_]) :-
input(FileName, Conns),
dict_pairs(Conns, _, ConnsList),
length(ConnsList, NNodes),
findnsols(
1, PartitionSize, (
_ = Conns.StartNode,
iterate(StartNode, EndNode, Conns, _),
atom_length(EndNode, NodeSize3),
PartitionSize is NodeSize3 / 3),
[Side1]),
Side2 is NNodes - Side1,
Answer is Side1*Side2,
write(Answer), nl.
iterate(Node, Node, Graph, Graph) :- length(Graph.Node, 3), !.
iterate(Node0, Node, Graph0, Graph) :-
countall(Graph0.Node0, NeighborCounts),
NeighborCounts = [_-Max|_],
member(Neighbor-Max, NeighborCounts),
combine(Node0, Neighbor, Node1, Graph0, Graph1),
iterate(Node1, Node, Graph1, Graph).
% combine 2 nodes into one, keep all outbound connections
combine(Node1, Node2, Node12, Graph0, Graph) :-
% delete N1 -> N2's and N2 -> N1's
del_dict(Node1, Graph0, OldN1Outs, Graph1),
del_dict(Node2, Graph1, OldN2Outs, Graph2),
remove_all(Node2, OldN1Outs, N1Outs),
remove_all(Node1, OldN2Outs, N2Outs),
% replace N1 -> X and N2 -> Y with N12 -> [X|Y]
atom_concat(Node1, Node2, Node12),
append(N1Outs, N2Outs, N12Outs),
Graph3 = Graph2.put(Node12, N12Outs),
% replace X -> N1 or X -> N2 with X -> N12 (twice if needed)
foldl(replace_outbound_node(Node1, Node12), N1Outs, Graph3, Graph4),
foldl(replace_outbound_node(Node2, Node12), N2Outs, Graph4, Graph).
replace_outbound_node(Node1, Node2, Node, Graph0, Graph) :-
replace_all(Node1, Graph0.Node, Node2, NewList),
Graph = Graph0.put(Node, NewList).
% List has all items in List but with all ItemOut instances replaced with ItemIn
replace_all(_, [], _, []).
replace_all(ItemOut, [ItemOut|List0], ItemIn, [ItemIn|List]) :-
replace_all(ItemOut, List0, ItemIn, List).
replace_all(ItemOut, [X|List0], ItemIn, [X|List]) :-
\+ X = ItemOut,
replace_all(ItemOut, List0, ItemIn, List).
remove_all(_, [], []).
remove_all(X, [X|List], ListOut) :- remove_all(X, List, ListOut).
remove_all(X, [Y|List], [Y|ListOut]) :- \+ X = Y, remove_all(X, List, ListOut).
% countall means Counts is pairs of Item-Count where Item in List, sorted >
countall(List, Counts) :-
foldl(increment, List, count{}, CountsMap),
dict_pairs(CountsMap, _, CountsList),
sort(2, @>=, CountsList, Counts).
increment(X, Ns0, Ns) :- Next is Ns0.get(X, 0) + 1, Ns = Ns0.put(X, Next).
% input parsing stuff below.
input(FileName, Conns) :-
phrase_from_file(conns(ConnsList), FileName),
to_bidi_graph(ConnsList, Conns).
conns([]) --> eos, !.
conns([From-Tos|Conns]) --> node(From), ": ", tos(Tos), conns(Conns).
tos([To]) --> node(To), "\n".
tos([To|Tos]) --> node(To), " ", tos(Tos).
node(Node) --> string_without(": \n", NodeStr), {atom_codes(Node, NodeStr)}.
to_bidi_graph(ConnsList, BidiConnsGraph) :-
dict_pairs(Graph0, conn, ConnsList),
foldl(add_reverse_conns_for, ConnsList, Graph0, BidiConnsGraph).
add_reverse_conns_for(Node-Outbounds, Conns0, Conns1) :-
foldl(add_conn(Node), Outbounds, Conns0, Conns1).
add_conn(ToNode, FromNode, Conns0, Conns1) :-
Current = Conns0.get(FromNode, []),
Conns1 = Conns0.put(FromNode, [ToNode|Current]).
% debug
print(Graph) :- dict_pairs(Graph, _, Lines), maplist(format('~w~n'), Lines).

13
25/test.txt Normal file
View File

@@ -0,0 +1,13 @@
jqt: rhn xhk nvd
rsh: frs pzl lsr
xhk: hfx
cmg: qnr nvd lhk bvb
rhn: xhk bvb hfx
bvb: xhk hfx
pzl: lsr hfx nvd
qnr: nvd
ntq: jqt hfx bvb xhk
nvd: lhk
lsr: lhk
rzs: qnr cmg lsr rsh
frs: qnr lhk lsr