challenge 九九の表示

掛け算の九九を下のように表示してください。

1 * 1 =  1
1 * 2 =  2
1 * 3 =  3
(略)
7 * 8 = 56
7 * 9 = 63
8 * 1 =  8
8 * 2 = 16
8 * 3 = 24
8 * 4 = 32
(略)
9 * 8 = 72
9 * 9 = 81

なお、この問題は掛け算をどうやるかではなく、 どうやって右端がそろうようにレイアウトするかに重点を置いているので、 下のようなへこんだ出力は禁止です。

7 * 9 = 63
8 * 1 = 8
8 * 2 = 16
動的にサイズを変えられるようにしてみました。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
        static void Main(string[] args)
        {
            kuku(9);
            kuku(99);
            kuku(999);
        }

        static void kuku(int n)
        {
            int len = n.ToString().Length;
            int xLen = (n * n).ToString().Length;
            string    format = "{0, " + len + "} * {1, " + len + "} = {2, " + xLen + "}";

            for (int i = 1; i <= n ; ++i)
                for (int j = 1; j <= n ; ++j)
                    Console.WriteLine(format, i, j, i * j);
        }
面白くない答えですが・・・

sayは、printlnだと思ってください。
t_ishida
1
for(var i=1;i<10;i++) for(var j = 1;j<10;j++) say([i,'*',j,'=',''].join(' ') + (i * j > 9 ? '' : ' ') + i * j);

Posted feedbacks - Scheme

Gauche
srfi-42とutil.matchを使った
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(use srfi-42)
(use util.match)

(define (display99 n)
  (let* ((k (string-length (x->string n)))
         (k2 (string-length (x->string (* n n))))
         (fmt (string-append "~" (x->string k) "d * ~" (x->string k) "d = ~" (x->string k2) "d~%")))
    (define (f x)
      (match x
        ((i j ij) (format #t fmt i j ij))))
    (for-each f (list-ec (: x 1 (+ n 1)) (: y 1 (+ n 1)) (list x y (* x y))))
    (values)))

常識のない人間の解答
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(use srfi-42)

(for-each (lambda (line i)
            (cond
             ((memq i '(0 1 2 61 62 63 64 65 66 79 80))
              (print line))
             ((memq i '(3 67))
              (print "(略)"))
             (else
              #f)))
          (list-ec (: a 1 10) (: b 1 10) (format "~a * ~a = ~2@a" a b (* a b)))
          (iota 100))

空気読んでないかも
1
2
(use srfi-42)
(do-ec (: i 1 10) (: j 1 10) (format #t "~d * ~d = ~2d\n" i j (* i j)))

nobsun関数型脳に侵されていますね :-) lazy脳というべきか。
do-ecを使うとループの中で直接副作用を起こすことができます。
Haskellerにとってはcomposableでないのが気持ち悪いでしょうが…

あと、formatは直接幅指定ができます。 ~2d で2桁。
~vd と書くと幅自体を引数で渡すこともできます (displayNN参照)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(use srfi-42)

(define (display99 n)
  (do-ec (: x 1 (+ n 1)) (: y 1 (+ n 1))
         (format #t "~d * ~d = ~2d~%" x y (* x y))))

;; n >= 10 にも対応
(define (displayNN n)
  (let ((w0 (string-length (number->string n)))
        (w1 (string-length (number->string (* n n)))))
    (do-ec (: x 1 (+ n 1)) (: y 1 (+ n 1))
           (format #t "~vd * ~vd = ~vd~%" w0 x w0 y w1 (* x y)))))

1
 (begin (map (lambda (y) (map (lambda (x) (print (format #f "~2d * ~2d = ~2d" y x (* x y)))) (iota 9 1))) (iota 9 1)) #t)

Index

Feed

Other

Link

Pathtraq

loading...