Numbers with same digit set in base 10 and base 16
- Task
Find decimal numbers n that when converted to hexadecimal produce a number that uses the same set of digits (regardless of order and ignoring duplicates) as the original number, where n < 100000
For example, the decimal number 2339 is 923 when written in hex. The set of digits used, ignoring order and duplicates, is {2, 3, 9} in both cases and hence this number satisfies the task requirements.
Factor
<lang factor>USING: formatting grouping io kernel math.parser present sequences sets ;
100,000 <iota> [ dup present swap >hex set= ] filter 10 group [ [ "%5d " printf ] each nl ] each</lang>
- Output:
0 1 2 3 4 5 6 7 8 9 53 371 913 1040 2080 2339 4100 5141 5412 5441 6182 8200 9241 13593 13665 13969 16406 20530 26946 30979 32803 33638 33840 33841 33842 33843 33844 33845 33846 33847 33848 33849 34883 37943 38931 38966 38995 66310 71444 71497 71511 75120 75121 75122 75123 75124 75125 75126 75127 75128 75129 75621 86150 88165 91465 91769 96617 98711 99481
Julia
<lang Julia>using Combinatorics
dheq(N) = [i for i in 0:N for p in permutations(digits(i)) if evalpoly(16, reverse(p)) == i]
foreach(p -> print(rpad(p[2], 6), p[1] % 10 == 0 ? "\n" : ""), enumerate(dheq(100000)))
</lang>
- Output:
0 1 2 3 4 5 6 7 8 9 53 371 913 1040 1040 1041 1041 1042 1043 1044 1044 1045 1046 1047 1048 1049 2080 2080 2081 2082 2082 2083 2084 2085 2086 2087 2088 2088 2089 4100 4100 5141 5141 5412 6182 8200 8200 9241 20530 20530 21025 21025 26930 75120 75121 75121 75122 75122 75123 75124 75125 75125 75126 75127 75127 75128 75129 75621 86150 91465 98711 98711 99481 99481
Phix
function handusc(integer n) return unique(sprintf("%x",n))=unique(sprintf("%d",n)) end function ?shorten(filter(tagset(100000,0),handusc),"found",10)
- Output:
{0,1,2,3,4,5,6,7,8,9,"...",75128,75129,75621,86150,88165,91465,91769,96617,98711,99481," (69 found)"}
Raku
Much is left open to interpretation.
Numbers which when expressed in decimal and in hexadecimal are composed of the same digit glyphs. <lang perl6>say (^100000).hyper(:5000batch).grep( { [eqv] ($_, .fmt: '%x').map( *.comb.Bag ) } ).batch(10)».fmt('%5d').join("\n")</lang>
- Output:
0 1 2 3 4 5 6 7 8 9 53 371 913 4100 5141 5412 6182 8200 9241 75120 75121 75122 75123 75124 75125 75126 75127 75128 75129 75621 86150 91465 98711 99481
Numbers which when expressed in decimal and in hexadecimal are composed from the same digit glyphs. <lang perl6>say (^100000).hyper(:5000batch).grep( { [eqv] ($_, .fmt: '%x').map( *.comb.Set ) } ).batch(10)».fmt('%5d').join("\n")</lang>
- Output:
0 1 2 3 4 5 6 7 8 9 53 371 913 1040 2080 2339 4100 5141 5412 5441 6182 8200 9241 13593 13665 13969 16406 20530 26946 30979 32803 33638 33840 33841 33842 33843 33844 33845 33846 33847 33848 33849 34883 37943 38931 38966 38995 66310 71444 71497 71511 75120 75121 75122 75123 75124 75125 75126 75127 75128 75129 75621 86150 88165 91465 91769 96617 98711 99481
Ring
<lang ring> see "working..." + nl
row = 0 limit = 100000
for n = 0 to limit
flag1 = 1 flag2 = 1 decStr = string(n) hexStr = hex(n) for m = 1 to len(decStr) ind = substr(hexStr,decStr[m]) if ind < 1 flag1 = 0 exit ok next for p = 1 to len(hexStr) ind = substr(decStr,hexStr[p]) if ind < 1 flag2 = 0 exit ok next if flag1 = 1 and flag2 = 1 row = row + 1 see "" + n + " " if row%5 = 0 see nl ok ok
next
see nl + "Found " + row + " numbers" + nl see "done..." + nl </lang>
- Output:
working... 0 1 2 3 4 5 6 7 8 9 53 371 913 1040 2080 2339 4100 5141 5412 5441 6182 8200 9241 13593 13665 13969 16406 20530 26946 30979 32803 33638 33840 33841 33842 33843 33844 33845 33846 33847 33848 33849 34883 37943 38931 38966 38995 66310 71444 71497 71511 75120 75121 75122 75123 75124 75125 75126 75127 75128 75129 75621 86150 88165 91465 91769 96617 98711 99481 Found 69 numbers done...
Wren
<lang ecmascript>import "/fmt" for Conv, Fmt import "/set" for Set
var limit = 1e5 var count = 0 System.print("Numbers under 100,000 which use the same digits in decimal or hex:") for (n in 0...limit) {
var h = Conv.hex(n) var hs = Set.new(h) var ns = Set.new(n.toString) if (hs == ns) { count = count + 1 Fmt.write("$,6d ", n) if (count % 10 == 0) System.print() }
} System.print("\n\n%(count) such numbers found.")</lang>
- Output:
Numbers under 100,000 which use the same digits in decimal or hex: 0 1 2 3 4 5 6 7 8 9 53 371 913 1,040 2,080 2,339 4,100 5,141 5,412 5,441 6,182 8,200 9,241 13,593 13,665 13,969 16,406 20,530 26,946 30,979 32,803 33,638 33,840 33,841 33,842 33,843 33,844 33,845 33,846 33,847 33,848 33,849 34,883 37,943 38,931 38,966 38,995 66,310 71,444 71,497 71,511 75,120 75,121 75,122 75,123 75,124 75,125 75,126 75,127 75,128 75,129 75,621 86,150 88,165 91,465 91,769 96,617 98,711 99,481 69 such numbers found.
XPL0
<lang XPL0>func DigitSet(N, D); \Return a bit array containing the set of digits in N divisible by D int N, D; int Set; [Set:= 0; repeat N:= N/D;
Set:= Set or 1<<rem(0);
until N=0; return Set; ];
int Count, N; [Count:= 0; for N:= 0 to 99999 do
[if DigitSet(N,10) = DigitSet(N,16) then [IntOut(0, N); Count:= Count+1; if rem(Count/10) = 0 then CrLf(0) else ChOut(0, 9\tab\); ]; ];
CrLf(0); IntOut(0, Count); Text(0, " such numbers found. ") ]</lang>
- Output:
0 1 2 3 4 5 6 7 8 9 53 371 913 1040 2080 2339 4100 5141 5412 5441 6182 8200 9241 13593 13665 13969 16406 20530 26946 30979 32803 33638 33840 33841 33842 33843 33844 33845 33846 33847 33848 33849 34883 37943 38931 38966 38995 66310 71444 71497 71511 75120 75121 75122 75123 75124 75125 75126 75127 75128 75129 75621 86150 88165 91465 91769 96617 98711 99481 69 such numbers found.