A linguagem J possui uma sintaxe muito boba para especificar constantes . Quero focar em um recurso interessante em particular: a capacidade de escrever em bases arbitrárias.
Se você escrever XbY
para X
qualquer número e Y
qualquer sequência de alfanuméricos, J interpretará Y
como um X
número base , onde 0
por meio 9
terá seu significado usual e a
por meio z
representará 10 a 35.
E quando digo X
qualquer número, quero dizer qualquer número. Para os propósitos desta pergunta, tentarei X
ser um número inteiro positivo, mas em J você pode usar qualquer coisa: números negativos, frações, números complexos, qualquer que seja.
O que é estranho é que você só pode usar os números de 0 a 35 como sua base, qualquer que seja o dígito, porque sua coleção de símbolos utilizáveis consiste apenas de 0 a 9 e az.
O problema
Quero um programa para me ajudar a jogar números mágicos como 2.933.774.030.998 usando esse método. Bem, ok, talvez não tão grande, eu vou ser fácil com você. Então...
A sua tarefa é escrever um programa ou função que leva um (normalmente grande) número decimal
N
entre 1 e 4294967295 (= 2 32 -1) como entrada, e as saídas / retorna a representação mais curto da formaXbY
, em queX
é um número inteiro positivo,Y
está uma sequência composta por alfanuméricos (0-9 e az, sem distinção entre maiúsculas e minúsculas) eY
interpretada em basesX
iguaisN
.Se o comprimento de cada representação de
XbY
representação for maior ou igual ao número de dígitos deN
, em seguida, imprimaN
. Em todos os outros vínculos, você pode gerar qualquer subconjunto não vazio das representações mais curtas.
Isso é código de golfe, então quanto menor, melhor.
Casos de teste
Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
5 | 5
|
10000000 | 79bkmom 82bibhi 85bgo75 99bauua 577buld
| 620bq9k 999baka
|
10000030 | 85bgo7z
|
10000031 | 10000031
|
12345678 | 76bs9va 79bp3cw 82bmw54 86bjzky 641buui
|
34307000 | 99bzzzz
|
34307001 | 34307001
|
1557626714 | 84bvo07e 87brgzpt 99bglush 420blaze
|
1892332260 | 35bzzzzzz 36bvan8x0 37brapre5 38bnxkbfe 40bij7rqk
| 41bgdrm7f 42bek5su0 45bablf30 49b6ycriz 56b3onmfs
| 57b38f9gx 62b244244 69b1expkf 71b13xbj3
|
2147483647 | 36bzik0zj 38br3y91l 39bnvabca 42bgi5of1 48b8kq3qv
(= 2^31-1) | 53b578t6k 63b2akka1 1022b2cof 1023b2661 10922bio7
| 16382b8wv 16383b8g7 32764b2gv 32765b2ch 32766b287
| 32767b241
|
2147483648 | 512bg000 8192bw00
|
4294967295 | 45bnchvmu 60b5vo6sf 71b2r1708 84b12mxf3 112brx8iv
(= 2^32-1) | 126bh5aa3 254b18owf 255b14640 1023b4cc3 13107bpa0
| 16383bgwf 21844b9of 21845b960 32765b4oz 32766b4gf
| 32767b483 65530b1cz 65531b1ao 65532b18f 65533b168
| 65534b143 65535b120
Se você não souber se uma representação é igual a algum número, use qualquer intérprete J, como o do Try It Online . Basta digitar stdout 0":87brgzpt
e J voltará a sair 1557626714
. Observe que J aceita apenas letras minúsculas, mesmo que esse problema não diferencie maiúsculas de minúsculas.
Alguma teoria possivelmente útil
- Para todos os
N
menos de 10.000.000, a representação decimal é tão curta quanto qualquer outra e, portanto, é a única saída aceitável. Para salvar qualquer coisa, você precisará ter pelo menos quatro dígitos a menos na nova base e ainda mais se a base for maior que 99. - Basta verificar as bases até o teto da raiz quadrada de
N
. Para qualquer base maior B ,N
haverá no máximo dois dígitos na base B , portanto, na primeira vez em que você obtiver algo com um primeiro dígito válido, será em torno de B 35/35N
. Mas, nesse tamanho, você sempre será pelo menos tão grande quanto a representação decimal; portanto, não há sentido em tentar. Isso em mente, ceil (sqrt (número maior, pedirei que você resolva esse problema)) = 65536. - Se você tiver alguma representação em uma base menor que 36, a representação da base 36 será pelo menos tão curta. Portanto, você não precisa se preocupar com soluções acidentalmente curtas em bases inferiores a 36. Por exemplo, a representação
35bzzzzzz
para 1.892.332.260 usa um dígito incomum para essa base, mas36bvan8x0
tem o mesmo comprimento.