Index finite lists of positive integers: Difference between revisions

Line 569:
10 -> [1, 1] -> 10
</pre>
 
=={{header|Nim}}==
{{trans|Go}}
{{libheader|bignum}}
<lang Nim>import strformat, strutils
import bignum
 
func rank(list: openArray[uint]): Int =
result = newInt(0)
for n in list:
result = result shl (n + 1)
result = result.setBit(n)
 
func unrank(n: Int): seq[uint] =
var m = n.clone
var a = if m.isZero: 0u else: m.bitLen.uint
while a > 0:
m = m.clearBit(a - 1)
let b = if m.isZero: 0u else: m.bitLen.uint
result.add(a - b - 1)
a = b
 
when isMainModule:
 
var b: Int
for i in 0..10:
b = newInt(i)
let u = b.unrank()
let r = u.rank()
echo &"{i:2d} {u:>9s} {r:>2s}"
 
b = newInt("12345678901234567890")
let u = b.unrank()
let r = u.rank()
echo &"\n{b}\n{u}\n{r}"</lang>
 
{{out}}
<pre> 0 @[] 0
1 @[0] 1
2 @[1] 2
3 @[0, 0] 3
4 @[2] 4
5 @[1, 0] 5
6 @[0, 1] 6
7 @[0, 0, 0] 7
8 @[3] 8
9 @[2, 0] 9
10 @[1, 1] 10
 
12345678901234567890
@[1, 1, 1, 0, 1, 1, 1, 2, 1, 1, 2, 0, 3, 0, 2, 0, 0, 1, 1, 0, 3, 0, 0, 0, 0, 4, 1, 1, 0, 1, 2, 1]
12345678901234567890</pre>
 
=={{header|Perl}}==
Anonymous user