• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SPOJ - nieokreślona liczba zestawów/wejść

VPS Starter Arubacloud
0 głosów
430 wizyt
pytanie zadane 10 listopada 2019 w Python przez xvisox Nowicjusz (140 p.)

W sieci znalazłem pełno odpowiedzi na ten temat, ale dotyczących programowania w C/C++,Javie. Co natomiast zrobić w Pythonie, aby rozwiązać problem z nieokreśloną ilością zestawów danych? Widzialem for line in sys.stdin ale nie mam pojęcia jak tego użyc. Napisalem taki kod:

import sys

for line in sys.stdin:
    y = line
    a, b, c = y.split(" ")
    a = float(a)
    b = float(b)
    c = float(c)
    if a == 0:
        if b == c:
            print('NWR')
        elif b != c:
            print('BR')
    else:
        d = (c - b) / a
        print(round(d, 2))

I gdy sie kliknie enter to zczytuje to jako kolejne wejscie i wywala błąd, nie rozumiem za bardzo jak to powinienem zrobic żeby nie wyrzucalo za kazdym razem błędu 

błąd wykonania (NZEC)
komentarz 10 listopada 2019 przez adrian17 Ekspert (349,240 p.)

I gdy sie kliknie enter to zczytuje to jako kolejne wejscie i wywala błąd

Jaki błąd?

Jakie to zadanie na spoju?

U mnie to wydaje się działać poprawnie; kod też na oko wygląda OK, przynajmniej jeśli chodzi o czytanie wejścia.

komentarz 10 listopada 2019 przez xvisox Nowicjusz (140 p.)

To akurat jest to zadanie https://pl.spoj.com/problems/JROWLIN/

Tutaj akurat nie napisali ze powinna byc nieokreslona liczba wejsc ale z jednym wejsciem tez jest błąd wykonania (NZEC) i gdzies wyczytalem zeby sprobowac zrobic to dla nieokreslonej liczby zestawow danych.

Taki kod w zadaniu https://pl.spoj.com/problems/JSPACE/

import sys
for line in sys.stdin:
    y = line
    tablicaStringow = y.split(" ")
    i = 0
    zdanie = ""
    while i <= len(tablicaStringow) - 1:
        temp1 = tablicaStringow[i]
        temp = tablicaStringow[i]
        temp = temp[0].upper()
        slowo = temp + temp1[1:]
        zdanie = zdanie + slowo
        if i == len(tablicaStringow) - 1:
            print(zdanie)
        i = i + 1

Tez nie przechodzi, bład ten sam.

A gdy klikne enter zeby zakonczyc wejscia to wyskakuje mi 

0.52 1.60 -5.44
-13.54
0.00 2.00 3.00
BR
0.00 2.00 2.00
NWR

Traceback (most recent call last):
  File "C:/Users/Hubert/PycharmProjects/untitled/name.py", line 68, in <module>
    a, b, c = y.split(" ")
ValueError: not enough values to unpack (expected 3, got 1)

komentarz 10 listopada 2019 przez adrian17 Ekspert (349,240 p.)

A gdy klikne enter zeby zakonczyc wejscia

No... bo enter nie kończy wejścia, nie wiem skąd ten pomysł ;) Po prostu przekazałeś pustą linię. Potem jest przekazywana do .split(" "), potem jest próba rozbicia na 3 zmienne, która się wywala.

pętla po sys.stdin czyta tak długo jak jest wejście na standardowym wejściu. Żeby ją zatrzymać, musi się skończyć wejście. Gdy SPOJ odpala program, przekazuje plik na standardowe wejście i gdy program dochodzi do końca pliku, pętla się kończy. Wpisując dane ręcznie w konsoli windowsowej trzeba wysłać informację o "końcu pliku" wciskając bodajże ctrl-Z, enter. Osobiście jednak rekomenduję przekierowywanie wejścia z pliku, nie trzeba co chwilę pisać tych samych danych wejściowych ;)

Aaaaanyway, rozpędziłem się. W Twoim zadaniu JROWLIN nie trzeba robić żadnej filozofii ani nawet pętli, wystarczy pojedynczy input() który da Ci linię z wejściem. Sprawdziłem, działa.

(potem dostaniesz jeszcze błędną odpowiedź, bo chcą liczbę z dokładnością do dwóch miejsc do przecinku, więc np 1.00 a nie 1.0)

komentarz 10 listopada 2019 przez xvisox Nowicjusz (140 p.)

Zmienilem kod na taki: 

y = input()
a, b, c = y.split(" ")
a = float(a)
b = float(b)
c = float(c)
if a == 0:
    if b == c:
        print('NWR')
    elif b != c:
        print('BR')
else:
    d = (c - b) / a
    p = round(d, 2)
    p = str(p)
    signif_digits, fract_digits = p.split('.')
    if len(fract_digits) == 1:
        print(p+"0")
    else:
        print(p)

I blad wykonania(NZEC) nadal. 

Ale dziekuje za ten komentarz, wyjasnilo mi to wiele kwestii :) 

komentarz 10 listopada 2019 przez adrian17 Ekspert (349,240 p.)

Jeszcze to " " ze split() wyrzuć, wystarczy split().

Tymczasem, co się stało na dole, nie chciałem żebyś z ręki implementował formatowanie tekstu, to wszystko jest wbudowane :o

print("{:.2f}".format(d)) # dwie cyfry po przecinku

 

komentarz 10 listopada 2019 przez xvisox Nowicjusz (140 p.)
Zaakceptowalo mi tylko dlatego, że wyrzucilem " " ze splita. Dlaczego? Wiedzialem ze mozna bez tego pisac ale dlaczego przez to wyrzucalo blad NZEC caly czas. Dopiero sie ucze, wiec zrobilem jak umialem :/
komentarz 10 listopada 2019 przez adrian17 Ekspert (349,240 p.)

Wersja bez argumentu wycina wszystkie białe znaki, a nie tylko spację - czyli na przykład

>>> "a b\n".split()
['a' , 'b']
>>> "a b\n".split(" ")
['a' , 'b\n']

Wersja z argumentem ma też inne zachowania gdy są spacje na brzegach albo dodatkowe w środku, na przykład

>>> "a  b ".split() # 2 spacje miedzy a i b, spacja po b
['a' , 'b']
>>> "a  b ".split(" ")
['a' , '', 'b', '']

Jest to zdecydowanie dość nieintuicyjne.

komentarz 10 listopada 2019 przez xvisox Nowicjusz (140 p.)
Aaaa to by wiele zmienialo, dziekuje bardzo jeszcze raz :)

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 4,342 wizyt
pytanie zadane 22 lipca 2015 w C i C++ przez Lucek1906 Nowicjusz (240 p.)
0 głosów
1 odpowiedź 435 wizyt
pytanie zadane 8 września 2015 w Java przez falauthy Stary wyjadacz (11,550 p.)
0 głosów
1 odpowiedź 756 wizyt

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,307 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...