Middle three digits: Difference between revisions

Content added Content deleted
(→‎{{header|Picat}}: Split into subsections, added {{out}})
Line 4,420: Line 4,420:


=={{header|Picat}}==
=={{header|Picat}}==
===Prolog-style===
Two get_middle/1 functions:
* get_middle_f1/1: {{trans|Prolog}}
{{trans|Prolog}}
<lang Picat>get_middle_f1(Str) = [X,Y,Z] =>
* get_middle_f2/1: Using string length and list range
append(Pre,[X,Y,Z],Post,Str),
length(Pre) = length(Post).</lang>

===List slice===
<lang Picat>get_middle_f2(Str) = Str[Mid-1..Mid+1] =>
Mid = 1 + Str.len div 2.</lang>


===Test===
<lang Picat>go =>
<lang Picat>go =>
Success = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345],
Success = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345],
Line 4,449: Line 4,456:
if Len mod 2 = 0 then throw $not_odd_length(N)
if Len mod 2 = 0 then throw $not_odd_length(N)
elseif Len < 3 then throw $number_too_small(N)
elseif Len < 3 then throw $number_too_small(N)
end.
end.</lang>
% inspired by the Prolog solution
get_middle_f1(Str) = [X,Y,Z] =>
append(Pre,[X,Y,Z],Post,Str),
length(Pre) = length(Post).


{{out}}
% Using slice
get_middle_f2(Str) = Str[Mid-1..Mid+1] =>
Mid = 1 + Str.len div 2.</lang>

Both tests outputs:
<pre>[n = 123,middle = 123]
<pre>[n = 123,middle = 123]
[n = 12345,middle = 234]
[n = 12345,middle = 234]
Line 4,478: Line 4,476:
[n = -2002,exception = not_odd_length(-2002)]
[n = -2002,exception = not_odd_length(-2002)]
[n = 0,exception = number_too_small(0)]</pre>
[n = 0,exception = number_too_small(0)]</pre>



=={{header|PicoLisp}}==
=={{header|PicoLisp}}==