Task

Write a program that solves the odd word problem with the restrictions given below.



Description

You are promised an input stream consisting of English letters and punctuations.

It is guaranteed that:

 the words (sequence of consecutive letters) are delimited by one and only one punctuation,
 the stream will begin with a word,
 the words will be at least one letter long,   and 
 a full stop (a period, [.]) appears after, and only after, the last word.


Example

A stream with six words:

 what,is,the;meaning,of:life. 


The task is to reverse the letters in every other word while leaving punctuations intact, producing:

 what,si,the;gninaem,of:efil. 
while observing the following restrictions:

 Only I/O allowed is reading or writing one character at a time, which means: no reading in a string, no peeking ahead, no pushing characters back into the stream, and no storing characters in a global variable for later use;
 You are not to explicitly save characters in a collection data structure, such as arrays, strings, hash tables, etc, for later reversal;
 You are allowed to use recursions, closures, continuations, threads, co-routines, etc., even if their use implies the storage of multiple characters.


Test cases

Work on both the   "life"   example given above, and also the text:

 we,are;not,in,kansas;any,more.


open "oddWord.txt" for input as #f               ' read input stream
while not(eof(#f))
line input #f, a$
oddW$  = ""                                      ' begin the result oddW with blank
px     = 0                                       ' begin word search location with 0
count  = 0                                       ' begin the word count to 0
while x < len(a$)                                ' look at each character 
	x    = instr(a$,",",px)                  ' search for comma (,)
	if x = 0 then x = len(a$)                ' no more commas?
	x1   = instr(a$,";",px)                  ' search for (;)
	x2   = instr(a$,":",px)                  ' search for (:)
	if x1 <> 0 then x = min(x,x1)            ' what came first the , ; or :
	if x2 <> 0 then x = min(x,x2)
 
	w$  = mid$(a$,px,x - px)                 ' get the word seperated by , ; or :
 
	if count and 1 then                      ' is it the odd word
	        w1$ = ""
		for i = len(w$) to 1 step -1
			w1$ = w1$ + mid$(w$,i,1) ' reverse odd words
		next i
		w$ = w1$
	end if
        oddW$ = oddW$ + w$ + mid$(a$,x,1)        ' add the word to the end of oddW$
	px    = x + 1                            ' bump word search location for next while
	count = count + 1                        ' count the words
wend
print a$;" -> ";oddW$                            ' print the original and result 
next ii
wend
close #f