Как эффективно вычислить биективную цифру base-k (и / или ее обратную) в R или любом другом свободно доступном языке программирования? - PullRequest
0 голосов
/ 04 февраля 2019

Хотя на этот вопрос уже есть частичные ответы в StackOverflow , эти ответы не связаны с вопросами, которые имеют собственное название процесса / концепции ( биективная (base-k) нумерация ) в заголовке или среди тегов.Я ожидаю, что многие ответы по существу будут ссылками на эти существующие ответы.

На этот вопрос частично дан ответ в Как перечислить от A до Z в PHP, а затем перейти к AA, AB, AC и т. Д.

Биективная нумерация base-26 может использоваться для вычисления идентификаторов столбцов в схеме, используемой во многих программах для работы с электронными таблицами, таких как LibreOffice Calc , Lotus-123, VisiCalc (я думаю), ProCalc 3D и другие.

Ниже приведен R псевдокод (я не пока , включая«сырой» R-код для зависимостей) для одного решения.Возвращаемое значение представляет собой целочисленный вектор ( little endian ), элементы которого концептуально сопоставляются с произвольными символами, используемыми для представления биективной нумерации:

bijective.numeral <- function(n, symbols=26L) {
    if (!is_among.contiguous.integers(n)) return (NULL)
    if (n  < 0) return(iNA)
    if (n == 0) return(integer())
    intermediate <- pseudo.log(n, symbols) %|% integer
            # PREALLOCATE A VECTOR LONG ENOUGH FOR THE RESULT
    m <- 0L
    while (n) {
        m <- 1L + m
        intermediate[[m]] <- 1:symbols %[mod% n
        n <- n %|% pred %/% symbols }
    intermediate[1:m] }

LETTERS[16384 %|% bijective.numeral] %|% rev %|% `%//%`

# [1] "XFD"
...