fundo
A numeração bijetiva da base b , onde b é um número inteiro positivo, é uma notação posicional bijetiva que utiliza símbolos b com valores associados de 1 a b .
Diferentemente de sua contraparte não-bijetiva, nenhum símbolo tem o valor 0 . Dessa forma, cada número inteiro não negativo n tem uma representação exclusiva na base bijetiva b .
As numerações bijetivas populares incluem a base bijetiva unária 2 (usada na codificação de comprimento de execução do bzip2 ) e a base bijetiva 26 (usada para numerar colunas em planilhas).
Definição
Neste desafio, definimos o conjunto M de símbolos como
123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz<=>
e uma função i de M para o número natural tal que i ('1') = 1,…, i ('>') = 64 .
Dada uma base b entre 1 e 64 (ambos inclusive), definimos que cada número inteiro não negativo n corresponde à sequência a k … a 0 , composta por símbolos de M , de modo que n = b k i (a k ) + … + B 0 i (a 0 ) .
Essa correspondência é bem definida e bijetiva. Como uma soma vazia é definida como 0 , o número inteiro 0 pode ser codificado como uma sequência vazia.
Tarefa
Aceite três strings como entrada:
Uma base de entrada b entre 1 e 64 , codificada como uma sequência 64 de base bijetiva .
Um número inteiro não negativo n , codificado como uma sequência bijetiva de base b .
Uma base de saída B entre 1 e 64 , codificada como uma sequência 64 de base bijetiva .
Dadas essas três entradas, codifique n como uma seqüência B de base bijetiva .
Casos de teste
Todos os casos de teste especificar a entrada na ordem b , n , B .
Input: "4" "" "8"
Output: ""
Input: "A" "16" "2"
Output: "1112"
Input: "2" "122" "A"
Output: "A"
Input: "3" "31" "1"
Output: "1111111111"
Input: ">" "Fe" "a"
Output: "RS"
Regras
Você pode ler as três strings em qualquer ordem conveniente, como tal, uma matriz de strings, uma representação de strings, concatenada ou separada por delimitadores de caractere único de sua escolha.
Se você optar por imprimir a saída em STDOUT, poderá imprimir apenas os símbolos e (opcionalmente) uma nova linha à direita.
Todos os tipos de conversão de base são permitidos.
Aplicam-se as regras de código-golfe padrão .
fonte
Pip,
848078 bytesRepositório do GitHub para Pip
Algoritmos adaptados do artigo da Wikipedia. Aqui está a explicação para uma versão anterior levemente não destruída:
Exemplo de execução:
fonte
Oitava, 166 bytes
Versão multilinhas:
Em vez de criar um mapa para converter um caractere em um valor de índice, criei a tabela de pesquisa inversa
N
para valores ascii1..'z'
e a preenchi com os índices nos valores apropriados.polyval
avalia a equaçãousando o valor de entrada convertido decimal como o vetor de coeficientes
c
e a base original comox
. (Infelizmente, o Octavebase2dec()
rejeita símbolos fora do intervalo normal.)Depois de termos o valor de entrada na base 10, o cálculo do valor na nova base é direto.
Driver de teste:
Resultados:
fonte
Perl,
261248229 bytesvárias linhas, enquanto os loops não foram destruídos:
t
é uma função para analisar um número de uma cadeia de base bijetiva de uma determinada base.r
é uma função para gerar uma cadeia de base bijetiva de uma determinada base a partir de um número. Os três parâmetros separados por vírgula são analisados a partir de stdin e as funções são chamadas conforme necessário.A conversão de um número positivo em uma cadeia de base bijetiva é semelhante a uma base normal. No entanto, onde você faria algo assim para uma base normal:
você ajusta o mod para dar um intervalo de 1 a base em vez de 0 a base - 1:
fonte
Python 2, ...
317307298311 bytesDefinitivamente jogável. Eu realmente odeio como as strings não têm atribuição de itens e as listas não
find
. Vou procurar uma maneira melhor do que minha solução rápida que tenho agora.Meu método é converter a entrada em um número decimal, depois na base de saída e depois convertê-la na base bijetiva.
Edit : Verificou que meu programa não funcionava ao converter para Unary. Custou 13 bytes para corrigir
e=F(o)<2
, etc.Experimente aqui
fonte
.index()
método .. Por que não usá-lo em vez de encontrar? Além disso, em vez de salvarF(b)
eF(o)
nas variáveis, você as usa apenas uma vez, então apenas as submeta onde for necessário. Por fim,'n'[2::5]
é mais curto que''.join(n)
(substitua apóstrofos por retângulos).Python 2, 167 bytes
Não há truques especiais aqui, exceto o
[2::5]
fatiamento para obter o conjunto de caracteres com uma contagem de bytes mais baixa.Testes:
fonte
CJam,
737069555148 bytesA versão mais recente usa o operador de conversão de base CJam para a conversão da base de origem, que eu não pensava até ver a solução do @ aditsu. Também aplica uma dica recente de @Dennis para a construção da string "digit" ( /codegolf//a/54348/32852 ), além de outras idéias compartilhadas no bate-papo.
Formato de entrada é o valor, seguido pela base de origem e destino, com cada um deles em uma linha separada. Para a sequência vazia, deixe a primeira linha vazia. Exemplo de entrada:
Experimente online
Explicação:
fonte
Gelatina , 22 bytes
Experimente online!
fonte