91 lines
1.6 KiB
Tcl
91 lines
1.6 KiB
Tcl
#!/usr/bin/env tclsh
|
|
|
|
# output middle 3 digits or error
|
|
|
|
# good integers
|
|
set good {123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345}
|
|
|
|
# bad integers
|
|
set bad {doggy 1 2 -1 -10 2002 -2002 0}
|
|
|
|
proc middle_3 {num} {
|
|
|
|
# error messages
|
|
array set error {
|
|
notint {(not an integer)}
|
|
short {(number < 3 digits)}
|
|
even {(even number of digits)}
|
|
zero {(zero length entry)}
|
|
{unknown} {(unknown error)}
|
|
}
|
|
|
|
set err 0
|
|
|
|
# must be integer
|
|
if { ! [string is integer $num] } {
|
|
set err 1
|
|
set errstr $error(notint)
|
|
}
|
|
|
|
# work with positive val
|
|
if { $num < 0 } { set num [expr {abs($num)} ] }
|
|
|
|
# how many digits
|
|
set dlen [string length $num]
|
|
|
|
if {$dlen < 3} {
|
|
set err 1
|
|
set errstr $error(short)
|
|
}
|
|
|
|
if {$dlen % 2 == 0} {
|
|
set err 1
|
|
set errstr $error(even)
|
|
}
|
|
|
|
if {$err} {
|
|
|
|
# " (err)"
|
|
set output [format "%*s%s" 10 "" "$errstr"]
|
|
|
|
} else {
|
|
|
|
# split into list of each letter
|
|
set letters [split $num ""]
|
|
|
|
# middle of list
|
|
set mid [expr {$dlen / 2}]
|
|
|
|
# get 3 in the middle
|
|
set a [lindex $letters [expr {$mid-1} ] ]
|
|
set b [lindex $letters [expr {$mid} ] ]
|
|
set c [lindex $letters [expr {$mid+1} ] ]
|
|
|
|
# " 123"
|
|
set output [format "%*s%d" 10 "" "$a$b$c"]
|
|
}
|
|
|
|
return $output
|
|
}
|
|
|
|
|
|
|
|
# start here
|
|
|
|
puts stdout "test good list:\n"
|
|
puts stdout "${good}"
|
|
|
|
foreach num $good {
|
|
set n [middle_3 $num ]
|
|
puts stdout "$num:\t$n"
|
|
}
|
|
|
|
puts ""
|
|
puts stdout "test bad list:\n"
|
|
puts stdout "${bad}"
|
|
|
|
foreach num $bad {
|
|
set n [middle_3 $num ]
|
|
|
|
puts stdout "$num:\t$n"
|
|
}
|