这个挑战是关于从潜在的巨大文件中读取随机行,而不是将整个文件读取到内存中。
输入值
整数n
和文本文件的名称。
输出量
n
文本文件的多行随机选择而不替换。
您可以假定该n
值在文件行数的范围内(1)。
n
从您得到的答案是一致的范围内随机抽样数字时,请当心。rand()%n
例如,C中的代码不一致。每个结果都必须具有同等的可能性。
规则与限制
文本文件的每一行将具有相同数量的字符,并且最多不超过80个字符。
您的代码不得读取文本文件的任何内容,但以下情况除外:
- 它输出的那些行。
- 第一行计算出文本文件中每行有多少个字符。
我们可以假设文本文件中的每个字符仅占用一个字节。
行分隔符假定为1个字节长。解决方案仅在指定此需求时才可以使用2字节长的行分隔符。您还可以假设最后一行由行分隔符终止。
您的答案应该是完整的程序,但是您可以通过任何方便的方式指定输入。
语言和图书馆
您可以使用任何喜欢的语言或库。
笔记
人们担心要计算文件中的行数。正如nimi在注释中指出的那样,您可以从文件大小和每行字符数推断出这一点。
动机
在聊天中,有人问这是否真的是“没有Y的X”。我解释这是为了问这些限制是否异常人为。
从海量文件中随机采样行的任务并不罕见,实际上我有时必须要做。一种方法是在bash中:
shuf -n <num-lines>
但是,这对于大型文件来说非常慢,因为它会读取整个文件。
fseek
,而在其他语言中则是不可能的。此外,如果n
大于文件中的行数怎么办?
sum()
。不将文件读入内存是一个明确且一致的限制,这绝对不是任意的。可以使用大于内存的文件进行测试,该文件无法通过语言差异解决。它也碰巧具有现实世界的应用(尽管对于高尔夫来说不是必需的...)。