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

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

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

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

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

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


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

Posted feedbacks - Common Lisp

素朴に最初に思い付いたままな感じで…。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
(defpackage #:doukaku-66 (:use #:cl #:pg))

(in-package #:doukaku-66)

(defun no-dup (file &optional (output t))
  (with-open-file (input file :direction :input)
    (flet ((rl () (read-line input nil 'eof)))
      (do ((line (rl) (rl))
	   result)
	  ((eql 'eof line)
	   (mapc (lambda (l) (format output "~&~A~%" l))
		 (delete nil (nreverse result))))
	(aif (member line result :test #'string=)
	     (setf (car it) nil))
	(push line result)))))

簡潔さ最優先で書きました。
1
2
(loop for s = (read-line nil nil) while s collect s into lines
  finally (mapc #'write-line (delete-duplicates lines :test #'string=)))

Index

Feed

Other

Link

Pathtraq

loading...