Task

Write a function/procedure/subroutine that is called with an integer value and returns the middle three digits of the integer if possible or a clear indication of an error if this is not possible.

Note: The order of the middle digits should be preserved.

Your function should be tested with the following values; the first line should return valid answers, those of the second line should return clear indications of an error:

123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345
1, 2, -1, -10, 2002, -2002, 0

Show your output on this page.




 
{def S 123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345
       1 2 -1 -10 2002 -2002 0} 
-> S
 
{def middle3digits
 {lambda {:w}
  {let { {:w {abs :w}}
         {:l {W.length {abs :w}}}
       } {if {= {% :l 2} 0}
          then has an even number of digits
          else {if {< :l 3}
          then has not enough digits
          else {W.get {- {/ :l 2} 1} :w}
               {W.get {/ :l 2} :w}
               {W.get {+ {/ :l 2} 1} :w} }}}}}
-> middle3digits
 
 
{table
{S.map {lambda {:i}
       {tr {td {@ style="text-align:right;"}:i:}
           {td {middle3digits :i}}}}
       {S}} }
-> 
   123: 	123
   12345: 	234
   1234567: 	345
 987654321: 	654
     10001: 	000
    -10001: 	000
      -123: 	123
      -100: 	100
       100: 	100
    -12345: 	234
         1: 	has not enough digits
         2: 	has not enough digits
        -1: 	has not enough digits
       -10: 	has an even number of digits
      2002: 	has an even number of digits
     -2002: 	has an even number of digits
         0: 	has not enough digits
 