7 / 7
Jun 2017

Przekopałem pół Internetu i cały czas nie wiem o co chodzi. Program działa, zwraca prawidłowe odpowiedzi, a mimo to SPOJ nie zalicza zadania ("Błędna odpowiedź"). Walczę już z tym któryś dzień i naprawdę nie wiem co jeszcze mogę poprawić - może ktoś zerknie w ten kod?

kod: http://ideone.com/641zfd15

  • created

    Jun '17
  • last reply

    Jun '17
  • 6

    replies

  • 1.0k

    views

  • 3

    users

  • 6

    links

Rzeczywiście, bez sensu w ten sposób wstawiłem. Wymienione na kod z ideone, dzięki.

Nie rozumiem w takim razie, dlaczego ideone ucina mi jedną próbę. Kiedy testuję sam ten program, wszystko gra i przykładowe wejścia wykonują się odpowiednią liczbę razy.

Wobec tego stanu rzeczy kazałem pętli wykonywać się ile+1 razy - kod działa3, jednak po ostatniej serii znaków na wejściu należy dorzucić enter (w przeciwnym wypadku wywala błąd kompilacji).
Po wklejeniu kodu na SPOJ dostaję jednak "błąd wykonania (SIGSEGV)".

I stąd mój domysł, że być może sędzia SPOJa nie dodaje entera po ostatnim ciągu znaków. Nie mam pojęcia natomiast dlaczego pętla musi się wykonywać ile+1 razy na ideone, a przy użycia Code::Blocksa pętla powtarza się odpowiednią liczbę razy bez tej inkrementacji.

No niestety nie zadziałało po dodaniu do pętli warunku w pętli do..while. Wrzuciłem więc tego EOFa do środka, ale nadal nie wczytuje ostatniej linii jeśli nie da się entera :confused:
kod z EOF3

I po co? Wystarczyło skorzystać z wyszukiwarki, tu na forum [lupka w górnym prawym rogu], a potem poczytać, http://discuss.spoj.com/search?q=flamaster a przekopywanie pół internetu [nawet w przenośni] to już lekka przesada.

PS
Korzystamy z EOF gdy nie jest określona ilość [liczba] danych, a czy tu nie jest?

PS 2
Twoje pierwsze czytanie, wczytuje '\n' bezpośrednio za liczbą 4 w pierwszej linii przykładu z zadania, dlatego musisz czytać o jedną linię więcej.
W ostatniej linii, zamiast '\n', może być od razu znak EOF i dlatego twój program się może wysypać.

PS 3
Twój pierwotny kod, zmienione i<ile na i <= ile i zmieniony "lekko" test - dodany na końcu enter: http://ideone.com/Dazn332

PS 4
Dalej nie czytaj, jeżeli chcesz rozwiązać problem samodzielnie.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
V


Zamień wszędzie, gdzie korzystasz [dwa miejsca] z != '\n' na > '\n' [EOF = -1, '\n' = 10] lub nawet na > ' ' [między apostrofami jest 1 spacja]. Podobnie proponował @redysz.

Co do PS 2 to użyłem czyszczenia bufora w pętli for, dlatego uznałem, że program nie będzie czytał tamtego entera z cin>>ile. Trochę mnie więc to dziwi, że jednak tamten enter przeszkadzał, szczególnie, że przy kompilacji w Code::Blocks wszystko działało należytą ilość razy.
Myślałem jeszcze trochę zanim zajrzałem do Twojej podpowiedzi, ale wciąż nie zaliczało moich odpowiedzi/błąd wykonania. Ostatecznie skorzystałem z niej i wszystko ładnie hula, zadanie zaliczone.
Teraz rzeczywiście kod został zabezpieczony w elegancki sposób przed zgubieniem końca wczytywanej linii.
Wielkie dzięki @redysz i przede wszystkim @narbej!