Niech szachownica 8x8 będzie reprezentowana przez dowolne dwie różne wartości, przy czym jedna wartość będzie pustym kwadratem, a druga królową. W poniższych przykładach używam 0 jako pustych kwadratów i 1 jako królowych. Na przykład:
jest dany przez
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Rozważ liczbę par królowych, które atakują każdą z nich, co najmniej o jedno pole kwadratowe (dla przypomnienia królowe atakują ortogonalnie i po przekątnej). W powyższym przykładzie poniższy niesamowity brzydki schemat pokazuje wszystkie te pary jako strzałki.
Znaleziono powyżej 43 par, podając następujący przypadek testowy:
Input:
1 0 1 1 1 0 0 0
1 0 1 0 1 0 1 1
1 0 1 0 1 1 0 1
0 1 0 1 0 1 0 0
0 1 1 0 0 1 0 1
1 0 0 0 1 0 0 0
0 1 0 0 0 1 1 1
0 1 1 1 0 1 0 1
Output: 43
Wyzwanie
Napisz program, który, biorąc pod uwagę stan planszy reprezentowany przez dwie różne wartości, wypisuje liczbę par królowych, które atakują się nawzajem, z co najmniej jednym kwadratem między nimi.
- Możesz wpisać w dowolnym dogodnym formacie, który używa dwóch wartości do przedstawienia pustych kwadratów i królowych, np. Ciąg 64 "." Dla pustych kwadratów i "Q" dla królowych według rzędów od dołu do góry, 8x8 macierz booleanów, lista liczb całkowitych 0 i 1 itd., o ile jest to wyjaśnione w twoim rozwiązaniu
- Dane wyjściowe to liczba całkowita
- Obowiązują standardowe metody we / wy, a standardowe luki są zabronione
- To jest kod golfowy, więc wygrywa najkrótsza odpowiedź w bajtach
Przypadki testowe:
W formacie 0 i 1, gdzie 0 to puste kwadraty, a 1 to królowe:
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 0
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 0
Input:
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Output: 1
Input:
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 1 0 0 0 0 1 0
0 0 0 0 1 0 1 0
0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0
0 0 0 0 0 0 0 0
Output: 10
Input:
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 4
Input:
1 1 0 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
Output: 11
źródło
Odpowiedzi:
Python 2 , 105 bajtów
Wypróbuj online!
Wyjaśnienie
Pobieramy dane wejściowe jako ciąg 64 znaków
'0'
lub'1'
. Używając plasterków kroków, rzucamy cztery „linie wzroku” z każdej napotkanej królowej. Na przykład, gdy i = 10 i d = 7 , oznaczenie królowej jako ♥, a płytki wybrane przezb[i+d::d]
█:Oczywiście nie chcemy, aby wizja owijała się wokół planszy w ten sposób. Obliczamy więc, jak daleko krawędź planszy jest w każdym kierunku, i oglądamy płytki
b[i+d::d][:…]
.Dla każdej pary kierunków płytek liczymy:
To się nie powiedzie za każdym razem
c
nie jest królową; lubfind
zwraca 0); lubfind
zwraca -1).Każda para królowych jest sprawdzana tylko raz, ponieważ promienie są zawsze rzucane do przodu w kolejności czytania, od „wcześniejszej” królowej do „późniejszej”.
źródło
JavaScript (ES7), 86 bajtów
Pobiera dane wejściowe jako tablicę 64 liczb całkowitych z 254 dla królowej i 0 dla pustego kwadratu.
Wypróbuj online!
Ta wersja wykorzystuje niedopełnienie arytmetyczne, aby uzyskać warunek zatrzymania w części rekurencyjnej.
JavaScript (ES7), 89 bajtów
Pobiera dane wejściowe jako tablicę 64 bitów.
Wypróbuj online!
W jaki sposób?
Rekurencyjnie wywołujemy nazwaną funkcję zwrotną,
map()
aby przejść przez kwadraty w danym kierunku. Chociaż tak naprawdę nie potrzebujemy zawartości trzeciego parametru wywołania zwrotnego (tablicamap()
została wywołana), używamy go jednak pośrednio, aby wiedzieć, czy jest to pierwsza iteracja, czy nie.To jest zmienna x w kodzie.
źródło
Ślimaki , 14 bajtów
Wypróbuj online!
Dane wejściowe mają format 0/1, bez spacji w wierszach.
Ślimaki zostały stworzone z myślą o wyzwaniu PPCG w zakresie projektowania w języku 2D . Co najważniejsze, domyślnie wyświetla liczbę znalezionych dopasowań, co idealnie nadaje się do tego wyzwania.
A
ustawia opcję „wszystkie ścieżki”, tak że jeśli królowa jest w wielu parach, każda z tych par wygeneruje dopasowanie.rdaa7
ustawia kierunek dopasowania na S, SE, E i NE. Ustawienie wszystkich kierunków (z
) spowodowałoby podwójne liczenie.\1\0+\1
dopasowuje a1
, następnie jeden lub więcej0
s, a następnie drugi1
.źródło
APL (Dyalog Classic) ,
413932 bajtówWypróbuj online!
≠⍨
jest „nie równy sobie” - macierz zerowa 8x8⊢,≠⍨,⌽,≠⍨
- jeśli oryginalna macierz jestABC...
, to wyrażenie zwraca:8 31⍴
przekształca go z 8x32 na 8x31, ponownie wykorzystując elementy w kolejności rzędów głównych:⊢,⍉,
przygotowuje oryginalną matrycę i jej transpozycję (dodatkowe spacje dla przejrzystości):2<⌿0⍪
dodaje 0 na górze i porównuje użycie<
każdego elementu z elementem pod nim, więc otrzymujemy 1 dla wiodącej 1 w każdej pionowej grupie 1, i otrzymujemy 0 wszędzie indziej+⌿-⌈⌿
sumy według kolumny minus maksima według kolumny - obliczamy liczbę przerw między grupami 1 w każdej kolumnie, 0 jeśli nie ma+/
sumaźródło
Galaretka ,
2220 bajtówWypróbuj online!
źródło
Retina 0.8.2 ,
6058 bajtówWypróbuj online! Pobiera dane wejściowe jako 8-znakowe ciągi binarne rozdzielone przecinkami, ale nagłówek konwertuje podany format. Wyjaśnienie:
Stwórz wszystkie podłazy planszy, zaczynając od królowej. Dodaj wartość znacznika do każdego podłańcucha. Edycja: Zapisano 2 bajty, pozostawiając niektóre ciągi śmieci; są one skutecznie ignorowane.
Podziel każdy znacznik na obejmujący zakres i dodaj 7 do niezerowych elementów.
Usuń każdy ciąg znaków, który jest równy długości znacznika. Jest to równoważne ze znalezieniem każdego promienia na wschód, południowy zachód, południe lub południowy wschód od każdej królowej.
Policz wszystkie promienie, które przechodzą przez co najmniej jeden pusty kwadrat przed spotkaniem z inną królową.
źródło
JavaScript (ES6) + SnakeEx , 38 bajtów
Pobiera dane wejściowe w formularzu
'10111000\n10101011\n10101101\n01010100\n01100101\n10001000\n01000111\n01110101'
. Okazuje się, że SnakeEx może być nadal używany poza oryginalnym wyzwaniem!źródło
K (ngn / k) , 45 bajtów
Wypróbuj online!
źródło