Data update

This commit is contained in:
Ingy döt Net 2026-04-30 12:34:36 -04:00
parent 4bb20c9b71
commit cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions

View file

@ -0,0 +1,43 @@
with Ada.Text_IO;
procedure Middle_Three_Digits is
Impossible: exception;
function Middle_String(I: Integer; Middle_Size: Positive) return String is
S: constant String := Integer'Image(I);
First: Natural := S'First;
Full_Size, Border: Natural;
begin
while S(First) not in '0' .. '9' loop -- skip leading blanks and minus
First := First + 1;
end loop;
Full_Size := S'Last-First+1;
if (Full_Size < Middle_Size) or (Full_Size mod 2 = 0) then
raise Impossible;
else
Border := (Full_Size - Middle_Size)/2;
return S(First+Border .. First+Border+Middle_Size-1);
end if;
end Middle_String;
Inputs: array(Positive range <>) of Integer :=
(123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345,
1, 2, -1, -10, 2002, -2002, 0);
Error_Message: constant String := "number of digits must be >= 3 and odd";
package IIO is new Ada.Text_IO.Integer_IO(Integer);
begin
for I in Inputs'Range loop
IIO.Put(Inputs(I), Width => 9);
Ada.Text_IO.Put(": ");
begin
Ada.Text_IO.Put(Middle_String(Inputs(I), 3));
exception
when Impossible => Ada.Text_IO.Put("****" & Error_Message & "****");
end;
Ada.Text_IO.New_Line;
end loop;
end Middle_Three_Digits;

View file

@ -0,0 +1,15 @@
(import std.Math)
(import std.String)
(let middle_three_digits (fun (i) {
(let s (toString (math:abs i)))
(if (and (math:odd (len s)) (>= (len s) 3))
(string:slice s (- (/ (len s) 2) 1) 3)
"Need odd and at least 3 digits") }))
(import std.List :forEach)
(forEach [123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345]
(fun (x) (print (middle_three_digits x))))
(forEach [1 2 -1 -10 2002 -2002 0]
(fun (x) (print (middle_three_digits x))))

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,23 @@
struct Int
def mtd
n = self.abs
raise "Not enough digits" unless n >= 100
ds = n.digits
raise "Even digits" unless ds.size.odd?
ds[ds.size // 2 - 1, 3].reverse
end
end
puts "Should succeed:"
[123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345].each do |n|
printf "%10d: %s\n", n, n.mtd
end
puts "Should fail:"
[1, 2, -1, -10, 2002, -2002, 0].each do |n|
printf "%10d: ", n
begin
puts n.mtd
rescue ex
puts ex.message
end
end

View file

@ -0,0 +1,19 @@
local fmt = require "fmt"
local function middle3(n)
if n < 0 then n = -n end
local s = tostring(n)
local c = #s
if c < 3 then return $"Minimum is 3 digits, only has {c}." end
if c % 2 == 0 then return $"Number of digits must be odd, {c} is even." end
if c == 3 then return s end
local d = (c - 1) / 2
return s:sub(d, d + 2)
end
local a = {123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345,
1, 2, -1, -10, 2002, -2002, 0}
for a as e do
fmt.print("%9d -> %s", e, middle3(e))
end

View file

@ -0,0 +1,24 @@
function middle3($inp){
$str = [Math]::abs($inp)
$leng = "$str".length
if ($leng -lt 3){
Write-host $inp": [ERROR] too short."
Return
}
if (($leng % 2) -eq 0){
Write-host $inp": [ERROR] even number of digits."
} else {
$trimmer = ($leng - 3) / 2
$ans = "$str".subString($trimmer,3)
Write-host $inp": $ans"
}
Return
}
$sample = 123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345, 1, 2, -1, -10, 2002, -2002, 0
foreach ($x in $sample){middle3 $x}

View file

@ -0,0 +1,36 @@
#Simple method
options(scipen=99)
middle3digits <- function(n){
s <- abs(n) |> as.character()
k <- nchar(s)
if(k<3) stop("not enough digits")
if(k%%2==0) stop("even number of digits")
substr(s, (k-1)/2, (k+3)/2)
}
#Alternate method without disabling scientific notation
numdigits <- function(n) ifelse(log10(n)%%1==0,
1+log10(n),
ceiling(log10(n)))
middle3digits <- function(n){
n <- abs(n)
k <- numdigits(n)
if(k<3|is.na(k)) stop("not enough digits")
if(k%%2==0) stop("even number of digits")
pow10 <- 10^((k-3)/2)
mid <- (n%/%pow10)%%1000
if(mid<100){
mid <- as.character(mid)
mid_pad <- paste0(c(rep(0, 3-nchar(mid)), mid), collapse="")
return(mid_pad)
}
return(as.character(mid))
}
#Testing examples
test_nums <- c(123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345)
test_errors <- c(1, 2, -1, -10, 2002, -2002, 0)
cat(sapply(test_nums, middle3digits))
for(n in test_errors) try(middle3digits(n))

View file

@ -1,14 +0,0 @@
proc middleThree n {
if {$n < 0} {
set n [expr {-$n}]
}
set idx [expr {[string length $n] - 2}]
if {$idx % 2 == 0} {
error "no middle three digits: input is of even length"
}
if {$idx < 1} {
error "no middle three digits: insufficient digits"
}
set idx [expr {$idx / 2}]
string range $n $idx [expr {$idx+2}]
}

View file

@ -1,12 +0,0 @@
foreach n {
123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345
1 2 -1 -10 2002 -2002 0
} {
if {[catch {
set mid [middleThree $n]
} msg]} then {
puts "error for ${n}: $msg"
} else {
puts "found for ${n}: $mid"
}
}

View file

@ -0,0 +1,91 @@
#!/usr/bin/env tclsh
# output middle 3 digits or error
# good integers
set good {123 12345 1234567 987654321 10001 -10001 -123 -100 100 -12345}
# bad integers
set bad {doggy 1 2 -1 -10 2002 -2002 0}
proc middle_3 {num} {
# error messages
array set error {
notint {(not an integer)}
short {(number < 3 digits)}
even {(even number of digits)}
zero {(zero length entry)}
{unknown} {(unknown error)}
}
set err 0
# must be integer
if { ! [string is integer $num] } {
set err 1
set errstr $error(notint)
}
# work with positive val
if { $num < 0 } { set num [expr {abs($num)} ] }
# how many digits
set dlen [string length $num]
if {$dlen < 3} {
set err 1
set errstr $error(short)
}
if {$dlen % 2 == 0} {
set err 1
set errstr $error(even)
}
if {$err} {
# " (err)"
set output [format "%*s%s" 10 "" "$errstr"]
} else {
# split into list of each letter
set letters [split $num ""]
# middle of list
set mid [expr {$dlen / 2}]
# get 3 in the middle
set a [lindex $letters [expr {$mid-1} ] ]
set b [lindex $letters [expr {$mid} ] ]
set c [lindex $letters [expr {$mid+1} ] ]
# " 123"
set output [format "%*s%d" 10 "" "$a$b$c"]
}
return $output
}
# start here
puts stdout "test good list:\n"
puts stdout "${good}"
foreach num $good {
set n [middle_3 $num ]
puts stdout "$num:\t$n"
}
puts ""
puts stdout "test bad list:\n"
puts stdout "${bad}"
foreach num $bad {
set n [middle_3 $num ]
puts stdout "$num:\t$n"
}

View file

@ -1,8 +1,8 @@
[123 12345 1234567 987654321 10001 ¯10001 ¯123 ¯100 100 ¯12345
1 2 ¯1 ¯10 2002 ¯2002 0]
[ 123 12345 1234567 987654321 10001 ¯10001 ¯123 ¯100 100 ¯12345
1 2 ¯1 ¯10 2002 ¯2002 0]
Mid ← (
("too short")≥3.⧻.°□°⋕⌵
("even length")≠0◿2.
"too short"⊸≥3⊸⧻°⋕⌵
⍤"even length"≠0◿2
↘¯⟜↘⌊÷2-3
)
⍉⊟⟜≡⍚⍣(Mid|⊂"Error: "◌) # Convert each

View file

@ -1,21 +1,17 @@
import math
const
(
valid = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345]
invalid = [1, 2, -1, -10, 2002, -2002, 0]
)
const valid = [123, 12345, 1234567, 987654321, 10001, -10001, -123, -100, 100, -12345]
const invalid = [1, 2, -1, -10, 2002, -2002, 0]
fn main() {
for elem in valid {println(middle(elem))}
for elem in invalid {println(middle(elem))}
for elem in valid { println(middle(elem)) }
for elem in invalid { println(middle(elem)) }
}
fn middle(num int) string {
mut strip := math.abs(num).str()
if strip.len < 3 {return 'Error: $num has less than 3 digits'}
if strip.len % 2 == 0 {return 'Error: $num has an even number of digits'}
if strip.len < 3 { return "Error: $num has less than 3 digits" }
if strip.len % 2 == 0 { return "Error: $num has an even number of digits" }
start := (strip.len / 2) - 1
return strip.substr(start, start + 3)
}

View file

@ -0,0 +1,21 @@
'http://rosettacode.org/wiki/Middle_three_digits
Function mid3n(n)
'Remove the number's sign.
n = CStr(Abs(n))
If Len(n) < 3 Or Len(n) Mod 2 = 0 Then
mid3n = "Invalid: Either the length of n < 3 or an even number."
ElseIf Round(Len(n)/2) > Len(n)/2 Then
mid3n = Mid(n,Round(Len(n)/2)-1,3)
Else
mid3n = Mid(n,Round(Len(n)/2),3)
End If
End Function
'Calling the function.
arrn = Array(123,12345,1234567,987654321,10001,-10001,-123,-100,100,-12345,_
1,2,-1,-10,2002,-2002,0)
For Each n In arrn
WScript.StdOut.Write n & ": " & mid3n(n)
WScript.StdOut.WriteLine
Next