challenge 2^i * 3^j * 5^k なる整数

2^i * 3^j * 5^k の形で表される整数を小さい方から順に 100 個列挙するプログラムを書いてください。 i, j, k は 0 以上の整数です。アルゴリズムのオーダーについても考えてみてください。

例えば最初の 10 個は次のようになります:

 1 = 2^0 * 3^0 * 5^0
 2 = 2^1 * 3^0 * 5^0
 3 = 2^0 * 3^1 * 5^0
 4 = 2^2 * 3^0 * 5^0
 5 = 2^0 * 3^0 * 5^1
 6 = 2^1 * 3^1 * 5^0
 8 = 2^3 * 3^0 * 5^0
 9 = 2^0 * 3^2 * 5^0
10 = 2^1 * 3^0 * 5^1
12 = 2^2 * 3^1 * 5^0

※解答では i, j, k の各値を示す必要はありません。

Posted feedbacks - Emacs Lisp

#7671のExcelの解が面白かったので、GNU Emacsに移植してみました。ネタ実装です。

できるだけプログラミング言語というよりエディターのマクロって感じの書きかたを目指しました。カラムの表現は面倒なのでS式にしちゃいましたが。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(defun hamming (num)
  (interactive (list (read-minibuffer "Number: " "100")))
  (let ((n 1) (c 0))
    (switch-to-buffer "*Hamming*")
    (erase-buffer)
    (insert "(nil 0 0 0)")
    (beginning-of-buffer)
    (while (< c num)
      (unless (eolp)
        (save-excursion
          (let ((s (read (current-buffer))))
            (setq c (1+ c))
            (backward-kill-sexp)
            (prin1 (cons n (cdr s)) (current-buffer))
            (mapc (lambda (i)
                    (hamming::goto-line-force (* n i))
                    (if (eolp)
                        (prin1 (cons nil
                                     (mapcar (lambda (j)
                                               (+ (nth (/ (1+ j) 2) s)
                                                  (if (= i j) 1 0) ))
                                             '(2 3 5) ))
                               (current-buffer) )))
                  '(2 3 5) ))))
      (setq n (1+ n))
      (forward-line) ))
  (setq outline-regexp "([0-9]")
  (outline-mode)
  (hide-body) )

(defun hamming::goto-line-force (n)
  (let ((r (goto-line n)))
    (unless (bolp) (insert ?\n))
    (while (< 0 r)
      (insert ?\n)
      (setq r (1- r) ))))

Index

Feed

Other

Link

Pathtraq

loading...