如何获得多行stdin Swift HackerRank?

时间:2016-06-27 09:37:26

标签: swift

我刚刚尝试了一个HackerRank挑战,如果一个问题给你x行输入,把x行设为let someVariable = readLine()根本不会削减它,因为有很多测试用例可以为我们编写的代码提供更多输入,因此每行输入的硬编码readLine()都不会飞。

有没有办法让多行输入到一个变量?

6 个答案:

答案 0 :(得分:34)

对于那些第一次尝试HackerRank挑战的人来说,你可能需要知道一些你可能从未遇到过的事情。我最近才知道这个叫做readLine()命令的魔法,它是Swift中的原生函数。

当HackerRank系统执行您的代码时,它会传递您输入的代码行,这是检索该输入的一种方式。

let line1 = readLine()
let line2 = readLine()
let line3 = readLine()

line1现在给出了问题中提到的第一行输入的值(或者通过其中一个测试用例传递给你的代码),line2是第二行,依此类推。

您的代码可能工作得很好,但在其他一些测试用例中可能会失败。这些测试用例不会向您的代码发送相同数量的输入。这是值得深思的东西:

var string = ""

while let thing = readLine() {
string += thing + " "
}

print(string)

现在字符串变量包含要接收的所有输入(在本例中为String)。

希望能帮到某人

:)

答案 1 :(得分:21)

绝对不应该这样做:

while let readString = readLine() {
    s += readString
}

这是因为Swift将永远期望输入字符串(来自readLine)并且永远不会终止,导致应用程序因超时而死亡。

相反,您应该在for循环中思考,假设您知道需要读取多少行,这通常是HackerRank中的这种方式;)

尝试这样的事情:

let n = Int(readLine()!)! // Number of test cases
for _ in 1 ... n { // Loop from 1 to n
    let line = readLine()! // Read a single line
    // do something with input
}

如果你知道每一行是一个整数,你可以使用它:

let line = Int(readLine()!)!

或者,如果您知道每一行是一个整数数组,请使用:

let line = readLine()!.characters.split(" ").map{ Int(String($0))! }

或者如果每一行都是一个字符串数组:

let line = readLine()!.characters.split(" ").map{ String($0) }

我希望这会有所帮助。

答案 2 :(得分:7)

对于新版本,获取以空格分隔的数字数组

let numbers = readLine()!.components(separatedBy: [" "]).map { Int($0)! }

答案 3 :(得分:4)

使用readLine()AnyGenerator构建标准输入行的String数组

readLine()将逐行读取标准输入,直至达到EOF,然后返回nil

  

从标准输入到结尾返回Character的读取   当前行或直到达到EOF,如果已经EOF,则为nil   达到

这非常简洁,因为它使readLine()成为使用AnyGenerator初始值设定项init(body:)生成序列的理想候选者,递归地(如next())调用{{1} },终止以防body等于body

  

<强> nil

AnyGenerator
     

创建init(body: () -> Element?) 方法,其GeneratorType方法调用next   并返回结果。

有了这个,就不需要实际提供我们期望的标准输入行数,因此,我们可以从标准输入中捕获所有输入,例如进入body数组,其中每个元素对应一个输入行:

String

之后我们可以使用let allLines = AnyGenerator { readLine() }.map{ $0 } // type: Array<String> 数组来应用解决给定任务所需的任何操作(/ HackerRank任务)。

String

答案 4 :(得分:3)

我最近发现了获得一定数量线条的巧妙技巧。我会假设第一行给你的线数:

vtkPropPicker

答案 5 :(得分:0)

我通常使用这种形式。

if let line = readLine(), let cnt = Int(line) {
    for _ in 1...cnt {
        if let line = readLine() {
            // your code for a line
        }
    }
}