Powinieneś napisać program lub funkcję, która odbiera ciąg reprezentujący grafikę ASCII jako dane wejściowe i wyjściowe lub zwraca liczbę punktów końcowych na wejściu.
Dane wejściowe będą składały się ze znaków space - | +
(odpowiednio z 0, 2, 2 i 4 punktami końcowymi) i łamania linii. Na przykład:
-|++-
+
Dwie sąsiednie postacie są połączone i dlatego tracą 1 punkt końcowy w następujących przypadkach:
-- -+ +- | | + + ++
| + | +
Pierwszy przykład ma
2+2+2+2+1+
3 = 12
punkty końcowe.
Wejście
- Wejście będzie ciąg składający się z przestrzeni znaków,
-
,|
,+
i linią. - Długość wejściowa może wynosić 0, a każde wejście pasujące do powyższego opisu jest prawidłowe (w wyrażeniu regularnym jest
[ -+|\n]*
). - Końcowy znak nowej linii jest opcjonalny.
Wynik
- Pojedyncza nieujemna liczba całkowita, liczba punktów końcowych.
Przykłady
Wyjścia są za ostatnim wierszem ich danych wejściowych.
+
4
-|++-
+
12
+--+
| |
+--+
8
| |
+--+-- |||
12
--++
|||--
10
<empty input>
0
|
|
2
--
++--
++
--+
+++ ||
----
30
To jest golf golfowy, więc wygrywa najkrótszy wpis.
["",...s.split("\n"),""]
dłużej @ETHproductionsPython 2, 123
Metoda jednoprzebiegowa. Pobiera na wejściu ciąg znaków z łamaniem linii.
W przypadku poziomych chodzi o policzenie liczby segmentów poziomych, z których każdy ma dwa punkty końcowe. Segment zaczyna się za każdym razem, gdy znak jest jednym z
+-
(booleanh
), ale poprzedni nie jest (booleanp
).W przypadku pionów chcielibyśmy zrobić to samo na transponowanym wejściu, patrząc na przebiegi
+|
. Niestety transponowanie Pythona jest naprawdę niezgrabne. Wymagamap(None,*s.split('\n'))
to wypełnienia pustych pól, zNone
którymi również sobie radzą.Zamiast tego wykonujemy liczenie pionowe podczas iteracji w poziomie. Przechowujemy listę,
l
które indeksy kolumn są nadal „uruchomione”, tzn. Gdzie poprzedni znak w tej kolumnie łączy się. Następnie robimy to samo, co z poziomą, licząc nowo rozpoczynające się pionowe segmenty. Kiedy uderzamy w nowy wiersz, odcinamy listę po prawej stronie, gdzie jesteśmy, ponieważ wszystkie segmenty po prawej stronie zostały uszkodzone, i resetujemy bieżący indeks do0
.źródło
CJam,
666261 bajtówWypróbuj online w interpretatorze CJam .
Pomysł
Możemy obliczyć punkty końcowe w następujący sposób:
-
s,|
si+
na wejściu.--
s,-+
s,+-
S i++
S w rzędach.||
s.|+
s,+|
si++
w kolumnach.Kod
źródło