challenge ファイル内の重複行削除(後優先)

アレイのuniq」の応用編です。

入力されたテキストデータから重複する行をとりのぞいて、その結果を標準出力へ出力するプログラムを作成してください。

重複行の排除については、以下の仕様を満たしてください。

  1. 読み込み順序は変更しないこと
  2. 重複する行があった場合、以前のデータを削除すること (後に読み込んだ方が強い)
  3. ファイル全体を一度にメモリに読み込んで処理しないこと
  4. 比較は行全体で行うこと

#4.はおまけですがある/なしで作りが変わってくると思われるので追加しました。


この問題はraynstardさんにご投稿いただきました。ご協力ありがとうございます。 ところで、素朴な実装のしかたをするとメモリ容量の数倍のサイズのすべての行が異なっているファイルを読ませたときに大変なことが起こりそうな気がしますが、そういうシビアなお題設定ではないので素朴に解いてしまって構いません。シビアなのは続編にしたいと思います。

Posted feedbacks - Ruby

仕様をそのまま書いた感じです
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
a = []

while line = ARGF.gets
  a.delete(line)
  a << line
end

a.each{|line|
  print line
}

上のは見た目は良いのですが
実際走らせるとa.deleteの部分がやばいことになるので
効率を若干考慮したバージョン。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
h = {}

while line = ARGF.gets
  h[line] = ARGF.lineno
end

h.sort_by{|line, lineno|
  lineno
}.each{|line, lineno|
  print line
}

sortは不要かと。
1
2
3
4
5
6
h = {}

while line = ARGF.gets
  print line if not h[line]
  h[line] = 0
end

Index

Feed

Other

Link

Pathtraq

loading...