Finde den Weihnachtsmann und sein Rentier in einer überfüllten Szene.
Eingang
Die Eingabe erfolgt auf STDIN und ist eine variable Anzahl von Zeichenzeilen gleicher, aber variabler Länge. Wenn sich der Weihnachtsmann (dargestellt durch den Charakter S
) in der Szene befindet, befindet sich sein Sack mit Geschenken (dargestellt durch den Charakter P
) in einer der ihm benachbarten Positionen (horizontal, vertikal oder diagonal). Sein Rentier (jedes durch den Charakter dargestellt R
) wird sich alle innerhalb des ihn umgebenden 5x5-Quadrats befinden. Wenn eine S
in der Szene erscheint, die keinen Sack Geschenke hat oder nicht von mindestens 4 Rentieren begleitet wird, dann ist es nicht der Weihnachtsmann.
Ausgabe
Die Szene wurde von jeglicher Verschleierung befreit (alle Nicht-Weihnachtsmann-, Nicht-Geschenk-, Nicht-Rentier-Charaktere, die durch ein Leerzeichen ersetzt wurden) und zeigt den Weihnachtsmann, seinen Sack mit Geschenken und sein Rentier - alle anderen Charaktere sollten durch Leerzeichen ersetzt werden. Wenn der Weihnachtsmann und sein Rentier nicht in der Szene sind, geben Sie sie unverändert aus. Es ist garantiert, dass es nur eine Lösung gibt, es wird also nie mehr als einen gültigen Weihnachtsmann geben und er wird niemals mehr als einen Sack Geschenke tragen.
Beispiele
In diesen Beispielen verwende ich nur den *
Charakter , um es die leicht zu machen , zu sehen S
, P
und R
Zeichen, aber Ihr Programm soll beliebige ASCII - Zeichen aus zu handhaben können, !
zu `
(33 bis 96). Ich habe Kleinbuchstaben und höher weggelassen, um Verwirrung zu vermeiden.
Eingang:
***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Ausgabe: (Punkte ignorieren, sie sollen die Seite zwingen, die leeren Zeilen anzuzeigen)
.
.
.
R
P
S
R
R R
.
.
.
.
Input: (nicht genug Rentiere)
***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Ausgabe:
***********
***********
***********
***********
******P****
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Input: (kein Sack mit Geschenken)
***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Ausgabe:
***********
***********
***********
*****R*****
***********
*****S*****
*****R*****
****R**R***
***********
***********
***********
***********
Input: (Geschenke nicht nah genug)
***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********
Ausgabe:
***********
***********
***********
*****R*****
***********
*****S*P***
*****R*****
****R**R***
***********
***********
***********
***********
Eingabe: (eines der Rentiere nicht innerhalb des 5x5 Quadrats um den Weihnachtsmann)
***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********
Ausgabe:
***********
***********
***********
*****R*****
******P****
*****S*****
*****R*****
****R******
*******R***
***********
***********
***********
Testskripte
Wie in einigen meiner früheren Fragen habe ich auch hier einige Testskripte geschlachtet, die ursprünglich von Joey und Ventero erstellt wurden , um einige Testfälle für diese Frage bereitzustellen:
Verwendung: ./test [your program and its arguments]
Klartextversion der Tests als Referenz: Klartext
Belohnung
Jeder Beitrag, bei dem ich nachprüfen kann, ob er der Spezifikation entspricht, die Tests besteht und offensichtlich einen Golfversuch unternommen hat, wird von mir positiv bewertet (bitte geben Sie die Verwendungsanleitung mit Ihrer Antwort an). Die kürzeste Lösung bis Ende 31.12.2013 wird als Sieger anerkannt.
Antworten:
MATLAB: 110
, 95ZeichenIch bin mir nicht sicher, wie die Eingabe verarbeitet werden soll, aber der Rest ist ziemlich einfach.
Normal formatierte Version:
Beispiel Eingabe:
quelle
*
Zeichen , als die Menge zu erleichtern, um das zu sehenS
,P
undR
Zeichen - während der Tests im Testskript verwendet alle ASCII - Zeichen von 33 (!
) nach oben bis (und einschließlich) 96 (`` `). Ich werde dies in der Frage klarstellen. Ich habe eine Klartextversion der Tests erstellt, die Sie bestehen müssen, und die ich auch der Frage hinzufügen werde.Q
Uilt trägt, hätte mir mindestens 2 Charaktere erspart.SQL_2
in die Beispiel-Eingabe gerutscht ... nett :)Python 2 (
353381)Erster Versuch, Code so kompakt wie möglich zu schreiben. Python ist nicht wirklich die Sprache dafür, da Einrückungen und Zeilenumbrüche einfach vom Design verlangt werden. Ich habe mich hauptsächlich für diese Sprache entschieden, da man mit Listen und Strings als Listen spielen kann. Eine Sprache mit einfacher Matrixmanipulation wäre ideal für diese Aufgabe, aber leider kenne ich keine von ihnen.
Um etwas zu testen, muss etwas einem zugewiesen werden, zDie wichtigste interessante Sache in diesem Code ist wahrscheinlich:
Dies ist eine ausgefallene Schreibweise: "b wird eine Liste einer Darstellung (Zeichenfolge mit 25 Zeichen) von jedem 5x5-Quadrat in der ursprünglichen Darstellung".
quelle
Es sollte nur ein Weihnachtsmann in der Datei sein (wenn mehr als 2 "S" vorhanden sind, muss der Code aktualisiert werden).
Awk benutzen
Führen Sie den Befehl awk wie folgt aus
Ergebnis
quelle
S
erlaubt, solange nur einer ein 'gültiger' Weihnachtsmann ist. Die Tests (in der Frage bereitgestellt) haben einige Fälle, die aus diesem Grund fehlschlagen würden.