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

@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/
BlackJack

@mcdaniels: Dein Programm gibt auch ``Input:`` und die Eingabe aus? Das ist natürlich falsch.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du sollst nicht "Input" und "Output" schreiben... Input ist das, was in *exakt dieser Form* über STDIN reinkommt. Dabei kannst du STDIN wie eine Datei behandeln (ist ja schließlich auch ein Dateiobjekt in Python). Und das was unter Output steht (also ab der Zeile nach dem Doppelpunkt), das ist die erwartete Ausgabe.
deets

Da du's anscheinend wirklich nicht verstehst, hier eine Loesung:

Code: Alles auswählen

while True:
   try:
       v = int(raw_input())
   except ValueError:
       pass
   else:
       if v == 42:
         break
       print v 
Und hier die interaktive Session damit:

Code: Alles auswählen

Python 2.7 (r27:82500, Mar  7 2011, 20:44:27) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Welcome to rlcompleter2 0.98
for nice experiences hit <tab> multiple times
>>> while True:
...    try:
...        v = int(raw_input())
...    except ValueError:
...        pass
...    else:
...        if v == 42:
...          break
...        print v
... 
10
10
20
20
30
30
50
50
oeusath
42
>>> 
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

@deets: Danke für das Beispiel. Also ich hab das so verstanden, dass solange Zahlen per Input entgegen genommen werden sollen bis 42 eingegeben wird. Bei 42 wird die Eingabe angehalten und es werden alle eingegebenen Zahlen ausgegeben.

@snafu: Sprichst du eventuell von sys.stdin oder meinst du damit die einfache eingabe input() über die Konsole?

LG und Danke!

Daniel
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du kannst Zahlen natürlich auch erst einmal "puffern", z.B. in einer Liste, wie Du es getan hast. Das kann bei sehr großen Eingaben aber problematisch werden... insofern sehe ich da nicht den Nutzen.
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

Es scheint auch, da dies ja maschinell bewertet wird, keinen wirklichen Spielraum zu geben, vermute ich zumindest. Vielleicht interpretiere ich die Aufgabe ja noch immer falsch. Die Eingaben müssen - meinem Verständnis nach - irgendwo zwischengepuffert werden, wenn sie erst nachträglich ausgegeben werden sollen, oder?
deets

Meine Guete. Langsam wird's zum verzweifeln.

Wo steht etwas von puffern?!? Nirgendwo. Aber es ist sehr gut moeglich, dass die automatische Testroutine prueft, ob nach eingabe EINER Zahl auch diese sofort rauskommt. Also ist puffern - da nicht gefragt - auch zu unterlassen, und damit ist mit einem mal auch das Problem geloest.
BlackJack

@mcdaniels: Wenn die Zahlen nachträglich ausgegeben werden sollten, *dann* müsste man sie puffern. Das sollen sie doch aber gar nicht.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ja, aber sie sollen ja gar nicht nachträglich ausgegeben werden. Es ist egal. Hauptsache nach Beendigung des Programms steht die gewünschte Ausgabe auf dem Bildschirm. Ich glaube, du gehst immer noch davon aus, dass zwischendrin eine Art Eingabezeile für die nächste Zahl steht. Dies ist aber nicht der Fall. Es kann "still" von `sys.stdin` gelesen werden und (nach meinem Verständnis) zu einem beliebigen Zeitpunkt eine (Teil-)Ausgabe gemacht werden. Es empfiehlt sich daher, die Zahl schon auszugeben, sobald nach dem Test in der Schleife klar ist, dass eine Ausgabe der Zahl erlaubt bzw gefordert ist.
Zuletzt geändert von snafu am Donnerstag 12. April 2012, 14:05, insgesamt 1-mal geändert.
deets

@mcdaniels

Nachtrag: auch "nachtraegliche Ausgabe" steht da nirgends. Eingabe ist Zahl != 42: dann ausgabe. Nach Eingabe von 42 nix mehr machen. Das ist deine Aufgabe.

Man koennte hoechstens noch darueber streiten, ob das Programm danach sich beenden darf, oder weiter Eingaben entgegennimmt, bis zum Sankt Nimmerleins Tag. Aber da das ziemlich sinnlos waere, habe ich das auch nicht so implementiert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die maschinelle Bewertung eines "Puffers" dürfte eher schwierig sein... da wird sicherlich einfach die Ausgabe analysiert. Daher darf da ja auch nichts anderes ausgegeben werden, als die gewünschten Zahlen. Ich kann aus der Aufgabe auch nicht herauslesen, dass man irgend etwas puffern müsste... zugegeben finde ich das Beispiel auch ein wenig irreführend, dass bei Input nach der 42 noch eine Zahl auftaucht...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

@Hyperion

Das ist aber sinnvoll um zu belegen, dass nach der 42 keine Ausgabe mehr erfolgt. Wuerde ich als Testcase auch so schreiben.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

@deets
Also ist puffern - da nicht gefragt - auch zu unterlassen
Ok, dann ists ne klare Fehlinterpretation von mir. Das "Example", welches hier auf SPOJ gezeigt wird, halte ich dann jedoch auch für irreführend.

Btw. verzweifeln soll wegen mir hier niemand. Ich überlege manchmal wirklich, ob ich es wieder sein lassen sollte, da ich mich oft extrem doof anstelle...

@snafu:
Ich wäre allerdings nicht im Traum darauf gekommen von sys.stdin einzulesen und ja ich hab da bei meiner Lösung ein input() im "Spiel".


Vielen Dank
LG
Daniel
Zuletzt geändert von mcdaniels am Donnerstag 12. April 2012, 14:10, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich poste jetzt einfach meine Lösung, da die von deets ja auch schon reingestellt wurde:

Code: Alles auswählen

import sys

for line in sys.stdin:
    number = int(line)
    if number == 42:
        break
    print number
Das war's. Gesonderte Prüfungen sind nicht nötig, da die Aufgabenstellung gültige Eingaben garantiert.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

mcdaniels hat geschrieben:Ich wäre allerdings nicht im Traum darauf gekommen von sys.stdin einzulesen und ja ich hab da bei meiner Lösung ein input() im "Spiel".
Der Satzteil "rewrite small numbers from input to output" ist IMHO schon relativ deutlich ausgedrückt worden. Auch im Hinblick auf Brute Forcing als Kontext macht es Sinn, eher etwas dateiartiges zu haben als spielemäßig Zahlen abzufragen.
Antworten