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

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

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

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

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

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

'[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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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

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

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

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

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:

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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
BlackJack

Mir geht's ähnlich. Ich weiss, dass ich damals Notizen gemacht habe, aber auf welchem Rechner oder Backup-Medium die nun abgeblieben sind… :-)

Edit:
@SchneiderWeisse: In dem Bild ist etwas das nach Daten aussieht. Die kann man lesen wenn man herausfindet wie die Informationen zu deuten sind. Die `Python Imaging Library` (PIL) könnte hier nützlich sein.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Ja, PIL hilft!
Und wo wir grad dabei sind, weiß einer was bei Level 12 zu tun ist? Hab zwar ein paar Unterseiten gefunden, aber bin trotzdem nicht weiter gekommen. Ist auch schon wieder etwas her...Irgendwann machts nämlich keinen Spaß mehr. :(
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich hänge gerade an Level 7, its in the air. look at the letters.
Das ist noch nicht Level 7, sondern das Ende von Level 6.
Die "letters" beziehen sich auf den Namen der HTML-Datei, die dir den Text ausgespuckt hat, den du oben zitiert hast - das war ja als "Lösungswort" bei Level 6 herausgekommen. Du musst ein bisschen mit den Buchstaben spielen, dann kommt was raus, was ungefähr so klingt wie das, wonach gesucht ist ...
BlackJack hat geschrieben:In dem Bild ist etwas das nach Daten aussieht. Die kann man lesen wenn man herausfindet wie die Informationen zu deuten sind. Die `Python Imaging Library` (PIL) könnte hier nützlich sein.
Soweit ist er noch nicht. Das Bild sieht er erst, wenn er das Rätsel oben gelöst hat. Dann braucht er die PIL.
BlackJack

Hm tja ist schon lange her. Ich hatte hier halt noch ein Bild auf der Platte liegen und da steht oben links die Levelnummer 7, darum dachte ich das wäre schon gemeint. :-)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ah, das war ja kagge...

In diesen großen Buchstaben vom letzten Ergebnis waren die neuen auch schon wieder drin...

Danke!

Hat jemand eine Ahnung warum das hier in der IDLE funktioniert, aber in der normalen Kommandozeile nicht?

Code: Alles auswählen

import zipfile
import re
stri = ""
zahl = "90052"
zip_datei = zipfile.ZipFile("C:\Data\Pythonchallenge\channel.zip")
datei_anzahl = len(zip_datei.namelist()) - 1 							#minus Readme.txt
print datei_anzahl
for one in range(datei_anzahl):
	code = zip_datei.read("%s.txt" %zahl) 								#Dateiinhalt
	stri += zip_datei.getinfo("%s.txt" %zahl).comment 					#Banner
	a = re.compile(r"([0-9]+)") 										#nächste Datei
	results = re.findall(a,code)										#nächste Datei
	for two in results:
		zahl = two
	print zahl

print stri
ende = raw_input()
//Und über Verbesserungsvorschläge bin ich natürlich froh...^^

@BlackJack und Leonidas: Wenn euch das was hilft, kann ich euch die Lösung von Level 0 bis Level 7 schicken, habe alles mitdokumentiert.
Antworten