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

Fazit für mich: Wieder was gelernt, leider jedoch euch genervt...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-D
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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;
}
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Wenn hier schon Lösungen gepostet werden. :P

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='')
lunar

@nomnom: Alternativ:

Code: Alles auswählen

for line in iter(sys.stdin.readline, '42\n'):
    sys.stdout.write(line)
problembär

mcdaniels hat geschrieben:Immerwieder erwische ich mich dabei, wie ich von Tk bzw wxPython magisch angezogen werden.
Ich würde so einer Anziehungskraft nachgeben, bzw. nachgehen.
BlackJack

@lunar: Weitere Alternative:

Code: Alles auswählen

sys.stdout.writelines(iter(sys.stdin.readline, '42\n'))
Wobei ich bei meiner Lösung auch nach der 42 noch fleissig weiter gelesen habe, denn wenn in der Beispieleingabe nach der 42 noch eine Zahl kommt, kann man ja auch nicht ausschliessen, dass da noch mehr kommt das vielleicht den Puffer füllt und dann blockiert das Prüfprogramm am Ende wenn mein Programm die Daten nicht mehr abholt.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Halli hallo,
na da gehts ja ordentlich rund :). Unglaublich, wie kurz und bündig man das lösen kann, wenn man weiß, auf welches Modul man zurück greifen kann bzw. Gurustatus hat ;)
@problembär:
Ich würde so einer Anziehungskraft nachgeben, bzw. nachgehen.
Hilft ja nix, wenn ich die Basics noch nicht in und auswendig kann.

LG
Daniel
Zuletzt geändert von mcdaniels am Donnerstag 12. April 2012, 19:22, insgesamt 1-mal geändert.
lunar

@BlackJack: An ".writelines()" hatte ich nicht gedacht :(

Ich glaube nicht, dass das Blockieren des Puffers ein Problem sein sollte. Das Prüfprogramm mag blockieren, läuft aber spätestens dann weiter, wenn Dein Programm sich nach der ersten "42" beendet, und dabei seine Standardeingabe schließt. Der blockierende Aufruf von "write()" gibt dann EPIPE zurück, und ein anständig geschriebenes Programm sollte das eigentlich abfangen. Zudem müsste das Prüfprogramm schon eine ganze Menge Zahlen schreiben, um den Pipe-Puffer zu füllen :)
Antworten