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.
fonte
Respostas:
JavaScript (ES6),
103101 bytesRecebe a entrada como uma sequência.
Casos de teste
NOTA: O número de iterações na função de trecho é limitado a 600, para que os casos de teste sejam concluídos mais rapidamente. (Isso levaria alguns segundos.)
Mostrar snippet de código
fonte
Math.floor(x/b)
vez dex/b|0
. (Mas eu não testá-lo.)Ruby , 118 bytes
Isso foi vinculado em outra pergunta e eu notei que não há muitas respostas aqui, então decidi tentar.
Percorra todas as bases até e incluindo a entrada para construir todas as construções válidas do número J. No entanto, ele pula de 1 a 8, porque não há nenhuma maneira de serem menores do que a representação da base 10. É uma solução bastante ingênua, considerando todas as coisas, uma vez que chama o
digits
built-in para obter os dígitos, mas como isso começa com o dígito menos significativo primeiro, temosreverse
que obter o número real, para que possa ser melhorado.É lento. Então, muuuuito incrivelmente lento. O tempo limite do TIO é 34307000, por exemplo. Nós poderia ir com a raiz quadrada ou até mesmo a escolha de Arnauld de
7e4
economizar tempo, mas bytes que os custos extras, então porque se preocupar?Experimente online!
Experimente on-line com sqrt para que tudo termine no prazo
fonte
05AB1E , 37 bytes
Deve funcionar em teoria, mas atinge o tempo limite para todos os casos de teste não triviais≥ 4 ..
10000000
. O produto cartesiano embutidoã
é extremamente lento paraSem a declaração if final,
DgIg@i\}
ela ainda pode ser testada para valores mais baixos, para verificar se realmente funciona: Experimente online.Vou ver se consigo encontrar uma solução (provavelmente muito mais longa, mas) mais eficiente posteriormente.
Explicação:
fonte
XbY
representada for maior ou igual ao número de dígitos deN
, então emita a saídaN
". Enquanto você tem os primeiros 10 milhões de números cobertos, suspeito que uma entrada de10000031
devolverá algo como26blmoof
. O número é válido, mas o comprimento é o mesmo da entrada, portanto, ele deve retornar a entrada.