03.09.2017, 13:13
In der Contest-Engine gibt es seit neuestem Lösungscodevalidierung. Das beruht auf einer noch unvollständigen Implementation einer noch unvollständigen Validierungssprache. Die möchte ich hier mal beschreiben.
Es interessiert mich, was ihr davon haltet. Insbesondere ob es Fälle gibt, die damit nicht abgedeckt sind.
(Ein paar Unklarheiten schiebe ich in einen Folgekommentar.)
Ziel ist hier übrigens mehr als nur die Contest-Engine. Ich würde das dann gerne auch im Rätselportal angeben. Idealerweise aber könnte ich die gleiche Sprache benutzen, um den Lösungscode für ein Rätsel auf meinem Blog zu beschreiben.
Grundbaustein ist die "Bedingung"; eine Bedingung wird als Wort mit (durch Leerzeichen getrennten) Argumenten dargestellt, und stellt eine Bedingung an ein Lösungswort.
An elementaren Bedingungen gibt es zur Zeit
length <Zahl>: das Lösungswort hat die vorgegebene Länge
chars <Wort>: das Lösungswort enthält nur die im Wort vorkommenden Zeichen
permute <Wort>: das Lösungswort ist eine Permutation des Worts
sum10 <Zahl>: die Ziffern des Lösungswort addieren sich modulo 10 zur vorgegebenen Zahl (nicht implementiert)
prescribed <Zahl> <Zeichen>: an der angegebenen Stelle steht das angegebene Zeichen (nicht implementiert)
Ein "Validierungsteil" ist dann eine Verknüpfung mehrerer elementarer Bedingung, getrennt durch Komma. Z.B. könnte man
length 9, chars 123456789, prescribed 4 9
für eine Sudokuzeile verwenden, in der an vierter Stelle eine 9 angegeben wurde, ohne Mehrfachziffern auszuschließen.
Auf dieser Ebene ist dann ein Ersetzungsschritt vorgesehen, mit dem man Bedingungskombinationen zusammenfassen kann. Eine komplexe Bedingung sieht aus wie eine elementare, sie wird aber nach vorgebenen Regeln in mehrere elementare übersetzt. Z.B.:
latin <Zahl>/<Zeichen>: Zeile/Spalte eines Lateinischen-Quadrat-Rätsels mit Ziffern 1 bis <Zahl> oder A bis <Zeichen>. (bisher nur für Zahlen implementiert)
latin <Zahl> <Zahl>/<Zeichen>: Wie latin mit Lücken (erstes Argument ist die Gesamtlänge, es werden Differenz-viele X dazugepackt.
Z.B: latin 5 C -> length 5, chars ABCX, permute ABCXX
(Hier kann man anmerken, dass "permute ABCXX" schon genügt; in dem zunächst Länge und Zeichensatz überprüft werden, kann man aber einfacher bessere Fehlermeldungen geben.)
Schließlich kann man noch Validierungsteile aneinanderhängen, getrennt durch Semikolon.
Es interessiert mich, was ihr davon haltet. Insbesondere ob es Fälle gibt, die damit nicht abgedeckt sind.
(Ein paar Unklarheiten schiebe ich in einen Folgekommentar.)
Ziel ist hier übrigens mehr als nur die Contest-Engine. Ich würde das dann gerne auch im Rätselportal angeben. Idealerweise aber könnte ich die gleiche Sprache benutzen, um den Lösungscode für ein Rätsel auf meinem Blog zu beschreiben.
Grundbaustein ist die "Bedingung"; eine Bedingung wird als Wort mit (durch Leerzeichen getrennten) Argumenten dargestellt, und stellt eine Bedingung an ein Lösungswort.
An elementaren Bedingungen gibt es zur Zeit
length <Zahl>: das Lösungswort hat die vorgegebene Länge
chars <Wort>: das Lösungswort enthält nur die im Wort vorkommenden Zeichen
permute <Wort>: das Lösungswort ist eine Permutation des Worts
sum10 <Zahl>: die Ziffern des Lösungswort addieren sich modulo 10 zur vorgegebenen Zahl (nicht implementiert)
prescribed <Zahl> <Zeichen>: an der angegebenen Stelle steht das angegebene Zeichen (nicht implementiert)
Ein "Validierungsteil" ist dann eine Verknüpfung mehrerer elementarer Bedingung, getrennt durch Komma. Z.B. könnte man
length 9, chars 123456789, prescribed 4 9
für eine Sudokuzeile verwenden, in der an vierter Stelle eine 9 angegeben wurde, ohne Mehrfachziffern auszuschließen.
Auf dieser Ebene ist dann ein Ersetzungsschritt vorgesehen, mit dem man Bedingungskombinationen zusammenfassen kann. Eine komplexe Bedingung sieht aus wie eine elementare, sie wird aber nach vorgebenen Regeln in mehrere elementare übersetzt. Z.B.:
latin <Zahl>/<Zeichen>: Zeile/Spalte eines Lateinischen-Quadrat-Rätsels mit Ziffern 1 bis <Zahl> oder A bis <Zeichen>. (bisher nur für Zahlen implementiert)
latin <Zahl> <Zahl>/<Zeichen>: Wie latin mit Lücken (erstes Argument ist die Gesamtlänge, es werden Differenz-viele X dazugepackt.
Z.B: latin 5 C -> length 5, chars ABCX, permute ABCXX
(Hier kann man anmerken, dass "permute ABCXX" schon genügt; in dem zunächst Länge und Zeichensatz überprüft werden, kann man aber einfacher bessere Fehlermeldungen geben.)
Schließlich kann man noch Validierungsteile aneinanderhängen, getrennt durch Semikolon.