Pythonchallenge Level3

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Donnerstag 21. Februar 2008, 23:00

Hallo,

ich bin derzeit mit Level 3 von Python Challenge . com beschäftigt. Und ich habe null Ahnung, wie ich das ganze lösen soll.
Ich vermute, dass man das ganze mit dem Modul re lösen muss, nur wie ist mir ein Rätsel...

Ich wollte im vorhinein schonmal herausfinden ob es irgendwelche Zusammenhänge in diesem Textwirrwar gibt:

Code: Alles auswählen

in_file = open("level3.txt","r")
text = in_file.read()
in_file.close()
a = set(text)
for x in a:
	print x, text.count(x), "mal"

Code: Alles auswählen

1249 mal
A 1903 mal
C 1980 mal
B 1960 mal
E 1967 mal
D 1949 mal
G 1941 mal
F 1957 mal
I 1961 mal
H 1987 mal
K 1987 mal
J 1917 mal
M 1869 mal
L 1864 mal
O 1807 mal
N 1935 mal
Q 1922 mal
P 1867 mal
S 1867 mal
R 1944 mal
U 1932 mal
T 1922 mal
W 1945 mal
V 1876 mal
Y 1937 mal
X 1916 mal
Z 1985 mal
a 1930 mal
c 1885 mal
b 1956 mal
e 1930 mal
d 1859 mal
g 1911 mal
f 1939 mal
i 1822 mal
h 1973 mal
k 1974 mal
j 1961 mal
m 1960 mal
l 1992 mal
o 1839 mal
n 1872 mal
q 1952 mal
p 1869 mal
s 1889 mal
r 1930 mal
u 2005 mal
t 1914 mal
w 1947 mal
v 1852 mal
y 1901 mal
x 1955 mal
z 1886 mal
Ist zwar alles nahezu gleich viel, aber eben nicht wirklich,...

Kann mir irgendjemand einen Tipp geben?

Danke!
BlackJack

Freitag 22. Februar 2008, 00:27

Lies Dir den Hinweis noch einmal durch. Was da genau gesucht wird.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Freitag 22. Februar 2008, 08:44

ein kleiner Buchstabe, umgeben von genau 3 großen Bodyguards auf beiden Seiten...

Vllt. Bodyguard = eine immer gleiche Buchstabenreihenfolge? und die mal drei, dann kommt der kleine Buchstabe ...

Werde es mal versuchen... Oder ist das komplett falsch?
BlackJack

Freitag 22. Februar 2008, 09:41

Nicht komplett falsch. Es ist bei so etwas immer schwierig nicht zu wenig einzuschränken aber auch nicht zu viel.

Geh am besten von einem regulären Ausdruck aus, der auf Kleinbuchstaben passt und erweitere den dann, um die Treffer ein zu schränken.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Freitag 22. Februar 2008, 17:26

Ich habe nun versucht das ganze umzusetzen und verstehe nicht wirklich, was dieses re eigentlich macht...

habe folgendes probiert:

Code: Alles auswählen

a = "asdasdasdasdasdasdasd"
>>> b = re.compile(r"[asd]{2}")
>>> erg = re.findall(b,a)
>>> erg
['as', 'da', 'sd', 'as', 'da', 'sd', 'as', 'da', 'sd', 'as']
Ich habe mich schon durch die docs.python.org durchgelesen und auch weitere englischsprachige Doks... Gibts da irgendwo was deutsches - ich finde nichts - entweder bin ich zu dumm für das (was ich nicht glaube^^) oder habe einen denkfehler...

Danke!
BlackJack

Freitag 22. Februar 2008, 18:07

'[asd]' ist eine Zeichengruppe und trifft auf eines der Zeichen 'a', 's' oder 'd' zu. Das '{2}' dahinter sagt, dass der Teilausdruck davor genau zweimal zutreffen muss um einen Treffer zu erhalten. Man kann also sagen '[asd]{2}' ist eine Alternative schreibweise für '[asd][asd]'. Und das trifft auf 'aa', 'as', 'ad', 'sa', 'ss', 'sd', 'da', 'ds', und 'dd' zu.

Für die Aufgabe nützlich dürfte die '-'-Schreibweise in Zeichengruppen sein: '[0-9]' trifft zum Beispiel auf alle Ziffern zu. Und '[0-9]{5}' zum Beispiel auf 5-stelligen Zahlen. Damit könnte man zum Beispiel (fast) Postleitzahlen erkennen.

Eine grosse Hilfe beim Entwerfen von regulären Ausdrücken oder bei der Fehlersuche sind Programme wie kodos. Da siehst Du farbig was gematcht wird und wie sich Veränderungen auswirken.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 22. Februar 2008, 18:08

Deine Regex sucht Paare der Buchstaben A, S und D. War das geplant?

Für Regular Expressions gibt es mehrere Tutorials online und außerdem das exzellente Buch von Friedl, Mastering Regular Expressions. Letzteres ist wirklich umfassend und obwohl ich eine Fassung von 1997 habe (Stand Python 1.4) sind da ganz viele Informationen zum Konzept der Regulären Ausdrücke insgesamt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Freitag 22. Februar 2008, 18:15

Installiere Dir mal Kodos und experimentiere da mal ein wenig mit herum. Suche zuerst erst einmal einen String, der nur einmal in einem anderen vorkommt. Danach einen, der 2 oder mehrfach dirn vorkommt. Und dann taste Dich langsam heran und versuche die unterschiedlichen Funktionen zu verstehen.
hast Du das Howto dazu gelesen? Slebst wenn es auf Englisch ist, ist es extrem hilfreich und vor allem auch nicht so kompliziert zu übersetzen!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Freitag 22. Februar 2008, 20:07

nach langem, sehr langem rumtesten bin ich jetzt auf die Lösung gekommen:

Code: Alles auswählen

import re

text = open("level3.txt").read()
a = re.compile(r"[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]")
result = re.findall(a,text)
print result
a = raw_input()
Zumindest kann ich sagen, dass ich etwas gelernt habe...

Vielen Dank euch allen...
Zuerst hatte ich es so, bis ich dann drauf gekommen bin, dass ja 4 oder mehr Bodyguards auch mit ausgegeben werden...;)

Code: Alles auswählen

import re

text = open("level3.txt").read()
a = re.compile(r".*[A-Z]{3}([a-z])[A-Z]{3}.*")
result = re.findall(a,text)
print result
a = raw_input()
BlackJack

Freitag 22. Februar 2008, 20:22

Deshalb haben sie im Hinweis das Wörtchen "exact" wahrscheinlich komplett gross und fett geschrieben. :-)

Meine Lösung sah fast genauso aus, nur dass ich vorne und hinten statt '[a-z]' jeweils '[^A-Z]' stehen habe.

Wenn Du noch ein bisschen an der Aufgabe basteln möchtest, stell Dir mal vor sie hätten Buchstaben, auf die die Beschreibung passt, an den Anfang und ans Ende gesetzt:

Code: Alles auswählen

ABCaDEFbcGHIdJKL
Das 'a' und das 'd' erfüllen die Bedingung, werden aber nicht von unseren Ausdrücken erkannt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Freitag 22. Februar 2008, 20:48

Were ich mir mal anschauen - versuch ejtz aber erstmal primär alles zu lösen... Level 4 ist auch schon fertig... Das war dann einfach wenn man mit re umgehen kann...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 22. Februar 2008, 21:30

nach langem, sehr langem rumtesten bin ich jetzt auf die Lösung gekommen
Naja, das waren gerade mal ein paar Stunden. Unter "sehr lange rumtesten" verstehe ich etwas anderes.

Auch wenn du es jetzt verstanden hast. Etwas gut lesbares deutschsprachiges dazu findest du z.B. hier:

http://www.galileocomputing.de/openbook ... 64481427d7
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Samstag 23. Februar 2008, 12:33

Das erinnert mich daran, dass ich schon seit Ewigkeiten an Level 27 festhaenge und total ideenlos bin... :roll: Also wenn jemand von euch dort angekommen ist und mir ein wenig auf die Spruenge helfen mag, kann er sich gerne mal mit mir in Verbindung setzen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Samstag 23. Februar 2008, 13:26

lol, das ist noch ein weiter Weg für mich...

Ich hänge gerade an Level 7, its in the air. look at the letters.

Keine Ahnung was damit gemeint ist... Jemand einen kleinen hint?

Merci!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 23. Februar 2008, 13:47

Ich selbst bin auch nicht weit gekommen, aber ich habe vergessen wo ich stehengeblieben bin, also komme ich da jetzt auch nicht weiter, ohne es nochmal zu lösen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten