Python sul portale allenamento

Ho visto che da qualche tempo la piattaforma prevede anche l’uso di Python, che fra l’altro è utilizzato nelle gare delle OIS per il biennio.
Ho notato però che quando tento di inviare una soluzione in Python ad un problema dà sempre 0 punti perché “Execution failed because the return code was nonzero”.
Ho provato anche ad inviare una soluzione ufficiale (p.es. quella del problema dessert delle OIS11) ma succede la stessa cosa…

Il supporto a Python è ancora un po’ sperimentale e i messaggi d’errore non sembrano molto informativi :thinking:

Comunque è successo anche a me e sospetto che (almeno nel mio caso) fosse perché stavo cercando di leggere da tastiera, invece che da file.

Ho pensato anche io che non funzionano i vecchi problemi in cui si aspetta l’input da file, per questo ho provato una soluzione ufficiale di un problema delle ultime OIS in cui è previsto l’input da tastiera…
Vorrei fare esercitare i miei alunni per le gare del biennio alle imminenti OIS… ma credo che non funzioni proprio

Funziona mettendo queste due righe in cima?

import sys
sys.stdout = open('output.txt', 'w')

No, reindirizzando l’output (e anche l’input) non funziona comunque.
Avevo anche provato a leggere e scrivere da file ma niente…

Ho provato sul problema dessert, questo programma prende corretto il primo testcase (che ha output 2)

with open("output.txt", "w") as f:
    f.write("2")

ok, funziona, grazie!
avevo fatto la stessa prova (ovvero leggere e scrivere da file senza reindirizzamento) e mi dava sempre lo strano errore del primo messaggio… il motivo era che a write() passavo un numero
f.write(2)
e non una stringa
f.write(“2”)
in effetti write accetta solo stringhe…

1 Mi Piace

Ottimo :slight_smile:

Anche questa versione sembra funzionare:

import sys
sys.stdout = open('output.txt', 'w')

print(2)

ok, anche il reindirizzamento dell’output è ok (a me non funzionava perché ho provato a reindirizzare anche l’input).
Se provo a reindirizzare l’input in questo modo:

import sys 
sys.stdout = open("output.txt", "w")
sys.stdin = open("input.txt", "r")
N = input()  

dà di nuovo errore in fase di esecuzione.
(il file di input dovrebbe avere nella prima riga 2 numeri, prima di questo ho provato a fare lo strip() e lo split() dell’input per assegnarli a due variabili diverse e non funzionava; ho ridotto a questo, più semplice, che dovrebbe leggere in N tutti i dati della riga…)

Strano, a me sembra funzionare… Questo programma prende i primi due testcase:

import sys 
sys.stdout = open("output.txt", "w")
sys.stdin = open("input.txt", "r")

N = int(input())

if N == 2:
    print(2)
else:
    print(1)

Comunque è molto strano che non funzioni senza la redirezione sui file, quando in C/C++ funzionerebbe

nel problema Dessert il tuo esempio funziona anche a me… ma è molto “sensibile”, basta aggiungere uno strip() per togliere eventuali spazi ai lati dell’input e non funziona più!
(nella soluzione ufficiale viene eseguito lo strip di tutti gli input)

import sys
sys.stdout = open("output.txt", "w")
sys.stdin = open("input.txt", "r")
N = int(input().strip())
print(2)

Il mio post di prima (in cui basta fare input() per ottenere errore) l’ho provato con Talmart che ha nella prima riga del file di input due interi…

Ottengo lo stesso errore su Flood Forecasting.
Codice:

import sys
sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")

N, M = map(int, input().strip().split())
adj = [[] for i in range(0, N)]
for i in range(0, M):
    a, b, w = map(int, input().strip().split())
    adj[a].append([b, w])
    adj[b].append([a, w])

s, e, ans = 0, 10**5 + 1, -1
while s <= e:
    visited = [False for i in range(0, N)]
    q = []
    q.append(0)
    visited[0] = True
    mid = s + (e - s) // 2
    while len(q) > 0:
        node = q[-1]
        q.pop()
        for [next, w] in adj[node]:
            if mid <= w and not visited[next]:
                visited[next] = True
                q.append(next)

    ok = True
    for i in visited:
        ok = ok and i
    if ok:
        s = mid + 1
        ans = mid
    else:
        e = mid - 1
assert(ans != -1)
print(ans)

I casi d’esempio in locale funzionano.

In effetti pare che il nostro compilatore per qualche motivo permetta di fare .strip() ma non su una stringa ottenuta come risultato di input() :thinking:

Ad esempio questo funziona:

import sys 
sys.stdout = open("output.txt", "w")
sys.stdin = open("input.txt", "r")

N = "ciao"
N = N.strip()

print(2)

Mentre cambiando “ciao” in input() non funziona più.

Il mistero si infittisce… @edomora97

Pare che il mistero sia stato risolto: semplicemente, il portale usava erroneamente Python 2 invece di Python 3.

Ho corretto il problema lato server, fatemi sapere se ci sono ancora problemi :smile: