203 lines
6.0 KiB
Markdown
203 lines
6.0 KiB
Markdown
# Schiebeparkplatz
|
|
|
|
## Lösungsidee
|
|
|
|
Für jede normale Textdatei wird ASCII encoding verwendet bzw. ein Encoding
|
|
Standard, welcher auf ASCII basiert und zusätzliche Sonderzeichen enthält,
|
|
wobei die Werte, die bereits in ASCII enthalten sind, übernommen wurden.
|
|
Die ASCII Codes für die Buchstaben sind entsprechend des Alphabets
|
|
hintereinander angeordnet. Dies ist sehr nützlich, da somit eine Liste der
|
|
Buchstaben und deren Position im Alphabet nicht benötigt wird.
|
|
|
|
Zur Lösung des Parkplatzproblems werden die Autos, wenn möglich nach links bzw.
|
|
rechts verschoben, bis die Parklücke frei ist. Je nachdem, in welche Richtung
|
|
weniger Autos verschoben werden müssen, wird die Verschiebungsrichtung gewählt.
|
|
|
|
## Umsetzung
|
|
|
|
Da die Lösung des Problems keine besondere Library benötigt und die Anforderungen
|
|
an die Ausführungsgeschwindigkeit gering sind, hätte man fast jede Programmiersprache
|
|
wählen können. Ich habe mich für Go entschieden.
|
|
|
|
Das Programm akzeptiert als Argumente eine beliebige Anzahl an Pfaden zu Parkplatzdateien.
|
|
Für das Iterieren über die Argumente wird eine for-Schleife benutzt.
|
|
Innerhalb der Schleife wird die Eingabedatei ausgelesen. Anhand des ersten und letzten
|
|
Buchstabens der Autos auf den normalen Parkplätzen wird die Anzahl an Parkplätzen
|
|
bestimmt. Anschließend wird eine Slice (ein dynamisch vergrößerbares Array in Go)
|
|
mit den Buchstaben der quer parkenden Autos befüllt an den Indexen, an denen sie die
|
|
normalen Parkplätze blockieren.
|
|
|
|
In einer for-Schleife wird die "move"-Funktion je Index der Parkplätze doppelt
|
|
für beide Verschiebungsrichtungen aufgerufen.
|
|
In der "move"-Funktion wird ein Auto verschoben, wenn nicht das Ende des
|
|
Parkplatzes erreicht ist. Die Funktion ruft sich rekursiv auf, um weitere Autos zu
|
|
verschieben. Je nachdem, in welche Richtung weniger Autos verschoben werden müssen,
|
|
wird sich für das Verschieben in diese Richtung entschieden.
|
|
Wenn es allerdings gleich viele sind, ist die geringere Anzahl der verschobenen
|
|
Plätze aller Autos ausschlaggebend für das Verschieben in diese Richtung.
|
|
|
|
## Beispiele
|
|
|
|
Zunächst wird das Programm mit den bereitgestellten Beispieldaten getestet.
|
|
|
|
```
|
|
parkplatz0.txt:
|
|
A:
|
|
B:
|
|
C: H 1 rechts
|
|
D: H 1 links
|
|
E:
|
|
F: H 1 links, I 2 links
|
|
G: I 1 links
|
|
parkplatz1.txt:
|
|
A:
|
|
B: O 1 rechts, P 1 rechts
|
|
C: O 1 links
|
|
D: P 1 rechts
|
|
E: O 1 links, P 1 links
|
|
F:
|
|
G: Q 1 rechts
|
|
H: Q 1 links
|
|
I:
|
|
J:
|
|
K: R 1 rechts
|
|
L: R 1 links
|
|
M:
|
|
N:
|
|
parkplatz2.txt:
|
|
A:
|
|
B:
|
|
C: O 1 rechts
|
|
D: O 1 links
|
|
E:
|
|
F: O 1 links, P 2 links
|
|
G: P 1 links
|
|
H: Q 1 rechts, R 1 rechts
|
|
I: P 1 links, Q 1 links
|
|
J: R 1 rechts
|
|
K: P 1 links, Q 1 links, R 1 links
|
|
L:
|
|
M: P 1 links, Q 1 links, R 1 links, S 2 links
|
|
N: S 1 links
|
|
parkplatz3.txt:
|
|
A:
|
|
B: O 1 rechts
|
|
C: O 1 links
|
|
D:
|
|
E: P 1 rechts
|
|
F: P 1 links
|
|
G:
|
|
H:
|
|
I: Q 2 links
|
|
J: Q 1 links
|
|
K: Q 2 links, R 2 links
|
|
L: Q 1 links, R 1 links
|
|
M: Q 2 links, R 2 links, S 2 links
|
|
N: Q 1 links, R 1 links, S 1 links
|
|
parkplatz4.txt:
|
|
A: Q 1 rechts, R 1 rechts
|
|
B: Q 2 rechts, R 2 rechts
|
|
C: R 1 rechts
|
|
D: R 2 rechts
|
|
E:
|
|
F:
|
|
G: S 1 rechts
|
|
H: S 1 links
|
|
I:
|
|
J:
|
|
K: T 1 rechts
|
|
L: T 1 links
|
|
M:
|
|
N: U 1 rechts
|
|
O: U 1 links
|
|
P:
|
|
parkplatz5.txt:
|
|
A:
|
|
B:
|
|
C: P 2 links
|
|
D: P 1 links
|
|
E: Q 1 rechts
|
|
F: Q 2 rechts
|
|
G:
|
|
H:
|
|
I: R 1 rechts
|
|
J: R 1 links
|
|
K:
|
|
L:
|
|
M: S 1 rechts
|
|
N: S 1 links
|
|
O:
|
|
```
|
|
|
|
Außerdem habe ich noch weitere Testfälle erstellt, die sich im Ordner "testdaten"
|
|
befinden. Als Erstes habe ich getestet, ob das Programm auch mit dem Verschieben
|
|
sehr vieler Autos klarkommt. Es gibt 26 Parkplätze, wovon alle außer die ersten
|
|
beiden mit quer parkenden Autos blockiert sind. Für die quer parkenden Autos
|
|
wurden Kleinbuchstaben verwendet, da alle Großbuchstaben schon belegt sind.
|
|
|
|
```
|
|
test0.txt:
|
|
A:
|
|
B:
|
|
C: a 2 links
|
|
D: a 1 links
|
|
E: a 2 links, b 2 links
|
|
F: a 1 links, b 1 links
|
|
G: a 2 links, b 2 links, c 2 links
|
|
H: a 1 links, b 1 links, c 1 links
|
|
I: a 2 links, b 2 links, c 2 links, d 2 links
|
|
J: a 1 links, b 1 links, c 1 links, d 1 links
|
|
K: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links
|
|
L: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links
|
|
M: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links, f 2 links
|
|
N: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links, f 1 links
|
|
O: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links, f 2 links, g 2 links
|
|
P: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links, f 1 links, g 1 links
|
|
Q: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links, f 2 links, g 2 links,
|
|
h 2 links
|
|
R: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links, f 1 links, g 1 links,
|
|
h 1 links
|
|
S: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links, f 2 links, g 2 links,
|
|
h 2 links, i 2 links
|
|
T: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links, f 1 links, g 1 links,
|
|
h 1 links, i 1 links
|
|
U: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links, f 2 links, g 2 links,
|
|
h 2 links, i 2 links, j 2 links
|
|
V: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links, f 1 links, g 1 links,
|
|
h 1 links, i 1 links, j 1 links
|
|
W: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links, f 2 links, g 2 links,
|
|
h 2 links, i 2 links, j 2 links, k 2 links
|
|
X: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links, f 1 links, g 1 links,
|
|
h 1 links, i 1 links, j 1 links, k 1 links
|
|
Y: a 2 links, b 2 links, c 2 links, d 2 links, e 2 links, f 2 links, g 2 links,
|
|
h 2 links, i 2 links, j 2 links, k 2 links, l 2 links
|
|
Z: a 1 links, b 1 links, c 1 links, d 1 links, e 1 links, f 1 links, g 1 links,
|
|
h 1 links, i 1 links, j 1 links, k 1 links, l 1 links
|
|
```
|
|
|
|
Die Autos wurden abwechselend jeweils um ein oder zwei Parkplätze verschoben,
|
|
je nachdem ob das ausfahrende Auto hinter der linken oder rechten Hälfe des quer
|
|
stehenden Autos steht.
|
|
|
|
Die Bezeichner der Autos müssen auch nicht bei A beginnen. Der Beginn mit
|
|
anderen Buchstaben ist möglich. Dies zeigt das folgende Beispiel an der
|
|
Eingabedatei "parkplatz3.txt" mit veränderten Bezeichnern.
|
|
|
|
```
|
|
test1.txt:
|
|
C:
|
|
D: X 1 rechts
|
|
E: X 1 links
|
|
F:
|
|
G: Y 1 rechts
|
|
H: Y 1 links
|
|
I:
|
|
J:
|
|
K: Q 2 links
|
|
L: Q 1 links
|
|
M: Q 2 links, R 2 links
|
|
N: Q 1 links, R 1 links
|
|
O: Q 2 links, R 2 links, S 2 links
|
|
P: Q 1 links, R 1 links, S 1 links
|
|
```
|