Ein Schachbrettprogramm ist ein Programm, bei dem der Ordnungswert jedes einzelnen Zeichens von gerade bis ungerade wechselt, mit Ausnahme des Zeilenabschlusses (der ein beliebiges Standardzeilenende sein kann).
Ein dreieckiges Programm ist ein Programm, bei dem jede Zeile ein zusätzliches Zeichen als die vorhergehende Zeile enthält, wobei die erste Zeile ein Zeichen enthält. Sie müssen keine leeren Eingaben verarbeiten.
Ihre Aufgabe ist es, ein Programm zu erstellen, das überprüft, ob die angegebene Eingabe diesen Kriterien entspricht, und etwas Wahres ausgibt / zurückgibt, wenn das Programm die Kriterien erfüllt, oder etwas Falsches auf andere Weise.
Ihr Programm muss auch diese Kriterien erfüllen.
Beispiele für gültige Programme
G
`e
@u^
5r{B
^
cB
+$C
VA01
Regeln
- Ihr Programm kann entweder mit einem ungeraden oder einem geraden Byte beginnen, solange sich die Parität der Zeichen abwechselt.
- Ihr Programm muss Programme validieren, die entweder mit einem ungeraden oder einem geraden Zeichen beginnen.
- Bei Unicode-Zeichen müssen die zugrunde liegenden Bytewerte eine abwechselnde Parität aufweisen.
- Sie können davon ausgehen, dass die Eingabe nur druckbare Zeichen enthält. Wenn Ihr Programm nicht druckbare Dateien enthält, sollte es sich dennoch selbst validieren können.
- Ihr Programm enthält möglicherweise eine nachfolgende neue Zeile. Dies muss bei Ihrer Validierung nicht berücksichtigt werden, da Sie davon ausgehen können, dass diese vor der Validierung entfernt wurde.
- Standardlücken sind verboten.
- Der kürzeste Code in Bytes in jeder Sprache gewinnt.
code-golf
restricted-source
source-layout
Dom Hastings
quelle
quelle
E\nOE\nOEO
. Hoffentlich hilft das!Antworten:
Stax , 26 Bytes
Führen Sie Testfälle online aus
Ich musste 3 Junk-Charaktere einführen.
i
ist ein No-Op, wenn außerhalb aller Schleifenkonstrukte.ist immer ein No-Op.
O
Steckt eine 1 unter den Stapel, aber der Wert wird im Programm nicht verwendet.Führen Sie diesen aus
quelle
C (gcc), 189 Bytes
Probieren Sie es online aus!
␉
stellt ein Tabulatorzeichen dar (tut mir leid). Beachten Sie, dass es mehrere nachgestellte Leerzeichen / Tabulatoren gibt (es tut mir mehr leid). Das Original mit intakten Tabs wird am besten in vim mit angezeigt:set tabstop=1
(Worte können nicht ausdrücken, wie leid es mir tut).Es ist eine Funktion (aufgerufen
f
, die bei einem Blick nicht sofort ersichtlich ist), die eine Zeichenfolge als Argument verwendet und entweder0
oder zurückgibt1
.Ich könnte dies um mindestens eine und wahrscheinlich zwei oder mehr Zeilen reduzieren, aber beachten Sie, dass es gegen Ende immer chaotischer und müheloser wird, vor allem, weil ich mich durch das Schreiben eines so schrecklichen Codes (selbst nach PPCG-Standards) wie ein schlechter Mensch fühlte und ich wollte so schnell wie möglich aufhören.
Die grundlegende Idee dabei ist , Konstruktionen zu vermeiden , dass notwendigerweise das Format brechen (
++
,+=
,return
, etc.). Wie durch ein Wunder passen wichtige Schlüsselwörter wiefor
,char
undwhile
(die ich letztendlich nicht verwendet habe) zufällig zur alternierenden Paritätsregel. Dann habe ich Leerzeichen (gerade Parität) und Tabulatoren (ungerade Parität) als Auffüllung verwendet, damit der Rest den Regeln entspricht.quelle
Haskell ,
10801033 BytesProbieren Sie es online aus!
Erläuterung
Dies war für Haskell eine interessante Aufgabe.
Parität
Zu Beginn müssen wir feststellen, ob ein Zeichen einen geraden oder einen ungeraden Codepunkt hat. Der normale Weg, dies zu tun, besteht darin, den Codepunkt abzurufen und um 2 zu modifizieren. Wie man jedoch wissen könnte, erfordert das Abrufen des Codepunkts eines Zeichens einen Import, was aufgrund der Quellenbeschränkung bedeutet, dass dies nicht möglich ist gebraucht. Ein erfahrener Haskeller würde denken, Rekursion zu verwenden.
Char
sind Teil derEnum
Typklasse, damit wir ihre Vorgänger und Nachfolger bekommen können. Allerdingspred
undsucc
ist auch beide unbrauchbar , weil sie keine alternative Byteparität tun.Das lässt uns ziemlich stecken, wir können so gut wie keine Manipulationen mit Zeichen durchführen. Die Lösung hierfür besteht darin, alles fest zu codieren. Wir können (die meisten) geraden Zeichen als Literale darstellen, Chancen, mit denen wir Probleme haben, weil sie
'
ungerade sind, so dass sie nicht neben dem Zeichen selbst stehen können, was es dem Literal unmöglich macht, die meisten ungeraden Zeichen auszudrücken. Also codieren wir alle geraden Bytes hart und fügen am Ende einen Catch für alle ungeraden Bytes hinzu.Das Problem Bytes
Möglicherweise stellen Sie fest, dass es einige gerade Bytes gibt, für die Literale nicht in einfache Anführungszeichen gesetzt werden können. Sie sind die Unprintables, Newlines und
\
. Wir müssen uns keine Gedanken über nicht druckbare Dateien machen, da wir keine überprüfen müssen, solange wir keine verwenden. Tatsächlich können wir immer noch ungerade nicht druckbare Dateien wie Tabs verwenden, die ich am Ende einfach nicht brauche. Newline kann natürlich ignoriert werden, da es sowieso aus dem Programm entfernt wird. (Wir könnten Newline einfügen, da der Code-Punkt ziemlich praktisch ist, aber wir müssen nicht). Damit bleibt\
nun\
der Codepunkt 92, der zweckmäßigerweise eine ungerade Zahl gefolgt von einer geraden Zahl ist, also\92
zwischen Evens und Odds wechselt, also das Literal'\92'
ist vollkommen gültig. Wenn wir später Newline darstellen müssen, werden wir feststellen, dass es zum Glück dieselbe Eigenschaft hat'\10'
.Abstandsprobleme
Um mit dem Schreiben des eigentlichen Codes beginnen zu können, müssen wir in der Lage sein, eine beträchtliche Anzahl von Zeichen in eine einzelne Zeile zu setzen. Um dies zu tun, schrieb ich die Kappe:
Die Kappe macht nichts anderes als gültige Haskell. Ich hatte ursprünglich gehofft, Definitionen zu erstellen, die uns später im Code helfen würden, aber das tat es nicht. Es gibt auch einfachere Möglichkeiten, die Obergrenze festzulegen, z. B. Leerzeichen und Semikolons, aber sie speichern auf diese Weise keine Bytes, sodass ich mich nicht darum gekümmert habe, sie zu ändern.
Hardcoder
Jetzt, da ich genug Platz in einer Zeile habe, beginne ich mit der Hardcodierung von Werten. Das ist meistens ziemlich langweilig, aber es gibt ein paar interessante Dinge. Zum einen können wir, sobald die Zeilen noch länger werden
;
, mehrere Deklarationen in eine Zeile einfügen, wodurch wir eine Menge Bytes sparen.Das zweite ist, dass wir
g
die Zeilen ein wenig einrücken müssen , da wir nicht immer eine Zeile mit a beginnen können . Jetzt kümmert sich Haskell wirklich um die Einrückung, also wird es sich darüber beschweren. Wenn jedoch die letzte Zeile vor der eingerückten Zeile mit einem Semikolon endet, wird dies zugelassen. Warum? Ich habe nicht die geringste, aber es funktioniert. Wir müssen uns also nur daran erinnern, die Semikolons am Ende der Zeilen zu platzieren.Funktionsbausteine
Sobald der Hardcoder fertig ist, läuft es reibungslos bis zum Ende des Programms. Wir müssen ein paar einfache Funktionen erstellen. Zuerst baue ich eine Version von
drop
, genannti
.i
unterscheidet sich davon,drop
dass wenn wir versuchen, über das Ende der Zeichenfolge hinauszugehen, diese nur zurückgegeben wird"y"
.i
unterscheidet sich von drop auch darin, dass beim Versuch, eine neue Zeile zu löschen, diese zurückgegeben wird"y"
. Diese sind nützlich, da wir später, wenn wir überprüfen, ob das Programm ein Dreieck ist, zurückkehren können,False
wenn die letzte Zeile nicht vollständig ist oder wenn Eine Zeile endet früh.Als nächstes haben wir,n s s n n+1
k
was tatsächlich bestätigt, dass eine Zeichenfolge dreieckig ist.k
ist ziemlich einfach, es braucht eine Zahl und eine Zeichenkette . Wenn leer ist, wird es zurückgegeben . Wenn die Zeichenfolge mit einer neuen Zeile beginnt, werden die neue Zeile und Zeichen von vorne entfernt. Es ruft dann erneut mit und der neuen Zeichenfolge auf. Wenn die Zeichenfolge nicht mit einer neuen Zeile beginnt, wird sie zurückgegeben .s s n n + 1True
k
False
Wir machen dann einen Alias für
k
,m
.m
steht nurk
mit1
im ersten Argument, und dem zweiten Argument wird eine neue Zeile vorangestellt.Als nächstes haben wir
o
.o
nimmt eine Zahl und eine Zeichenfolge. Es wird bestimmt, ob sich die Zeichenfolgenbytes (ohne Berücksichtigung von Zeilenumbrüchen) in der Parität abwechseln (unter Verwendung unsererg
), beginnend mit der eingegebenen Nummer.Zuletzt haben wir
s
welcheo
mit beiden läuft1
und0
wenn es gelingt, verschiebt es sichm
. Wenn beide fehlschlagen, wird nur zurückgegebenFalse
. Dies ist die Funktion, die wir wollen. Es stellt fest, dass die Eingabe dreieckig und abwechselnd ist.quelle
05AB1E ,
3426 BytesProbieren Sie es online aus!
Nimmt die Eingabe als mehrzeilige Zeichenfolge (Eingabe zwischen "" " ). Erläuterungen folgen später.
quelle
Java 10, 209 Bytes
Ein leeres Lambda, das ein iterables oder Array von nimmt
byte
. Gibt true an, indem normal zurückgegeben wird, false, indem eine Laufzeitausnahme ausgelöst wird. Das Programm erwartet, dass die letzte Zeile ordnungsgemäß beendet wird, dh mit einem Zeilenumbruch endet. Die letzte Zeile des Programms wird ebenfalls beendet.Alles wird unter UTF-8 ausgeführt, mit der Interpretation, dass "Zeichen" sich auf Unicode-Codepunkte bezieht.
Tabulatoren werden in dieser Ansicht durch Leerzeichen ersetzt.
Probieren Sie es online aus
Hex Dump
Zurücksetzen unter
xxd -p -r
Unix.Ungolfed
f
ist die erwartete Anzahl von Zeichen in der aktuellen Zeile,h
ist die Anzahl der Zeichen, die bisher in der aktuellen Zeile gesehen wurden,c
ist das letzte gesehene Byte undb
ist, oba
es sich um die neue Zeile handelt.Die Bedingung
a > -65
prüft, oba
es sich um das erste Byte in einem Zeichen handelt. Dies funktioniert, weil die Einzelbytezeichen (ASCII) im 8-Bit-Zweierkomplement nicht negativ sind, das erste Byte längerer Zeichen eine binäre Form hat11xxxxxx
(mindestens -64 im Zweierkomplement) und die nicht führenden Bytes in diesen Zeichen von sind die Form10xxxxxx
, höchstens -65 in Zweierkomplement. ( Quelle )Wenn ein Zeichen das Dreiecks- oder Schachbrettmuster verletzt (dh eine neue Zeile erscheint früh oder spät oder ein Byte der falschen Parität erscheint), wird der linke Zweig des entsprechenden ternären (in Zuordnung zu
f
oderc
) aktiviert und die Methode löst eine arithmetische Ausnahme aus.quelle
Python 3 (3,4?), 350 Bytes
Eine knifflige Herausforderung für eine Sprache, die sich besonders mit Leerzeichen wie Python 3 befasst. Die Übermittlung wird gedruckt
0
oder1
standardisiert und stürzt bei einigen Eingaben ab. Das Programm erwartet, dass die letzte Zeile ordnungsgemäß beendet wird, dh mit einem Zeilenumbruch endet. Die letzte Zeile des Programms wird ebenfalls beendet. UTF-8 wird verwendet, um die Byte-Parität zu überprüfen.Tabulatoren werden in dieser Ansicht durch Leerzeichen ersetzt.
Funktioniert für mich mit Python 3.4.2; funktioniert unter Python 3 unter TIO nicht. Scheint mir ein Fehler in den Dolmetschern von TIO zu sein.
Hex Dump
Zurücksetzen unter
xxd -p -r
Unix.quelle