Skripte
Eine Folge von Texten, deren jeder eine Anweisung oder eine Leerzeile sein kann, nennen wir ein Skript oder ein Programm (siehe The Python Language Reference, Release 3.7.0a1, Abschnitt “9.2 File input ”).
Bisher haben wir in diesem Kurs vorwiegend einzeilige Programme geschrieben. Für die Eingabe und Ausführung solch einzeiliger Programme ist die Konsole gut geeignet gewesen.
Oft schreibt man in Python aber mehrzeilige Programme. Für die Eingabe und Ausführung solch mehrzeiliger Programme ist der Editor besser geeignet.
Damit man sich an die Arbeit mit dem Editor gewöhnt, sollten ab jetzt alle mehrzeiligen Programme mit dem Editor geschrieben und gestartet werden.
In diesem Kurs werden Skripte häufig unter dem Etikett »main.py« gelistet. Darunter findet sich dann ein Protokoll der Ausgabe bei ihrer Ausführung.
Solche Skripte können nicht immer in die Konsole oder das Dialogfenster kopiert werden, im allgemeinen sind sie dafür gedacht, in ein Skriptfenster eingegeben zu werden.
main.py
from math import cos
print( "cos( 0 )= ", cos( 0 ))
print( "1/0 = ", 1/0 )
print( "cos( 0 )= ", cos( 0 ))
Protokoll
cos( 0 )= 1.0
FehlerWegenDivisonDurchNull
Fehlermeldungen erscheinen im Protokoll oft verkürzt und eingefärbt. Manchmal werden sie hier auch noch übersetzt.
Fehlermeldungen, die erscheinen, nachdem die Programmausführung zunächst schon begonnen wurde, sind Laufzeitfehler.
Laufzeitfehler führen normalerweise zum Abbruch der Programmausführung.
Unterschiede zur Konsole
Auswertungsanweisungen in Quelldateien
Der Werte des äußersten Ausdruck eine Auswertungsanweisung wird bei der Ausführung eines Skripts nicht ausgegeben, daher muß zur Ausgabe immer ›print‹ (oder etwas Ähnliches) verwendet werden.
Zeichenfolgen als Kommentare
Da der Wert des äußersten Ausdrucks einer Auswertungsanweisung nicht stillschweigend ausgegeben wird, kann eine Auswertungsanweisung als Kommentar verwendet werden (dessen Ausführung keine Änderung bewirkt). Insbesondere mehrzeilige Zeichenfolgenliterale (»"""«) werden dafür verwendet.
main.py
from math import cos
print( "cos( 0 )= ", cos( 0 ))
"""Es folgt hier ein Versuch,
durch 0 zu dividieren!"""print( "1/0 = ", 1/0 )
Hier wird das Zeichenfolgenliteral zwar ausgewertet, aber der Wert wird alsdann verworfen, so daß er effektiv keine Rolle spielt.
Einlesen von Eingaben
Wenn Eingaben mit »input« in einem Skript eingelesen werden, das von IDLE ausgeführt wird, so müssen diese vom Benutzer des Programmes im Shell -Fenster eingegeben werden. Dabei ist es manchmal nötig, den Fensterinhalt des Shell -Fensters nach oben zu verschieben, damit dessen Ende angezeigt wird. Dann ist es manchmal noch nötig in diese letzt Zeile zu klicken, bevor dann dort ein Text eingegeben werden kann.
Deutlich erleichtert wird die Eingabe aber, wenn »input« mit einem Argument aufgerufen wird, weil dann die dazugehörige Zeile der Shell automatisch angezeigt wird und eine Eingabe dann ohne weiteres möglich ist.
Daher sollte »input« immer mit einem Argument aufgerufen werden.
»_«
»_« ist in Skripten ein normaler gewöhnlicher Bezeichner, und wird nicht automatisch umdefiniert wie in der Konsole.
»__file__«
Bei der Ausführung eines Skriptes ist der Name »__file__« an den Pfad der Skriptdatei gebunden.
main.py
print( __file__ )
# zum Beispiel:
# C:\Users\example\AppData\Local\Programs\Python\Python37\tmp.py
In der Konsole ist »__file__« in der Regel nicht an etwas gebunden.
Vorteile von Quelldateien
Programme und Programmstücke können in Form von Quelldateien (also einem als Datei abgespeichertem Python -Skript) übersichtlich abgelegt, wiederverwendet und weitergegeben werden.
Quelltext, der einmal als Datei abgespeichert wurde, geht nicht bei einem unerwünschten Schließen des Konsolenfensters verloren.
Es ist schwierig, mehrere hintereinander in die Konsole eingegebene Zeilen bei Bedarf erneut ausführen zu lassen. Hingegen kann ein mehrzeiliges Skript, das in einer Quelldatei steht, leicht erneut gestartet werden.
Importe in Quelldateien
Alle für eine Quelldatei nötigen import-Anweisungen müssen auch in jener Quelldatei stehen. Vorher eventuell in der Konsole eingegebene Import-Anweisungen gelten nicht.
Ausgaben unter IDLE
Ausgaben ohne »file=« und Ausgaben mit »file=stdout« („Standardausgabe“) erscheinen in Blau, mit »file=stderr« („Fehlerausgabe“) in Rot.
main.py
from sys import stdout, stderr
print( "Hallo!" ) # Blau
print( "Hallo!", file=stdout ) # Blau
print( "Hallo!", file=stderr ) # Rot
Wenn ein Skript mehrfach gestartet wird, erscheinen die Ausgaben aller Läufe des Skripts hintereinander im Ausgabefenster. Dies kann bei längeren Ausgaben unübersichtlich werden, da die Ausgabe verschiedener Skripte miteinander verwechselt werden können. In solchen Fällen kann es hilfreich sein, das Ausgabefenster vor dem Start eines Skriptes zu schließen, da dann beim Start eines Skripts ein neues, fast leeres Ausgabefenster geöffnet wird.
Beispiel Ein Skript zur Berechnung einer Summe
Das folgende Skript liest zwei Zahlen ein und gibt ihre Summe aus.
main.py
zahl0 = int( input( 'Erste Zahl? ' ))
zahl1 = int( input( 'Zweite Zahl? ' ))
print( 'Die Summe ist gleich ', zahl0 + zahl1, '.', sep='' )
- Protokoll
Erste Zahl? 40
Zweite Zahl? 50
Die Summe ist gleich 90.
Debuggen
- Im Shell-Fenster-Menü den Debugger starten
- Programm mit Run Module (F5) starten
- Einzelschritt-Ausführung mit Over
- Variablen-Anzeige beachten!
Es stellt sich heraus, daß es zum Debuggen hilfreich ist, eher mehrere kurze Zeilen als eine lange zu haben und Zwischenergebnisse an Namen zu binden.
Beispiel Ein Python -Trainer
Der folgende Python -Trainer stellt Fragen zur Python -Programmierung und zeigt dann nach Drücken der Eingabetaste die erwartete Antwort an.
main.py
input( 'Womit wird eingelesen?' ); print( 'Mit "input".' )
input( 'Womit wird ausgegeben?' ); print( 'Mit "print".' )
input( 'Was bedeutet "ausgeben"?' ); print( 'Auf den Bildschirm schreiben' )
input( 'Was bedeutet "zurueckgeben"?' ); print( 'Als Wert des Aufrufs festlegen' )- Protokoll
Womit wird eingelesen?
- Protokoll
Womit wird eingelesen?
Mit "input".
Womit wird ausgegeben?
Beispiel Ein Skript für Hörübungen
Als Beispiel für ein Skript folgt hier ein Programm zum Verbessern des Erkennens von Intervallen von Tönen.
Das Programm spielt zwei Töne hintereinander in Reihenfolge aufsteigender Frequenz vor, die zusammen entweder eine Quinte oder eine große Terz bilden. Der Benutzer soll nach dem Hören entscheiden, ob er eine Quinte oder eine große Terz gehört hat, und kann das Programm alsdann durch Eingabe von »q« oder »t« fortsetzen, woraufhin ihm angezeigt wird, ob tatsächlich eine Quinte oder eine große Terz erklang.
main.py
from winsound import Beep
from random import randomwenn = lambda wenn, dann, sonst:( sonst, dann )[ wenn ]
quintverhaeltnis = 3/2
terzverhaeltnis = 5/4ist_quinte = int( random() * 2 ) # 1 = Quinte, 0 = keine Quinte (also eine Terz)
frequenzverhaeltnis = wenn( ist_quinte, quintverhaeltnis, terzverhaeltnis )
erste_frequenz_in_Hz = int( random() * 1000 + 110 )
zweite_frequenz_in_Hz = int( erste_frequenz_in_Hz * frequenzverhaeltnis )
dauer_in_millisekunden = 400
Beep( erste_frequenz_in_Hz, dauer_in_millisekunden )
Beep( zweite_frequenz_in_Hz, dauer_in_millisekunden )isteingabe = input( "War dies eine Quinte (q) oder eine grosse Terz (t)? " )
print( 'Es war eine', wenn( ist_quinte, 'Quinte.', 'Terz.' ))
solleingabe = wenn( ist_quinte, 'q', 't' )
ist_richtig = isteingabe == solleingabe
print( 'Ihre Antwort war', wenn( ist_richtig, 'richtig.', 'falsch.' ))- Protokoll
War dies eine Quinte (q) oder eine grosse Terz (t)? q
Es war eine Terz.
Ihre Antwort war falsch
- Protokoll
War dies eine Quinte (q) oder eine grosse Terz (t)? q
Es war eine Quinte.
Ihre Antwort war richtig.
Der Leser kann dieses Programm verändern, indem er andere Intervalle (beispielsweise „große oder kleine Terz?“ statt „Quinte oder große Terz?“) einbaut oder die Intervalle aufwärts statt abwärts vorspielen läßt (oder die Richtung jedesmal zufällig festlegen läßt).
Stilregel
ℛ Stilregel Das Schreiben mehrerer Anweisungen in eine Zeile soll vermieden werden.
ℛ Stilregel Das Schreiben eines überflüssigen Semikolons am Ende einer Zeile soll vermieden werden.
Stilregeln in diesem Kurs gelten für Code, der bibliotheksfähig sein soll, also für Code, der in einer Datei gespeichert wird. Um in der Konsole mit Ad-hoc-Code etwas auszuprobieren oder vorzuführen, ist das Schreiben mehrerer Anweisungen in eine Zeile manchmal praktisch oder in bestimmten Fällen sogar notwendig.
Die Schreibweise mit einer Auswertungsanweisung pro Zeile gilt in Python als besserer Stil verglichen mit der Verwendung eines Semikolons »;« und mehreren Auswertungsanweisungen pro Zeile.
- Gilt als schlechter Stil
print( 'A' ); print( 'B' )
- Gilt nicht als schlechter Stil
print( 'A' )
print( 'B' )
Wenn eine Auswertungsanweisung alleine in einer Zeile steht, ist es nicht nötig, ein Semikolon »;« zu verwenden.
- Gilt als schlechter Stil
print( 'A' );
- Gilt nicht als schlechter Stil
print( 'A' )
Dateizugriffe
Die eingebaut Funktion »open« ergibt ein iterables Objekt mit den einzelnen Zeilen.
tmp.txt
The afternoon sun was warm on the five workmen there, busy upon doors
and window-frames and wainscoting. A scent of pine-wood from a tentlike
pile of planks outside the open door mingled itself with the scent of
the elder-bushes which were spreading their summer snow close to
the open window opposite; the slanting sunbeams shone through the
transparent shavings that flew before the steady plane, and lit up the
fine grain of the oak panelling which stood propped against the wall.
On a heap of those soft shavings a rough, grey shepherd dog had
made himself a pleasant bed, and was lying with his nose between his
fore-paws, occasionally wrinkling his brows to cast a glance at the
tallest of the five workmen, who was carving a shield in the centre of
a wooden mantelpiece. It was to this workman that the strong barytone
belonged which was heard above the sound of plane and hammer singing--- Konsolenprotokoll
from pprint import pprint
has_workmen = lambda line: "workmen" in line
line_supplier = open( "tmp.txt" ) # nach "./" zeigt IDLE Dateinamen an! (Geduld!)
workmen_line_source = filter( has_workmen, line_supplier )
workmen_line_collection = tuple( workmen_line_source )
pprint( workmen_line_collection )
('The afternoon sun was warm on the five workmen there, busy upon doors\n',
'tallest of the five workmen, who was carving a shield in the centre of\n')- Count lines
line_count = sum( map( lambda line: 1, open( "tmp.txt" )))
print( line_count )
- Konsolenprotokoll
from re import *
from pprint import pprintpprint( tuple( map( lambda line: sub( "workmen", "craftsmen", line ), open( "tmp.txt" ))))
('The afternoon sun was warm on the five craftsmen there, busy upon doors\n',
'and window-frames and wainscoting. A scent of pine-wood from a tentlike\n',
'pile of planks outside the open door mingled itself with the scent of\n',
'the elder-bushes which were spreading their summer snow close to\n',
'the open window opposite; the slanting sunbeams shone through the\n',
'transparent shavings that flew before the steady plane, and lit up the\n',
'fine grain of the oak panelling which stood propped against the wall.\n',
'On a heap of those soft shavings a rough, grey shepherd dog had\n',
'made himself a pleasant bed, and was lying with his nose between his\n',
'fore-paws, occasionally wrinkling his brows to cast a glance at the\n',
'tallest of the five craftsmen, who was carving a shield in the centre of\n',
'a wooden mantelpiece. It was to this workman that the strong barytone\n',
'belonged which was heard above the sound of plane and hammer singing--\n')- Konsolenprotokoll
from functools import reduce
from operator import addtext = reduce( add, open( "tmp.txt" ))
print( text )
The afternoon sun was warm on the five workmen there, busy upon doors
and window-frames and wainscoting. A scent of pine-wood from a tentlike
pile of planks outside the open door mingled itself with the scent of
the elder-bushes which were spreading their summer snow close to
the open window opposite; the slanting sunbeams shone through the
transparent shavings that flew before the steady plane, and lit up the
fine grain of the oak panelling which stood propped against the wall.
On a heap of those soft shavings a rough, grey shepherd dog had
made himself a pleasant bed, and was lying with his nose between his
fore-paws, occasionally wrinkling his brows to cast a glance at the
tallest of the five workmen, who was carving a shield in the centre of
a wooden mantelpiece. It was to this workman that the strong barytone
belonged which was heard above the sound of plane and hammer singing--
Der Stapelbericht ⃗
Der Stapelbericht beschreibt, welche Eingabe gerade verarbeitet wird.
main.py
from traceback import print_stack
print_stack()
- Ausgabe
File "main.py", line 2, in <module>
traceback.print_stack()
Modulnamen ⃗
Das aktuelle Modul heißt auch bei der Ausführung eines Skripts weiterhin »__main__«, wie in der Konsole.
Es folgt eine Übersicht über einige leicht verwechselbare Modulnamen.
- Standardnamen
builtins Standardname, muss aber importiert werden
__main__ Standardname des ausgeführte Moduls (Skripts)
- Spezielle Namen
__builtins___ unter einigen Python-Implementationen (CPython) ohne Import verfuegbar
main Existiert nur, falls solche ein Modul (oder Skript) angelegt wurde
Importe aus dem eigenen Skript ⃗
Ein Skript kann auch gleichzeitig als ein Modul angesehen werden. Entsprechend können wir Namen aus dem eigenen Skript importieren!
main.py
a = 5
from main import a
print( a )- Protokoll
5
5
Hier wird »a« zwei Mal ausgegeben, weil das ganze Skript beim der ersten Ausführung der from-Anweisung ausgeführt wird. Dabei wird die from-Anweisung dann ein zweites Mal ausgeführt, was aber dann nicht mehr zu einer erneuten Ausführung des Skriptes führt.
Ein Modul muß beim Import ausgeführt werden, da erst dadurch die Namen an ihre Werte gebunden werden. Erst durch die Ausführung der Bindungsanweisung »a = 5« wird der Name »a« an den Wert «5» gebunden.
Es gibt normalerweise keinen Grund für solch eine from-Anweisung, aber sie zeigt uns eben, daß ein Skript auch als Modul angesehen werden kann.
Wird ein Modul importiert, so ist »__name__« an den Namen des Moduls gebunden. Wird ein Skript ausgeführt, ist »__name__« an den Namen »__main__« gebunden. So kann man beispielsweise in ein- und derselben Datei erkennen, ob sie gerade importiert oder als Skript ausgeführt wird.
main.py
import main
print( __name__ )
main.py
main
__main__
Übungsfragen
? Übungsfrage
Welche Ausgabe bewirkt die Ausführung des folgenden Skripts?
main.py
_ = 7
print( _ )
? Übungsfrage
Welche Ausgabe bewirkt die Ausführung des folgenden Skripts? (Der Kosinus von Null ist Eins.)
main.py
from math import cos
print( 2 )
3
print( cos( 0 ))
cos( 0 )
Übungsaufgaben
/ Übungsaufgabe
Schreiben Sie ein Skript, das eine Zahl einliest und deren Quadrat ausgibt.
Es sollten Namen für Zwischenergebnisse definiert und nicht zu viele Aufrufe ineinander verschachtelt werden.
- Das Quadrat einer gegebenen Zahl erhält man, indem man die Zahl «1» zweimal mit der gegebenen Zahl multipliziert.
/ Reserveaufgabe ⃗
Schreiben Sie ein Skript, das eine Zahl einliest und deren Kehrwert ausgibt.
Es sollten Namen für Zwischenergebnisse definiert und nicht zu viele Aufrufe ineinander verschachtelt werden.
- Den Kehrwert einer Zahl erhält man, indem man die Zahl «1» durch jene Zahl teilt.
/ Reserveaufgabe ⃗
Schreiben Sie ein Skript, das zwei Zahlen einliest und deren Summe ausgibt.
Es sollten Namen für Zwischenergebnisse definiert und nicht zu viele Aufrufe ineinander verschachtelt werden.
/ Übungsaufgabe ⃗
Legen Sie ein Skript namens »usercustomize.py« im Verzeichnis «getusersitepackages()» mit dem folgenden Inhalt an. (Hierzu muß das Verzeichnis gegebenenfalls erst einmal angelegt werden.)
- «getusersitepackages()»/usercustomize.py
print( 'Berlin' )
Starten Sie dann Ihr Programm und beobachten Sie die Ausgabe von »Berlin«.
Löschen Sie die Datei nun wieder.
/ Unterstreichen
Schreiben Sie ein Skript, das eine Zeichenfolge einliest und diese unterstrichen wieder ausgibt.
- Beispiel des Programmablaufs
Zeichenfolge? alpha
alpha
------ Beispiel des Programmablaufs
Zeichenfolge? Desoxyribonukleinsaeure
Desoxyribonukleinsaeure
-----------------------
/ Übungsaufgabe ⃗
Schreiben Sie ein Skript, das eine Zeichenfolge einliest und diese eingerahmt wieder ausgibt.
- Beispiel des Programmablaufs
Zeichenfolge? alpha
.-------.
| alpha |
'-------'- Beispiel des Programmablaufs
Zeichenfolge? Desoxyribonukleinsaeure
.-------------------------.
| Desoxyribonukleinsaeure |
'-------------------------'
Anhang Variante des obigen Skripts
Das folgende Programm gibt eine Variante wieder, bei der die Variablennamen kürzer und durch Kommentare erläutert sind.
main.py
from winsound import Beep
from random import random
from math import isclose# V0 Verhältnis des tieferen Tons einer Quinte zum höheren
# V1 Verhältnis des tieferen Tons einer Terz zum höheren
# F0 erste Frequenz des Intervalls in Hz
# F1 erste Frequenz des Intervalls in Hz
# Q ist es eine Quinte? 1 = Quinte, 0 = keine Quinte (d.h.: Terz)
# R zu verwendendes Frequenzverhaeltnis
# II Ist-Eingabe (Eingabe)
# IS Soll-Eingabe (richtige Antwort)
# C War die Antwort richtig?V0 = 2/3
V1 = 4/5F0 = int( random() * 1000 + 110 )
Q = int( random() * 2 )
R = Q * V0 +( 1-Q )* V1
F1 = int( F0 * R )Beep( F0, 400 )
Beep( F1, 400 )II = input( "War dies eine Quinte (q) oder eine grosse Terz (t)? " )
print( 'Es war eine', Q * 'Quinte.' +( 1-Q )* 'Terz.' )
IS = Q * 'q' +( 1-Q )* 't'
C = II == IS
print( 'Ihre Antwort war', C * 'richtig.' +( 1-C )* 'falsch' )
Anhang Präludium, BWV 846
Die Wiedergabe des Präludiums mit Hilfe von »Beep« klingt nicht besonders gut. Es ist nicht genau klar, warum.
main.py
# based on code by "gm__".
# J. S. Bach - Präludium BWV 846 (Original in C Dur)
# duration: 1:58 minutes
from time import sleep as s
from winsound import Beep as bb(392,191)
b(494,198)
b(587,180)
b(784,179)
b(988,186)
b(587,185)
b(784,184)
b(988,177)
s(0.001374)
b(392,208)
b(494,179)
b(587,176)
b(784,180)
b(988,177)
b(587,177)
b(784,187)
b(988,181)
s(0.000381)
b(392,176)
b(440,193)
b(660,182)
b(880,183)
b(1047,183)
b(660,178)
b(880,184)
b(1047,181)
s(0.001690)
b(392,206)
b(440,205)
b(660,182)
b(880,180)
b(1047,187)
b(660,185)
b(880,188)
b(1047,187)
s(0.003452)
b(370,200)
b(440,200)
b(587,179)
b(880,186)
b(1047,187)
b(587,188)
b(880,189)
b(1047,184)
s(0.003140)
b(370,194)
b(440,187)
b(587,181)
b(880,178)
b(1047,185)
b(587,178)
b(880,177)
b(1047,188)
s(0.002649)
b(392,209)
b(494,206)
b(587,186)
b(784,183)
b(988,180)
b(587,186)
b(784,183)
b(988,183)
s(0.010631)
b(392,192)
b(494,194)
b(587,186)
b(784,185)
b(988,185)
b(587,182)
b(784,180)
b(988,181)
s(0.005442)
b(392,212)
b(494,208)
b(660,182)
b(988,180)
b(1320,186)
b(660,184)
b(988,179)
b(1320,187)
s(0.007269)
b(392,226)
b(494,202)
b(660,187)
b(988,182)
b(1320,184)
b(660,179)
b(988,190)
b(1320,187)
s(0.002452)
b(392,229)
b(440,190)
b(554,181)
b(660,189)
b(880,185)
b(554,181)
b(660,185)
b(880,188)
s(0.007138)
b(392,210)
b(440,206)
b(554,188)
b(660,185)
b(880,181)
b(554,184)
b(660,190)
b(880,180)
s(0.009927)
b(370,208)
b(440,204)
b(587,191)
b(880,186)
b(1175,184)
b(587,186)
b(880,184)
b(1175,190)
s(0.006591)
b(370,199)
b(440,199)
b(587,189)
b(880,187)
b(1175,183)
b(587,190)
b(880,190)
b(1175,185)
s(0.011220)
b(370,193)
b(392,206)
b(494,181)
b(587,187)
b(784,183)
b(494,191)
b(587,188)
b(784,189)
s(0.004748)
b(370,197)
b(392,200)
b(494,185)
b(587,192)
b(784,185)
b(494,185)
b(587,183)
b(784,190)
s(0.021366)
b(330,219)
b(392,196)
b(494,183)
b(587,182)
b(784,182)
b(494,191)
b(587,192)
b(784,184)
s(0.003144)
b(330,189)
b(392,194)
b(494,191)
b(587,190)
b(784,189)
b(494,183)
b(587,187)
b(784,185)
s(0.020051)
b(220,207)
b(330,199)
b(440,189)
b(554,190)
b(784,184)
b(440,189)
b(554,194)
b(784,191)
s(0.028114)
b(220,201)
b(330,209)
b(440,188)
b(554,195)
b(784,184)
b(440,190)
b(554,184)
b(784,188)
s(0.029809)
b(293,227)
b(370,192)
b(440,192)
b(587,188)
b(740,186)
b(440,191)
b(587,191)
b(740,189)
s(0.015669)
b(293,221)
b(370,214)
b(440,191)
b(587,192)
b(740,191)
b(440,188)
b(587,186)
b(740,193)
s(0.019541)
b(293,207)
b(349,201)
b(494,193)
b(587,191)
b(831,188)
b(494,190)
b(587,185)
b(831,193)
s(0.022523)
b(293,225)
b(349,198)
b(494,192)
b(587,195)
b(831,196)
b(494,192)
b(587,194)
b(831,185)
s(0.025643)
b(261,212)
b(330,199)
b(440,187)
b(660,186)
b(880,196)
b(440,195)
b(660,194)
b(880,187)
s(0.013077)
b(261,190)
b(330,213)
b(440,192)
b(660,191)
b(880,191)
b(440,189)
b(660,191)
b(880,192)
s(0.006350)
b(261,225)
b(311,209)
b(440,197)
b(523,196)
b(740,195)
b(440,190)
b(523,197)
b(740,188)
s(0.002840)
b(261,221)
b(311,217)
b(440,187)
b(523,197)
b(740,194)
b(440,190)
b(523,188)
b(740,193)
s(0.010174)
b(247,234)
b(293,209)
b(392,188)
b(587,193)
b(784,191)
b(392,193)
b(587,197)
b(784,193)
s(0.017742)
b(247,221)
b(293,204)
b(392,187)
b(587,196)
b(784,189)
b(392,195)
b(587,198)
b(784,193)
s(0.035872)
b(247,212)
b(261,210)
b(330,192)
b(392,199)
b(523,195)
b(330,190)
b(392,192)
b(523,190)
s(0.036867)
b(247,229)
b(261,196)
b(330,189)
b(392,196)
b(523,190)
b(330,199)
b(392,199)
b(523,196)
s(0.036948)
b(220,199)
b(261,207)
b(330,196)
b(392,191)
b(523,190)
b(330,191)
b(392,196)
b(523,193)
s(0.016865)
b(220,225)
b(261,218)
b(330,195)
b(392,196)
b(523,199)
b(330,200)
b(392,191)
b(523,197)
s(0.021891)
b(146,199)
b(220,201)
b(293,195)
b(370,196)
b(523,193)
b(293,196)
b(370,192)
b(523,194)
s(0.006195)
b(146,206)
b(220,212)
b(293,201)
b(370,200)
b(523,199)
b(293,198)
b(370,195)
b(523,201)
s(0.013161)
b(196,212)
b(247,206)
b(293,202)
b(392,191)
b(494,192)
b(293,197)
b(392,196)
b(494,192)
s(0.015321)
b(196,213)
b(247,196)
b(293,202)
b(392,192)
b(494,192)
b(293,192)
b(392,195)
b(494,202)
s(0.024235)
b(196,242)
b(293,214)
b(349,201)
b(392,200)
b(494,196)
b(349,195)
b(392,192)
b(494,198)
s(0.059580)
b(196,208)
b(293,205)
b(349,200)
b(392,203)
b(494,197)
b(349,203)
b(392,192)
b(494,203)
s(0.038499)
b(130,229)
b(261,199)
b(330,197)
b(392,192)
b(494,197)
b(330,193)
b(392,200)
b(494,203)
s(0.004254)
b(130,234)
b(261,220)
b(330,199)
b(392,201)
b(494,195)
b(330,201)
b(392,202)
b(494,202)
s(0.002088)
b(138,234)
b(196,204)
b(330,200)
b(392,205)
b(466,194)
b(330,197)
b(392,195)
b(466,205)
s(0.042655)
b(138,241)
b(196,215)
b(330,196)
b(392,196)
b(466,197)
b(330,200)
b(392,205)
b(466,195)
s(0.063546)
b(155,203)
b(261,208)
b(370,206)
b(392,204)
b(440,205)
b(370,197)
b(392,200)
b(440,195)
s(0.054046)
b(155,215)
b(261,222)
b(370,195)
b(392,198)
b(440,197)
b(370,198)
b(392,197)
b(440,202)
s(0.065163)
b(146,216)
b(261,220)
b(293,203)
b(370,206)
b(440,201)
b(293,206)
b(370,203)
b(440,197)
s(0.047853)
b(146,223)
b(261,220)
b(293,203)
b(370,202)
b(440,199)
b(293,201)
b(370,200)
b(440,196)
s(0.061075)
b(146,202)
b(247,215)
b(293,197)
b(392,198)
b(494,198)
b(293,204)
b(392,202)
b(494,204)
s(0.054672)
b(146,235)
b(247,221)
b(293,204)
b(392,199)
b(494,208)
b(293,207)
b(392,201)
b(494,209)
s(0.014825)
b(146,235)
b(220,217)
b(293,205)
b(392,198)
b(523,201)
b(293,200)
b(392,202)
b(523,208)
s(0.057952)
b(146,249)
b(220,212)
b(293,208)
b(392,201)
b(523,202)
b(293,204)
b(392,202)
b(523,207)
s(0.062013)
b(146,242)
b(220,204)
b(293,201)
b(370,206)
b(523,209)
b(293,203)
b(370,204)
b(523,200)
s(0.076951)
b(146,226)
b(220,217)
b(293,207)
b(370,200)
b(523,199)
b(293,200)
b(370,199)
b(523,203)
s(0.026545)
b(146,214)
b(233,205)
b(330,207)
b(392,208)
b(554,201)
b(330,207)
b(392,207)
b(554,207)
s(0.047871)
b(146,227)
b(233,223)
b(330,205)
b(392,211)
b(554,208)
b(330,206)
b(392,208)
b(554,208)
s(0.033341)
b(146,207)
b(247,214)
b(293,201)
b(392,204)
b(587,209)
b(293,203)
b(392,204)
b(587,206)
s(0.000835)
b(146,230)
b(247,226)
b(293,205)
b(392,205)
b(587,211)
b(293,212)
b(392,208)
b(587,213)
s(0.004962)
b(146,249)
b(220,213)
b(293,204)
b(392,201)
b(523,208)
b(293,206)
b(392,201)
b(523,201)
s(0.043018)
b(146,256)
b(220,224)
b(293,209)
b(392,211)
b(523,212)
b(293,208)
b(392,209)
b(523,203)
s(0.076145)
b(146,236)
b(220,222)
b(293,212)
b(370,210)
b(523,206)
b(293,202)
b(370,205)
b(523,206)
s(0.022652)
b(146,229)
b(220,215)
b(293,211)
b(370,210)
b(523,213)
b(293,205)
b(370,209)
b(523,213)
s(0.077384)
b(98,224)
b(196,235)
b(293,218)
b(349,219)
b(494,222)
b(293,221)
b(349,217)
b(494,225)
s(0.026711)
b(98,258)
b(196,235)
b(293,232)
b(349,232)
b(494,229)
b(293,240)
b(349,243)
b(494,237)
s(0.031485)
b(98,267)
b(196,254)
b(261,251)
b(330,257)
b(392,248)
b(523,258)
b(392,261)
b(330,257)
s(0.007500)
b(392,296)
b(330,289)
b(261,275)
b(330,285)
b(261,284)
b(220,295)
b(261,296)
b(220,301)
s(0.102542)
b(98,309)
b(185,324)
b(587,318)
b(740,323)
b(880,334)
b(1047,344)
b(880,347)
b(740,355)
s(0.044651)
b(880,384)
b(740,381)
b(587,379)
b(740,389)
b(440,423)
b(523,465)
b(494,505)
b(440,530)
s(0.25)
b(392,1936)