Middle three digits: Difference between revisions
m (neaten up a little) |
(added ocaml) |
||
Line 51: | Line 51: | ||
middleThreeDigits(-2002) returned: Need odd and >= 3 digits |
middleThreeDigits(-2002) returned: Need odd and >= 3 digits |
||
middleThreeDigits(0) returned: Need odd and >= 3 digits</pre> |
middleThreeDigits(0) returned: Need odd and >= 3 digits</pre> |
||
=={{header|OCaml}}== |
|||
<lang ocaml>let even x = (x land 1) <> 1 |
|||
let middle_three_digits x = |
|||
let s = string_of_int (abs x) in |
|||
let n = String.length s in |
|||
if n < 3 then failwith "need >= 3 digits" else |
|||
if even n then failwith "need odd number of digits" else |
|||
String.sub s (n / 2 - 1) 3 |
|||
let passing = [123; 12345; 1234567; 987654321; 10001; -10001; -123; -100; 100; -12345] |
|||
let failing = [1; 2; -1; -10; 2002; -2002; 0] |
|||
let print x = |
|||
let res = |
|||
try (middle_three_digits x) |
|||
with Failure e -> "failure: " ^ e |
|||
in |
|||
Printf.printf "%d: %s\n" x res |
|||
let () = |
|||
print_endline "Should pass:"; |
|||
List.iter print passing; |
|||
print_endline "Should fail:"; |
|||
List.iter print failing; |
|||
;;</lang> |
|||
{{out}} |
|||
<pre> |
|||
Should pass: |
|||
123: 123 |
|||
12345: 234 |
|||
1234567: 345 |
|||
987654321: 654 |
|||
10001: 000 |
|||
-10001: 000 |
|||
-123: 123 |
|||
-100: 100 |
|||
100: 100 |
|||
-12345: 234 |
|||
Should fail: |
|||
1: failure: need >= 3 digits |
|||
2: failure: need >= 3 digits |
|||
-1: failure: need >= 3 digits |
|||
-10: failure: need >= 3 digits |
|||
2002: failure: need odd number of digits |
|||
-2002: failure: need odd number of digits |
|||
0: failure: need >= 3 digits |
|||
</pre> |
|||
=={{header|Python}}== |
=={{header|Python}}== |
Revision as of 00:53, 3 February 2013
The task is to:
- “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.”
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.
D
<lang d>import std.stdio, std.traits, std.math, std.conv;
string middleThreeDigits(T)(T n) if (isIntegral!T) {
auto s = n.abs().text(); auto len = s.length; if (len < 3 || len % 2 == 0) throw new Exception("Need odd and >= 3 digits"); auto mid = len / 2; return s[mid - 1 .. mid + 2];
}
void main() {
auto passing = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345]; auto failing = [1, 2, -1, -10, 2002, -2002, 0]; foreach (n; passing ~ failing) { string answer; try { answer = middleThreeDigits(n); } catch (Exception e) { answer = e.msg; } writefln("middleThreeDigits(%s) returned: %s", n, answer); }
}</lang>
middleThreeDigits(123) returned: 123 middleThreeDigits(12345) returned: 234 middleThreeDigits(1234567) returned: 345 middleThreeDigits(987654321) returned: 654 middleThreeDigits(10001) returned: 000 middleThreeDigits(-10001) returned: 000 middleThreeDigits(-123) returned: 123 middleThreeDigits(-100) returned: 100 middleThreeDigits(100) returned: 100 middleThreeDigits(-12345) returned: 234 middleThreeDigits(1) returned: Need odd and >= 3 digits middleThreeDigits(2) returned: Need odd and >= 3 digits middleThreeDigits(-1) returned: Need odd and >= 3 digits middleThreeDigits(-10) returned: Need odd and >= 3 digits middleThreeDigits(2002) returned: Need odd and >= 3 digits middleThreeDigits(-2002) returned: Need odd and >= 3 digits middleThreeDigits(0) returned: Need odd and >= 3 digits
OCaml
<lang ocaml>let even x = (x land 1) <> 1
let middle_three_digits x =
let s = string_of_int (abs x) in let n = String.length s in if n < 3 then failwith "need >= 3 digits" else if even n then failwith "need odd number of digits" else String.sub s (n / 2 - 1) 3
let passing = [123; 12345; 1234567; 987654321; 10001; -10001; -123; -100; 100; -12345] let failing = [1; 2; -1; -10; 2002; -2002; 0]
let print x =
let res = try (middle_three_digits x) with Failure e -> "failure: " ^ e in Printf.printf "%d: %s\n" x res
let () =
print_endline "Should pass:"; List.iter print passing; print_endline "Should fail:"; List.iter print failing;
- </lang>
- Output:
Should pass: 123: 123 12345: 234 1234567: 345 987654321: 654 10001: 000 -10001: 000 -123: 123 -100: 100 100: 100 -12345: 234 Should fail: 1: failure: need >= 3 digits 2: failure: need >= 3 digits -1: failure: need >= 3 digits -10: failure: need >= 3 digits 2002: failure: need odd number of digits -2002: failure: need odd number of digits 0: failure: need >= 3 digits
Python
<lang python>>>> def middle_three_digits(i): s = str(abs(i)) length = len(s) assert length >= 3 and length % 2 == 1, "Need odd and >= 3 digits" mid = length // 2 return s[mid-1:mid+2]
>>> passing = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345] >>> failing = [1, 2, -1, -10, 2002, -2002, 0] >>> for x in passing + failing: try: answer = middle_three_digits(x) except AssertionError as error: answer = error print("middle_three_digits(%s) returned: %r" % (x, answer))
middle_three_digits(123) returned: '123'
middle_three_digits(12345) returned: '234'
middle_three_digits(1234567) returned: '345'
middle_three_digits(987654321) returned: '654'
middle_three_digits(10001) returned: '000'
middle_three_digits(-10001) returned: '000'
middle_three_digits(-123) returned: '123'
middle_three_digits(-100) returned: '100'
middle_three_digits(100) returned: '100'
middle_three_digits(-12345) returned: '234'
middle_three_digits(1) returned: AssertionError('Need odd and >= 3 digits',)
middle_three_digits(2) returned: AssertionError('Need odd and >= 3 digits',)
middle_three_digits(-1) returned: AssertionError('Need odd and >= 3 digits',)
middle_three_digits(-10) returned: AssertionError('Need odd and >= 3 digits',)
middle_three_digits(2002) returned: AssertionError('Need odd and >= 3 digits',)
middle_three_digits(-2002) returned: AssertionError('Need odd and >= 3 digits',)
middle_three_digits(0) returned: AssertionError('Need odd and >= 3 digits',)
>>> </lang>