このダイヤモンドを印刷


76

この質問は私のオフィスでウイルスのように広がっています。さまざまなアプローチがあります。

以下を印刷します。

        1
       121
      12321
     1234321
    123454321
   12345654321
  1234567654321
 123456787654321
12345678987654321
 123456787654321
  1234567654321
   12345654321
    123454321
     1234321
      12321
       121
        1

回答は文字数で記録され、文字数は少ないほど良いです。


4
勝利基準は何ですか?これは挑戦ですか、それともゴルフですか?
ポールR

21
「kolmogorov-complexity」を「code-golf」と読みます。
DavidC

1
@DavidCarraher "kolmogorov-complexity"は、質問が行われた後に編集されました。元の質問者は、勝利基準をまだ指定していません。
ガレス

@Gareth「kolmogorov-complexity」タグが追加された後、「code-golf」タグが追加される前に私のコメントが作成されました。その時、人々はまだそれがコードゴルフの質問であるかどうかを尋ねていました。
DavidC

3
perlmonks.com/?node_id=891559にはperlソリューションがあります。
b_jonas

回答:


24

J、29 26 24 23 22 21文字

,.(0&<#":)"+9-+/~|i:8

FUZxxl"+トリックに感謝します(これまで使ったことはないと思いますu"v)。

説明

                  i:8  "steps" vector: _8 _7 _6 ... _1 0 1 ... 7 8
                 |     magnitude
              +/~      outer product using +
            9-         inverts the diamond so that 9 is in the center
  (      )"+           for each digit:
      #                  copy
   0&<                   if positive then 1 else 0
       ":                copies of the string representation of the digit
                         (in other words: filter out the strictly positive
                          digits, implicitly padding with spaces)
,.                     ravel each item of the result of the above
                       (necessary because the result after `#` turns each
                        scalar digit into a vector string)

代わりに"0]、を書き"+ます。
FUZxxl

1文字少ない場合、次のように記述します,.0(<#":)"+9-+/~|i:8
-FUZxxl

1
ソリューションをAPLの25文字に変換します⍪↑{(0<⍵)/⍕⍵}¨9-∘.+⍨|9-⍳17
。– FUZxxl

25

APL(33 31)

A⍪1↓⊖A←A,0 1↓⌽A←⌽↑⌽¨⍴∘(1↓⎕D)¨⍳9

(Mathematicaエントリのように)数字を区切るスペースが許可されている場合、28 26に短縮できます:

A⍪1↓⊖A←A,0 1↓⌽A←⌽↑⌽∘⍕∘⍳¨⍳9

説明:

  • (長いプログラム:)
  • ⍳9:1から9までの数字のリスト
  • 1↓⎕D⎕D文字列「0123456789」で1↓、最初の要素を削除します
  • ⍴∘(1↓⎕D)¨⍳9:の各要素Nについて⍳9、から最初のN個の要素を取得し1↓⎕Dます。これはリストを与えます:["1"、 "12"、 "123"、... "123456789"]文字列として
  • ⌽¨:このリストの各要素を逆にします。["1"、 "21"、 "321" ...]

  • (ショートプログラム:)

  • ⍳¨⍳9:1〜Nのリスト、N [1..9]の場合。これにより、リストとして[[1]、[1,2]、[1,2,3] ... [1,2,3,4,5,6,7,8,9]]が番号として与えられます。
  • ⌽∘⍕∘:これらの各リストの文字列表現の逆。["1"、 "2 1" ...]
  • (これからも同じ:)
  • A←⌽↑:リストのリストからマトリックスを作成し、右側にスペースを埋めてから、逆にします。これにより、ダイヤモンドの上部象限が得られます。Aに保存されます。
  • A←A,0 1↑⌽A:A、Aの逆から右に最初の列を引いたもの。これにより、長方形の上半分が得られます。これは再びAに保存されます。
  • A⍪1↓⊖A⊖Aは、垂直にミラーリングされ(下半分を与える)、下半分1↓の上の行を削除しA⍪、上半分がの上にあり1↓⊖Aます。

5
+1すごい。APL非識字者向けに翻訳してもらえますか?
DavidC

3
非ASCIIコードはコードポイントの代わりにUTF-8でカウントされるべきではありませんか?これは、APLを彼の地上の親toにより近づけます。
ジョンドヴォルザーク

5
@JanDvorakいいえ、文字セット全体を1バイトに収めるAPLコードページがあるためです。しかし、おそらく2013年以降のある時点でこれを理解していると思います。;)
マーティンエンダー

23

Clojure、191 179バイト

#(loop[[r & s](range 18)h 1](print(apply str(repeat(if(< r 8)(- 8 r)(- r 8))\ )))(doseq[m(concat(range 1 h)(range h 0 -1))](print m))(println)(if s(recur s((if(< r 8)inc dec)h))))

アウターdoseqをaに変更することで-12バイトloopになり、atom(イェー)を取り除くことができました。

二重の「forループ」。外側のループ(loop)内部ループ(ながら、各行乗り越えはdoseq)範囲内にある行の各数、乗り越え(concat (range 1 n) (range n 0 -1))n行の最大数です。

(defn diamond []
  (let [spaces #(apply str (repeat % " "))] ; Shortcut function that produces % many spaces
    (loop [[row-n & r-rows] (range 18) ; Deconstruct the row number from the range
           high-n 1] ; Keep track of the highest number that should appear in the row
      (let [top? (< row-n 8) ; Are we on the top of the diamond?
            f (if top? inc dec) ; Decided if we should increment or decrement
            n-spaces (if top? (- 8 row-n) (- row-n 8))] ; Calculate how many prefix-spaces to print
        (print (spaces n-spaces)) ; Print prefix-spaces
        (doseq [m (concat (range 1 high-n) (range high-n 0 -1))] ; Loop over the row of numbers
          (print m)) ; Print the number
        (println)

        (if r-rows
          (recur r-rows (f high-n)))))))

私の最初の試みのロジックのバグのために(誤って代わりに各番号の間にプレフィックススペースを挿入する)、私はこれをどうにかして得ました:

1
1       2       1
1      2      3      2      1
1     2     3     4     3     2     1
1    2    3    4    5    4    3    2    1
1   2   3   4   5   6   5   4   3   2   1
1  2  3  4  5  6  7  6  5  4  3  2  1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
12345678987654321
1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2 1
1  2  3  4  5  6  7  8  9  8  7  6  5  4  3  2  1
1   2   3   4   5   6   7   8   7   6   5   4   3   2   1
1    2    3    4    5    6    7    6    5    4    3    2    1
1     2     3     4     5     6     5     4     3     2     1
1      2      3      4      5      4      3      2      1
1       2       3       4       3       2       1
1        2        3        2        1
1         2         1

明らかなバグを無視して修正することすらできませんでしたが、それはクールに見えました。


20

Mathematica 83 49 43 54 51

Print@@#&/@(Sum[k~DiamondMatrix~17,{k,0,8}]/.0->" ")

フォーマットの改善


Kelly Lowderのおかげで3バイト節約されました。

分析

コードの主要部分であるWolframAlphaSum[DiamondMatrix[k, 17], {k, 0, 8}]で確認できます。

以下に、アプローチの基礎となるロジックを小規模で示します。

a = 0~DiamondMatrix~5;
b = 1~DiamondMatrix~5;
c = 2~DiamondMatrix~5;
d = a + b + c;
e = d /. 0 -> "";
Grid /@ {a, b, c, d, e}

グリッド


1
デビッド、あなたは今回私を打ちました!:-)
Mr.Wizard

1
別の試行(55文字):f = Table[# - Abs@k, {k, -8, 8}] &; f[f[9]] /. n_ /; n < 1 -> "" // Grid
DavidC

さらに別(71文字):Table[9 - ManhattanDistance[{9, 10}, {j, k}], {j, 18}, {k, 18}] /. n_ /; n < 1 -> "" // Grid
DavidC

2
Grid@#@#@9&[Table[#-Abs@k,{k,-8,8}]&]/.n_/;n<1->""50文字。
チャノッグ

コードの視覚的な表示:ArrayPlot[Sum[k~DiamondMatrix~17, {k, 0, 8}], AspectRatio -> 2]
DavidC

15

Python 2、72 69 67 61

賢くない:

s=str(111111111**2)
for i in map(int,s):print'%8s'%s[:i-1]+s[-i:]

1
Python 3+では機能しません。これは、印刷する引数の周りに括弧が必要です:(
Griffin

7
@Griffin:コードゴルフでは、printを関数にする必要があるかどうかに応じてPython 2またはPython 3を選択します。
スティーブンランバルスキー

3
s=`0x2bdc546291f4b1`
ニブラー

1
@gnibbler。非常に賢い提案。残念ながら、その16進数のreprには末尾にが含まれてい'L'ます。
スティーブンランバルスキー

1
@gnibbler:これは、64ビットプラットフォームで実行されているPythonで動作しますが、32ビットプラットフォームでは動作しません。
コンラッドボロスキー

14

C、79文字

v;main(i){for(;i<307;putchar(i++%18?v>8?32:57-v:10))v=abs(i%18-9)+abs(i/18-8);}

4
説明してください?
ルーカスエンリケ

1
@LucasHenrique合計307文字。i%18-9は、y軸でそれ自体をミラーリングするデカルト平面上のx値です。i / 18-8は、x軸でそれ自体をミラーリングするデカルト平面上のy値です。1の上に形成するための数値シフト引き起こす(1対角:1を得るためにそれらを一緒に合計1ダイヤモンド(32:57)ASCII 0-9のためのunichar数値です-v 10新しい行を。。。
アルバート・レンショウ

14

Pythonの2、60 59

for n in`111111111**2`:print`int('1'*int(n))**2`.center(17)

バックティックとレプユニットを乱用します。


inキーワードの後のスペースは、printキーボードで行ったように削除できます。
コンラッド

@GlitchMr:ありがとう!更新しました。
nneonneo

L中間の7行の出力に余分なものがあります。
スティーブンランバルスキー

すべきではない...どのバージョンのPythonを使用していますか?
-nneonneo

12

GolfScript、33 31 30文字

別のGolfScriptソリューション

17,{8-abs." "*10@-,1>.-1%1>n}%

@PeterTaylorに別の文字をありがとう。

以前のバージョン:

17,{8-abs" "*9,{)+}/9<.-1%1>+}%n*

オンラインで実行

17,{8-abs" "*9,{)+}/9<.-1%1>n}%

1
あなたは、スペースに番号を追加スキップして1つの文字を保存することができますので、あなたは、末尾のスペースを(問題のテキストがそれらを持っていない)必要がありません17,{8-abs." "*10@-,1>.-1%1>n}%
ピーター・テイラー

12

Mathematica 55 50 45 41 38

(10^{9-Abs@Range[-8,8]}-1)^2/81//Grid

Grid[(10^Array[{9}-Abs[#-9]&,17]-1)^2/81]

Mathematicaグラフィックス


1
とてもいい仕事です。
DavidC

@DavidCarraherありがとう:D-
チャノッグ

デビッドの発言を繰り返します。どうやってこれを思いついたの?
ミスターウィザード

私が書いた短い修正であなたの答えを更新できますか?
ミスターウィザード

@ Mr.Wizard確かに。
チャノッグ

10

Javascript、114

Codegolfの私の最初のエントリー!

for(l=n=1;l<18;n-=2*(++l>9)-1,console.log(s+z)){for(x=n,s="";x<9;x++)z=s+=" ";for(x=v=1;x<2*n;v-=2*(++x>n)-1)s+=v}

これをさらに短縮できる場合は、コメントしてください:)


畜生!!スペースを逃し、ダイヤモンドを半分にした。私は今眠らなければなりません
ジョムラー

9

PHP、92 90文字

<?for($a=-8;$a<9;$a++){for($b=-8;$b<9;){$c=abs($a)+abs($b++);echo$c>8?" ":9-$c;}echo"\n";}

中心からの位置のマンハッタン距離を計算して印刷します。1未満の場合、スペースを出力します。

匿名ユーザーは次の改善を提案しました(84文字):

<?for($a=-8;$a<9;$a++,print~õ)for($b=-8;$b<9;print$c>8?~ß:9-$c)$c=abs($a)+abs($b++);

2番目は機能しません。
クリスチャン

私はそれが非常に遅いことを知っていますが、PHPスクリプトを見たときは常にゴルフをする必要があります。メタごとにスキップされた83バイト。また、2番目のコードにエンコードの問題があるようです。<?
RedClover

@Soaku 2番目は私のものではありません。匿名ユーザーによる私の回答の編集として提案されました。私はチェックせずに追加しました-ユーザーが実際に自分の試みとして投稿しなかった理由が本当にわかりません。メタ質問では、この回答の日付がほぼ3年前です。
ガレス

つまり<?、バイトカウントに含めないということです。私も他のいくつかの改善を行いました。
RedClover

8

(非競合)、13バイト

言語が質問よりも(ずっと)新しいため、競合していません。

F⁹«GX⁻⁹ιI⁺ι¹→

オンラインでお試しください!

どうやって?

9つの連続したより小さい同心円の数字を重ねて描画します。

F⁹«   Loop ι from 0 to 8:
GX     Draw a (filled) polygon with four equilateral diagonal sides
⁻⁹ι      of length 9-ι
I⁺ι¹    using str(ι+1) as the character
→       Move right one space before drawing the next one

4
これは、メタの新しいコンセンサスに従って競合するはずです。
officialaimm

7

Common Lisp、113文字

(defun x(n)(if(= n 0)1(+(expt 10 n)(x(1- n)))))(dotimes(n 17)(format t"~17:@<~d~>~%"(expt(x(- 8(abs(- n 8))))2)))

まず、ダイヤモンドの要素は次のように表現できることに気付きました。

  1   =   1 ^ 2
 121  =  11 ^ 2
12321 = 111 ^ 2

x再帰的にベース(1、11、111など)を計算しformatます。これは2乗され、を中心に印刷されます。数字を最高の用語に上げて再び下げるには(- 8 (abs (- n 8)))、2番目のループを回避するために使用しました


7

JavaScript、81

for(i=9;--i+9;console.log(s))for(j=9;j;s=j--^9?k>0?k+s+k:" "+s:k+"")k=i<0?j+i:j-i

6

PowerShell(2オプション):92 84 45バイト

1..8+9..1|%{' '*(9-$_)+[int64]($x='1'*$_)*$x}
1..9+8..1|%{' '*(9-$_)+[int64]($x='1'*$_)*$x}

1 ^ 2,11 ^ 2,111 ^ 2を使用するためのヒントを提供してくれたStrigoidesに感謝します...


一部のキャラクターを次の方法で剃った:

  • 削除し$wます。
  • $x最初の使用の代わりにの定義を入れ子にしました。
  • Rynantのソリューションからいくつかの手がかりを得ました
    • +代わりに整数配列を組み合わせる,ことで、配列の周りの括弧を削除したり、ループ内の入れ子の層を削除したりできます。
    • 9-$_より複雑な数学やオブジェクトメソッドの代わりに、必要なスペースの長さを計算するために使用されます。これにより、の必要もなくなりました$y

説明:

1..8+9..1または1..9+8..1、1〜9の昇順で1に戻る整数の配列を生成します。

|%{... 組み込みのaliasを介し}て整数配列をForEach-Objectループにパイプし%ます。

' '*(9-$_)+ 9から現在の整数を減算し、この行の出力の先頭にその数のスペースの文字列を作成します。

[int64]($x='1'*$_)*$x現在の整数が大きい限り$x1sの文字列として定義されます。次に、int64に変換され(E表記を使用せずに111111111 2を適切に出力するために必要)、二乗されます。

ここに画像の説明を入力してください


1
long代わりにキャストすることでバイトを保存できますint64
ベスカ

バイトを保存する別の方法1..8+9..1|%{' '*(9-$_)+ +($x='1'*$_+'L')*$x}
奇抜な

5

Vim、62 39 38キーストローク

大量のバイトを節約してくれた@DJMcMayhemに感謝します!

私の最初のVimの回答、とても刺激的です!

i12345678987654321<ESC>qqYP9|xxI <ESC>YGpHq7@q

録音を介して数字を書き込もうとしましたが、ずっと長いです

オンラインでお試しください!

説明:

i123 ... 321<ESC>                   Write this in insert mode and enter normal mode
qq                                  Start recording into register q
  YP                                Yank this entire line and Paste above
    9|                              Go to the 9th column
      xx                            Delete character under cursor twice
        I <ESC>                     Go to the beginning of the line and insert a space and enter normal mode
               Y                    Yank this entire line
                G                   Go to the last line
                 p                  Paste in the line below
                  H                 Go to the first line
                   q                End recording
                    7@q             Repeat this 7 times

編集:

1バイトのH代わりに使用ggして保存しました


あなたは削除することができますmaし、変更`ai<space>しますI<space>
DJMcMayhem

あなたは上記の貼り付けに、ステージ1を変更した場合も、あなたはおそらく、ステージ3を削除できますし、以下の。
DJMcMayhem

@DJMcMayhemご提案ありがとうございます!私は当初、コピーしたビットに新しいレジスタを導入することを考えていましたが、これははるかに短いです!
Kritixi Lithos

5

APL(Dyalog Classic)20 19バイト

(⍉⊢⍪1↓⊖)⍣2⌽↑,⍨\1↓⎕d

オンラインでお試しください!

⎕d 数字です '0123456789'

1↓最初のドロップ('0'

,⍨\ スワップされたカテナテスキャン、つまり逆のプレフィックス '1' '21' '321' ... '987654321'

スペースで埋められた行列に混ぜる:

1
21
321
...
987654321

マトリックスを水平方向に反転します

(... )⍣2これを2回実行します。

⍉⊢⍪1↓⊖行列自体の転置()()垂直に連結された(最初の行のない垂直に反転した行列(1↓


4

R、71文字

レコードの場合:

s=c(1:9,8:1);for(i in s)cat(rep(" ",9-i),s[0:i],s[(i-1):0],"\n",sep="")

+ message(rep(" ",9-i),s[c(1:i,i:1-1)])
1-

あなたはそれがstderrに出力し、そしてあなたも行うことができることに留意する必要があると思います@flodel for(i in s<-c(1:9,8:1))...バイトを保存するために
ジュゼッペ・


4

k(64 50文字)

-1'(::;1_|:)@\:((|!9)#'" "),'$i*i:"J"$(1+!9)#'"1";

古い方法:

-1',/(::;1_|:)@\:((|!9)#\:" "),',/'+(::;1_'|:')@\:i#\:,/$i:1+!9;


(1+!9)#'"1"is,\9#"1"
ngn 16

4

CJam、31 27バイト

CJamはこのチャレンジよりもはるかに新しいため、この回答は受け入れられません。しかし、これはきちんとした土曜日の夕方の挑戦でした。;)

8S*9,:)+9*9/2%{_W%1>+z}2*N*

ここでテストしてください。

アイデアは、最初に左上の象限を形成することです。仕組みは次のとおりです。

まず、" 123456789"を使用して文字列を形成します8S*9,:)+。この文字列の長さは17文字です。ここで、文字列を9回繰り返してから、で長さ9の部分文字列に分割し9/ます。9と17の間の不一致は、1文字おきに1文字左にオフセットします。各部分文字列を独自の行に印刷すると、次のようになります。

        1
23456789 
       12
3456789  
      123
456789   
     1234
56789    
    12345
6789     
   123456
789      
  1234567
89       
 12345678
9        
123456789

したがって、1行おきにドロップするだけで(これはを実行すると便利になります2%)、必要に応じて1つの象限を取得します。

        1
       12
      123
     1234
    12345
   123456
  1234567
 12345678
123456789

最後に、これを2回ミラーリングし、2つのミラーリング操作が異なる軸に沿って進むようにグリッドを入れ替えます。ミラーリング自体は

_      "Duplicate all rows.";
 W%    "Reverse their order.";
   1>  "Discard the first row (the centre row).";
     + "Add the other rows.";

最後に、すべての行を改行で結合しN*ます。



3

ルビー、76文字

def f(a)a+a.reverse[1..-1]end;puts f [*1..9].map{|i|f([*1..i]*'').center 17}

改善を歓迎します。:)


1
69文字:f=->x{[*1..x]+[*1...x].reverse};puts f[9].map{|i|(f[i]*'').center 17}
パトリックオスシティ

素晴らしいコメント、「...」がわからず、これがどのように機能するか理解できませんでした。
GB

60文字:[*-8..8].map{|i|puts' '*i.abs+"#{eval [?1*(9-i.abs)]*2*?*}"}
GB

3

Befunge-93、155文字

9:v:<,+55<v5*88<v-\9:$_68v
> v>     ^>3p2vpv  -1<!  *
, 1^  2p45*3+9<4:    ,:  +
g -^_75g94+4pg7^!    +^ ,<
1 : ^ `0    :-1$_:68*^$
^1_$:55+\-0\>:#$1-#$:_^

オンラインでお試しください!

それは間違いなくもっとゴルフすることができますが、それは私の最初のFungeプログラムであり、私の頭はすでに痛いです。でもとても楽しかった


3

JavaScript、170バイト

私の最初のコードゴルフ:)

ゴルフ

a="";function b(c){a+=" ".repeat(10-c);for(i=1;i<c;i++)a+=i;for(i=2;i<c;i++)a+=c-i;a+="\n";}for(i=2;i<11;i++)b(i);for(i=9;i>1;i--)b(i);document.write("<pre>"+a+"</pre>");

非ゴルフ

var str = "";
function row(line) {
    str += " ".repeat(10 - line);
    for (var i = 1; i < line; i++) {
        str += i;
    }
    for (var i = 2; i < line; i++) {
        str += line - i;
    }
    str += "\n";
}
for (var line = 2; line < 11; line++) {
    row(line);
}
for (var line = 9; line > 1; line--) {
    row(line);
}
document.write("<pre>" + str + "</pre>");

PPCGへようこそ!
ЕвгенийНовиков

2

Perl 56 54文字

-pスイッチに1文字を追加しました。

平方レプユニットを使用してシーケンスを生成します。

s//12345678987654321/;s|(.)|$/.$"x(9-$1).(1x$1)**2|eg

2

Perl、43 + 1

+1を追加する-Eにはsay

say$"x(9-$_).(1x$_)**2for 1..9,reverse 1..8

編集:少し短縮


2

Python、65

for i in map(int,str(int('1'*9)**2)):print' '*(9-i),int('1'*i)**2

I=int;コードの先頭にintI
追加し

@Cyoce私はそのことを考えていました。int使用するたびに2文字節約され、3回使用されるため、6文字のコストで6文字節約されます。
cardboard_box

2

グルーヴィー77 75

i=(-8..9);i.each{a->i.each{c=a.abs()+it.abs();print c>8?' ':9-c};println""}

旧版:

(-8..9).each{a->(-8..9).each{c=a.abs()+it.abs();print c>8?' ':9-c};println""}

57文字のグルーヴィーなソリューションを追加しました。両方eachany2つの文字を保存するために置き換えることができます。
マティアスビャランド


2

Javascript、137

再帰あり:

function p(l,n,s){for(i=l;i;s+=" ",i--);for(i=1;i<=n;s+=i++);for(i-=2;i>0;s+=i--);return(s+="\n")+(l?p(l-1,n+1,"")+s:"")}alert(p(8,1,""))

CGで初めて:)

または118

111111111**2より高い精度で実行されるJS実装を見つけることができれば。
(こちら:12345678987654320)。

a="1",o="\n";for(i=0;i<9;i++,o+="         ".substr(i)+a*a+"\n",a+="1");for(i=8;i;i--)o+=o.split("\n")[i]+"\n";alert(o)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.