disclaimer: Saya tidak mengetahui adanya solusi non-bruteforce
Kotak Graeco-Latin adalah, untuk dua set dengan panjang yang sama , sebuah pengaturan sel, masing-masing berisi pasangan elemen set pertama dan elemen dari set kedua yang unik (melintasi seluruh kotak). sedemikian rupa sehingga semua elemen pertama dan semua elemen kedua dari pasangan unik di baris dan kolom mereka. Paling set yang umum digunakan adalah, sebagai salah satu bisa menebak, pertama huruf dari Yunani dan huruf Latin.
Berikut adalah gambar kotak Graeco-Latin 4x4:
Kotak Graeco-Latin sama bermanfaatnya dengan suara mereka ( artikel Wikipedia menyebutkan "desain eksperimen, penjadwalan turnamen, dan pembuatan kotak ajaib"). Tugas Anda adalah, diberi bilangan bulat positif , untuk menghasilkan Graeco-Latin.
Memasukkan
Bilangan bulat positif ; dijamin bahwa Graeco-Latin square (yaitu, ).
Keluaran
Sebuah persegi Graeco-Latin dengan panjang sisi n sebagai larik dua dimensi, larik larik, larik yang rata atau dihasilkan secara langsung.
Catatan
- Anda tidak harus menggunakan huruf Yunani dan Latin secara khusus; misalnya, mengeluarkan pasangan bilangan bulat positif juga diizinkan.
- Jika Anda memilih untuk menggunakan alfabet yang tidak dapat diperpanjang secara sewenang-wenang, Anda harus (secara teoritis; kode Anda tidak harus selesai sebelum kematian panas alam semesta) mendukung panjang sisi maksimal minimal 20.
Ini adalah kode-golf , jadi kode terpendek menang!
Jawaban:
Jelly ,
2120 byte-1 berkat Nick Kennedy (opsi output datar memungkinkan byte penyimpanan )→
ż"þ`ẎẎQƑ$Ƈ
F€p`Z€QƑƇ
Cobalah online! (Terlalu lambat untuk
4
dalam 60-an pada TIO, tetapi jika kita mengganti kekuatan Cartesianṗ
,, dengan Kombinasiœc
, itu akan selesai - meskipun 5 pasti tidak akan!)Bagaimana?
sumber
05AB1E ,
262322 byte-3 byte terima kasih kepada Emigna
-1 byte terima kasih kepada Kevin Cruijssen
Cobalah online!
sumber
n<ÝI‰
bisa<Ýã
<Ý
bisaL
. Terima kasih!ê}DIùQ
bisaÙgQ}P
untuk menyimpan byte.R ,
164148 byte-banyak byte berkat Giuseppe.
Cobalah online!
Secara efisien tidak efisien - saya pikir ini bahkan lebih buruk daripada pendekatan brute force lainnya. Bahkan untuk
n=3
, itu mungkin akan habis pada TIO. Berikut adalah versi alternatif (155 byte) yang berfungsin=3
dalam waktu sekitar 1 detik.m
l
g
all(1:n^2%in%(n*l+g-n))
l
g
l
dang
kotak latin?!
l
g
2^l
l
t(l)
l
g
sd
Catatan terakhir: seperti yang sering dalam golf kode R, saya menggunakan variabel
T
, yang diinisialisasi sebagaiTRUE
, untuk mendapatkan beberapa byte. Tetapi ini berarti bahwa ketika saya membutuhkan nilai aktualTRUE
dalam definisim
(parameterreplace
dalamsample
), saya harus menggunakan1
alih-alihT
. Demikian pula, karena saya mendefinisikan ulang!
sebagai fungsi yang berbeda dari negasi, saya harus menggunakan1-all(...)
sebagai ganti!all(...)
.sumber
JavaScript (ES6),
159 147140 byteIni adalah pencarian brute force yang sederhana, dan karenanya sangat lambat.
Cobalah online! (dengan output prettified)
Berkomentar
sumber
o
; Anda bisa kembalim
pada akhir untuk 141Haskell ,
207 143233 byteCobalah online!
OK, saya pikir saya akhirnya mendapatkannya kali ini. Ini berfungsi dengan baik untuk n = 5, n = 6 kali keluar pada TIO tapi saya pikir itu mungkin saja karena algoritma baru ini sangat tidak efisien dan pada dasarnya memeriksa semua kemungkinan sampai menemukan satu yang berfungsi. Saya menjalankan n = 6 di laptop saya sekarang untuk melihat apakah itu berakhir dengan lebih banyak waktu.
Sekali lagi terima kasih kepada @someone untuk menunjukkan bug di versi saya sebelumnya
sumber
C #,
520506494484 byteAlgoritma findinf a square sangat sederhana. Itu adalah ... bruteforce. Ya, itu bodoh, tetapi kode golf bukan tentang kecepatan suatu program, bukan?
Kode sebelum membuatnya lebih singkat:
Sekarang, jika Anda ingin mengujinya dengan n = 3 Anda akan harus menunggu seperti satu jam, jadi di sini adalah versi lain:
Perbarui: lupa menghapus "publik".
Pembaruan: digunakan "Sistem." alih-alih "menggunakan Sistem;"; Juga, terima kasih kepada Kevin Cruijssen , menggunakan "a" bukannya "args".
Perbarui: terima kasih kepada gastropner dan seseorang .
sumber
args
bisaa
:)for(X = 0; X < Y; X++)
kefor(X = Y; X-->0; )
, yang seharusnya menghemat satu byte per loop.i = 0
dalam definisii
dan menyimpan byte.System
. Jugaif((m[i,j,k]=(m[i,j,k]+ 1) % n)!=0)
bisaif((m[i,j,k]=-~m[i,j,k]%n)>0)
.Write
atau bisa menyimpan byte dengan menambahkan\n
ke string di dalam panggilan atau jika tidak rusak. Saya pikir Anda juga dapat mengembalikan array secara langsung.Oktaf , 182 byte
Metode brute force, TIO terus menghitung waktu dan saya harus menjalankannya beberapa kali untuk mendapatkan output untuk n = 3, tetapi secara teoritis ini seharusnya baik-baik saja. Alih-alih pasangan seperti (1,2) itu menghasilkan matriks konjugat kompleks seperti 1 + 2i. Ini mungkin sedikit meregangkan aturan, tetapi menurut saya itu tetap sesuai dengan persyaratan output. Harus ada cara yang lebih baik untuk melakukan dua baris di bawah pernyataan functino, tetapi saya tidak yakin saat ini.
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 123 byte
Cobalah online!
Saya menggunakan
TwoWayRule
notasiTranspose[...,2<->4]
untuk menukar dimensi 2 dan 4 array; jika tidak, ini cukup mudah.Tidak Disatukan:
sumber
Python 3 ,
271267241 bytePendekatan brute-force: Hasilkan semua permutasi dari pasangan sampai sebuah kotak Graeco-Latin ditemukan. Terlalu lambat untuk menghasilkan sesuatu yang lebih besar dari
n=3
pada TIO.Berkat alexz02 untuk bermain golf 26 byte dan untuk ceilingcat untuk bermain golf 4 byte.
Cobalah online!
Penjelasan:
sumber