Aqui está um desafio fácil e agradável:
Dada uma sequência que representa um número em uma base desconhecida, determine a base mais baixa possível em que esse número possa estar. A sequência conterá apenas
0-9, a-z
. Se desejar, você pode escolher letras maiúsculas em vez de minúsculas, mas especifique isso. Você deve gerar esta base mais baixa possível em decimal.
Aqui está um exemplo mais concreto. Se a sequência de entrada for "01234", é impossível que esse número esteja em binário, pois 2, 3 e 4 estão todos indefinidos em binário. Da mesma forma, esse número não pode estar na base 3 ou na base 4. Portanto, esse número deve estar na base 5 ou em uma base superior, portanto, você deve gerar '5'.
Seu código deve funcionar para qualquer base entre a base 1 (unária, todos os '0') e a base 36 ('0-9' e 'a-z').
Você pode receber e fornecer saída em qualquer formato razoável. Builtins de conversão de base são permitidos. Como sempre, as brechas padrão se aplicam e a resposta mais curta em bytes é a vencedora!
Teste de E / S:
#Input #Output
00000 --> 1
123456 --> 7
ff --> 16
4815162342 --> 9
42 --> 5
codegolf --> 25
0123456789abcdefghijklmnopqrstuvwxyz --> 36
fonte
You must output this lowest possible base in decimal.
Respostas:
Gelatina , 4 bytes
Requer maiúsculas. Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Python,
2722 bytesIsso requer que a entrada seja uma bytestring (Python 3) ou uma bytearray (Python 2 e 3).
Graças a @AleksiTorhamo por jogar fora 5 bytes!
Teste em Ideone .
Como funciona
Começamos tomando o máximo da string. Como os pontos de código das letras são maiores que os pontos de código dos dígitos, esse caractere máximo também é o máximo de 36 dígitos da base.
O ponto de código de '0' - '9' é 48 - 57 , portanto, devemos subtrair 48 de seus pontos de código para calcular os dígitos correspondentes, ou 47 para calcular a base mais baixa possível. Da mesma forma, os pontos de código das letras 'a' - 'z' são 97 - 122 . Como 'a' representa o dígito com o valor 10 , devemos subtrair 87 dos pontos de código para calcular os dígitos correspondentes ou 86 para calcular a base mais baixa possível. Uma maneira de conseguir isso é a seguinte.
A diferença entre 97 e 58 ( ':' , o caractere após '9' ) é 39 , portanto, pegar os pontos de código no módulo 39 pode obter a subtração. Como 48% 39 = 9 e o resultado desejado para o caractere '0' é 1 , subtraímos 8 antes de pegar o módulo de resultado 39 . Subtrair primeiro é necessário, pois caso contrário 'u'% 39 = 117% 39 = 0 .
fonte
ord()
e ganhar por 3 bytes. :)Python, 25 bytes
Define uma lambda que aceita a sequência
x
. Localiza o maior dígito da string (classificado com letras acima dos dígitos, por padrão do python) e converte na base 36. Adiciona 1, porque8
não está na base 8.fonte
Haskell, 34 bytes
Usa a
mod(ord(c)-8,39)
ideia de Dennis.41 bytes
45 bytes:
Saídas como
Just 3
.fonte
Queijo Cheddar ,
342921 bytesEconomizou 8 bytes graças a Dennis !!!
Usa letras minúsculas
Experimente online
Explicação
fonte
(-)&8
vez den->n-8
?f&n
ligan
ao primeiro argumento da função.05AB1E , 6 bytes
Leva letras maiúsculas.
Explicação
Experimente online
fonte
Na realidade , 6 bytes
Experimente online!
fonte
Julia, 22 bytes
Há um caractere BS (0x08) entre as aspas. Experimente online!
fonte
-''
faz?JavaScript (ES6),
4137 bytesEditar: salvou 4 bytes graças a @ edc65.
fonte
pop()
para salvar 4Haskell,
5540 bytesObrigado @Dennis por sua abordagem. (pegue isso, @xnor;))
fonte
f=
por 38 bytes, uma vezf
que não leva argumentos explícitos.Perl 6: 18 bytes
Define um lambda que recebe um argumento de cadeia única e retorna um número inteiro. Divide a cadeia em caracteres, encontra a "mais alta", converte-a na base 36 e acrescenta 1.
Este usa a abordagem de módulo de Dennis. Mesmo comprimento.
fonte
Retina , 28 bytes
Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)
Explicação
Isso classifica os caracteres da entrada.
Isso remove todos os caracteres, exceto o último, para que os dois primeiros estágios encontrem o caractere máximo.
Estes são dois estágios que formam um loop. O primeiro um duplica o primeiro carácter e os decréscimos segundo "" lo (por exemplo, substituindo
x
comw
,a
com9
e1
com0
). O último estágio encontra um zero como o primeiro caractere; ele o remove. Essa é uma técnica padrão para gerar um intervalo de caracteres, considerando o limite superior. Portanto, isso gera todos os "dígitos" do0
número máximo.Finalmente, contamos simplesmente o número de dígitos, o que nos dá a base.
fonte
R,
998985 bytesVeja ! Menos de 100 bytes!
Veja ! 10 bytes de desconto!
Veja ! 4 bytes de desconto!
Ungolfed:
Com frequência, esta resposta faz uso da
ifelse
função:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)
fonte
scan
método para golf alguns bytes;)PHP,
5138 bytes(De Dennis) ^^
Outra proposta sem o truque de Dennis
fonte
<?=base_convert(max(str_split($argv[1])),36,10)+1
é uma solução elegante, mas com 49 bytes!intval()
vez debase_convert()
diminuir para 38 bytes<?=intval(max(str_split($argn)),36)+1;
tio: tio.run/##K8go@P/…Oitava, 20 bytes
fonte
Pyke, 6 bytes
Experimente aqui!
fonte
Java 7,
6761 bytes(m-8)%39
é graças à incrível resposta de @Dennis .Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
Math.max()
você pode usarm = m>c?m:c
reduce
C89,
55535250 bytes-8%39
roubado descaradamente de DennisTeste
Saída
Economizou 2 bytes graças a Toby Speight
Guardado 2 bytes graças a Kevin Cruijssen
fonte
f(char*s,int b)
torna - sef(s,b)char*s;
.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
C, 55 bytes
Esta resposta assume que a entrada está em ASCII (ou idêntica nos números e letras, por exemplo, ISO-8859 ou UTF-8):
Nós simplesmente iteramos ao longo da string, lembrando o maior valor visto, depois usamos a conhecida conversão módulo 39 da base- {11..36}.
Programa de teste
Resultado dos testes
fonte
f()
mais de uma vez. Sei que quase tudo é justo no golfe, mas meus instintos profissionais consideram isso muito frágil!m
entre chamadas paraf()
. Então, meu programa de teste ainda pode funcionar.Mathematica,
3432 bytes2 bytes economizados graças a Martin Ender
Decidi que o método diferente merecia uma nova resposta.
método
roubadoinspirado na solução de Dennisfonte
Max@Mod[ToCharacterCode@#-8,39]&
(o mesmo vale para a sua outra resposta)&
no final para indicar uma função anônima.@
das duas respostas (ToCharacterCode@#
eCharacters@#
).Mathematica,
3432 byteseconomizou 2 bytes graças a Martin Ender
Define uma função pura que aceita uma string como entrada.
Divide a entrada em caracteres, converte-os em 36 números base e retorna o +1 máximo.
fonte
Max@BaseForm[Characters@#,36]+1&
C # REPL, 17 bytes
Acabei de portar a resposta de @ Dennis para C #.
fonte
CJam, 10 bytes
Obrigado a Martin Ender por me salvar alguns bytes!
Usa a fórmula de Dennis
Experimente online
CJam,
1816 anosSolução alternativa:
Experimente online
fonte
Scala, 25 bytes
print((args(0).max-8)%39)
Execute-o como:
$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz
fonte
R,
6254 bytesUngolfed:
Atualização: eliminou 8 bytes devido à redundância de
na.rm=T
sob a suposição de validade de entrada.Uma melhoria de 39% no tamanho em comparação com a resposta de Frédéric . Além disso, ele roda um pouquinho mais rápido: 0,86 segundos para 100000 repetições versus 1,09 segundos para a resposta da concorrência. Então a minha é menor e mais eficiente.
fonte
Dyalog APL , 10 bytes
Solicita entrada em maiúsculas.
⌈/
máximo⍞
caracteres de entrada⍳⍨
Indexado em⎕D,
todos os dígitos seguidos por⎕A
todos os caracteresTryAPL online!
fonte
BASH 70
As letras de entrada estão em minúsculas.
fonte
JavaScript,
575048 bytes7 bytes salvos thnks em @ kamaroso97 2 bytes salvos graças a @Neil
Resposta original:
fonte
n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1))
.Math.max
existia. Obrigado por me dizer sobre isso![...s]
é mais curto ques.split``
.Perl,
3027 bytesInclui +1 para
-p
Corra com a entrada no STDIN, por exemplo
base.pl
:fonte
LiveScript, 32 bytes
Uma porta desta resposta no meu idioma favorito que compila para JavaScript. Se o
base~number
operador trabalhava com variáveis, eu poderia escrever->1+36~(it/'')sort!pop!
(23 bytes), mas entra em conflito com o operador de ligação da função: /fonte