alias disphint {
;$1 = Hint count, $2 = Hidden Character, $3- = Hint string
tokenize 32 $1-
var %nHintNum = $1
var %cHintChar = $2
var %sAnswer = $3-
if (%nHintNum !isnum) { echo 4 -s Invalid hint count | return }
if ($regex(%cHintChar,/^([a-z0-9º¬]|$)/i)) { echo 4 -s Invalid hint hidden character | return }
if (%sAnswer == $null) { echo 4 -s Invalid hint string | return }
var %sClue = %sAnswer
var %nLength = $len(%sAnswer)
%sClue = $regsubex(%sClue,/[^a-zA-Z0-9 ]/g,º)
%sClue = $regsubex(%sClue,/ /g,¬)
%sClue = $regsubex(%sClue,/[a-zA-Z0-9]/g,%cHintChar)
if ($hget(hint)) hfree hint
hmake hint 2
;;; Create hash table and insert vowels
var %i = 0
while (%i < %nLength) {
inc %i
hadd hint $+(a.,%i) $mid(%sAnswer,%i,1)
hadd hint $+(c.,%i) $mid(%sClue,%i,1)
if ($hget(hint,$+(a.,%i)) isin %sVowels) {
hadd hint $+(c.,%i) $mid(%sAnswer,%i,1)
}
}
hadd hint $+(p.1) 1
var %j = 0, %nCurPart = 1
while (%j < %nLength) {
inc %j
if ($hget(hint,$+(c.,%j)) != ¬) continue
inc %j
if (%j <= %nLength) {
inc %nCurPart
hadd hint $+(p.,%nCurPart) %j
}
}
;;; Calculate hint order
var %nClues = $count(%sClue,%cHintChar)
var %n = 0, %m = 0, %L = 1, %p, %h
while (%L) {
inc %n
%p = $hget(hint,$+(p.,%n))
%h = $hget(hint,$+(c.,%p))
if (%p > %nLength) {
%n = 0
continue
}
if (%n > %nCurPart) {
%n = 0
}
if (%m >= %nClues) {
%L = 0
continue
}
if (%h == %cHintChar) {
inc %m
hadd hint $+(h.,%m) %p
hinc hint $+(p.,%n) 1
}
elseif (%h == º) {
hinc hint $+(p.,%n) 1
dec %n
continue
}
elseif (%h == ¬) {
continue
}
else {
hinc hint $+(p.,%n) 1
}
}
var %c, %i = 0
while (%i < %nHintNum) {
inc %i
%c = $hget(hint,$+(h.,%i))
hadd hint $+(c.,%c) $hget(hint,$+(a.,%c))
}
;;; Build string from hash table values
var %sClue, %h, %s = 0
var %i = 0
while (%i < %nLength) {
inc %i
%h = $hget(hint,$+(c.,%i))
if (%h == ¬) {
%s = 1
continue
}
else {
if (%h == º) %h = $hget(hint,$+(a.,%i))
%sClue = %sClue $+ $iif(%s,$chr(32)) $+ %h
%s = 0
}
}
if ($isid) return %sClue
else echo -a %sClue
}