Keine Ideen um das Gelernte umzusetzen

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.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo liebe Python Community!

Leider ist es wieder soweit. Ich habe nach einiger Zeit immer Probleme mir selbst Pythonaufgaben zu stellen, um das Gelernte zu festigen bzw. etwas sicherer in der Programmierung zu werden. Mir fällt einfach nichts ein, was ich nun sinnvolles damit umsetzen könnte. Immerwieder erwische ich mich dabei, wie ich von Tk bzw wxPython magisch angezogen werden. Hilft aber alles nix, denn zuerst sollte man sich ja mit den Basics auseinander setzen. Obwohl ein schickes Netzwerk/PC Inventarisierungstool wäre schon nicht schlecht :mrgreen:

In Zusammenhang mit der Ideenarmut driftet dann natürlich wieder das Interesse ab, was ich gar nicht gut finde.

Welche Aufgaben habt ihr euch Anfangs gestellt? Wo kamen da die Ideen her?

LG
Daniel
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Wo kamen da die Ideen her?
Das erste, was ich "richtig" programmiert habe, war eine Darstellung von Zahlen als grafisches Ergebnis. Habe ich als Webanwendung umgesetzt - und mir damit die Arbeit auf der Arbeit erleichtert (und anderen auch).

War vom Prinzip ganz einfach: Daten aus DB lesen, Graph zeichnen lassen (damals noch mit Google Charts, heute macht das ReportLab) und dann ausliefern.

Gruß, noisefloor
BlackJack

Für kleinere Aufgaben, nur um sich mit dem Programmieren zu beschäftigen finde ich das Project Euler oder den Sphere Online Judge (SPOJ) ganz interessant. Ersteres ist sehr mathematiklastig, oder zumindest „reiner“ als letzteres, denn schliesslich kommt man bei ganz vielen interessanten Themen mit Mathematik in Kontakt. Bei SPOJ kommen die Aufgaben oft in kleine Geschichten verpackt daher, die erahnen lassen wo die Kenntnisse, die man damit oder dafür erwirbt, real angewendet werden könnten.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
vielen Dank für eure Anregungen. Ich habe nun etwas Interessantes zum Thema WMI gefunden:http://timgolden.me.uk/python/wmi/tutorial.html
Hiermit dürfte man in Verbindung mit dem http://msdn.microsoft.com/en-us/library ... 85%29.aspx einiges anstellen können.

Das ginge dann nämlich eventuell in die Richtung Python+WMI+MySql. (Inventarisierungstool)

Fragt sich nur, ob das nicht wieder eine Spur zu groß für mich ist ;-).

LG
Daniel
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Fragt sich nur, ob das nicht wieder eine Spur zu groß für mich ist
Sagen wir mal so: Wenn es funktioniert, ist es für den ersten Schuss IMHO ok. Wenn erstes Programm hat genau das gemacht was ich wollte, der Code an sich war aber aus heutiger Sicht ein wenig gruslig.
Aber solange man das Ding nicht publiziert bzw. intern nutzt finde ich das nicht weiter schlimm. Da hat man dann wenigsten ein Motivation, bei Zeiten einen Re-Write anzufangen. :-)

Gruß, noisefloor
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo,
muss mal den uralten Thread ausgraben, denn ich habe versucht bei SPOJ eine einfache Problemstellung zu lösen.

Aufgabe
Your program is to use the brute-force approach in order to find the Answer to Life, the Universe, and Everything. More precisely... rewrite small numbers from input to output. Stop processing input after reading in the number 42. All numbers at input are integers of one or two digits.

Meine Lösung

Code: Alles auswählen

numbers = []
while True:
     single_numbers = int(input('Give numbers: '))
     if single_numbers != 42:
         numbers.append(single_numbers)
     
     elif single_numbers == 42:
         print('Output:')
         for elements in numbers:
             print(elements)
         break
Obwohl es meiner Meinung nach so läuft wie es soll, wird es als WRONG Answer bewertet. Ich frage mich nun, inwieweit man herausfinden kann, was SPOJ hier genau bemängelt... vielleicht habe ich ja auch die Aufgabenstellung missverstanden.

LG
Daniel
deets

Also zum einen faellt hier auf, dass du eine voellig unnoetigen zweiten Test im elif hast- ein simples else reicht, denn das wird ja genau dann ausgefuehrt, wenn das if *nicht* wahr gewesen ist.

Und zum zweiten denke ich machst du etwas unnoetiges, und damit auch potentiell falsches: du gibst die Zahlen nicht direkt einfach wieder aus, sondern stattdessen speicherst du die zwischen. Wo steht, dass das passieren soll?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Außerdem werden bei dir in jedem Durchlauf alle bisherigen Zahlen ausgegeben. Dies war ja so nicht gefordert.

Zudem würde ich mich an deiner Stelle streng an das halten, was in der Aufgabenstellung als erwarteter Output steht, d.h. keine Zusatztexte ausgeben oder ähnliches.

Ich hab das Problem im ersten Anlauf ohne großes Überlegen gelöst, indem ich einfach zeilenweise von STDIN in einer Endlosschleife lese und bei 42 abbreche. Alle anderen Zahlen werden in "ihrem" Schleifendurchlauf jeweils stumpf auf den Bildschirm geschrieben - fertig.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Servus!
ich habe in der Angabe etwas unterschlagen. Hier ist unten ein Beispiel, wie es offenbar aussehen soll:

Input:
1
2
88
42
99

Output:
1
2
88

Deshalb mein Ansatz mit dem Zwischenspeichern in die Liste.

LG
Daniel
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es soll nicht *offenbar* so aussehen, es soll *exakt* so aussehen. Das ist ein ganz wichtiger Punkt. In aller Regel werden solche Aufgabenstellungen maschinell ausgewertet. Das sitzt kein menschlicher Prüfer hinter, der dein Programm abruft, die Zahlen händisch als Antwort auf deine Abfragen einträgt und am Ende ein grünes Häkchen setzt. ;)
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Das sitzt kein menschlicher Prüfer hinter, der dein Programm abruft, die Zahlen händisch als Antwort auf deine Abfragen einträgt und am Ende ein grünes Häkchen setzt.
Das war mir schon klar :D

@Snafu: Hast du es auch hochgeladen und wurde es akzeptiert?

Nun hab ich es mal so versucht:

Code: Alles auswählen

numbers = []
print('Input:')
while True:
     single_numbers = int(input())
     if single_numbers != 42:
         numbers.append(single_numbers)
     
     else:
         print('Output:')
         for elements in numbers:
             print(elements)
         break
Macht ja an sich genau das, was lt Beispiel gefordert ist.
Zuletzt geändert von mcdaniels am Donnerstag 12. April 2012, 13:03, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mcdaniels hat geschrieben: Deshalb mein Ansatz mit dem Zwischenspeichern in die Liste.
Da kapiere ich immer noch nicht den kausalen Zusammenhang; snafu wies Dich ja schon darauf hin, dass man die Zahlen einfach direkt ausgeben kann, wenn sie nicht 42 sind...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

Ich bezweifele doch sehr stark, dass da eine solch formatierte Ausgabe gewuenscht ist. Sondern einfach nur eingelesen, und die Zahlen ausgegeben werden. Ich meine, dein Terminal kennt doch auch keinen Fett-Druck und so, oder?
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

@hyperion: Ich muss das was snafu vorgeschlagen hat erst verinnerlichen. @snafu: Bitte die Lösung nicht posten! :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vielleicht noch mal als Tipp, weil Du - vermutlich - noch einen Denkfehler machst bzgl. Deines In- und Outputs:

Code: Alles auswählen

Input:
1
2
88
42

Code: Alles auswählen

Output:
1
2
88
Vergleiche das mal mit Deinem Beispiel - und ich meine nicht den Fettdruck ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

@hyperion: Hm, bekomme exakt diese (deine) Ausgabe.
deets

Bitte kopiere die Ausgabe und poste sie hier - in code-tags, natuerlich.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Input:
1
2
88
42
Output:
1
2
88
Zuletzt geändert von mcdaniels am Donnerstag 12. April 2012, 13:30, insgesamt 2-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mcdaniels hat geschrieben:@hyperion: Hm, bekomme exakt diese (deine) Ausgabe.
In Deinem Beispiel stand die "99" am Schluss der Eingabe. Das sollte - so weit ich das verstanden habe - gar nicht möglich sein.

Unabhängig davon benötigt man einfach keine Liste - ich kann ehrlich gesagt gar nicht verstehen, was daran so kompliziert zu verstehen ist. Das Verwenden einer Liste ist doch viel "schwieriger"...

Edit: Aha... also war das Beispiel vorhin nicht korrekt!?!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

So, nachdem ich mit meinen Edits sonst Chaos verursache, fasse ich nochmal zusammen ;)

Mein "Programm" kreiert folgende Ausgabe:

Code: Alles auswählen

Input:
1
2
88
42
Output:
1
2
88
Das Beispiel in dem beim Input die 99 nach 42 auch noch eingegeben werden kann, stammt von der Aufgabenstellung http://www.spoj.pl/problems/TEST/
Antworten