Hasilkan tabel grup untuk Z_n

9

Grup adalah struktur yang banyak digunakan dalam Matematika, dan memiliki aplikasi dalam Ilmu Komputer. Tantangan kode ini adalah tentang karakter # paling sedikit untuk membuat tabel grup untuk grup aditif Z n .

Bagaimana tabel disusun: Untuk Z n , elemen-elemennya adalah {0, 1, 2, ..., n-1}. Tabel akan memiliki n baris dan kolom n. Untuk entri tabel ke-ij, nilainya adalah i + j mod n. Sebagai contoh, dalam Z 3 , entri 1-2 (baris 2, kolom 3 jika Anda menghitung baris awal / kolom sebagai 1) adalah (1 + 2)% 3 = 0 (lihat output sampel).

Input: bilangan bulat positif, n

Output: meja yang presentasi tekstual Z n , dibangun seperti dijelaskan di atas, dan ditampilkan seperti ditunjukkan di bawah output sampel. Spasi adalah opsional

Input sampel: 3

Output sampel:

0 1 2
1 2 0
2 0 1

Input sampel: 5

Output sampel:

0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3
Ryan
sumber
3
Karena separator bersifat opsional, apakah akan ada input di atas 10?
Jo King
@JoKing berdasarkan codegolf.stackexchange.com/questions/35038/... Saya kira ya
qwr

Jawaban:

10

APL (10)

(Dengan asumsi ⎕IO=0. Ia bekerja pada ngn / apl secara default, APL lain cenderung membutuhkan yang ⎕IO←0pertama.)

{⍵|∘.+⍨⍳⍵}

Penjelasan:

  • ⍳⍵: angka [0.. 0.)
  • ∘.+⍨: buat tabel jumlah
  • ⍵|: angka dalam tabel mod
marinus
sumber
1
Bisakah Anda melakukannya ⊢|⍳∘.+⍳, atau apakah kereta tidak bekerja di versi ngn Juli 2014?
lirtosiast
3

GolfScript (13 karakter)

Saya mengerti dari komentar Anda tentang jawaban Claudiu bahwa spasi putih antara elemen-elemen baris tidak perlu. Atas pengertian itu:

~.,{.n\(+}@(*

Demo online

Pembedahan:

~        Parse the input into an integer
.,       Duplicate it, turn the second into an array [0,...,n-1]
{        Loop: top of stack is the previous row
  .n\    Push a newline and a copy of the previous row
  (+     Rotate the first element to the end to get the new row
}@(*     Perform loop n-1 times

Jika spasi putih diperlukan, untuk 20 karakter:

~.,{.(+}@(*]{' '*n}/
Peter Taylor
sumber
Pekerjaan yang sangat bagus!
Ryan
3

Python 2, 66 byte

def f(n):R=range(n);exec"print''.join(map(str,R));R+=R.pop(0),;"*n

Rotasikan daftar dengan membuka dan menambahkan kembali.

Python 3, 53 byte

def f(n):*R,=range(n);[print(*R[i:]+R[:i])for i in R]

Menggunakan metode yang sama dengan @ mbomb007, tetapi menyalahgunakan printsebagai fungsi.

Sp3000
sumber
Itu *R,=adalah konstruksi yang aneh ... Apakah hanya berfungsi untuk mengubah rangeoutput menjadi tuple?
Jonathan Frech
Bisakah Anda jelaskan kode Python 3? Saya belum pernah melihat penggunaan*R
tarit goswami
@taritgoswami Merosot membongkar; rangeadalah objek yang dapat diulang dimana seseorang dapat membongkar dan mengemas kembali, mengumpulkan semuanya R. Seharusnya setara dengan R=list(range(n)), yang pertama lebih ringkas.
Jonathan Frech
3

05AB1E , 10 8 byte

ݨDδ+I%»

Cobalah online!

Penjelasan

         # Implicit input n = 3                  [3]
Ý        # Push range(0,3)                       [[0,1,2,3]]
 ¨       # Pop last element                      [[0,1,2]]
  D      # Duplicate                             [[0,1,2],[0,1,2]]
   δ     # Apply next operation double vectorized
    +    # Vectorized addition                   [[[0,1,2],[1,2,3],[2,3,4]]]
     I   # Push input                            [[[0,1,2],[1,2,3],[2,3,4]],3]
      %  # Elementwise modulo 3                  [[[0,1,2],[1,2,0],[2,0,1]]]
       » # " ".join(x) followed by newline       ["0 1 2\n1 2 0\n2 0 1\n"]
           for every x in list       

Jawaban sebelumnya: 10 byte

ݨDvDðý,À}

Cobalah online!

Percobaan pertama saya bermain golf di 05AB1E.

Penjelasan dari jawaban sebelumnya

           # Implicit input n = 3                   [3]
Ý          # Push range(0,3)                        [[0,1,2,3]]
 ¨         # Pop last element.                      [[0,1,2]]
  D        # Duplicate                              [[0,1,2],[0,1,2]]
   v     } # Pop list and loop through elements     [[0,1,2]]
    D      # Duplicate                              [[0,1,2],[0,1,2]]
     ð     # Push space char                        [[0,1,2],[0,1,2], " "]
      ý    # Pop list a and push string a.join(" ") [[0,1,2],"0 1 2"]
       ,   # Print string with trailing newline     [[0,1,2]] Print: "0 1 2"
        À  # Rotate list                            [[1,2,0]]  
Wisław
sumber
1
Jawaban pertama yang bagus, dan selamat datang! Saya merasa ini bisa lebih pendek, tetapi di sini ada dua alternatif 9-byte: FݨN._ðý,dan ݨsGDÀ})»Jangan ragu untuk bertanya apa pun di obrolan 05AB1E , dan lihat halaman tip 05AB1E jika Anda belum. :)
Kevin Cruijssen
@KevinCruijssen Terima kasih! Sepertinya saya lupa mencari cara untuk memanfaatkan input implisit.
Wisław
1

Pyth , 16

JVQXQjdJ=J+tJ]hJ

Mencetak tabel dengan spasi putih yang tepat.

./pyth.py -c "JVQXQjdJ=J+tJ]hJ" <<< 5
0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3

Penjelasan:

                   Automatic: Q=eval(input())
JVQ                J = range(Q)
XQ                 repeat Q times
  jdJ              print J, joined on " "
  =J               J =
    +tJ]hJ             tail(J) + [head(J)] (J[1:] + [J[-1]]])
isaacg
sumber
1

J, 20

Membaca dari stdin dan menghasilkan array 2D (yang menghasilkan sama dengan sampel dalam pertanyaan).

(|+/~@i.)@".}:1!:1]3

Jika suatu fungsi mengambil string sudah cukup (|+/~@i.)@".,. Jika fungsi yang mengambil integer sudah mencukupi, |+/~@i.harus memadai.

Penjelasan: f g dalam J (untuk fungsi f, g) menunjukkan "kait", yang merupakan fungsi gabungan yang menjalankan input melalui g (fungsi unary) dan kemudian input dan hasil dari g melalui f (fungsi biner). Jawabannya adalah garpu dengan komponen |(modulus) dan +/~@i.. Bagian terakhir adalah "tabel jumlah yang disusun-dengan daftar-indeks-upto" ( i.sedikit mirip rangedengan Python).

FireFly
sumber
Anda harus memperbarui jawaban Anda |+/~@i., yang seharusnya dapat diterima oleh aturan standar di sini.
Jonah
1

Oktaf, 23

@(n)mod((r=0:n-1)'+r,n)
alephalpha
sumber
1

Python 2, 67

Cobalah keduanya di sini

Saya menggunakan pemisahan daftar untuk "memutar" daftar nwaktu, mencetaknya setiap kali. (68 karakter)

def f(n):
 l=range(n)
 for i in l:print''.join(map(str,l[i:]+l[:i]))

Saya berhasil mendapatkan satu karakter lebih pendek daripada yang di atas dengan trik aneh. (67 karakter)

def f(n):
 l=range(n)
 for i in l:print''.join(`l[i:]+l[:i]`)[1::3]
mbomb007
sumber
Sepertinya metode ini masih lebih pendek di Python 3: def f(n):*R,=range(n);[print(*R[i:]+R[:i])for i in R]. Saya tidak berpikir percikan akan benar-benar berfungsi tanpa parens.
Sp3000
1

Matlab (28)

k=exp(0:n-1)
mod(log(k'*k),n)
cacat
sumber
1

x86-64 Kode Mesin (Linux), 80 64 byte

0000000000000000 <zn_asm>:
   0:   6a 0a                   pushq  $0xa
   2:   89 f9                   mov    %edi,%ecx
   4:   ff c9                   dec    %ecx

0000000000000006 <zn_asm.l1>:
   6:   c6 06 0a                movb   $0xa,(%rsi)
   9:   48 ff ce                dec    %rsi
   c:   89 fb                   mov    %edi,%ebx
   e:   ff cb                   dec    %ebx

0000000000000010 <zn_asm.l2>:
  10:   89 c8                   mov    %ecx,%eax
  12:   01 d8                   add    %ebx,%eax
  14:   31 d2                   xor    %edx,%edx
  16:   f7 f7                   div    %edi
  18:   89 d0                   mov    %edx,%eax

000000000000001a <zn_asm.l3>:
  1a:   31 d2                   xor    %edx,%edx
  1c:   48 f7 34 24             divq   (%rsp)
  20:   83 c2 30                add    $0x30,%edx
  23:   88 16                   mov    %dl,(%rsi)
  25:   48 ff ce                dec    %rsi
  28:   85 c0                   test   %eax,%eax
  2a:   75 ee                   jne    1a <zn_asm.l3>
  2c:   ff cb                   dec    %ebx
  2e:   85 db                   test   %ebx,%ebx
  30:   7d de                   jge    10 <zn_asm.l2>
  32:   ff c9                   dec    %ecx
  34:   85 c9                   test   %ecx,%ecx
  36:   7d ce                   jge    6 <zn_asm.l1>
  38:   58                      pop    %rax
  39:   48 89 f0                mov    %rsi,%rax
  3c:   48 ff c0                inc    %rax
  3f:   c3                      retq

Saya berharap solusi ini hanya beberapa byte lebih pendek untuk dapat mengalahkan beberapa kiriman lainnya di posting ini. Ada kemungkinan jika saya menggunakan beberapa versi 32 atau 16 bit dari register saya bisa mencukur beberapa byte. Konversi banyak register ke versi pengalamatan 32 bit disimpan 16 byte.

Pada dasarnya fungsi ini dipanggil dari program C / C ++ yang melewati n melalui rdi, dan pointer ke alokasi melalui rsi. Pointer yang rsi miliki sebenarnya 1 byte dari akhir alokasi, karena tabel dibangun mundur. Ini membuatnya lebih mudah untuk mengkonversi integer ke karakter ASCII yang dapat dicetak (dilakukan dengan mengambil beberapa angka x mod 10 dan mengonversi hasilnya menjadi ASII).

Untuk melihat kode bungkus C ++ dan komentar di majelis, periksa repo saya .

davey
sumber
1

Pari / GP , 26 byte

n->matrix(n,n,x,y,x+y-2)%n

Cobalah online!

alephalpha
sumber
Siapa yang menginisialisasi x, y untuk apa?
RosLuP
@RosLuP matrix(m,n,X,Y,expr)menghasilkan mXnmatriks ekspresi expr, variabel baris Xdari 1ke mdan variabel kolom Ydari 1ke n.
alephalpha
1

MathGolf , 10 8 byte

r░y\Åo╫;

Cobalah online!

-2 byte terima kasih kepada Jo King

Penjelasan

Saya akan menggunakan input contoh 3untuk penjelasan

r          range(0, n) ([0, 1, 2])
 ░         convert to string (implicit map) (['0', '1', '2'])
  y        join array without separator to string or number ('012')
   \       swap top elements ('012', 3)
    Å      start block of length 2 (for-loop, loops 3 times ('012'))
     o     print TOS without popping
      ╫    left-rotate bits in int, list/str ('012' => '120' => '201' => '012')
       ;   discard TOS (prevents final print)

Anda juga bisa melakukannya r░y\(Åo╫, yang mengurangi jumlah loop sebanyak 1 dan melewatkan discard setelah loop.

maks
sumber
9 byte
Jo King
@ Mengobrol Itu pintar! Mungkin Anda bisa menggunakan quntuk menghapus duplikasi?
Maks
Maksud saya o. Meskipun yang terbaik yang bisa kupikirkan dengan cara itu adalah ini . Bisa jadi 10 byte juga, tapi saya di ponsel.
Maks.
Karena separator opsional 8 byte harus berfungsi
Jo King
0

C - 96

void g(int k){int i;for(i=0;i<k*k;i++){if(i&&!(i%k))puts("\n");printf("%i ",((i/k)+(i%k))%k);}}
LemonBoy
sumber
0

Golfscript, 20 karakter

Pekerjaan yang sangat malas.

~:j,{:x;j,{x+j%}%n}/

Jalankan di sini . (Baris pertama adalah mensimulasikan stdin).

Penjelasan :

~                     # evaluate input (turn string "5" into number 5)
:j                    # store into variable j
,                     # turn top of stack into range(top), e.g. 5 --> [0, 1, 2, 3, 4]
{...}/                # for each element in the array... 
  :x;                 # store the element into x and pop from the stack
  j,                  # put range(j) on the stack ([0, 1, 2, 3, 4] again)
  {...}%              # map the array with the following:
      x+j%            # add x and mod the resulting sum by j
  n                   # put a newline on the stack

Ketika program berakhir, tumpukan berisi masing-masing array dengan baris baru di antara mereka. Interpreter mengeluarkan apa yang tersisa di stack, memberikan hasil yang diinginkan.

Claudiu
sumber
1
Bagus! Meskipun spasi antar elemen tidak diperlukan, ini bisa membantu ketika kita memiliki elemen nilai> = 10 (yaitu ketika n> = 11).
Ryan
Bisakah Anda periksa kode Anda? Bagi saya membaca skrip golf lebih buruk daripada membaca regex orang lain. (hampir =)
flawr
@ flawr: Hah tentu, cukup mudah
Claudiu
0

CJam, 14 karakter

l~_)_@,*/Wf<N*

Uji di sini.

Penjelasan

Idenya adalah untuk mengulangi string dari 0ke N-1, tetapi membaginya menjadi beberapa blok N+1. Ketidakcocokan ini menggeser baris ke kiri setiap kali. Terakhir, kita perlu menyingkirkan karakter asing dan menggabungkan semuanya dengan baris baru.

Berikut adalah kode yang meledak, bersama dengan konten tumpukan untuk input 3.

l~              "Read and eval input."; [3]
  _             "Duplicate.";           [3 3]
   )            "Increment.";           [3 4]
    _           "Duplicate.";           [3 4 4]
     @          "Rotate.";              [4 4 3]
      ,         "Get range.";           [4 4 [0 1 2]]
       *        "Repeat.";              [4 [0 1 2 0 1 2 0 1 2 0 1 2]
        /       "Split.";               [[[0 1 2 0] [1 2 0 1] [2 0 1 2]]
         Wf<    "Truncate each line.";  [[[0 1 2] [1 2 0] [2 0 1]]
            N*  "Join with newlines.";  ["012
                                          120
                                          201"]

Hasilnya dicetak secara otomatis di akhir program. (Catatan, konten tumpukan untuk langkah terakhir secara teknis adalah array campuran yang berisi angka dan karakter baris baru, bukan string yang hanya berisi karakter.)

Atau, 11 karakter

Dengan penambahan baru-baru ewini (ini lebih baru dari tantangan - ia mengembalikan semua substring yang tumpang tindih dengan panjang yang diberikan), seseorang dapat melakukan 11 byte:

l~,2*))ewN*

Inilah cara kerjanya:

l~           "Read and eval input."; [3]
  ,          "Get range.";           [[0 1 2]]
   2*        "Repeat twice.";        [[0 1 2 0 1 2]]
     )       "Pop last.";            [[0 1 2 0 1] 2]
      )      "Increment.";           [[0 1 2 0 1] 3]
       ew    "Get substrings.";      [[[0 1 2] [1 2 0] [2 0 1]]
         N*  "Join with newlines.";  ["012
                                       120
                                       201"]
Martin Ender
sumber
Alternatif 14 bytes: l~_,\{_(+N\}*;. Saya bertanya-tanya apakah kita bisa melakukan yang lebih baik dengan ini .
Sp3000
Ya, tetapi pada dasarnya itu adalah jawaban Peter, dan saya pikir saya lebih suka menyajikan pendekatan yang berbeda. ewmungkin bekerja tetapi lebih baru dari tantangan.
Martin Ender
0

MATL , 6 byte

:q&+G\

Cobalah online!

    # implicit input, say n = 3
:   # range
    # stack: [1, 2, 3]
q   # decrement
    # stack: [0, 1, 2]
&+  # sum with itself and transpose with broadcast
    # stack:
    # [0 1 2
    #  1 2 3
    #  2 3 4]
G   # paste input
    # stack: [0 1 2; 1 2 3; 2 3 4], 3
\   # elementwise modulo
    # implicit output with spaces
Giuseppe
sumber
0

Excel VBA, 77 Bytes

Fungsi jendela langsung VBE anonim yang mengambil input, sebagai integer, n, dari range [A1]dan output ke range A2.Resize(n,n).

[A2:IU255]="=IF(MAX(ROW()-1,COLUMN())-1<$A$1,MOD(ROW()+COLUMN()-3,$A$1),"""")
Taylor Scott
sumber
0

Perl 6 , 23 byte

{.rotate(.all).put}o|^*

Cobalah online!

Blok kode anonim yang mengambil angka dan mencetak matriks dalam format yang diberikan dengan spasi. Jika kita bisa mengembalikan sesuatu, maka itu .putbisa dihapus.

Penjelasan:

                   o|^*    # Transform the input into the range 0..input-1
{                 }        # And pass it into the function
 .rotate                   # Rotate the range by
        (.all)             # Each of the range
              .put         # And print each of them separated by spaces
Jo King
sumber
0

Arang , 13 byte

NθEθ⪫Eθ﹪⁺ιλθ 

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: Ruang tambahan. Penjelasan:

Nθ              Input `n` as a number into variable
   θ            `n`
  E             Map over implicit range
      θ         `n`
     E          Map over implicit range
         ι      Current row
        ⁺       Plus
          λ     Current column
       ﹪        Modulo
           θ    `n`
    ⪫           Cast row to string and join with spaces
                Implicitly print each row on its own line
Neil
sumber
0

APL (NARS), 15 karakter, 30 byte

{⊃{⍵⌽k}¨k←0..⍵}

uji:

  f←{⊃{⍵⌽k}¨k←0..⍵}
  f 4
0 1 2 3 4
1 2 3 4 0
2 3 4 0 1
3 4 0 1 2
4 0 1 2 3
  f 3
0 1 2 3
1 2 3 0
2 3 0 1
3 0 1 2
  f 2
0 1 2
1 2 0
2 0 1
  f 1
0 1
1 0
  f 0
0 

di sini bahasa tidak perlu komentar ...

RosLuP
sumber
0

Japt -R, 5 byte

ÆZéXn

Cobalah

Jika menggunakan koma sebagai pemisah tidak valid maka tambahkan byte tanpa pemisah:

ÆZ¬éXn

Cobalah

Atau 2 byte untuk menggunakan spasi:

ÆZéXn)¸

Cobalah

Shaggy
sumber
0

R , 37 byte

sapply(x<-1:scan()-1,`+`,x)%%sum(x|1)

Membuat vektor dari 0 hingga n-1, dan secara berurutan menambahkan 1, lalu 2 ... lalu n, dan memodulasi matriks dengan panjang vektor, yaitu n.

Cobalah online!

Sumner18
sumber
0

Keempat (gforth) , 53 byte

: f dup 0 do cr dup 0 do i j + over mod . loop loop ;

Cobalah online!

Penjelasan

Nested loop yang menampilkan baris baru setiap n angka

Penjelasan Kode

: f             \ start new word definition
  dup 0 do      \ set loop parameters and loop from 0 to n-1
    cr          \ output a newline
    dup 0 do    \ loop from 0 to n-1 again
      i j +     \ get the sum of the row and column number
      over mod  \ modulo with n
      .         \ print (with space)
    loop        \ end inner loop
  loop          \ end outer loop
;               \ end word definition
reffu
sumber