18

私は最近、仕事の経験をしている学生に、掛け算の九九をコンソールにダンプすることについての記事を指摘しました。ネストされたforループを使用し、それぞれのステップ値を乗算しました。

これは.NET2.0アプローチのように見えました。たとえば、Linqメソッドと拡張メソッドを使用すると、同じ結果を得るのに何行のコードが必要になるのか疑問に思いました。

stackoverflowコミュニティは課題に取り組んでいますか?

課題:コンソールアプリケーションで、次の例のようなテーブルを生成するコードを記述します。

01 02 03 04 05 06 07 08 09
02 04 06 08 10 12 14 16 18
03 06 09 12 15 18 21 24 27
04 08 12 16 20 24 28 32 36
05 10 15 20 25 30 35 40 45
06 12 18 24 30 36 42 48 54
07 14 21 28 35 42 49 56 63
08 16 24 32 40 48 56 64 72
09 18 27 36 45 54 63 72 81

これが言語にとらわれないコードゴルフの戦いに変わったので、私は、受け入れられた答えのための最良の解決策についてのコミュニティの決定に行きます。

テーブルの仕様とフォーマットについては多くの議論がありました。意図的に00フォーマットを追加しましたが、投稿を作成するときにテキストのフォーマット方法がわからなかったため、元々2つの改行がありました。

4

40 に答える 40

41

J -8文字-適切な形式の場合は24文字

*/~1+i.9

与える:

1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

@earlによって見つけられたこの解決策:

'r(0)q( )3.'8!:2*/~1+i.9

与える:

01 02 03 04 05 06 07 08 09
02 04 06 08 10 12 14 16 18
03 06 09 12 15 18 21 24 27
04 08 12 16 20 24 28 32 36
05 10 15 20 25 30 35 40 45
06 12 18 24 30 36 42 48 54
07 14 21 28 35 42 49 56 63
08 16 24 32 40 48 56 64 72
09 18 27 36 45 54 63 72 81
于 2010-08-05T16:25:16.253 に答える
16

MATLAB-10文字

a=1:9;a'*a

...またはより厳密な出力形式の場合は33文字

a=1:9;disp(num2str(a'*a,'%.2d '))
于 2010-08-06T01:27:42.740 に答える
15

Brainf**k-185文字

>---------[++++++++++>---------[+<[-<+>>+++++++++[->+>>---------[>-<++++++++++<]<[>]>>+<<<<]>[-<+>]<---------<]<[->+<]>>>>++++[-<++++>]<[->++>+++>+++<<<]>>>[.[-]<]<]++++++++++.[-<->]<+]
于 2010-08-05T18:22:39.773 に答える
14

猫-252文字

01 02 03 04 05 06 07 08 09

02 04 06 08 10 12 14 16 18

03 06 09 12 15 18 21 24 27

04 08 12 16 20 24 28 32 36

05 10 15 20 25 30 35 40 45

06 12 18 24 30 36 42 48 54

07 14 21 28 35 42 49 56 63

08 16 24 32 40 48 56 64 72

09 18 27 36 45 54 63 72 81

末尾の改行が必要であると仮定します。それ以外の場合は、251文字。

*実行*

于 2010-08-07T18:52:05.640 に答える
8

Python-61文字

r=range(1,10)
for y in r:print"%02d "*9%tuple(y*x for x in r)
于 2010-08-05T11:35:56.630 に答える
7

C#

これはたった2行です。拡張メソッドではなくラムダを使用します

 var nums = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 nums.ForEach(n => { nums.ForEach(n2 => Console.Write((n * n2).ToString("00 "))); Console.WriteLine(); });

そしてもちろん、それは1つの長い読めない行で行うことができます

 new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }.ForEach(n => { new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 }.ForEach(n2 => Console.Write((n * n2).ToString("00 "))); Console.WriteLine(); });

これはすべて、labmdaを1行と見なすことを前提としていますか?

于 2010-08-05T08:27:13.387 に答える
6

K-12文字

ロゼッタストーンを真剣に受け止め、Kdb +のK4を正規のJソリューションと比較してみましょう(*/~1+i.9):

  a*/:\:a:1+!9
1 2  3  4  5  6  7  8  9 
2 4  6  8  10 12 14 16 18
3 6  9  12 15 18 21 24 27
4 8  12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

Jの「テーブル」演算子(/)は、Kの「各左各右」(/:\:)イディオムに等しくなります。KにはJの非常に便利な「回帰」演算子( )がないため、左と右の両方の引数として~渡す必要があります。a

于 2010-08-05T22:24:13.260 に答える
6

Fortran95-40文字(perlを4文字で打ち負かします!)

このソリューション、仕様に従って先行ゼロを出力します。

print"(9(i3.2))",((i*j,i=1,9),j=1,9);end
于 2010-08-05T21:36:29.707 に答える
5

Oracle SQL、103文字:

select n, n*2, n*3, n*4, n*5, n*6, n*7, n*8, n*9 from (select rownum n from dual CONNECT BY LEVEL < 10)
于 2010-08-05T16:19:59.187 に答える
5

C#-117、113、99、96、9589文字

NickLarsenのアイデアに基づいて更新

for(int x=0,y;++x<10;)
    for(y=x;y<x*10;y+=x)
        Console.Write(y.ToString(y<x*9?"00 ":"00 \n"));

99、85、82 81文字 ...先行ゼロを気にせず、タブを揃えることができる場合。

for(int x=0,y;++x<10;)
{
    var w="";
    for(y=1;++y<10;)
        w+=x*y+"    ";
    Console.WriteLine(w);
}
于 2010-08-05T20:39:20.113 に答える
4

COBOL-218文字->216文字

PROGRAM-ID.P.DATA DIVISION.WORKING-STORAGE SECTION.
1 I PIC 9.
1 N PIC 99.
PROCEDURE DIVISION.PERFORM 9 TIMES
ADD 1 TO I
SET N TO I
PERFORM 9 TIMES
DISPLAY N' 'NO ADVANCING
ADD I TO N
END-PERFORM
DISPLAY''
END-PERFORM.

編集

216文字(おそらく別のコンパイラ)

PROGRAM-ID.P.DATA DIVISION.WORKING-STORAGE SECTION.
1 I PIC 9.
1 N PIC 99.
PROCEDURE DIVISION.

  PERFORM B 9 TIMES
  STOP RUN.

B.
 ADD 1 TO I
 set N to I
 PERFORM C 9 TIMES
 DISPLAY''.

C.
 DISPLAY N" "NO ADVANCING
 Add I TO N.
于 2010-08-05T22:13:53.810 に答える
3

実際にはワンライナーではありませんが、私が考えることができる最短のlinq:

var r = Enumerable.Range(1, 9);
foreach (var z in r.Select(n => r.Select(m => n * m)).Select(a => a.Select(b => b.ToString("00 "))))
{
    foreach (var q in z)
        Console.Write(q);
    Console.WriteLine();
}

これとSRulyの答えを組み合わせることに応じて

Enumberable.Range(1,9).ToList.ForEach(n => Enumberable.Range(1,9).ToList.ForEach(n2 => Console.Write((n * n2).ToString("00 "))); Console.WriteLine(); });

于 2010-08-05T08:27:09.473 に答える
3

Haskell —85 8479文字

r=[1..9]
s x=['0'|x<=9]++show x
main=mapM putStrLn[unwords[s$x*y|x<-r]|y<-r]

ダブルスペースが必要な場合(8981文字)、

r=[1..9]
s x=['0'|x<=9]++show x
main=mapM putStrLn['\n':unwords[s$x*y|x<-r]|y<-r]
于 2010-08-05T17:28:05.160 に答える
3

Ruby-42文字(1つの改行を含む、対話型コマンドラインのみ)

このメソッドは2行の入力であり、irb(irbが提供するため_)でのみ機能しますが、前のメソッドをわずか2文字短縮します。

1..9
_.map{|y|puts"%02d "*9%_.map{|x|x*y}}

Ruby-44文字(perlで結ばれています)

(a=1..9).map{|y|puts"%02d "*9%a.map{|x|x*y}}

ルビー-46文字

9.times{|y|puts"%02d "*9%(1..9).map{|x|x*y+x}}

ルビー-47文字

そして、ダブルループに戻ります

(1..9).map{|y|puts"%02d "*9%(1..9).map{|x|x*y}}

ルビー-54文字!

単一のループを使用すると、2文字節約できます。

(9..89).map{|n|print"%02d "%(n/9*(x=n%9+1))+"\n"*(x/9)}

ルビー-56文字

9.times{|x|puts (1..9).map{|y|"%.2d"%(y+x*y)}.join(" ")}
于 2010-08-06T03:27:40.047 に答える
2

C- 9779文字

#define f(i){int i=0;while(i++<9)
main()f(x)f(y)printf("%.2d ",x*y);puts("");}}
于 2010-08-05T21:20:53.077 に答える
2

PHP、71文字

for($x=0;++$x<10;print"\n"){for($y=0;++$y<10;){printf("%02d ",$x*$y);}}

出力:

$ php -r 'for($x=0;++$x<10;print"\n"){for($y=0;++$y<10;){printf("%02d ",$x*$y);}}'
01 02 03 04 05 06 07 08 09 
02 04 06 08 10 12 14 16 18 
03 06 09 12 15 18 21 24 27 
04 08 12 16 20 24 28 32 36 
05 10 15 20 25 30 35 40 45 
06 12 18 24 30 36 42 48 54 
07 14 21 28 35 42 49 56 63 
08 16 24 32 40 48 56 64 72 
09 18 27 36 45 54 63 72 81 
于 2010-08-06T19:10:50.643 に答える
2

F#-61文字:

for y=1 to 9 do(for x=1 to 9 do printf"%02d "(x*y));printfn""

より適用可能な/LINQ-yソリューションを好む場合は、72文字で:

[1..9]|>Seq.iter(fun y->[1..9]|>Seq.iter((*)y>>printf"%02d ");printfn"")
于 2010-08-05T16:55:44.680 に答える
2

c#-125、123文字(2行):

var r=Enumerable.Range(1,9).ToList();
r.ForEach(n=>{var s="";r.ForEach(m=>s+=(n*m).ToString("00 "));Console.WriteLine(s);});
于 2010-08-05T17:32:24.023 に答える
2

Perl、44文字

(Jの近くに来る見込みはありませんが、行列演算を使用する言語は、ここでは独自のクラスに属しています...)

for$n(1..9){printf"%3d"x9 .$/,map$n*$_,1..9}
于 2010-08-06T07:26:05.830 に答える
2

R(このレベルのMatlabに非常に似ています):12文字。

> 1:9%*%t(1:9)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    1    2    3    4    5    6    7    8    9
[2,]    2    4    6    8   10   12   14   16   18
[3,]    3    6    9   12   15   18   21   24   27
[4,]    4    8   12   16   20   24   28   32   36
[5,]    5   10   15   20   25   30   35   40   45
[6,]    6   12   18   24   30   36   42   48   54
[7,]    7   14   21   28   35   42   49   56   63
[8,]    8   16   24   32   40   48   56   64   72
[9,]    9   18   27   36   45   54   63   72   81
于 2010-08-06T18:55:34.243 に答える
1

C-66文字

これにより、mainの2番目のパラメーターに関する苦情が解決されます:)

main(x){for(x=8;x++<89;)printf("%.2d%c",x/9*(x%9+1),x%9<8?32:10);}

C-77文字

dreamlaxの97文字の回答に基づいています。彼の現在の答えは今これにいくぶん似ています:)

gccで問題なくコンパイルできmain(x,y)、ゴルフの公正なゲームだと思います

#define f(i){for(i=0;i++<9;)
main(x,y)f(x)f(y)printf("%.2d ",x*y);puts("");}}
于 2010-08-05T21:54:06.253 に答える
1

Java- 155137文字


  • 更新1:文字列の構築を直接印刷に置き換えました。18文字節約できました。

class M{public static void main(String[]a){for(int x,y=0,z=10;++y<z;System.out.println())for(x=0;++x<z;System.out.printf("%02d ",x*y));}}

より読みやすい形式:

class M{
 public static void main(String[]a){
  for(int x,y=0,z=10;++y<z;System.out.println())
   for(x=0;++x<z;System.out.printf("%02d ",x*y));
 }
}
于 2010-08-19T19:33:47.637 に答える
1

C#、135文字、きれいできれい:

var rg = Enumerable.Range(1, 9);
foreach (var rc in from r in rg 
                   from c in rg 
                   select (r * c).ToString("D2") + (c == 9 ? "\n\n" : " "))
    Console.Write(rc);
于 2010-08-06T01:34:52.923 に答える
1

PostgreSQL:8174文字

select array(select generate_series(1,9)*x)from generate_series(1,9)as x;
于 2010-08-06T02:13:18.247 に答える
1

ルビー-56文字:D

9.times{|a|9.times{|b|print"%02d "%((a+1)*(b+1))};puts;}
于 2010-08-06T03:47:52.050 に答える
1

Scala - 775958 文字

print(1 to 9 map(p=>1 to 9 map(q=>"%02d "format(p*q))mkString)mkString("\n"))

申し訳ありませんが、私はこれをしなければなりませんでした、MalaxによるScalaソリューションはあまりにも読みやすかったです...

[編集]理解のためはより良い選択のようです:

for(p<-1 to 9;q<-{println;1 to 9})print("%02d "format p*q)

[編集]はるかに長い解決策ですが、乗算はなく、はるかに曖昧です。

val s=(1 to 9).toSeq
(s:\s){(p,q)=>println(q.map("%02d "format _)mkString)
q zip(s)map(t=>t._1+t._2)}
于 2010-08-06T19:29:02.330 に答える
1

XQuery 1.0(96バイト)

string-join(for$x in 1 to 9 return(for$y in 1 to 9 return concat(0[$x*$y<10],$x*$y,' '),'

'),'')

XQSharpを使用して)次のコマンドを実行します。

xquery table.xq !method=text
于 2010-08-09T17:10:18.017 に答える
1

PHP、62文字

for(;$x++<9;print"\n",$y=0)while($y++<9)printf("%02d ",$x*$y);
于 2010-08-19T18:27:54.737 に答える
0

JavaScript-コンソール付き-65文字

for(i=0,a='';++i<10;a+='\n')for(j=0;++j<10;a+=i*j);console.log(a)

JavaScript-html付き-68文字

for(i=0,a='';++i<10;a+='\n')for(j=0;++j<10;a+=i*j);document.write(a)
于 2010-08-19T20:41:54.110 に答える
0

GroupJoinでC#/ Linqを使用する別の試み:

Console.Write(
    String.Join(
        Environment.NewLine,
        Enumerable.Range(1, 9)
            .GroupJoin(Enumerable.Range(1, 9), y => 0, x => 0, (y, xx) => String.Join(" ", xx.Select(x => x * y)))
            .ToArray()));
于 2010-08-06T06:49:44.200 に答える
0

Ruby —47文字

puts (a=1..9).map{|i|a.map{|j|"%2d"%(j*i)}*" "}

出力

 1  2  3  4  5  6  7  8  9
 2  4  6  8 10 12 14 16 18
 3  6  9 12 15 18 21 24 27
 4  8 12 16 20 24 28 32 36
 5 10 15 20 25 30 35 40 45
 6 12 18 24 30 36 42 48 54
 7 14 21 28 35 42 49 56 63
 8 16 24 32 40 48 56 64 72
 9 18 27 36 45 54 63 72 81

(間隔を無視すると、39になります。puts (a=1..9).map{|i|a.map{|j|j*i}*" "} とにかく、言葉の多いものには改善の余地があるように感じmapます。)

于 2010-08-06T07:54:15.913 に答える
0

ルビー、49文字

1.upto(9){|n|puts"%02d "*9%(n..81).step(n).to_a}

PS。WolframAlphaでは23文字のDSです。

于 2010-08-06T12:25:01.933 に答える
0

Common Lisp、79文字(空白を含む):

(dotimes (i 9) (dotimes (j 9) (format t "~2,'0d " (* (1+ i) (1+ j)))) (terpri))

より伝統的なフォーマットに近づく何かで:

(dotimes (i 9) 
  (dotimes (j 9) 
    (format t "~2,'0d " (* (1+ i) (1+ j)))) 
  (terpri))

次に、フォーマッターのパワーを示す106文字のバージョンがあります。

(format t "~{~{~2,'0d~^ ~}~%~}"
        (loop for i from 1 to 9 
           collect (loop for j from 1 to 9 
                      collect (* i j))))
于 2010-08-07T18:34:03.190 に答える
0

PHP、67文字

while(++$x<10){$y=0;while(++$y<10)printf("%02d ",$x*$y);print"\n";}
于 2010-08-07T18:45:45.523 に答える
0

悔い改め、11、10文字

↓1⇄.⇄^↓↻*;

これは、私自身のおもちゃの言語スタックベースの言語であるRepentを使用しています(これは、スクラッチになったらすぐにリリースします)。コードゴルフでJ、Perl、Golfscriptを打ち負かすためだけに設計したので、Jがそれを打ち負かすのを見るのは悲しいことです。

V_1v.v^↓↻*;

通訳(アルファ)

言語リファレンス(アルファ)

于 2010-08-07T21:04:45.100 に答える
0

集計を使用したC#、118文字

var r=Enumerable.Range(1,9).ToList();
r.ForEach(i=>Console.WriteLine(r.Aggregate("",(a,b)=>a+=(i*b).ToString("00 "))));
于 2010-08-08T14:06:15.320 に答える
0

Bash、59文字

for i in `seq 9`;do seq -w $i $i 99|sed 9q;done|column -c80
01  02  03  04  05  06  07  08  09
02  04  06  08  10  12  14  16  18
03  06  09  12  15  18  21  24  27
04  08  12  16  20  24  28  32  36
05  10  15  20  25  30  35  40  45
06  12  18  24  30  36  42  48  54
07  14  21  28  35  42  49  56  63
08  16  24  32  40  48  56  64  72
09  18  27  36  45  54  63  72  81
于 2010-08-13T18:09:29.683 に答える
0

BASH 53

for((i=1;i<10;i++));do seq -s' ' $i $i $((9*i));done
于 2010-08-16T06:37:36.467 に答える
0

インポート後のHaskell(リスト内包表記ではない)71

残念なことに、haskellのプレリュードライブラリにprintfがありませんが、ghci 71文字をインポートした後、他のhaskellプログラムはリスト内包表記を使用していました。

Prelude> :module Text.Printf
Prelude Text.Printf> let r=[1..9]
Prelude Text.Printf> mapM_(\y->(mapM_(\x->printf"%02d "(x*y))r)>>(putStrLn ""))r
01 02 03 04 05 06 07 08 09
02 04 06 08 10 12 14 16 18
03 06 09 12 15 18 21 24 27
04 08 12 16 20 24 28 32 36
05 10 15 20 25 30 35 40 45
06 12 18 24 30 36 42 48 54
07 14 21 28 35 42 49 56 63
08 16 24 32 40 48 56 64 72
09 18 27 36 45 54 63 72 81
于 2010-08-19T20:19:39.303 に答える
0

99999番目の場所でのC++ランキング(76文字)

for(int i=1;i<=9;++i){cout<<i<<" "<<i+1<<i+2<<i+3<<i+4<<i+5<<i+6<<i+7<<i+8;}
于 2012-04-12T17:05:29.440 に答える