九九の表示
動的にサイズを変えられるようにしてみました。
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
see: C言語-書式付入出力関数(printf文・scanf文)の書式
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;
}
|
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 = [];
}
|
自分で書けば使えないことはないんじゃないですか。
see: http://www.onicos.com/staff/iz/amuse/javascript/expert/printf.txt
でも、このお題満たすために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)))))
|
#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
|
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;
}
|
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)
|
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.
|
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(" ", " ", $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>
</xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template match="n">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="n[.<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
|






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