Wir haben alle Bilder mit der Überschrift "Wie viele Quadrate sind in diesem Bild? 98% werden das nicht richtig machen!" Gesehen. Nun, hier ist Ihre Chance, über diese 98% zu lachen.
Eingang
Ein rechteckiger Block mit nur 2 Zeichen. In einer allgemeinen Form wird dies durch m Zeilen definiert , die jeweils n Zeichen enthalten.
Beispiel:
0000xxx
00x00xx
00000xx
xxxxx0x
Dies kann als durch Zeilenumbrüche getrennte Zeichenfolge, als Array von Zeichenfolgen oder als 2D-Array von Zeichen dargestellt werden. Alle anderen Eingabetypen sollten in den Kommentaren vorgeschlagen werden.
Ausgabe
Die Ausgabe ist eine Ganzzahl, die die Gesamtanzahl der Quadrate darstellt, die einzeln durch beide Zeichen dargestellt werden (im Pseudocode num_squares (char1) + num_squares (char2)).
Ein Quadrat ist definiert als eine Reihe von Instanzen desselben Zeichens, die ein geometrisches Quadrat mit einer Seitenlänge von mindestens 2 vollständig umreißen . Diese Quadrate müssen nicht mit dem Zeichen ausgefüllt werden, das sie umreißt. Die folgenden Beispiele veranschaulichen dieses Konzept:
x0
0x // no squares
xxx
x0x
xxx // 1 square of side length 3
0000
0xx0
0xx0
0000 // 1 square of side length 2, 1 square of side length 4
Wertung
Ihr Programm wird nach 2 Kriterien in absteigender Reihenfolge der Wichtigkeit bewertet:
- Anzahl der Zeichen in Ihrem Codeblock, die nicht Teil eines Quadrats sind, wie oben definiert (Sie sollten versuchen, dies zu minimieren!) (Hinweis: Zeichen innerhalb eines Quadrats werden nicht automatisch als Teil dieses Quadrats betrachtet) (Hinweis 2: Zeilenumbrüche zählen nicht für diese Punktzahl.
- Anzahl der Bytes (Sie sollten versuchen, dies zu minimieren!)
Das zweite Kriterium wirkt als Unentschieden für das erste.
Herausforderungsregeln
- Aus Gründen der Flexibilität können Sie 2 beliebige alphanumerische Zeichen verwenden, um die 0 und x aus meinen Beispielen zu ersetzen, sofern sie nicht dasselbe Zeichen sind.
- Jede Zeile im Eingaberechteck muss dieselbe Länge haben und darf kein anderes Zeichen als die 2 enthalten, die für Ihre Antwort auf die Herausforderung angegeben wurden (außer dem Zeilenumbruchzeichen, falls zutreffend).
- Triviale Quadrate (1x1 Quadrate, die durch ein einzelnes Zeichen gekennzeichnet sind) zählen nicht für die Ausgabe. Sie saugen.
- Ihr Programm muss keine leeren Eingaben verarbeiten, sollte jedoch Fälle behandeln, in denen keine Quadrate möglich sind (wenn eine der Dimensionen des Eingaberechtecks 1 ist).
- Sie können auch festlegen, dass Sie diagonal ausgerichtete Quadrate bearbeiten, wenn Sie die Herausforderung genießen. Dies würde zu der in den Herausforderungsspezifikationen angegebenen Ausgabe hinzugefügt.
Beispiel für dieses Konzept:
Input:
00x00
0x0x0
x000x
0x0x0
00x00
Output: 6 (1 diagonally aligned square of side length 3, 5 diagonally aligned squares of side length 2)
Testfälle
Im Folgenden finden Sie einige grundlegende Testfälle, mit denen Ihr Programm übereinstimmen sollte. Der Wert in Klammern ist die Ausgabe, falls Sie diagonal ausgerichtete Quadrate zählen möchten.
Input:
xxxx
x00x
x0xx
xxxx
Output: 2 (2)
Input:
x00000xxx0
Output: 0 (0)
Input:
xxx0x0x000xx0xx0
0x000x00x0x0xx00
00xx0xx00xx0000x
x0x0x0x0x00x0xxx
00xx0xxx00xxx0x0
Output: 0 (5)
Input:
0000
0000
0000
0000
0000
0000
Output: 26 (34)
Input:
xxx00
xx000
Output: 2 (2)
Allgemeine Regeln
- Für Ihre Antwort gelten Standardregeln , sodass Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden dürfen. Ihr Anruf.
- Standardschlupflöcher sind verboten.
- Wenn möglich, fügen Sie bitte einen Link mit einem Test für Ihren Code hinzu.
- Es wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
- Fragen / Korrekturen / Ratschläge für mich? Kommentiere unten! Dies ist meine erste Frage, daher freue ich mich darauf, so viel wie möglich daraus zu lernen.
quelle
Antworten:
Perl, 0 Zeichen nicht in Quadraten (25430 Bytes)
Wie Sie sehen können, ist jedes einzelne Zeichen Teil eines Quadrats. Die obere Hälfte jedes großen Quadrats wird durch Zeilenkommentare auskommentiert, und die untere Hälfte (einschließlich der zweiten nicht kommentierten Zeile) wird durch ein großes Hier-Dokument maskiert, das in der Mitte des Quadrats beginnt (
<<'';#
) und in der leeren Zeile endet nach dem großen Platz.Dieses Programm wurde automatisch aus folgendem Programm generiert:
Welches ist ein Programm, um die gleiche Herausforderung zu lösen, aber (sehr leicht) Golf für Bytes und kurze Zeilenlängen, nicht für Punktzahl.
Als Eingabe werden zuerst die Höhe und Breite des Rechtecks und dann die einzelnen durch Leerzeichen getrennten Zeichen des Rechtecks verwendet. Anwendungsbeispiel: Zum Lösen des Rechtecks
Sie rufen das Programm folgendermaßen auf:
perl theprogram.pl 3 5 x x x y y x x y y y x y y x x
Auf jeden Fall sollte es durch Quadrieren des Codes auf diese Weise möglich sein, mit jeder Programmiersprache, die eine einzeilige Lösung und ein Zeilenkommentarzeichen enthält, durch Transformieren des Einzeilers auf 0 oder 2 zu kommen
so was:
Die einzigen Zeichen, die nicht Teil eines Quadrats sind, sind die beiden Leerzeichen. Abhängig von der Sprache gibt es möglicherweise auch Möglichkeiten, clevere mehrzeilige Zeichenfolgen oder Kommentare (wie Perls Here-Docs) oder redundanten Code zu verwenden, um diese beiden Leerzeichen zu einem Quadrat zu machen.
Was die Anzahl der Bytes angeht, hat meine Lösung eine Reihe von sofortigen Verbesserungen, und ich bin sicher, dass es auch viele andere Möglichkeiten gibt, diese Technik zu verfeinern, aber ich habe nicht die Geduld dafür. Ich wollte nur eine Demonstration anbieten, damit ihr wild werden könnt.
quelle
MATL ,
18161410 Zeichen nicht in Quadraten (92103111127 Bytes)Die Eingabe ist eine Zeichenmatrix mit Zeichen
+
und-
. Zählt keine diagonalen Quadrate.Probieren Sie es online aus!
Oder überprüfen Sie alle Beispiele und Testfälle .
quelle
Jelly ,
20 1917 19081905 Bytes , Score200Ein vollständiges Programm mit einer Liste von Listen
.
und+
Zeichen. (Funktioniert für alle Zeichen, sogar für mehr als 2).Probieren Sie es online aus!
Jeder Versuch, die Punktzahl durch die Einführung von Zeichen zu verringern, scheint die Punktzahl nur noch weiter zu erhöhen. Ich denke, der Weg, um diese Herausforderung zu gewinnen, besteht darin, die richtige Linguage zu finden !Aber Jelly hat keinen Kommentarcharakter, daher ist ein wenig zusätzliche Kreativität erforderlich ...
Jelly-Programme bestehen aus "Links" - Code, der durch Zeilenumbruchzeichen, Pilcrow-Zeichen (
¶
- interpretiert als dasselbe Byte wie Zeilenumbrüche) oder gültigen Codepage- Zeichen ohne definiertes Verhalten (derzeitq
ein Beispiel) getrennt ist. Letztere zählen tatsächlich jeweils als Link und nicht als reines Trennzeichen. Die Programmausführung beginnt am unteren rechten Rand, dem "Hauptlink" (hier⁽⁽ĿĿ
).Ŀ
⁽⁽ĿĿ
⁽⁽Ŀ
⁽⁽ĿĿ
q
ẆZṡLƊ€ẎṖƇZU$ƬḢ€ẎEƲ€S
q
quelle
¶
wirklich nur ein Proxy für eine Newline ist. Das Programm sieht wirklich eher so aus¶
s könnten durch 9q
s oder(
s oder was auch immer ersetzt werden (wie ich im Klappentext gesagt habe).q
wie ich es mir vorgestellt hatte: /⁽⁽ĿĿ
ausgewertet wirdq
es sich um ein nicht verwendetes Byte handelt? Es funktioniert auch mit,u
was auch unbenutzt ist. </ S> nevermind