• 还在篮子里

    Kick Start快速入门 · 语雀

    Kick Start快速入门

    Background

    Code Jam Kickstart 为同学们提供向 Google 展现自己专业能力以及走近 Google 的机会。在家就可以参加由 Google 的工程师们设计的算法题。通过参加线上测试,同学们可以直观地了解 Google 技术性岗位对编程能力的要求,也是参与 Google 校园招聘的入场券。

    Requirement

    • G家邮箱一枚
    • 科学上网工具
    • 地址传送门(如果从codejam进入的话,选择分类中的kickstart)

    Quickstart-Overview

    G家鼓励灵活的解决方案,所以施行的输入输出方案和其他的ACM在线测评不一样。

    不是让你不断提交代码然后系统给你测试,而是给你数据集让你自己测试后在本地生成输出文件进行上传。

    image.png

    1. 下载题目数据集 .in 文件(小数据集4分钟变一次,大数据集8分钟变一次)
    2. 解题并生成输出 .out 文件
    3. 提交输出文件 和 代码源文件(练习测试不用提交)

    PS. 每一道题都有小数据集和大数据集两个.in文件可供下载,大数据集的数据范围一般都比小数据集的范围更广,有更多的困难情况。

    QuickStart

    必要点

    如果你想参加比赛,请在比赛期间访问你的比赛主页。如果您想练习,请访问“过去的问题”页面并选择一个回合。然后选择一个问题。

    读问题,前面几段话将精确描述您的程序需要解决的问题。仔细注意极限部分。这些限制将帮助您确定处理大小数据集所需的解决方案类型。(通常会说明一些无解的数据不用考虑)

    编写一个程序,在不到3分钟的时间内用所描述的小限制解决问题。确保您的程序接受输入并以给定的格式输出;如果您使用示例输入作为输入运行它,它应该准确地生成示例输出(包括“Case #”文本)。如果您不确定如何处理输入和输出,请参阅下面的标准I/O教程,了解可行的做法。

    在页面顶部,单击以 solve A-small  并下载输入文件。在真正的比赛中,我们一收到下载请求就会启动一个4分钟的计时器。如果你在练习,就不会有计时器。

    在该输入文件上运行程序,并将结果保存到文件中。将该文件作为输出文件提交。(在真正的比赛中,你还需要提交你的源代码。)服务器的响应方式有以下几种:

      • 正确示例:您提交的每个案例都完全正确!
      • 拒绝:您的提交被拒绝的原因与您的答案的正确性或不正确性无关。例如,您可能上传了一个输入文件或源代码,而不是您自己的输出文件。时钟仍然在运行,所以需要考虑您能否在超时之前修复这个问题(在这种情况下,您的提交将被视为不正确)。
      • 不正确:我们不会告诉您哪些情况是错误的,因此您必须自行调试。对于一个小的数据集,您可以修复您的程序,并尽可能多次尝试该数据集。注意,在真正的比赛中,您将为每次尝试下载一个新的输入文件。如果您最终获得正确的数据集,那么您将为每一次错误尝试获得较小的时间惩罚(但是解决问题总比不解决好,即使有惩罚!)

    在您解决小数据集之后,大数据集将变得可用。一旦您的程序准备好处理更高的限制,下载大型数据集。(参赛者通常只编写一个解决方案来解决两个数据集。)我们一收到下载请求就会启动一个8分钟的计时器。

    与小数据集一样运行程序并提交,直到比赛结束你才知道你是否正确地解决了问题。如果您的提交被拒绝或您想提交另一个答案,您可以在8分钟的时间限制内再次尝试,但只有最后一次提交将被判定。

    接着看另一个问题(左边有一个列表)。您正确解出的每个数据集都值下载链接旁边所写的点数。比赛结束时得分最多的选手排名最高。在一个小数据集上,每一次错误的提交最终被正确的回答,将会有4分钟的惩罚时间。为了引人注目,记分牌将显示“乐观”的初步结果,也就是说,它将假设每个大型提交都是正确的。比赛结束后,记分牌将显示真实的结果,包括哪些大的提交是错误的。

    教程

    我们现在只有一个教程,但我们将来可能会添加更多教程。虽然阅读理论很好,但我们强烈建议您练习解决实际问题以使其变得更好。您可以访问我们的 过去问题部分来完成此操作。For Fun!

    “标准”解决方案:使用标准输入和输出

    Kickstart鼓励灵活解决问题:我们会为您提供输入文件,并让您以自己喜欢的方式解决问题。您可以选择语言,开发环境,体系结构,库等。

    我们的许多参赛者使用其他编程竞赛中常见的模型,如ACM-ICPC和Codeforces:一个单文件程序,它读取输入并准确生成所需的输出。本教程演示如何使用标准输入和标准输出将此模型应用于Kickstart!当然,仍然欢迎您以完全不同的方式阅读输入和/或写入输出; 这只是一个选择。

    什么是标准输入和标准输出?

    标准输入(stdin)和标准输出(stdout)是程序用于与外界交互的数据流。当您以最简单的方式从控制台运行程序时,stdin就是从键盘读入程序的内容,而stdout就是打印在屏幕上的内容。但是,这两个流可以被定向读取和写入文件!

    假设您有一个名为“my_program”的程序,通常通过以下命令运行:

    MY_PROGRAM

    请注意,如果使用像C语言++编译为机器码,MY_PROGRAM可能是这样的

    ./my_binary

    对于像Java使用虚拟机,

    java my_java_binary_name

    或者像Python这样的解释型语言

    python my_python_code.py

    在Linux,Mac OS / X和Windows中,您可以使用<和>将stdin和stdout分别重定向到文件。

    命令行如下

    MY_PROGRAM < input_file.txt > output_file.txt

    将使您的程序接收input_file.txt其stdin中的内容,并将输出写入其stdout output_file.txt

    如何在Kickstart中使用stdin和stdout?

    在处理解决方案时,您可能希望从文件中读取(例如,sample.txt您已将问题的样本I / O复制到其中),但想要把输出写入控制台。你可以这样做:

    MY_PROGRAM < sample.txt

    下载输入后,您需要将输出定向到要上载的文件:

    MY_PROGRAM < small_input.txt > small_output.txt

    如果程序的算法适用于Small和Large数据集,则只需重新运行此命令,甚至不需要更改或重新编译程序:

    MY_PROGRAM < large_input.txt > large_output.txt

    如何编写我的代码以从stdin读取并写入stdout?

    考虑以下非常简单的问题。输入一个 T ,T 为接下来的输入行数,每一行包含两个正整数 和 M。所需的输出形式是Case #x: y z,在这里x, yz均为整数; x是的第 x 个情况,y是的MN的总和,并且z是产品NM

    input_file.txt

    3
    1 5
    7 -2
    9001 0

    这里有一些代码来解决这个问题,从stdin读取并以各种语言写入stdout。对于我们的示例,我们使用了Kickstart中一些最常用的语言,但您当然不仅限于使用这些语言!

    C ++(命令行)

    g++ solution.cpp -o solution
    ./solution < input_file.txt > output_file.txt

    C ++(solution.cpp)

    #include <iostream>  // includes cin to read from stdin and cout to write to stdout
    using namespace std;  // since cin and cout are both in namespace std, this saves some text
    int main() {
      int t, n, m;
      cin >> t;  // read t. cin knows that t is an int, so it reads it as such.
      for (int i = 1; i <= t; ++i) {
        cin >> n >> m;  // read n and then m.
        cout << "Case #" << i << ": " << (n + m) << " " << (n * m) << endl;
        // cout knows that n + m and n * m are ints, and prints them accordingly.
        // It also knows "Case #", ": ", and " " are strings and that endl ends the line.
      }
      return 0;
    }

    Java(命令行)

    javac Solution.java
    java Solution < input_file.txt > output_file.txt

    Java(Solution.java)

    import java.util.*;
    import java.io.*;
    public class Solution {
      public static void main(String[] args) {
        Scanner in = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
        int t = in.nextInt();  // Scanner has functions to read ints, longs, strings, chars, etc.
        for (int i = 1; i <= t; ++i) {
          int n = in.nextInt();
          int m = in.nextInt();
          System.out.println("Case #" + i + ": " + (n + m) + " " + (n * m));
        }
      }
    }

    Python 2(命令)

    python2 solution.py < input_file.txt > output_file.txt

    Python 2(solution.py)

    # raw_input() reads a string with a line of input, stripping the '\n' (newline) at the end.
    # This is all you need for most Kickstart problems.
    t = int(raw_input())  # read a line with a single integer
    for i in xrange(1, t + 1):
      n, m = [int(s) for s in raw_input().split(" ")]  # read a list of integers, 2 in this case
      print "Case #{}: {} {}".format(i, n + m, n * m)
      # check out .format's specification for more formatting options

    Python 3(命令)

    python3 solution.py < input_file.txt > output_file.txt

    Python 3(solution.py)

    # input() reads a string with a line of input, stripping the '\n' (newline) at the end.
    # This is all you need for most Kickstart problems.
    t = int(input())  # read a line with a single integer
    for i in range(1, t + 1):
      n, m = [int(s) for s in input().split(" ")]  # read a list of integers, 2 in this case
      print("Case #{}: {} {}".format(i, n + m, n * m))
      # check out .format's specification for more formatting options

    从这些示例中可以看出,大多数语言提供了从stdin读取和写入stdout的简单方法。这通常比直接引用代码中的特定文件更容易 – 从Small数据集切换到Large数据集时,或者从控制台切换输出目标(用于调试)时,无需更改或重新编译代码一个文件(所以你可以提交一样的源文件)。

    您可以随时查看您喜欢的语言的文档,以找到使用stdin和stdout的首选方法。几乎所有语言都有一个。

    来源: Kick Start快速入门 · 语雀