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

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
以下略
-}

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

リスト内包表記やリストモナドだと表示順序がどうなるかなどがぱっと見では分かりにくくなるので、こういう問題は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)
           )
       )

Index

Feed

Other

Link

Pathtraq

loading...