Ein Array-Kampf mit seltsamen geheimen Kräften

11

Hier ist eine relativ einfache zweidimensionale Array-Herausforderung.

Stellen Sie sich ein Schlachtfeld von 625 Fußsoldaten vor. Sie befehligen die ungeraden Truppen, aber leider überwältigt Sie die Stärke der geraden Truppen. Zum Glück haben Ihre Soldaten eine geheime Macht: Wenn die Macht jeder ungeraden Truppe und der sie umgebenden ungeraden Verbündeten durch eine geheime Machtzahl teilbar ist, entfesseln sie ihren ultimativen Angriff und gewinnen! Sie müssen jeden siegreichen Soldaten ehren.

Regeln

Geben Sie bei einem 25 x 25 Integer-Array, bei dem jedes Element das Produkt seiner x- und y-Position plus 1 enthält, die Koordinaten jedes "siegreichen" ungeraden Elements zurück, das die folgenden Kriterien erfüllt:

Die Summe des Wertes des Elements und seiner benachbarten ungeraden Elemente (oben, unten, links und rechts) ist durch die Eingabe (geheime Potenznummer) teilbar. Es muss an allen vier Seiten Elemente neben sich haben und darf nicht an einer Kante sein.

Einsendungen können entweder eine Funktion oder ein vollständiges Programm sein, für das eine einzige Eingabe erforderlich ist. Die Ausgabe kann in beliebiger Reihenfolge erfolgen.

Unser 25 x 25-Array, das Schlachtfeld, sieht folgendermaßen aus:

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

Beispiel

Hier ist ein 3 x 3 Beispiel:

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

Um festzustellen, ob ein Element (61 in der Mitte) gewinnt, addieren wir die Werte davon und die benachbarten ungeraden Elemente.

61 + 57 + 65 = 183

Wenn die Summe durch die Eingabe teilbar ist, wird die x- und y-Position des Elements gedruckt. Wenn unsere Eingabe 3 ist, weil 183 durch 3 teilbar ist, wird "1, 1" gedruckt.

Ausgabe

Wenn die Eingabe (geheime Kraftnummer) 37 ist, müssen die zurückgegebenen Elemente (zu lobende siegreiche Soldaten) sein:

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

Wenn die Eingabe 191 ist, müssen die zurückgegebenen Elemente sein:

10, 19
19, 10

Eine Eingabe von 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

Eine Eingabe von 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

Dies ist , der Code mit der niedrigsten Byteanzahl ohne Verwendung von Standardschlupflöchern ist der Gewinner.

Da dies meine erste Einreichung ist, wird jeder Rat sehr geschätzt. Vielen Dank!

Pandazoic
quelle
Ich bin ein bisschen verwirrt über ein 25 x 25 Integer-Array . Sollten unsere Einsendungen diese Liste generieren oder wird sie tatsächlich bei der Eingabe angegeben?
Mr. Xcoder
Nur die Ausgabe ist wichtig. Das Generieren des tatsächlichen Arrays ist optional.
Pandazoic
"Stellen Sie sich ein Schlachtfeld von 625 Fuß Soldaten vor" Richtig. Das ist groß. O_o
Chronocidal

Antworten:

3

JavaScript (ES6),  83 81 80  76 Byte

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):[]

Probieren Sie es online aus!

Wie?

cx,y=xy+1(x,y)

0<x<240<y<24

cx,yxy

xcx- -1,ycx+1,yycx,y- -1cx,y+1

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

y

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

xy

sx,y=cx,y+cx- -1,y+cx+1,y+cx,y- -1+cx,y+1=5cx,y

35k

Kommentiert

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
quelle
Danke für die aufschlussreiche Erklärung. Clever mit einem bitweisen XOR zwischen den Multiplikatoren wechseln.
Pandazoic
3

C # (Visual C # Interactive Compiler) , 97 93 91 90 Byte

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));}

6 Bytes dank @Kevin Cruijssen gespart!

Probieren Sie es online aus!

Verkörperung der Unwissenheit
quelle
int i=0; ... int j=0;kann int i=0,j; ... j=0;und <1&kann +für -4 Bytes sein.
Kevin Cruijssen
@ KevinCruijssen Für die int-Deklarationen hatte ich es ursprünglich so, bis ich meine Funktion auf eine andere Methode änderte und sie dann zurücksetzte. Der +eine ist aber nett, danke
Verkörperung der Unwissenheit
Ein weiterer -2 durch Ersetzen ((i+j)%2>0?3:5)durch(5-(i+j)%2*2)
Kevin Cruijssen
2

Stax , 25 Bytes

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

Führen Sie es aus und debuggen Sie es

Dies ist meistens nur rohe Gewalt, mit einer geringfügig klugen Beobachtung. Alle ungeraden Truppen haben entweder 2 oder 4 ungerade Nachbarn. Und die Gesamtsumme davon plus das ursprüngliche Lot ist entweder 3poder 5pwo pist die Macht des Soldaten. Der Koeffizient (3 oder 5) kann durch gcd(2, x, y) * 2 + 1)wo xund ysind die Koordinaten des Soldaten bestimmt werden.

rekursiv
quelle
2

Python 2 , 83 Bytes

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)

Probieren Sie es online aus!

Vielen Dank an Arnauld für das Speichern eines Bytes.

xnor
quelle
Ah, im Grunde das gleiche Programm zu meiner vorbereiteten js Antwort ...
tsh
1

Gelee , 22 Bytes

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

Probieren Sie es online aus!

Ein vollständiges Programm, das ein einzelnes Argument, die geheime Potenznummer, verwendet und implizit eine Liste von [x, y]Paaren druckt . Verwendet die Beobachtung, die andere über Vielfache von 3 und 5 gemacht haben.

Nick Kennedy
quelle