Saya penggemar berat teori bilangan. Hal besar dalam teori bilangan adalah aritmatika modular; definisi menjadi jika dan hanya jika m \ mid ab . Hal yang menyenangkan untuk dilakukan adalah meningkatkan kekuatan: terutama ketika modulus adalah bilangan prima. Secara khusus, telah terbukti bahwa jika a dan m relatif prima (tidak berbagi faktor umum selain 1 ) maka ada bilangan e sehingga a ^ e \ equiv 1 \ mod m .
Saya akan menjelaskan apa latihan itu dengan sebuah contoh. Mari kita ambil modulus . Output yang mungkin dari program atau fungsi adalah:
3 2 6 4 5 1
2 4 1 2 4 1
6 1 6 1 6 1
4 2 1 4 2 1
5 4 6 2 3 1
1 1 1 1 1 1
Setiap baris adalah daftar kekuatan angka pertama di baris itu: baris pertama adalah , yang setara dengan modulo . Baris kedua dari persegi di atas adalah kekuatan , dan sebagainya, hingga baris terakhir, yang hanya kekuatan .
Ini adalah kotak modulo ajaib karena:
- Kuadratnya simetris; yaitu, kolom ke- sama dengan baris ke- .
- Semua nilai hingga muncul setidaknya sekali.
Di bawah ini adalah satu-satunya output valid lainnya untuk , dimulai dengan pangkat :
5 4 6 2 3 1
4 2 1 4 2 1
6 1 6 1 6 1
2 4 1 2 4 1
3 2 6 4 5 1
1 1 1 1 1 1
Tantangan
Buat fungsi atau program yang memberikan p
output utama persegi modulo ajaib, yaitu, persegi dengan panjang sisi p-1
, sehingga setiap baris adalah daftar kekuatan berurutan dari elemen pertama di baris, dan sama untuk kolom. Semua angka antara 0
dan p
harus terjadi, dan kuadrat hanya dapat berisi angka dalam rentang itu.
Input adalah angka atau string, dan output bisa ascii, sebuah matriks, array array (format apa pun yang masuk akal).
Ini kode-golf, jadi kode terpendek menang.
sumber
Jawaban:
Jelly ,
1310 byteTerima kasih kepada Nick Kennedy
Terasa sepertikode diulangharusadalah golf-bisa, tapi sayatelahtidak mengeloladitu ...Cobalah online! (footer format cantik sebagai kisi)
Bagaimana?
sumber
Arang , 36 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: Ruang tambahan. Penjelasan:
Buat
p-1
denganp-1
array kekuatan1..p-1
untuk indeks1..p-1
(modulop
).Memetakan lebih dari satu baris yang memiliki tepat satu
1
.Atur ulang baris ke dalam urutan yang diberikan oleh baris yang dipilih dan format output.
sumber
J ,
353231 byteCobalah online!
sumber
Bahasa Wolfram (Mathematica) ,
4643 byteCobalah online!
-3 Terima kasih kepada alephalpha
sumber
JavaScript (ES7),
9186 byteVersi ini mencoba menghitung kekuatan sebelum menerapkan modulo dan akan gagal untukp ≥ 11 karena kehilangan presisi. Atau menggunakan logika yang sama dengan versi komentar di bawah ini.
Cobalah online!
JavaScript (ES6),
9287 byteVersi ini menggunakan eksponensial modular untuk mendukung (banyak) nilai input yang lebih tinggi.
Cobalah online!
Bagaimana?
Menemukan baris pertama
Ini berfungsi bahkan dalam urutan leksikografis - yang merupakan perilaku default
sort()
- karena:Contoh:
Membangun matriks
Bagian ini dapat ditulis sebagai:
sumber
.indexOf(1)>p-3
menghemat 3 byte lebih.every
.Zsh ,
11790 byteCobalah online!Cobalah online!Semoga Tuhan mengampuni jiwaku. Ada banyak praktik buruk yang dibungkus di sini, izinkan saya menjelaskan pelaku terbesar setidaknya:
Contoh untuk
b=4
:Akhirnya, di mana
$c
muncul di sisa program, elemen array dievaluasi sebagaieval set -- ....
.Terakhir,
${#${(u)@}}
menghitung elemen unik dalam parameter posisi (yaitu: apakah ada siklus / ada1
?)Komentar yang relevan dengan jawaban 117 byte di bawah ini.
Tantangan yang harus kita atasi:
${#${(M)a:#1}
::#
menghapus pencocokan, dan(M)
membalikkan kecocokan. Jadi, ini akan diperluas ke jumlah (${# }
) dari1
dalam array. Sayangnya ekspansi ini tidak cocok dengan aritmatika untuk loop yang kami gunakan di sini. Jika ya, berpotensi menyimpan satu byte.${${:-1}:*a}
: Ini adalah persimpangan himpunan antara singleton1
dan himpunana
. Ini akan diperluas ke single1
jika ditemukan dalam array. Menggunakan opsi ini, kami menyimpan satu karakter di sini, tetapi kehilangan 1 keseluruhan harus menunda menambahkan1
s di baris dan kolom terakhir sampai akhir.sumber
Perl 6 ,
6557 byteCobalah online!
Mungkin ada beberapa cara untuk hanya mengeluarkan kuadrat itu sendiri, tetapi ini melakukan proses yang sama seperti yang dijelaskan dalam pertanyaan, mengurutkan daftar berdasarkan posisi mereka di daftar pertama yang hanya permutasi 1 ke input-1. Kembali sebagai daftar daftar.
BTW, ada banyak joki di sekitar, mencoba untuk mengatasi beberapa batasan menjengkelkan Perl 6 yang melibatkan urutan vs array, dan variabel anonim.
Penjelasan:
sumber
Python 2 , 108 byte
Cobalah online!
sumber
print
daripada kembali?05AB1E ,
1916 byte-3 byte terima kasih kepada @Emigna .
Cobalah secara online (catatan kaki untuk mencetak daftar 2D dengan cantik).
Penjelasan:
sumber
LεI<LmI%}ÐΘOÏн<è
untuk 16 byte.<è
itu sudah cukup daripada yangUΣXyk
saya miliki.Bahasa Wolfram (Mathematica) , 67 byte
Cobalah online!
sumber
Pari / GP , 48 byte
Cobalah online!
sumber
APL (NARS), 29 karakter, 58 byte
uji:
sumber