Jak pisać programy w Pythonie na SPOJ, aby system to uznał?

0

Napisałem już kilka programów z zadań na SPOJ, ale ichniejszy interpreter sobie z tym nie radzi za każdym razem twierdząc, że odpowiedź jest nie poprawna. Programy działają dokładnie tak jak zażyczył sobie tego twórca. Może jest jakiś konkretny przepis lub schemat jak mam pisać takie programy?

4

Brzytwa Ockhama

Podaj przykład, bo na 99% robisz coś źle, szczególnie jeśli nie dostajesz runtime error/TLE tylko bad answer.

0

Masz jeden działający, znajdź czym się różni od twego kodu
https://pl.spoj.com/problems/FCTRL3/

R=[
   "0 1\n",
   "0 1\n",
   "0 2\n",
   "0 6\n",
   "2 4\n",
   "2 0\n",
   "2 0\n",
   "4 0\n",
   "2 0\n",
   "8 0\n",
   "0 0\n"
  ];

T=int(input())
while T:
    T-=1
    n=int(input())
    print(R[min(n,10)])
0
from math import sqrt


def mean_number(a, b):
    how_many = 0
    proper_divisor_counter = 0
    proper_divisor_sum = 0
    for c in range(a, b+1):
        for i in range(2, c):
            if c % i == 0:
                proper_divisor_counter += 1
                proper_divisor_sum += i
        try:
            proper_divisor_avg = proper_divisor_sum/proper_divisor_counter
        except ZeroDivisionError:
            pass
        else:
            sqrt_c = sqrt(c)
            if proper_divisor_avg <= sqrt_c:
                how_many += 1
            proper_divisor_sum = 0
            proper_divisor_counter = 0
    return how_many


while True:
    t = int(input())  # number of tries
    if t <= 10000:
        break

for i in range(t+1):
    while True:
        a = int(input())
        b = int(input())
        if b < a:
            continue
        else:
            print(mean_number(a, b))


Np. to zadanie https://pl.spoj.com/problems/PZPI3/. Może nie potrzebnie używam funkcji, albo zbytnio komplikuje?

1

Nie wczytując się w treść funkcji mean_number:

  1. Niepotrzebnie sprawdzasz, czy t<=10000 - jeśli w treści zadania jest zapisane, że jest, to jest :) Tak samo z b < a (zgodnie z treścią zadania taki warunek nigdy nie zostanie spełniony) - to nie jest błąd, ale po co to pisać, skoro nie jest potrzebne?
  2. W pętli for wykonujesz o jedną iterację za dużo - niepotrzebnie dodajesz jedynkę do t
  3. Zupełnie nie wiem, po co Ci jeszcze while w głównej pętli
  4. Niewłaściwie pobierasz a, b - one przychodzą jednym inputem jako string (oddzielone spacją) i musisz je sobie rozdzielić.

Czyli zamiast:

while True:
    t = int(input())  # number of tries
    if t <= 10000:
        break

for i in range(t+1):
    while True:
        a = int(input())
        b = int(input())
        if b < a:
            continue
        else:
            print(mean_number(a, b))

Wystarczy:

for i in range(int(input())):
    a,b = [int(x) for x in input().split()]
    print(mean_number(a, b))

Teraz możesz przejść do swojej funkcji zliczającej liczby znaczące.
Proponuję Ci potestować swoje rozwiązania, zanim je wyślesz na SPOJ, np. tu: https://ideone.com/
Wklejasz tam swój kod, w zakładce stdin wklejasz przykładowe wejście z zadania i uruchamiasz - jeśli na wyjściu nie otrzymasz tego, co zapisano w zadaniu dla przykładowych danych, to ewidentnie masz coś źle.

0
Fac napisał(a):

Nie wczytując się w treść funkcji mean_number:

  1. Niepotrzebnie sprawdzasz, czy t<=10000 - jeśli w treści zadania jest zapisane, że jest, to jest :) Tak samo z b < a (zgodnie z treścią zadania taki warunek nigdy nie zostanie spełniony) - to nie jest błąd, ale po co to pisać, skoro nie jest potrzebne?
  2. W pętli for wykonujesz o jedną iterację za dużo - niepotrzebnie dodajesz jedynkę do t
  3. Zupełnie nie wiem, po co Ci jeszcze while w głównej pętli
  4. Niewłaściwie pobierasz a, b - one przychodzą jednym inputem jako string (oddzielone spacją) i musisz je sobie rozdzielić.

Czyli zamiast:

while True:
    t = int(input())  # number of tries
    if t <= 10000:
        break

for i in range(t+1):
    while True:
        a = int(input())
        b = int(input())
        if b < a:
            continue
        else:
            print(mean_number(a, b))

Wystarczy:

t = int(input())  # number of tries
for i in range(t):
    a,b = [int(x) for x in input().split()]
    print(mean_number(a, b))

Teraz możesz przejść do swojej funkcji zliczającej liczby znaczące.
Proponuję Ci potestować swoje rozwiązania, zanim je wyślesz na SPOJ, np. tu: https://ideone.com/
Wklejasz tam swój kod, w zakładce stdin wklejasz przykładowe wejście z zadania i uruchamiasz - jeśli na wyjściu nie otrzymasz tego, co zapisano w zadaniu dla przykładowych danych, to ewidentnie masz coś źle.

  1. Prawda, wcześniej po prostu jako dolną granicę dałem 1 i tak zostało.
  2. Z założenia na początku miałem zrobić po prostu while t i w pętli odejmować po prostu t-1.

W każdym razie dzięki za rozjaśnienie, nie wiedziałem ze trzeba traktować te zadania aż tak maksymalnie dosłownie.

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