Wygeneruj tabelę grupową dla Z_n

9

Grupy są szeroko stosowaną strukturą w matematyce i mają zastosowania w informatyce. To wyzwanie kodu dotyczy mniejszej liczby # znaków, aby utworzyć tabelę grupy dla grupy addytywnej Z n .

Jak zbudowana jest tabela: Dla Z n elementami są {0, 1, 2, ..., n-1}. Tabela będzie miała n wierszy i n kolumn. Dla ij-tego wpisu tabeli wartością jest i + j mod n. Na przykład w Z 3 1-2 pozycja (2. rząd, 3. kolumna, jeśli liczymy początkowy wiersz / kolumnę jako 1), to (1 + 2)% 3 = 0 (patrz przykładowe dane wyjściowe).

Dane wejściowe: dodatnia liczba całkowita, n

Dane wyjściowe: tabela będąca tekstową prezentacją Z n , zbudowana jak opisano powyżej i wyświetlona jak pokazano poniżej na przykładowych danych wyjściowych. Miejsca są opcjonalne

Przykładowe dane wejściowe: 3

Przykładowe dane wyjściowe:

0 1 2
1 2 0
2 0 1

Przykładowe dane wejściowe: 5

Przykładowe dane wyjściowe:

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
źródło
3
Ponieważ separator jest opcjonalny, czy będzie wejście powyżej 10?
Jo King
@JoKing na podstawie codegolf.stackexchange.com/questions/35038/... Myślę, że tak
qwr

Odpowiedzi:

10

APL (10)

(Zakładając ⎕IO=0. Domyślnie działa na ngn / apl , inne APL zwykle potrzebują ⎕IO←0pierwszej.)

{⍵|∘.+⍨⍳⍵}

Wyjaśnienie:

  • ⍳⍵: liczby [0..⍵)
  • ∘.+⍨: utwórz tabelę sum
  • ⍵|: liczby w tabeli mod
marinus
źródło
1
Czy możesz ⊢|⍳∘.+⍳, czy pociągi nie działały w wersji ngn z lipca 2014 r.?
lirtosiast
3

GolfScript (13 znaków)

Rozumiem z twojego komentarza do odpowiedzi Claudiu, że spacje między elementami wiersza nie są konieczne. W tym rozumieniu:

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

Demo online

Sekcja:

~        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

Jeśli konieczne jest użycie białych znaków, dla 20 znaków:

~.,{.(+}@(*]{' '*n}/
Peter Taylor
źródło
Bardzo dobra robota!
Ryan,
3

Python 2, 66 bajtów

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

Obraca listę, usuwając i ponownie dołączając.

Python 3, 53 bajty

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

Używa tej samej metody co @ mbomb007, ale nadużywanie printjako funkcji.

Sp3000
źródło
To *R,=dziwna konstrukcja ... Czy służy tylko do konwersji rangedanych wyjściowych na krotkę?
Jonathan Frech,
Czy możesz wyjaśnić kod Python 3? Nie widziałem użycia*R
tarit goswami,
@taritgoswami To jest zdegenerowane rozpakowywanie; rangeto iterowalny obiekt, który można rozpakować i przepakować, zbierając wszystko R. Powinno to być równoważne R=list(range(n)), przy czym ten pierwszy jest bardziej zwięzły.
Jonathan Frech
3

05AB1E , 10 8 bajtów

ݨDδ+I%»

Wypróbuj online!

Wyjaśnienie

         # 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       

Poprzednia odpowiedź: 10 bajtów

ݨDvDðý,À}

Wypróbuj online!

Moja pierwsza próba gry w golfa w 05AB1E.

Wyjaśnienie poprzedniej odpowiedzi

           # 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
źródło
1
Ładna pierwsza odpowiedź i witamy! Mam wrażenie, że może być krótszy, ale oto dwie 9-bajtowe alternatywy: FݨN._ðý,i ݨsGDÀ})»nie krępuj się zadawać jakichkolwiek pytań na czacie 05AB1E i zajrzyj na stronę z poradami 05AB1E, jeśli jeszcze tego nie zrobiłeś. :)
Kevin Cruijssen
@KevinCruijssen Thanks! Wygląda na to, że zapomniałem znaleźć sposobu na wykorzystanie niejawnego wkładu.
Wisław
1

Pyth , 16 lat

JVQXQjdJ=J+tJ]hJ

Drukuje tabelę z odpowiednią białą spacją.

./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

Wyjaśnienie:

                   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
źródło
1

J, 20

Odczytywanie ze standardowego wejścia i tworzenie tablicy 2D (która renderuje to samo co próbka w pytaniu).

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

Jeśli funkcja zrobieniu wystarczy sznurek, (|+/~@i.)@".. Jeśli wystarcza funkcja przyjmująca liczbę całkowitą, |+/~@i.powinna wystarczyć.

Objaśnienie: f g w J (dla funkcji f, g) oznacza „haczyk”, który jest funkcją złożoną, która uruchamia wejście przez g (funkcja jednoargumentowa), a następnie wejście i wynik g przez f (funkcja binarna). Odpowiedzią jest rozwidlenie z komponentami |(modułem) i +/~@i.. Ta ostatnia część to „zestawienie sum złożonych z listą indeksów-upto” ( i.jest trochę jak rangew Pythonie).

Robaczek świętojański
źródło
Powinieneś zaktualizować swoją odpowiedź na |+/~@i., co powinno być akceptowalne przez standardowe zasady tutaj.
Jonasz
1

Oktawa, 23

@(n)mod((r=0:n-1)'+r,n)
alephalpha
źródło
1

Python 2, 67

Wypróbuj je tutaj

Używam podziału listy, aby „obrócić” listę nrazy, drukując ją za każdym razem. (68 znaków)

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

Dziwną sztuczką udało mi się uzyskać jedną postać krótszą od powyższej. (67 znaków)

def f(n):
 l=range(n)
 for i in l:print''.join(`l[i:]+l[:i]`)[1::3]
mbomb007
źródło
Wygląda na to, metoda ta jest jeszcze krótsza w Pythonie 3: def f(n):*R,=range(n);[print(*R[i:]+R[:i])for i in R]. Nie sądziłem, że ikona będzie działać bez parens.
Sp3000,
1

Matlab (28)

k=exp(0:n-1)
mod(log(k'*k),n)
wada
źródło
1

Kod maszynowy x86-64 (Linux), 80 64 bajtów

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

Miałem nadzieję, że to rozwiązanie będzie tylko kilka bajtów krótsze, aby móc pokonać niektóre inne zgłoszenia w tym poście. Istnieje możliwość, że jeśli użyję 32- lub 16-bitowych wersji rejestrów, mógłbym zgolić kilka bajtów. Przekształcenie wielu rejestrów w 32-bitowe wersje adresujące pozwoliło zaoszczędzić 16 bajtów.

Zasadniczo ta funkcja jest wywoływana z programu C / C ++, który przeszedł n przez rdi i wskaźnik do alokacji przez rsi. Wskaźnik, który ma rsi, jest w rzeczywistości 1 bajtem od końca alokacji, ponieważ tabela jest budowana wstecz. Ułatwia to konwersję liczby całkowitej na drukowalne znaki ASCII (wykonywane przez pobranie pewnej liczby x mod 10 i przekonwertowanie wyniku na ASII).

Aby zobaczyć kod opakowania C ++ i komentarze do zestawu, sprawdź moje repozytorium .

davey
źródło
1

Pari / GP , 26 bajtów

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

Wypróbuj online!

alephalpha
źródło
Kto zainicjował x, y do czego?
RosLuP
@RosLuP matrix(m,n,X,Y,expr)generuje mXnmacierz wyrażeń expr, zmienna wierszowa Xprzechodzi od 1do, ma zmienna kolumny Yprzechodzi od 1do n.
alephalpha
1

MathGolf , 10 8 bajtów

r░y\Åo╫;

Wypróbuj online!

-2 bajty dzięki Jo King

Wyjaśnienie

3Jako wyjaśnienia użyję przykładowego wejścia

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)

Możesz także zrobić r░y\(Åo╫, co zmniejsza liczbę pętli o 1 i pomija odrzucanie po pętli.

maxb
źródło
9 bajtów
Jo King
@JoKing to sprytne! Być może mógłbyś użyć qdo usunięcia duplikacji?
maxb 12.01.19
Miałem na myśli o. Chociaż najlepsze, co mogłem wymyślić w ten sposób, to było to . Może to być również 10 bajtów, ale jestem na telefonie komórkowym.
maxb 12.01.19
Ponieważ separator jest opcjonalny, powinno działać 8 bajtów
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
źródło
0

Golfscript, 20 znaków

Strasznie leniwa praca.

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

Uruchom tutaj . (Pierwsza linia to symulacja stdin).

Objaśnienie :

~                     # 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

Po zakończeniu programu stos zawiera każdą tablicę z nowymi liniami między nimi. Tłumacz wyrzuca to, co pozostało na stosie, dając pożądany rezultat.

Claudiu
źródło
1
Miły! Chociaż odstępy między elementami nie były konieczne, może być pomocne, gdy mamy elementy o wartości> = 10 (tj. Gdy n> = 11).
Ryan
Czy możesz wyjaśnić swój kod? Dla mnie czytanie gry w golfa jest gorsze niż czytanie wyrażenia regularnego innej osoby. (prawie =)
wada
@flawr: Hah, jasne, to całkiem proste
Claudiu
0

CJam, 14 znaków

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

Sprawdź to tutaj.

Wyjaśnienie

Chodzi o to, aby powtórzyć ciąg od 0do N-1, ale podzielić go na bloki N+1. To niedopasowanie za każdym razem przesuwa rząd w lewo. Na koniec musimy pozbyć się obcego charakteru i połączyć wszystko z nowymi liniami.

Oto rozłożony kod wraz z zawartością stosu do wprowadzenia 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"]

Wynik jest drukowany automatycznie na końcu programu. (Uwaga: zawartość stosu dla ostatniego kroku jest technicznie mieszaną tablicą zawierającą liczby i znaki nowej linii, a nie ciąg zawierający tylko znaki.)

Alternatywnie 11 znaków

Dzięki najnowszemu dodaniu ew(jest nowszy niż wyzwanie - zwraca wszystkie nakładające się podciągi o podanej długości), można zrobić 11 bajtów:

l~,2*))ewN*

Oto jak to działa:

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
źródło
Alternatywne 14 bajtów: l~_,\{_(+N\}*;. Zastanawiam się jednak, czy możemy sobie z tym poradzić lepiej .
Sp3000,
Tak, ale zasadniczo jest to odpowiedź Petera i pomyślałem, że wolę przedstawić inne podejście. ewmoże działać, ale jest nowszy niż wyzwanie.
Martin Ender,
0

MATL , 6 bajtów

:q&+G\

Wypróbuj 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
źródło
0

Excel VBA, 77 bajtów

Anonimowa funkcja bezpośredniego okna VBE, która pobiera dane wejściowe jako liczbę całkowitą, n, z zakresu [A1]i danych wyjściowych do zakresu A2.Resize(n,n).

[A2:IU255]="=IF(MAX(ROW()-1,COLUMN())-1<$A$1,MOD(ROW()+COLUMN()-3,$A$1),"""")
Taylor Scott
źródło
0

Perl 6 , 23 bajtów

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera liczbę i drukuje macierz w danym formacie ze spacjami. Jeśli zamiast tego możemy po prostu zwrócić coś, to .putmożna go usunąć.

Wyjaśnienie:

                   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
źródło
0

Węgiel drzewny , 13 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: końcowe miejsce. Wyjaśnienie:

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
źródło
0

APL (NARS), 15 znaków, 30 bajtów

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

test:

  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 

tutaj język nie potrzebuje komentarzy ...

RosLuP
źródło
0

Japt -R, 5 bajtów

ÆZéXn

Spróbuj

Jeśli użycie przecinka jako separatora jest nieprawidłowe, dodaj bajt bez separatora:

ÆZ¬éXn

Spróbuj

Lub 2 bajty, aby użyć spacji:

ÆZéXn)¸

Spróbuj

Kudłaty
źródło
0

R , 37 bajtów

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

Tworzy wektor od 0 do n-1 i kolejno dodaje 1, następnie 2 ... następnie n, i moduluje macierz o długość wektora, który wynosi n.

Wypróbuj online!

Sumner18
źródło
0

Dalej (gforth) , 53 bajty

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

Wypróbuj online!

Wyjaśnienie

Zagnieżdżona pętla, która wypuszcza nowy wiersz co n liczb

Objaśnienie kodu

: 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
źródło