Introdução
Este é um desafio muito simples: basta contar os divisores de um número. Tivemos um desafio semelhante, mas mais complicado antes, mas pretendo que este seja de nível básico.
O desafio
Crie um programa ou função que, dado um número inteiro estritamente positivo N
, produza ou retorne quantos divisores possui, incluindo 1 e N
.
Entrada: Um número inteiro> 0. Você pode assumir que o número pode ser representado no tipo numérico nativo do seu idioma.
Saída: O número de divisores inteiros positivos que possui, incluindo 1 e o próprio número.
As submissões serão pontuadas em bytes . Você pode encontrar este site à mão, embora possa usar qualquer método razoável para gerar sua contagem de bytes.
Isso é código-golfe , então a pontuação mais baixa ganha!
Edit: Parece que a resposta Pyth de 5 bytes de FryAmTheEggman é a vencedora! Sinta-se livre para enviar novas respostas; se você conseguir algo mais curto, mudarei a resposta aceita.
Casos de teste
ndiv(1) -> 1
ndiv(2) -> 2
ndiv(12) -> 6
ndiv(30) -> 8
ndiv(60) -> 12
ndiv(97) -> 2
ndiv(100) -> 9
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você deseja incluir vários números no seu cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
C ++C,4357564643 bytesNas sugestões de Martin Büttner:
fonte
i,c;f(n){for(i=c=n;i;n%i--&&--c);return c;}
LabVIEW, 4938 bytes
Bem, obviamente, não é adequado para o código de golfe, mas tanto faz, então para o meu primeiro post e o lolz aqui vai.
fonte
.
, que eu tenho certeza que é um separador de milhar, não um ponto decimal (como é comum em alguns idiomas).Haskell, 28 bytes
O truque aqui é testar se um restante está
0
usando a função do indicador0^
.Isso funciona porque qualquer potência positiva de 0 é 0, enquanto 0 ^ 0 é combinatorialmente o produto vazio de 1.
Compare isso com a filtragem
fonte
Dyalog APL ,
76 bytesÉ uma função sem nome que pode ser nomeada e reutilizada para cada
¨
caso de teste ( ) da seguinte maneira:Explicação:
Conte
≢
o∘
único∪
do GCD∨
de si mesmo⊢
e cada um dos números inteiros até⍳
.Obrigado ao ngn por salvar um byte.
Versão antiga:
+/0=⍳|⊢
É assim que funciona:
⍳|⊢
1-através do argumento argumento restante da divisão0=
Booleano se 0 for igual à divisão rest+/
Soma do booleano, ou seja, contagem de unidades.fonte
Python 2, 37 bytes
Uma função recursiva. A entrada opcional
i
no divisor que está sendo testado. A expressão(n%i<1)
testa divisibilidade, comTrue
(que é igual1
) para divisores. O resultado é adicionado à expressão recusativa parai+1
. Quandoi==n
é atingido, a divisão de piso inteiro éi/n
avaliada como1
e esse valor é retornado como o caso base,n
sendo considerado um divisor den
.38:
Uma função anônima. Testes de todos os divisores possíveis
1
atravésn
. Esta é deslocado para cima de0
meion-1
emrange(n)
uso-~
, o que acrescenta1
. A soma dos bools usa o fato de o Python tratarTrue
/False
como1
/0
.fonte
Retina , 17 bytes
Entrada em unário , saída em decimal.
Experimente online.
Quando invocada com um único regex, o Retina simplesmente conta as correspondências. O próprio regex corresponde a uma posição , onde o número unário à esquerda dele é um divisor de toda a entrada. Também estou fazendo uso do fato de que as lookarounds são atômicas, para que eu não precise usar uma
^
âncora.O primeiro lookbehinds simplesmente captura o prefixo inteiro no grupo
1
. Isso nunca pode falhar, então, depois do olhar para trás, sabemos que é o que está no grupo 1 e que não mudará mais.O lookahead então verifica se podemos chegar ao final da string repetindo a string capturada (nosso divisor em potencial) 0 ou mais vezes.
fonte
J, 10 bytes
Este é um verbo monádico sem nome. Calcula σ 0 (∏p k α k ) como ∏ (α k + 1) .
Experimente online com J.js .
Como funciona
fonte
q:
seja permitido, pois resolve uma parte essencial do desafio. Como apenas cerca de[:+/0=]|~1+i.
q:
.Golfscript,
19181713 bytesCom agradecimentos a Martin Büttner .
Como funciona
Além disso
De @Peter Taylor , também em 13 bytes.
Como funciona
fonte
~:X,{)X\%!},,
J,
131211 bytesMeu primeiro golfe em J. Ainda estou aprendendo.
Guardou um byte graças a Dennis.
Economizou mais um byte graças a randomra.
Explicação:
fonte
Arcyóu , 12 bytes
Vamos começar a festa!
Isso usa a função interna
d/
. Aqui está uma versão sem o built-in (27 bytes):Explicação:
fonte
CJam, 11 bytes
Teste aqui.
Explicação
O CJam não tem um built-in para isso, então estamos fazendo a divisão de teste.
Bônus
Aqui está uma solução interessante em 12 bytes (que eu suspeito que possa ser a mais curta em um idioma como J):
O resultado é igual ao número de vezes que
n
aparece em uman x n
tabela de multiplicação:fonte
Matlab, 20 bytes
Execute
k mod n
para todosk = 1,...,n
, depois executenot
(que transforma cada nonzer em zero e cada zero em 1) e some todos esses valores.fonte
length(divisors(n))
.@(n)
para torná-lo uma submissão válidaJulia, 20 bytes
Esta é uma função anônima que funciona da seguinte maneira: Para cada número inteiro de 1 à entrada, teste se o módulo de entrada é zero. Nesse caso, o valor será
true
, caso contráriofalse
. Somamos os booleanos que são implicitamente convertidos em números inteiros, produzindo o número de divisores.Uma solução muito mais fria (embora também muito mais longa), incluída por uma questão de perfeição, é
Isso obtém a fatoração canônica de
n
, ie\prod_{i=1}^k p_i^e_i
, e calcula a função divisora comoτ(n) = \prod_{i=1}^k e_i + 1
.fonte
PARI / GP, 6 bytes
O PARI / GP possui um built-in para isso.
fonte
Pitão, 8 bytes
Divisão de teste simples.
Experimente online aqui .
fonte
Ruby, 27 bytes
Exemplo de execução:
fonte
Oitava,
2120 bytesfonte
nnz
, o uso de grande aqui =)Regex (.NET), 33 bytes
Supondo que entrada e saída estejam unárias, e a saída é obtida da correspondência principal da regex.
Divisão da regex:
.*$
coloca o ponteiro no final da string para que tenhamos toda a entrada x em uma direção.(?<=^\2*(.+?(?>\2?)))
corresponde da direita para a esquerda e verifica o divisor fazendo um loop de x a 0.(.+?(?>\2?))
é uma "variável" que começa em 1 na primeira iteração e continua no número na iteração anterior e faz um loop até x.^\2*
verifica se x é um múltiplo de "variável".Basicamente, tem a mesma idéia que a minha resposta para Calcular Phi (não Pi) . Somente a verificação é diferente.
Teste a regex em RegexStorm .
fonte
Labirinto , 33 bytes
Experimente online.
Isso implementa a divisão de teste. Vou adicionar uma explicação completa mais tarde. Provavelmente não é o ideal, mas estou tendo dificuldades para encontrar algo mais curto.
fonte
Perl 6 , 17 bytes
uso:
fonte
Javascript (ES6),
605742403937 bytesProvavelmente isso pode ser jogado melhor.
Edit 1: Eu estava certo. Removidos os chavetas após o loop for.
Edit 2: Golfed to 40 bytes with thanks to manatwork and Martin Büttner .
Edit 3: Salvando um byte baseando a função na resposta C acima.
Edit 4: Graças a ן nɟuɐɯɹɐ ן oɯ e Neil , mas não consigo fazer o avaliação funcionar.
Edit 5: Esqueceu de remover o eval.
Teste
fonte
var
palavras-chave. Mais dicas em Dicas para jogar golfe em JavaScript e Dicas para jogar golfe no ECMAScript 6 .++i
ei++
, escolha o primeiro (isso não tem nada a ver com golfe). Tambémn%i<1
deve salvar um byte.n=>{for(d=i=0;i<n;)n%++i<1&&d++;return d}
n%++i||++d
?PowerShell, 34 bytes
|
!
para que os divisores se tornem $ true e permitidos; usando o alias interno?
paraWhere-Object
()
e.Count
quantos itens passaram pelo filtrofonte
Gelatina , 2 bytes (não concorrente (novamente))
Experimente online!
Eu acho que isso usa recursos implementados após a outra resposta Jelly. Comente se estou errado (não consigo olhar cada commit na linha, você sabe :))
fonte
Táxi, 2143 bytes
Experimente online!
Ungolfed:
Explicação:
fonte
Japonês , 3 bytes
-m
flag é para executar todos os casos de teste.Tente
fonte
Fórmula do Excel,
4228 bytesEdit: Acabei de perceber que não preciso usar
INDIRECT
, economizando 14 bytes!O seguinte deve ser inserido como uma fórmula de matriz ( Ctrl+ Shift+ Enter):
Onde N é o número a ser testado.
Exemplos:
Explicação:
fonte
05AB1E , 2 bytes
Experimente online ou verifique todos os casos de teste .
Explicação:
Bem direto, mas aqui está assim mesmo:
fonte
Mathematica, 16 bytes
Composição simples de funções dos built-ins.
fonte
Referência 0.13 , 16 bytes
Verifique todos os casos aqui.
Explicação
fonte