From d03361bebfb7a13c2283dcc9d67f44357feb6466 Mon Sep 17 00:00:00 2001 From: dragdra Date: Tue, 15 Apr 2025 17:44:45 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=B0=ED=94=BD=20JSON=20=EC=B1=84=EC=A0=90?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=ED=91=9C,=20=EC=86=8C=EC=8A=A4=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 250415_DIC_0000A_채점결과.xlsx | Bin 0 -> 19931 bytes 250415_DIC_0000B_채점결과.xlsx | Bin 0 -> 18854 bytes 250415_DIC_0000C_채점결과.xlsx | Bin 0 -> 18854 bytes DIC_0000B.json | 6 +-- DIC_0000C.json | 65 ++++++++++++++++++--------------- gpdpScoring.js | 33 ++++++++--------- psdExport_2.js | 11 ++++-- 7 files changed, 62 insertions(+), 53 deletions(-) create mode 100644 250415_DIC_0000A_채점결과.xlsx create mode 100644 250415_DIC_0000B_채점결과.xlsx create mode 100644 250415_DIC_0000C_채점결과.xlsx diff --git a/250415_DIC_0000A_채점결과.xlsx b/250415_DIC_0000A_채점결과.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cbcecf689318a6bc3e031c3c87e20ff31ed1179a GIT binary patch literal 19931 zcmeHP-HRmGbsxn_2nxaxalixuMMDh1^z>Bse0!$FbkB@-wL7a}XS9-S!sd2Wb$9Jl zSCy-(duFTzWLX3e;e0q!hyo&dFgTDnUPp4W53BznPtIFj^kJf1p_jY_@{r%Tx4!P} z+dVzALxK}Y%y!kO^L5WX=iF2GqxP?T;qfocW&i!)u~+Z?^q1!5=V+n}jz8l5{xcKpArJp3>daV{)eP_Vp`5<(BJn06}fF-z%dbN;Q zN37@6>I)0YHE2-qs5B*>##MW>5?!^;ig9=vLh{+XgKpQgobA9G4jezxh~Vvy`;L=< zDT{hevRNUMa8O+1KPK6xQqwC_zf5Hk7|AIV;kPyZ?^GQcm#IUXoOIN*S}e#P+F051F-cTnSycYJdrWxnIV5Bwx1faOI86g-YZfzV*<_K`_H z@oC)lB4fln_^#{Q!SSJU0)O^coZ!J`Wr6=k9$d?bykr7xiEfwwm(ryK_EDY7jC!41 zsJXkiwz8e`=LlXhj<>V3)7~+2ejI^W7FsHFDf3+1T{T-7&k~Zj9OvC$SXx+=@k{(0 zV>++3TCJtER2RXNBZd@WYlzWcS4ZJH_^i`m*E~MxM7Q7+%E)vlV{A7}^4cMI^+64k3QjYeG z1WCBdEO>F74LXs_NB~=RSm}uXS@9T%WErs)xgj#{vmrx76#PEB|D(_DziWJU|LzB` zy!XK?|NOyszx%-}KNh?s!Yj=0l?fmG@XsH<{j%}NyYD=B<4rw2Qd=SDqknk)!}tF} zkBA5=5I_FQyFY*L?#F-iC;$F;Z)niBBGxIRAG!l4Hf}h_#?4@WwsFJAnme87d=!U$ z=1LT-58fKqJ4s(cym87r9bU_kjdv?T^3WkZGrS||deD!CiK~%(tv`?u_kzG{1(DVO z*GN{$!iPh@rxzX#%Xl{#8|h@XnJ;zi&M-vQ%$!oPeY@{SYVLc?Pf&vRPGZor;K*?_ zt^2y`N_O3Ittg0tZeo1hHCoKon&i;!NRCtxU2zBKms4Gv(bbY|_HG%iz|*yQ+ZoB2 z2nfcD6%o#Ph#fkfWX5OMFku57%R`20r_?dmS<=@jd2kw8WxSm@K~MJ_FEDm&CysSA z&qZi&iT5>ze5LL7J@0fNV@8R4q~m#=1wk2eJ2-0h*&x*69=LwLjC(acf{QX^KR~fD z9;ADL93ga%eqjE@?!M(xC0XQ+vlGGdZckFFa1eSjj5KOJ;{=lb9-Mkz=I|_olrClJ zf$L98+n$TOEhK!Nwl^zV7{qkJb45wklkk24Q}i|)`uh%|V%+;b&(NP|=*s{33_U59 zFF!9AsTf(B3KCIk^U8ZLvGDG?o_9d+|Fqfj!&yN`HNWC$0bEF1W0(j zh;bSt3X&Jxq<_$7G=XCB*T`O+vhKx37+}t3frGWYNhoUnM7(V-(R+x<95GAw0$YF^ z1kPSJayDG69)G9J1T~1ktil>ADO0rVBEn2kYG!FBSB)n{Nm|}yGBJNIhspD%0hn78 zm5qUV2v%Ok)E0?GF~&RxlUUh1aMmqk)$IC`yC`k7Xh@&gj_4u@T(YLg`z~{#vG!5( zgpZuhnz_|rw6m4qZZX+^W;AlfATuoQBsH2mzZ_ehZyaw{)|To^6~kiTW~GZaU0e=A zbXrWcAoF^d6t$8_c7HKpvv|IeC2!vSUx8aDNSg~{EB85Aj-l^{y`0kTlocdgwB<37(F@D|L_ z;xUYmg%ti9IV1WNF(-KNu*QpEa?|Y@k&EFZ=|_&UkF>edw4qT=jTrv7^b)HSqG{Esx|C8_22P0@ zFLagHqJqvHbo4f6{fC}dor*);@i++gBkou%UZtkO@O*PBfH<}<6w#Eat8j=F%!l9TBsODzTCjXNGzI3tEvuLGWc zG3W?S=Ps)(2S5KGkH7Ja$LHqg?@6&79P>qPT1>w9LNMoXK+Dy$?{$d7$YD0$RUoeh z^W75bBP7m?ZECOsYd;FY_|_p7;j~-x>zV*FL=W#~*#~wc3aGUdN9iVEw-M{rIg{#KmABem{EckHkeBi{GFB@cStZ zkA_r@<^~0YqzwU@8}YYA(3^Z|)e5{IGI$@RFUhn@E->0yDo7`*yI8pJP6e3L3C9!w z5uoG^LIVH6tOMnPTmgzA0yH-;3Zc~ZcX3058(otLH!D6ix9}ziyfd&dZk?KVZRBz} z;~G&wZYPLrY^Eu9ga9=+Jf}-;i>j_qzey0{-%gMu!2lPw%X)#&JY3c?iu3|(Ehnw6 zUhGP|Pr9WJ#`sG{puVO{D3o3be&UAsm$?bvkIdFM>88S17<#8ShJ%iS1!UUyllCo_ z3OS|5NKMI=N_RfoAYv>{<%~N+*F%}5X$E-OCxv175TCG)=kS6wmja{MVlX?*A8uBP z>pjPIhl8~oYu_COVo2Mp6xRZ4k@tO(6qF=%|L*%=e*dYtIr{suNJ83uMi}*2R2gg(#Q)0I0VhfExWMB~$kWur&-{1T6%^z*lMiiYXN=ruBzS_QR*3rhs z?T7EY`QY`R%Ghlg+Ya5^3+8QJ@h;r{^sVoGa_`=QKYeQ}C#pfCTrEnFLM@o4q?TDV za{~UnMVO=Jk_>IDP>DHJZ-P0@Co!+fY+Ca3Pv3g;;oC6Fs}KMB4H>aL1EQqDVy?oX zqC!LF+#<|Tb3ul-1+-|j#C$1d4)2rNwd0f7GjL@>LMD+NbT5S!pq4HHt)I%9*BKRXVN(1nwHLC$-1G zl7M=VYj9Z()OuA(w=Ir4p3BC-vVbDj)a6`Lud0a{2)dpc1Iq%6R8yBzO}(lnV<6~U zehe%NC~`<$j{ADG2tzSc0zuaYV_;c8ksRuBazN0k=@=MV2`X5YP^1MaWJ?1UB&g{a z7+MJ`Se8)ag}NN}kf0_8U}z<%U|B*D@^v-jO*Q6$p_QP5WeG*h*X2M(8`Pi&21!u5 zr=5ZeePjtmIM>y1Hr03r21!t&ussHrBs7Y6#--BJ3ab`J9uMd-uq>en=!P25rW(<} z(DlO@Se8&kbVH43Qw?cgXeFp%Swa!g4K<`qHKu`~m7s!U2}Mjd)R?X-PSXMgNl+Z1 zJqDH~6fxaUW4f-!w1S}>c*GDj3#P0`5%~=@^6P5kD;U%Cka=k_Wj%`gfH?u#^R*=w zu*mAmN>tE{0*4oVAmoTcT;iqM?O{8tWA8*!5MctLd`r`2n4vmI2w^LxBQ$(sA^w&! zXHhFtfk|yy^V%2Y=IHN>V#=p{jOpStJsFovo9H?5B1{n~b3KD>d;7eF z`ABh+uBJ|4n=7@*wff?)mYBpovBwWZ&C1I@#e}bGu?W+tmF5$Mv5~cv&uf<^QSnT9 zn$8lwczt_o|0bqqT>oGghFE-e>|6P1#&qL`6@;g}cSD?!a<)7yT_Pv)n_J8qI@kn< zd#vI2_%1mk4m~&7b@_5W9$==V9e4+Qw<~-Ei=ix?+Z2=>&<+Ot6c^{k;uwCzFRj3d z=+q1t(G=$%j<(TFjkmWZHJF3C!(63yXA)h=v;n9!!hz=`E}UfH92R z&B{w1yVF^Mdu z@_o7#xqSLc*NytBE@4BWVaMQfbX+GiL6QDY_RBWwe~N^R_Z8{-)Kzr$ijbnuAb3=QAn zMrh)OlXxMPHky=DL^8m1N3t$}{IZN&zIGRzR23)dxR4PEC=|g1S;a#)!6EkNy8A4m zeJVL(sxjQL(3tB$rDLX!l-9=7t563OA!bf3z{h z3fGBAAzBPB>lU^ypEDU{Wyg5>5&mXdIm>VudHl-_wpDY|lj=2d-mGD1mOlEhZd+JJ z9~2*dC=>7}CCq`Fl)vRrMzt;RFvmWLQM;t=IzB$0KW=a}P}7;U7x%97tst!G`t)@Q zix%(Y&jS4IzutNIH-B|*j{fMg0N-q5Z5)TsZ`Q%h;jpF23}EzN;9iNvJiO739GzG1TZOMsf{ZhrVVok#6MM z^MknRoS^=i=aD}T0v4Ul4;YTm?)bFu4ix$(f}a0qs$Rrj&Zbq7Ns-O@M?dC4zb!t% zFhPKLd70XR=@JI0n!K-aHu@%X2BBgioGim9PYAB32`W@xSpctcC{1)*HbtH zJ;h0tp6F?gC(_UpJ!~3q6sG<2*FPiITmh7C`5crbLbOqMrsX1?dd( z#rR(ScFyG~LIob@e}*1>4_W!sIgg?OXLg3bVn^ZmI(fR;`8LIAlJlB1D<;k-J##VT zont16@LpbKKZ<2F1@1K2aPX{7d1TQV2hV01G8JlkP)8N<7~T*je@hFcMCrfDU)ECj zsGlh+n0yL(;G;UR%0S)NS}^!8gEJ_cQYBTlqZOpz`5jK02U__fSSlBFhO^+3tZ**n z-cpIxnU;e1cfXdakbRm=B~~X43gW-nkfsk*LiMGuApFwPrP@4oZk1ZC0f;4thm6x}2wkl{z`(9*Ncr~s11g%SAW`K5)8mIg0?B>dtC{KDqO*4B~+FMuTc(g^(SwUwm> z9bNzpd@np2fu;`K-OZ_&Aic=HUJJeq@a6d&TtUGaO6#H~dQq5-v$cTTjgnme5Fo|q z(8>^md(43qZ?T}8c#IlgtDIHd$SNltsiL;5)JeP;5%-yx!6OvCPu}_dC-1yvee%wm z@4o!@yD$IUyWjlgyD$Hhq@^KVXJNmJ_|f{NRt?{L$NQe(=Y?`|p4LY7O{C!n#%PLoeW|^(;TJZbboP6N=F}=iTID z7>5JqX&7t(+BKwivVjKp>>2ax;5NCgyxR$aM;+i(!@C-<2ZLmoc{MHH7z7&NUKIJ8 zQBtdb8`M@s!-vDLU*C8#tis)5?6|J&Ef#8ByEBXtH4CHEbiXy=8k_q*3p1o3AtwyLve;T|SPqNV8$HZ) zQ4C^qT1vSf^ZQs7b+SZS?YX`voK#7?Qg2l@7B9v)jONC1l4jd19mqZuukx<)LuyI# z-&$NCW4jswYJ$mhT(p;ABL8b#z((}0<-HzvvTA2nYDjnTF^`1NFyqO=z&)|L{xG@4 z(EZRU$>Vw{7A%BA(*su5NZaC-9$WKBQ(e;%aI&8H@qp#gl2&I5kCWiSR7)PjQ-wXq zR?E8(?&6}5$6u8wRWts7CJGG)SV3sJ)B_F{cN1ojr>r-kBpXDCLh-0A1oq#@iI6T$43*S8W6!$~$sINwKD64rMPF*_f6BuPIfBrK}J zZW>FryZo5@hZF;sCAB=xq;`m&cF%77P(JjPQ3)>G;e-^BImZBOghytW6b&>bTN@+|) zN~$(bPDyLUV130|P}#1bY~pO1{=T5H%Opx~PV>d9RCcamP1mw+tg6wori-GgSIk31 z$B2!t>RwdTy^D_C#;X6&m%CGGj3?m-@qQw#s~fpzdC^bhfGe$z<}d{5hqrjo^4!y6 z{!wZ|x{%x~JOwQ?CON ze=+DtOBW_Ld#zY#2G9ME?4^k*H?IN{6{rwa7l zU~yVv^%#Nka)%n+$k|V#IK6#{O}P~I84iQpAWJPL8it@s9Vn|T`9)_b7MB{9Jc+Rt zxmXVP!dHh;_G|Cm|DE^0eXsf6{cqvRl68ZD{Qltemt`RcHd*8`% zgg4}Dbk@izG;XM(vzC5MI=wBnR-MR?5=-=9K1rrsatX18t%7{9x`&Mm|4dd3JZYG+ zLOLi}gKR;3Vby`+LCFAl5mj{7FbW~n4|nlEgBz7eh3kzFhg*aQ67C#mj9X_mrj4Rq zLAXg6Xtx_BE)LUFJ3>}<)_mS0vqe@npzkb-@wXdgSrnk)daNIX%tx_VVB`gmb$Fg# zz1Y)epY|#pjPaM0Kz&U`Fq9W1J^4WNtJEazhbC*C_VUJ99Q$X_4udYo1~Q%d$@^Bc zigqf(Xrh!%CM37|k_aDFh z+JiSB(kl=CTqr6a3UN9)PO9V-oAjdMeSdu{xY78zIWC(IBnWd5p#yX9RQjFwA ze}BH5*GkIQ49ZIeg9LfpQMH=7mP;}?R;e*~%^*XN#~r0ajm%0(2GL3*vuuzd$gyN> z$`Ykrpr{jCF$f9Rv2xiJkI?NMmO5{eBH;0)l+7be(3!GLt2ZFd??+p?0*VH8(-{ni zDX1%VuuXq>@b()IzWe*8Dx_DmmA18hwv}I?Smm}g5ISkJJPYoMr88WCFum_lsj z9k%WstyyKk((wQ=sq>YC*t&0rqQ# z1wc$9rCfnV`AX0ODKjhpViGCk3oYH$LCSOnKujW~EWc%1zHOR5ASRJgrr$D6-!^R@ z5R*tLLvNXeZkv`42qLA-R*OJwW$7pyYF9YY7zFTGV`wW=N6{c<+PVN9PfFQ(+q8At zGEYlO$1sxj^-iX26(i9%KZt zkO`Uz(H z#q#5Iz6Q&eDI}(-*op#iAw$q& zX$rd$MJM739e@WRTCLc_Efsob3VEBFz@n-*%!UakFjBK2rdq0#8tEPpj!+IPnD*83 zM`#Nb)-dtb8(;6b-R`pEIop!H1@65MWoc3>t4v@5fjBZ`c zyJv&ChgJ?bj@RPIdT(2Hn-Hl7&G;-%>BtH#p{VAYXuo(|qlc0^tW^oNvHYgVO3-4_ zsuX^LxQRnS0!q!dLq)@ia-nL{Vdt^6QqP9det|#!m8Tz>nW0baw8hH8!>#-lRIbcv zuWX^E;A}sEf4TfwamVOz;H59**Zj&w7eqU;ijmvkgCD$txrp`QU%&a`TkqhY5-n@f z(hGUWs)vHOcSlQw;#CnV>E@uJ^=Ixr@gFyF%aA@lhfpc68UBP^Ekx=dSAUHFdZBBJ zr9EP`DB-hl>0RnNTd`a(Ac{L})hlhqT}LD!(=v4aT}SvS4_)p~W(mu+lQ@D!TpdR` z&q_bIo?4i4!OO%Oe}C)$@Sj&;aP;|k7+tB~T$sxb(3RLI#>A1awZ=4bspO@~A zqd(l3;>4>&L^Ul3msJO+5HA>vinL=i{78FqoswicOnh+(+jW{ezjWHP=jb2}DsO!j=CG=^E+$ERmh?+`B1ub=j;J z(nWKJ_Tls!zJK;FcVGJa&(6%yhi>?OWeeL}xJP=2EI0l2hwBPKWBRdOyT9&8K4wW1 zX`#f^RHfu&g;l^8(oAP9KaOGTP;{4<_R)6@D_03gv)(`)ECNH5-eM%L!Ryk+UgaULTm3sygG@x|N`pTm!BBpy!Y(-0?9_NJKtU8ps~YqW`e?zrTn zQ?xI~_v+7JTpc5n;0gNY@F9+aRDT8IVOS8v&S_8`4!T$;Pgc7)aWtvrGG{H4iHo&f zn3yr=n5sosuSl~WMzb{u?xeP1;6-&RMbfF`z?%PZ{N^$K?3 ij3&C7fhzQW>eS|=`!|02X9(yq{Qo+P;`2|@(|-f+hVQ@t literal 0 HcmV?d00001 diff --git a/250415_DIC_0000C_채점결과.xlsx b/250415_DIC_0000C_채점결과.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b92a8fdc5432cde4ed41a409bf71c196ec118735 GIT binary patch literal 18854 zcmeHPU5q5xRUQ+AkdYNE5(yz8l^T(kXr`ySXJ%)HnYQNFYwwOd+8M8%L}MvE*^OJz&I2KwFg`Z#}jASVfNI`;tgAMG1dF2(J!UGaK_$R_%%R3U<3W$|jWnK}a=uyihpd5AZ?C<$1G$E4qk znRCSYyxE$cUuuE_MWfNtXj)IZ>y6}T*KSycXE9nnpLW#ic@E!>oMFJjtfmPee>&hi z15uXrdA8mlm58deDZXsdO`}=QOzSF{$)F^z7!i+6@pmE*?W^P=&CY!EXsHePJV^x$ zSK2)F#U9U?%QB|82=bbOkEUj9oqf&N=RbSz=wE+%W`;h$AdTHr<>jrMtqNMwzE{~a zR_G?|1l|+)(f|YIg$*lY0ZjNgVW8Hb==jcBPJG9Q9fVm*6^@@Akn?a21FpeV-6Na6 z(zA5SPpo6+!*;#UjZO~vDeT#2X@(c;jd}5pEVx-B`PmrU3f`{xm*eFK?oms$ne@A5 zqxSB?%C+s1z5wvEQMjF*ovj_aq$dEF<3Li$OO@ur?y|jE(5wK-;wbH{`NjDK9lk=p zJ;L+K=H}+&O3sTUDu85hVFZ48eraK&rNIjz3BNc3zp%NnwY8+d3m^%XLUKD2IY%O4SqhuEV1V}MD zv@!(Y9&=#DTP)}%9-{`>Drc29vdT$Es;Dh1brLT|#C;}a@CZfklXt%V$vbaZpS<(t zyDz`}?#qAo?l-^r?#q8AX=#YpS=g^4e)PRRc<{zc)`xF>_oG)|tA|HuQw_cUm*0Bt z@BgqK5FVreKlr0JfAsd7AN=v}{`;T5S_8h3ux=In& z`w^0jQ77GtbPu6t^aBgWcK21WgzrsnAEWK6pu9fJvj4wjEg9P zkgi4QzzZjZZQn!OmMwf5w$~dQ7{uzF=eiNB$HDyshUjfJ4EH&_V$}LSjnJP)=*Iu~ z2tCf1uRboTP>d)|35m?LMdlrhO}u-a?;p^d{AMb0?-T=&yNgP~6U!>RoQTB(6v>m( zfCkr3n82};D0{)n1_uL13n;djM)uR3bU(G?2x~U;qPmtgHHzFnle5i5nuo~9k+N(r za%FX!s*CAHNk(wh7jxR8p*9hiwz2lLoG4_wOk*}NHFayYU`+%?t+i5QQn8qqL*=Dt zs4TUK%*H}K1T8ONX^WahGRAz4MXX{DTyzU*wJ2Y47v)k*K?cm_vWv9piZ*T0cZCU! z$VcKy8@ZS^ORYg^=QAP9V!ZuKspNt{p;*yLrZ@Rv)wlf6I$3Y5EVdRKmc!!pMh`Px z6oVL@mQpUr{5}>%oh*@7d#*1ECsh)!)LWH}#fvcxqq%XMq}eu02eJ>vtGuiHkXn-b zw-y)3*sex^nqV>=7wu)3$p0D_uo1m$d9TNvtlHU?8q%G7%p+km%y@Dza8InRKTK{h zbU$=T^0;1#1qDeH|W$p#UkP(1LQ-2~&lh#jyN ztkB{$l#h)R@tyEv`j$Q?X$ZH*L@>MM^{vFiaFPuY&i4_Pg!P?6%+7}%Nz%^=35%+* zo5qsuEi!rh)2)$5Q(n8@C+Tgdck~eip7N!}1D`TyUSR)d*77OOk zi=z^wvdm{d@Mzb~llGKtcg(|qwNm7Qx?)3vM{t7`PD>7uCW74s0$ zF=C^ux)&97@1mo(vFbncPGHaUi4Er;7Y5bISfJi;Vs^?JomJi zf0UY#E+ltIiWFHu6B-#>iP)~2H0X#qJfX_bvP5p3k6dDimJzZ`WU-)DM*#a{dEln0 z9pGh;xpFuxkyOMR-hDD4rYht%k_pT z?{U`~1}i1hzIPnSA#J^($`Wcp^t}oSMiBa!fB27IxrgXOpI?+gsP>%E<>OIF?#jXu z@`=kuBl8rOi|z1`&XZXQ?_rz8Ufpb8BYlZTh&{6tbXZxoiZf~SLUnHWo(v`;*TP>5 z?oQ@p1x(}<)`{m*hPpVn+-}Xc$t5jkn8Kr8kT1lDQzEuxIS)uF-$c!7aqFBCP$osa(F{>QIL70H-I=%Vh*Wg`&d0BR`@{S9 zKl;7bw@RcY+9(^M$R!&B&y|MkS-V6K?>7nZxU*Q+YGf#Zl4NjrOe51O5hNM?{l~Ar z_TUYO^vZ)jd9?)8C@++h7Yxen5J5nV`_WdefTBU&bOr-r z3hK%oY||eey#2<5@BY523h5PXrERUBZRHmzR=I7B1ONd$)-!D78Yt?NM#RU`xOw(cRVSu+wC08_B3+{V`ZrZsEE2LMcPoR)GN6m@MX&zAxV z*s(6yQjUY7PRR@j0(Pw5w3OeVs8cedf`A=sD=p9L}>889ZB2N?lu zq;wiy%n{PB8q<$v6$?bvZ4hJj_8TwFeB<6{Fnh!2vvT%Uy^(PFNn1hX%I0jReuCM) zF>MQqld5wLmKNltn5MZFWnXJ1o->g5F64UDsXKbVVOm=58P;w*hb34UX>=a5thGW` zu|!o_55YU*Z9d_D@#gl%{w++=yzpQc$Jj^X?(OnoQoaZ4MDdyE-5A#$_=b;N2*eWc zaGUu$Plzx zn!;{G(TR9M2jD@7Rx9>!ONAbqLf)n(u&C+{vthysjMQw1sg~-bM!H9YBa{ORrhT>i z5!yn9HB7wq#@D-Ux4Z1P&TNm_e0E`FiO;g-#cQ)|r`>DMJM*m-r~O-^10*dVqgz+= z?%AO3p_N09iWT&S9K*m-QN)U)BVU*L~_<>^OeX6TbUZLzZOa4WwBl`C`F zD_dwOINML)UoL-E+%Y;FcY*U+-O*B^cvZwox;bcQ{h7N@{O3*FGNjMXAymq1hCd-!3z0g=)n6lkUg+9l zX^&VfO89JCdY8J+RxH;Gh~iFL^-5cD*AWTGv<#hp*AafoLzlagS;BJdB#vMaSI3dg zv(gW)rxvDM@G|kn-{1N_{HGNd9DRNsMpx=L7v}Nz#UtuYN$8ESc8s}n3%7GXKK#tVTC-ZYb{+dqxN@=2FajdS%2toDql-fF+DN?mF3)DUCDuQ@ZfegH?dM&#O>N@ge34NL(cgf{CIXRg-X$v-x)7i}z_il<^T{i25 zbkW?QeK`Gw@1Oni-IqT9vokaFp&Pzm*}^s#?vdUh%T0g%;krW5n0{>6?yozNk6F@0 zS}5@}RVn#cVHNO&G}Bqjk7HOn6y4>eee_+!%2h(rtTzw`i@?yNw;0K5@Vay{c`V*> z=*|V{EI&p5H77iO4hSqcn+q6j!tI2#hXxS3-ds=rcp_g!Uyr7@I6e0Nz}J}?o@NuNUex7E=ppowkf@(O!*y@Fjh hqls>2pbGsTJGJ@f{*9mh83K9?|Gy5S`217!^xyv$@7n+X literal 0 HcmV?d00001 diff --git a/DIC_0000B.json b/DIC_0000B.json index d45bb2d..0033c55 100644 --- a/DIC_0000B.json +++ b/DIC_0000B.json @@ -662,7 +662,7 @@ "19": { "type": "color", "ele": "//Layer//Shape[contains(draw_type/@value, 'Outline')]/primary_color/@value", - "value": "40EEAB", + "value": "40eeab", "point": 3, "desc": "색상 코드 비교 시 소문자로 입력할 것(채우기:secondary_color, 외곽선:primary_color)" }, @@ -676,8 +676,8 @@ "angle": "//Layer//Shape[contains(draw_type/@value, 'Shadow')]/shadow_angle/@value" }, "value": { - "width": "5", - "distance": "3", + "width": "7", + "distance": "5", "blur": "1", "angle": "320" }, diff --git a/DIC_0000C.json b/DIC_0000C.json index b0f7ccb..155d77b 100644 --- a/DIC_0000C.json +++ b/DIC_0000C.json @@ -452,14 +452,14 @@ "desc": "자유 변형 문항은 채점 불가" }, "3": { - "type" : "isExist", + "type" : "exists", "ele": "//Layer/Name/@value", "value": "Leaf", "point": 5, "desc": "Leaf 레이어가 있는지 여부 체크" }, "4": { - "type" : "multiValue", + "type" : "effects", "ele": "//Layer[Name[@value='{layer}']]/Effects/Item", "layer" : "Leaf", "option" : "Lift", @@ -476,7 +476,7 @@ "desc": "올가미 도구/이미지 문항은 채점 불가" }, "6": { - "type" : "isExist", + "type" : "exists", "ele": "//Layer/Effects/Item/Name/@value", "value" : "세피아", "point": 6, @@ -491,11 +491,10 @@ }, "8": { "type": "size", - "posX": "//Layer//op_points[Item]/Item[last()]/X/@value - //Layer//op_points[Item]/Item[1]/X/@value", - "posY": "//Layer//op_points[Item]/Item[last()]/Y/@value - //Layer//op_points[Item]/Item[1]/Y/@value", + "ele": "//Layer//op_points", "value": { "width": 650, - "height": 80 + "height": 50 }, "point": 3, "desc": "레이어 쉐이프 X, Y 좌표를 가지고 너비, 높이 계산하여 정답 채점" @@ -545,7 +544,9 @@ "desc": "배경색 문항은 채점 불가" }, "3": { - "ele": "//Layer[contains(Name/@value, 'Layer 2')][MaskOpType/@value='Layering']", + "type": "exists", + "ele": "//Layer/MaskOpType/@value", + "value": "Layering", "point": 6 }, "4": { @@ -554,14 +555,14 @@ "desc": "가로방향 흐릿하게 문항은 채점 불가" }, "5": { - "ele": "//Layer[contains(Name/@value, 'Layer 3')]//shape_type/@value", - "answer": "RECTANGLE", + "type": "exists", + "ele": "//Layer//shape_type/@value", + "value": "ELLIPSE", "point": 3 }, "6": { "type": "size", - "posX": "//Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[last()]/X/@value - //Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[1]/X/@value", - "posY": "//Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[last()]/Y/@value - //Layer[contains(Name/@value, 'Layer 3')]//op_points[Item]/Item[1]/Y/@value", + "ele": "//Layer//op_points", "value": { "width": 450, "height": 85 @@ -571,8 +572,9 @@ }, "7": { "type": "gradient", - "startColor": "//Layer[contains(Name/@value, 'Layer 3')]//gradient_start_color/@value", - "endColor": "//Layer[contains(Name/@value, 'Layer 3')]//gradient_end_color/@value", + "ele": "//Layer/Shapes/Shape", + "startColor": "gradient_start_color/@value", + "endColor": "gradient_end_color/@value", "value": { "startColor": "ffe000", "endColor": "995555" @@ -580,25 +582,26 @@ "point": 6 }, "8": { - "type": "exact", + "type": "exists", "ele": "//Layer//Shape[shape_type/@value='TEXT']/lines/Item/@value", "value": "예쁜 노란 꽃", "point": 5 }, "9": { - "type": "exact", + "type": "exists", "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Name/@value", "value": "맑은 고딕", "point": 3 }, "10": { - "type": "exact", - "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Underline/@value", + "type": "exists", + "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/{style}/@value", + "style": "Underline", "value": "True", "point": 3 }, "11": { - "type": "exact", + "type": "exists", "ele": "//Layer//Shape[shape_type/@value='TEXT']/font/Size/@value", "value": "30", "point": 3 @@ -611,7 +614,7 @@ "desc": "색상 코드 비교 시 소문자로 입력할 것" }, "13": { - "type": "exact", + "type": "exists", "ele": "//Layer//Shape[shape_type/@value='TEXT']/outline_peninfo/Width/@value", "value": "7", "point": 3 @@ -624,19 +627,20 @@ "desc": "색상 코드 비교 시 소문자로 입력할 것" }, "15": { - "ele": "//Layer[MaskOpType/@value='Clipping'][last()]", + "type":"boolean", + "ele": "//Layer[MaskOpType/@value='Clipping']", "point": 6, "desc": "클리핑 마스크 항목은 별도 레이어로 추가되고 해당 속성을 추가해놓은 레이어가 있는지 여부 체크 함" }, "16": { - "ele": "//Layer[contains(Name/@value, 'Layer 3')]//shape_type/@value", + "type": "exists", + "ele": "//Layer/Shapes/Shape/shape_type/@value", "value": "ROUNDED_RECTANGLE", "point": 3 }, "17": { "type": "size", - "posX": "//Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[last()]/X/@value - //Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[1]/X/@value", - "posY": "//Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[last()]/Y/@value - //Layer[contains(Name/@value, 'Layer 5')]//op_points[Item]/Item[1]/Y/@value", + "ele": "//Layer//op_points", "value": { "width": 120, "height": 150 @@ -645,13 +649,14 @@ "desc": "레이어 쉐이프 X, Y 좌표를 가지고 너비, 높이 계산하여 정답 채점" }, "18": { - "ele": "//Layer[contains(Name/@value, 'Layer 5')]//outline_peninfo/Width/@value", + "type": "exists", + "ele": "//Layer//outline_peninfo/Width/@value", "value": "5", "point": 3 }, "19": { "type": "color", - "ele": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Outline')]/primary_color/@value", + "ele": "//Layer//Shape[contains(draw_type/@value, 'Outline')]/primary_color/@value", "value": "901651", "point": 3, "desc": "색상 코드 비교 시 소문자로 입력할 것(채우기:secondary_color, 외곽선:primary_color)" @@ -659,11 +664,11 @@ "20": { "type": "shadow", "ele": { - "shadow": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]", - "width": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_width/@value", - "distance": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_distance/@value", - "blur": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_blur/@value", - "angle": "//Layer//Shape[shape_type/@value='RECTANGLE'][contains(draw_type/@value, 'Shadow')]/shadow_angle/@value" + "shadow": "//Layer//Shape[contains(draw_type/@value, 'Shadow')]", + "width": "//Layer//Shape[contains(draw_type/@value, 'Shadow')]/shadow_width/@value", + "distance": "//Layer//Shape[contains(draw_type/@value, 'Shadow')]/shadow_distance/@value", + "blur": "//Layer//Shape[contains(draw_type/@value, 'Shadow')]/shadow_blur/@value", + "angle": "//Layer//Shape[contains(draw_type/@value, 'Shadow')]/shadow_angle/@value" }, "value": { "width": "3", diff --git a/gpdpScoring.js b/gpdpScoring.js index 7df1d65..4c95ee4 100644 --- a/gpdpScoring.js +++ b/gpdpScoring.js @@ -143,16 +143,16 @@ function getGpdpScore(gpdpData, scoringJson, index) { if (type == "boolean") { const items = xpath.select(ele, gpdpXmlDoc); - // xpath 결과값을 반환하는 요소가 있을 경우 - if (items) { + // xpath 결과값을 반환하는 요소가 없을 경우 + if (!items) { + scoringResult[key] = 0; + console.log("❌ 찾는 요소 없음"); + } + else { totalScore += point; scoringResult[key] = point; console.log("✅ 찾는 요소 존재함"); } - else { - scoringResult[key] = 0; - console.log("❌ 찾는 요소 없음"); - } } // 이펙트 효과의 이름과 속성값을 비교 @@ -163,10 +163,9 @@ function getGpdpScore(gpdpData, scoringJson, index) { // 각 Item 요소별 이름과 속성값을 구하고 정답과 비교 for (const item of items) { const name = xpath.select1('Name/@value', item)?.value; - const value = xpath.select1(`EffectData/${option?.replace(/"/g, '')}/@value`, item)?.value; - const resultArray = [name, value]; + const attr = xpath.select1(`EffectData/${option?.replace(/"/g, '')}/@value`, item)?.value; - if (JSON.stringify(resultArray) === JSON.stringify(rightAnswer)) { + if (name === rightAnswer[0] && attr === rightAnswer[1]) { totalScore += point; scoringResult[key] = point; matched = true; @@ -369,7 +368,7 @@ function getGpdpScore(gpdpData, scoringJson, index) { // 그림자 속성이 있는지 여부 파악해서 그림자 속성 별로 점수 1 점씩 부여 else if (type == "shadow") { - let result = xpath.select(ele["shadow"], gpdpXmlDoc); + const result = xpath.select(ele["shadow"], gpdpXmlDoc); let shadowScore = 0; if (result.length == 0) { scoringResult[key] = 0; @@ -378,10 +377,10 @@ function getGpdpScore(gpdpData, scoringJson, index) { } shadowScore += 1; - let width = xpath.select(ele["width"], gpdpXmlDoc); - let distance = xpath.select(ele["distance"], gpdpXmlDoc); - let blur = xpath.select(ele["blur"], gpdpXmlDoc); - let angle = xpath.select(ele["angle"], gpdpXmlDoc); + const width = xpath.select(ele["width"], gpdpXmlDoc); + const distance = xpath.select(ele["distance"], gpdpXmlDoc); + const blur = xpath.select(ele["blur"], gpdpXmlDoc); + const angle = xpath.select(ele["angle"], gpdpXmlDoc); if (width.length !== 0 && width[0].value == rightAnswer["width"]) { shadowScore += 1; @@ -403,9 +402,9 @@ function getGpdpScore(gpdpData, scoringJson, index) { scoringResult[key] = shadowScore; } else { - let result = xpath.select(ele, gpdpXmlDoc); - let result2 = null; - let isCheck = false; + const result = xpath.select(ele, gpdpXmlDoc); + const result2 = null; + const isCheck = false; if (ele === 'none') { scoringResult[key] = "확인필요"; diff --git a/psdExport_2.js b/psdExport_2.js index 4ff182a..dd5a53a 100644 --- a/psdExport_2.js +++ b/psdExport_2.js @@ -14,8 +14,8 @@ const todayDate = getToday(); const examRound = '0000'; const examTypes = [ 'A', - // 'B', - // 'C', + 'B', + 'C', // 'D' ]; @@ -127,7 +127,12 @@ examTypes.forEach(type => { XLSX.writeFile(workbook, outputExcelFile); outputExcelFiles.push(outputExcelFile); }); -console.log('채점 결과가 ' + outputExcelFiles + ' 파일에 저장되었습니다.'); + +console.log('채점 결과'); +outputExcelFiles.forEach( (outputFile, index) => { + console.log(`[${index+1}] : ${outputFile}`); +}); + // xml 형식의 gmep 파일을 읽어서 점수를 계산 // scoring.json 파일 내에 있는 ele 요소는 xpath 형식으로 접근하여 요소를 탐색하고 나오는 값을 value와 비교하여 점수를 계산