Crie uma rotina que utilize uma matriz de blocos em um sistema básico numérico e converta-os em uma matriz de blocos em outro sistema básico numérico. Os sistemas de e para são arbitrários e devem ser aceitos como parâmetro. A matriz de entrada pode ter um comprimento arbitrário (se estiver usando um idioma em que os comprimentos da matriz não sejam armazenados com a matriz, como C, um parâmetro de comprimento deverá ser passado para a função).
Eis como deve funcionar:
fromArray = [1, 1]
fromBase = 256
toBase = 16
result = convertBase(fromArray, fromBase, toBase);
O que deve retornar [0, 1, 0, 1]
ou possivelmente [1, 0, 1]
(os principais à esquerda 0
são opcionais, pois não alteram o valor da resposta).
Aqui estão alguns vetores de teste:
Vetor de teste de identidade
fromArray = [1, 2, 3, 4] fromBase = 16 toBase = 16 result = [1, 2, 3, 4]
Vetor de teste trivial
fromArray = [1, 0] fromBase = 10 toBase = 100 result = [10]
Vetor grande teste
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]
Vetor de teste 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]
Vetor base não uniforme
fromArray = [41, 42, 43] fromBase = 256 toBase = 36 result = [1, 21, 29, 22, 3]
Outros critérios / regras:
Todas as variáveis inteiras devem caber em um número inteiro assinado de 32 bits padrão para todos os intervalos de entrada sãos.
Você pode converter em uma representação intermediária, desde que o intermediário não seja nada além de uma matriz de números inteiros assinados em 32 bits.
Espere manipular bases de 2 a 256. Não há necessidade de oferecer suporte a bases mais altas do que isso (mas se você quiser, por todos os meios).
Espere lidar com tamanhos de entrada e saída de pelo menos até 1000 elementos. Uma solução que escala para 2 ^ 32-1 elementos seria melhor, mas 1000 é bom.
Não se trata necessariamente de ter o código mais curto que atenda a essas regras. É sobre ter o código mais limpo e elegante.
Agora, isso não é exatamente trivial, portanto, uma resposta que quase funcione pode ser aceita!
fonte
Respostas:
Pitão
fonte
Aqui está uma solução Haskell
E executando os testes da pergunta:
fonte
R
Lida com muitos milhares de elementos * em menos de um minuto.
* para> 500 elementos, é necessário aumentar o nível de recursão padrão ou não redefinir a
mm
matrizdothelocomotion()
Exemplos:
fonte
Uma versão JavaScript menos ofuscada e mais rápida:
O tempo de computação cresce como o (número de dígitos 2 ).
Não é muito eficiente para grandes números.
As versões especializadas da codificação da linha base64 aproveitam as taxas de base para acelerar os cálculos.
fonte
Javascript
Obrigado Keith Randall pela sua resposta em Python. Eu estava lutando com as minúcias da minha solução e acabei copiando sua lógica. Se alguém estiver votando nesta solução porque ela funciona, por favor, vote também na solução de Keith.
Testes
Provavelmente isso pode ter diminuído muito, mas eu realmente quero usá-lo para um pequeno projeto paralelo. Então, eu o mantive legível (um pouco) e tentei manter as variáveis sob controle.
fonte
for each
declaração obsoleta e construções de dar água nos olhos comod.length||e?d.push(e):0
... Isso é um desafio ofuscado pelo código ou algo assim? Você poderia escrever a mesma coisa com uma sintaxe compreensível e melhores performances.Mathematica
Nenhuma variável definida, qualquer entrada aceita, desde que caiba na memória.
Passeio de teste:
Fora
fonte
Scala:
Código de teste com testes:
Passou em todos os testes.
fonte
J,
109105Lida com milhares de dígitos sem suar. Nenhum número inteiro danificado!
Exemplos
Fica mais curto.
fonte
Smalltalk, 128
testes:
e para sua diversão especial ( desafio: descubra o que há de tão especial no valor de entrada ):
fonte