This commit is contained in:
Ingy döt Net 2013-10-27 22:24:23 +00:00
parent 6f050a029e
commit 776bba907c
3887 changed files with 59894 additions and 7280 deletions

View file

@ -0,0 +1,32 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// we return a static buffer; caller wants it, caller copies it
char * mid3(int n)
{
static char buf[32];
int l;
sprintf(buf, "%d", n > 0 ? n : -n);
l = strlen(buf);
if (l < 3 || !(l & 1)) return 0;
l = l / 2 - 1;
buf[l + 3] = 0;
return buf + l;
}
int main(void)
{
int x[] = {123, 12345, 1234567, 987654321, 10001, -10001,
-123, -100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0,
1234567890};
int i;
char *m;
for (i = 0; i < sizeof(x)/sizeof(x[0]); i++) {
if (!(m = mid3(x[i])))
m = "error";
printf("%d: %s\n", x[i], m);
}
return 0;
}

View file

@ -0,0 +1,47 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char input[50];
int midPoint;
void midThree(char arg[])
{
char output[4];
for(int i=0; i<3; i++)
{
output[i] = input[(midPoint-1) + i];
}
output[3] = '\0';
printf("The middle three digits of %s are %s.\n",arg,output);
}
int main(int argc, char * argv[])
{
if(argc < 2)
{
printf("Usage: %s <integer>\n",argv[0]);
return 1;
}
else
{
sprintf(input,"%d",abs(atoi(argv[1])));
if(strlen(input) < 3)
{
printf("Error, %d is too short.\n",atoi(argv[1]));
return 1;
}
else if(strlen(input) % 2 == 0)
{
printf("Error, %d is even.\n",atoi(argv[1]));
return 1;
}
else
{
midPoint = ((strlen(input) + 1) / 2) - 1;
midThree(argv[1]);
return 0;
}
}
}

View file

@ -0,0 +1,91 @@
identification division.
program-id. middle3.
environment division.
data division.
working-storage section.
01 num pic 9(9).
88 num-too-small values are -99 thru 99.
01 num-disp pic ---------9.
01 div pic 9(9).
01 mod pic 9(9).
01 mod-disp pic 9(3).
01 digit-counter pic 999.
01 digit-div pic 9(9).
88 no-more-digits value 0.
01 digit-mod pic 9(9).
88 is-even value 0.
01 multiplier pic 9(9).
01 value-items.
05 filler pic s9(9) value 123.
05 filler pic s9(9) value 12345.
05 filler pic s9(9) value 1234567.
05 filler pic s9(9) value 987654321.
05 filler pic s9(9) value 10001.
05 filler pic s9(9) value -10001.
05 filler pic s9(9) value -123.
05 filler pic s9(9) value -100.
05 filler pic s9(9) value 100.
05 filler pic s9(9) value -12345.
05 filler pic s9(9) value 1.
05 filler pic s9(9) value 2.
05 filler pic s9(9) value -1.
05 filler pic s9(9) value -10.
05 filler pic s9(9) value 2002.
05 filler pic s9(9) value -2002.
05 filler pic s9(9) value 0.
01 value-array redefines value-items.
05 items pic s9(9) occurs 17 times indexed by item.
01 result pic x(20).
procedure division.
10-main.
perform with test after varying item from 1 by 1 until items(item) = 0
move items(item) to num
move items(item) to num-disp
perform 20-check
display num-disp " --> " result
end-perform.
stop run.
20-check.
if num-too-small
move "Number too small" to result
exit paragraph
end-if.
perform 30-count-digits.
divide digit-counter by 2 giving digit-div remainder digit-mod.
if is-even
move "Even number of digits" to result
exit paragraph
end-if.
*> if digit-counter is 5, mul by 10
*> if digit-counter is 7, mul by 100
*> if digit-counter is 9, mul by 1000
if digit-counter > 3
compute multiplier rounded = 10 ** (((digit-counter - 5) / 2) + 1)
divide num by multiplier giving num
divide num by 1000 giving div remainder mod
move mod to mod-disp
else
move num to mod-disp
end-if.
move mod-disp to result.
exit paragraph.
30-count-digits.
move zeroes to digit-counter.
move num to digit-div.
perform with test before until no-more-digits
divide digit-div by 10 giving digit-div remainder digit-mod
add 1 to digit-counter
end-perform.
exit paragraph.

View file

@ -0,0 +1,71 @@
identification division.
program-id. middle3.
environment division.
data division.
working-storage section.
01 value-items.
05 filler pic s9(9) value 123.
05 filler pic s9(9) value 12345.
05 filler pic s9(9) value 1234567.
05 filler pic s9(9) value 987654321.
05 filler pic s9(9) value 10001.
05 filler pic s9(9) value -10001.
05 filler pic s9(9) value -123.
05 filler pic s9(9) value -100.
05 filler pic s9(9) value 100.
05 filler pic s9(9) value -12345.
05 filler pic s9(9) value 1.
05 filler pic s9(9) value 2.
05 filler pic s9(9) value -1.
05 filler pic s9(9) value -10.
05 filler pic s9(9) value 2002.
05 filler pic s9(9) value -2002.
05 filler pic s9(9) value 0.
01 value-array redefines value-items.
05 items pic s9(9) occurs 17 times indexed by item.
01 num pic 9(9).
01 num-disp pic ---------9.
01 num2 pic 9(9).
01 power pic 9.
01 power10 pic 9(16).
01 three-digits pic 999.
01 result pic X(20).
01 flag pic 9.
88 done value 1.
procedure division.
01-setup.
perform 02-outer with test after varying item from 1 by 1 until items(item) = 0.
stop run.
02-outer.
move items(item) to num.
move items(item) to num-disp.
if num less than 100
move "too small" to result
else
perform 03-inner with test after varying power from 9 by -1 until power = 1 or done
end-if.
display num-disp " --> " result.
exit paragraph.
03-inner.
move 0 to flag.
compute power10 = 10 ** power.
if num >= power10
move 1 to flag
if function mod(power,2) = 1
move "even number digits" to result
else
move num to num2
compute num2 = num2 / ( 10 ** (( power / 2 ) - 1 ))
move function mod(num2,1000) to three-digits
move three-digits to result
end-if
end-if.

View file

@ -0,0 +1,15 @@
(defn middle3 [v]
(let [no (Math/abs v)
digits (str no)
len (count digits)]
(cond
(< len 3) :too_short
(even? len) :no_middle_in_even_no_of_digits
:else (let [mid (/ len 2)
start (- mid 2)]
(apply str
(take 3
(nthnext digits start)))))))
(def passes '(123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345))
(def fails '(1 2 -1 -10 2002 -2002 0))

View file

@ -0,0 +1,12 @@
(defun mid3 (n)
(let ((a (abs n))
(hmd)) ; how many digits
(labels ((give (fmt &optional x y) (return-from mid3 (format nil fmt x y)))
(need (x) (give "Need ~a digits, not ~d." x hmd))
(nbr (n) (give "~3,'0d" n)))
(when (zerop n) (give "Zero is 1 digit"))
(setq hmd (truncate (1+ (log a 10))))
(cond ((< hmd 3) (need "3+"))
((= hmd 3) (nbr a))
((evenp hmd) (need "odd number of"))
(t (nbr (mod (truncate a (expt 10 (/ (- hmd 3) 2))) 1000)))))))

View file

@ -0,0 +1,4 @@
(loop as n in '(123 12345 1234567 987654321
10001 -10001 -123 -100 100 -12345
1 2 -1 -10 2002 -2002 0)
do (format t "~d:~12t~a~%" n (mid3 n)))

View file

@ -1,4 +1,4 @@
% Implemented by Arjun Sunel
%
-module(middle_three_digits).
-export([main/0]).
@ -21,38 +21,19 @@ main() ->
digits(-2002),
digits(0).
digits(N) when N < 0 ->
digits(-N);
digits(N) when (N div 100) =:= 0 ->
io:format("too small\n");
digits(N) ->
K=length(integer_to_list(N)),
if (K rem 2) =:= 0 ->
io:format("even number of digits\n");
true ->
loop((K-3) div 2 , N)
end.
if N < 0 ->
digits(-N);
(N div 100) =:= 0 ->
io:format("too small\n");
true ->
K=length(integer_to_list(N)),
if (K rem 2) =:= 0 ->
io:format("even number of digits\n");
true ->
loop((K-3) div 2 , N)
end
end.
loop(0,N) ->
if
N rem 1000 =:= 0 ->
io:format("000\n");
N rem 1000 < 10 ->
io:format("00~w~n",[N rem 1000]);
N rem 1000 < 100 ->
io:format("0~w~n",[N rem 1000]);
true ->
io:format("~w~n", [N rem 1000])
end;
loop(0, N) ->
io:format("~3..0B~n",[N rem 1000]);
loop(X,N) when X>0 ->
loop(X-1, N div 10).

View file

@ -0,0 +1,45 @@
#APPTYPE CONSOLE
DIM numbers AS STRING = "123,12345,1234567,987654321,10001,-10001,-123,-100,100,-12345,1,2,-1,-10,2002,-2002,0"
DIM dict[] = Split(numbers, ",")
DIM num AS INTEGER
DIM num2 AS INTEGER
DIM powered AS INTEGER
FOR DIM i = 0 TO COUNT(dict) - 1
num2 = dict[i]
num = ABS(num2)
IF num < 100 THEN
display(num2, "is too small")
ELSE
FOR DIM j = 9 DOWNTO 1
powered = 10 ^ j
IF num >= powered THEN
IF j MOD 2 = 1 THEN
display(num2, "has even number of digits")
ELSE
display(num2, middle3(num, j))
END IF
EXIT FOR
END IF
NEXT
END IF
NEXT
PAUSE
FUNCTION display(num, msg)
PRINT LPAD(num, 11, " "), " --> ", msg
END FUNCTION
FUNCTION middle3(n, pwr)
DIM power AS INTEGER = (pwr \ 2) - 1
DIM m AS INTEGER = n
m = m \ (10 ^ power)
m = m MOD 1000
IF m = 0 THEN
RETURN "000"
ELSE
RETURN m
END IF
END FUNCTION

View file

@ -0,0 +1,73 @@
!-*- mode: compilation; default-directory: "/tmp/" -*-
!Compilation started at Sat Jun 1 14:48:41
!
!a=./f && make $a && OMP_NUM_THREADS=2 $a < unixdict.txt # some of the compilation options and redirection from unixdict.txt are vestigial.
!gfortran -std=f2008 -Wall -fopenmp -ffree-form -fall-intrinsics -fimplicit-none f.f08 -o f
! 123 123
! 12345 234
! 1234567 345
! 987654321 654
! 10001 000
! -10001 000
! -123 123
! -100 100
! 100 100
! -12345 234
! 1 Too short
! 2 Too short
! -1 Too short
! -10 Too short
! 2002 Digit count too even
! -2002 Digit count too even
! 0 Too short
!
!Compilation finished at Sat Jun 1 14:48:41
program MiddleMuddle
integer, dimension(17) :: itest, idigits
integer :: i, n
data itest/123,12345,1234567,987654321,10001,-10001,-123,-100,100,-12345,1,2,-1,-10,2002,-2002,0/
do i = 1, size(itest)
call antibase(10, abs(itest(i)), idigits, n)
write(6,'(i20,2x,a20)') itest(i), classifym3(idigits, n)
if (0 .eq. itest(i)) exit
end do
contains
logical function even(n)
integer, intent(in) :: n
even = 0 .eq. iand(n,1)
end function even
function classifym3(iarray, n) result(s)
integer, dimension(:), intent(in) :: iarray
integer, intent(in) :: n
character(len=20) :: s
integer :: i,m
if (n < 3) then
s = 'Too short'
else if (even(n)) then
s = 'Digit count too even'
else
m = (n+1)/2
write(s,'(3i1)')(iarray(i), i=m+1,m-1,-1)
end if
end function classifym3
subroutine antibase(base, m, digits, n) ! digits ordered by increasing significance
integer, intent(in) :: base, m
integer, intent(out) :: n ! the number of digits
integer, dimension(:), intent(out) :: digits
integer :: em
em = m
do n=1, size(digits)
digits(n) = mod(em, base)
em = em / base
if (0 .eq. em) return
end do
stop 'antibase ran out of space to store result'
end subroutine antibase
end program MiddleMuddle

View file

@ -0,0 +1,26 @@
package m3
import (
"errors"
"strconv"
)
var (
ErrorLT3 = errors.New("N of at least three digits required.")
ErrorEven = errors.New("N with odd number of digits required.")
)
func Digits(i int) (string, error) {
if i < 0 {
i = -i
}
if i < 100 {
return "", ErrorLT3
}
s := strconv.Itoa(i)
if len(s)%2 == 0 {
return "", ErrorEven
}
m := len(s) / 2
return s[m-1 : m+2], nil
}

View file

@ -0,0 +1,59 @@
package m3_test
import (
"testing"
"m3"
)
func TestPassing(t *testing.T) {
type s struct {
i int
m string
}
tcs := []s{
{123, "123"},
{12345, "234"},
{1234567, "345"},
{987654321, "654"},
{10001, "000"},
{-10001, "000"},
}
for _, tc := range tcs {
m, err := m3.Digits(tc.i)
if err != nil {
t.Fatalf("d(%d) returned %q.", tc.i, err)
}
if m != tc.m {
t.Fatalf("d(%d) expected %q, got %q.", tc.i, tc.m, m)
}
t.Logf("d(%d) = %q.", tc.i, m)
}
}
func TestFailing(t *testing.T) {
type s struct {
i int
err error
}
tcs := []s{
{1, m3.ErrorLT3},
{2, m3.ErrorLT3},
{-1, m3.ErrorLT3},
{-10, m3.ErrorLT3},
{2002, m3.ErrorEven},
{-2002, m3.ErrorEven},
{0, m3.ErrorLT3},
}
for _, tc := range tcs {
m, err := m3.Digits(tc.i)
if err == nil {
t.Fatal("d(%d) expected error %q, got non-error %q.",
tc.i, tc.err, m)
}
if err != tc.err {
t.Fatal("d(d) expected error %q, got %q", tc.i, tc.err, err)
}
t.Logf("d(%d) returns %q", tc.i, err)
}
}

View file

@ -0,0 +1,8 @@
def middleThree(Number number) {
def text = Math.abs(number) as String
assert text.size() >= 3 : "'$number' must be more than 3 numeric digits"
assert text.size() % 2 == 1 : "'$number' must have an odd number of digits"
int start = text.size() / 2 - 1
text[start..(start+2)]
}

View file

@ -0,0 +1,8 @@
[123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0].each { number ->
def text = (number as String).padLeft(10)
try {
println "$text: ${middleThree(number)}"
} catch(AssertionError error) {
println "$text cannot be converted: $error.message"
}
}

View file

@ -0,0 +1,12 @@
procedure main(a)
every n := !a do write(right(n,15)," -> ",midM(n))
end
procedure midM(n,m)
/m := 3
n := abs(n)
return n ? if (*n >= m) then
if (((*n-m) % 2) = 0) then (move((*n - m)/2),move(m))
else "wrong number of digits"
else "too short"
end

View file

@ -1,16 +1,14 @@
function middle(s)
s = string(abs(s))
len = length(s)
assert(len >= 3 && len % 2 == 1, "Number of digits must be odd and >= 3")
mid = ifloor(len/2)
return s[mid:mid+2]
function middle(i)
let s = string(abs(i)) , l = length(s) , mid = int((l+1)/2)
l < 3 ?
"error: not enough digits" :
iseven(l) ?
"error: number of digits is even" :
s[mid-1:mid+1]
end
end
passing = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345]
failing = [1, 2, -1, -10, 2002, -2002, 0]
for i in [passing,failing]
try
println("Number: $i ", "Answer: ",middle(i))
catch e
println("Number: $i ", "Answer: ",e)
end
for n = [123, 12345, 1234567, 987654321, 10001, -10001, -123,
-100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0]
println (@sprintf("%10d : ", n), middle(n))
end

View file

@ -0,0 +1,15 @@
function s=middle_three_digits(a)
% http://rosettacode.org/wiki/Middle_three_digits
s=num2str(abs(a));
if ~mod(length(s),2)
s='*** error: number of digits must be odd ***';
return;
end;
if length(s)<3,
s='*** error: number of digits must not be smaller than 3 ***';
return;
end;
s = s((length(s)+1)/2+[-1:1]);

View file

@ -0,0 +1,2 @@
x=[123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0];
for k=1:length(x); fprintf(1,'%9i:%s\n',x(k),middle_three_digits(x(k)));end;

View file

@ -1 +1 @@
digits(n)=eval(Vec(Str(n)))
apply(n-> Strprintf("%03d", n), %)

View file

@ -1 +1 @@
digits(n)=Vec(apply(n->n-48,Vectorsmall(Str(n))))
digits(n)=eval(Vec(Str(n)))

View file

@ -0,0 +1 @@
digits(n)=Vec(apply(n->n-48,Vectorsmall(Str(n))))

View file

@ -9,8 +9,8 @@ n ='123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345',
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────MIDDLE3 subroutine──────────────────*/
middle3: procedure; arg x; numeric digits 1e5; er=' ***error!*** '
if datatype(x,'N') then x=abs(x)/1; L=length(x)
if datatype(x,'N') then x=abs(x); L=length(x)
if \datatype(x,'W') then return er "arg isn't an integer"
if L<3 then return er "arg is less then three digits"
if L<3 then return er "arg is less than three digits"
if L//2==0 then return er "arg isn't an odd number of digits"
return substr(x, (L-3)%2+1, 3)

View file

@ -1,30 +1,32 @@
// rust 0.8
fn middle_three_digits(x: int) -> Result<~str, ~str> {
let s = int::abs(x).to_str();
let s = x.abs().to_str();
let len = s.len();
if len < 3 {
Err(~"Too short")
} else if len % 2 == 0 {
Err(~"Even number of digits")
} else {
Ok(s.slice(len/2 - 1, len/2 + 2))
Ok(s.slice(len/2 - 1, len/2 + 2).to_owned())
}
}
fn print_result(x: int) {
io::print(fmt!("middle_three_digits(%?) returned: ", x));
print!("middle_three_digits({}) returned: ", x);
match middle_three_digits(x) {
Ok(move s) => io::println(fmt!("Success, %s", s)),
Err(move s) => io::println(fmt!("Failure, %s", s))
Ok(s) => println!("Success, {}", s),
Err(s) => println!("Failure, {}", s)
}
}
fn main() {
let passing = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345];
let failing = [1, 2, -1, -10, 2002, -2002, 0];
for passing.each |i| {
for i in passing.iter() {
print_result(*i);
}
for failing.each |i| {
for i in failing.iter() {
print_result(*i);
}
}