Jestem wielkim fanem teorii liczb. Wielką rzeczą w teorii liczb jest arytmetyka modułowa; definicja jest wtedy i tylko wtedy, gdy m \ mid ab . Zabawne jest podnoszenie do potęg: szczególnie, gdy moduł jest liczbą pierwszą. W szczególności udowodniono, że jeśli a i m są względnie pierwsze (nie mają wspólnych czynników oprócz 1 ), to istnieje liczba e taka, że a ^ e \ equiv 1 \ mod m .
Wyjaśnię, na czym polega ćwiczenie. Weźmy moduł . Możliwe wyjście programu lub funkcji to:
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
Każdy rząd jest listą potęg pierwszego numeru w tym rzędzie: pierwszy rząd to , co odpowiada moduł . Drugi rząd kwadratu powyżej to potęgi itd., Aż do ostatniego rzędu, które są tylko potęgami .
To magiczny kwadrat modulo, ponieważ:
- Kwadrat jest symetryczny; to znaczy, ta kolumna jest taka sama jak ty wiersz.
- Wszystkie wartości od do pojawiają się co najmniej raz.
Poniżej znajduje się jedyna ważna moc wyjściowa dla , zaczynając od mocy :
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
Wyzwanie
Utwórz funkcję lub program, który podając liczbę pierwszą p
generuje magiczny kwadrat modulo, to znaczy kwadrat o długości boków p-1
, tak że każdy rząd jest listą kolejnych mocy pierwszego elementu w rzędzie i taki sam dla kolumn. Wszystkie liczby pomiędzy 0
i p
muszą wystąpić, a kwadrat może zawierać tylko liczby z tego zakresu.
Dane wejściowe to liczba lub ciąg znaków, a dane wyjściowe mogą być ascii, macierzą, tablicą tablic (dowolny rozsądny format).
To jest golf golfowy, więc wygrywa najkrótszy kod.
źródło
Odpowiedzi:
Galaretka ,
1310 bajtów-3 dzięki Nickowi Kennedy'emu
Odczuwana jakpowtarzanego kodupowinno byćto golf-stanie, alejużnie udałobyłybyto ...Wypróbuj online! (stopka ładna-formaty jako siatka)
W jaki sposób?
źródło
Węgiel drzewny , 36 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: końcowe miejsce. Wyjaśnienie:
Tworzenie
p-1
przezp-1
tablicę uprawnień1..p-1
do indeksów1..p-1
(modulop
).Mapuj jeden z wierszy, który ma dokładnie jeden
1
.Zmień kolejność wierszy w kolejności podanej przez wybrany wiersz i sformatuj dane wyjściowe.
źródło
J ,
353231 bajtówWypróbuj online!
źródło
Wolfram Language (Mathematica) ,
4643 bajtówWypróbuj online!
-3 dzięki alephalpha
źródło
JavaScript (ES7),
9186 bajtówWypróbuj online!
JavaScript (ES6),
9287 bajtówTa wersja wykorzystuje potęgowanie modułowe do obsługi (znacznie) wyższych wartości wejściowych.
Wypróbuj online!
W jaki sposób?
Znajdowanie pierwszego rzędu
Działa to nawet w kolejności leksykograficznej - co jest domyślnym zachowaniem
sort()
- ponieważ:Przykład:
Budowanie macierzy
Tę część można po prostu napisać jako:
źródło
.indexOf(1)>p-3
oszczędza 3 bajty.every
.Zsh ,
11790 bajtówWypróbuj online!Wypróbuj online!Niech Bóg zlituje się nad moją duszą. Jest tu wiele złych praktyk, pozwól mi wyjaśnić przynajmniej największego przestępcę:
Przykład dla
b=4
:Wreszcie, gdzie
$c
pojawia się w pozostałej części programu, elementy tablicy są oceniane jakoeval set -- ....
.Wreszcie,
${#${(u)@}}
liczy unikalne elementy parametrów pozycyjnych (tj .: czy jest cykl / czy są1
?)Komentarze dotyczące 117-bajtowej odpowiedzi poniżej.
Wyzwania, które musimy pokonać:
${#${(M)a:#1}
::#
usuwa dopasowanie i(M)
odwraca dopasowanie. To zwiększy liczbę (${# }
)1
s do tablicy. Niestety, to rozszerzenie nie działa dobrze z arytmetyką pętli, której tutaj używamy. Jeśli tak, może potencjalnie zaoszczędzić bajt.${${:-1}:*a}
: Jest to przecięcie zestawu między singletonem1
a zestawema
. Rozwinie się do singla,1
jeśli zostanie znaleziony w tablicy. Korzystając z tej opcji, zapisujemy tutaj jedną postać, ale tracimy 1 ogólną konieczność odłożenia dodawania1
s w ostatnim rzędzie i kolumnie do końca.źródło
Perl 6 ,
6557 bajtówWypróbuj online!
Prawdopodobnie jest jakiś sposób, aby wyprowadzić sam kwadrat, ale robi to ten sam proces opisany w pytaniu, sortując listy według ich pozycji na pierwszej liście, która jest tylko permutacją 1 na input-1. Zwraca jako listę list.
BTW, dużo się kręci, próbuje obejść niektóre irytujące ograniczenia Perla 6, obejmujące sekwencje kontra tablice i anonimowe zmienne.
Wyjaśnienie:
źródło
Python 2 , 108 bajtów
Wypróbuj online!
źródło
print
zamiast powrotu?05AB1E ,
1916 bajtów-3 bajty dzięki @Emigna .
Wypróbuj online (stopka służy do wydrukowania listy 2D).
Wyjaśnienie:
źródło
LεI<LmI%}ÐΘOÏн<è
dla 16 bajtów.<è
, że wystarczyłoby zamiastUΣXyk
mnie.Wolfram Language (Mathematica) , 67 bajtów
Wypróbuj online!
źródło
Pari / GP , 48 bajtów
Wypróbuj online!
źródło
APL (NARS), 29 znaków, 58 bajtów
test:
źródło