Sie sollten ein Programm oder eine Funktion schreiben, die eine Zeichenfolge empfängt, die ein ASCII-Polygon als Ein- und Ausgabe darstellt, um den Bereich des Polygons zurückzugeben.
Die Eingabe ist eine Zeichenfolge, die aus den Zeichen besteht _ / \ L V space
und newline
ein einfaches Polygon definiert (dh keine zusätzlichen Segmente, keine Selbstberührung und keine Selbstüberschneidung).
Die Fläche einer einzelnen Zeichenzelle beträgt 2
_
teilt die Zelle in Größen0
und2
\
teilt die Zelle in Größen1
und1
/
teilt die Zelle in Größen1
und1
L
teilt die Zelle in Größen0
und2
V
Unterteilt die Zelle in Größen1
und1
(Die beiden Seiten desV
werden immer auf der gleichen Seite des Polygons sein, sodass sie in der Auflistung zusammen behandelt werden.)
Jedes Zeichen verbindet die beiden Ecken seiner erwarteten Zeichenzelle (z. B. oben links und oben rechts bei V
).
Ein Beispiel mit einer Fläche von 7 ( 1+2+1
in der zweiten und 1+1+1
dritten Reihe ):
_
/ \
V\/
Eingang
- Die Eingabe bildet ein Rechteck, dh zwischen den Zeilenumbrüchen befindet sich die gleiche Anzahl von Zeichen.
- Auf jeder Seite des Polygons kann sich ein zusätzliches Leerzeichen befinden.
- Der Zeilenumbruch ist optional.
Ausgabe
- Eine einzelne positive Ganzzahl, die Fläche des Polygons.
Beispiele
Die Ausgaben stehen nach der letzten Zeile ihrer Eingaben.
_
V
1
/L
\/
3
/VV\
L /
L/
14
____/\
\ /
/\/ /
\____/
32
/V\
/ \__
\ /
/\/ /V
L____/
45
Dies ist Code-Golf, also gewinnt der kürzeste Einstieg.
^
absichtlich?Antworten:
CJam,
48 4329 BytesUpdate : Viel Golf gespielt mit Mathe und dem State * 2-Trick von Orlps Antwort.
Wie es funktioniert (veraltet, bald aktualisiert)
Wir teilen die Eingabe in Zeilenumbrüche auf und führen dann für jeden Teil einen Zähler für das Auftreten von Grenzzeichen
L\/
. Dieser Zähler% 2 teilt uns mit, welcher der beiden Partitionsbeträge für alle Zeichen ausgewählt werden soll. Dann finden wir den Index jedes Zeichens in der ZeichenfolgeL _
.\/V
Gibt an, dass-1
auf das letzte Element in einem Array verwiesen wird. Nachdem wir den Index erhalten haben,4558Zb2/
erstellen wir das Array[[2 0] [0 2] [0 2] [1 1]]
und wählen anhand des Zählers die korrekte Anzahl aus.Probieren Sie es hier online aus
quelle
Pyth,
4746453630Erläuterung:
Wir haben zwei Zustände, "im Polygon" und "außerhalb des Polygons". Die folgenden Zeichen tun jeweils Folgendes, wenn sie von links oben nach rechts unten gelesen werden:
Beachten Sie, dass sich "Einer zur Fläche hinzufügen" und "Wenn Sie sich in einem Polygon befinden, fügen Sie zwei zur Fläche hinzu" gegenseitig ausschließen.
quelle
x=
funktioniert. Ist das irgendwo dokumentiert?+=
oder*=
oder was auch immer. In diesem Fallx
wird es als xor verwendet, es ist also genau das gleiche wie bei Python^=
.Retina , 293 + 15 = 308
314385BytesJede Zeile wird in einer eigenen Datei abgelegt, daher habe ich die Bytezahl um 13 erhöht. Alternativ können Sie alles in einer einzigen Datei speichern und das
-s
Flag verwenden. Die<empty>
stehen für tatsächlich leere Dateien oder Zeilen.Leider brauche ich nur 187 Bytes, um das Ergebnis von unär in dezimal umzuwandeln. Ich denke, ich sollte es wirklich tun das bald umsetzen .
Erläuterung
Retina ist eine auf Regex basierende Sprache (die ich genau geschrieben habe, um solche Dinge mit Regex machen zu können). Jedes Paar von Dateien / Zeilen definiert eine Ersetzungsstufe, wobei die erste Zeile das Muster und die zweite Zeile die Ersetzungszeichenfolge ist.
`
Mustern kann eine durch -begrenzte Konfigurationszeichenfolge vorangestellt werden , die die üblichen Regex-Modifikatoren sowie einige Retina-spezifische Optionen enthalten kann. Für das obige Programm sind die relevanten Optionen;
, die die Ausgabe dieser Stufe und unterdrücken+
die Ersetzung in einer Schleife anwenden, bis sich das Ergebnis nicht mehr ändert.Die Idee der Lösung ist, jede Zeile einzeln zu zählen, da wir immer anhand der Zeichen entscheiden können, ob wir innerhalb oder außerhalb des Polygons sind. Dies bedeutet auch, dass ich das Ganze zu einer einzigen Linie zusammenfügen kann, da der Anfang und das Ende einer Linie immer außerhalb des Polygons liegen. Wir können auch feststellen, dass
_
und der Raum für einen Linien-Sweep-Algorithmus ebenso wie\
und völlig identisch sind/
. Als ersten Schritt ersetze ich also alle Zeilenumbrüche und Leerzeichen durch_
und durch\
nach/
, um später den Code zu vereinfachen.Ich verfolge den aktuellen Innen- / Außenstatus mit den Zeichen
i
und verwendeo
gleichzeitig dasi
s, um den Bereich zu erfassen. Dazu beginne ich mit einem vorangestellteno
, der verbundenen Linie um zu markieren, dass wir außerhalb des Polygons sind. Außerdem füge ichiio
ganz am Ende der Eingabe ein hinzu, das ich zum Nachschlagen verwenden werde, um neue Zeichen zu generieren.Dann ersetzt der erste große Ersatz einfach einen
i
odero
gefolgt von einem/V_L
der folgenden Zeichensätze, wodurch das Ganze überflutet und gezählt wird. Die Ersetzungstabelle sieht wie folgt aus: Die Spalten entsprechen dem letzten Zeichen in dieser Zeile und die Zeilen dem nächsten Zeichen (wobeiS
Leerzeichen und<>
eine leere Zeichenfolge verwendet werden). Ich habe alle Zeichen der Eingabe eingefügt, um die Entsprechungen anzuzeigen, die ich bereits verwendet habe:Beachten Sie, dass das letzte Zeichen dann immer gibt an, ob nach dem Charakter , wir sind innerhalb oder außerhalb des Polygons, während die Zahl der
i
s entspricht der Fläche , dass der Bedarf an dem Polygon hinzugefügt werden. Als Beispiel hier sind die Ergebnisse der ersten vier Iterationen der letzten Beispieleingabe (diese wurde von einer alten Version generiert, die tatsächlich jede Zeile separat geflutet hat, aber das Prinzip ist immer noch dasselbe):Zuletzt
o
entferne ich einfach alle s und die Zeilenumbrüche, indem ich alles entferne, was passt[^i]
, und der Rest ist die Umwandlung von Dezimal zu Unär, die ziemlich langweilig ist.quelle
Perl,
6558 Bytesquelle
$/=\1;$-^=2*y,/\\L,,,$a+=y,/\\V,,||$-for<>;print$a
GNU sed, 290 + 1
Die +1 ist für die Rechnung
-r
Schalter an sed übergeben wird. Kommentare und zusätzliches Leerzeichen werden in der Partitur nicht berücksichtigt.Ich habe nicht sehr detailliert geschaut, aber ich denke, das ähnelt wahrscheinlich Martins Retina-Antwort :
Überblick
:
Anmerkungen
sed
Da es zeilenorientiert ist, sind einige Arbeiten erforderlich, um mehrere Zeilen gleichzeitig zu verarbeiten. DerN
Befehl fügt dazu eine neue Zeile und dann die nächste Zeile an den aktuellen Musterbereich an. Die SchwierigkeitN
besteht darin, dass der EOF-Eingabestreamsed
vollständig beendet wird, ohne dass eine weitere Verarbeitung möglich ist. Um dies zu umgehen, zählen wir die aktuellen Doppelpunkte am Ende jeder Zeile, bevor wir die nächste Zeile einlesen.Ausgabe:
quelle
C 93
96 108BytesBearbeiten: Berücksichtigte Vorschläge in den Kommentaren, wandelte die while-Anweisung in eine Einzelanweisung für eine Schleife um und entfernte die Variable "i" vollständig.
Ursprünglicher Beitrag:
Das sah nach einem lustigen und recht einfachen Problem aus, um mich endlich dazu zu bringen, hier ein Konto zu erstellen.
Der Polygontext sollte als erstes Befehlszeilenargument übergeben werden. Dies sollte mit oder ohne Zeilenvorschub / Leerzeichen funktionieren.
Dabei wird jeweils nur ein Zeichen in das Polygon eingelesen, es wird gewechselt, ob sich das Polygon gerade in oder außerhalb von '/', 'L' oder '\' befindet, und t wird bei '/', 'V' um 1 erhöht. und '\' oder um 2, wenn innen / 0, wenn außen auf 'L', '_', Leerzeichen und Zeilenumbruch.
Dies ist mein erstes Mal, dass ich mich in irgendeiner Art von "Golfen" (oder C, soweit es sich von C ++ unterscheidet) versuche. Kritik ist also willkommen!
quelle
i=t=s=0;
I think C-Initialisierungenint
ohnehin alle s auf 0 überspringen . Überprüfen Sie auch, ob Sie diewhile
Schleife in einefor
Schleife verwandeln können . das spart oft ein paar bytes....int i,t,s;for(i=t=s=0;c=v[1][i++];t+=s+(c>46^!(c%19)^s))s^=c>13^c%9>4;...
die 4 Bytes speichern sollte; eins {, eins} und zwei;int i,t,v;
also vormain
statt nach innen stellen, können Siei=t=s=0
insgesamt weitere 7 Byte sparen.POSIX sed,
245244POSIX sed, keine Erweiterungen oder erweiterte reguläre Ausdrücke. Die Eingabe ist auf die maximale Speicherplatzgröße von sed-POSIX-Mandaten von mindestens 8192 beschränkt. GNU schafft mehr. In dieser Version wird davon ausgegangen, dass vor oder nach der Form keine Leerzeilen vorhanden sind. Weitere 10 Byte Code, die in der Erweiterung angegeben sind, können dies berücksichtigen, wenn dies erforderlich ist (die ursprüngliche Frage wird nicht angegeben).
Erweitert und kommentiert
quelle
C 84 Bytes
Wir wechseln die Seiten, wann immer wir sehen
\
,/
oderL
; wir addieren immer eins für\\
,/
oderV
, aber addieren 2 (wenn innen) oder 0 (wenn außen) für Leerzeichen, Zeilenumbruch,L
oder_
.Die Variablen
a
undi
werden bei der Eingabe als Null angenommen - sie müssen zurückgesetzt werden, wenn die Funktion mehrmals aufgerufen werden soll.Ungolfed:
Testprogramm:
quelle