Sebuah persegi sihir adalah array persegi angka dengan sisi n terdiri dari bilangan bulat positif yang berbeda 1, 2, ..., n ² diatur sedemikian rupa sehingga jumlah dari n angka dalam setiap horisontal, vertikal, atau jalur utama diagonal selalu nomor yang sama, yang dikenal sebagai konstanta sihir.
Program Anda harus memasukkan, melalui std-in, angka yang menentukan panjang sisi bujur sangkar Anda, kemudian angka-angka di bujur sangkar. Tidak ada nomor dapat digunakan lebih dari sekali, tidak ada nomor lebih besar dari n ² dapat digunakan, dan semua nomor harus lebih besar dari 0. Program harus menentukan apakah yang kombinasi angka adalah sihir persegi.
(i,j)
lebih efisien sebagai satu nomorx
, mengambili=x%C
danj=x/C
untuk beberapa yang cukup besarC
. Mungkin bisa mencobanya nanti.APL, 35
Penjelasan
x←⎕⍴⍨,⍨⎕
meminta input, membentuknya menjadi matriks, dan menetapkan untukx
⌽
Membalikkan matriks kiri-ke-kananx(...)
Buat array matriks:x
danx
membalikkan1 1∘⍉¨
Untuk masing-masing matriks, ambil+/↑
bentuk diagonal 2 × n matriks dari angka-angka pada mereka diagonal dan jumlah baris⍉x
Transposex
x,
lalu gabungkan denganx
untuk membentuk matriks × 2n+⌿
dan jumlah kolom(+⌿x,⍉x),+/↑1 1∘⍉¨x(⌽x←⎕⍴⍨,⍨⎕)
menyatukan untuk membentuk array dari jumlah2=/
memeriksa apakah pasangan berturut-turut sama∧/
dan DAN bersama-sama semua hasil itusumber
Mathematica
128125Mengambil input seperti
sumber
Input[r=Reverse]
untuk menghemat satu byte.#&@@
byte lebih pendek dari[[1]]
. Anda juga dapat menggunakan notasi infiksPartition
untuk byte lain. DanThread
seharusnya bekerjaTranspose
. Atau, gunakan karakter Unicode ini sebagai operator perbaikan pos (Mathematica menggunakannya untuk superscript T untuk transpose).APL
4732Menggunakan solusi hebat TwiNight dan menerapkan beberapa penyesuaian lainnya:
Penjelasan:
Ini menggunakan kereta fungsi, yang diperkenalkan pada v14 dari juru bahasa Dyalog. APL dijalankan dari kanan ke kiri, ⎕ adalah input, jadi pertama dimensi, lalu vektor angka.
⎕⍴⍨, ⍨⎕ menciptakan matriks NxN
Setelah itu muncul function train yang pada dasarnya hanya urutan fungsi (antara kurung) yang diterapkan pada argumen yang benar. Fungsinya adalah:
⊢ Mengembalikan argumen yang tepat (yaitu matriks)
⍉ Mengubah matriks argumen yang tepat
1 1∘⍉ Mengembalikan diagonal
1 1∘⍉∘⌽ Mengembalikan diagonal dari matriks yang terbalik (horizontal)
Semua hasil digabungkan dengan fungsi ","
Pada titik ini, hasilnya adalah matriks yang kolomnya kemudian dijumlahkan (+ ⌿). Nilai yang diperoleh dengan cara ini kemudian diperiksa agar sama dengan ∧ / 2 = /
Saya akan meninggalkan solusi lama saya di sini juga:
mengambil dimensi sebagai argumen kiri, vektor elemen sebagai argumen kanan, misalnya:
Dapat dicoba online di sini: www.tryapl.org
sumber
GolfScript 67 ( demo )
sumber
JavaScript (E6) 194
Menggunakan prompt untuk membaca input dan menampilkan output.
Tes di konsol dengan FireFox> 31 (Array.fill sangat baru)
Kurang golf
sumber
Pyth,
2430 byteCobalah online di sini .
Sunting: memperbaiki bug, terima kasih kepada @KevinCruijssen karena memberi tahu saya: o)
sumber
True
kotak ajaib dengan angka yang terlalu besar, atau tidak semuanya unik. Yaitu4
dan[12,26,23,13,21,15,18,20,17,19,22,16,24,14,11,25]
atau4
dan[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
output keduanyaTrue
. (Hampir semua jawaban yang ada memiliki masalah yang sama, tetapi karena mereka diposting lebih dari 4 tahun yang lalu saya tidak repot-repot memperbaiki kesalahan mereka dalam komentar.)LUA 186 Chars
sumber
05AB1E , 24 byte
Format input:
4\n[2,16,13,3,11,5,8,10,7,9,12,6,14,4,1,15]
. Keluaran1
/0
untuk kebenaran / kepalsuan masing-masing.Cobalah secara online atau verifikasi beberapa kasus uji lagi .
Penjelasan:
sumber