Index finite lists of positive integers: Difference between revisions

Added Sidef
(→‎{{header|Kotlin}}: Updated example see https://github.com/dkandalov/rosettacode-kotlin for details)
(Added Sidef)
Line 654:
x = [1, 2, 3, 5, 8]
puts "#{x} => #{rank(x)} => #{unrank(rank(x))}"</lang>
{{out}}
<pre>
0 : [] : 0
1 : [0] : 1
2 : [0, 0] : 2
3 : [1] : 3
4 : [0, 0, 0] : 4
5 : [0, 1] : 5
6 : [1, 0] : 6
7 : [2] : 7
8 : [0, 0, 0, 0] : 8
9 : [0, 0, 1] : 9
10 : [0, 1, 0] : 10
 
[1, 2, 3, 5, 8] => 14401279 => [1, 2, 3, 5, 8]
</pre>
 
=={{header|Sidef}}==
{{trans|Ruby}}
<lang ruby>func rank(Array arr) {
Number(arr.join('a'), 11)
}
 
func unrank(Number n) {
n.base(11).split('a').map { Num(_) }
}
 
var l = [1, 2, 3, 10, 100, 987654321]
say l
var n = rank(l)
say n
var l = unrank(n)
say l</lang>
{{out}}
<pre>
[1, 2, 3, 10, 100, 987654321]
14307647611639042485573
[1, 2, 3, 10, 100, 987654321]
</pre>
 
'''Bijection:'''
<lang ruby>func unrank(Number n) {
n == 1 ? [0]
: n.base(2).substr(1).split('0', -1).map{.len}
}
 
func rank(Array x) {
x.is_empty ? 0
: Number('1' + x.map { '1' * _ }.join('0'), 2)
}
 
for x in (0..10) {
printf("%3d : %-18s: %d\n", x, unrank(x), rank(unrank(x)))
}
 
say ''
var x = [1, 2, 3, 5, 8]
say "#{x} => #{rank(x)} => #{unrank(rank(x))}"</lang>
{{out}}
<pre>
2,747

edits