Fondo
Una numeración de base b biyectiva , donde b es un número entero positivo, es una notación posicional biyectiva que utiliza símbolos b con valores asociados de 1 a b .
A diferencia de su contraparte no biyectiva, ningún símbolo tiene un valor de 0 . De esta manera, cada número entero no negativo n tiene una representación única en la base biyectiva b .
Las numeraciones biyectivas populares incluyen la base unitaria biyectiva 2 (utilizada en la codificación de longitud de ejecución de bzip2 ) y la base biyectiva 26 (utilizada para numerar columnas en hojas de cálculo).
Definición
En este desafío, definimos el conjunto M de símbolos como
123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz<=>
y una función i de M al número natural tal que i ('1') = 1, ..., i ('>') = 64 .
Dada una base b entre 1 y 64 (ambos inclusive), definimos que cada número entero no negativo n corresponde a la cadena a k ... a 0 , que consiste en símbolos de M , de modo que n = b k i (a k ) + … + B 0 i (a 0 ) .
Esta correspondencia está bien definida y es biyectiva. Como una suma vacía se define como 0 , el entero 0 puede codificarse como una cadena vacía.
Tarea
Acepte tres cadenas como entrada:
Una base de entrada b entre 1 y 64 , codificada como una cadena de base 64 biyectiva .
Un número entero no negativo n , codificado como una cadena de base b biyectiva .
Una base de salida B entre 1 y 64 , codificada como una cadena de base 64 biyectiva .
Dadas estas tres entradas, codifique n como una cadena B de base biyectiva .
Casos de prueba
Todos los casos de prueba especifican la entrada en el orden 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"
Reglas
Puede leer las tres cadenas en cualquier orden conveniente, como tal, una serie de cadenas, una representación de cadena de las mismas, concatenadas o separadas por delimitadores de un solo carácter de su elección.
Si elige imprimir la salida en STDOUT, solo puede imprimir los símbolos y (opcionalmente) una nueva línea final.
Se permiten conversiones de base incorporadas de todo tipo.
Aplican reglas estándar de código de golf .
fuente
Pip,
848078 bytesRepositorio de GitHub para Pip
Algoritmos adaptados del artículo de Wikipedia. Aquí está la explicación de una versión anterior un poco descuidada:
Ejecución de muestra:
fuente
Octava, 166 bytes
Versión multilínea:
En lugar de crear un mapa para convertir un carácter en un valor de índice, acabo de crear la tabla de búsqueda inversa
N
para valores ascii1..'z'
y la llené con los índices en los valores apropiados.polyval
evalúa la ecuaciónusando el valor de entrada convertido decimal como el vector de coeficientes
c
y la base original comox
. (Desafortunadamente, Octave'sbase2dec()
rechaza los símbolos fuera del rango normal).Una vez que tenemos el valor de entrada en la base 10, el cálculo del valor en la nueva base es sencillo.
Conductor de prueba:
Resultados:
fuente
Perl,
261248229 bytesmultilínea, mientras que los bucles sin golf:
t
es una función para analizar un número de una cadena de base biyectiva de una base dada.r
es una función para generar una cadena de base biyectiva de una base dada a partir de un número. Los 3 parámetros separados por comas se analizan a partir de stdin y las funciones se invocan según sea necesario.La conversión de un número positivo a una cadena de base biyectiva es similar a una base normal. Sin embargo, donde haría algo como esto para una base normal:
ajusta el mod para dar un rango de 1 a base en lugar de 0 a base - 1:
fuente
Python 2, ...
317307298311 bytesDefinitivamente golfable. Realmente odio cómo las cadenas no tienen asignación de elementos y las listas no
find
. Buscaré una mejor manera que mi solución rápida que tengo ahora.Mi método es convertir la entrada a un número decimal, luego a la base de salida, luego convertirla a la base biyectiva.
Editar : Descubrí que mi programa no funcionaba al convertir a Unary. Cuesta 13 bytes arreglarlo
e=F(o)<2
, etc.Pruébalo aquí
fuente
.index()
método. ¿Por qué no usar eso en lugar de buscar? Además, en lugar de guardarF(b)
yF(o)
en variables, solo las usa una vez, así que solo súbalas cuando sea necesario. Finalmente,'n'[2::5]
es más corto que''.join(n)
(reemplace los apóstrofes por backticks).Python 2, 167 bytes
No hay trucos especiales aquí realmente, excepto el
[2::5]
corte para obtener el conjunto de caracteres en un recuento de bytes más bajo.Pruebas:
fuente
CJam,
737069555148 bytesLa última versión utiliza el operador de conversión de base CJam para la conversión desde la base de origen, que no había pensado hasta que vi la solución de @ aditsu. También aplica un consejo reciente de @Dennis para construir la cadena de "dígitos" ( /codegolf//a/54348/32852 ), así como algunas otras ideas compartidas en el chat.
El formato de entrada es el valor, seguido de la base de origen y destino, con cada uno de ellos en una línea separada. Para la cadena vacía, deje la primera línea vacía. Entrada de ejemplo:
Pruébalo en línea
Explicación:
fuente
Jalea , 22 bytes
Pruébalo en línea!
fuente