Seite 2 von 3
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 13:37
von BlackJack
@mcdaniels: Dein Programm gibt auch ``Input:`` und die Eingabe aus? Das ist natürlich falsch.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 13:39
von snafu
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.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 13:40
von 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
>>>
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 13:48
von mcdaniels
@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
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 13:53
von Hyperion
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.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 13:57
von mcdaniels
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?
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:00
von 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.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:01
von BlackJack
@mcdaniels: Wenn die Zahlen nachträglich ausgegeben werden sollten, *dann* müsste man sie puffern. Das sollen sie doch aber gar nicht.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:02
von snafu
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.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:04
von 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.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:05
von Hyperion
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...
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:06
von deets
@Hyperion
Das ist aber sinnvoll um zu belegen, dass nach der 42 keine Ausgabe mehr erfolgt. Wuerde ich als Testcase auch so schreiben.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:09
von mcdaniels
@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
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:10
von snafu
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.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:16
von snafu
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.
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:18
von mcdaniels
Fazit für mich: Wieder was gelernt, leider jedoch euch genervt...
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:19
von Hyperion
mcdaniels hat geschrieben:... leider jedoch euch genervt...
Unsinn! Würde es uns nerven, würden wir hier nicht antworten

Und solange Du etwas dabei lernst, sind wir ja auch "zufrieden"
Ignoranz geht uns da eher auf die Nerven

Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 14:57
von snafu
Code: Alles auswählen
#include <stdio.h>
int main() {
char line[4];
int number;
while (fgets(line, 4, stdin) != NULL) {
number = atoi(line);
if (number == 42) break;
printf("%d\n", number);
}
return 0;
}
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 15:46
von nomnom
Wenn hier schon Lösungen gepostet werden.
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
int main(void) {
char input[4];
while (fgets(input, 4, stdin) && strcmp(input, "42\n"))
fputs(input, stdout);
}
Code: Alles auswählen
from sys import stdin
from itertools import takewhile
print(''.join(takewhile(lambda x: x != '42\n', stdin)), end='')
Re: Keine Ideen um das Gelernte umzusetzen
Verfasst: Donnerstag 12. April 2012, 16:30
von lunar
@nomnom: Alternativ:
Code: Alles auswählen
for line in iter(sys.stdin.readline, '42\n'):
sys.stdout.write(line)