谷歌代码堵塞2018 node.js样板

时间:2018-04-09 11:25:13

标签: node.js

是否有人能够在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'));

5 个答案:

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