#! /bin/sed -rf

# Usage: sed -rf sedermind.sed ou ./sedermind.sed
# Please use Gnu Sed

# Sedermind #

2 b igen
1 !b check

i\
 Please enter a random word or sentence to generate a code.\
 (at least 4 letters)
b end

:igen
# lowercase input
s/.*/\L&/
s/[^a-z]//g

# We need to generate a code for mastermind ([1-8]{4})
# Since sed has no random function (and can't access to /dev/random),
# we ask the user to enter a random string (at least 4 letters)
# and we generate a code from this input.

:gen
y/abcdefghijklmnopqrstuvwxyz12345678/bcdefghijklmnopqrstuvwxyz123456781/
:l
t l
s/^(.*)(.)$/\2\1/
s/^1(.)/\15/
/^[1-8]*$/ !b gen
s/(....).*/\1/

s/$/\nGuess the code (4 digits between 1 and 8) [........]/
x  

i\
\
  'o' is placed for each correct digit (value and position) \
  'x' is placed for each digit with bad position
b end

# Tester user guess.
:check

G  
s/\n/:/
s/\n.*//

/^(.*):\1$/ b vict

x  
s/\./*/
/\./ !b lose
x  

# Correct digits
:loop1
/([1-8]).{4}\1/ {
    s/(.)(.{4})\1/ \2o/
}  
t loop1

# Digits with bad position
:loop2
s/([1-8])(.*:.*)\1/\2x/
t loop2

# Clean things and display
s/.*://
s/[^ox]//g
:m
t m
s/$/    /
s/^(....).*/\1/
s/.*/ => '&'/
p  
i\

b end

:vict
i\
 Victory is yours.
Q  

:lose
i\
 Loser. \
 Answer was:
x  
s/.*://
q  

:end
g  
s/.*\n//p

s/.*//
d  

### colorized by sedsed, a debugger and code formatter for sed scripts
### original script: http://laurent.le-brun.eu/pub/sedermind.sed