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 XbYpara Xqualquer número e Yqualquer sequência de alfanuméricos, J interpretará Ycomo um Xnúmero base , onde 0por meio 9terá seu significado usual e apor meio zrepresentará 10 a 35.
E quando digo Xqualquer número, quero dizer qualquer número. Para os propósitos desta pergunta, tentarei Xser 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
Nentre 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,Yestá uma sequência composta por alfanuméricos (0-9 e az, sem distinção entre maiúsculas e minúsculas) eYinterpretada em basesXiguaisN.Se o comprimento de cada representação de
XbYrepresentaçã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":87brgzpte 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
Nmenos 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 ,Nhaverá 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
35bzzzzzzpara 1.892.332.260 usa um dígito incomum para essa base, mas36bvan8x0tem o mesmo comprimento.