65 lines
2.2 KiB
AppleScript
65 lines
2.2 KiB
AppleScript
on isArithmetic(n)
|
|
if (n < 4) then
|
|
if (n < 0) then return {arithmetic:false, composite:missing value}
|
|
return {arithmetic:(n mod 2 = 1), composite:false}
|
|
end if
|
|
set factorSum to 1 + n
|
|
set factorCount to 2
|
|
set sqrt to n ^ 0.5
|
|
set limit to sqrt div 1
|
|
if (limit = sqrt) then
|
|
set factorSum to factorSum + limit
|
|
set factorCount to 3
|
|
set limit to limit - 1
|
|
end if
|
|
repeat with i from 2 to limit
|
|
if (n mod i = 0) then
|
|
set factorSum to factorSum + i + n div i
|
|
set factorCount to factorCount + 2
|
|
end if
|
|
end repeat
|
|
|
|
return {arithmetic:(factorSum mod factorCount = 0), composite:(factorCount > 2)}
|
|
end isArithmetic
|
|
|
|
on task()
|
|
set output to {linefeed & "The first 100 arithmetic numbers are:"}
|
|
set {n, hitCount, compositeCount, pad} to {0, 0, 0, " "}
|
|
repeat 10 times
|
|
set row to {}
|
|
set targetCount to hitCount + 10
|
|
repeat until (hitCount = targetCount)
|
|
set n to n + 1
|
|
tell isArithmetic(n) to if (its arithmetic) then
|
|
set hitCount to hitCount + 1
|
|
if (its composite) then set compositeCount to compositeCount + 1
|
|
set row's end to text -4 thru -1 of (pad & n)
|
|
end if
|
|
end repeat
|
|
set output's end to join(row, "")
|
|
end repeat
|
|
repeat with targetCount in {1000, 10000, 100000, 1000000}
|
|
repeat while (hitCount < targetCount)
|
|
set n to n + 1
|
|
tell isArithmetic(n) to if (its arithmetic) then
|
|
set hitCount to hitCount + 1
|
|
if (its composite) then set compositeCount to compositeCount + 1
|
|
end if
|
|
end repeat
|
|
set output's end to (linefeed & "The " & targetCount & "th arithmetic number is " & n) & ¬
|
|
(linefeed & "(" & compositeCount & " composite numbers up to here)")
|
|
end repeat
|
|
|
|
return join(output, linefeed)
|
|
end task
|
|
|
|
on join(lst, delim)
|
|
set astid to AppleScript's text item delimiters
|
|
set AppleScript's text item delimiters to delim
|
|
set txt to lst as text
|
|
set AppleScript's text item delimiters to astid
|
|
return txt
|
|
end join
|
|
|
|
task()
|