Este é o meu primeiro desafio!
fundo
Número perfeito é um número inteiro positivo, que é igual à soma de todos os seus divisores, exceto ele próprio.
Então 6
é o número perfeito, desde então 1 + 2 + 3 = 6
.
Por outro lado 12
, não é, porque 1 + 2 + 3 + 4 + 6 = 16 != 12
.
Tarefa
Sua tarefa é simples, escreva um programa que, por n
certo, imprima uma dessas mensagens:
Eu sou um número perfeito, porque
d1 + d2 + ... + dm = s == n
eu não sou um número perfeito, porqued1 + d2 + ... + dm = s [<>] n
Onde
d1, ... dm
estão todos os divisores, n
exceto n
.
s
é a soma de todos os divisores d1, ..., dm
(novamente, sem n
).
[<>]
é <
(se s < n
) ou >
(se s > n
).
Exemplos
Por n
ser 6
: "Eu sou um número perfeito, porque 1 + 2 + 3 = 6 == 6"
Por n
ser 12
: "Eu não sou um número perfeito, porque 1 + 2 + 3 + 4 + 6 = 16> 12"
Por n
ser 13
: "Eu não sou um número perfeito, porque 1 = 1 <13"
Regras
n
não é maior que o padrão do seu idiomaint
.- Você pode ler
n
da entrada padrão, dos argumentos da linha de comando ou de um arquivo. - A mensagem de saída deve ser impressa na saída padrão e nenhum caractere adicional pode aparecer na saída (pode haver espaço em branco à direita ou nova linha)
- Você não pode usar nenhuma função interna ou de biblioteca que resolva a tarefa (ou sua parte principal) para você. Não
GetDivisors()
ou algo parecido. - Todas as outras brechas padrão se aplicam.
Vencedora
Este é o código-golfe, pelo que o código mais curto em bytes vence!
fonte
=
e==
na mesma equação? Isso não faz sentido. Deve serd1 + d2 + ... + dm = s = n
IMO.Respostas:
Pitão, 81 bytes
Experimente on-line: Demonstration or Test Suite
Explicação:
fonte
Java,
255270 bytes (Still FF na base 17)E uma versão mais legível:
Anteriormente, não funcionava para números ímpares, então tive que ajustar algumas coisas. Pelo menos tive sorte com a contagem de bytes novamente. :)
fonte
R,
158163157153143141 141 bytesAinda há espaço para jogar golfe, eu acho.
Editar: Substituído
if(b<n)'<'else if(b>n)'>'else'=='
porc('<'[b<n],'>'[b>n],'=='[b==n])
. Opaste(...)
é substituído por umrbind(...)[-1]
. Obrigado @ plannapus por mais alguns bytes.Ungolfed
Execução de teste
fonte
+
sinal entre divisores.rbind
truque brilhante ! Você pode salvar 2 bytes extras se atribuir2:n-1
a uma variável, digamosa
:which(!n%%1:(n-1))
assim se tornaa[!n%%a]
. (O código completo sendo em seguidan=scan();a=2:n-1;b=sum(w<-a[!n%%a]);cat('I am','not'[b!=n],'a perfect number, because',rbind('+',w)[-1],'=',b,c('<'[b<n],'>'[b>n],'==')[1],n)
)Python 2,
183173170 bytesExemplos:
Obrigado ao xnor por salvar 13 bytes!
fonte
'=<>'[cmp(b,d)]
- junta-te à revolução!b%i<1
parab%i==0
. Pois['not ',''][int(d==b)]
, você não precisa doint
, porque o Python será convertido automaticamente. Além disso, você pode usar a multiplicação de strings"not "*(d!=b)
."=<>="[cmp(b,d)%3::3]
.Julia,
161157 bytesUngolfed:
fonte
CJam, 90 bytes
Para comparação, a impressão de um único
=
pode ser obtida em 83 bytes.Experimente on-line no intérprete CJam .
Como funciona
fonte
Perl, 148 bytes
Com quebras de linha:
fonte
'not '
e'==','>','<'
declarações e comutação de.
a,
(uma vez que nada é adicionado quandoprint
ing uma lista). Também mover suas tarefas para parênteses na primeira vez em que são usadas economiza um pouco, e se você mudar a lógica um pouco paragrep$a%_<1,1..($a=<>)-1
e$a!=($s=eval)&&'not '
deve cortar mais algumas! Espero que tudo faça sentido!Lua,
244231 bytesGolfe:
Ungolfed:
fonte
JavaScript (ES6), 146
Usando cadeias de modelos, ele funciona no Firefox e no Chrome mais recente.
fonte
Ruby,
174160155136134128122 BytesGuardou outros 6 bytes :)
Graças a dicas para jogar golfe em Ruby
fonte
C #, 252 bytes
fonte
Hássio , 285 bytes
Isenção de responsabilidade: Funciona apenas com a versão mais recente do Hassium devido a problemas com os argumentos da linha de comando.
Versão mais legível:
}
fonte
mono src/Hassium/bin/Debug/Hassium.exe t.hs 6
, dizSystem.ArgumentException: The file 6 does not exist.
. 2. Isso não funciona com esta versão , que é a última confirmação antes do lançamento deste desafio. Adicione uma isenção de responsabilidade à sua resposta, informando que seu envio não é concorrente.@Dennis
ao seu comentário Caso contrário, eu não ser notificado da sua resposta..)MATLAB, 238
Nunca será o mais curto de todos os idiomas, mas aqui está minha tentativa com o MATLAB:
E isso está em uma forma um pouco mais legível:
Consegui salvar mais 2 bytes por não usar uma função. Em vez disso, você executa a linha de código e ela solicita o número como uma entrada. Uma vez executado, ele exibe a saída no final.
fonte
Perl 6 , 138 bytes
(A contagem ignora as novas linhas e os recuos, porque eles não são necessários)
@d
é a matriz que contém os divisores.$s
detém a soma dos divisores.$c
é o valor da comparação entre a entrada e a soma dos divisores.(Efetivamente
$c
é um dos-1
,0
,1
, mas é realmente um dosOrder::Less
,Order::Same
ouOrder::More
)In
'not 'x?$c
,?$c
nesse caso, é efetivamente o mesmo queabs $c
, ex
é o operador de repetição de string.«> == <»
é a abreviação de( '>', '==', '<' )
.Como
$c
tem um dos-1,0,1
, temos que alterá-lo um a um para poder usá-lo para indexar em uma lista.Tecnicamente, isso funcionará para números bem acima de 2⁶⁴, mas leva uma quantidade excessiva de tempo para números acima de 2¹⁶.
fonte
Pitão, 84 bytes
Resposta inválida, porque me recuso a implementar
=
e==
na mesma equação.fonte
Ruby, 164 bytes
Teste
fonte
Emacs Lisp, 302 bytes
Versão não destruída:
fonte
Powershell, 164 bytes
Alguns dos truques comuns e não tão comuns do PoSh;
fonte
awk, 150
Desperdiçou alguns bytes ao corrigir isso para entrada
1
. Não tenho certeza se isso é esperado.fonte
05AB1E , 58 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
Consulte esta minha dica do 05AB1E (seção Como usar o dicionário? ) Para entender por que
„I€Ü
é"I am"
,'€–
é"not"
e“€…íÀ‚³,ƒ«“
é"a perfect number, because"
.fonte