2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
|
|
@ -1,7 +1,12 @@
|
|||
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.''”
|
||||
:<small>''Note: The order of the middle digits should be preserved''.</small>
|
||||
;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:
|
||||
<pre>123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345
|
||||
1, 2, -1, -10, 2002, -2002, 0</pre>
|
||||
<pre>
|
||||
123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345
|
||||
1, 2, -1, -10, 2002, -2002, 0
|
||||
</pre>
|
||||
Show your output on this page.
|
||||
<br><br>
|
||||
|
|
|
|||
|
|
@ -1,45 +1,21 @@
|
|||
#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
|
||||
REM >midthree
|
||||
FOR i% = 1 TO 17
|
||||
READ test%
|
||||
PRINT test%; " -> "; FN_middle_three(test%)
|
||||
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
|
||||
END
|
||||
:
|
||||
DATA 123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345
|
||||
DATA 1, 2, -1, -10, 2002, -2002, 0
|
||||
:
|
||||
DEF FN_middle_three(n%)
|
||||
LOCAL n$
|
||||
n$ = STR$ ABS n%
|
||||
CASE TRUE OF
|
||||
WHEN LEN n$ < 3
|
||||
= "Not enough digits"
|
||||
WHEN LEN n$ MOD 2 = 0
|
||||
= "Even number of digits"
|
||||
OTHERWISE
|
||||
= MID$(n$, LEN n$ / 2, 3)
|
||||
ENDCASE
|
||||
|
|
|
|||
|
|
@ -1,28 +1,45 @@
|
|||
Procedure.s middleThreeDigits(x.q)
|
||||
Protected x$, digitCount
|
||||
#APPTYPE CONSOLE
|
||||
|
||||
If x < 0: x = -x: EndIf
|
||||
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
|
||||
|
||||
x$ = Str(x)
|
||||
digitCount = Len(x$)
|
||||
If digitCount < 3
|
||||
ProcedureReturn "invalid input: too few digits"
|
||||
ElseIf digitCount % 2 = 0
|
||||
ProcedureReturn "invalid input: even number of digits"
|
||||
EndIf
|
||||
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
|
||||
|
||||
ProcedureReturn Mid(x$,digitCount / 2, 3)
|
||||
EndProcedure
|
||||
PAUSE
|
||||
|
||||
If OpenConsole()
|
||||
Define testValues$ = "123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345 1 2 -1 -10 2002 -2002 0"
|
||||
FUNCTION display(num, msg)
|
||||
PRINT LPAD(num, 11, " "), " --> ", msg
|
||||
END FUNCTION
|
||||
|
||||
Define i, value.q, numTests = CountString(testValues$, " ") + 1
|
||||
For i = 1 To numTests
|
||||
value = Val(StringField(testValues$, i, " "))
|
||||
PrintN(RSet(Str(value), 12, " ") + " : " + middleThreeDigits(value))
|
||||
Next
|
||||
|
||||
Print(#crlf$ + #crlf$ + "Press ENTER to exit"): Input()
|
||||
CloseConsole()
|
||||
EndIf
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1,13 +1,28 @@
|
|||
x$ = "123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0"
|
||||
Procedure.s middleThreeDigits(x.q)
|
||||
Protected x$, digitCount
|
||||
|
||||
while word$(x$,i+1,",") <> ""
|
||||
i = i + 1
|
||||
a1$ = trim$(word$(x$,i,","))
|
||||
if left$(a1$,1) = "-" then a$ = mid$(a1$,2) else a$ = a1$
|
||||
if (len(a$) and 1) = 0 or len(a$) < 3 then
|
||||
print a1$;chr$(9);" length < 3 or is even"
|
||||
else
|
||||
print mid$(a$,((len(a$)-3)/2)+1,3);" ";a1$
|
||||
end if
|
||||
wend
|
||||
end
|
||||
If x < 0: x = -x: EndIf
|
||||
|
||||
x$ = Str(x)
|
||||
digitCount = Len(x$)
|
||||
If digitCount < 3
|
||||
ProcedureReturn "invalid input: too few digits"
|
||||
ElseIf digitCount % 2 = 0
|
||||
ProcedureReturn "invalid input: even number of digits"
|
||||
EndIf
|
||||
|
||||
ProcedureReturn Mid(x$,digitCount / 2, 3)
|
||||
EndProcedure
|
||||
|
||||
If OpenConsole()
|
||||
Define testValues$ = "123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345 1 2 -1 -10 2002 -2002 0"
|
||||
|
||||
Define i, value.q, numTests = CountString(testValues$, " ") + 1
|
||||
For i = 1 To numTests
|
||||
value = Val(StringField(testValues$, i, " "))
|
||||
PrintN(RSet(Str(value), 12, " ") + " : " + middleThreeDigits(value))
|
||||
Next
|
||||
|
||||
Print(#crlf$ + #crlf$ + "Press ENTER to exit"): Input()
|
||||
CloseConsole()
|
||||
EndIf
|
||||
|
|
|
|||
13
Task/Middle-three-digits/BASIC/middle-three-digits-5.basic
Normal file
13
Task/Middle-three-digits/BASIC/middle-three-digits-5.basic
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
x$ = "123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0"
|
||||
|
||||
while word$(x$,i+1,",") <> ""
|
||||
i = i + 1
|
||||
a1$ = trim$(word$(x$,i,","))
|
||||
if left$(a1$,1) = "-" then a$ = mid$(a1$,2) else a$ = a1$
|
||||
if (len(a$) and 1) = 0 or len(a$) < 3 then
|
||||
print a1$;chr$(9);" length < 3 or is even"
|
||||
else
|
||||
print mid$(a$,((len(a$)-3)/2)+1,3);" ";a1$
|
||||
end if
|
||||
wend
|
||||
end
|
||||
14
Task/Middle-three-digits/Kotlin/middle-three-digits.kotlin
Normal file
14
Task/Middle-three-digits/Kotlin/middle-three-digits.kotlin
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
fun middleThree(x: Int): Int? {
|
||||
val s = Math.abs(x).toString()
|
||||
when {
|
||||
s.length < 3 -> return null // throw Exception("too short!")
|
||||
s.length % 2 == 0 -> return null // throw Exception("even number of digits")
|
||||
else -> return ((s.length / 2) - 1).let { s.substring(it, it + 3) }.toInt()
|
||||
}
|
||||
}
|
||||
|
||||
println(middleThree(12345)) // 234
|
||||
println(middleThree(1234)) // null
|
||||
println(middleThree(1234567)) // 345
|
||||
println(middleThree(123))// 123
|
||||
println(middleThree(123555)) //null
|
||||
10
Task/Middle-three-digits/MUMPS/middle-three-digits.mumps
Normal file
10
Task/Middle-three-digits/MUMPS/middle-three-digits.mumps
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
/* MUMPS */
|
||||
MID3(N) ;
|
||||
N LEN,N2
|
||||
S N2=$S(N<0:-N,1:N)
|
||||
I N2<100 Q "NUMBER TOO SMALL"
|
||||
S LEN=$L(N2)
|
||||
I LEN#2=0 Q "EVEN NUMBER OF DIGITS"
|
||||
Q $E(N2,LEN\2,LEN\2+2)
|
||||
|
||||
F I=123,12345,1234567,987654321,10001,-10001,-123,-100,100,-12345,1,2,-1,-10,2002,-2002,0 W !,$J(I,10),": ",$$MID3^MID3(I)
|
||||
19
Task/Middle-three-digits/Maple/middle-three-digits.maple
Normal file
19
Task/Middle-three-digits/Maple/middle-three-digits.maple
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
middleDigits := proc(n)
|
||||
local nList, start;
|
||||
nList := [seq(parse(i), i in convert (abs(n), string))];
|
||||
if numelems(nList) < 3 then
|
||||
printf ("%9a: Error: Not enough digits.", n);
|
||||
elif numelems(nList) mod 2 = 0 then
|
||||
printf ("%9a: Error: Even number of digits.", n);
|
||||
else
|
||||
start := (numelems(nList)-1)/2;
|
||||
printf("%9a: %a%a%a", n, op(nList[start..start+2]));
|
||||
end if;
|
||||
end proc:
|
||||
|
||||
a := [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345,
|
||||
1, 2, -1, -10, 2002, -2002, 0]:
|
||||
for i in a do
|
||||
middleDigits(i);
|
||||
printf("\n");
|
||||
end do;
|
||||
37
Task/Middle-three-digits/Pascal/middle-three-digits.pascal
Normal file
37
Task/Middle-three-digits/Pascal/middle-three-digits.pascal
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
program Midl3dig;
|
||||
{$IFDEF FPC}
|
||||
{$MODE Delphi} //result /integer => Int32 aka longInt etc..
|
||||
{$ELSE}
|
||||
{$APPTYPE console} // Delphi
|
||||
{$ENDIF}
|
||||
uses
|
||||
sysutils; //IntToStr
|
||||
function GetMid3dig(i:NativeInt):Ansistring;
|
||||
var
|
||||
n,l: NativeInt;
|
||||
Begin
|
||||
setlength(result,0);
|
||||
//n = |i| jumpless abs
|
||||
n := i-((ORD(i>0)-1)AND (2*i));
|
||||
//calculate digitcount
|
||||
IF n > 0 then
|
||||
l := trunc(ln(n)/ln(10))+1
|
||||
else
|
||||
l := 1;
|
||||
if l<3 then Begin write('got too few digits'); EXIT; end;
|
||||
If Not(ODD(l)) then Begin write('got even number of digits'); EXIT; end;
|
||||
result:= copy(IntToStr(n),l DIV 2,3);
|
||||
end;
|
||||
const
|
||||
Test : array [0..16] of NativeInt =
|
||||
( 123,12345,1234567,987654321,10001,-10001,
|
||||
-123,-100,100,-12345,1,2,-1,-10,2002,-2002,0);
|
||||
var
|
||||
i,n : NativeInt;
|
||||
Begin
|
||||
For i := low(Test) to High(Test) do
|
||||
Begin
|
||||
n := Test[i];
|
||||
writeln(n:9,': ',GetMid3dig(Test[i]));
|
||||
end;
|
||||
end.
|
||||
|
|
@ -0,0 +1 @@
|
|||
for [\~] ^10 { say "$_ => $()" if m/^^(\d+) <(\d**3)> (\d+) $$ <?{ $0.chars == $1.chars}> / }
|
||||
|
|
@ -1,17 +1,16 @@
|
|||
/*REXX program returns the three middle digits of a number (or an error msg).*/
|
||||
n= '123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345',
|
||||
'2 -1 -10 2002 -2002 0 abc 1e3 -17e-3 1234567. 1237654.00',
|
||||
'1234567890123456789012345678901234567890123456789012345678901234567'
|
||||
/*REXX program returns the three middle digits of a decimal number (or an error msg).*/
|
||||
n= '123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345',
|
||||
'+123 0123 2 -1 -10 2002 -2002 0 abc 1e3 -17e-3 1234567.',
|
||||
1237654.00 1234567890123456789012345678901234567890123456789012345678901234567
|
||||
|
||||
do j=1 for words(n); #=word(n,j) /* [↓] format the output number nicely*/
|
||||
say 'middle 3 digits of' right(z, max(15, length(#))) '──►' middle3(#)
|
||||
end /*j*/
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
middle3: procedure; parse arg x; numeric digits 1e6; er=' ***error!*** '
|
||||
if pos(.,x)\==0 then x=x/1 /*normalize it, contains decimal point.*/
|
||||
if datatype(x,'N') then x=abs(x); L=length(x)
|
||||
if \datatype(x,'W') then return er "argument isn't an integer."
|
||||
if L<3 then return er "argument is less than three digits."
|
||||
if L//2==0 then return er "argument isn't an odd number of digits."
|
||||
return substr(x, (L-3)%2+1, 3)
|
||||
do j=1 for words(n); #=word(n,j) /* [↓] format number for pretty output*/
|
||||
say 'middle 3 digits of' right(#, max(15, length(#) ) ) "──►" middle3(#)
|
||||
end /*j*/
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*──────────────────────────────────────────────────────────────────────────────────────*/
|
||||
middle3: procedure; parse arg x; numeric digits 1e6; er=' ***error*** '
|
||||
if datatype(x,'N') then x=abs(x)/1; L=length(x) /*use abs value; get length*/
|
||||
if \datatype(x,'W') then return er "argument isn't an integer."
|
||||
if L<3 then return er "argument is less than three digits."
|
||||
if L//2==0 then return er "argument isn't an odd number of digits."
|
||||
return substr(x, (L-3)%2+1, 3)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue