Średnia arytmetyczna ze SPOJ [PP0604A]

Średnia arytmetyczna ze SPOJ [PP0604A]
M1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:12
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:

Kopiuj
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")
MD
  • Rejestracja:około 8 lat
  • Ostatnio:23 dni
  • Lokalizacja:Wrocław
  • Postów:45
1

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

Kopiuj
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"
Guaz
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Częstochowa
  • Postów:221
2

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

Kopiuj
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.


Linux Mint
Arduino / Python 3.5.2
edytowany 3x, ostatnio: Guaz
Zobacz pozostałe 4 komentarze
TU
Podpunkt "e" dla mnie bardzo ważny. Zamiast codewars.com używam leetcode. Możesz opisać co jest ciekawego w codewars?
Guaz
codewars ma wiele różnych rzeczy, ale ja wykorzystuje jedynie ćwiczenia. Ogólnie losuje ci problem o danej skali trudności dostosowanej do tego co już rozwiązałeś. Gdy go rozwiążesz, możesz ocenić czy jesteś usatysfakcjonowany zadaniem, i masz listę solucji innych gdzie możesz oceniać co jest dla ciebie dobrą praktyką, co jest nieczytelne i wg. tego się wyświetlają rozwiązania. Ogólnie masz podgląd do tego jak działają testy, możesz pisać własne jeśli chcesz. Przydatny skrót to Ctrl +S uruchamiający test pobieżny.
Guaz
Zależnie od typu zadania, musisz napisać zoptymalizowany algorytm, wymyślić coś co odpowiednio rozwiąże jakieś problematyczne zagadnienia z danym typem input'u. Ogólnie gama zadań jest szeroka, na początkowych poziomach są to proste zagadnienia w postaci funkcji, ale później mogą z tego wychodzić ciężkie algorytmiczne programy :P. No i możesz to ćwiczyć w wybranym języku, nie koniecznie tylko w pythonie.
enedil
@Guaz: no Spoj akurat też nie wybrzydza w językach, zresztą można przełączyć się na angielski.
Guaz
@enedil: Przyznaje - nie udało mi się tego ogarnąć :). Co nie zmienia faktu że jeszcze na żadnym forum się nie spotkałem z dobrze działającymi testami wg. tego jak zostało sprecyzowane zadanie ;p. Może dlatego że tylko z takimi się ludzie odzywają, ale to o czymś świadczy na temat weryfikacji zadań w portalu.
M1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:12
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.

Guaz
Cóż, mogę tylko powiedzieć że to niedoprecyzowanie co dostajemy w input'cie, w poleceniu ;d. W takim wypadku to drugie rozwiązanie jest dużo lepsze. Bo nie liczymy długości tablicy skoro mamy ją podaną :D. Anyway, jeśli kod zrozumiały, to dobrze ci idzie ^^ - używasz generatorów i (wnioskuje że) rozumiesz key z trzeciej linii.
M1
Tak. Rozumiem wszystko :) Dziękuję :D

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.