简体   繁体   中英

My program can't write output in a file in the expected format

I'm working through a few coding problems on this website I found. To my understanding, what the website does to check whether my program is outputting the expected results is that it makes me write the output on a new file line by line, and then it compares my file with the file that contains the answers. I'm trying to submit my solution for a problem and keep getting the following error message:

  > Run 1: Execution error: Your program did not produce an answer
        that was judged as correct. The program stopped at 0.025 seconds;
        it used 9360 KB of memory. At character number 7, your answer says
        '<Newline>' while the correct answer says ' '. 

        Here are the respective outputs:
        ----- our output ---------
        mitnik_2923
        Poulsen_557
        Tanner_128
        Stallman_-311
        Ritchie_-1777
        Baran_245
        Spafford_-1997
        Farmer_440
        Venema_391
        Linus_-599
        ---- your output ---------
        mitnik
        _2923Poulsen
        _557Tanner
        _128Stallman
        _-311Ritchie
        _-1777Baran
        _245Spafford
        _-1997Farmer
        _440Venema
        _391Linus
        _-599
        --------------------------

I'm pretty sure my program outputs the expected results, but in the wrong format. Now, I've never written stuff on files using Python before, and therefore don't know what I'm supposed to change to get my output in the proper format. Can someone help me? Here's my code:

fin = open ('gift1.in', 'r')
fout = open ('gift1.out', 'w')
NP,d=int(fin.readline()),dict()
for _ in range(NP):
    d[fin.readline()]=0
for _ in range(NP):
    giver=fin.readline()
    amt,ppl=list(map(int,fin.readline().split()))
    if ppl==0 or amt==0:sub=-amt;give=0
    else:sub=amt-(amt%ppl);give=amt//ppl
    d[giver]-=sub
    for per in range(ppl):
        d[fin.readline()]+=give
for i in d: ##I'm doing the outputting in this for loop..
    ans=str(i)+' '+str(d[i])
    fout.write(ans)
fout.close()
  1. The line returned by find.readline() includes the trailing newline. You should strip that off before using it as the dictionary key. That's why you see a newline after all the names.
  2. fout.write() doesn't add a newline after the string you're writing, you need to add that explicitly. That's why there's no newline between the number and the next name.
with open ('gift1.in', 'r') as fin:
    NP = int(fin.readline())
    d = {fin.readline().strip(): 0 for _ in range(NP)}
    for _ in range(NP):
        giver=fin.readline().strip()
        amt, ppl= map(int,fin.readline().split())
        if ppl==0 or amt==0:
            sub=-amt
            give=0
        else:
            sub=amt-(amt%ppl)
            give=amt//ppl
        d[giver]-=sub
        for per in range(ppl):
            d[fin.readline().strip()]+=give

with open ('gift1.out', 'w') as fout:
    for i in d: ##I'm doing the outputting in this for loop..
        ans= i + " " + str(d[i])+'\n'
        fout.write(ans)

Other points:

  1. Don't cram multiple assignments onto the same line unnecessarily. And no need to put the if and else all on 1 line.
  2. i is a string, there's no need to use str(i)
  3. Use a context manager when opening files.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM