Strona 1 z 1

Python - nie działa przykładowy kod

: 31 lipca 2010, 16:54
autor: robero
Jako że nauka najlepiej idzie przez zadania zarejestrowałem się na Spoj. I tu mam problem z pierwszym zadaniem. Działa bez zarzutu, sędzia odrzuca.
Bez obaw nie mam zamiaru przychodzić tutaj z żadnym innym zadaniem z tego systemu. Po prostu chcę się dowiedzieć jakie tam zasady panują, chcę wiedzieć o co chodzi kiedy nie wiem o co chodzi.
Link do zadania:
https://pl.spoj.pl/problems/POL/
Moje rozwiązanie:

Kod: Zaznacz cały

import linecache
import sys

def wiersze():
    global liczba
    liczba=linecache.getline('file.txt', 1)
    liczba=int(liczba)
    return liczba

def glowna():
    f = open('file.txt').readlines()
    zm=0
    for s in f:
        if zm<liczba+1 and zm>0:
            #s=s[:-1] """usuwa znak końca lini,próbowałem z tym i bez, potrzebne czy nie?"""
            dliczba=len(s)
            sys.stdout.write(s[:dliczba/2]+'\n')
        zm+=1
    return '0'

wiersze()
glowna()
Co jest nie tak?
Próbowałem różnych kombinacji, z linecache i bez, z funkcjami i bez, używając print i bez niego, bez rezultatu.
Nie podaję nazwy zadania żeby google innych zainteresowanych tematem tu nie kierował.
Będę wdzięczny za pomoc.

Dodam że dostaję błąd wykonania nzec.

: 02 sierpnia 2010, 13:02
autor: Unk
Sędzia przekazuje dane do twojego skryptu w taki sposób:

Kod: Zaznacz cały

python twoj_kod.py < dane_wejsciowe.txt
dlatego moim zdaniem do wczytywania danych najlepiej będzie użyć:

Kod: Zaznacz cały

from sys import stdin
DATA = stdin.readlines()
Twój kod prawdopodobnie będzie działał chociaż jest trochę "dziwny" :) . Głównym problemem jest właśnie to, w jaki sposób przekazywane są dane po stronie serwera. Rozwiązanie jakie tam stosują jest zrozumiałe, ponieważ zgłaszający nie ma pojęcia jak się nazywa i gdzie się znajduje plik z danymi na serwerze.

Ja rozwiązałem to zadanie w taki sposób (całe rozwiązanie ma 6 linii kodu :) ). Powodzenia.

: 02 sierpnia 2010, 15:05
autor: robero
Dzięki Unk. Zastosowałem się do Twojej rady, wywaliłem linecache i połowę niepotrzebnego kodu i poszło.

Jedno pytanie na przyszłość. Ciężko o informacje o ten stdin w pythonie, jak go użyć w takim przypadku jaki miałem, który jednak wywaliłem, tzn:

Kod: Zaznacz cały

liczba=linecache.getline('file.txt', 1)
Może się kiedyś przyda.

Drugie pytanie. Czy w Spoj może być użyty print na wyjściu czy musi być sys.stdout*?

: 02 sierpnia 2010, 16:30
autor: Unk
linecache wykorzystujesz aby pobrać i przypisać do zmiennej ilość danych wejściowych, ale jest to w tym przypadku (i z tego co widziałem w większości zadań z poziomu łatwego) zbyteczne. W zadaniach tych liczba danych wejściowych odpowiada liczbie wierszy nie licząc tego pierwszego, w którym ta liczba jest podana. Można więc zrobić tak:

Kod: Zaznacz cały

DATA = stdin.readlines()[1:]
liczba_danych = len(DATA)
Można używać print, ale trzeba wiedzieć, że lepiej wywołać tą funkcje raz ze wszystkimi danymi jakie chcemy drukować niż np tysiąc razy dla każdej danej wejściowej (to samo dotyczy stdout). Warto zainteresować się w tym przypadku listami i metodą .join.