Repository navigation
Expand file tree
/
Copy pathcpp-runner.js
More file actions
12 lines (12 loc) · 10.4 KB
/
Copy pathcpp-runner.js
File metadata and controls
12 lines (12 loc) · 10.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
(()=>{function xe(t){let r=String(t).replace(/\r\n/g,`
`).split(`
`).map(n=>n.replace(/\s+$/,""));for(;r.length&&r[r.length-1]==="";)r.pop();return r}function M(t,r=120){let n='"'+String(t).replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\t/g,"\\t")+'"';return n.length<=r?n:n.slice(0,r-4)+'..."'}var O=t=>t.normalize("NFD").replace(/[̀-ͯ]/g,""),N=t=>[...t].filter(r=>/[\p{L}\p{N}]/u.test(r)).join("");function $e(t,r){if(t.toLowerCase()===r.toLowerCase())return"A diferença está nas letras maiúsculas/minúsculas.";if(t.replace(/ /g,"")===r.replace(/ /g,""))return"A diferença está nos espaços.";if(O(t)===O(r))return"A diferença está nos acentos.";if(N(t)&&t.replace(/-/g,"")===r.replace(/-/g,""))return"A diferença está no sinal de menos (-).";if(N(t)&&N(t)===N(r))return"A diferença está na pontuação ou nos símbolos (vírgulas, pontos, dois-pontos, exclamação...).";let n=N(O(t)).toLowerCase(),a=N(O(r)).toLowerCase();return n&&n===a?"Está quase: confira maiúsculas, acentos e pontuação.":null}var we=/-?\d+(?:\.\d+)?/g;function Ae(t,r){let n=O(String(t)),a=n.match(we)||[],s=(n.replace(we," ").match(/\p{L}+/gu)||[]).join("");return{nums:a,letras:r?s:s.toLowerCase()}}function Te(t,r,n){if(Math.abs(t.length-r.length)>n)return n+1;let a=Array.from({length:r.length+1},(s,c)=>c);for(let s=1;s<=t.length;s++){let c=[s],l=s;for(let g=1;g<=r.length;g++)c[g]=Math.min(a[g]+1,c[g-1]+1,a[g-1]+(t[s-1]===r[g-1]?0:1)),c[g]<l&&(l=c[g]);if(l>n)return n+1;a=c}return a[r.length]}function ue(t,r,n={}){if(n.espacos){let l=O(String(t)),g=O(String(r));return n.caixa?l===g:l.toLowerCase()===g.toLowerCase()}let a=Ae(t,n.caixa),s=Ae(r,n.caixa);if(a.nums.length!==s.nums.length||a.nums.some((l,g)=>l!==s.nums[g]))return!1;if(a.letras===s.letras)return!0;let c=Math.min(Math.floor(Math.max(a.letras.length,s.letras.length)/8),3);return Te(a.letras,s.letras,c)<=c}function Me(t,r,n={}){let a=t.filter(c=>c.trim()),s=r.filter(c=>c.trim());return s.length?a.length===s.length&&a.every((c,l)=>ue(c,s[l],n))?!0:!n.espacos&&ue(a.join(" "),s.join(" "),n):!1}function Oe(t,r){let n=t.filter(s=>s.trim()),a=r.filter(s=>s.trim());for(let s=0;s<Math.min(n.length,a.length);s++)if(n[s]!==a[s]){let c=$e(n[s],a[s]);return`Passou! Só um detalhe: o esperado era ${M(n[s])} e saiu ${M(a[s])}.${c?" "+c:""}`}return"Passou! Só um detalhe: as linhas em branco (ou as quebras de linha) ficaram um pouco diferentes do esperado."}function Re(t){let r=/^[A-Za-z_À-ÿ][\wÀ-ÿ]*/.exec(t);if(!r||!/^[a-zà-ÿ]/.test(t))return t;let n=t.slice(r[0].length,r[0].length+1);return r[0].includes("_")||"(.[_:".includes(n)&&n?t:t[0].toUpperCase()+t.slice(1)}var F=t=>t?t+": ":"";function Ee(t,r,n="",{entradas:a=[],leniente:s=null}={}){let c=Array.isArray(r)?r.map(String):xe(r),l=xe(t);if(c.length===l.length&&c.every((f,h)=>f===l[h]))return null;if(s&&Me(c,l,s))return{quase:!0,msg:Oe(c,l)};let g=c.join(`
`),X=l.join(`
`),y=f=>({msg:Re(f),esperado:g,recebido:X});if(!l.length)return y(`${F(n)}seu programa não mostrou nada. Faltou um cout?`);if(!c.length){let f=l.length>1?` (e mais ${l.length-1} linha${l.length>2?"s":""})`:"";return y(`${F(n)}nada deveria aparecer na tela, mas apareceu ${M(l[0])}${f}.`)}let v=s?c.filter(f=>f.trim()):c,_=l.map((f,h)=>[f,h]).filter(([f])=>!s||f.trim());for(let f=0;f<Math.min(v.length,_.length);f++){let h=v[f],[x,C]=_[f];if(h===x||s&&ue(h,x,s))continue;let j=`${F(n)}a linha ${C+1} da saída está diferente.
esperado: ${M(h)}
recebido: ${M(x)}`,A=$e(h,x);return!A&&l[C+1]!==void 0&&a.includes(l[C+1].trim())&&h.startsWith(x.replace(/\s+$/,""))&&h.trim().endsWith(l[C+1].trim())&&(A="A resposta digitada deveria ficar na mesma linha da pergunta: não use endl (nem \\n) depois da pergunta."),!A&&a.some(R=>h.includes(R))&&!a.some(R=>x.includes(R))&&h.startsWith(x)&&(A="Na saída comparada, o que foi digitado aparece logo depois da pergunta (como no terminal)."),A&&(j+=`
`+A),y(j)}if(_.length<v.length){let f=v.length-_.length;return y(`${F(n)}faltou ${f===1?"uma linha":f+" linhas"} na saída. A próxima esperada era: ${M(v[_.length])}`)}return y(`${F(n)}sua saída tem linhas a mais. A primeira que sobrou foi: ${M(_[v.length][0])}`)}var De=["saida","contem","nao_contem","ultima_linha","codigo"],Pe=["usa","nao_usa","regex","nao_regex","conta","comentario","comentarios","codigo_regex","recursiva"],Le=new Set([...De,...Pe,"cpp","entradas","eof","semente","msg","min","max"]);try{Error.stackTraceLimit=64}catch{}var Y=new TextEncoder,Be=new TextDecoder,S={TIQUE:0,RELATO:1,SEM_MAIN:2,ENTRADAS:3,CAPTURA_INICIO:4,CAPTURA_FIM:5,SAIDA_IGUAL:6,CAPTURA_COPIA:7,INICIO_TESTE:8,INICIO:9,DETALHE:10},G=class extends Error{constructor(r){super("exit "+r),this.codigo=r}},Z=class extends Error{},J=class extends Error{},K=class extends Error{},E={SUCESSO:0,BADF:8,INVAL:28,NOSYS:52,SPIPE:70,NOTCAPABLE:76};function Ne(t){let r=t>>>0^2654435769;return()=>{r=r+1831565813>>>0;let n=r;return n=Math.imul(n^n>>>15,n|1),n^=n+Math.imul(n^n>>>7,n|61),(n^n>>>14)>>>0}}function ve(t){let r=[];for(let n of String(t&&t.stack||"").split(`
`)){let a=/at (?:(.*?) \()?(?:wasm:\/\/wasm\/[^:]*:)?wasm-function\[(\d+)\]:0x([0-9a-f]+)\)?/.exec(n);a||(a=/^(.*?)@.*wasm-function\[(\d+)\]:0x([0-9a-f]+)/.exec(n)),a&&r.push({nome:a[1]&&!/^wasm:/.test(a[1])?a[1]:"",funcao:+a[2],offset:parseInt(a[3],16)})}return r}function Se(t,r={}){let{argv:n=["main"],env:a={},entradas:s=[],eof:c=!1,semente:l=0,limiteSaida:g=6e4,tempoMs:X=5e3,eco:y=!1}=r,v=s.map(String),_=null,f=0,h=0,x="",C=0,j={1:new TextDecoder,2:new TextDecoder},A=[],R=!1,le=!1,q=-1,L=null,k=null,I=null,z=null,T=()=>new Uint8Array(z.buffer),$=()=>new DataView(z.buffer),be=Ne(l|0),fe=BigInt(17e8+Math.abs(l|0)%1e5*3600)*1000000000n,W=0n,ee=n.map(e=>Y.encode(e+"\0")),te=Object.entries(a).map(([e,o])=>Y.encode(`${e}=${o}\0`)),H=0,ne=1/0,re=0,D=2e4,me=0,se=null,oe=!1,ae=WebAssembly.Module.imports(t).some(e=>e.module==="wasi_unstable"),Ue=(e,o)=>T().slice(e,e+o),ie=(e,o)=>Be.decode(Ue(e,o)),de=e=>{x+=e},V=()=>BigInt(Math.round((performance.now()-H)*1e6));function ge(){if(!(oe||!I||!I.exports.__cobra_flush)){oe=!0;try{I.exports.__cobra_flush()}finally{oe=!1}}}let ye={args_sizes_get(e,o){let u=$();return u.setUint32(e,ee.length,!0),u.setUint32(o,ee.reduce((i,m)=>i+m.length,0),!0),0},args_get(e,o){let u=$();for(let i of ee)u.setUint32(e,o,!0),e+=4,T().set(i,o),o+=i.length;return 0},environ_sizes_get(e,o){let u=$();return u.setUint32(e,te.length,!0),u.setUint32(o,te.reduce((i,m)=>i+m.length,0),!0),0},environ_get(e,o){let u=$();for(let i of te)u.setUint32(e,o,!0),e+=4,T().set(i,o),o+=i.length;return 0},proc_exit(e){throw new G(e)},proc_raise(){return E.NOSYS},sched_yield(){return 0},random_get(e,o){let u=T();for(let i=0;i<o;i++)u[e+i]=be()&255;return 0},clock_res_get(e,o){return $().setBigUint64(o,1000n,!0),0},clock_time_get(e,o,u){let i=e===0?fe+V()+W:e===1?V()+W:V();return $().setBigUint64(u,i,!0),0},poll_oneoff(e,o,u,i){let m=$(),w=0n,d=ae?56:48,B=ae?32:24,b=ae?48:40;for(let U=0;U<u;U++){let Q=e+U*d,pe=m.getUint8(Q+8),ce=o+U*32;if(m.setBigUint64(ce,m.getBigUint64(Q,!0),!0),m.setUint16(ce+8,0,!0),m.setUint8(ce+10,pe),pe===0){let he=m.getBigUint64(Q+B,!0),_e=m.getUint16(Q+b,!0)&1?he-(fe+V()+W):he;_e>w&&(w=_e)}}return W+=w,m.setUint32(i,u,!0),0},fd_write(e,o,u,i){if(e!==1&&e!==2)return E.BADF;let m=$(),w=0;for(let d=0;d<u;d++){let B=m.getUint32(o+8*d,!0),b=m.getUint32(o+8*d+4,!0);if(b){if(C+b>g)throw new J;C+=b,de(j[e].decode(T().subarray(B,B+b),{stream:!0})),w+=b}}return m.setUint32(i,w,!0),0},fd_read(e,o,u,i){if(e!==0)return E.BADF;if(ge(),!_||f>=_.length){if(!v.length){if(c)return $().setUint32(i,0,!0),0;throw new Z}let d=v.shift();h++,de(y?""+d+`
`:d+`
`),_=Y.encode(d+`
`),f=0}let m=$(),w=0;for(let d=0;d<u&&f<_.length;d++){let B=m.getUint32(o+8*d,!0),b=m.getUint32(o+8*d+4,!0),U=Math.min(b,_.length-f);T().set(_.subarray(f,f+U),B),f+=U,w+=U}return m.setUint32(i,w,!0),0},fd_fdstat_get(e,o){if(e>2)return E.BADF;let u=$();return u.setUint8(o,2),u.setUint16(o+2,0,!0),u.setBigUint64(o+8,0x42n,!0),u.setBigUint64(o+16,0n,!0),0},fd_fdstat_set_flags(){return 0},fd_prestat_get(){return E.BADF},fd_prestat_dir_name(){return E.BADF},fd_close(e){return e<=2?0:E.BADF},fd_seek(){return E.SPIPE},fd_tell(){return E.SPIPE},fd_sync(){return 0},fd_datasync(){return 0},path_open(){return E.NOTCAPABLE}},Ce=()=>E.NOSYS,Ie=(e,o,u)=>{switch(e){case S.TIQUE:{let i=performance.now();if(me++,i>ne)throw new K;let m=i-re;return re=i,m<4&&D<5e7?D*=2:m>25&&D>1e3&&(D=Math.max(1e3,D>>1)),se&&(se.value=D),0}case S.RELATO:{let i=ie(o,u).split("");return i[0]==="ok"?A.push({tipo:"ok"}):A.push({tipo:"falha",msg:i[1]||"",esperado:i[2]||"",recebido:i[3]||"",pista:i[4]==="1",textoA:i[5]||"",textoB:i[6]||""}),0}case S.SEM_MAIN:return R=!0,0;case S.ENTRADAS:return v=u<0?[]:ie(o,u).split(""),_=null,0;case S.CAPTURA_INICIO:return q=x.length,0;case S.CAPTURA_FIM:return L=Y.encode(q>=0?x.slice(q):""),q=-1,L.length;case S.CAPTURA_COPIA:return L&&T().set(L.subarray(0,Math.min(u,L.length)),o),0;case S.SAIDA_IGUAL:{let[i,m,w]=ie(o,u).split(""),d=Ee(i,m,w||"");return d?(A.push({tipo:"falha",msg:d.msg,esperado:d.esperado,recebido:d.recebido}),0):1}case S.INICIO_TESTE:return le=!0,0;case S.DETALHE:return k=[o>>>0,u>>>0],0;default:return 0}},P={};for(let e of WebAssembly.Module.imports(t))e.kind==="function"&&(P[e.module]=P[e.module]||{},e.module==="wasi_unstable"||e.module==="wasi_snapshot_preview1"?P[e.module][e.name]=ye[e.name]||Ce:e.module==="env"&&e.name==="__cobra_canal"?P.env.__cobra_canal=Ie:P[e.module][e.name]=()=>{throw new Error(`função externa não disponível: ${e.name}`)});let p={fim:"ok",saida:"",codigo:0,relatos:A,semMain:!1,inicioTeste:!1,consumidas:0,memoria:0,ms:0};try{I=new WebAssembly.Instance(t,P),z=I.exports.memory,se=I.exports.__cobra_orc||null,H=re=performance.now(),ne=H+X,I.exports._start()}catch(e){if(e instanceof G?p.codigo=e.codigo:e instanceof Z?p.fim="entrada":e instanceof J?p.fim="limite":e instanceof K?(p.fim="tempo",p.pilha=ve(e)):(p.fim="erro",p.erro={nome:e&&(e.name||e.constructor&&e.constructor.name)||"Erro",mensagem:String(e&&e.message||e),pilha:ve(e)},k&&(p.erro.detalhe=k)),p.fim==="tempo"||p.fim==="erro"){ne=performance.now()+200;try{ge()}catch{}}}for(let e of[1,2])try{x+=j[e].decode()}catch{}return p.saida=x,p.semMain=R,p.inicioTeste=le,p.consumidas=h,p.memoria=z?z.buffer.byteLength:0,p.ms=Math.round(performance.now()-H),p.tiques=me,p}self.onmessage=t=>{let{id:r,modulo:n,opcoes:a}=t.data||{},s;try{s=Se(n,a)}catch(c){s={fim:"erro",saida:"",relatos:[],codigo:0,erro:{nome:"Erro",mensagem:String(c&&c.message||c),pilha:[]}}}self.postMessage({id:r,r:s})};})();