Średnia arytmetyczna ze SPOJ [PP0604A]

0

Cześć. Proszę, zobaczcie na mój kod. SPOJ nie chce go zatwierdzić a ja nie potrafię znaleźć błędu.

Zadanie - PP0604A. W zadaniu chodzi o to, żeby policzyć średnią arytmetyczną z podanych liczb. Jeśli średnia wyjdzie dokładnie w połowie, wypisać należy tę wartość, która znajduje się w tablicy na wcześniejszej pozycji np. w przypadku średniej równej 1,5: dla [1, 2] = 1, dla [2, 1] = 2. Dla wszystkich przypadków z internetu otrzymuję dobre wyniki.

Mój kod:

t = int(input())
for T in range(t):
    tab = [int(k) for k in input().split()]
    wynik = (sum(tab) - tab[0]) / tab[0]
    for t in tab[1: len(tab)]:
        if abs(t - wynik) == 0.5:
            print(t, end="\n")
            break
    else:
        print(round(wynik), end="\n")
1

Wewnętrzny for jest wg mnie bez sensu. Sprawdzasz nie to co powinieneś. Zobacz co twój program wypisuje do inputu

1
3 1 2 99

wypisuje 34, a powinien 2.
Zadanie zrobiłem przez stworzenie listy z różnicami wartości z listy tab oraz średniej. następnie wyszukuje najmniejszą różnicę, jej index w liście. Wypisuję wartość z indeksu z listy tab.

Dodatkowe wskazówki:

  • tab[1: len(tab)] == tab[1:] --> len(tab) jest nadmiarowe, niepotrzebne
  • print(t, end="\n") == print(t) --> domyślną wartością dla parametru end jest właśnie "\n"
2

Przecież to rozwiązanie na trzy linijki :). - oczywiście jeśli zachowujemy czytelność kodu.

data = [int(k) for k in input().split()]
mid_val = sum(data)/len(data)
result = min(data, key=lambda x: abs(x-mid_val))

I powinno działać bez zbędnych pętli etc. :p
Niemniej jednak, polecam ci bardziej stronę codewars.com bo jest dużo lepsza pod względem poleceń i testów.
Niestety na SPOJ są czasem
a - do kitu testy czasem sprzeczne gdy autor się pomyli,
b - polecenia są nieprecyzyjne dla skomplikowanych zadań,
c - polecenia są w języku natywnym (lepiej szlifować angielski jeśli polecenia w obcym języku zrozumiesz dobrze, to natywne nie będą problemem)
d - poziom trudności jest dziwnie wybierany.
e - nawet nie wiem czy idzie po oddaniu własnej solucji komentować innych solucje i spojrzeć jakie praktyki używają inni.

@Edit:
Zmieniłem na kod pythona by podkreślało składnie.

0

mdolata
Nie zrozumiałem polecenia. Zrobiłem podobnie jak napisałeś i SPOJ zatwierdził program :) Dziękuję za wskazówki. Co do print(t, end="\n") to czasami SPOJ wymaga takiego zapisu bo inaczej nie zalicza zadań. Dlatego też na SPOJu zawsze używam takiego zakończenia.

Guaz
Może i na 3 linijki ale ja dopiero uczę się programować. Python to jest mój pierwszy język :) Zadanie SPOJ zaliczył :D Musiałem tylko w drugiej linijce zmienić na mid_val = sum(data[1:])/len(data[1:]) ewentualnie mid_val = sum(data[1:])/data[0] bo pierwsza wartość w linijce to ilość liczb do wczytania. Zobaczę w takim razie na codewars.

1 użytkowników online, w tym zalogowanych: 0, gości: 1