Nice "bug" to loose a contest
aspineux
aspineux at gmail.com
Sun Apr 8 07:40:38 EDT 2007
This code works like the python one,
I dont use buffered stdio f... functions,
but the more 'system call' read and write
int main()
{
char buf[120];
int len;
while (len=read(1, buf, sizeof(buf))) {
write(1, buf, len);
}
return 0;
}
I dont understand what is appening,
but you have to know their is a link between
stdin and stdout in 'terminal mode', when you make a read on stdin,
stdout is automatically flushed, this link disappears when onr is not
liked to a terminal.
This is to facilitate user input, to avoid to put a flush after each
write,
in fact before any user input.
Hope someone else will give the trick
On 8 avr, 12:52, "stdazi" <std... at gmail.com> wrote:
> Hello,
>
> Yesterday, I was at a programming competition. We programmed on Linux
> liveCD's and Python was one of the allowed languages (among C and
> Java). I cared just about the algorithmic approach so I used Python.
> One of the main rules is, that the code reads its standard input and
> dumps the result on the standard output. Here happened my bigger
> programming mistake ever - I used the following approach :
>
> ====
> import sys
> print sys.stdout.readlines() # TYPO ! stdin != stdout
> ====
>
> So the WEIRD issue is, that it worked and, executing the following
> code I get :
>
> ====
> azi at magicb0x ~ $ python la.py
> test
> test #2
> ['test \n', 'test #2\n']
> azi at magicb0x ~ $
> ====
>
> Ok, as the algorithm worked perfectly, and all the test cases we were
> given were positive, I've continued with the next problem, copy/
> pasting the above idiom... When they tested the code, they used file
> redirection like :
>
> ==
> python la.py < /somefile
> ==
>
> And, my code resulted in no output/input (=> 0 points), which can be
> proved here too :
>
> ====
> azi at magicb0x ~ $ python la.py < /etc/passwd
>
> ===
>
> Some friend of mine told me that's the Unix way, (stdout can act like
> stdin) so I tried some C code :
>
> ===
> 1 #include <stdio.h>
> 2
> 3 int main() {
> 4 char buf[120];
> 5 while (fgets(buf, sizeof(buf), stdout) != NULL) {
> 6 puts(buf);
> 7 }
> 8 return 0;
> 9}
> ===
>
> The code returns with no delay, so I'm really wondering where is that
> nice sys.{stdin,stdout} feature inplemented as pydoc doesn't mention
> anything. I'd spot the mistake before submitting the problem solutions
> if it was written in C :)
>
> Thanks!
More information about the Python-list
mailing list