Sie sollten ein Programm oder eine Funktion schreiben, die eine Zeichenfolge empfängt, die eine ASCII-Grafik als Eingabe und Ausgabe darstellt, oder die Anzahl der Endpunkte in der Eingabe zurückgibt.
Die Eingabe besteht aus den Zeichen space - | +
(mit 0, 2, 2 bzw. 4 Endpunkten) und Zeilenumbrüchen. Z.B:
-|++-
+
Zwei benachbarte Zeichen sind verbunden und verlieren in den folgenden Fällen jeweils 1 Endpunkt:
-- -+ +- | | + + ++
| + | +
Das erste Beispiel hat
2+2+2+2+1+
3 = 12
Endpunkte.
Eingang
- Eingangs wird eine Zeichenfolge sein , die aus dem Raum Zeichen,
-
,|
,+
und Neue - Zeile. - Die Länge der Eingabe kann 0 sein, und jede Eingabe, die der obigen Beschreibung entspricht, ist gültig (in Regex-Eingabe ist
[ -+|\n]*
). - Der Zeilenumbruch ist optional.
Ausgabe
- Eine einzelne nicht negative Ganzzahl, die Anzahl der Endpunkte.
Beispiele
Die Ausgänge stehen nach der letzten Zeile ihrer Eingänge.
+
4
-|++-
+
12
+--+
| |
+--+
8
| |
+--+-- |||
12
--++
|||--
10
<empty input>
0
|
|
2
--
++--
++
--+
+++ ||
----
30
Dies ist Code Golf, also gewinnt der kürzeste Einstieg.
["",...s.split("\n"),""]
das länger machen @ETHproductionsPython 2, 123
Eine One-Pass-Methode. Nimmt als Eingabe einen String mit Zeilenumbrüchen.
Für die Horizontalen besteht die Idee darin, die Anzahl der horizontalen Segmente zu zählen, von denen jedes zwei Endpunkte hat. Ein Segment beginnt immer dann, wenn ein Zeichen eines von
+-
(boolean isth
) ist, das vorherige jedoch nicht (Boolescher Wertp
).Für die Vertikalen möchten wir dasselbe mit der transponierten Eingabe machen und uns die Läufe von ansehen
+|
. Leider ist die Transposition von Python sehr klobig. Es erfordert so etwas wiemap(None,*s.split('\n'))
das Ausfüllen der Lücken, mitNone
denen man sich auch selbst befassen muss.Stattdessen zählen wir vertikal, während wir horizontal iterieren. Wir führen eine Liste,
l
welche Spaltenindizes noch "laufen", dh wo das vorherige Zeichen in dieser Spalte nach unten verbindet. Dann machen wir dasselbe wie mit der Horizontalen und zählen neu beginnende vertikale Segmente. Wenn wir eine neue Zeile treffen, schneiden wir die Liste rechts von unserer Position ab, da alle Segmente rechts unterbrochen wurden, und setzen den aktuellen Index auf zurück0
.quelle
CJam,
666261 BytesProbieren Sie es online in der CJam-Interpreter aus .
Idee
Wir können die Endpunkte wie folgt berechnen:
-
s,|
s und+
s in der Eingabe.--
s,-+
s,+-
s und++
s in den Zeilen.||
s.|+
s,+|
s und++
s in den Spalten.Code
quelle