Wprowadzenie
Aron Nimzowitsch był czołowym mistrzem szachowym i wpływowym pisarzem szachowym.
W swojej książce „Mój system” pierwszy rozdział mówi o znaczeniu centrum i dlaczego należy go zdominować. Prostym powodem jest to, że twoje pionki mają więcej możliwych bezpośrednich następnych ruchów, gdy znajdują się w centrum, co ponownie daje graczowi więcej mocy.
Staje się to bardzo jasne, patrząc na różne pozycje rycerza i jego potencjalne kolejne ruchy (pokazane na różowo) na pustej planszy:
Cel
Oceń liczbę potencjalnych bezpośrednich ruchów rycerza na pustej planszy na podstawie jego pozycji.
Dane wejściowe
Pozycja rycerza.
Najpierw x (kolumna), a następnie y (wiersz). 0 0
to lewy dolny róg.
Dla uproszczenia zmieniłem etykiety szachownicy na same cyfry. W naszych przykładach i przypadkach testowych korzystamy z indeksu opartego na 0, jednak możesz swobodnie korzystać z indeksu opartego na 1.
Możesz użyć dowolnego rodzaju możliwych formatów wejściowych, tablicy, argumentów funkcji itp.
Dane wyjściowe
Liczba potencjalnych bezpośrednich następnych ruchów rycerza na pustej planszy.
Przypadki testowe
3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3
Przypadki testowe wykorzystują indeks oparty na 0. Pełna siatka wartości to:
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2
Odpowiedzi:
Python 2 , 35 bajtów
Wypróbuj online!
Python 2 , 39 bajtów
Wypróbuj online!
Przyjmuje wejścia 0-indeksowane.
Wyrażenie
x*(7-x)/5
przyjmuje wartości współrzędnych0..7
do(
min(x,7-x,2)
robi to samo, ale jest dłuższe.) Podsumowując tox
iy
daje właściwy wzór, ale z niewłaściwymi liczbami(Zobacz rozwiązanie Neila, aby uzyskać lepsze uzasadnienie, dlaczego daje to odpowiedni wzór).
Wreszcie mapowanie
a -> 50/(8-a)-4
z podziałem podłogi daje prawidłowe wartościAlternatywne równie długie rozwiązanie z wejściami 1-indeksowanymi:
źródło
(7-a)*a/5
jest o 3 bajty krótszy niżmin(a,7-a,2)
.*l
faktycznie kosztuje Cię bajt,lambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]
to tylko 41 bajtów.x*(9-x)/6
jednym indeksem.<strike>
jak wszyscy inni do pokazania postępów w golfa?MATL ,
17141312 bajtówDzięki @Neil za 1 bajt off!
Dane wejściowe są oparte na 1.
Wypróbuj online!
Wyjaśnienie
Oblicza to odległość euklidesową od wejścia do każdej z 64 pozycji na szachownicy i określa, ile z tych wartości równa się pierwiastkowi kwadratowemu z 5.
Ponieważ współrzędne są liczbami całkowitymi, możemy być pewni, że dwie wartości zmiennoprzecinkowe reprezentujące pierwiastek kwadratowy z 5 (obliczone ze współrzędnych i obliczone bezpośrednio) są rzeczywiście takie same.
źródło
double
liczbę. Mrówka oszczędza bajtMathematica
6343 bajtyZ 20 bajtami zapisanymi dzięki sugestiom Martina Endera!
Powyżej znajduje się liczba kwadratów, które są 1 skok od danej komórki na pełnym wykresie trasy rycerzy.
g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]
wyświetla pełny wykres trasy rycerza z nazwami i współrzędnymi wierzchołków. Zauważ, że Mathematica domyślnie indeksuje współrzędne w oparciu o jeden indeks.
#+1+8#2&[r,f]
konwertuje zwraca wierzchołek odpowiadający kwadratowi na poziomie (wiersz)r
i plikowi (kolumna)f
, używając wartości zerowych jako danych wejściowych.Na przykład
#+1+8#2&[2,1]
zwraca 11.EdgeCount
podaje liczbę krawędzi na wykresie sąsiedztwa.Krawędzie dla rangi 2, plik 1 (kwadrat 11):
Podświetlone krawędzie:
Metoda 2: Odległość euklidesowa
70 bajtów
Ta metoda jest dłuższa, ale może budzi pewne zainteresowanie. Podejście polega na sprawdzeniu odległości euklidesowej między środkiem szachownicy a interesującą komórką.
Przykłady
2)
8
Aby zobrazować, w jaki sposób odległość od środka szachownicy jest wystarczająca do przypisania wartości.
Okrąg [{4.5, 4.5}, 4],
Okrąg [{4.5, 4.5}, 4.6], Spłaszcz [f / @ {2, 3, 4, 6, 8}, 1]}, Osie -> True, AxesOrigin -> {-1, -1}]
Liczby 2.2, 3, 4 i 4.6 to promienie okręgów.
źródło
KnightTourGraph
Mathematica i jej wbudowane ... :-)#
na końcu twojego kodu źródłowego (tuż przed]
) jest błąd. Powinieneś być w stanie użyćIncidenceList
zamiastEdgeList@NeighborhoodGraph
tego. (Alternatywnie też jestEdgeCount
, ale myślę, że to się wydłuża.)EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
EdgeCount
jest bardzo fajny!JavaScript (ES6), 38 bajtów
Przyjmuje wejścia 0-indeksowane. Objaśnienie: Spójrz na kwadraty odległości do centrum:
Liczba osiągalnych kwadratów dzieli się na pięć pasm:
Faktycznie obliczam 24,5 - (3,5 - x) ** 2 - (3,5 - y) ** 2 = (7 - x) * x + (7 - y) * y, ponieważ jest to krótsze obliczenie, ale wszystko jest odwrotne kolejność pasm.
źródło
x*(7-x)
prostu operacja, która wygląda jak łuk skierowany w dół0..7
i zdarza się, że dopasowuje się do krzywej, ale to wyjaśnia, dlaczego tworzy tak ładny wzór, gdy jest sumowanyx
iy
.Galaretka, 10 bajtów
1-indeksowany. Przyjmuje pojedynczy argument formularza
[x,y]
. Wypróbuj tutaj.Dennis uratował bajt!
źródło
Mathematica,
4440 bajtówObecnie mam trzy rozwiązania o tej samej liczbie bajtów:
Wszystkie są funkcjami nienazwanymi, które przyjmują parę współrzędnych
{3, 4}
, na przykład 1.Próbowałem wymyślić nieco wyraźną formułę. Ogólny wzór na całej planszy wygląda następująco:
Rzeczywiste wartości tych kolorów (od najjaśniejszego do najciemniejszego) to
2, 3, 4, 6, 8
. To jest:Najpierw wykorzystujemy symetrię, przenosząc początek na środek, przyjmując wartość bezwzględną i odejmując wynik
4
. To daje nam współrzędne0.5
do3.5
zwiększenia z każdego rogu. Aby współrzędne środka były takie same, musimy odwzorować0.5
i1.5
na różne wartości2.5
i3.5
na tę samą wartość. Można to łatwo zrobić, mnożąc przez0.8
(daje{0.4, 1.2, 2., 2.8}
) i wyrównując wynik. Teraz mamy już{0, 1, 2, 2}
odległości od centrum. Jeśli dodamy współrzędne w każdej komórce, otrzymamy tę tabelę:Ma unikalne wartości dla wszystkich różnych możliwych wyników, więc po prostu używamy go jako indeksu do
2[3,4,6,8]
.W drugiej wersji używamy sufitu zamiast podłogi. W ten sposób
2
,3
a4
już są poprawne, ale mamy5
i6
zamiast6
a8
, więc skorygować te ręcznie z reguły podstawiania.Wreszcie w trzeciej wersji rozszerzamy
5
i zwiększamy6
do6
i8
za pomocą potęgowania, a następnie kolejnej operacji na podłodze.źródło
APL, 21 znaków
Po angielsku:
(⍳8 8)
: Tablica 8x8 rangi-2 zawierająca współrzędne wszystkich komórek;+/¨×⍨(⍳8 8)-⊂⍵
: kwadrat euklidesowych odległości danej komórki w odniesieniu do każdej komórki na planszy;5=
: macierz 0/1, gdzie 1s pojawiają się w kwadratowych odległościach równych 5;+/,
: zsumuj spłaszczoną macierzTest (w oryginale 1):
W tej formie:
lewy argument może określać wymiary tablicy. Dlatego
8 8 f
będzie działać na standardowej kwadratowej szachownicy. Ale na większej i prostokątnej płycie przypadki testowe dałyby inne wyniki. Na przykład na płycie 12x10:źródło
≢⍸5=+/¨×⍨-∘⎕¨⍳8 8
Wypróbuj online!Java -
160150 bajtówNie golfowany:
Nieskluczony kod jest identyczny, z wyjątkiem zmiany granic pętli for w celu zaoszczędzenia 4 bajtów. Działa poprzez iterowanie każdego możliwego ruchu i przeprowadzanie kontroli granic (> 0 i <8). Wykorzystuje fakt, że przesunięcia to (1, 2), (2, 1), (-1, 2), (-2, 1) itd. I jest w stanie sprawdzić 2 ruchy dla każdej wartości i i j.
Edycja: 10 bajtów zapisanych dzięki sugestiom Leaky Nun i u902383.
źródło
int m=0,i=-1,j;
zaoszczędzić trochę bajtówC, 44 bajtów
Ale to jest lepsze:
źródło
;
. Nie kompiluje się.Haskell,
4948 bajtówźródło
[0..7]
do zmiennej na 1 bajt.Java, 81 znaków (113 bajtów)
Zakoduj całą tabelę wyników jako tabelę Unicode, a następnie uzyskaj odpowiednie bajty wykonując operacje bitowe.
Możesz to zobaczyć online tutaj: https://ideone.com/K9BojC
źródło
Python, 94 bajty
Wykorzystuje indeksowanie 1.
Demo na https://repl.it/C6gV .
źródło
Pyth -
3315 bajtówDzięki @LeakyNun za zmniejszenie mojego rozmiaru o połowę.
Zmiana rozmieszczenia map i map
V
prawdopodobnie trochę zaszkodzi.Pakiet testowy .
źródło
APL (Dyalog Unicode) , 15 bajtów SBCS
Wypróbuj online!
źródło
J , 23 bajty
Wypróbuj online!
Hołd dla metody Lynn, przekonwertowany na J.
źródło
Właściwie 18 bajtów
Wypróbuj online!
Ten realizuje tę samą formułę, że wiele innych odpowiedzi zostały przy użyciu:
50/(8-x*(7-x)//5+y*(7-y))//5)-4
. Dane wejściowe są traktowane jako lista:[x,y]
(lub dowolny literał iterowalny w Pythonie, taki jak(x,y)
lubx,y
).Wyjaśnienie:
źródło
Perl 6 , 44 bajtów
Wypróbuj online!
źródło