Wyzwanie
Napisz program lub funkcję, która zwraca lub drukuje macierz kwadratowo-losowo-symetryczną.
Wejście
N : Rozmiar matrycy tj6 x 6
Wynik
Macierz. Możesz go wydrukować, zwrócić jako ciąg znaków (z nowymi wierszami) lub jako listę / tablicę list / tablic.
Zasady
Musisz użyć co najmniej
N
różnych znaków, gdzieN
jest rozmiar macierzy kwadratowej (dane wejściowe). Ponieważ używamy tylko litery [a, z] [A, Z] i cyfr [0, 9] (i tylko 1 cyfra w tym czasie), możesz założyć, żeN < 27
iN > 2
dlatego,N <= 2
że nie możesz mieć obu liter i cyfry. Wreszcie każda litera / cyfra musi mieć niezerowe prawdopodobieństwo wystąpienia (jednolity rozkład nie jest koniecznością). Jednak wynik musi mieć co najmniejN
inną literę / cyfry.Matryca musi być symetryczna zarówno poziomo, jak i pionowo.
Dokładnie 2 wiersze i 2 kolumny muszą zawierać ściśle jedną liczbę jednocyfrową (jej pozycja powinna być również losowa). Reszta wierszy / kolumn będzie zawierać tylko litery. Rozważ litery jako [a, z] i [A, Z] oraz oczywiście cyfry jednocyfrowe jako [0, 9].
Wystarczy być łatwiejsze, można założyć, że w przypadku liter nie ma znaczenia, tak długo, jak przypadki są symetryczne Co oznacza:
a=A, b=B, etc
.Każde możliwe wyjście musi mieć niezerowe prawdopodobieństwo wystąpienia. Rozkład losowy nie musi być jednolity.
Przykład
Wejście : 8
Wyjście :
c r p s s p r c
r k o z z o k r
u t 2 a a 2 t u
y n q z z q n y
y n q z z q n y
u t 2 a a 2 t u
r k o z z o k r
c r p s s p r c
Odpowiedzi:
Węgiel drzewny , 30 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Jeśli
n
jest zawsze parzyste, to dla 23 bajtów:Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wpisz .n
Utwórz przeznn2) tablice losowych małych liter. Drukuje się domyślnie jako kwadrat.n2)
Skocz do losowej pozycji na kwadracie.
Wydrukuj losową cyfrę.
Odbij poziomo i pionowo, aby ukończyć matrycę.
źródło
R ,
124118 bajtówWypróbuj online!
W R rzeczy, które wyglądają jak operatory, są po prostu funkcjami, które są specjalnie traktowane przez parser.
Jeśli redefiniujesz operatora (na przykład
-
), aby był jakąś inną funkcją, zachowuje on specjalne traktowanie przez analizator składni. Ponieważ-
jest to zarówno przedrostek, jak i przyrostek, i muszę wywołaćsample
funkcję z jednym i dwoma argumentami, mogę użyćdostać to, czego chcę.
Tak więc kod
-letters
jest tłumaczony nasample(letters)
, który losowo tasujeletters
wbudowane. Alej-1
jest tłumaczony nasample(j,1)
, który losowo pobiera próbki1
z wektora1:j
.(To zachowanie
sample
funkcji w zależności od liczby parametrów i tego, jaki jest pierwszy parametr, jest ogromnym bólem w tyłku kodu produkcyjnego, więc cieszę się, że mogę tutaj świetnie wykorzystać jego przewrotną naturę!)W przeciwnym razie kod po prostu tworzy lewą górną ćwiartkę wymaganego wyniku, zastępuje losowy element (the
j-1
,j-1
bit) losową cyfrą (0:9-1
bit) i rozkłada go dla wymaganej symetrii.i
Ij
są potrzebne, aby radzić sobie z parzystych i nieparzystych przypadkach.źródło
Python3, 287 bajtów
Moja pierwsza gra w golfa tutaj; Jestem pewien, że ktoś może zrobić znacznie lepiej:
Wypróbuj online!
Dzięki HyperNeurtrino, Ourous i Heiteria zmniejszyło się to do 193 bajtów (patrz komentarze). Jednak TFeld poprawnie wskazał, że wiele wywołań
sample
nie gwarantuje co najmniejN
różnych znaków.Mając to na uwadze, wypróbuj nową wersję, która powinna gwarantować co najmniej
N
różne znaki na uruchomienie.Python3,
265260 bajtów, co najmniejN
różne znakiWypróbuj online!
źródło
a[:-1][::-1]
jest zasadniczo równoważnya[:-2::-1]
i można importowaćrandom
jakor
zamiastrn
, i można przenieśćfor
pętlę do wyrażenia wbudowanego. Wypróbuj online!math
import, używając-(-a // 2)
zamiast tego wmath.ceil(a / 2)
zasadzie ujemnego podziału podłogi na wartość ujemną (efektywnie sufit). tio.run/##XY7LagMxDEX3/…sample()
nie gwarantuje, że otrzymasz co najmniejN
różne postacie. Udało mi się dostać[['g', 'x', 'x', 'g'], [7, 'x', 'x', 7], [7, 'x', 'x', 7], ['g', 'x', 'x', 'g']]
doN=4
, który ma tylko 3 różne znakiAPL (Dyalog Classic) ,
45444340 bajtówdzięki @ Adám za -1 bajt
Wypróbuj online!
używa
⌈
(maks.) matrycy z jej odbiciami, aby uczynić ją symetryczną, więc jest tendencyjna w stosunku do drugiej części alfabetucyfra jest wybierana równomiernie od 0 ... 25 mod 10, więc ma małe odchylenie do niższych wartości
źródło
⌊2⍴⍵÷2)?⍵ ⍵⍴26]}
→⌊⍺⍵÷2)?⍺⍵⍴26]}⍨
⌊⍺⍵÷2
→⍺⍵
.Japt , 31 bajtów (stała pozycja cyfr)
Wypróbuj online!
Japt , 41 bajtów (pozycja losowej cyfry)
Wypróbuj online!
Wyjaśnienie
źródło
Python 2 , 259 bajtów
Wypróbuj online!
źródło
05AB1E ,
294038 bajtów+11 bajtów naprawić cyfrę będąc w dowolnej pozycji zachowując zasadę 3 w umyśle dla wejść nieparzystych ..
-2 bajty dzięki @MagicOctopusUrn , zmienia
îï
sięò
i zmienia pozycję z poniższych»
.Wypróbuj online i sprawdź kilka innych przypadków testowych .
Stara (
2927 bajtów ) odpowiedź, gdzie cyfra ustawia się zawsze w rogach:Wypróbuj online lub sprawdź kilka innych przypadków testowych .
Wyjaśnienie:
źródło
»
ï
zostało to zrobione również domyślnie. Niestety nie dotyczy to wersji 40-bajtowej, ponieważ∊
wstawiałby zamiast zamieniać.2
, wejście jest gwarantowane3 <= N <= 26
.n
litery alfabetu, zamiastn
losowych liter alfabetu. A najpierw połączenie nowych linii, a dopiero potem zrobienie kopii lustrzanych oszczędza bajt również w moim. Dzięki za -2 bajty! :) PS: Jeden bajt można zapisać w 28 bajtach, usuwając końcowy}
. :)C (gcc) ,
198197196 bajtówZaoszczędzono 2 bajty dzięki pułapce cat.
Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript (ES6),
213209206 bajtówWypróbuj online!
Skomentował
źródło
Czysty ,
346312bajtówjutro więcej golfa
Wypróbuj online!
źródło
Python 3 , 197 bajtów
Jak wspomniano @Emigna, nie działa dla nieparzystych wartości
N
(nie zrozumiałem poprawnie pytania)Wypróbuj online!
Myślę, że połączenia do
randint()
+sample()
+shuffle()
to za dużo, a pozbycie się tasowania w miejscu byłoby świetne :)Jestem prawie pewien, że ta część (która wybiera litery i cyfry) może być nieco bardziej golfa.
źródło
N
.N
że zawsze tak będzie, ponieważ nie rozumiem, jak macierz może być symetryczna, jeśli jest dziwna!Python 2 ,
275266 bajtówWypróbuj online!
Zwraca tablicę jako listę list znaków. Aby spełnić Regułę 1, stworzyliśmy pulę znaków:
Kolejnym trudnym bitem jest reguła 3: muszą być dokładnie 2 kolumny i wiersze z cyfrą; oznacza to
n
nieparzyste, że wybrana cyfra może nie pojawić się w środkowej kolumnie lub środkowym rzędzie. Ponieważ konstruujemy tablicę przy użyciu podwójnie odzwierciedlonej kwadratowej tablicy podrzędnejs
, osiąga się to tutaj za pomocą:tj. potasuj co najmniej raz; a następnie, jeśli
n
jest nieparzysty, kontynuuj zapętlanie, jeśli cyfra znajduje się w ostatniej kolumnie lub ostatnim wierszus
.źródło
Pyth , 48 bajtów
Wypróbuj online tutaj .
Program składa się z 3 części - zdefiniowanie funkcji palindromizacji, wybór położenia funkcji numerycznej i głównej.
Używanie kilku tasowanych alfabetów powinno zapewnić, że liczba unikalnych znaków jest zawsze większa niż liczba wejściowa.
źródło
Python 2 / Python 3, 227 bajtów
trochę golfa:
Starsze, prawie poprawne wersje poniżej:
Python2, Python3, 161 bajtów
Wygląda na to, że N różnych elementów jest prawie gwarantowane.
Python 2 / Python 3, 170 bajtów
Wygląda na to, że zapomniałem zasady 3. Również jakoś [: n * n] wślizgnęło się.
źródło
n = 3
nigdy nie będziesz miał wyniku zawierającego a'z'
, więc nie każde wyjście jest możliwe).