Toplamlar tablosu oluşturun


15

Rastgele sayılarla dolu 7 x 7 ızgarası oluşturun. Ancak, tek sıralı ve sütun numarasına sahip hücrelerde (0'dan başlayarak), çevresindeki hücrelerin toplamını kullanmanız gerekir. 3'e 3 ızgaralı küçük bir örnek (toplam kare kalın):

2 2  2
2 16 2
2 2  2

İşte 7'ye 7 tablo örneği:

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

kurallar

  • Toplam olmayan sayılar her zaman 1 ile 9 arasında olmalıdır.

  • Izgara rasgele oluşturulmalıdır. Her bir toplam için, hangi hanede bulunduğuna bakılmaksızın her basamağın eşit görünme şansı olmalıdır.

  • Sayılar hizalanmalıdır. Bu, bir sütundaki her sayının ilk veya son basamağının dikey olarak hizalanması gerektiği anlamına gelir. (Orta sayıların her zaman iki basamak olacağını varsayabilirsiniz.)

  • Çevredeki hücreler köşegenleri içerir. Bu nedenle, her bir toplamın karesinde, eklemeniz gereken sekiz sayı bulunur.

  • En kısa kod kazanır, çünkü bu .


3
O mu var ilk basamak olduğu satırları yukarı olmak? yani sonuncusu olabilir mi?
Volatilite

@Volatility Bence doğru hizalama işe yarayacaktır. edited
Doorknob

Bir dilin rastgele sayı oluşturucusu yoksa ne olur?
Heimdall

Yanıtlar:


14

APL, 53 49 43 42 40 39 36

;.AP'lerde J'leri kopyalamayı başardım ve 13 karakter tasarrufu sağlayarak Gareth'in yaklaşımını kullandım .

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

Örnek çalışma:

      {×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

Açıklama:

  • ∘.∨⍨9⍴0 1 bir bit maskesi oluşturur.
  • ×∘?∘9¨ her biti rastgele sayılarla 1'den 9'a kadar rastgele bir değerle çarpar ve rasgele sayıların maskelenmiş bir ızgarasını oluşturur.
  • 3,⌿3,/maskelenmiş dizideki 3'e 3 çakışan kutuların tümünü döndürmek için yalnızca hackery olarak tanımlanabilecekleri kullanır. Bunlar da süreçte düzleştirilir.
  • {×5⌷⍵:5⌷⍵⋄+/⍵}¨her öğeyi atayarak dizi üzerinden yineler . Her yineleme için beşinciyi alır (orta, APL dizinlemesinin 1 tabanlı olduğunu hatırlar) ve işaretini döndürür. Bu durumda, sayı 0'dan büyükse teste eşdeğerdir. Bu 1 döndürürse (true için), o öğeyi döndürür. Aksi takdirde, düzleştirilmiş 3 x 3 kutusundaki öğelerin toplamını döndürün. Birçok dilde :⋄eşdeğer olan üçlü operatörü kullanır ?:.

Hata. Daha fazla karakter tasarrufu bulmam gerekecek gibi görünüyor. : -S
Gareth

@Gareth iyi, bak burada ne var. Liderliğe geri döndüm: P
Volatility

Noooooooooo !!!!!!! :-(
Gareth

13

J, 63 61 59 55 52 51 49 47 39 37 karakterler

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

10 karakter tasarrufu için Volatility sayesinde .

Açıklama (her adımın farklı rasgele sayıları olacaktır ...):

Rasgele sayılar oluşturmak için maskeyi oluşturun (kullanır $:

   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

Şimdi bir kanca var . Bu aslında daha önceki bir versiyonda dolandığımdan beri mutlu bir kaza. Bu, devrik |:ve OR +.ile orijinal olması gerekiyordu. O zaman bir ve sıfır kullandığımdan beri mantıklıydı, ama şimdi dokuz ve sıfırlarım var. Sadece GCD anlamı ile aynı şekilde çalışır +.. Benim için şanslı. :-)

   (+.|:)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

Şimdi, 9'lu ve 0'lı bir ızgaraya sahip olduğumuza göre, bazı rastgele sayılar üretmek istiyoruz. ?0'dan belirli bir sayıya (ancak dahil değil) rastgele bir sayı üretir. Bir liste verildiğinde, listenin her üyesi için bu şekilde bir rastgele sayı üretilir. Bu durumda, tablodaki her 9 için 0 ile 8 arasında bir sayı ve her 0 için 0 ile 1 arasında bir kayan nokta sayısı oluşturur.

   ?(+.|:)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

Ama 0'dan 8'e değil, 1'den 9'a kadar sayılar istiyoruz. Bu yüzden 1 ekliyoruz.

   (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

Bu çok güzel ama istediğim sıfırları kaybettik, bu yüzden tüm dokuzları bire dönüştürdükten sonra orijinal maskeyle çarpacağız. Değeri bize verdiği bu büyük 1'den olup olmadığını kontrol ederek bunu yapın: (1&<*1+?).
Burada birkaç şey oluyor:

  • Çok az karaktere çok fazla iş eklememize izin veren bir çatal oluşturduk .
  • &1'i <fiile bağladık ( ) .

Böylece hepsi bir araya geldi (1&<*1+?)rastgele sayılar üretmek ve orijinal ızgarada sıfırlar tarafından üretilen tüm sayıları sıfırlar.

   (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

Sonraki bit (bence, her neyse :-) akıllı bit.
Kesilen ;.fiil, x u;._3 ygirdiyi tarif ettiği kutulara kesen xve daha sonra fiili uonlara uygulayan bir forma sahiptir . Bu durumda bizde var 3 3(4&{++/*0=4&{)@,;._3.

  • 3 3İstediğimiz kutuları anlatıyor - 3x3.
  • Bu (4&{++/*0=4&{)@,, her kutuya ne yapmak istediğimizi açıklayan bir fiil trenidir.

Her kutuyu göstermek için ;.kullanacağım fiili göstermek için <:

   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│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┘

Dikkat edilmesi gereken bazı noktalar:

  • Kutular üst üste bindirilir - sol üstteki kutudaki ikinci ve üçüncü sütunlar, sağdaki kutudaki birinci ve ikinci sütunlardır.
  • 7x7 kutu var. Bu yüzden başlangıçta 9x9 ızgaramız vardı.
  • Bir meblağ 0istediğimiz her yerin kutunun merkezinde bir vardır.

Şimdi ya ortadaki değeri (sıfır değilse) ya da 3x3 kutusundaki sayıları toplamalıyız (merkez sıfır ise).
Bunu yapmak için merkez numarasına kolay erişmemiz gerekir. ,burada yardımcı olur. Bu sayı 4. merkez numarası ile 9 öğe listesi içine 3x3 ızgara döner
4&{kullanacak {0 ile karşılaştırmak sonra ortadaki değeri çekin ve alıcı: 0=4&{. Bu , daha sonra toplamla çarptığımız doğru veya yanlış için bir 0veya döndürür . Merkezde sıfır olsaydı, şimdi gereken toplamı elde ederiz. Eğer sıfırımız yoksa, bitirmek için sadece merkez değerini ekleriz . Bu fiil trenini verir1+/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

Bir kod satırınız rasgele sayılar üretmek de dahil olmak üzere tüm bunları yapıyor mu? Güven ver bana. Sadece inanmak zor.
DavidC

Evet, inanması zor. Rastgele bit ?. Açıklamayı en yeni sürümü yansıtacak şekilde değiştireceğim.
Gareth

@DavidCarraher J'deki çoğu fiil 1 veya 2 karakterdir, bu nedenle 47 karakter çok fazla işte toplanabilir.
Gareth

9x9 kutunun 7x7 örtüşen karelere kesilmesi kesinlikle akıllıca bir bit. 10 dakikadan kısa bir süre içinde, geçerli GolfScript uygulamamı% 7,5 oranında yenmek için uygulayabildim.
Peter Taylor

Oh, görünüşe göre benim için çizim tahtasına geri döndü.
Volatilite

5

Ruby (135 karakter)

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}

Örnek çıktı

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  

Yıkmak

Bunun nasıl çalıştığı çok açık değil, bu yüzden hızlı bir arıza. NOT: Muhtemelen bu adımlardan bazılarını atlayabilir ve daha kısa sürümlere daha hızlı atlayabilirsiniz, ancak karakterleri tıraş ettiğim farklı yolları görmek için yeterince eğitici olduğunu düşünüyorum, özellikle 2 basamaklı sayıları 1 basamaklı sürümlere dönüştürmek için harfleri düzenleyerek .

Saf sürüm

İki boyutlu bir diziye dayanan diğer Ruby çözümlerinin aksine, 1 boyutlu bir diziden başlayıp kalıplar tekrarlandığından ofset değerleriyle çalışarak (sonunda) daha kısa bir sürüm elde edebilirsiniz.

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

Buradaki temel ilke, 8, 10, 12 dizin konumlarında çalışıyoruz. Sadece 14'ün katları ile dengeleniyoruz. 8, 10 ve 12 pozisyonları, topladığımız 3x3 ızgaralarının merkezleridir. Örnek çıktısında 34 konum 8, 42 konum 8 + 14 * 1 vb . [-8,-7,-6,-1,1,6,7,8]Konumdur 34 = sum(ary[8-8], ary[8-7], ..., ary[8+8]). Başka bir deyişle , konum 8'i konum 8'den ofset konumlarla değiştiririz . Aynı prensip [8 + 14*i, 10 + 14*i, 12 + 14*i], örüntü tekrarlandığından tüm değerleri için geçerlidir .

Optimize etme

İlk olarak, bazı hızlı optimizasyonlar:

  • Bunun yerine 3.times { ... }ve j + 14*iher seferinde hesaplama "inline" pozisyonları [8,10,12,22,24,26,36,38,40].
  • offsetsDizi çok sabitin değişkeni yerine, bir kere kullanılır.
  • Değiştir do ... endile {...}ve yazdırmayı etrafında geçiş $> << foo. (Burada puts nilve ile ilgili bir numara var () == nil.)
  • Daha kısa değişken adları.

Bundan sonraki kod 177 karakterdir:

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)}

Bir sonraki azaltma için, injectofset dizisinin sırayla olması gerekmediğini unutmayın . [-8,-7,-6,-1,1,6,7,8]Toplama değişmeli olduğu için ya ya da başka bir düzenimiz olabilir.

Bu yüzden önce pozitifleri ve negatifleri eşleştirin [1,-1,6,-6,7,-7,8,-8].

Şimdi kısaltabilirsiniz

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

için

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

Bu sonuç

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)}

ki bu 176 karakter.

8 ileri kaydırın ve farklılıklara geçin

İki karakterlik değişmez değerler kısaltılabilecek gibi görünüyor, bu nedenle döngü başlangıcında güncellenerek [8,10,12,22,24,26,36,38,40]her şeyi alıp aşağı kaydırın . ( Ofset değerlerini güncellemeniz gerekmediğini unutmayın .)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)}

Bu 179, daha büyük, ama j+=8aslında çıkarılabilir.

İlk değişiklik

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

farklılıklar dizisine:

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

ve bu değerleri bir baş harfine kümülatif olarak ekler j=8. Bu sonunda aynı değerleri kapsayacaktır. (Muhtemelen önce 8'e geçmek yerine doğrudan buna atlayabiliriz.)

Biz de bir kukla değer ekleriz Not 9999farklılıkları dizinin sonuna ve eklemek jde sonunda değil, başlangıç döngünün. Gerekçe, 3 kez tekrarlanan aynı 3 sayı olmaya çok yakın 2,2,10,2,2,10,2,2görünüyor ve döngünün sonunda hesaplayarak , son değerin çıktıyı etkilemeyeceği, çünkü bir değerin olduğu bir çağrı olmadığı için bitti .j+difference9999a[j]j10000

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)}

Bu farklılıklar dizisi ile, j+=8şimdi sadece j=8, tabii ki, aksi takdirde tekrar tekrar 8çok fazla eklerdik. Ayrıca blok değişkenini olarak jdeğiştirdik l.

Dolayısıyla, 9999öğenin çıktı üzerinde hiçbir etkisi olmadığından 10, diziyi değiştirebilir ve diziyi kısaltabiliriz.

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)}

Bu 170 karakterdir.

Ama şimdi j=8biraz hantal görünüyor ve atama için kullanabileceğiniz [2,2,10]bir rahatlık elde etmek için 2 karakter aşağı kaydırarak 2 karakter kaydedebilirsiniz 8. Bu aynı zamanda ihtiyacı j+=lolmak 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)}

Bu 169 karakterdir. 7 karakteri sıkmanın yuvarlak bir yolu, ama temiz.

Son düzenlemeler

values_atÇağrı aslında sıralama yedekli taşımaktadır ve bu konuda bir satır içine alabilirsiniz Array#[]çağrı. Yani

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

olur

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

Ayrıca , dizide bir ilk harfle flat_map+ + j+e/j-eişaretinin injectdaha doğrudan bir toplamaya indirgenebileceğini de görebilirsiniz 0.

Bu size 152 karakter bırakır :

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)}

En sonunda:

  • map.with_indexolabilir each_slice.
  • Yazdırma yaklaşımını değiştirin.

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}

Bir bayt eachile değiştirebilirsiniz map.
Ürdün

3

Python, 132

Bu, teknik olarak kuralları karşılamaz, çünkü her sayının son haneleri birinciden ziyade hizalanır. Ama yine de paylaşacağımı düşündüm:

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

Örnek çıktı:

[[ 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

Daha güzel çıktı Column/@için TableForm@2 karakterle değiştirilebilir.


Çok, çok akıllı. Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]daha temiz bir çıktı verir ve saydığınızda birkaç karakteri kaydeder. Btw, Wolfram'ın OneLinerSubmission şablonu 106 karakter, 105 karakter bir Transpose ile sayıldı.
DavidC

@DavidCarraher Teşekkürler. Karakter sayısı, :>unicode'un özel kullanım alanında olmasına rağmen, gereksiz satırsonu ve bir sembol olmasından kaynaklanmaktadır . Geçerlilik toplamı kuralı aktarımdan sonra bile geçerli olduğu için aktarım bile kaldırılabilir. Ancak Gridgirişler başka seçenekler olmadan hizalanmıyor gibi görünüyor (v8)
ssch

Gridsayıları sütunlar içinde ortalar. Teknik olarak, bu zorluğu tatmin etmez, ancak görüntülenen tabloda bir listenin görünmesinden daha iyi görünür.
DavidC

Çok hoş. Aynı şeyi yaratmak için çok zaman harcıyorum, sadece kullandımPart ve Tuples. Yakında yayınlanacak.
Mr.Wizard

p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
Bununla

3

GolfScript ( 79 78 72 70 68 66 65 60 karakter)

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

Not: Bu, Markdown'un iyi kırılabileceği bir hazır bilgi sekmesi içerir.

Akıllı bit Gareth'e bağlı: J çözümüne bakın.

Çevrimiçi demo


3

R: 114 karakter

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

İlk satır, 1'den 9'a kadar rastgele seçilen sayılarla dolu 7'den 7'ye bir dizi oluşturur ( r=Tbunun yerine, üniform dağılım, dolayısıyla bunun anlamı replace=TRUE). İkinci satır, toplam 3'e 3 ızgaraları hesaplayın, merkezi soyutlayın ve sonuç ile değiştirin. Üçüncü satır, sonuçta oluşan ızgarayı yazdırır (varsayılan olarak, matris ve dizi sütunları sağa hizalanır).

Örnek çıktı:

     [,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 bayt

J'de naif ve ayrıntılı bir çözüm. Görevin basit bir uygulamasıdır.

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

Önce 1 ile 9 arasında 7 x 7 tamsayı dizisi oluşturuyorum. Aslında J? fiil, argümanına kadar sayılar üretir, bu yüzden her bir elemanı arttırmamız gerekir,>:

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

Tek sıra / sütun hücrelerinin, tek sıra çift / sütun indekslerinin sıfırlanması için kullanılacak bir maske hazırlarım:

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

Katalog fiili {kutulu listenin içindeki atomlardan gelen öğeleri birleştirir

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

bir katalog oluşturmak için yukarıdaki çiftlerin 3x3 tablosu

Sonra 3x3 alt dizilerinin her birinin seçimi için kullanılacak bir satır / sütun indeks tablosu hazırlarım.

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 dizisindeki her çift için, m çiftinin her sayısı etrafında ortalanmış bir çift üçüz oluşturuyorum:

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

Bu üçüz çiftleri, aynı anda birden çok satır ve sütun seçebilen J From fiilinden {kullanılır. 0 1 2/2 3 4, 2, 3 ve 4 sütunlarıyla birlikte 0, 1 ve 2 satırlarını seçtiğim, böylece üstteki ikinci 3x3 alt dizisini seçtiğim anlamına gelir.

Son olarak, göreve ulaşmak için 7x7 dizisini ve maskeleri kullanabilirim: İlk olarak karşılık gelen öğeleri 0 olarak ayarlamak için maske olarak m kullanıyorum:

0 m}a

Sonra bir seçici olarak s kullanarak tüm 3x3 alt dizileri almak ve toplamlarını bulmak:

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

Sonra bu sayıları başlangıç ​​dizisine geri koydum.

 (+/^:_"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

Çevrimiçi deneyin!



1

Yakut, 207

Önce çözümümü sunacağım (her zaman yaptığım gibi):

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

Ruby, 150 karakter

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}

sol gereklilik gerekçesi haklıysa sadece ljustkullanılması gerekirdi ... iyi, hayır. Ruby'nin biçimlendirme yeteneklerini çok seviyorum.

Kullanmayın Array.new(7){...}. (0..6).map{...}hem daha kısa hem de daha okunabilir ve ücretsiz olarak atanabilir bir aralık elde edersiniz.

3 numaralı hat, Doorknob'un çözümünden ilham aldı .


1

GolfScript, 87 karakter

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

Orada çok fazla fermuar var ... ( çevrimiçi görün )

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 karakter

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

Spesifikasyon, sayıların sola hizalanmasını gerektirse de, ondalık gösterimi kullanmaya gerek yoktur, bu yüzden bu geçerli çıktıdır:

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

Sol hizalama yerine sağa hizalama kabul edilebilirse, 58 karakterdeyiz

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

J'lerin ":(format) üç formatlama modu vardır:

  • n basamaklı veya shrink-wrap ile sağa hizalanmış (varsayılan ekran)
  • toplamda n basamaklı ve m karakterli sola hizalanmış bilimsel gösterim
  • shrinkwrap kutulu ekran (sol / orta / sağ) - (üst / orta / alt) hizalama (aşağıda, 69 karakter)

En ayrıntılı ancak aynı zamanda en çok yönlü ve örneğe göre çıktı üretebilen tek 8!:2format, biçimlendirme dizesini sol argüman olarak alan yabancı biçimlendirmedir. Ayrıca 67 karakter :

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

Kutulu format:

 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 karakter

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

Bu, for döngülerinden biri hariç hepsinin daraltıldığı Perl betiklerinden biridir. map her şeyin çağrılara böylece her şey tek bir ifadede yapılabilir. Küresel değişkenler de bu konuda bazı önemli görünüme sahiptir. Sanırım burada söylemeye çalıştığım şey, bu program biraz iğrenç.

Bekle, daha da kötüleşiyor: Senaryoda bilinen bir hata var! Bununla birlikte, bir milyondan az bir sürede tetiklenme şansı var, bu yüzden henüz düzeltmek için uğraşmadım.


Bizi bekletme, hata nedir?

Bonus onu ilk fark eden kişiyi işaret eder!
ekmek kutusu

1

Mathematica , 106/100

Görmeden önce ssch koduna çok benzeyen bir şey buldum. Onun kullanma fikrini ödünç alıyorum Column. Yalnızca ASCII ile, 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 karakterlerle (ssch tarafından kullanıldığı gibi), 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 bayt

VBE çıkış fonksiyonu [B2:H9].

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

Örnek Çıktı

resim açıklamasını buraya girin


1

Powershell, 149 148 bayt

@AdmBorkBork sayesinde -1 bayt. Serin!

$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$_})

Açıklama:

$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
Bir bayttan (yeni satır) $aatamalarınızı parens içinde kapsülleyerek ve bir sonraki satırı yukarı doğru hareket ederek büyük bir çizgi oluşturabilirsiniz -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
AdmBorkBork

Hayır. Çalışmıyor. Dizi daha önce doldurulmalıdır $a[$i+$_]. İşte iki adım. Bir boruda kapsülleme için birkaç denemem oldu. :)
mazzy

1
Ödevin etrafına parens yerleştirmezseniz işe yaramaz. İle ($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))}), bir $asonraki ardışık düzen örneğinden önce tamamen doldurulur. Çalışmalı (en azından benim için çalışıyor).
AdmBorkBork

0

Mathematica 142 151 172 179

kod

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)

kullanım

z

m8


Sizde var 0; kurallar 1-9 diyor
Kapı tokmağı

Teşekkürler. Verileri ve resimleri düzelttim. Fonksiyonlar değişmeden kalır.
DavidC

Ayrıca, sayılar soruda belirtildiği gibi hizalanmaz.
Kapı tokmağı

Mathematica'nın ifadesi (veya daha doğrusu büyük kelimeleri kullanma ısrarı) belirginleşir.
DavidC

0

Julia 0.6 , 127 (89) bayt

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)

Çevrimiçi deneyin!

Ek satırlar yazdırılabilirse kabul edilebilecek yerel ekran kullanan 89 bayt:

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 bayt

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 sayesinde -12 bayt .

Açıklama:

Burada deneyin.

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 Teşekkürler! Ve varyerine Stringve +=Math.random()*9+1;yerine birkaç bayt tasarruf edebildim =(int)(Math.random()*9+1);. Aslında tüm eski cevaplarımı ziyaret etmeniz oldukça yararlı, haha! : D
Kevin Cruijssen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.