この課題は、ファイル全体をメモリに読み込まずに、潜在的に巨大なファイルからランダムな行を読み込むことです。
入力
整数n
とテキストファイルの名前。
出力
n
置換せずにランダムに均一に選択されたテキストファイルの行。
これn
は、1からファイル内の行数の範囲にあると想定できます。
n
答えが均一になる範囲からランダムに数値をサンプリングする場合は注意してください。rand()%n
Cでは、たとえば均一ではありません。すべての結果は等しく等しくなければなりません。
ルールと制限
テキストファイルの各行の文字数は同じで、80文字以下です。
次の場合を除き、コードはテキストファイルの内容を読み取ってはなりません。
- 出力する行。
- テキストファイルに1行あたりの文字数を計算する最初の行。
テキストファイルの各文字は、正確に1バイトであると想定できます。
行区切り文字は1バイト長であると想定されます。ソリューションでは、この必要性が指定されている場合にのみ、2バイトの長い行区切り文字を使用できます。最後の行が行区切り文字で終了していると仮定することもできます。
答えは完全なプログラムである必要がありますが、便利な方法で入力を指定できます。
言語とライブラリ
任意の言語またはライブラリを使用できます。
ノート
ファイルの行数の計算に懸念がありました。nimiがコメントで指摘しているように、これはファイルサイズと1行あたりの文字数から推測できます。
動機
チャットでは、これは本当に「YなしでXを行う」の質問かと尋ねられた人もいました。これを解釈して、制限が異常に人工的なものであるかどうかを尋ねます。
巨大なファイルから行をランダムにサンプリングするタスクは珍しくなく、実際に私が時々しなければならないタスクです。これを行う1つの方法はbashです。
shuf -n <num-lines>
ただし、ファイル全体を読み取るため、大きなファイルでは非常に遅くなります。
fseek
不可能です。さらに、n
ファイルの行数よりも大きい場合はどうなりますか?
sum()
です。ファイルをメモリに読み込まないことは、明確で一貫した制限であり、決してway意的ではありません。メモリよりも大きいファイルでテストできますが、言語の違いによって回避することはできません。また、実世界での用途もあります(ただし、ゴルフには必要ありません...)。