Я в основном убежден, что есть ответ на эту проблему, но за всю мою жизнь не могу понять, как это сделать.
Допустим, у меня есть три набора:
A = [ 'foo', 'bar', 'baz', 'bah' ]
B = [ 'wibble', 'wobble', 'weeble' ]
C = [ 'nip', 'nop' ]
И я знаю, как рассчитать декартово / кросс-произведение (и оно распространяется повсеместно, на этом сайте и в других местах), поэтому я не буду это обсуждать здесь.
Мне нужен алгоритм, который позволил бы мне просто выбрать определенный элемент из декартового произведения без , генерируя весь набор или итерируя, пока я не достигну n-го элемента.
Конечно, я мог бы легко выполнить итерации для небольшого набора примеров, подобного этому, но код, над которым я работаю, будет работать с гораздо большими наборами.
Поэтому я ищу функцию, назовем ее «CP», где:
CP(1) == [ 'foo', 'wibble', 'nip' ]
CP(2) == [ 'foo', 'wibble', 'nop' ]
CP(3) == [ 'foo', 'wobble', 'nip' ]
CP(4) == [ 'foo', 'wobble', 'nop' ]
CP(5) == [ 'foo', 'weeble', 'nip' ]
CP(6) == [ 'foo', 'weeble', 'nop' ]
CP(7) == [ 'bar', 'wibble', 'nip' ]
...
CP(22) == [ 'bah', 'weeble', 'nop' ]
CP(23) == [ 'bah', 'wobble', 'nip' ]
CP(24) == [ 'bah', 'wobble', 'nop' ]
И ответ производится в O (1) раз, более или менее.
Я следовал идее, что должно быть возможно (черт возьми, даже просто!) Вычислить индексы элементов из A, B, C, которые я хочу, и затем просто вернуть их из исходных массивов, но мои попытки заставить эту работу работать правильно, пока что не сработали.
Я пишу на Perl, но могу легко перенести решение из Python, JavaScript или Java (и, возможно, нескольких других)