Cree una rutina que tome una matriz de bloques en un sistema base numérico y conviértala en una matriz de bloques en otro sistema base numérico. Los sistemas from y to son arbitrarios y deben aceptarse como parámetro. La matriz de entrada puede tener una longitud arbitraria (si usa un lenguaje donde las longitudes de la matriz no se almacenan con la matriz, como C, se debe pasar un parámetro de longitud a la función).
Así es como debería funcionar:
fromArray = [1, 1]
fromBase = 256
toBase = 16
result = convertBase(fromArray, fromBase, toBase);
Lo que debería devolver [0, 1, 0, 1]
o posiblemente [1, 0, 1]
(los 0
s iniciales son opcionales ya que no cambian el valor de la respuesta).
Aquí hay algunos vectores de prueba:
Vector de prueba de identidad
fromArray = [1, 2, 3, 4] fromBase = 16 toBase = 16 result = [1, 2, 3, 4]
Vector de prueba trivial
fromArray = [1, 0] fromBase = 10 toBase = 100 result = [10]
Vector de gran prueba
fromArray = [41, 15, 156, 123, 254, 156, 141, 2, 24] fromBase = 256 toBase = 16 result = [2, 9, 0, 15, 9, 12, 7, 11, 15, 14, 9, 12, 8, 13, 0, 2, 1, 8]
Vector de prueba realmente grande
fromArray = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] fromBase = 2 toBase = 10 result = [1, 2, 3, 7, 9, 4, 0, 0, 3, 9, 2, 8, 5, 3, 8, 0, 2, 7, 4, 8, 9, 9, 1, 2, 4, 2, 2, 3]
Vector base no uniforme
fromArray = [41, 42, 43] fromBase = 256 toBase = 36 result = [1, 21, 29, 22, 3]
Otros criterios / reglas:
Todas las variables enteras deben caber dentro de un entero con signo estándar de 32 bits para todos los rangos de entrada sanos.
Puede convertir a una representación intermedia, siempre que el intermediario no sea más que una matriz de enteros con signo de 32 bits.
Espere manejar bases del 2 al 256. No hay necesidad de soportar bases más altas que eso (pero si lo desea, por supuesto).
Espere manejar tamaños de entrada y salida de al menos hasta 1000 elementos. Una solución que se escala a 2 ^ 32-1 elementos sería mejor, pero 1000 está bien.
No se trata necesariamente de tener el código más corto que cumpla con estas reglas. Se trata de tener el código más limpio y elegante.
Ahora, esto no es exactamente trivial, por lo que una respuesta que casi funciona podría ser aceptada.
fuente
Respuestas:
Pitón
fuente
Aquí hay una solución Haskell
Y ejecutando las pruebas de la pregunta:
fuente
R
Maneja muchos miles de elementos * en menos de un minuto.
* para> 500 elementos, debe elevar el nivel de recursión predeterminado o no restablecer la
mm
matriz endothelocomotion()
Ejemplos:
fuente
Una versión de JavaScript menos ofuscada y más rápida:
El tiempo de cálculo crece como o (número de dígitos 2 ).
No es muy eficiente para grandes números.
Las versiones especializadas de codificación de línea base64 aprovechan las relaciones de base para acelerar los cálculos.
fuente
Javascript
Gracias Keith Randall por tu respuesta a Python. Estaba luchando con las minucias de mi solución y terminé copiando tu lógica. Si alguien está otorgando un voto a esta solución porque funciona, entonces también vote por la solución de Keith.
Pruebas
Esto probablemente podría reducirse mucho, pero en realidad quiero usarlo para un pequeño proyecto paralelo. Así que lo he mantenido legible (algo) y he tratado de mantener las variables bajo control.
fuente
for each
declaraciones obsoletas y construcciones que hacen llorar los ojos comod.length||e?d.push(e):0
... ¿Es este un desafío de código ofuscado o algo así? Podrías escribir lo mismo con una sintaxis comprensible y mejores interpretaciones.Mathematica
No hay variables definidas, cualquier entrada aceptada siempre que quepa en la memoria.
Prueba de conducción:
Afuera
fuente
Scala:
Código de prueba con pruebas:
Pasó todas las pruebas.
fuente
J,
109105Maneja miles de dígitos sin sudar. No enteros perjudicados!
Ejemplos
Se acorta.
fuente
Smalltalk, 128
pruebas:
y para su diversión especial ( desafío: averiguar, qué tiene de especial el valor de entrada ):
fuente