Hasilkan kotak 7 dengan 7, diisi dengan angka acak. Namun, dalam sel dengan nomor baris dan kolom ganjil (mulai dari 0), Anda harus menggunakan jumlah sel di sekitarnya. Berikut ini contoh kecil dengan kisi 3 x 3 (jumlah kuadrat tebal):
2 2 2
2 16 2
2 2 2
Dan inilah contoh 7 dengan 7 kotak:
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
Aturan
Angka yang bukan jumlah harus selalu antara 1 dan 9 inklusif.
Kotak harus dibuat secara acak. Untuk setiap non-penjumlahan, setiap digit harus memiliki kesempatan yang sama untuk tampil, terlepas dari sel yang ada di dalamnya.
Angka harus disejajarkan. Ini berarti bahwa digit pertama atau terakhir dari setiap angka dalam suatu kolom harus berbaris secara vertikal. (Anda dapat berasumsi bahwa angka tengah akan selalu dua digit.)
Sel yang mengelilinginya termasuk diagonal. Oleh karena itu, setiap jumlah kuadrat akan memiliki delapan angka yang mengelilinginya, yang harus Anda tambahkan.
Kode terpendek menang, karena ini kode-golf .
sumber
Jawaban:
APL,
53 49 43 42 40 3936Saya berhasil meniru J
;.
di APL, dan menggunakan pendekatan Gareth , menghemat 13 karakter.Contoh dijalankan:
Penjelasan:
∘.∨⍨9⍴0 1
menghasilkan topeng bit.×∘?∘9¨
mengalikan setiap bit dengan nilai acak dari 1 hingga 9 inklusif, menghasilkan grid bertopeng dari angka acak.3,⌿3,/
menggunakan apa yang hanya bisa digambarkan sebagai peretasan untuk mengembalikan semua kotak 3 dengan 3 yang tumpang tindih dalam array yang tertutup. Ini juga diratakan dalam proses.{×5⌷⍵:5⌷⍵⋄+/⍵}¨
iterates atas array, menugaskan masing-masing elemen⍵
. Untuk setiap iterasi, diperlukan yang kelima (tengah, mengingat bahwa pengindeksan APL berbasis 1), dan mengembalikan tanda. Dalam hal ini ini setara dengan pengujian jika angka lebih besar dari 0. Jika ini mengembalikan 1 (untuk true), maka kembalikan elemen itu. Jika tidak, kembalikan jumlah elemen dalam kotak 3 per 3 yang diratakan. Ini menggunakan:⋄
operator ternary, yang setara?:
dengan banyak bahasa.sumber
J,
63615955525149473937 karakterDengan terima kasih Volatility untuk penghematan 10 karakternya.
Penjelasan (setiap langkah akan memiliki angka acak yang berbeda ...):
Hasilkan topeng untuk menghasilkan angka acak (menggunakan
$
:Sekarang kita punya kail . Ini sebenarnya kecelakaan yang membahagiakan sejak saya mengurangi versi sebelumnya. Itu dimaksudkan untuk menjadi transpose
|:
dan OR+.
dengan aslinya. Masuk akal karena saya menggunakan yang dan nol pada saat itu, tetapi sekarang saya memiliki sembilan dan nol. Kebetulan bahwa ia bekerja dengan cara yang sama dengan makna GCD+.
. Beruntung bagiku. :-)Jadi, sekarang kita memiliki kisi 9s dan 0s kita ingin menghasilkan beberapa angka acak.
?
menghasilkan angka acak dari 0 hingga (tetapi tidak termasuk) nomor yang diberikan. Diberikan daftar itu akan menghasilkan satu nomor acak dengan cara ini untuk setiap anggota daftar. Jadi dalam hal ini akan menghasilkan angka dari 0 hingga 8 untuk setiap 9 dalam tabel dan angka floating point dari 0 hingga 1 untuk setiap 0.Tapi kami ingin angka dari 1 hingga 9 bukan 0 hingga 8. Jadi kami menambahkan 1.
Ini sangat bagus tapi kami kehilangan nol yang saya inginkan, jadi kami akan mengalikannya dengan topeng asli setelah mengubah semua sembilan menjadi yang. Saya melakukan ini dengan memeriksa jika nilai lebih besar dari 1. Yang memberi kita:
(1&<*1+?)
.Ada beberapa hal yang terjadi di sini:
&
) 1 ke<
kata kerja.Jadi semua yang digabungkan
(1&<*1+?)
menghasilkan angka acak, dan memberi nol pada semua angka yang mana dihasilkan oleh nol di grid asli.Bit berikutnya adalah (menurut saya, bagaimanapun juga :-) bit pintar.
Potongan
;.
kata kerja memiliki bentukx u;._3 y
yang memotong input ke dalam kotak yang dijelaskan olehx
, dan kemudian menerapkan kata kerja ituu
kepada mereka. Dalam hal ini yang kita miliki3 3(4&{++/*0=4&{)@,;._3
.3 3
menggambarkan kotak yang kita inginkan - 3x3.(4&{++/*0=4&{)@,
adalah kata kerja kereta yang menggambarkan apa yang ingin kita lakukan untuk setiap kotak.Untuk mendemonstrasikan
;.
kata kerja yang akan saya gunakan<
untuk menunjukkan setiap kotak:Beberapa hal yang perlu diperhatikan:
0
di pusat kotak.Sekarang kita hanya perlu memberikan nilai di tengah belakang (jika bukan nol) atau menjumlahkan angka dalam kotak 3x3 (jika pusatnya nol).
Untuk melakukan ini kita perlu akses mudah ke nomor pusat.
,
membantu di sini. Ternyata grid 3x3 ke daftar 9 item dengan nomor pusat di nomor 4.4&{
akan menggunakan{
untuk menarik keluar nilai pusat dan kemudian membandingkannya dengan 0:0=4&{
. Ini mengembalikan a0
atau1
untuk benar atau salah, yang kemudian kita kalikan dengan jumlah+/
. Jika nol di pusat kami sekarang memiliki jumlah kami seperti yang dipersyaratkan. Jika bukan kita memiliki nol, jadi untuk menyelesaikannya kita cukup menambahkan nilai tengah4&{+
.Ini memberikan kata kerja kereta
(4&{++/*0=4&{)@,
sumber
?
. Saya akan mengubah penjelasan untuk mencerminkan versi terbaru.Ruby (135 karakter)
Output sampel
Kerusakan
Tidak terlalu jelas bagaimana ini bekerja, jadi inilah uraian singkatnya. CATATAN: Anda mungkin dapat melewati beberapa langkah ini dan melompat ke versi yang lebih pendek dengan lebih cepat, tetapi saya pikir ini cukup mendidik untuk melihat berbagai cara saya mencukur karakter, terutama dengan melihat pola dalam literal untuk mengubah angka 2 digit menjadi versi 1 digit .
Versi naif
Berbeda dengan solusi Ruby lainnya yang mengandalkan array dua dimensi, Anda (akhirnya) bisa mendapatkan versi yang lebih pendek dengan memulai dengan array 1 dimensi dan bekerja dengan nilai offset, karena pola-pola tersebut berulang.
Prinsip utama di sini adalah bahwa kami bekerja pada posisi indeks 8, 10, 12, hanya diimbangi dengan kelipatan 14. Posisi 8, 10 dan 12 adalah pusat dari kisi 3x3 yang kami simpulkan. Dalam output sampel, 34 adalah posisi 8, 42 adalah posisi 8 + 14 * 1, dll. Kami mengganti posisi 8 dengan posisi 34 dengan mengimbangi dari posisi 8 dengan
[-8,-7,-6,-1,1,6,7,8]
- dengan kata lain34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])
. Prinsip yang sama berlaku untuk semua nilai[8 + 14*i, 10 + 14*i, 12 + 14*i]
, karena polanya berulang.Mengoptimalkannya
Pertama, beberapa optimisasi cepat:
3.times { ... }
, dan menghitungj + 14*i
setiap waktu, "sebariskan" posisi[8,10,12,22,24,26,36,38,40]
.offsets
array digunakan sekali, sehingga mengganti variabel dengan literal tersebut.do ... end
dengan{...}
dan beralih ke pencetakan$> << foo
. (Ada trik di sini yang melibatkanputs nil
dan() == nil
.)Kode setelah ini adalah 177 karakter:
Untuk reduksi berikutnya, perhatikan bahwa
inject
array offset tidak perlu berurutan. Kami dapat memiliki[-8,-7,-6,-1,1,6,7,8]
atau memesan lainnya, karena penambahan bersifat komutatif.Jadi pertama-tama pasangkan hal positif dan negatif untuk didapatkan
[1,-1,6,-6,7,-7,8,-8]
.Sekarang Anda bisa mempersingkat
untuk
Ini menghasilkan
yaitu 176 karakter.
Bergeser 8 dan pindah ke perbedaan
Nilai-nilai literal dua karakter sepertinya dapat dipersingkat, jadi ambil
[8,10,12,22,24,26,36,38,40]
dan geser semuanya dengan8
, memperbaruij
pada awal loop. (Perhatikan bahwa Anda+=8
tidak perlu memperbarui nilai ofset dari1,6,7,8
.)Ini 179, yang lebih besar, tetapi
j+=8
sebenarnya bisa dihilangkan.Perubahan pertama
ke berbagai perbedaan:
dan secara kumulatif menambahkan nilai-nilai ini ke awal
j=8
. Ini pada akhirnya akan mencakup nilai yang sama. (Kami mungkin bisa langsung beralih ke ini alih-alih menggeser 8 terlebih dahulu.)Perhatikan bahwa kami juga akan menambahkan nilai dummy
9999
ke akhir array perbedaan, dan menambahkannyaj
di akhir , bukan awal dari loop. Pembenarannya adalah bahwa2,2,10,2,2,10,2,2
terlihat sangat dekat dengan menjadi 3 angka yang sama diulang 3 kali, dan dengan menghitungj+difference
pada akhir loop, nilai akhir dari9999
tidak akan benar-benar mempengaruhi output, karena tidak adaa[j]
panggilan di manaj
ada beberapa nilai selesai10000
.Dengan array perbedaan ini,
j+=8
sekarang hanyaj=8
, tentu saja, karena kalau tidak kita akan berulang kali menambahkan8
terlalu banyak. Kami juga telah mengubah variabel blok darij
menjadil
.Jadi karena
9999
elemen tidak berpengaruh pada output, kita dapat mengubahnya10
dan mempersingkat array.Ini adalah 170 karakter.
Tapi sekarang
j=8
tampilannya agak kikuk, dan Anda dapat menyimpan 2 karakter dengan menggeser[2,2,10]
ke bawah 2 untuk mendapatkan yang8
dapat Anda gunakan untuk tugas. Ini juga perluj+=l
menjadij+=l+2
.Ini adalah 169 karakter. Cara memutar untuk memeras 7 karakter, tapi rapi.
Tweak terakhir
The
values_at
panggilan sebenarnya semacam berlebihan, dan kami dapat inline sebuahArray#[]
panggilan. Begitumenjadi
Anda juga dapat mengetahui bahwa
flat_map
+j+e/j-e
+inject
dapat direduksi menjadi penjumlahan yang lebih langsung dengan inisial0
dalam array.Ini memberi Anda 152 karakter:
Akhirnya:
map.with_index
bisa menjadieach_slice
.135 :
sumber
each
denganmap
untuk satu byte.Python, 132
Secara teknis ini tidak memenuhi aturan, karena angka terakhir dari setiap angka disejajarkan daripada yang pertama. Tapi saya pikir saya akan tetap berbagi:
Output sampel:
sumber
Mathematica, 108
Untuk output yang lebih cantik
Column/@
dapat diganti denganTableForm@
biaya 2 karakter.sumber
Grid[ReplacePart[ g, {i_?EvenQ, j_?EvenQ} :> g[[s@i, s@j]]~Total~2 - g[[i, j]]]\[Transpose]]
memberikan output yang lebih bersih dan menyimpan beberapa karakter jika Anda menghitung Transpose sebagai karakter tunggal, yang ada di Mathmatica. Btw, templat OneLinerSubmission Wolfram menghitung 106 karakter, 105 dengan satu karakter Transpose.:>
menjadi satu simbol, meskipun itu berada di area penggunaan pribadi unicode. Seseorang bahkan dapat menghapus transposisi, karena aturan penjumlahan validitas berlaku bahkan setelah transposisi. Tapi sepertinyaGrid
tidak menyelaraskan entri tanpa opsi lebih lanjut (v8)Grid
pusat angka dalam kolom. Secara teknis, itu tidak akan memuaskan tantangan, tetapi memang terlihat lebih baik daripada memiliki daftar yang muncul di tabel yang ditampilkan.Part
danTuples
. Posting segera.p=2|4|6;Column/@ReplacePart[g,{i:p,j:p}:>g[[s@i,s@j]]~Total~2-g[[i,j]]]
GolfScript (
79 78 72 70 68 66 6560 karakter)NB Ini berisi tab literal, yang mungkin rusak oleh penurunan harga.
Agak pandai itu karena Gareth: lihat solusi J-nya.
Demo online
sumber
R: 114 karakter
Baris pertama membuat array 7 dengan 7 diisi dengan angka yang dipilih secara acak dari 1 hingga 9 (distribusi seragam dengan penggantian, karenanya
r=T
merupakan kepanjangan darireplace=TRUE
). Baris kedua, hitung jumlah 3 oleh 3 kisi, kurangi pusat dan gantikan dengan hasilnya. Baris ketiga cetak kisi-kisi yang dihasilkan (secara default, kolom matriks dan array disejajarkan dengan benar).Contoh output:
sumber
J,
6765 byteSolusi naif dan verbose dalam J. Ini adalah implementasi langsung dari tugas.
Pertama saya membuat array integer 7 x 7 antara 1 dan 9. Sebenarnya J's? kata kerja menghasilkan angka hingga argumennya, itu sebabnya kita perlu meningkatkan setiap elemen,>: di J
Saya menyiapkan topeng yang akan digunakan untuk mem-nolkan baris baris / kolom ganjil, sepasang indeks baris / kolom ganjil:
Kata kerja Katalog {menggabungkan item dari atom di dalam daftar kotak
untuk membentuk katalog, tabel 3x3 dari pasangan di atas
Kemudian saya menyiapkan tabel indeks baris / kolom yang akan digunakan untuk pemilihan masing-masing subarrays 3x3.
Untuk setiap pasangan dalam array m, saya membuat sepasang kembar tiga, berpusat di sekitar setiap jumlah pasangan m:
Pasangan kembar tiga ini digunakan oleh kata kerja J From {, yang dapat memilih beberapa baris dan kolom secara bersamaan. 0 1 2/2 3 4 berarti saya memilih baris 0, 1 dan 2 bersamaan dengan kolom 2, 3 dan 4, sehingga memilih subarray 3x3 kedua di atas.
Akhirnya, saya bisa menggunakan array 7x7 dan topeng untuk mencapai tugas: Pertama saya menggunakan m sebagai topeng untuk mengatur elemen yang sesuai ke 0:
Lalu saya mengambil semua subarrays 3x3 menggunakan s sebagai pemilih dan menemukan jumlah mereka:
Lalu saya memasukkan angka-angka ini kembali ke array awal.
Cobalah online!
sumber
APL (Dyalog Unicode) ,
323130 byte SBCS-1 byte terima kasih kepada @jslip
Cobalah online!
sumber
∧/¨~
->⍱/¨
Ruby, 207
Saya akan menyajikan solusi saya terlebih dahulu (seperti yang selalu saya lakukan):
sumber
Ruby, 150 karakter
jika persyaratan justifikasi kiri justifikasi hanya itu
ljust
harus digunakan ... baik, tidak. Saya suka kemampuan format Ruby.Jangan gunakan
Array.new(7){...}
.(0..6).map{...}
keduanya lebih pendek dan lebih mudah dibaca dan Anda mendapatkan rentang yang ditetapkan secara gratis.Baris # 3 terinspirasi oleh solusi Doorknob .
sumber
GolfScript, 87 karakter
Ada terlalu banyak ritsleting di sana ... (lihat online )
sumber
J, 58/64/67 karakter
Sementara spesifikasi membutuhkan angka-angka agar rata, tidak ada persyaratan untuk menggunakan notasi desimal, jadi saya kira ini adalah output yang valid:
Jika perataan kanan alih-alih keselarasan kiri dapat diterima, kita berada di 58 karakter
J
":
(format) memiliki tiga mode pemformatan:Yang paling verbose tetapi juga paling serbaguna dan satu-satunya yang dapat menghasilkan output seperti contohnya adalah
8!:2
format asing, yang mengambil string format sebagai argumen kirinya. Juga 67 karakter :Berikut format kotaknya:
sumber
Perl, 117 karakter
Ini adalah salah satu skrip Perl di mana semua kecuali satu untuk for loop telah diciutkan
map
panggilan sehingga semuanya dapat dilakukan dalam satu pernyataan. Variabel global juga membuat beberapa penampilan penting dalam hal ini. Saya kira yang ingin saya katakan di sini adalah, program ini agak kotor.Tunggu, itu semakin buruk: Ada bug yang dikenal dalam skrip! Namun, ia memiliki kurang dari satu dalam sejuta peluang untuk dipicu, jadi saya belum sempat memperbaikinya.
sumber
Mathematica , 106/100
Saya datang dengan sesuatu yang sangat mirip dengan kode ssch, sebelum melihatnya. Saya meminjam idenya untuk menggunakan
Column
. Dengan ASCII saja, 106 :Dengan karakter Unicode (seperti yang digunakan oleh ssch), 100 :
sumber
Excel VBA, 74 byte
Fungsi VBE langsung yang menghasilkan
[B2:H9]
.Output Sampel
sumber
Powershell,
149148 byte-1 byte terima kasih kepada @AdmBorkBork. Itu keren!
Penjelasan:
sumber
$a
tugas Anda dalam parens dan memindahkan baris berikutnya ke atas untuk membuat satu baris besar -($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})|?{++$i;!$_}|%{6..8+1|%{$_,-$_}|%{$a[$i]+=$a[$i+$_]}}
$a[$i+$_]
. Jadi, inilah dua langkah. Saya memiliki beberapa upaya untuk merangkum dalam satu pipa. :)($a=(,1*8+0,1*3)*3+,1*7|%{$_*(1+(Random 9))})
,$a
terisi penuh sebelum instance pipa berikutnya. Itu harus bekerja (setidaknya, itu cocok untuk saya).Mathematica
142 151 172179Kode
Pemakaian
sumber
0
; aturan mengatakan 1-9Julia 0.6 , 127 (89) byte
Cobalah online!
89 byte menggunakan tampilan asli, yang mungkin diterima jika garis tambahan dapat dicetak:
sumber
Java 10,
262260248239 bytes-12 byte terima kasih kepada @ceilingcat .
Penjelasan:
Coba di sini.
sumber
var
bukannyaString
dan+=Math.random()*9+1;
bukannya=(int)(Math.random()*9+1);
. Ini sebenarnya cukup berguna bagi Anda untuk mengunjungi semua jawaban lama saya, haha! : D