Heute ist Purim, auf dem man dreieckige Kekse mit einer Füllung namens hamantaschen (Singular: hamantasch ) verteilen soll . Ein anderer Brauch ist es, viel zu trinken.
Ich bin nicht der perfekteste Bäcker ... Ich habe so viele unregelmäßig große Hamantaschen zu verteilen und so viele Freunde, denen ich sie geben kann! Wenn ich Ihnen ein Bild von meinen Keksen schicke, können Sie mir sagen, wie viele ich in welcher Größe und mit welcher Füllung habe? Aber weil es Purim ist und ich zu betrunken bin, um viel Code zu lesen, muss es so kleiner Code sein, wie Sie machen können.
Definitionen
Größe
Ein Hamantasch kann beliebig groß sein . Der kleinste Hamantasch ist Größe 1 und sieht so aus:
/\ --
-- \/
Manchmal können sich mehrere Hamantaschen überlappen . Die folgende Form zählt als zwei Hamantaschen (eine Größe 1, eine Größe 2):
/\
/\ \
----
Einige Hamantaschen haben Füllung . Dies wird angezeigt, indem das gesamte Leerzeichen mit einem Zeichen gefüllt wird. Beachten Sie, dass Hamantaschen der Größe 1 nicht gefüllt werden können.
Wir nennen hamantaschen basierend auf Füllung und Größe. Verwenden wir das Format <filling> <size>
und wenn es nicht ausgefüllt ist - <size>
(Sie können ein Leerzeichen anstelle eines verwenden -
, aber das gefällt Markdown nicht).
Hier sind a . 2
, a . 4
und a - 3
:
/\
/./\
---- /./ \
\../ /./ \
\/ --------
Dies sind a @ 3
, a . 2
und a - 4
:
/\
/ /\
/\ / /@@\
/..\ / /@@@@\
---- --------
Hier ist etwas schwieriger. Sehen Sie, wie das & 2
weniger Füllung hat, als Sie aufgrund der Neigung von der Überlappung erwartet haben - 3
? Es hat ein - 1
, & 2
ein - 3
und ein & 4
:
--------
\ \/&/
\ /\/
\/&/
\/
Eingang
Sie erhalten eine Textdatei oder eine einzelne Zeichenfolge von hamantaschen (optional abschließende Zeilenumbrüche und optional gepolsterte abschließende Leerzeichen, um gerade zu sein).
Grenzen
- Sie können erwarten, dass die Zeichenfolge gültig ist - das heißt, dass jedes Nicht-Leerzeichen zu einem köstlich süßen Hamantasch beiträgt (warum Teig verschwenden?).
- Sie können auch erwarten, dass es richtig gefüllt ist oder nicht - das heißt, dass jedes hamantasch vollständig mit einem konsistenten ASCII-Zeichen gefüllt wird - ASCII 32 für ungefüllt oder alles 32..127 für gefüllt (außer
/
,\
und-
). - Diese hamantaschen sind nicht im 3er Raum gestapelt . Alles
/
und\
wird sichtbar sein. Alle-
, die nicht von blockiert werden/
und\
sichtbar sein werden. Die Befüllung erfolgt zum Schluss. - Bei allen Hamantaschen ist mindestens die Hälfte der horizontalen Linie (Aufrundung) sichtbar.
- Jeder zusammenhängende Füllblock füllt nur den kleinsten Hamantasch , der ihn umgibt.
Ausgabe
Geben Sie eine Liste mit "Namen" aller Hamantaschen zurück, die die oben genannten Kriterien erfüllen. Die Ausgabe kann in einer beliebigen Form erfolgen (ein String, ein Hash, ein stdout usw.).
Testfälle
Testfall Nr. 1
Eingang 1:
/\
/ /\
/\ / /@@\
/..\ / /@@@@\
---- --------
/\
/**\
/*/\*\
/*/..\*\
--------
Ausgang 1:
. 2
. 2
- 4
@ 3
* 4
Testfall Nr. 2
Eingang 2:
/\----
/\/\*\/
/ /\d\/
------
Ausgang 2:
- 3
- 2
d 2
- 1
* 2
- 1
Test Nr. 3
Eingang 3:
----
\/\/
/\/\ /\
---- /::\
----
Ausgang 3:
- 1
- 1
- 2
- 1
- 1
- 2
: 2
Test Nr. 4
Eingang 4:
/\/\
/ /\$\
-/--/\\
--/--\
/xxx/\
/xxx/##\
---/----\
/ \
--------
Ausgang 4:
$ 2
x 4
- 3
- 2
- 4
- 1
- 1
# 2
Ungültiger Testfall Nr. 5
Eingang:
/\
\/
Ausgabe:
Sie brauchen damit nicht umzugehen.
quelle
/
und\
, und-
wird immer Trumpf Füllung.(1,0)
um deaktiviert+1
. Trotzdem weiß ich, was du meinst, und ich bin anderer Meinung. Welche Anzeige gibt es,(2, 2)
die die obere Mitte von a- 2
und nicht nur die obere rechte und linke der beiden oberen- 1
s ist? Keine, die ich sehen kann. Und die gleiche Logik gilt für(3, 2)
. Es sei denn, Sie möchten eine Regel hinzufügen, um ein Maximum an möglichen Hamantaschen anzunehmen ...Antworten:
C #,
496452 BytesBearbeiten: habe einen Fehler gefunden, bei dem die Grenzen überprüft wurden ... aber auch eine Menge Bytes entfernt wurden, die gezwungen waren, meinen eigenen Code zu verstehen. Das Aufrollen der lokalen Funktion hat ein wenig geholfen und den C # 7-spezifischen Code entfernt. Diese Frage hat sehr viel Spaß gemacht.
Probieren Sie es online
Komplettes Programm, erwartet eine mit Leerzeichen aufgefüllte Eingabe für den Standardeingang, Ausgänge für den Standardausgang. Die Ausgabe ist ein Eintrag pro Zeile mit nachfolgendem Zeilenvorschub. Cookies werden in aufsteigender Reihenfolge ausgegeben, ganz oben links. Es hat eine Weile gedauert, bis ich die Regeln verstanden habe, aber ich glaube, es hat alle Beispiele bestanden.
Dies funktioniert, indem das gesamte Raster wiederholt nach gültigen Hamantaschen durchsucht wird, wobei die zulässige Größe erhöht wird. Für jede Zelle, prüft sie nach oben und unten, nach dem
\
und/
auf beiden Seiten so weit wie möglich. Wenn es feststellt, dass die nächste Zeile viele enthält-
und die aktuelle Größe die zulässige Größe ist, wird die Füllung bestimmt und der Eintrag ausgedruckt.Die Füllung wird gefunden, indem der gesamte Bereich des Kekses auf der Suche nach einer "unbenutzten" Zelle durchsucht wird. Wenn eine nicht verwendete Zelle gefunden wird, wird sie als verwendet markiert (da wir die zulässige Größe erhöhen, wissen wir, dass wir das kleinste Cookie sind, das sie enthält), und wir zeichnen die Füllung auf.
Formatierter und kommentierter Code:
Ausgänge für die 4 Testfälle:
quelle