Wir werden zeigen wie :accumulate und :sumrange zu verwenden sind, um nach Partien mit mindestens drei weißen Freibauern in einer Position zu suchen. Ein Freibauer ist ein Bauer, dem kein gegenerischer Bauer auf der gleichen Linie oder einer benachbarten Linie im Weg steht. Zuerst schreiben wir einen Positionsfilter, der jede Position findet mit einem weißen Freibauern:
; finde eine Position mit einem weißen Freibauern
(position
♙d2
:piececount [♟♙][d3-7] 0
:piececount ♟[c3-7,e3-7] 0
:shift)
Um mindestens drei weiße Feibauern zu finden fügen wir die Akkumulation hinzu:
; finde eine Position mit mindestens drei weißen Freibauern
(position
♙d2
:piececount [♟♙][d3-7] 0
:piececount ♟[c3-7,e3-7] 0
:shift
:accumulate weisse_freibauern_zaehler
:sumrange weisse_freibauern_zaehler 3 8)
Nun wollen wir Positionen finden mit mindestens zwei schwarzen Freibauern:
; finde eine Position mit mindestens zwei schwarzen Freibauern
(position
♟d7
:piececount [♟♙][d2-6] 0
:piececount ♙[c2-6,e2-6] 0
:shift
:accumulate schwarze_freibauern_zaehler
:sumrange schwarze_freibauern_zaehler 2 8)
Letzendlich kombinieren wir diese Listen, um Positionen mit mindestens zwei schwarzen und drei weißen Freibauern zu finden:
; finde eine Position mit mindestens drei
; weissen und zwei schwarzen Freibauern
(position
:sumrange weisse_freibauern_zaehler 3 8
:sumrange schwarze_freibauern_zaehler 2 8
:and (
(position
♙d2
:piececount [♟♙][d3-7] 0
:piececount ♟[c3-7,e3-7] 0
:shift
:accumulate weisse_freibauern_zaehler)
(position
♟d7
:piececount [♟♙][d2-6] 0
:piececount ♙[c2-6,e2-6] 0
:shift
:accumulate schwarze_freibauern_zaehler)))
Wir suchen nun nach Positionen mit mindestens drei Freibauern.
; Finde Positionen mit mindestens drei Freibauern.
(match
(position
:or (
(position
:sumrange zaehler 3 8
Pd2
:piececount [pP][d3-7] 0
:piececount p[c3-7,e3-7] 0
:shift
:flipcolor ; accumulate* zählt für jede Farbe einzeln
:accumulate* zaehler))))
Letzendlich ist anzumerken, daß diese Beispiele nur die Wirkungsweise von :accumulate veranschaulichen sollen. Tatsächlich können all diese Abfragen sehr viel effizienter mittels :pawncount realisiert werden.
Die folgende Positionsliste sucht nach Partien, in denen die Anordnung
♔e6 ♝e7 ♝e4 ♞d5
versetzt oder gespiegelt enthalten ist, aber keine der Figuren der Originalanordnung auf denselben Feldern steht:
(position
♔e6 ♝e7 ♝e4 ♞d5
:shift
:flip
:relation (
:pattern
:shift
:flip
:originalsamecount 0
:samesidetomove
:variations))
Wird der Parameter für :originalsamecount verändert,
beispielsweise vom derzeitigen Wert 0
auf den Bereich
0 3
, dann wäre eine Überlappung mit bis zu drei Feldern der
Originalanordnung erlaubt.
Wir untersuchen das Problem, alle Partien zu erkennen, in denen der gleiche Turm alle vier Ecken des Bretts besucht:
(match
:forany turm [♜♖] ; über alle Türme iterieren
(position $turm[a1])
(position $turm[h1])
(position $turm[h8])
(position $turm[a8]))
In diesem Beipiel definiert das Schlüsselwort :forany eine Markierung mit dem Namen "turm", die an weiße oder schwarze Türme gebunden wird, (die auch aus einer Bauernumwandlung enstanden sein konnten).
Die erste Positionsliste findet Partien in denen eine Position vorliegt, in der die Markierung "turm" einen Turm auf a1 repräsentiert. Die nächste Positionsliste findet Partien in denen eine Position vorliegt, in der die Markierung "turm" einen Turm auf h1 repräsentiert. Die Markierung repräsentiert die gleiche Figur zwischen den Positionslisten. Das Schlüsselwort :forany bindet nacheinander die Markierung an alle erlaubten Figuren.
Da eine Suchliste nur dann Partien filtert, wenn jeder einzelne Positionsfilter diese Partien gefiltert hat, findet dieses Skript was wir suchen.
Zweites Beispiel, das Excelsior-Thema: ein Bauer startet auf der zweiten Reihe und verwandelt sich dann.
(match
:forany bauer [♙♟]
(position
:initial
:tagmatch bauer [♙♟]?[27]
:gappedsequence ((position :movefrom $bauer :promote ◑))))
:tagmatch findet in der Startposition Bauern auf der zweiten oder siebten Reihe, und die mit :gappedsequence definierte Positionsreihe ist erfolgreich, wenn die Markierung "bauer" in irgendeiner nachfolgenden Position verwandelt.
Drittes Beispiel: die gleiche Figur bietet mindestens 30 mal Schach in einer Partie.
(match
:forany schachgeber ○
(position
:btm
:attackcount $schachgeber ♚ 1
:matchcount >=30
:flipcolor))
Viertes Beispiel: ein Springer gibt Matt mit seinem ersten Zug.
(match
:forany springer [♘♞]
(position
:movefrom $springer
:matchcount 1)
(position
:mate
:attackcount $springer [♔♚] 1))
; Wir suchen nach einem Mattmanöver im Legall-Stil,
; wie in der Partie Falkbeer-N.N., Wien 1847:
; 1.e4
e5
2.♘f3
♘c6
3.d4
exd4
4.c3
dxc3
5.♘xc3
d6
; 6.♗c4
♗g4
7.0-0
♘e5
8.♘xe5
♗xd1
9.♗xf7+
♔e7
10.♘d5#
; Wir wollen auch Partien finden, in denen der Unterlegene
; bereits nach dem Läuferschach aufgibt.
(match
(position
:flipcolor ; auch nach dem farbinvertierten Thema suchen
; Erinnerung: '!' bedeutet 'einziger Zug'.
:line (♘xe5 ♝x♕ ♗:f7+ | ♚e7! ♘d5#)))
; Dies vermag auch die folgenden Partien zu finden:
; 1.e4
e5
2.♘f3
d6
3.♗c4
♗g4
4.♘c3
h6
5.♘xe5
♗xd1
; 6.♗xf7+
1-0
; 1–0 Banks-Pakenham, Halesowen v Warley Quinbourne 2001
; 1–0 Zaynytdinov-Kalashnikov, Povolje 2010
; Suche nach einem Mattmanöver im Réti-Stil,
; wie in der Partie Réti-Tartakower, Wien 1910:
; 1.e4
c6
2.d4
d5
3.♘c3
dxe4
4.♘xe4
♘f6
5.♕d3
e5
6.dxe5
; ♕a5+
7.♗d2
♕xe5
8.0-0-0
♘xe4
9.♕d8+
♔xd8
10.♗g5++
♔c7
; (10...♔e8
11.♖d8#)
11.♗d8#
; Finde auch dann Partien, wenn der Unterlegene bereits
; nach dem Damenschach aufgibt.
(match
(position
:flipcolor ; auch nach dem farbinvertierten Thema suchen
; Erinnerung: '!' bedeutet 'einziger Zug'.
:line (♕d8+ | ♚xd8! ♗:g5++ ♚ [♖♗]d8#)))
; Dies vermag auch die folgende Partie zu finden:
; 1.e4
c5
2.d4
cxd4
3.c3
d5
4.exd5
♕xd5
5.♘f3
♗g4
6.♕a4+
; ♘c6
7.♘xd4
♗d7
8.♘b5
0-0-0
9.♘xa7+
♘xa7
10.♕xa7
♕d1+
; 0–1 Dutch-Sugden, London 1964
In beiden obigen Beispielen ist zu beachten, daß auch Partien aufgefunden werden können, in denen die potentiellen Zugfolgen nicht gespielt wurden, sondern eine anderer Fortsetzung erfolgte. D.h. es werden auch Partien aufgefunden, in denen die potentielle Zugfolge verpaßt wurde. Sollen solche Partien ausgeschlossen werden, dann findet hier :terminal eine Anwendung:
(match
(position
:sequence (
(position
:flipcolor
:line (♕d8+ | ♚xd8! ♗:g5++ ♚ [♖♗]d8#))
(position :terminal))))
Nun werden nur diejenigen Partien aufgefunden, die auch mit einem der Züge
♕d8
, ♚xd8
, ♗:g5
,
♚
, oder [♖♗]d8#
enden.
; Eine der Parteien opfert in einem materiell gleichstehenden
; Bauernendspiel zwei Bauern, erhält mindestens einen nicht
; aufhaltbaren Freibauern, und gewinnt die Partie.
(match
(position
:flipcolor ; auch nach dem farbinvertierten Thema suchen
:result 1-0 ; Weiß gewinnt die Partie
:gappedsequence (
(position
:piececount [△▲▽▼] 0 ; es ist ein Bauernendspiel
:powerdifference ◑ 0 ; materielle Ausgeglichenheit
; noch keine unaufhaltbare Freibauern
:pawncount ♙ passed-!inside 0)
(position
:btm ; Schwarz ist am Zug
:piececount [△▲▽▼] 0 ; nach wie vor ein Bauernendspiel
:powerdifference ◑ <=−2 ; zwei Bauern im Nachteil
; mindestens ein unaufhaltbarer Freibauer
:pawncount ♙ passed-!inside >=1))))
; Ersticktes Matt
; Ein ersticktes Matt liegt vor, wenn ein Springer Matt
; setzt und der König nicht entweichen kann, weil er
; von eigenen Figuren umgeben (erstickt) ist.
(match
(position
:flipcolor ; Jede Farbe
:attackcount ♚ [○.] 0 ; König ist von eigenen Figuren umzingelt
:btm ; Schwarz ist am Zug
:mate)) ; und ist matt
; Allumwandlung: Suche nach Partien mit Bauernumwandlungen in alle
; Figuren. Die Reihenfolge der Positionslisten spielt keine Rolle.
(match
(position :promote [♕♛])
(position :promote [♖♜])
(position :promote [♗♝])
(position :promote [♘♞]))
; Allumwandlung: Suche nach Partien mit Bauernumwandlungen in alle
; Figuren. Die Reihenfolge der Positionslisten spielt keine Rolle.
; Es wird verlangt, daß alle Umwandlungen aufeinanderfolgend sind.
(match
(position :matchconsecutive (
(position :promote [♕♛])
(position :promote [♖♜])
(position :promote [♗♝])
(position :promote [♘♞])))