九九の表示
動的にサイズを変えられるようにしてみました。
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)
)
)
|





にしお
#3418()
Rating0/2=0.00
なお、この問題は掛け算をどうやるかではなく、 どうやって右端がそろうようにレイアウトするかに重点を置いているので、 下のようなへこんだ出力は禁止です。
2 replies [ reply ]