Вот ещё дурацкая задачка.
На вход подаются десятичные натуральные числа от

до

, которые преобразуются в двоичное число длины

, в котором по заданному правилу переставляются цифры, что в конце концов преобразуется в десятичное число.
Код:
{ln=12;
vc=[3,6,5,7,1,11,9,12,2,4,8,10];
foreach( [0,1,13,24,577,4000],n,
vd=digits(n,2); printf("%5d: %d\n ",n,vd);
vd1=vector( ln,i, if (vc[i]>#vd, 0, vd[vc[i]]) );
printf(" %d to %d\n", vd1,fromdigits(vd1,2) );
)}
0: []
[0,0,0,0,0,0,0,0,0,0,0,0] to 0
1: [1]
[0,0,0,0,1,0,0,0,0,0,0,0] to 128
13: [1,1,0,1]
[0,0,0,0,1,0,0,0,1,1,0,0] to 140
24: [1,1,0,0,0]
[0,0,0,0,1,0,0,0,1,0,0,0] to 136
577: [1,0,0,1,0,0,0,0,0,1]
[0,0,0,0,1,0,0,0,0,1,0,1] to 133
4000: [1,1,1,1,1,0,1,0,0,0,0,0]
[1,0,1,1,1,0,0,0,1,1,0,0] to 2956
Вот как то так вроде бы работает. Перестановка задаётся вектором vc одна на все числа.Предполагается, что всё задано корректно.
Нет ли более простого подхода?