zrzeczenie się odpowiedzialności: nie znam żadnych rozwiązań innych niż bruteforce
Kwadrat Graeco-Latin to, dla dwóch zestawów tej samej długości , układ komórek , z których każdy zawiera unikalną (przez cały kwadrat) parę elementu pierwszego zestawu i element drugiego zestawu, takie jak że wszystkie pierwsze elementy i wszystkie drugie elementy par są unikalne w swoim rzędzie i kolumnie. Najczęściej stosowanymi zestawami są, jak można się domyślić, pierwsze liter alfabetu greckiego i łacińskiego.
Oto zdjęcie kwadratu Graeco-Latin 4x4:
Kwadraty grecko-łacińskie są tak przydatne, jak się wydaje ( artykuł w Wikipedii wspomina o „projektowaniu eksperymentów, planowaniu turniejów i konstruowaniu magicznych kwadratów”). Twoim zadaniem jest, biorąc pod uwagę dodatnią liczbę całkowitą , wygenerowanie kwadratu Graeco-Latin.
Wkład
Dodatnia liczba całkowita ; gwarantowane jest istnienie kwadratu grecko-łacińskiego (to znaczy n ≠ 6 ).
Wydajność
Kwadrat grecko-łaciński o długości boku n jako tablica dwuwymiarowa, tablica tablic, tablica spłaszczona lub wyprowadzana bezpośrednio.
Notatki
- Nie musisz specjalnie używać alfabetu greckiego i łacińskiego; na przykład dozwolone jest także wyprowadzanie par dodatnich liczb całkowitych.
- Jeśli zdecydujesz się użyć alfabetu, którego nie można dowolnie rozszerzyć, musisz (teoretycznie; twój kod nie musi kończyć się przed śmiercią wszechświata) utrzymywać maksymalną długość boku co najmniej 20.
To jest golf golfowy , więc wygrywa najkrótszy kod!
Odpowiedzi:
Galaretka ,
2120 bajtów-1 dzięki Nickowi Kennedy'emu (opcja wyjścia płaskiego pozwala na zapis bajtów→
ż"þ`ẎẎQƑ$Ƈ
F€p`Z€QƑƇ
)Wypróbuj online! (Zbyt wolno, by
4
w latach 60. na TIO, ale jeśli zastąpimy moc kartezjańskąṗ
kombinacjamiœc
, to się skończy - chociaż 5 na pewno nie!)W jaki sposób?
źródło
05AB1E ,
262322 bajtów-3 bajty dzięki Emignie
-1 bajt dzięki Kevin Cruijssen
Wypróbuj online!
źródło
n<ÝI‰
może być<Ýã
<Ý
może byćL
. Dzięki!ê}DIùQ
może byćÙgQ}P
zapisanie bajtu.R ,
164148 bajtów- wiele bajtów dzięki Giuseppe.
Wypróbuj online!
Dramatycznie nieefektywny - myślę, że jest nawet gorzej niż w przypadku innych brutalnych sił. Nawet jeśli
n=3
, prawdopodobnie upłynie limit czasu na TIO. Tutaj alternatywna wersja (155 bajtów), która działa przezn=3
około 1 sekundę.Działa przez odrzucenie. Funkcja1 n n
m
l
g
. Następnie sprawdzamy:all(1:n^2%in%(n*l+g-n))
l
g
?l
ig
łacińskie kwadraty?!
l
g
2^l
l
t(l)
l
g
sd
Ostatnia uwaga: tak często w golfie kodu R używałem zmiennej
T
, która jest inicjalizowana jakoTRUE
, aby uzyskać kilka bajtów. Ale to oznacza, że kiedy potrzebowałem rzeczywistej wartościTRUE
w definicjim
(parametrreplace
wsample
), musiałem użyć1
zamiastT
. Podobnie, ponieważ redefiniuję!
jako funkcję inną niż negacja, musiałem użyć1-all(...)
zamiast!all(...)
.źródło
JavaScript (ES6),
159 147140 bajtówJest to proste wyszukiwanie brutalnej siły, a zatem bardzo powolne.
Wypróbuj online! (z zachowanym wyjściem)
Skomentował
źródło
o
; możesz po prostu wrócićm
na koniec za 141Haskell ,
207 143233 bajtyWypróbuj online!
OK, myślę, że w końcu to dostałem. Działa dobrze dla n = 5, n = 6 razy na TIO, ale myślę, że może tak być, ponieważ ten nowy algorytm jest NIESAMOWICIE nieskuteczny i w zasadzie sprawdza wszystkie możliwości, aż znajdzie taki, który działa. Korzystam teraz z n = 6 na moim laptopie, aby sprawdzić, czy upłynie trochę więcej czasu.
Jeszcze raz dziękuję @someone za wskazanie błędów w moich poprzednich wersjach
źródło
C #,
520506494484 bajtówAlgorytm znajdowania kwadratu jest bardzo prosty. To jest ... brutalność. Tak, to głupie, ale w golfie kodowym nie chodzi o szybkość programu, prawda?
Kod, zanim zostanie skrócony:
Teraz, jeśli chcesz przetestować za pomocą n = 3, musisz poczekać godzinę, więc oto inna wersja:
Aktualizacja: zapomniałem usunąć „public”.
Aktualizacja: używany „System”. zamiast „using System;”; Również dzięki Kevin Cruijssen , użyłem „a” zamiast „args”.
Aktualizacja: dzięki gastropnerowi i komuś .
źródło
args
może byća
:)for(X = 0; X < Y; X++)
nafor(X = Y; X-->0; )
, co powinno oszczędzać bajt na pętlę.i = 0
w definicjii
i zapisać bajt.System
. Ponadto,if((m[i,j,k]=(m[i,j,k]+ 1) % n)!=0)
może byćif((m[i,j,k]=-~m[i,j,k]%n)>0)
.Write
albo mógłby zapisać bajty poprzez dodanie\n
do ciągu wewnątrz wywołania lub jest w inny sposób uszkodzony. Myślę, że możesz również zwrócić tablicę bezpośrednio.Oktawa , 182 bajty
Metoda Brute Force, TIO utrzymuje limit czasu i musiałem uruchomić go kilka razy, aby uzyskać wynik dla n = 3, ale teoretycznie powinno to być w porządku. Zamiast par takich jak (1,2) generuje macierz złożonych koniugatów, takich jak 1 + 2i. Może to nieco rozciągać regułę, ale moim zdaniem będzie to pasować do wymagań wyjściowych. Musi być jednak lepszy sposób na wykonanie dwóch wierszy w deklaracji funkoino, ale w tej chwili nie jestem pewien.
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 123 bajty
Wypróbuj online!
Używam
TwoWayRule
notacjiTranspose[...,2<->4]
aby zamienić drugi i czwarty wymiar tablicy; w przeciwnym razie jest to dość proste.Nie golfowany:
źródło
Python 3 ,
271267241 bajtówPodejście brutalnej siły: Wygeneruj wszystkie kombinacje par, aż do znalezienia kwadratu grecko-łacińskiego. Zbyt wolno, aby wygenerować coś większego niż
n=3
w TIO.Dzięki alexz02 za grę w golfa 26 bajtów i pułapkę za grę w golfa 4 bajty.
Wypróbuj online!
Wyjaśnienie:
źródło