Napisz program lub funkcję, która pobiera siatkę tekstową 4 × 4 składającą się dokładnie z 4 A
, 4 B
, 4 C
i 4 D
, takich jak:
ACDC
BBCA
BADD
ABCD
W ABCD
„S może mieć dowolny układ, ale zawsze będzie 4 każdy. Możesz założyć, że dane wejściowe są prawidłowe. W razie potrzeby możesz również założyć, że ma on końcowy znak nowej linii i / lub że występuje jako jeden wiersz w kolejności czytania, np ACDCBBCABADDABCD
. Można również zastąpić znaki ABCD
z 0123
lub 1234
odpowiednio, w razie potrzeby (ale to wszystko).
Wypisuje prawdziwą wartość, jeśli siatka tekstowa ma jakąkolwiek formę symetrii odblaskowej lub obrotowej. Konkretnie:
Jeśli istnieje centralna pozioma linia symetrii. na przykład
BACD BACD BACD \___ bottom mirrors top BACD /
Jeśli istnieje centralna pionowa linia symetrii. na przykład
BCCB DAAD CAAC BDDB \/___ right mirrors left
Jeśli występuje ukośna linia symetrii (w obu kierunkach). na przykład
___ diagonally mirrored / ABDC BACD DCAB CDBA \___ diagonally mirrored
Jeśli występuje symetria obrotowa 90 °. na przykład
BDAB ACCD same if rotated 90 degrees (or 180 or 270) DCCA BADB
Jeśli występuje symetria obrotowa 180 °. na przykład
DBCA BDCA same if rotated 180 degrees ACDB ACBD
(Pamiętaj, że symetria translacyjna nie wchodzi tutaj w grę.)
Wypisuje wartość fałsz, jeśli siatka nie ma żadnej z wyżej wymienionych symetrii. np. pierwsza przykładowa siatka.
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
CJam, 16 bajtów
Nienazwany blok, który oczekuje danych wejściowych jako listy czterech ciągów znaków na górze stosu i pozostawia znak
0
(fałsz) dla danych asymetrycznych i dodatnią liczbę całkowitą (prawda) dla danych symetrycznych.Sprawdź to tutaj. Lub uruchom pełny zestaw testów.
Wyjaśnienie
Symetrie kwadratu są elementami grupy dwuściennej rzędu 8 (które są tylko 4 obrotami kwadratu i takimi samymi 4 obrotami niektórych odbijanych wersji kwadratu). Nie można wygenerować tej grupy po wielokrotnym zastosowaniu pojedynczej permutacji. Ale dwa odbicia zawsze dają pewien obrót. Stąd cała grupa może zostać wygenerowana przez czterokrotne naprzemienne odbicia. (Musimy tylko upewnić się, że dwa odbicia dają obrót o 90 stopni lub 270 stopni, a nie 0 lub 180.)
Wyzwanie polega na pytaniu, czy kwadrat wejściowy jest równy którejkolwiek z pozostałych 7 symetrii. Więc ta odpowiedź generuje je wszystkie, a następnie sprawdza, czy dane wejściowe należą do innych.
Aby zobaczyć, w jaki sposób wielokrotne stosowanie
z
iW%
generowanie wszystkich symetrii, spójrz na ten „schemat”:źródło
z
transponuję iW%
odwraca linie, więc generuję wszystkie symetrie poprzez ich wielokrotne stosowanie.Pyth, 11 bajtów
Zestaw testowy
To wykorzystuje technikę transpozycji i odwrotności Martina, ale z pewnym zwrotem. Podczas gdy inne rozwiązania wyraźnie wygenerowały wszystkie 8 symetrii, a następnie policzyły liczbę wystąpień oryginału, ten program używa Pyth's
.u
funkcji .The
.u
funkcja to „Zastosuj do znalezienia powtórzenia”. W takim przypadku na przemian dokonujemy transpozycji i cofania do momentu powtórzenia, a następnie gromadzimy wyniki w postaci listy. Następnie usuwam ostatnie 7 wartości, więc pozostanie wartość tylko wtedy, gdy nie będzie symetrii, a pierwsze powtórzenie miało miejsce po wygenerowaniu wszystkich 8 odbić i powtórzeń.Wyjaśnienie:
źródło
05AB1E , 13 bajtów
Wyjaśnienie
Używa metody fachowo wyjaśnionej przez Martina w odpowiedzi na CJam .
Wypróbuj online
źródło
Perl,
6160 bajtówObejmuje +3 za
-p0a
Podaj kwadrat wejściowy na STDIN, drukuje 0 dla braku symetrii, w przeciwnym razie pewna liczba dodatnia
symmetry.pl
:źródło
Dyalog APL ,
371917 bajtów@ngn zmniejszył go o 20 bajtów!
Wypróbuj APL online!
źródło
⍉¨
zamiast⌽∘⍉¨
też działa.Brachylog ,
3836 bajtówWypróbuj online!
Oczekuje to listy ciągów jako danych wejściowych. Drukuje albo
true.
albofalse.
.Wyjaśnienie
Główny predykat:
Predykat 1: Wyjście jest jedną z 8 symetrii wejścia.
źródło
TSQL, 229 bajtów
Pamiętaj, że TSQL nie ma wbudowanej funkcji obracania, więc jest to zawarte w kodzie.
Gra w golfa:
Nie golfowany:
Skrzypce
źródło
Python 2,
154146 bajtówSprawdza, czy którakolwiek z niezbędnych transformacji jest równoważna oryginałowi za pomocą tablic numpy. Dane wejściowe są traktowane jako lista czterech ciągów.
Wypróbuj online
Przyjmowanie danych wejściowych jako pojedynczego ciągu znaków jest dłuższe o jeden znak
A=array(list(input())).reshape(4,4)
.A[:,::-1]
jest taki sam jakfliplr(A)
.A[::-1]
jest taki sam jakflipud(A)
.źródło
map(list,input())
zamiast tego użyj[list(r)for r in input()]
any
przyjmuje wyrażenie generatora, dzięki czemu można zaoszczędzić kilka bajtów, upuszczając zewnętrzną parę nawiasów kwadratowych.print
instrukcja nie będzie działać. Spróbuj rozwidlić mój kod online i uruchomić go w ten sposób, aby zobaczyć.print
.Python 3, 99 bajtów
Funkcja, która pobiera dane wejściowe, za pomocą argumentu, listy ciągów znaków i zwraca
True
lub, wFalse
zależności od przypadku.Wykorzystuje takie samo podejście jak @ MartinEnder za odpowiedź .
Jak to działa
Wypróbuj na Ideone
źródło
JavaScript (ES6), 131 bajtów
17 bajtów można usunąć, jeśli przekażesz bezpośrednio tablicę 4 łańcuchów. Próbowałem kręcić bity (wejście w
"0123301223011230"
formacie), ale zajęło mi to 199 bajtów:źródło