A densidade de dígitos numéricos quadrados (SNDD) de um número - inventado por mim mesmo - é a razão entre a contagem de números quadrados encontrados em dígitos consecutivos e o comprimento do número. Por exemplo, 169 é um número de 3 dígitos contendo 4 números quadrados - 1, 9, 16, 169 - e, portanto, possui uma densidade de dígitos numéricos quadrados de 4/3 ou 1,33. O número de 4 dígitos 1444 possui 6 quadrados - 1, 4, 4, 4, 144, 1444 - e, portanto, uma proporção de 6/4 ou 1,5. Observe no exemplo anterior que os quadrados podem ser repetidos. Além disso, 441 não é permitido, porque não pode ser encontrado consecutivamente dentro do número 1444.
Sua tarefa é escrever um programa que procure um determinado intervalo A - B (inclusive) pelo número com a maior densidade de dígitos do número quadrado. Seu programa deve obedecer às seguintes especificações:
- Considere a entrada A, B no intervalo de 1 a 1.000.000.000 (1 bilhão). Exemplo:
sndd 50 1000
- Retorne como resultado o número com o maior SNDD. Em caso de empate, retorne o menor número.
- 0 não conta como um quadrado de qualquer forma, 0, 00, 000, etc. Nem os quadrados que começam com 0, como 049 ou 0049.
- Observe que o número inteiro não precisa ser um número quadrado.
Exemplos:
sndd 14000 15000
Output: 14441
sndd 300 500
Output: 441
Bônus: Qual é o número com o maior SNDD entre 1 e 1.000.000.000? Você pode provar se essa é a maior possível ou se pode haver uma maior em uma faixa maior?
Pontuações atuais:
- Ruby: 142
- Windows PowerShell: 153
- Scala: 222
- Python: 245
Agora que uma resposta foi selecionada, eis a minha implementação de referência (não destruída) em JavaScript: http://jsfiddle.net/ywc25/2/
fonte
$ ruby1.9 sndd.rb 14000 15000 => 14441
.x[0]>?0
verifica quadrados começando com 0.ruby sndd.rb 14000 15000
Windows, recebo 14000.?0
é um Fixnum, enquanto no Ruby 1.8 é uma string, então a comparação que eu mencionei tem um significado diferente dependendo da versão do Ruby (na verdade, ele deve lançar uma exceção no 1.8). Por isso mencionei explicitamente a versão 1.9 no título.Respondendo ao bônus: a melhor pontuação para números <1e9 é 5/3 = 1.666 ..., gerada por 144411449 (e talvez outros?).
Mas você pode fazer melhor com números maiores. Geralmente, se n tem uma pontuação de x, você pode concatenar duas cópias de n e obter a mesma pontuação x. Se você tiver sorte en tiver o mesmo primeiro e último dígito, poderá soltar um desses dígitos na concatenação e melhorar sua pontuação ligeiramente (um a menos que o dobro do número de quadrados e um a menos que o dobro do número de dígitos) .
n = 11449441 tem uma pontuação de 1,625 e tem o mesmo primeiro e último dígito. Usando esse fato, obtemos a seguinte sequência de pontuações:
que fornece uma sequência infinita de números que são estritamente (embora decrescentemente) melhores que os números anteriores, e todos, exceto os 2 primeiros, melhores que a melhor pontuação para números <1e9.
Porém, essa sequência pode não ser a melhor em geral. Ele converge para uma pontuação finita (12/7 = 1.714) e pode haver outros números com pontuações melhores que o limite.
Editar : uma sequência melhor, converge para 1,75
fonte
Windows PowerShell, 153
154155164174Graças a Ventero por uma redução de um byte, fui burra demais para me encontrar.
Versão de 154 bytes explicada:
fonte
Python, 245
256Isso poderia ser muito menor se o intervalo fosse lido de
stdin
em oposição aos argumentos da linha de comando.Editar:
Com relação ao bônus, minhas experiências sugerem o seguinte:
Conjectura 1 . Para cada n ∈ ℕ , o número em with ≤ n com o maior SNDD deve conter apenas os dígitos 1, 4 e 9.
Conjectura 2. ∃ n ∈ ∀ i ∈ ℕ ≥ n : SNDD ( n ) ≥ SNDD ( i ).
Esboço de prova . O conjunto de quadrados com os dígitos 1, 4 e 9 provavelmente é finito . ∎
fonte
range(*map(int,sys.argv[1:]))
Scala, 222
(Scala 2.9 necessário.)
fonte
Considerando a questão do bônus: Fora do intervalo, o SNDD mais alto possível é infinito.
Pelo menos, se eu li a pergunta corretamente, um quadrado como 100 (10 * 10) conta.
Se você considerar o número 275625, a pontuação será 5/6, pois 25, 625, 5625, 75625 e 275625 são todos quadrados.
Se adicionar 2 zeros, obtém-se: 27562500, que tem uma pontuação de 10/8. O limite desta sequência é 5/2 = 2,5
Na mesma linha, você pode encontrar quadrados que terminam em qualquer número de quadrados menores desejado. Eu posso provar isso, mas você provavelmente entendeu a idéia.
É certo que essa não é uma solução muito boa, mas prova que não há limite superior para o SNDD.
fonte
Clojure - 185 caracteres
Provavelmente poderia ser otimizado ainda mais, mas aqui vai:
Usado como uma função com dois parâmetros:
fonte
Jelly , 21 bytes, desafio pós-datas no idioma
Experimente online!
Explicação
Função auxiliar (calcula a densidade de dígitos de sua entrada):
Programa principal:
O programa é discutivelmente mais interessante sem o
Ḣ
- dessa forma, ele retorna todos os números de densidade máxima em vez de apenas um - mas eu o adicionei para atender à especificação.fonte