Cougar
April 15, 2023, 7:04pm
1
Given two Vector{Int64}
n
and b
shown below, I’m looking for a succinct and efficient way to build the 3×3 Matrix{String}
described …
top row is binary, octal, hexadecimal expansions of 321.
middle row is binary, octal, hexadecimal expansions of 111111.
bottom row is binary, octal, hexadecimal expansions of 10000001.
n::Vector{Int64} = [ 321, 111111, 10000001 ]
b::Vector{Int64} = [ 2, 8, 16 ]
#=
Goal: using n and b, create ...
3×3 Matrix{String}:
"101000001" "501" "141"
"11011001000000111" "331007" "1b207"
"100110001001011010000001" "46113201" "989681"
=#
If I were using Haskell, I’d consider currying something such as f = ((n,b)->string(n,base=2))
. Not sure if such is possible or advisable in Julia.
is this enough?
julia> Base._base.(b',n,1, false)
3×3 Matrix{String}:
"101000001" "501" "141"
"11011001000000111" "331007" "1b207"
"100110001001011010000001" "46113201" "989681"
I found this document, but I can’t get it to work without _
julia> Base._base.(b',n,Int(ceil(log(2,maximum(n)))), false)
3×3 Matrix{String}:
"000000000000000101000001" "000000000000000000000501" "000000000000000000000141"
"000000011011001000000111" "000000000000000000331007" "00000000000000000001b207"
"100110001001011010000001" "000000000000000046113201" "000000000000000000989681"
Cougar
April 15, 2023, 8:44pm
3
The URL you reference includes julia_v0.6.0
… is it of such an old version as to be out-of-date?
Dan
April 15, 2023, 8:51pm
4
Try:
julia> [ join(digits(x; base=y)) for x in n, y in b]
3×3 Matrix{String}:
"100000101" "105" "141"
"11100000010011011" "700133" "702111"
"100000010110100100011001" "10231164" "186989"
with n
and b
defined as in the previous posts in the thread. Note that it is always preferable not to use functions with _
prefix, as they are considered internal to modules.
Itried this way.
but in the case of hexadecimal digits greater than 9, it does not get the required form.
b=>11
and you also need to change the order
exa=(10:15) .=> 'a':'f'
[join(reverse(replace(digits(ni,base=bi),exa...))) for ni in n ,bi in b]
1 Like
Dan
April 15, 2023, 10:21pm
6
Thanks for the correction.
Although the right way to use digits
is awkward (and slower due to allocation), I still think it is better than _base
.
So a better way would be:
julia> [ string(x; base=y) for x in n, y in b ]
3×3 Matrix{String}:
"101000001" "501" "141"
"11011001000000111" "331007" "1b207"
"100110001001011010000001" "46113201" "989681"
(got this from searching source for _base
)
3 Likes
In order to be able to do string.(n, b')
, is this piracy?
import Base:string
string(n,b) = string(n; base=b)
string.(n, b')
Dan
April 15, 2023, 10:34pm
8
Use a different name, such as:
string_n_base(n,b) = string(n; base=b)
string_n_base.(n, b')
(and invent a new musical genre along the way)
1 Like
Cougar
April 16, 2023, 12:54pm
9
Dan:
string_n_base.(n, b')
This is the sort of thing that I sought. Thanks to all who replied.
Thanks @Dan , the conductor, loved the musical analogy.