合計のグリッドを生成する


15

乱数で満たされた7 x 7のグリッドを生成します。ただし、行番号と列番号が奇数(0から始まる)のセルでは、周囲のセルの合計を使用する必要があります。次に、3 x 3グリッド(太字の二乗和)を使用した小さな例を示します。

2 2  2
2 16 2
2 2  2

次に、7 x 7グリッドの例を示します。

6 5  4 3  7 2  5
6 43 3 50 8 43 8
4 7  8 8  9 3  1
4 36 1 43 6 40 5
3 3  6 1  4 7  5
4 35 3 45 9 42 1
2 6  8 6  8 5  3

ルール

  • 合計ではない数値は、常に1から9の間でなければなりません。

  • グリッドはランダムに生成する必要があります。合計以外の場合、どのセルにあるかに関係なく、すべての数字が表示される機会が等しくなければなりません。

  • 数字を揃える必要があります。これは、列の各数値の最初または最後の数字が垂直に並ぶ必要があることを意味します。(中央の数字は常に2桁であると仮定することができます。)

  • 周囲のセルには対角線が含まれます。そのため、各合計平方には8つの数値があり、追加する必要があります。

  • これはであるため、最短のコードが優先されます。


3
並んでいる最初の数字でなければなりませんか?すなわち、それは最後にすることができますか?
ボラティリティ

@Volatility右揃えが機能すると思います。編集
ドアノブ

言語に乱数ジェネレーターがない場合はどうなりますか?
ハイムダル

回答:


14

APL、53 49 43 42 40 39 36

私はなんとか;.APLでJを複製し、13文字を節約するGarethのアプローチを使用しました。

{×5⌷⍵:5⌷⍵⋄+/⍵}¨3,⌿3,/×∘?∘9¨∘.∨⍨9⍴0 1

サンプル実行:

      {×5⌷⍵:5⌷⍵⋄+/⍵}¨3,⌿3,/×∘?∘9¨∘.∨⍨9⍴0 1
9  9 6  1 7  5 6
7 55 5 39 9 54 9
9  8 2  1 8  1 9
2 43 8 41 6 42 5
7  3 4  4 8  3 2
2 29 1 26 2 35 8
6  4 2  3 2  3 7

説明:

  • ∘.∨⍨9⍴0 1 ビットマスクを生成します。
  • ×∘?∘9¨ 各ビットに1から9までのランダムな値を乗算し、マスクされた乱数のグリッドを生成します。
  • 3,⌿3,/ハッカリーとしか言えないものを使用して、マスクされた配列内の3 x 3のすべての重複するボックスを返します。これらもプロセスで平坦化されます。
  • {×5⌷⍵:5⌷⍵⋄+/⍵}¨配列を反復処理して、各要素をに割り当てます。反復ごとに、5番目(中間、APLインデックス付けは1ベースであることを思い出して)を取り、その符号を返します。この場合、これは、数値が0より大きいかどうかをテストすることと同等です。これが1(true)を返す場合、その要素を返します。それ以外の場合は、平坦化された3 x 3ボックス内の要素の合計を返します。:⋄3項演算子を使用し?:ます。これは、多くの言語と同等です。

ええとああ。キャラクターをもっと節約する必要があるようです。:-S-
ガレス

@Garethよく、ここにあるものを見てください。私は先頭に戻りました:P-
ボラティリティ

NOOOOOOOOOO !!!!!!! :-(
ガレス

13

J、63 61 59 55 52 51 49 47 39 37文字

3 3(4&{+4{*|+/)@,;._3(**1+?)+./~9$0 9

Volatilityのおかげで、彼の10キャラクターを節約できました。

説明(各ステップには異なる乱数があります...):

乱数を生成するためのマスクを生成します(使用$

   9 9$9$0 9
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0
0 9 0 9 0 9 0 9 0

これでフックができました。これは、以前のバージョンを口whiで吹いていたときの幸せな事故です。これは、転置|:および+.オリジナルとのOR を意味していました。当時は1と0を使用していたので理にかなっていますが、現在は9と0があります。GCDの意味と同じように機能するのはまさにそのためです+.。ラッキー。:-)

   (+.|:)9 9$9$0 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0
9 9 9 9 9 9 9 9 9
0 9 0 9 0 9 0 9 0

したがって、9と0のグリッドがあるので、いくつかの乱数を生成したいと思います。?0から(指定されていない)与えられた数までの乱数を生成します。リストが与えられると、リストの各メンバーに対してこの方法で1つの乱数を生成します。そのため、この場合、テーブル内の9ごとに0から8までの数値を生成し、0ごとに0から1までの浮動小数点数を生成します。

   ?(+.|:)9 9$9$0 9
 0.832573 7 0.926379 7 0.775468 6 0.535925 3  0.828123
        7 0        5 5        4 3        4 5         4
0.0944584 2 0.840913 2 0.990768 1 0.853054 3  0.881741
        3 8        7 0        8 3        3 4         8
 0.641563 4 0.699892 7 0.498026 1 0.438401 6  0.417791
        6 8        7 5        2 3        6 6         3
 0.753671 6 0.487016 4 0.886369 7 0.489956 5  0.902991
        3 4        7 8        1 4        8 0         8
0.0833539 4 0.311055 4 0.200411 6 0.247177 5 0.0464731

ただし、0〜8ではなく1〜9の数値が必要です。したがって、1を追加します。

   (1+?)(+.|:)9 9$9$0 9
 1.4139 4  1.7547 7 1.67065 4 1.52987 1 1.96275
      2 8       2 4       3 9       6 9       9
1.15202 7 1.11341 5  1.0836 1 1.24713 2 1.13858
      9 3       3 2       4 7       3 8       6
1.06383 9 1.67909 4 1.09801 8  1.4805 6  1.0171
      9 5       5 5       9 5       9 4       3
1.22819 1 1.85259 4 1.95632 6 1.33034 3 1.39417
      4 2       5 1       3 7       2 5       6
1.06572 5  1.9942 5 1.78341 5 1.16516 6 1.37087

これは非常に良いことですが、必要なゼロを失ったので、9をすべて1に変えた後、元のマスクを掛けます。これは、値が1より大きいかどうかを確認することで行います(1&<*1+?)
ここでいくつかのことが行われています:

  • フォークを作成しました多くの作業をごく少数のキャラクターにまとめることができるを。
  • &1を<動詞に結合()しました。

したがって、すべての組み合わせ(1&<*1+?)は乱数を生成し、元のグリッドのゼロによって生成されたすべての数値をゼロにします。

   (1&<*1+?)(+.|:)9 9$9$0 9
0 3 0 2 0 7 0 1 0
9 5 2 7 7 1 4 5 7
0 6 0 8 0 3 0 1 0
4 8 7 5 9 7 7 9 4
0 9 0 6 0 9 0 9 0
6 1 2 1 4 6 8 9 4
0 3 0 8 0 6 0 6 0
2 5 2 2 2 2 3 9 3
0 9 0 3 0 5 0 3 0

次のビットは(とにかく:-)賢いビットです。
カット;.動詞はx u;._3 y、入力をで記述されたボックスにカットしてから、それらにx適用する形式を持っuています。この場合、3 3(4&{++/*0=4&{)@,;._3ます。

  • 3 33x3の-私たちが望むのボックスを記述しています。
  • これ(4&{++/*0=4&{)@,は、各ボックスに対して何をしたいのかを説明する動詞列です。

実証するために、;.私が使用しますVERB <各ボックスを表示するには:

   3 3(<);._3(1&<*1+?)(+.|:)9 9$9$0 9
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 8 0│8 0 7│0 7 0│7 0 4│0 4 0│4 0 3│0 3 0│
│9 1 3│1 3 2│3 2 3│2 3 8│3 8 5│8 5 5│5 5 9│
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│9 1 3│1 3 2│3 2 3│2 3 8│3 8 5│8 5 5│5 5 9│
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 6 0│6 0 1│0 1 0│1 0 2│0 2 0│2 0 4│0 4 0│
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│7 1 6│1 6 7│6 7 1│7 1 2│1 2 1│2 1 6│1 6 1│
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 7 0│7 0 5│0 5 0│5 0 9│0 9 0│9 0 7│0 7 0│
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│7 9 9│9 9 7│9 7 1│7 1 9│1 9 4│9 4 9│4 9 5│
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
│3 1 6│1 6 1│6 1 7│1 7 6│7 6 8│6 8 9│8 9 9│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 3 0│3 0 2│0 2 0│2 0 7│0 7 0│7 0 9│0 9 0│
│3 1 6│1 6 1│6 1 7│1 7 6│7 6 8│6 8 9│8 9 9│
│0 9 0│9 0 3│0 3 0│3 0 4│0 4 0│4 0 3│0 3 0│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘

注目すべき点:

  • ボックスは重なります-左上のボックスの2番目と3番目の列は、右側のボックスの1番目と2番目です。
  • 7x7ボックスがあります。そのため、最初は9x9のグリッドがありました。
  • 合計が必要な各場所には0、ボックスの中央にあります。

ここで、中央の値を戻す(ゼロ以外の場合)か、3x3ボックスの数値を合計する(中央がゼロの場合)必要があります。
これを行うには、センター番号に簡単にアクセスする必要があります。,ここで役立ちます。これは、数4で中心番号の9つの項目のリストに3×3のグリッドをオンに
4&{使用する{中央値を引き出すために、次いで0と比較します:0=4&{。これはtrueまたはfalseの0or 1を返し、それからsumを掛け+/ます。中心でゼロだった場合、必要に応じて合計が得られます。ゼロでない場合は、終了するために、中心値を追加します4&{+
これは動詞列を与えます(4&{++/*0=4&{)@,

   3 3(4&{++/*0=4&{)@,;._3(1&<*1+?)(+.|:)9 9$9$0 9
2  6 9  3 7  9 7
3 47 6 51 5 49 5
3  9 9  6 6  2 8
7 48 6 47 1 37 5
5  4 5  7 7  2 6
5 35 3 49 8 51 9
1  6 6  6 7  4 8

あなたの1行のコードは、乱数の生成を含めて、それをすべて行いますか?安心して。信じ難いだけです。
DavidC

信じられないかもしれませんが ランダムビットはによって行われます?。最新バージョンを反映するように説明を変更します。
ガレス

@DavidCarraher Jのほとんどの動詞は1文字または2文字であるため、47文字で多くの作業を行うことができます。
ガレス

9x9ボックスを7x7の重なり合う正方形に切り分けるのは間違いなく賢い方法です。10分も経たないうちに、現在のGolfScript実装を7.5%上回るように適用することができました。
ピーターテイラー

まあ、それは私のために図面に戻っているように見えます。
ボラティリティ

5

ルビー(135文字)

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}

サンプル出力

2  1  6  9  4  5  1  
9  34 4  37 2  31 3  
7  2  3  1  8  1  7  
5  42 4  40 2  47 9  
3  9  9  4  9  4  7  
3  44 4  41 2  47 4  
6  9  1  5  7  6  8  

壊す

これがどのように機能するかはあまり明らかではないので、ここで簡単な内訳を示します。注意:これらの手順の一部をスキップして短いバージョンにすばやくジャンプすることもできますが、特にリテラルのパターンを見つけて2桁の数字を1桁のバージョンに変換することで、文字を削るさまざまな方法を見るのに十分な教育だと思います。

素朴なバージョン

2次元配列に依存する他のRubyソリューションとは異なり、パターンが繰り返されるため、1次元配列から始めてオフセット値を操作することにより、(最終的に)短いバージョンを取得できます。

ary=(0..48).map { rand(9) + 1 }

offsets = [-8,-7,-6,-1,1,6,7,8]

3.times do |i|
  [8,10,12].each do |j|
    ary[j + 14*i] = ary.values_at(*offsets.map { |e| j+14*i + e }).inject(:+)
  end
end

ary.each.with_index do |e,i|
  $> << ("%-3s" % e)
  $> << ?\n if i % 7==6
end

ここでの重要な原則は、インデックス位置8、10、12で作業していることです。14の倍数だけオフセットしています。位置8、10、および12は、合計する3x3グリッドの中心です。サンプル出力では、34は位置8、42は位置8 + 14 * 1などです。位置8を位置8から[-8,-7,-6,-1,1,6,7,8]—、つまり34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])。この同じ原則は、[8 + 14*i, 10 + 14*i, 12 + 14*i]パターンが繰り返されるため、ます。

最適化する

まず、いくつかの簡単な最適化:

  • の代わりに3.times { ... }j + 14*i毎回計算して、位置を「インライン化」し[8,10,12,22,24,26,36,38,40]ます。
  • offsets配列は、そのリテラルと変数を置き換え、一度使用されています。
  • に置き換えdo ... end{...}、印刷をに切り替え$> << fooます。(ここにとを含むトリックがputs nilあり() == nilます。)
  • より短い変数名。

この後のコードは177文字です。

a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[-8,-7,-6,-1,1,6,7,8].map{|e|j+e}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

次のリダクションでinjectは、オフセット配列を順番に並べる必要がないことに注意してください。[-8,-7,-6,-1,1,6,7,8]加算は可換であるため、順序を付けることも、他の順序にすることもできます。

したがって、最初に正と負を組み合わせて取得し[1,-1,6,-6,7,-7,8,-8]ます。

これで短縮できます

[1,-1,6,-6,7,-7,8,-8].map { |e| j+e }.inject(:+)

[1,6,7,8].flat_map { |e| [j+e, j-e] }

これにより

a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

これは176の文字。

8シフトして違いに移動する

2文字のリテラル値は短縮できるように見えるので、ループの開始時に更新して[8,10,12,22,24,26,36,38,40]すべてを下にシフトします。(のオフセット値を更新する必要がなくなることに注意してください。)8j+=81,6,7,8

a=(0..48).map{rand(9)+1}
[0,2,4,14,16,18,28,30,32].each{|j|j+=8;a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

これは179です。これは大きいですが、j+=8実際には削除できます。

最初の変更

[0,2,4,14,16,18,28,30,32]

違いの配列へ:

[2,2,10,2,2,10,2,2]

そして、これらの値を累積的にinitialに追加しますj=8。これは最終的に同じ値をカバーします。(最初に8ずつシフトするのではなく、おそらくこれに直接スキップできます。)

我々はまたのダミーの値を追加しますことを注意9999違い配列の末尾に、そしてに追加j終わりではなく、スタートループのを。正当な理由があるということ2,2,10,2,2,10,2,2ルックスとても近い同じ3つの数字であることには、3回繰り返して、計算することによって、j+differenceループの最後で、最終的な値が9999存在しないので、実際に、出力には影響しませんa[j]呼び出しj、いくつかの値であるが、以上10000

a=(0..48).map{rand(9)+1}
j=8
[2,2,10,2,2,10,2,2,9999].each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

この差分配列を使用するj+=8j=8、もちろん、が8多すぎます。また、ブロック変数をからjに変更しましたl

したがって、9999要素は出力に影響を与えないため、要素を変更して10配列を短くすることができます。

a=(0..48).map{rand(9)+1}
j=8
([2,2,10]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

これは170文字です。

しかし、今はj=8少し不格好になり、割り当てに使用できるよう[2,2,10]に便利に取得するために2ずつシフトダウンすることで2文字を節約8できます。これもj+=lになる必要がありますj+=l+2

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

これは169文字です。7文字を圧縮するための回り道ですが、それはすっきりしています。

最終調整

values_at呼び出しは、実際にソート冗長であり、そして我々は、インライン化することができますArray#[]コールを。そう

a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)

になる

[1,6,7,8].flat_map{|e|[a[j+e],a[j-e]]}.inject(:+)

また、配列内のイニシャルを使用して、flat_map+ j+e/j-e+ injectをより直接的な合計に削減できることを確認できます0

これにより、152文字が残ります。

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}

最後に:

  • map.with_indexになることができeach_sliceます。
  • 印刷方法を変更します。

135

a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}

あなたは置き換えることができますeachmap1バイトのために。
ヨルダン

3

Python、132

各数値の最後の桁は最初の桁ではなく揃えられているため、これは技術的にルールを満たしていません。しかし、私はとにかく共有すると思いました:

import numpy
G=numpy.random.randint(1,10,(7,7))
G[1::2,1::2]=sum(G[i:6+i:2,j:6+j:2]for i in[0,1,2]for j in[0,1,2]if i&j!=1)
print G

サンプル出力:

[[ 8  9  8  3  8  5  8]
 [ 6 53  4 45  8 53  8]
 [ 8  2  8  1  5  3  8]
 [ 2 40  6 34  1 32  7]
 [ 4  1  9  1  3  3  2]
 [ 4 35  7 35  6 31  1]
 [ 1  7  2  5  2  8  6]]

3

Mathematica、108

s=#-1;;#+1&;g=1+8~RandomInteger~{7,7};Column/@
ReplacePart[g,{i_?EvenQ,j_?EvenQ}:>g〚s@i,s@j〛~Total~2-g〚i,j〛]

result

よりきれいColumn/@にするTableForm@には、2文字のコストで出力を置き換えることができます。


とても賢い。Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]TransposeをMathmaticaの単一の文字としてカウントする場合、出力がよりきれいになり、数文字が保存されます。ところで、WolframのOneLinerSubmissionテンプレートは106文字をカウントし、105文字は1文字のトランスポーズです。
DavidC

@DavidCarraherありがとう。文字カウントは不要な改行と:>1つのシンボルであるためですが、Unicodeのプライベート使用領域にあります。有効な加算規則は転置後も保持されるため、転置を削除することもできます。しかし、Grid追加のオプション(v8)なしでエントリを揃えないようです
-ssch

Grid列内の数値を中央揃えにします。技術的には、これは課題を満たしませんが、表示されたテーブルにリストを表示するよりも見栄えがよくなります。
DavidC

非常に素晴らしい。私はちょうど私だけを使用し、同じものを作成し、かなりの時間を費やすPartTuples。すぐに投稿します。
Mr.Wizard

これで2つのキャラクターを保存できますp=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
。– Mr.Wizard

3

GolfScript(79 78 72 70 68 66 65 60文字)

56,{13%5<,~9rand)}%9/`{>3<zip`{>3<(*(+(\{+}*or' '}+7,%n}+7,/

NBこれにはリテラルタブが含まれていますが、Markdownは壊れる可能性があります。

巧妙な部分はGarethによるものです。彼のJソリューションをご覧ください。

オンラインデモ


3

R:114文字

a=array(sample(1:9,49,r=T),c(7,7))
for(i in 2*1:3){for(j in 2*1:3)a[i,j]=sum(a[(i-1):(i+1),(j-1):(j+1)])-a[i,j]}
a

最初の行は、それ故に1から9までのランダムに選ばれた数字で満たさ7 7によって配列(置換を有する均一な分布を作成r=Tするためのスタンドreplace=TRUE)。2行目、3 x 3グリッドの合計を計算し、中心を減算して結果で置き換えます。3行目は結果のグリッドを印刷します(デフォルトでは、行列と配列の列は右揃えになります)。

出力例:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    8    5    6    4    3    2    2
[2,]    1   37    6   41    7   38    8
[3,]    5    3    3    3    9    4    3
[4,]    4   31    3   41    3   44    9
[5,]    3    5    5    9    6    7    3
[6,]    3   32    2   40    4   37    5
[7,]    8    2    4    1    9    1    2

2

J、67 65バイト

Jの単純で冗長なソリューション。タスクの簡単な実装です。

(+/^:_"2((,&.>/@(<:,],>:)"0)&.>m){0 m}a)(m=.{;~1 3 5)}a=.>:?7 7$9

最初に、1〜9の整数の7 x 7配列を作成します。実際、Jの?verbは引数までの数値を生成するため、各要素をインクリメントする必要があります。>:J

a=.>:?7 7$9 
2 8 7 4 4 5 1
4 5 4 1 6 7 9
3 8 3 6 5 3 3
6 8 6 3 7 7 1
7 7 4 4 5 9 9
2 3 6 5 2 2 9
2 2 6 8 8 1 3

奇数行/列セル、奇数行/列インデックスのペアのゼロ化に使用するマスクを準備します。

m=.{;~1 3 5
┌───┬───┬───┐
│1 1│1 3│1 5│
├───┼───┼───┤
│3 1│3 3│3 5│
├───┼───┼───┤
│5 1│5 3│5 5│
└───┴───┴───┘

カタログ動詞{は、ボックス化されたリスト内のアトムのアイテムを結合します

┌─────┬─────┐
│1 3 5│1 3 5│
└─────┴─────┘

カタログを作成するには、上のペアの3x3テーブル

次に、各3x3サブアレイの選択に使用する行/列インデックスのテーブルを準備します。

s=.(,&.>/@(<:,],>:)"0)&.>m
┌─────────────┬─────────────┬─────────────┐
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││0 1 2│0 1 2│││0 1 2│2 3 4│││0 1 2│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
├─────────────┼─────────────┼─────────────┤
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││2 3 4│0 1 2│││2 3 4│2 3 4│││2 3 4│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
├─────────────┼─────────────┼─────────────┤
│┌─────┬─────┐│┌─────┬─────┐│┌─────┬─────┐│
││4 5 6│0 1 2│││4 5 6│2 3 4│││4 5 6│4 5 6││
│└─────┴─────┘│└─────┴─────┘│└─────┴─────┘│
└─────────────┴─────────────┴─────────────┘

m配列の各ペアに対して、mペアの各数を中心としたトリプレットのペアを作成します。

        ┌─────┬─────┐
 1 3 -> │0 1 2│2 3 4│
        └─────┴─────┘

これらのトリプレットのペアは、J From動詞{によって使用され、複数の行と列を同時に選択できます。0 1 2/2 3 4は、行0、1、2を列2、3、4とともに選択し、上部の2番目の3x3サブアレイを選択することを意味します。

最後に、7x7配列とマスクを使用してタスクを実行できます。最初に、mをマスクとして使用して、対応する要素を0に設定します。

0 m}a

次に、sをセレクターとして使用してすべての3x3サブアレイを取得し、それらの合計を見つけます。

+/^:_"2 s{0 m}a

次に、これらの数値を開始配列に戻します。

 (+/^:_"2 s{0 m}a)m}a 
2 8 7 4 4 5 1
4 39 4 39 6 36 9
3 8 3 6 5 3 3
6 44 6 40 7 42 1
7 7 4 4 5 9 9
2 36 6 43 2 46 9
2 2 6 8 8 1 3

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



1

ルビー、207

最初に解決策を提示します(いつものように):

a=Array.new(7){Array.new(7){rand(9)+1}}
s=[-1,0,1]
s=s.product s
s.slice!4
r=[1,3,5]
r.product(r).map{|x|u=0
s.map{|y|u+=a[x[0]+y[0]][x[1]+y[1]]}
a[x[0]][x[1]]=u}
puts a.map{|x|x.map{|y|y.to_s.ljust 3}.join

1

ルビー、150文字

v=(a=0..6).map{a.map{rand(9)+1}}
(o=[1,3,5]).map{|i|o.map{|j|v[i][j]=0
(d=[0,-1,1]).map{|r|d.map{|c|v[i][j]+=v[i+r][j+c]}}}}
puts v.map{|r|"%-3d"*7%r}

左揃え要件の正当化がそれだけである場合 ljust使用する必要がある場合は...まあ、いいえ。Rubyのフォーマット機能が大好きです。

使用しないでくださいArray.new(7){...}(0..6).map{...}短くて読みやすく無料で割り当て可能な範囲を取得できます。

Doorknobのソリューションに触発された3行目。


1

GolfScript、87文字

49,{.1&\7/1&!|9rand)*}%.7/{[..1>@0\+]zip{{+}*}%);}:^%zip{^~}%]zip{.0=!=}%{'  '+3<}%7/n*

zipが多すぎます...(オンラインを参照)

3  9  9  3  3  9  8  
6  46 2  50 3  39 8  
7  3  7  2  4  7  3  
8  33 9  51 8  49 5  
4  3  9  9  3  9  2  
1  45 9  41 6  33 2  
4  3  6  1  6  1  4  

1

J、58/64/67文字

0j_1":(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

仕様では数値を左揃えにする必要がありますが、10進表記を使用する必要はないため、これは有効な出力だと思います。

1.0e0 8.0e0 9.0e0 6.0e0 2.0e0 9.0e0 6.0e0
6.0e0 3.9e1 8.0e0 4.0e1 2.0e0 3.8e1 4.0e0
1.0e0 4.0e0 2.0e0 8.0e0 3.0e0 9.0e0 3.0e0
2.0e0 2.4e1 5.0e0 4.1e1 9.0e0 4.7e1 8.0e0
1.0e0 3.0e0 6.0e0 5.0e0 3.0e0 5.0e0 7.0e0
4.0e0 3.0e1 1.0e0 2.3e1 1.0e0 3.1e1 1.0e0
6.0e0 5.0e0 4.0e0 2.0e0 1.0e0 5.0e0 8.0e0

左揃えではなく右揃えが許容される場合、58文字になります

(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

J ":(フォーマット)には3つのフォーマットモードがあります。

  • n桁またはシュリンクラップで右揃え(デフォルト表示)
  • 合計n桁およびm文字の左揃えの科学表記法
  • (左/中央/右)-(上/中央/下)の位置合わせ(下、69文字)を使用したシュリンクラップボックス表示

最も冗長であるが、最も用途が広く、例のように出力を生成できるのは、8!:2外部引数の書式設定だけです。これは、左側の引数として書式設定文字列を取ります。また67文字

'l3.'8!:2(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

ボックス形式は次のとおりです。

 0 0":<"0(7$0,:7$0 1){"0 1 |:>v;v-~7 7{.0,.0,3+/\"1]3+/\v=.1+?7 7$9

 ┌─┬──┬─┬──┬─┬──┬─┐
 │2│6 │5│7 │5│7 │6│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│40│4│35│9│49│6│
 ├─┼──┼─┼──┼─┼──┼─┤ 
 │6│7 │2│2 │1│9 │6│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│41│9│35│3│45│7│
 ├─┼──┼─┼──┼─┼──┼─┤
 │3│1 │5│6 │7│8 │4│
 ├─┼──┼─┼──┼─┼──┼─┤
 │7│37│4│45│6│48│8│
 ├─┼──┼─┼──┼─┼──┼─┤
 │8│4 │5│4 │8│1 │6│
 └─┴──┴─┴──┴─┴──┴─┘

1

Perl、117文字

print$_,++$j%7?$":$/for map{++$i/7&$i%7&1?
eval join"+",@x[map{$i+$_,$i-$_}1,6,7,8]:" $_"}@x=map{1+int rand 9}$i--..48

これは、forループの1つを除くすべてが折りたたまれたPerlスクリプトの1つです。 map呼び出しにいるため、すべてを1つのステートメントで実行できる。グローバル変数も、この変数にいくつかの重要な出現をします。私がここで言いたいことは、このプログラムは少しグロスだと思います。

ちょっと待ってください。スクリプトに既知のバグがあります。ただし、トリガーされる可能性は100万分の1未満なので、まだ修正するまでには至っていません。


我慢しないでください、バグは何ですか?

ボーナスは、それを見つけた最初の人を指します!
breadbox

1

Mathematica、106/100

それを見る前に、私はsschのコードに非常によく似たものを思いつきました。彼のアイデアを借りていColumnます。ASCIIのみの場合、106

s=#-1;;#+1&
a=8~RandomInteger~{7,7}+1
a[[##]]=a[[s@#,s@#2]]~Total~2-a[[##]];&@@@{2,4,6}~Tuples~2
Column/@a

Unicode文字(sschで使用)、100の場合

s=#-1;;#+1&
a=8~RandomInteger~{7,7}+1
a〚##〛=a〚s@#,s@#2〛~Total~2-a〚##〛;&@@@{2,4,6}~Tuples~2
Column/@a

1

Excel VBA、74バイト

に出力するVBE即時関数[B2:H9]

[B2:H9]="=IF(ISODD(ROW()*COLUMN()),SUM(A1:C1,A2,C2,A3:C3),INT(RAND()*8)+1)

サンプル出力

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


1

Powershell、149 148バイト

@AdmBorkBorkのおかげで-1バイト。かっこいいね!

$i=-1
($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
-join($a|%{if(!(++$i%7)){"
"};'{0,3}'-f$_})

説明:

$i=-1                       # let $i store -1
($a=                        # let $a is array of random numbers with zero holes
    (,1*8+0,1*3)*3+,1*7|    # the one-dimension array equals
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
                            # 1 0 1 0 1 0 1
                            # 1 1 1 1 1 1 1
    %{                      # for each element
        $_*(1+(Random 9))   # multiply 0 or 1 element to random digit from 1 to 9
    }                       # now $a stores values like (* is a random digit from 1 to 9)
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
                            # * 0 * 0 * 0 *
                            # * * * * * * *
)|?{++$i;!$_                # calc index $i and passthru values == 0 only
}|%{                        # for each zero value cell with index $i
    6..8+1|%{               # offsets for the surrounding cells
                            #  .  .  .
                            #  .  x +1
                            # +6 +7 +8  
        $_,-$_              # add the mirror offsets 
                            # -8 -7 -6
                            # -1  x +1
                            # +6 +7 +8  
    }|%{                    # for each offset 
        $a[$i]+=$a[$i+$_]   # add surrounding values to the cell
    }
}
                            # display the $a
-join(
    $a|%{                   # for each value of $a
        if(!(++$i%7)){"`n"} # line break for each 7 cells
        '{0,3}'-f$_         # formatted value of $a with width = 3 char and align right
    }
)                           # join all values to string

1
あなたはカプセル化することにより、バイト(改行)を取り除くことができます$a括弧内の割り当てをし、一つの大きなラインを作るために次の行を上に移動-($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
AdmBorkBork

いいえ。機能しません。配列は、前に完全に設定する必要があります$a[$i+$_]。したがって、2つのステップがあります。1つのパイプにカプセル化するいくつかの試みがありました。:)
mazzy

1
割り当ての周りに括弧を配置しないと機能しません。では($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})$a次のパイプラインインスタンスの前に完全に入力されます。動作するはずです(少なくとも、私には役立ちます)。
AdmBorkBork

0

Mathematica 142 151 172 179

コード

z = (m = RandomInteger[{1, 9}, {7, 7}]; s = SparseArray; o = OddQ; e = EvenQ; i = {1, 1, 1};
(m + ArrayPad[ListCorrelate[{i, i, i}, m] s[{{i_, j_} /; o@i \[And] o@j -> 1}, {5, 5}], 1]
- 2 m s[{{i_, j_} /; e@i \[And] e@j -> 1}, {7, 7}]) // Grid)

使用法

z

m8


あなたが持ってい0ます; ルールには1-9と記載されています
ドアノブ

ありがとう。データと写真を修正しました。機能は変更されません。
DavidC

また、質問で指定されているように番号が揃えられていません。
ドアノブ

Mathematicaの言葉遣い(または、より正確には、大きな単語の使用に固執する)が明らかになります。
DavidC

0

ジュリア0.6、127(89)バイト

x=rand(1:9,7,7);[x[i,j]=sum(!(0==k==l)*x[i+k,j+l]for k=-1:1,l=-1:1)for i=2:2:7,j=2:2:7]
Base.showarray(STDOUT,x,1<1;header=1<1)

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

追加の行を印刷できる場合は、ネイティブディスプレイを使用して89バイトを許容できます。

7×7 Array{Int64,2}:
6   6  8   2  3   2  3
7  44  5  33  4  23  5
3   8  1   9  1   3  2
4  41  2  37  5  22  2
7   8  8   8  3   4  2
9  53  6  44  7  36  3
7   7  1   9  2   6  9

0

Java 10、262 260 248 239バイト

v->{int a[][]=new int[7][7],i=49,j,k;for(;i-->0;)a[i/7][i%7]+=Math.random()*9+1;var r="";for(;++i<7;r+="\n")for(j=0;j<7;r+=(k=a[i][j])>9|j++%2<1?k+" ":k+"  ")if(i*j%2>0)for(a[i][j]=k=0;k<9;k++)a[i][j]+=k!=4?a[i+k/3-1][j+k%3-1]:0;return r;}

@ceilingcatのおかげで-12バイト。

説明:

ここで試してみてください。

v->{                        // Method with empty unused parameter and String return-type
  int a[][]=new int[7][7],  //  Integer-matrix with 7x7 zeroes
      i=49,j,k;             //  Index integers (`i` starting at 49)
  for(;i-->0;)              //  Loop `i` in the range (49, 0]:
    a[i/7][j%7]+=Math.random()*9+1;
                            //   Fill the current cell with a random 1..9 integer
  var r="";                 //  Result-String, starting empty
  for(;++i<7;               //  Loop `i` in the range [0, 7):
      r+="\n")              //    After every iteration: append a new-line to the result
    for(j=0;j<7;            //   Inner loop `j` in the range [0, 7):
        r+=                 //     After every iteration: append the result-String with:
           (k=a[i][j])>9    //      If the current number has 2 digits,
           |j++%2<1?        //      or it's an even column (indices 0/2/4/6)
            k+" "           //       Append the current number appended with one space
           :                //      Else:
            k+"  ")         //       Append the current number appended with two spaces
      if(i*j%2>1)           //    If both indexes `i` and `j` are odd
        for(a[i][j]=k=0;    //     Reset both the current item and index `k` to 0
            k<9;k++)        //     Inner loop `k` in the range [0, 9):
          a[i][j]+=         //      Sum the item at location `i,j` with:
           k!=4?            //       If `k` is not 4 (the current item itself)
            a[i+k/3-1][j+k%3-1]
                            //        Sum it with the numbers surrounding it
           :                //       Else:
            0;              //        Leave it the same by adding 0
  return r;}                //  Return the result-String

@ceilingcatありがとう!そして、のvar代わりにStringとの+=Math.random()*9+1;代わりに、さらに数バイトを保存することができました=(int)(Math.random()*9+1);。私の古い答えをすべて訪問することは実際にかなり便利です、ハハ!:D
ケビンクルーイッセン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.