是否有人能够在node.js
中成功提交针对Google代码堵塞2018的解决方案?我对读取和输出数据的“样板”很感兴趣。
事情是我试过的,它说“运行时错误”没有任何进一步的细节所以我不得不用另一种语言写作?
此解决方案适用于我本地。
此外,我将我的解决方案转换为另一种语言,它只是起作用,所以我很确定问题出在样板中,而不是在解决方案中。
const fs = require('fs');
function solve(shield, program) { ... }
var content = fs.readFileSync(0, 'utf8');
var lines = content.split(/\r?\n/);
var cases = +lines[0];
var out = [];
for (var i = 1; i <= cases; i++) {
var [shield, program] = lines[i].split(' ');
var result = solve(+shield, program);
out.push(`Case #${i}: ${result === -1 ? 'IMPOSSIBLE' : result}`);
}
fs.writeFileSync(1, out.join('\n'));
答案 0 :(得分:5)
您的代码存在的问题是您正在从文件读取并写入文件。这就是为什么它在当地适合你的原因。
Google Code Jam比赛格式在2018年发生了变化。您不再读取和写入文件,而是应从标准输入读取并写入标准输出。请参阅relevant FAQ section here。谷歌还发布了一个示例nodejs javascript解决方案,用于他们新的交互式数字猜测问题here。
您也可以在GitHub上参考my solutions。我完成了资格赛。我还为我的解决方案创建了测试(基于jest)。它还不是一个理想的样板,但希望它可以帮助你开始。
答案 1 :(得分:1)
当我想使用TypeScript参加Google Code Jam 2019时,对stdin的阅读对我来说也是一个巨大的挑战。为了将来变得更容易,我开发了a library并支持异步等待。使用它,您可以编写如下所示的“阻止”代码:
// Read 2 numbers from stdin and display the sum of them.
import { StdinLineStream } from "stdin-line";
(async function() {
let inputStream = new StdinLineStream();
let [a, b] = await inputStream.getLineAsNumbers();
console.log(a + b);
inputStream.close();
})();
您只需要使用rollup之类的工具即可创建仅一个文件,您可以提交给在线法官。
答案 2 :(得分:1)
为了给出全面而实际的答案,我相信需要一个详尽的例子: 考虑从Kick开始的2018年H Mural回合开始的任务。 下面是我的解决方案,它演示了如何处理JavaScript(NodeJS)中特定问题的输入/输出
const fs= require('fs');
const input= fs.readFileSync(0,'utf8').trim().split('\n').slice(1)
.filter((_,i)=>i%2);
console.log(input.map((e,i)=>`Case #${i+1}: ${solve(e)}`).join('\n'));
function solve(str) {
const len= str.length,
waste= Math.floor(len/2);
let score = 0;
for (let i= waste; i<len; i++) score+= +str[i];
let maxScore= score;
for (let i= 1; i<=waste; i++) {
score+= +str[waste-i] - str[len-i];
if (score > maxScore) maxScore= score;
}
return maxScore;
}
注意:fs.readFileSync(0,'utf8')
表示来自 stdin 的输入字符串
和console.log()
是一种将内容放入 stdout 的方法(我们可以使用process.stdout.write()
替代,但是我发现使用了 console 对象更优雅,更吸引人。)
答案 3 :(得分:1)
2020年11月
竞争网址:https://codingcompetitions.withgoogle.com/kickstart/
今天我用了这个,下面加2个数字:
process.stdin.resume();
process.stdin.setEncoding('utf-8');
var stdin_input = '';
process.stdin.on('data', function (input) {
stdin_input += input; // Reading input from STDIN
});
process.stdin.on('end', function () {
main(stdin_input);
});
function main(input) {
let inp = input.split('\n'); // NOTE: Non-Windows OS
// console.log(inp);
let T = inp[0];
let t = 0;
// console.log('No. of tests ', T);
let i = 0;
while (t++ < T) {
readInput(
t,
inp[++i]
// inp[++i], // <------------ NOTE: Enable more lines based on more lines of input
// inp[++i]
);
}
}
let readInput = (t, S1) => {
let [L, R] = S1.split(' ').map((x) => x);
return run(t, L, R);
};
let run = (t, L, R) => {
// console.log('t', t, ' L', L, 'R', R);
L = +L;
R = +R;
let output = 'Case #' + t + ': ' + (L + R);
console.log(output);
return output;
};
export { readInput, run };
输入:
3
1 2
3 4
输出:
Case #1: 3
Case #2: 7
答案 4 :(得分:1)
2021 年 3 月,我正在使用这个简单的结构开始。
function getArgs() {
const [N, K, P] = stdin.nextNums();
const S = Array(N).fill().map(() => stdin.nextNums());
return [S, P]; // Array of inputs [stacks, plates]
}
function solve(stacks, plates) {
stdout.log(stacks, plates);
}
input = `
Put your test input here
`;
((c,f,g,t)=>(r=>(g.stdin={nextWord:()=>r[c++],nextNum:()=>+r[c++
],nextWords:()=>r[c++].split` `,nextNums:()=>r[c++].split` `.map
(e=>+e)},g.stdout={log(...d){t.log(d.map(e=>typeof e==='object'?
JSON.stringify(e):e).join` `)}},[...Array(stdin.nextNum())].map(
(_,i)=>t.log(`Case #${1+i}: ${solve(...getArgs())}`))))((g.input
||f.readFileSync(0,'utf-8')).trim().split`\n`))(0,require('fs'),
globalThis,console);
input
,将 input
设置为空字符串以从比赛站点的 stdin 中读取。stdin
提供了 4 个函数 nextWord(s)
, nextNum(s)
来处理下一行,无论是字符串、数字还是两者的数组。stdout
提供函数 log
,以防您想打印终端中的对象。getArgs
中读取标准输入的方法。 注意该函数仅处理一个测试用例的参数。solve
中设计您的解决方案。