Palindromic gapful numbers: Difference between revisions
→{{header|AppleScript}}: →Translation of Phix "Ludicrously fast …": 6.5-fold speed increase by dumping NSMutableDictionary altogether. Several minor tweaks and comment changes.
(→{{header|AppleScript}}: →Translation of Phix "Ludicrously fast …": 6.5-fold speed increase by dumping NSMutableDictionary altogether. Several minor tweaks and comment changes.) |
|||
Line 178:
===Translation of Phix "Ludicrously fast …"===
See [https://www.rosettacode.org/wiki/Palindromic_gapful_numbers#Ludicrously_fast_to_10.2C000.2C000.2C000.2C000.2C000.2C000th the original's] comments for an explanation of the logic. While this
<lang applescript>
-- It could be loaded as a library instead if there were any point in having such a library.
on getWorks()
script theWorks
▲ property outerDigit : missing value
▲ property searchLimit : missing value
property to_skip : missing value
property palcount : missing value
property skipd : {{}, {}, {}, {}, {}, {}, {}, {}, {}}
property
property
-- Work out
-- one or two instances of
--
on rmdr(
--
--
set
if (gap > -1) then set
return (
end rmdr
-- Recursively
--
-- Append text versions of any falling in the current keep range to the 'pals' list.
on palindromicGapfuls(lhs, gap, remainder)
-- lhs: eg {9, 4, 5} of a potential
-- gap: length of inner to be filled in
-- remainder: remainder
set shift to (count lhs) -- left shift
--
-- of the original dictionary's keys: (skipd) -> outermost digit -> shift -> gap -> remainder (+ 1).
-- The outermost digit element doesn't change during a search based on it, so the script property
-- 'skipdOuter' has
-- Populate it just enough here to ensure that the
end repeat▼
repeat (gap - (count
end
repeat (remainder + 1 - (count item gap of item shift of my skipdOuter)) times
end if▼
set skip to item (remainder + 1) of item gap of item shift of my skipdOuter
if ((skip is missing value) or (palcount + skip > to_skip)) then
set skip to 0
set nextGap to gap - 2
repeat with d from 0 to 9
set nextRem to (remainder + rmdr(d, nextGap, shift)) mod
if (gap > 2) then
set skip to skip + palindromicGapfuls(lhs & d, nextGap, nextRem)
else if (nextRem is 0) then
-- A palindrome of lhs's contents around gap ds would be … gapful.
set palcount to palcount + 1
if (palcount > to_skip) then
if (gap is 2) then set
▲ set item mid of template to d
else
set skip to skip + 1
end if
end if
if (palcount =
end repeat
if (palcount < to_skip) then
else
set palcount to palcount + skip
Line 264 ⟶ 255:
end palindromicGapfuls
--
-- call the recursive process for each palindrome width, and eventually return the stored numeric texts.
-- palindromic gapful numbers > 100 which begin and end with 'digit'.▼
on collect(
-- Initialise
set
set
set
set to_skip to searchLimit - keep▼
set palcount to 0
set
set
--
set
set
set astid to AppleScript's text item delimiters
set AppleScript's text item delimiters to "" -- For list-to-text coercions.
repeat until (palcount =
set remainder to rmdr(
palindromicGapfuls(lhs, gap, remainder)
set gap to gap + 1
Line 287 ⟶ 277:
set AppleScript's text item delimiters to astid
return
end collect
▲ end repeat
▲ end repeat
end script
return theWorks
end getWorks
(* Test code *)
-- Return an integer as text with the appropriate English ordinal suffix
on ordinalise(n)
-- Adapted from Victor Yee (adapted from NG (adapted from Jason Bourque) & Paul Skinner)
set units to n mod 10
if ((units > 3) or ((n - units) mod 100 is 10) or (units < 1) or (units mod 1 > 0)) then return (n as text) & "th"
return (n as text) & item units of {"st", "nd", "rd"}
end ordinalise
on doTask()
Line 310 ⟶ 301:
{1.0E+13, 1, 9, 9}, {1.0E+14, 1, 9, 9}, ¬
{1.0E+15, 1, 2, 4}}
-- set tests to {{20, 20, 1, 9}, {100, 15, 1, 9}, {1000, 10, 1, 9}} -- The
set output to {}
Line 317 ⟶ 308:
set AppleScript's text item delimiters to " "
repeat with i from 1 to (count tests)
set {
if (searchLimit = keep) then▼
set r to "First " & searchLimit▼
else if (keep > 1) then
set
▲ else
if ((keep = 1) and (firstOuter = lastOuter)) then
▲
else
set
end if
▲ set end of output to r & " palindromic gapful number" & s & t
▲ set end of output to theWorks's (collect(digit, searchLimit, keep)) as text
end repeat
end repeat
set AppleScript's text item delimiters to linefeed
set output to
set AppleScript's text item delimiters to astid
Line 346 ⟶ 339:
{{output}}
<pre style="font-size:80%">First 20 palindromic gapful numbers > 100 ending with digits from 1 to 9:
121 1001 1111 1221 1331 1441 1551 1661 1771 1881 1991 10901 11011 12221 13431 14641 15851 17171 18381 19591
242 2002 2112 2222 2332 2442 2552 2662 2772 2882 2992 20702 21912 22022 23232 24442 25652 26862 28182 29392
Line 357 ⟶ 350:
9009 9999 94149 99099 900009 909909 918819 927729 936639 945549 954459 963369 972279 981189 990099 999999 9459549 9508059 9557559 9606069
Last 15 of first 100 palindromic gapful numbers > 100 ending with digits from 1 to 9:
165561 166661 167761 168861 169961 170071 171171 172271 173371 174471 175571 176671 177771 178871 179971
265562 266662 267762 268862 269962 270072 271172 272272 273372 274472 275572 276672 277772 278872 279972
Line 368 ⟶ 361:
95311359 95400459 95499459 95588559 95677659 95766759 95855859 95944959 96033069 96122169 96211269 96300369 96399369 96488469 96577569
Last 10 of first 1000 palindromic gapful numbers > 100 ending with digits from 1 to 9:
17799771 17800871 17811871 17822871 17833871 17844871 17855871 17866871 17877871 17888871
27799772 27800872 27811872 27822872 27833872 27844872 27855872 27866872 27877872 27888872
Line 379 ⟶ 372:
9675005769 9675995769 9676886769 9677777769 9678668769 9679559769 9680440869 9681331869 9682222869 9683113869
Last 5 of first 10000 palindromic gapful numbers > 100 ending with digits from 1 to 9:
1787557871 1787667871 1787777871 1787887871 1787997871
2787557872 2787667872 2787777872 2787887872 2787997872
Line 390 ⟶ 383:
968697796869 968706607869 968715517869 968724427869 968733337869
100000th palindromic gapful
178788887871
278788887872
Line 401 ⟶ 394:
96878077087869
1000000th palindromic gapful
17878799787871
27878799787872
Line 412 ⟶ 405:
9687870990787869
10000000th palindromic gapful
1787878888787871
2787878888787872
Line 444 ⟶ 437:
96878787878786133168787878787869
1.0E+15th palindromic gapful
27878787878787888878787878787872
3087878787878783113878787878787803
|