nutzt, um die Kommandozeilen-Optionen
»--size« und »--fish« entgegenzunehmen.
Keine weiteren Libraries sind für die
Aufgabe zugelassen, der Code muss mit
einer Standardinstallation von Python
3 und den Anweisungen in »explore.
py« laufen. Die Datei »explore.py« sollte
lesbaren Code enthalten und nicht grö-
ßer als etwa 10 KByte maximal sein. Es
empfiehlt sich für die Teilnehmer auch,
entworfene Algorithmen mit unterschied-
lichen Seegrößen und Fischverteilungen
auszuprobieren.
Die Redaktion wird alle eingehenden Lö-
sungsvorschläge mit drei bis zur Preis-
vergabe streng geheim gehaltenen Seen
und Fischverteilungen (Abbildung 4) ab-laufen lassen, um so festzustellen, ob sie
korrekt alle Fische finden, und dann zäh-
len, wie viele Schritte durch das Quadra-
telabyrinth die Lösungen dazu brauchen.
Die Code-Einsendungen mit der im Mittel
kürzesten Strategie gewinnen. Bei der
Ausgabe zu schummeln ist selbstredend
strengstens untersagt, der Dieselskandal
reicht. Also, an die Arbeit, und gutes
Gelingen! (uba) nInfos
[1] Listings zu diesem Artikel:
[http:// http://www. linux‑magazin. de/ static/
listings/ magazin/ 2019/ 01/ snapshot/]
[2] Michael Schilli, „Herausgekegelt“:
Linux‑Magazin 12/ 09, S. 116,
[http:// http://www. linux‑magazin. de/ ausgaben/
2009/ 12/ herausgekegelt/]könnte und ebenfalls das Hilfsmodul
»fishing.py« nutzt, zeichnet Listing 3
die Quadranten des Sees und malt die
Stellen, an denen sich Fische aufhalten,
mit einem »*« aus. Listing 3 nutzt das
Python-Modul »terminaltables«, das sich
ebenfalls mit »pip3 install« vom Netz
holen lässt.Prüfverfahren
Damit die Redaktion eine Einsendung
berücksichtigen kann, muss sie folgen-
dem Format genügen: Sie enthält ein
ausführbares Python-3-Skript namens
»explore.py«, das die Library »fishing.py«01 #!/usr/bin/python3
02 import fishing
03 import terminaltables as termt
04
05 pond = fishing.Pond()
06
07 print(" ", end=' ')
08 for i in range(pond.width):
09 print("%3d" % i, end=' ')
10 print()
1112 rows = [[" " for y in range(pond.width)]
13 for x in range(pond.height)]
14
15 for x in range(pond.width):
16 for y in range(pond.height):
17 if(pond.data[x][y] != 0):
18 rows[y][x] = "*"
19
20 table = termt.SingleTable(rows)
21 table.inner_row_border = True
2223 idx=0
24 row=0
25 for line in table.table.split("\n"):
26 if idx % 2 == 1:
27 print("%2d" % row, end=' ')
28 row += 1
29 else:
30 print(" ", end=' ')
31 print(line)
32 idx += 1Listing 2: »fishing.py«01 #!/usr/bin/python3
02 import argparse
03 import sys
04
05 class Pond:
06 def __init__(self):
07 parser = argparse.ArgumentParser()
08 group = \
09 parser.add_argument_group('required')
10 group.add_argument(
11 '‑‑size', type=str, help='wxh')12 group.add_argument('‑‑fish',
13 type=str, help='x1:y1,x2:y2,...')
14
15 args = parser.parse_args()
16 if args.size == None or \
17 args.fish == None:
18 parser.print_help()
19 sys.exit(0)
20
21 width, height = args.size.split('x')
22 self.width=int(width)23 self.height=int(height)
24
25 self.data = [
26 [0 for j in range(self.width)]
27 for i in range(self.height)]
28
29 for coord in args.fish.split(','):
30 x, y = coord.split(':')
31 self.data[int(x)][int(y)] = 1Listing 3: »fish-draw.py«Abbildung 3: Beispiel einer Fischverteilung,
gezeichnet von Listing 2.Abbildung 4: Auch so könnte die streng geheime
Verteilung der Fische aussehen, die der Algorithmus
fangen muss.Der Autor
Michael Schilli arbeitet als
Software‑Engineer in der
San Francisco Bay Area in
Kalifornien. In seiner seit
1997 laufenden Kolumne
forscht er jeden Monat nach
praktischen Anwendungen verschiedener Pro‑
grammiersprachen. Unter [mschilli@perlmeister.
com] beantwortet er gerne Fragen.Programmieren100
http://www.linux-magazin.deSnapshot