Bitwa tablicowa z dziwnymi sekretnymi mocami

11

Oto stosunkowo proste wyzwanie dla dwuwymiarowej tablicy.

Wyobraź sobie pole bitwy z 625 piechotą. Ci dowodzić dziwnych żołnierzy, ale niestety siła nawet wojska przytłacza cię. Na szczęście twoi żołnierze mają tajną moc: jeśli moc każdego nieparzystego oddziału i towarzyszących mu nieparzystych sojuszników jest podzielna przez tajną liczbę mocy, rozpętają swój ostateczny atak i wygrywają! Musisz uhonorować każdego zwycięskiego żołnierza.

Zasady

Biorąc pod uwagę tablicę liczb całkowitych 25 x 25, w której każdy element zawiera iloczyn swojej pozycji xiy plus 1, zwraca współrzędne każdego „zwycięskiego” nieparzystego elementu, który spełnia następujące kryteria:

Suma wartości elementu i sąsiednich nieparzystych elementów (góra, dół, lewo i prawo) jest podzielna przez dane wejściowe (tajna liczba mocy). Musi mieć elementy przylegające do niego ze wszystkich czterech stron i nie może znajdować się na krawędzi.

Zgłoszenia mogą być funkcją lub pełnym programem, który wymaga pojedynczego wejścia. Dane wyjściowe mogą być w dowolnej kolejności.

Nasza tablica 25 x 25, pole bitwy, wygląda następująco:

1, 1, 1, 1,...
1, 2, 3, 4,...
1, 3, 5, 7,...
1, 4, 7, 10,...
etc.

Przykład

Oto przykład 3 x 3:

43, 57, 71
46, 61, 76
49, 65, 81

Aby ustalić, czy element (61 w środku) wygrywa, sumujemy wartości tego i sąsiednich elementów nieparzystych.

61 + 57 + 65 = 183

Jeśli suma jest podzielna przez dane wejściowe, drukowana jest pozycja xiy elementu. Jeśli naszą wartością wejściową jest 3, ponieważ 183 można podzielić przez 3, zostanie wydrukowane „1, 1”.

Wynik

Jeśli dane wejściowe (tajny numer mocy) to 37, zwrócone elementy (zwycięscy żołnierze, których należy pochwalić) muszą być:

2, 18
3, 12
4, 9
5, 22
6, 6
8, 23
9, 4
10, 11
11, 10
12, 3
18, 2
22, 5
23, 8

Jeśli wartością wejściową jest 191, zwracane elementy muszą być:

10, 19
19, 10

Wejście 3:

1, 2
1, 4
1, 6
1, 8
1, 10
1, 12
1, 14
1, 16
1, 18
1, 20
1, 22
2, 1
2, 3
2, 4
2, 5
2, 7
2, 9
2, 10
2, 11
2, 13
2, 15
2, 16
2, 17
2, 19
2, 21
2, 22
2, 23
3, 2
3, 4
3, 6
3, 8
3, 10
3, 12
3, 14
3, 16
3, 18
3, 20
3, 22
4, 1
4, 2
4, 3
4, 5
4, 7
4, 8
4, 9
4, 11
4, 13
4, 14
4, 15
4, 17
4, 19
4, 20
4, 21
4, 23
5, 2
5, 4
5, 6
5, 8
5, 10
5, 12
5, 14
5, 16
5, 18
5, 20
5, 22
6, 1
6, 3
6, 5
6, 7
6, 9
6, 11
6, 13
6, 15
6, 17
6, 19
6, 21
6, 23
7, 2
7, 4
7, 6
7, 8
7, 10
7, 12
7, 14
7, 16
7, 18
7, 20
7, 22
8, 1
8, 3
8, 4
8, 5
8, 7
8, 9
8, 10
8, 11
8, 13
8, 15
8, 16
8, 17
8, 19
8, 21
8, 22
8, 23
9, 2
9, 4
9, 6
9, 8
9, 10
9, 12
9, 14
9, 16
9, 18
9, 20
9, 22
10, 1
10, 2
10, 3
10, 5
10, 7
10, 8
10, 9
10, 11
10, 13
10, 14
10, 15
10, 17
10, 19
10, 20
10, 21
10, 23
11, 2
11, 4
11, 6
11, 8
11, 10
11, 12
11, 14
11, 16
11, 18
11, 20
11, 22
12, 1
12, 3
12, 5
12, 7
12, 9
12, 11
12, 13
12, 15
12, 17
12, 19
12, 21
12, 23
13, 2
13, 4
13, 6
13, 8
13, 10
13, 12
13, 14
13, 16
13, 18
13, 20
13, 22
14, 1
14, 3
14, 4
14, 5
14, 7
14, 9
14, 10
14, 11
14, 13
14, 15
14, 16
14, 17
14, 19
14, 21
14, 22
14, 23
15, 2
15, 4
15, 6
15, 8
15, 10
15, 12
15, 14
15, 16
15, 18
15, 20
15, 22
16, 1
16, 2
16, 3
16, 5
16, 7
16, 8
16, 9
16, 11
16, 13
16, 14
16, 15
16, 17
16, 19
16, 20
16, 21
16, 23
17, 2
17, 4
17, 6
17, 8
17, 10
17, 12
17, 14
17, 16
17, 18
17, 20
17, 22
18, 1
18, 3
18, 5
18, 7
18, 9
18, 11
18, 13
18, 15
18, 17
18, 19
18, 21
18, 23
19, 2
19, 4
19, 6
19, 8
19, 10
19, 12
19, 14
19, 16
19, 18
19, 20
19, 22
20, 1
20, 3
20, 4
20, 5
20, 7
20, 9
20, 10
20, 11
20, 13
20, 15
20, 16
20, 17
20, 19
20, 21
20, 22
20, 23
21, 2
21, 4
21, 6
21, 8
21, 10
21, 12
21, 14
21, 16
21, 18
21, 20
21, 22
22, 1
22, 2
22, 3
22, 5
22, 7
22, 8
22, 9
22, 11
22, 13
22, 14
22, 15
22, 17
22, 19
22, 20
22, 21
22, 23
23, 2
23, 4
23, 6
23, 8
23, 10
23, 12
23, 14
23, 16
23, 18
23, 20
23, 22

Wejście 5:

1, 4
1, 14
2, 2
2, 4
2, 6
2, 7
2, 8
2, 10
2, 12
2, 14
2, 16
2, 17
2, 18
2, 20
2, 22
3, 8
3, 18
4, 1
4, 2
4, 4
4, 6
4, 8
4, 10
4, 11
4, 12
4, 14
4, 16
4, 18
4, 20
4, 21
4, 22
6, 2
6, 4
6, 6
6, 8
6, 9
6, 10
6, 12
6, 14
6, 16
6, 18
6, 19
6, 20
6, 22
7, 2
7, 12
7, 22
8, 2
8, 3
8, 4
8, 6
8, 8
8, 10
8, 12
8, 13
8, 14
8, 16
8, 18
8, 20
8, 22
8, 23
9, 6
9, 16
10, 2
10, 4
10, 6
10, 8
10, 10
10, 12
10, 14
10, 16
10, 18
10, 20
10, 22
11, 4
11, 14
12, 2
12, 4
12, 6
12, 7
12, 8
12, 10
12, 12
12, 14
12, 16
12, 17
12, 18
12, 20
12, 22
13, 8
13, 18
14, 1
14, 2
14, 4
14, 6
14, 8
14, 10
14, 11
14, 12
14, 14
14, 16
14, 18
14, 20
14, 21
14, 22
16, 2
16, 4
16, 6
16, 8
16, 9
16, 10
16, 12
16, 14
16, 16
16, 18
16, 19
16, 20
16, 22
17, 2
17, 12
17, 22
18, 2
18, 3
18, 4
18, 6
18, 8
18, 10
18, 12
18, 13
18, 14
18, 16
18, 18
18, 20
18, 22
18, 23
19, 6
19, 16
20, 2
20, 4
20, 6
20, 8
20, 10
20, 12
20, 14
20, 16
20, 18
20, 20
20, 22
21, 4
21, 14
22, 2
22, 4
22, 6
22, 7
22, 8
22, 10
22, 12
22, 14
22, 16
22, 17
22, 18
22, 20
22, 22
23, 8
23, 18

To jest , zwycięzcą jest kod o najniższej liczbie bajtów bez użycia standardowych luk.

Ponieważ jest to moje pierwsze zgłoszenie, każda rada jest bardzo mile widziana. Dzięki!

Pandazoik
źródło
Jestem trochę zdezorientowany, biorąc pod uwagę tablicę liczb całkowitych 25 x 25 . Czy nasze zgłoszenia powinny generować tę listę, czy faktycznie jest ona podawana na podstawie danych wejściowych?
Mr. Xcoder,
Liczy się tylko wynik. Generowanie rzeczywistej tablicy jest opcjonalne.
Pandazoic
„Wyobraź sobie pole bitwy żołnierzy o długości 625 stóp” . To jest wysokie. O_o
Chronocidal

Odpowiedzi:

3

JavaScript (ES6),  83 81 80  76 bajtów

Dane wyjściowe to rozdzielany spacjami ciąg współrzędnych x,y.

f=(n,x=y=23,k=5,v=x*y)=>y?(v&1|~v*k%n?[]:[x,y]+' ')+f(n,--x||23|!y--,k^6):[]

Wypróbuj online!

W jaki sposób?

Pozwolić cx,y=xy+1 być wartością komórki znajdującej się w (x,y).

Ponieważ komórki na krawędzi nie są rozliczane, zakładamy 0<x<24 i 0<y<24.

cx,y jest dziwne, jeśli jedno z nich x lub y jest parzysty (lub oba).

Gdyby x jest więc dziwne cx1,y i cx+1,ysą dziwne. Ale w takim przypadkuy muszą być równe i takie też są cx,y1 i cx,y+1. Suma komórki i jej dziwnych sąsiadujących sąsiadów wynosi:

sx,y=cx,y+cx1,y+cx+1,y=3cx,y

Podobnie jeśli y to jest dziwne:

sx,y=cx,y+cx,y1+cx,y+1=3cx,y

Jeśli oba x i y są parzyste, wszyscy otaczający sąsiedzi są dziwni:

sx,y=cx,y+cx1,y+cx+1,y+cx,y1+cx,y+1=5cx,y

Ten mnożnik (3 lub 5) jest nazwany k w kodzie JS.

Skomentował

f = (                // f is a recursive function taking:
  n,                 //   n      = input
  x = y = 23,        //   (x, y) = current coordinates, starting at (23, 23)
  k = 5,             //   k      = multiplier (3 or 5)
  v = x * y          //   v      = x * y (value of the current cell - 1)
) =>                 //
  y ?                // if y is greater than 0:
    ( v & 1 |        //   if v is odd (meaning that v + 1 is not)
      ~v * k % n ?   //   or n is not a divisor of -(v + 1) * k:
        []           //     append nothing
      :              //   else:
        [x, y] + ' ' //     append the coordinates followed by a space
    ) +              //
    f(               //   append the result of a recursive call:
      n,             //     pass n unchanged
      --x ||         //     decrement x; if the result is 0:
        23 | !y--,   //       pass 23 instead and decrement y
      k ^ 6          //     update k (5 -> 3 -> 5 -> ...)
    )                //   end of recursive call
  :                  // else:
    []               //   stop recursion
Arnauld
źródło
Dzięki za wnikliwe wyjaśnienie. Sprytne użycie bitowego XOR do przełączania między mnożnikami.
Pandazoic
3

C # (interaktywny kompilator Visual C #) , 97 93 91 90 bajtów

x=>{for(int i=0,d=0,j;++i<24;d=5)for(j=0;++j<24;d^=6)if(i*j%2+(i*j+1)*d%x<1)Print((i,j));}

Zaoszczędź 6 bajtów dzięki @Kevin Cruijssen!

Wypróbuj online!

Wcielenie ignorancji
źródło
int i=0; ... int j=0;może być int i=0,j; ... j=0;i <1&może być +dla -4 bajtów.
Kevin Cruijssen
@KevinCruijssen W przypadku deklaracji int pierwotnie miałem to w ten sposób, dopóki nie zmieniłem mojej funkcji na inną metodę, a następnie ją cofnąłem. Ten +jest jednak miły, dzięki
Embodiment of Ignorance
Innym -2 zastępując ((i+j)%2>0?3:5)o(5-(i+j)%2*2)
Kevin Cruijssen
2

Stax , 25 bajtów

âÖÅ{┼îÄï$εS╢,σδXú(Γ°#↑√nG

Uruchom i debuguj

Jest to przeważnie brutalna siła, z jedną nieznacznie sprytną obserwacją. Wszystkie nieparzyste oddziały mają 2 lub 4 nieparzystych sąsiadów. A ich suma plus oryginalny lut to albo, 3palbo 5pgdzie pjest siła żołnierza. Współczynnik (3 lub 5) można określić, gcd(2, x, y) * 2 + 1)gdzie xi gdzie ysą współrzędne żołnierza.

rekurencyjny
źródło
2

Python 2 , 83 bajty

lambda n:[(x,y)for x in R for y in R if~(x*y)*[5,3][x+y&1]%n<1>x*y%2]
R=range(1,24)

Wypróbuj online!

Dzięki Arnauldowi za uratowanie bajtu.

xnor
źródło
Ach, w zasadzie ten sam program do mojej przygotowanej odpowiedzi js ...
tsh
1

Galaretka , 22 bajty

23×þ`‘µḤḤÐeÐe+×Ḃ³ḍaƊŒṪ

Wypróbuj online!

Pełny program, który pobiera pojedynczy argument, tajny numer mocy i niejawnie drukuje listę [x, y]par. Korzysta z obserwacji innych na temat wielokrotności 3 i 5.

Nick Kennedy
źródło