Wie macht man Muster- / Form-Übereinstimmung / Erkennung auf einer Tafel (20x20)?

8

Das Board ist int[][] und ich möchte diese Form finden

%Vor%

mit allen 4 seiner symmetrischen (rotatorischen) Varianten von der Platine und protokollieren Sie die Positionen. z.B.

%Vor%

Ist es besser, F # zu verwenden, um mit diesen Problemen umzugehen?

Unten ist mein c # -Code zum vertikalen Überprüfen von Mustern (der horizontal zu überprüfende Code ist similar)

%Vor%     
colinfang 07.09.2012, 10:18
quelle

3 Antworten

15

Dies ist definitiv eine großartige Ergänzung für funktionale Programmierung und F #. Es gibt eine große Anzahl möglicher Ansätze. Ich denke, dass die Lösung von Pad wahrscheinlich die direkteste ist und es ist ein wirklich guter Ausgangspunkt. Wenn Sie etwas allgemeineres brauchen, dann ist die Lösung von Huusom ganz nett.

Es gibt sogar einen allgemeineren Ansatz, der darin besteht, eine domänenspezifische Sprache (DSL) zum Erkennen von Mustern in einem Array zu erstellen. Dies ist eine fortgeschrittene Funktionstechnik, aber es funktioniert wirklich gut für Ihr Beispiel. Wenn Sie das tun würden, könnten Sie sehr komplexe Muster auf sehr präzise Weise ausdrücken. Hier ist ein Beispiel:

%Vor%

Dieses Beispiel verwendet verschiedene Grundelemente, um eine deklarative Spezifikation des Musters zu erstellen. Der Wert any stellt eine Funktion dar, die Sie ausführen können, um zu testen, ob das Muster an einer bestimmten Position auftritt. Es verarbeitet alle Rotationen des Musters und es werden auch Grenzen geprüft. Sie müssten auch gespiegelte Muster hinzufügen, aber das wäre eine ziemlich einfache Erweiterung.

Um die Implementierung zu erklären, wäre wahrscheinlich ein vollständiger Blogpost erforderlich, aber hier ist ein kommentierter Quellcode, der gut lesbar sein sollte:

%Vor%

Schließlich ist hier ein Beispiel, das den Musterdetektor auf einem 2D-Beispielarray ausführt:

%Vor%     
Tomas Petricek 07.09.2012, 14:01
quelle
4

Sie können horizontale Formen finden, die Muster in F # ähnlich verwenden (ähnlich für vertikale Formen):

%Vor%     
pad 07.09.2012 11:39
quelle
1

Wenn Sie basierend auf dem Muster eine Menge von Koordinatenoffsets erstellen, können Sie die Werte abrufen und das Ergebnis mit einer bekannten Menge von Werten abgleichen.

%Vor%

Diese Funktion arbeitet mit einem Muster von [(0,0); (1, -1); (1, -2)] (Ihr Beispiel von oben).

Bitte beachten Sie, dass ich ein Array2D (int [,]) anstelle von int [] [] in Ihrem Beispiel verwende.

    
Huusom 07.09.2012 12:44
quelle

Tags und Links