如何获得多行stdin Swift HackerRank?

Pet*_*ker 16 swift

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

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

Pet*_*ker 38

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

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

let line1 = readLine()
let line2 = readLine()
let line3 = readLine()
Run Code Online (Sandbox Code Playgroud)

line1现在被赋予问题中提到的第一行输入的值(或通过其中一个测试用例传递给您的代码),line2是第二行,依此类推.

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

var string = ""

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

print(string)
Run Code Online (Sandbox Code Playgroud)

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

希望能帮助别人

:)


Vla*_*Nul 21

绝对不应该这样做:

while let readString = readLine() {
    s += readString
}
Run Code Online (Sandbox Code Playgroud)

这是因为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
}
Run Code Online (Sandbox Code Playgroud)

如果您知道每一行都是整数,则可以使用:

let line = Int(readLine()!)!
Run Code Online (Sandbox Code Playgroud)

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

let line = readLine()!.characters.split(" ").map{ Int(String($0))! }
Run Code Online (Sandbox Code Playgroud)

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

let line = readLine()!.characters.split(" ").map{ String($0) }
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • 显然,它的工作方式类似于堆栈,调用readLine()将从该堆栈中检索一行,并且当堆栈为空(无更多输入)时,readLine()的结果为nil,这会打破while循环。 (2认同)

KIO*_*KIO 7

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

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

  • 修复上面的语句: letnumbers = readLine()!.components(separatedBy: " ").map { Int($0)! } (2认同)

dfr*_*fri 5

使用readLine()AnyGenerator构造Stringstd 输入行的数组

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

返回Character从标准输入读取到当前行末尾或直到达到 EOFnil如果已经达到 EOF 的 s

这非常简洁,因为它是使用初始化器readLine()生成序列的完美候选者,初始化器递归地(as )调用,在equals 的情况下终止。AnyGeneratorinit(body:)next()bodybodynil

AnyGenerator

init(body: () -> Element?)
Run Code Online (Sandbox Code Playgroud)

创建一个GeneratorType实例,其next方法调用body 并返回结果。

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

let allLines = AnyGenerator { readLine() }.map{ $0 }
    // type: Array<String>
Run Code Online (Sandbox Code Playgroud)

之后,我们可以使用该String数组来应用解决给定任务(/HackerRank 任务)所需的任何操作。

// example standard input
4 3
<tag1 value = "HelloWorld">
<tag2 name = "Name1">
</tag2>
</tag1>
tag1.tag2~name
tag1~name
tag1~value

/* resulting allLines array:
   ["4 3", "<tag1 value = \"HelloWorld\">", 
    "<tag2 name = \"Name1\">", 
    "</tag2>", 
    "</tag1>", 
    "tag1.tag2~name", 
    "tag1~name", 
    "tag1~value"] */
Run Code Online (Sandbox Code Playgroud)