Google Code Jam 2018 Node.样板



有人能够在node.js年成功提交Google Code Jam 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'));

代码的问题在于您正在从文件中读取并写入文件。这就是为什么它在本地为您工作的原因。

Google Code Jam 竞赛的形式在 2018 年发生了变化。您不再读取和写入文件,而应从标准输入读取和写入标准输出。请参阅此处的相关常见问题解答部分。Google还在这里发布了一个示例nodejs javascript解决方案,用于他们新的交互式数字猜测问题。

你也可以在 GitHub 上参考我的解决方案。我用它通过了资格赛。我还为我的解决方案创建了测试(基于开玩笑(。它还不是一个理想的样板,但希望它能帮助你开始。

当我想使用 TypeScript 参加 Google Code Jam 2019 时,从 stdin 阅读对我来说也是一个巨大的挑战。为了将来更容易,我开发了一个具有异步等待支持的库。使用它,您可以编写如下所示的"阻塞"代码:

// 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 这样的工具创建 1 个可以提交给在线评委的文件。

为了给出一个全面而实用的答案,我认为需要一个详尽的例子:考虑Kick start 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() 作为替代方案,但我发现使用控制台对象更优雅、更有吸引力(。

> 十一月 2020

比赛网址: 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

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);
  • 在 Node cmd 中运行时使用input,将input设置为空字符串以从比赛网站上的 stdin 读取。
  • stdin提供了 4 个函数nextWord(s)nextNum(s)用于处理下一行,无论是字符串、数字还是其中之一的数组。
  • stdout提供功能log,以防您想在终端中打印出对象。
  • 设计您在getArgs中读取标准的方法。请注意,该函数仅处理一个测试用例的参数。
  • solve 中设计您的解决方案。

最新更新