Self-describing numbers: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
No edit summary |
||
Line 1,061: | Line 1,061: | ||
42101000 |
42101000 |
||
521001000</pre> |
521001000</pre> |
||
=={{header|Delphi}}== |
|||
{{works with|Delphi|6.0}} |
|||
{{libheader|SysUtils,StdCtrls}} |
|||
<syntaxhighlight lang="Delphi"> |
|||
{This routine would normally be in a library. It is shown here for clarity.} |
|||
procedure GetDigitsRev(N: integer; var IA: TIntegerDynArray); |
|||
{Get an array of the integers in a number} |
|||
{Numbers returned from most to least significant} |
|||
var T,I,DC: integer; |
|||
begin |
|||
DC:=Trunc(Log10(N))+1; |
|||
SetLength(IA,DC); |
|||
for I:=DC-1 downto 0 do |
|||
begin |
|||
T:=N mod 10; |
|||
N:=N div 10; |
|||
IA[I]:=T; |
|||
end; |
|||
end; |
|||
function IsSelfDescribing(N: integer): boolean; |
|||
var IA: TIntegerDynArray; |
|||
var CA: array [0..9] of integer; |
|||
var I: integer; |
|||
begin |
|||
{Get digits, High-low order} |
|||
GetDigitsRev(N,IA); |
|||
for I:=0 to High(CA) do CA[I]:=0; |
|||
{Count number of each digit 0..9} |
|||
for I:=0 to High(IA) do |
|||
begin |
|||
CA[IA[I]]:=CA[IA[I]]+1; |
|||
end; |
|||
Result:=False; |
|||
{Compare original number with counts} |
|||
for I:=0 to High(IA) do |
|||
if IA[I]<>CA[I] then exit; |
|||
Result:=True; |
|||
end; |
|||
procedure SelfDescribingNumbers(Memo: TMemo); |
|||
var I: integer; |
|||
begin |
|||
for I:=0 to 100000000-1 do |
|||
if IsSelfDescribing(I) then |
|||
begin |
|||
Memo.Lines.Add(IntToStr(I)); |
|||
end; |
|||
end; |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
1210 |
|||
2020 |
|||
21200 |
|||
3211000 |
|||
42101000 |
|||
Elapsed Time: 23.584 Sec. |
|||
</pre> |
|||
=={{header|Elixir}}== |
=={{header|Elixir}}== |