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 - Nested

Flatten Hidden
そのまんま
1
2
3
4
5
(1..9).each{|x|
  (1..9).each{|y|
    printf("%d * %d = %2d\n", x,y,x*y)
  }
}
Text.Printf モジュールを使う
1
2
3
4
5
import Text.Printf

main = putStr . unlines . map showKuKu $  [(i,j,i*j) | i <- [1..9], j <- [1..9] ]
showKuKu :: (Int,Int,Int) -> String
showKuKu (i,j,k) = printf "%d * %d = %2d" i j k
指定した数の二乗までのかけ算の表示ができるようにした。
 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
module Main (main) where

import System.Environment
import Text.Printf

main :: IO ()
main = do { args <- getArgs
          ; let n = case args of { [] -> 9; a:_ -> read a }
          ; putStr . unlines . map (showKuku (keta n) (keta (n*n))) 
          $ [ (i,j,i*j) | i <- [1..n], j <- [1..n] ]
	  }

showKuku :: Int -> Int -> (Int,Int,Int) -> String
showKuku l l' (i,j,ij) = printf ("%"++k++"d * %"++k++"d = %"++k'++"d") i j ij
  where k  = show l
        k' = show l'

keta  = length . show 

{-
*Main> :main 19
途中略
 6 * 16 =  96
 6 * 17 = 102
 6 * 18 = 108
 6 * 19 = 114
 7 *  1 =   7
 7 *  2 =  14
 7 *  3 =  21
 7 *  4 =  28
以下略
-}
インドでも使える版
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
function print_kuku($max) {
    $len1 = strlen($max);
    $len2 = strlen(pow($max, 2));
    
    for ($i = 1; $i <= $max; $i++) {
      for ($j = 1; $j <= $max; $j++) {
        printf("%{$len1}s * %{$len1}s = %{$len2}s\n", $i, $j, $i*$j);
      }
    }
}

print_kuku(9); //日本
print_kuku(20); //インド
?>
あえて1行で書いてみました。
1
BEGIN { for (i=1;i<=9;i++) for (j=1;j<=9;j++) printf("%d * %d = %2d\n",i,j,i*j); exit }
おなじく一行python版です。
1
print '\n'.join(['%d * %d = %2d' % (i, j, i*j) for i in range(1, 10) for j in range(1, 10)])
printf にかっこはいらない
BEGIN の最後に exit はいらない
まあそうなんですが
普通に。
1
2
3
for i in xrange(1, 10):
    for j in xrange(1, 10):
        print "%d * %d = %2d" % (i, j, i * j)
マニピュレータを使用。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <iostream>
#include <iomanip>

int main()
{
    for (int i = 1; i <= 9; ++i)
    {
        for (int j = 1; j <= 9; ++j)
        {
            std::cout << i << " * " << j << " = "
                      << std::setw(2) << (i * j) << std::endl;
        }
    }
}
再帰版
1
2
3
4
5
(defun kuku (&optional (x 1) (y 1))
  (cond ((and (= x 9) (> y 9)) nil)
        ((> y 9) (terpri) (kuku (1+ x) 1))
        (t (format t "~D * ~D = ~2D~%" x y (* x y))
           (kuku x (1+ y)))))

ふつう

1
2
3
4
import System.out.printf
for(i <- (1 to 9); j <- (1 to 9)) {
  printf("%d * %d = %2d\n", Array(i,j,i*j).map{_.asInstanceOf[AnyRef]})
}

	
1
2
3
4
my %count;
for my $j (map {($_) x 9} 1..9){
  printf "%d * %d = %2d\n",$j,++$count{$j},$count{$j}*$j;
}
意味があるか不明だけど、更に行数減らせますね。
1
map {printf "%d * %d = %2d\n",$_,++$count{$_},$count{$_}*$_} (my %count, map {($_) x 9} 1..9);
2桁の九九も目的どおり動きます。
書式に*をつかうのがポイント。
ただ、答えに余計な空白が入ることがあります。

19の段がこんな感じに
19 *  1 =   19
19 *  2 =   38
19 *  3 =   57
19 *  4 =   76
19 *  5 =   95
19 *  6 =  114
19 *  7 =  133
19 *  8 =  152
19 *  9 =  171
19 * 10 =  190
19 * 11 =  209
19 * 12 =  228
19 * 13 =  247
19 * 14 =  266
19 * 15 =  285
19 * 16 =  304
19 * 17 =  323
19 * 18 =  342
19 * 19 =  361

 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
#include <stdio.h>

#define START 1
#define END   19

int main()
{
    int col; /* 段 */
    int row; /* 行 */
    int digit;        /* 段・行の桁数 */
    int answer_digit; /* 答えの桁数   */
    int tmp;

    digit = 1;
    for (tmp = END; tmp/10 != 0; digit++) {
        tmp %= 10; 
    }   
    answer_digit = digit * 2;

    for (col = START; col <= END; col++) {
        for (row = START; row <= END; row++) {
            printf("%*d * %*d = %*d\n", digit, col,
                                        digit, row,
                                        answer_digit, col * row);
        }
    }

    return 0;
}
printfは使えないので。
1
2
3
4
5
6
7
8
9
function lpad(str, n) {
  return str.length < n ? (new Array(n - str.length + 1).join(' ') + str) : str;
}
var n = 10;
for(var i=1; i<n; i++) {
  for(var j=1; j<n; j++) {
    pp(i + " * " + j + " = " + lpad('' + (i * j), 2));
  }
}
すみません。上記のpp関数は自分のローカル用デバッグ出力関数です。
rhinoならprintとかに置き換えてください。

で、↓はalertで表示する場合。
100行alertはひどいので10回に分けて。
alertのフォントは普通プロポーショナルなのが悲しいところ。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
function lpad(str, n) {
  return str.length < n ? (new Array(n-str.length+1).join(' ') + str) : str;
}
var n = 10;
var list = [];
for(var i=1; i<n; i++) {
  for(var j=1; j<n; j++) {
    list.push(i + " * " + j + " = " + lpad('' + (i*j), 2));
  }
  alert(list.join("\n"));
  list = [];
}
自分で書けば使えないことはないんじゃないですか。
高度な JavaScript 技集のprintfのことは知ってましたよ。
でも、このお題満たすためにprintfを実装するのはどう考えてもオーバースペックですよね。

ひょっとして「使えない」の解釈が違うのかもしれませんが、このサイトではありもののライブラリを使うのは禁止されてるわけでも忌避されてるわけでもないので、あるんだから使えばいいじゃんと思いますけども。知ってたなら尚更。

もちろんいちからprintfを車輪の再発明するのはいくらなんでもめんどくさいってのは否定しません。


	
1
2
3
4
5
6
7
class Program {
    static void Main(string[] args) {
        for (int x = 1; x <= 9; x++)
            for (int y = 1; y <= 9; y++)
                System.Console.WriteLine("{0} * {1} = {2,2}", x, y, x * y);
    }
}
再帰版ver.2

二桁の場合にも右端が揃うように汎用性を持たせてみました。

例:(kuku 19)
(省略)
19 *  1 =  19
19 *  2 =  38
19 *  3 =  57
19 *  4 =  76
19 *  5 =  95
19 *  6 = 114
19 *  7 = 133
19 *  8 = 152
19 *  9 = 171
19 * 10 = 190
19 * 11 = 209
19 * 12 = 228
19 * 13 = 247
19 * 14 = 266
19 * 15 = 285
19 * 16 = 304
19 * 17 = 323
19 * 18 = 342
19 * 19 = 361
 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
(defun kuku (n)
;nの桁数をlen1,最も大きな積(n*n)の桁数をlen2とする
    (let ((len1 (digits n))
          (len2 (digits (* n n))))
       (sub n len1 len2)))

(defun sub (n len1 len2 &optional (x 1) (y 1))
  (cond ((and (= x n) (> y n)) nil)
        ((> y n) (sub n len1 len2 (+ x 1) 1))
        (t (print-space (- len1 (digits x)))
           (format t "~D * " x)
           (print-space (- len1 (digits y)))
           (format t "~D = " y)
           (print-space (- len2 (digits (* x y))))
           (format t "~D~%" (* x y))
           (sub n len1 len2 x (+ y 1)))))

;桁数を数える
(defun digits (m &optional (d 0))
  (cond ((zerop m) d)
        (t (digits (floor m 10) (incf d)))))

;空白を出力
(defun print-space (space-num)
  (dotimes (i space-num)
    (format t " ")))
答えの欄に空白置いて、答えの桁数だけ^H(backspace)吐いて、答え書く。

(管理者追記:ソースコード中の制御コードが原因でRSSがvalidでなくなっていたので、 とりあえず削除しました。bsは空文字列のようになっていますが、実際には0x08が2つ入っていました。)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/bash
bs=""
# bs="^H^H"
for n in $(seq 1 9); do
	for m in $(seq 1 9); do
		p=$(($n*$m))
		echo -n $n' * '$m' =   '
		echo ${bs:0:${#p}}$p
	done
done
printf使うのは素直過ぎて。
1
2
#!/bin/bash
for n in $(seq 9); do for m in $(seq 9); do echo $n' * '$m' = '$(printf '%2g' $(($n*$m))); done; done
ibazaさん(#3088)のきれいな解答の後で投稿するのは恥ずかしいのですが、doループで…。
おまけで9*9以上にも対応してみました…。
1
2
3
4
5
6
7
(defun print-kuku (&optional (n 9))
  (let* ((dn (1+ (truncate (log (expt n 2) 10))))
	 (dnn (1+ (/ dn 2))))
    (do ((i 1 (1+ (mod i n)))
	 (j 1 (if (= i n) (1+ j) j)))
	((> j n))
      (format t "~:[~;~%~]~VD *~VD = ~VD~%" (= i 1) dnn j dnn i dn (* j i)))))
Squeak Smalltalk で。

#format: は単に文字列指定箇所への埋め込みのみで、printf の書式指定のような細やかな機能はないので、数値の文字列変換に際し、要求にあわせてあらかじめ整形しておく必要があります。

今回は、第一引数の文字で第一引数の文字数に足りない分を左側から追加して埋める #printPaddedWith:to: というメソッドを使用しました。

なお、$ は Smalltalk での文字オブジェクトリテラルに冠する記号で、直後に続く一文字(下の場合、スペース)に相当する文字オブジェクトを返します。
1
2
3
World findATranscript: nil.
1 to: 9 do: [:x | 1 to: 9 do: [:y |
    Transcript cr; show: ('{1} * {2} = {3}' format: {x. y. (x * y) printPaddedWith: $  to: 2})]]
第一引数の文字数 → 第二引数の文字数
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)))
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)))))
> nobsun関数型脳に侵されていますね :-) lazy脳というべきか。
バレてる :)
> ~vd と書くと幅自体を引数で渡すこともできます
これもありそうだなと投稿してから気づいたのでした。

というわけでScheme版をHaskell版へ逆輸入


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import Text.Printf

displayNN n 
 = sequence_
 $ do { i <- s
      ; j <- s
      ; return $ putStrLn $ printf fmt i j (i*j)
      }
   where 
     s   = [1..n]
     k   = length $ show n
     k'  = length $ show (n*n)
     fmt = printf "%%%dd * %%%dd = %%%dd" k k k'
Text.Printf.printf でも * フラッグが使えるのでした。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import Text.Printf

displayNN :: Int -> IO ()
displayNN n 
 = sequence_ 
 $ do { i <- [1..n] ; j <- [1..n]
      ; return $ putStrLn $ printf "%*d * %*d = %*d" k i k j k' (i*j)
      }
   where k  = length $ show n
         k' = length $ show (n*n)
C#では複合書式を使用していたのでPadLeftで。
1
2
3
4
5
For i As Integer = 1 To 9
    For j As Integer = 1 To 9
        Console.WriteLine(i.ToString & " * " & j.ToString & " = " & (i * j).ToString.PadLeft(2))
    Next
Next
初投稿。思いつきで、何の工夫もなし。
1
2
3
4
5
(1..9).each do |i|
  (1..9).each do |j|
    puts "#{i} * #{j} " << "= " << (i * j).to_s.rjust(2)
  end
end
ちょっと細かいところだけど、
puts "#{i} * #{j} " << "= " << (i * j).to_s.rjust(2)
を
puts "#{i} * #{j} = " << (i * j).to_s.rjust(2)
に直した。
1
2
3
4
5
(1..9).each do |i|
  (1..9).each do |j|
    puts "#{i} * #{j} = " << (i * j).to_s.rjust(2)
  end
end
常識のない人間の解答
 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))
すみません、(use srfi-1)を忘れました。
な、なんてことをw

	
1
2
3
4
5
6
7
8
9
public class Sample {
    public static void main(String[] args) {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                System.out.printf("%d * %d = %2d%n", i, j, i * j);
            }
        }
    }
}
空気読んでないかも
1
2
(use srfi-42)
(do-ec (: i 1 10) (: j 1 10) (format #t "~d * ~d = ~2d\n" i j (* i j)))
投稿時にユーザー名とパスワード入れて、ログインにチェック入れて、プレビューして、投稿すると、匿名になります。(プレビューでは、ログイン名出るんですけど。
クッキー拒否しているからでしょうか。受け入れれば良いんでしょうけど。
>クッキー拒否しているからでしょうか。

ですね。
「クッキー拒否=ログイン情報を毎回破棄=ページを見るたびにログアウト」
と考えてもらうとわかりやすいかも知れませんが、
ログインしてプレビューした後、ログアウトしてから投稿しているのと同じわけです。
もしクッキーを保存したくなければ、投稿の直前にログインするといいのではないでしょうか。
SML/NJのFormatストラクチャ使用。
とりあえず2桁以上も無問題。
 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
fun showMTable n =
let
  fun show col row =
  let
    open Format

    fun loop n m =
    let
      val h = n div 10
    in
      if h = 0 then m else loop h (m + 1)
    end

    val x = loop n 1
    val y = loop (n * n) 1
    val s = format ("%%%dd * %%%dd = %%%dd\n") [INT x, INT x, INT y]
  in
    if col <= n then
      if row <= n then
        (formatf s print [INT col, INT row, INT (col * row)];
         show col (row + 1))
      else
        show (col + 1) 1
    else
      ()
  end
in
  show 1 1
end;

showMTable 9 (* showMTable n で n * n まで表示 *)
多分こう書くのが普通じゃないかと思った。というコトで、大した変更はないですがリファクタリング。
 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
fun showMTable n =
let
  fun show col row =
  let
    open Format

    fun loop n m =
    let
      val h = n div 10
    in
      if h = 0 then m else loop h (m + 1)
    end

    val x = loop n 1
    val y = loop (n * n) 1
  in
    if col <= n then
      if row <= n then
        (formatf "%d * %d = %d\n" print [RIGHT (x, INT col), RIGHT (x, INT row),
        RIGHT (y, INT (col * row))];
         show col (row + 1))
      else
        show (col + 1) 1
    else
      ()
  end
in
  show 1 1
end;

showMTable 9 (* showMTable n で n * n まで表示 *)
超ふつう
恥ずかしいくらいふつう
既出じゃないことだけ確かめました
早くアブノーマルになりたい
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include    <stdio.h>

int main() {
    int i, j;
    
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++)
            printf("%d * %d = %2d\n", i, j, i*j);
    }
    
    return 0;
}
確認してませんが、PostgreSQL でも動くはずです。
MySQL には、TO_CHAR が無いので、どうやって整形したらいいんだろう?
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
DROP TABLE digits;
CREATE TABLE digits(n INTEGER PRIMARY KEY);
INSERT INTO digits VALUES(1);
INSERT INTO digits VALUES(2);
INSERT INTO digits VALUES(3);
INSERT INTO digits VALUES(4);
INSERT INTO digits VALUES(5);
INSERT INTO digits VALUES(6);
INSERT INTO digits VALUES(7);
INSERT INTO digits VALUES(8);
INSERT INTO digits VALUES(9);

  SELECT a.n || ' * ' || b.n || ' = ' || TO_CHAR(a.n * b.n , '99') AS kuku
    FROM digits a, digits b
ORDER BY b.n, a.n ;

SQL Server 2008 で確認しました。 整形の方法は、文字列化して左にスペースをくっつけ、右から2文字取るという方法を使いました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
WITH
  Seq(n) AS (
    SELECT 1
    UNION ALL
    SELECT
        n + 1
    FROM
        Seq
    WHERE
        n + 1 <= 9
  )
SELECT
    CAST(S1.n AS char(1))
      + ' * '
      + CAST(S2.n AS char(1))
      + ' = '
      + RIGHT(' ' + CAST(S1.n * S2.n AS varchar(2)), 2)
FROM
    Seq S1, Seq S2
ORDER BY
    S1.n
  , S2.n

	
1
2
3
4
5
6
use List::MoreUtils qw(each_array);

@i = map {($_) x 9} 1..9;
@j = (1..9) x 9;
my $ea = each_array(@i,@j);
while (my ($i,$j) = $ea->()){ printf "%d * %d = %2d\n",$i,$j,$i*$j };
%f はフォーマット文字列を定義するリテラルです。
formatter は引数を3つ取る関数になります。
%(hogehoge)d とすることで名前付きにすることも できます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mul: fun(n, m) fiber {
    n.times.map(|i| i+1).each{|i|
        m.times.map(|j| j+1).each{|j|
            yield i, j, i * j;
        }
    }
}

formatter: %f[%d * %d = %2d];
mul(9, 9) {|i,j,s|
    formatter(i, j, s).p;
}
リスト内包表記やリストモナドだと表示順序がどうなるかなどがぱっと見では分かりにくくなるので、こういう問題はTraversableがすっきり書け、気に入っています。

printfは直接IOモナドとして使えるように作られています。
1
2
3
4
5
6
7
8
9
{-# OPTIONS_GHC -fglasgow-exts #-}
import Text.Printf (printf)
import Data.Traversable

main = for [1..9] (\(i::Int) ->
           for [1..9] (\(j::Int) ->
               printf "%d * %d = %2d\n" i j (i*j)
           )
       )
Haskellでもこういう書き方ができるんですねぇ
mapM_とか使わなきゃいけないのだとばかり思っていました。
> Traversableがすっきり書け
なるほど勉強になります。
> printfは直接IOモナドとして使えるように作られています。
imperativity phobia の私としては
#3080のような使い方しか思いつかなかった。 :)
どれが何桁でもズレないの作りました。
%dの文字幅に変数使えたらいいのになー。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
def kuku(A=[0],B=[0]):
  keta_A = len( str(A[-1]) )
  keta_B = len( str(B[-1]) )
  keta_ans = len( str( A[-1]*B[-1] ))
  
  for i in A:
    print
    I = str(i).rjust(keta_A)
    
    for j in B:
      J = str(j).rjust(keta_B)
      print "%s * %s = %s" \
            %( I, J, str(i*j).rjust(keta_ans) )

a=range(1,10)
kuku(a,a) #九九
kuku([8],range(1,21)) #八の段
あったのかー。
1
2
3
4
5
6
7
8
9
def digit(xs=[]):
	return [len( str(i) ) for i in xs]

def kuku(A=range(1,10),B=range(1,10)):
  lA,lB = A[-1],B[-1]
  ketaA, ketaB, ketaAns = digit([ lA, lB, lA*lB ])
  for i in A:
    for j in B:
      print "%*d * %*d = %*d" %( ketaA,i,  ketaB,j,  ketaAns,i*j )
どうやって右端を揃うようにレイアウトするか、という重要な要件をあえてユーザーの反射神経に委ねてみました。
左右に移動しながら表示されるので、適当なところでキーを押すと止まります。

N88-BASICで昔のゲーム風に。

(補足)
195 E=0
を加えると、ユーザー入力無しでレイアウトされます。
 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
100 DEFINT A-Z
110 FOR I = 1 TO 9
120   FOR J = 1 TO 9
130     S$ = RIGHT$(" "+STR$(I*J),2)+" "+CHR$(13)
140     X=7:VX=-1:E=1
150     WHILE E
160       PRINT STR$(I)+" *"+STR$(J)+" ="+SPACE$(X/3)+S$;
170       X=X+VX
180       IF X<4 OR X>10 THEN VX=-VX
190       IF INKEY$<>"" THEN E=0
200     WEND
210     PRINT
220   NEXT J
230 NEXT I


--- 筆者実行例
run
 1 * 1 =   1
 1 * 2 =  2
 1 * 3 =    3
 1 * 4 =   4
^C
Break in 170
Ok

	
1
2
3
4
5
6
7
8
9
def product(xs, ys)
  xs.inject([]) {|r, x|
    r + ys.map {|y| [x, y] }
  }
end

product(1..9, 1..9).each do |x, y|
  printf "%d * %d = %2d\n", x, y, x * y
end
 JS ならではの書き方を。
1
javascript:for($='<table>',i=0;i++<9;)for(j=0;j++<9;)$+='<tr><td>'+i+' * '+j+' = '+'</td><td align=right>'+i*j+'</td></tr>';$+'</table>'

	
1
2
3
kuku :- between(1, 9, X), between(1, 9, Y),
	Z is X * Y, format('~d * ~d =~t~d~10|~n', [X, Y, Z]).
:- findall(_,kuku,_).
ごく普通に。
1
2
3
4
5
6
7
8
9
import std.stdio;

void main(){
    for(int i = 1; i <= 9; i++){
        for(int j = 1; j <= 9; j++){
            writefln("%d * %d = %2d", i, j, i * j);
        }
    }
}
OCaml なかったので投稿しておきます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
let width x =
  if x < 0 then
    raise (Invalid_argument (string_of_int x))
  else
    1 + int_of_float (log10 (float_of_int x))

let list_kuku n =
  let w1, w2 = width n, width (n*n) in
    for i = 1 to n do
      for j = 1 to n do
        Printf.printf "%*d * %*d = %*d\n" w1 i w1 j w2 (i*j)
      done
    done
リスト内包表記を使いました。
1
lists:foreach(fun (X) -> io:fwrite("~B x ~B = ~2B~n", X) end, [[X, Y, X*Y] || X <- lists:seq(1,9), Y <- lists:seq(1,9)]).
%2sのところ%2dにしてstr(x*y)のところをたんにx*yにすればいいと後になって気づいたorz
掛け算が9x9が最高なんでいろいろと楽チンですね。
1
2
3
for x in range(1,10):
    for y in range(1,10):
        print "%d * %d = %2s"%(x,y,str(x*y))
1
2
3
4
欄=リスト!作る 100 400 大きさ -50 200 位置。
「|左|「|右 積|積=左*右。
 欄!(『』!(左)『 * 』(右)((積>9)!なら「『 = 』」そうでなければ「『 =   』」実行)(積)連結)書く。
」!9回 繰り返す」!9回 繰り返す。
初めてのFortranです><
なんか1行目のインデントが効いていないけどタブが存在してます。
1
2
3
4
5
6
7
8
9
do i = 1, 9
        do j = 1, 9
            write(*, 100) i, j, i * j
        end do
    end do

100    format(i1, ' + ', i1, ' = ', i2)

    end
表頭,表側に余計なものがつきますが
1
data.frame(x=rep(1:9, each=9), y=rep("*", 81), z=rep(1:9, 9), u=rep("=", 81), v=as.vector(outer(1:9, 1:9, "*")))
これなら,余分なものは付かない
1
cat(sprintf("%i * %i = %2i", rep(1:9, each=9), rep(1:9, 9), outer(1:9, 1:9, "*")), fill=10)
for文を使わないところにRらしさがあって素敵です。
掛け算の外積(outer)は "1:9 %o% 1:9" と演算子を使って書けたりしますよ(ご存知でしたらすみません)。
1:9が冗長に見えるかな・・・と思ったのでこんな別解を考えてみました。
1
with(expand.grid(1:9, 1:9), {cat(sprintf("%i * %i = %2i", Var2, Var1, Var1*Var2), fill=10)})
1行目の#runtimeは実行結果を見やすくするために入れているものであり、プログラム上必要なものではありません。
1
2
3
4
5
6
7
8
#runtime "hsp3cl"
    repeat 9, 1
        i = cnt
        repeat 9, 1
            mes strf( "" + i + " * " + cnt + " = %2d", i * cnt )
        loop
    loop
    stop
初投稿です。
リトルエンディアン(Intel系)で動作します。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main() {
  long a[3];
  int i, j;
  for (i = 0; i <= 80; i++) {
    j = (i/9 + 1) * (i%9 + 1);
    a[0] = 539631665L + i/9;
    a[1] = 540876849L + i%9;
    a[2] = 12320L + (j%10)*256 + (j>9 ? 16+j/10 : 0);
    puts((char *)a);
  }
  return 0;
}
こういう手がありましたか。お見事。
long=32bit、という条件も必要ですよね?
あ、確かに。
longは32bitとは限らないですね。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    #i = 1;
    while( #i <= 9 ) {
        #j = 1;
        while( #j <= 9 ) {
            insert str( #i ) + " * " + str( #j ) + " = ";
            call KetaSoroe ( #i * #j ), 2;
            insert $$return + "\n";
            #j = #j + 1;
        }
        #i = #i + 1;
    }
    endmacro;

KetaSoroe:
    ##i = ##2 - strlen( str( ##1 ) );
    $$result = "";
    if ( ##i >= 0 ) {
        while( ##i > 0 ) {
            $$result = $$result + " ";
            ##i = ##i - 1;
        }
    }
    $$result = $$result + str( ##1 );
    return $$result;
え、これじゃだめなの?
1
2
3
def out(a,b):
    print "%d * %d = %2d" % (a, b, a*b)
[out(a,b) for a in range(1,10) for b in range(1,10)]
なでしこワンライナーで。
1
aで1から9まで繰り返す;bで1から9まで繰り返す;"{a} * {b} = {文字列右寄せ(a*b,2)}"を表示
System.out.printf()で可変長引数が使えませんでした。
ですので、引数はString, Object[] にしています。
1
2
3
4
5
6
7
import java.lang.System;

for (i in [1..9]) {
    for (j in [1..9]) {
        System.out.printf("%d * %d = %2d%n", [i, j, (i * j)]);
    }
}
Perlならこの程度まではやらなくては。
Dan the One-Liner Monger
1
perl -e 'for$i(1..9){printf"$i * $_ = %2d\n",$i*$_ for(1..9)}'
plain C ですが。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>

int main(int argc, char** argv)
{
  int i, j;
  for (i=1; i<10; i++)
    for (j=1; j<10; j++)
      printf("%d * %d = %2d\n", i, j, i*j);
  return 0;
}
uptoがなかったのでとりあえず
1
2
3
4
5
1.upto(9){|x|
  1.upto(9){|y|
    printf("%2d * %2d = %2d\n",x,y,x*y)
  }
}
あえてsprintfの類やループを使わず.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
i, x, y = 0, 0, 0
puts (('o' * 9 + "\n") * 9).
  gsub(/^/) { (y += 1).to_s + ':' }.
  gsub(/o/) { i = x; x = (x + 1) % 9; i + 1 }.
  gsub(/^(\d+):(.+)/) {
    y, line = $~[1..-1]
    line.gsub(/\d/) {
      "#{y} * #{$&} = " +
        (' ' + (y.to_i * $&.to_i).to_s)[-2, 2] +
        "\n"
    }
  }.gsub("\n\n", "\n")
1
puts (1..9).map{|y|(1..9).map{|x|sprintf "%2d * %2d = %2d",x,y,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)
DelphiにはFormatがあるが、これは劣化版sprintfみたいなもの。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
program kuku;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i, j: Integer;

begin
  for i := 1 to 9 do
    for j := 1 to 9 do
      WriteLn(Format('%d * %d = %2d', [i, j, i * j]));
end.
Formatを使わない場合。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
program kuku;

{$APPTYPE CONSOLE}

var
  i, j: Integer;
  s: String;

begin
  for i := 1 to 9 do
    for j := 1 to 9 do
    begin
      Str(i * j:2, s);
      WriteLn(i, ' * ', j, ' = ' + s);
    end;
end.

Matlabらしくベクトル計算で。

1
2
3
4
a = kron(1:9, repmat(1, 1, 9));
b = repmat(1:9, 1, 9);
c = a.*b;
fprintf('%d * %d = %2d\n', [a; b; c])
引数を使わない場合でも省略はできないのでダミーがいります。

   kuku 0
1 * 1 =  1
1 * 2 =  2
1 * 3 =  3
   ...
8 * 8 = 64
8 * 9 = 72
9 * 1 =  9
9 * 2 = 18
9 * 3 = 27
9 * 4 = 36
9 * 5 = 45
9 * 6 = 54
9 * 7 = 63
9 * 8 = 72
9 * 9 = 81
1
2
3
4
f=.4 :0
(":x.),' * ',(":y.),' = ',2":x.*y.
)
kuku=.3 :',/f"0/~>:i.9'

何桁でも表記できるものを作成してみました。 かつ第二引数でHTML表示させる時の、 タグ形成も出来るようにしてます。

負荷軽減を考えるなら、 「strlen」の箇所を関数の最初に計算して、 変数にしてもいいかと思います。 とりあえずは行数を少なくするようにしてみました。

 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
<?php

function listKuku($num=9, $html=false)
{
    $list = "";
    for ($i=1; $i<$num+1; $i++) {
        for ($j=1; $j<$num+1; $j++) {
            $list .= str_pad($i, strlen($num), " ", STR_PAD_LEFT)." * ".str_pad($j, strlen($num), " ", STR_PAD_LEFT)." = ".str_pad($i*$j, strlen($num*$num), " ", STR_PAD_LEFT)."\n";
        }
    }
    if ($html) {
        $list = str_replace(" ", "&nbsp;", $list);
        $list = nl2br($list);
        //TABLE等作成させても可
    }
    return $list;
}

//header("Content-Type: text/html; charset=utf-8"); //必要なら使用

//使用方法1
$list = listKuku();
echo $list;

//使用方法2
$big_list = listKuku(40);
echo $big_list;

//使用方法3
$html_list = listKuku(40, true);
echo $html_list;

?>
cmd.exeで。
1
2
3
4
5
6
7
8
9
@echo off
setlocal enabledelayedexpansion
for /l %%x in (1,1,9) do (
  for /l %%y in (1,1,9) do (
    set /a a=%%x*%%y
    set a= !a!
    echo %%x * %%y = !a:~-2!
  )
)

Ghostscriptでコンソール出力させる前提で素直に書いてみました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
%!

/format00 { 2 string cvs } bind def

% 積 y x P -
/P {
  format00 print
  ( * ) print
  format00 print
  ( = ) print
  dup 10 lt { ( ) print } if
  format00 print
  <0A> print
} def


1 1 9 {
  /x exch def
  1 1 9 {
    /y exch def
    x y mul y x P
  } for
} for

Factor です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
USING: kernel sequences math math.parser io ;

: out ( x y -- )
  over number>string write
  " * " write
  dup number>string write
  " = " write
  * number>string 2 CHAR: \s pad-left write nl ;

9 [ 1+ 9 [ dupd 1+ out ] each drop ] each
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
: PRINT ( i j -- , print formated i * j = i*j )
2DUP SWAP . ." *" SPACE . ." =" SPACE * 2 .R CR ;

: KUKU ( -- , print all kuku )
10 1 DO
  10 1 DO J I
    PRINT
  LOOP
LOOP ;

KUKU

特に工夫はありません。COBOL向きのお題かもしれませんね。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
* 九九の表示 - YCobol 0.19にて動作確認
IDENTIFICATION DIVISION.
PROGRAM-ID. DOUKAKU-62.
*
ENVIRONMENT DIVISION.
*
DATA DIVISION.
WORKING-STORAGE SECTION.
01 I PIC 9 VALUE 0.
01 J PIC 9.
01 K PIC Z9.
*
PROCEDURE DIVISION.
MAIN.
    PERFORM UNTIL I >= 9
        MOVE 0 TO J
        ADD 1 TO I
        PERFORM UNTIL J >= 9
            ADD 1 TO J
            COMPUTE K = I * J
            DISPLAY I " * " J " = " K
        END-PERFORM
    END-PERFORM
    STOP RUN.

http://ja.doukaku.org/comment/6132/は一般のCOBOLではなくYCobol独自の書式だったので、より一般的な書式のものに書き換えました。 OpenCOBOLでのコンパイルに成功、動作確認済み。

 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
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DOUKAKU-62.
      *
       ENVIRONMENT DIVISION.
      *
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01  WK-KUKU.
           03 L      PIC 9.
           03 FILLER PIC X(3) VALUE " * ".
           03 R      PIC 9.
           03 FILLER PIC X(3) VALUE " = ".
           03 RESULT PIC Z9.
      *
       PROCEDURE DIVISION.
           MOVE ZERO TO L.
           PERFORM UNTIL L = 9
               ADD 1 TO L
               MOVE ZERO TO R
               PERFORM UNTIL R = 9
                   ADD 1 TO R
                   MULTIPLY L BY R GIVING RESULT
                   DISPLAY WK-KUKU
               END-PERFORM
           END-PERFORM.
           STOP RUN.
各行の要素を行番号で埋めるという関数col()を使ってみました。
1
2
3
a<-1:9
b<-a %o% a
writeLines(paste(col(b),"*",a,"=",format(b,0,2)))
すみません。間違えました。
「各行の要素を行番号で埋めるという関数col()」ではなくて
「各列の要素を列番号で埋めるという関数col()」でした。
> a<-matrix(1,3,4)
> a
     [,1] [,2] [,3] [,4]
[1,]    1    1    1    1
[2,]    1    1    1    1
[3,]    1    1    1    1
> col(a)
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
[3,]    1    2    3    4
printfみたいなのは、ないようですが文字変換メソッドで桁数指定ができるようです。
1
for(i,1,9,for(j,1,9,writeln(i," * ",j," = ",(i*j)asString(2,0))))

つまらない答えですが・・

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

void kuku(int num1, int num2){
  printf("%d * %d = %2d\n", num1, num2, num1 * num2);
}

int main(){
  int num1, num2;
  for(num1 = 1; num1 <= 9; num1++)
    for(num2 =1; num2 <= 9; num2++)
      kuku(num1, num2);

  return 0;
}

何のひねりもありません。

1
2
3
4
5
(1..9).each{ x ->
    (1..9).each{ y ->
        println "${x} * ${y} = " + (x*y).toString().padLeft(2)
    }
}
面白くもなんともありませんが・・・。
1
foreach (var i in Enumerable.Range(1, 9).Select(x => { foreach (var j in Enumerable.Range(1, 9).Select(y => { Console.WriteLine(string.Format("{0} * {1} = {2}", x, y, (x * y).ToString().PadLeft(2,' '))); return y; }));return x; })) ;
素直に if を使わない。
 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
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  >

  <xsl:output method="text" />

  <xsl:template match="/" >
    <xsl:for-each select="1 to 9">
      <xsl:variable name="i" as="xs:integer" select="." />
      <xsl:for-each select="1 to 9">
        <xsl:value-of select="$i" />
        <xsl:text> * </xsl:text>
        <xsl:value-of select="." />
        <xsl:text> = </xsl:text>
        <xsl:variable name="elm" as="element()">
          <xsl:element name="n">
            <xsl:value-of select="$i*." />
          </xsl:element>
        </xsl:variable>
        <xsl:apply-templates select="$elm" />
        <xsl:text>&#xA;</xsl:text>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="n">
    <xsl:value-of select="." />
  </xsl:template>
  <xsl:template match="n[.&lt;10]">
    <xsl:text> </xsl:text>
    <xsl:value-of select="." />
  </xsl:template>

</xsl:stylesheet>
writef と format の書式指定は全然違うんだなあ。
1
2
d(1). d(2). d(3). d(4). d(5). d(6). d(7). d(8). d(9).
:-d(A),d(B),C is A*B,\+writef('%d * %d =%3r',[A,B,C]).

(import文抜かせばですが)一行にしてみました。

1
2
import Ix
main=putStr.unlines.map(\(a,b)->concat[show a," * ",show b," = ",reverse.take 2.reverse$' ':show(a*b)]).range$((1,1),(9,9))
実行速度は最速? 開発効率は最悪(爆)
1
2
3
4
5
6
7
8
9
#include <stdio.h>
void main() {
 printf("1 * 1 =  1\n");
 printf("1 * 2 =  2\n");
 printf("1 * 3 =  3\n");
 printf("--- 中略 ---\n");
 printf("9 * 8 = 72\n");
 printf("9 * 9 = 81\n");
}

「実行速度最速」を目指すなら,printf()を81回も呼び出さずに,1回で済ませるのがよいかと.

あと,出力フォーマットも使う必要がないのでfputs()に置き換えました.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
void main()
{
    fputs("1 * 1 =  1\n"
          "1 * 2 =  2\n"
          "1 * 3 =  3\n"
          /* 中略 */
          "9 * 8 = 72\n"
          "9 * 9 = 81\n",
          stdout);
}

結構短く書けたので。

1
(a=[*(1..9)]).map{|i|a.map{|j|puts"%d * %d = %2d"%[i,j,i*j]}}
1
2
3
4
5
for a = 1, 9 do
  for b = 1, 9 do
    print(("%d * %d = %2d"):format(a, b, a * b))
  end
end
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Module Universe
     implicit none
     Private
         integer::left,right
     Public :: Mult
     contains
         Subroutine Mult
             do left = 1,9
                 do right = 1,9
                     Print '(i1," * ",i1," = ",i2)',&
                             left, right, left*right
                 end do
             end do
         End Subroutine
End Module

Program Main
     use Universe
     implicit none
     call Mult
End Program

Index

Feed

Other

Link

Pathtraq

loading...