Um número estranho é um número em que a soma dos divisores adequados é maior que o próprio número e nenhum subconjunto de divisores apropriados soma esse número.
Exemplos:
70 é um número estranho, porque seus divisores adequados (1, 2, 5, 7, 10, 14 e 35) somam 74, que é maior que 70, e nenhuma combinação desses números soma 70.
18 não é um número estranho porque seus divisores adequados (1, 2, 3, 4, 6, 9) somam 25, o que é maior que 18, mas 3, 6 e 9 somam 18.
Sua tarefa é escrever o programa mais curto que insira std-in qualquer número ne calcula e imprime em um arquivo ou std-out os primeiros n números estranhos com separação de nova linha. Nenhuma codificação embutida das respostas é permitida (desculpe por não especificar isso no início).
Para mais exemplos, consulte esta página: http://mathworld.wolfram.com/WeirdNumber.html
Respostas:
Mathematica
999487Espaços não necessários. Lento!:
À custa de alguns caracteres, esta é uma versão mais rápida que verifica apenas números pares e ignora múltiplos
6
que nunca são estranhos:ainda é muito lento para qualquer finalidade útil. Localiza os dois primeiros em alguns segundos, mas fica cada vez mais lento à medida que o número de divisores aumenta.
fonte
Haskell - 129
Tenho certeza de que há muito para jogar aqui, mas como a competição parece baixa, por enquanto, vou jogar isso.
Não tente executar isso, porém, consegui esperar apenas os dois primeiros elementos; o terceiro começará a levar minutos.
fonte
Python 2.7 (255 bytes)
fonte
PHP, 267 bytes
E aqui está o código fonte original:
Você notará que leva algum tempo para exibir os números enquanto realiza uma verificação de força bruta (você deve chegar a 70 rapidamente).
fonte
R, 164
Versão sem golfe:
Isso leva algum tempo devido à força bruta.
fonte
Ruby - 152
Ruby com ActiveSupport - 138
Muito lento e tenho quase certeza de que ainda há espaço para jogar golfe ...
fonte
Smalltalk, 143
entrada:
resultado:
fonte
SageMath:
143131 bytesÉ mais ou menos nem mesmo jogado, não há muito para jogar de qualquer maneira no código. O mais importante é que você deve fazer o teste
2*x>=sum(l)
primeiro, pois isso pouparia muito tempo de computação. É preciso perceber que,max
em booleanos, aor
segunda coisa é quew(x)
éFalse
para números estranhos eTrue
para números não estranhos. Versão não destruída:fonte
C ++ - 458
Esta não é toda a minha solução, pois tive que pedir ajuda ao SO para calcular a soma dos subconjuntos, mas todo o resto é meu:
Versão longa:
No momento, calculou apenas os dois primeiros (70 e 836). Eu matei depois disso.
fonte
Perl, 173
Deixe-me adicionar outra solução inútil. Essa solução é tão lenta que nem consegue produzir nada além do primeiro número estranho. Ouso dizer que é a solução mais lenta de todas aqui.
Demo
O mesmo código escrito em Java (com o qual me sinto mais confortável) não consegue nem reconhecer o segundo número estranho (836), e eu já alimentei o número diretamente no método de verificação (em vez de repetir e verificar todos os números).
O núcleo desta solução está no regex:
E como a string é configurada para ser 3 vezes o número que estamos verificando.
O comprimento da string é configurado para ser 3 vezes o número que estamos verificando
i
: os 2 primeirosi
são para somar os fatores e o último 1i
é reservado para verificar se um número é um fator dei
.(?=(.+)\1{2}$)
é usado para capturar o número que estamos verificando.((.+)(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))(?=.*(?=\1$)\3+$))+
corresponde aos fatores do número. A iteração posterior corresponderá a um fator menor que a iteração anterior.(.+)
e(?=.*(?=\1$)\3+$)
juntas selecionam um fator do número que está sendo verificado.(?=.*(?(2)(?=\2$)\3.+$|(?=\1$)\3.+$))
garante que o fator selecionado seja menor que o número verificado na primeira iteração e menor que o fator anterior nas iterações subseqüentes.A regex tenta corresponder ao maior número possível de fatores dentro do limite de 2
i
. Mas não nos importamos com o valor real da soma dos divisores, apenas nos importamos se o número é abundante.Em seguida, o segundo regex, que é o primeiro regex
\1{2}$
adicionado. Como resultado, o regex garante que a soma de (alguns) fatores do número que está sendo verificado seja igual ao próprio número:A restrição adicionada fará com que o mecanismo regex execute uma pesquisa de retorno em todos os subconjuntos possíveis de fatores, por isso será extremamente lento.
fonte
Perl,
176174 bytesO número de números estranhos é esperado em STDIN e os números encontrados são impressos em STDOUT.
Versão ungolfed
Limitações
fonte