Este desafio é suficiente simples que é basicamente tudo no título: você é dado um número inteiro positivo N e você deve retornar o menor inteiro positivo que não é um divisor de N .
Um exemplo: os divisores de N = 24 são 1, 2, 3, 4, 6, 8, 12, 24
. O menor número inteiro positivo que não está nessa lista é 5 , então esse é o resultado que sua solução deve encontrar.
Esta é a sequência OEIS A007978 .
Regras
Você pode escrever um programa ou uma função e usar qualquer um dos nossos métodos padrão de recebimento de entrada e saída.
Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.
Isso é código-golfe , então a resposta mais curta e válida - medida em bytes - vence.
Casos de teste
Os 100 primeiros termos são:
2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2,
3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3,
2, 3, 2, 4, 2, 3, 2, 3, 2, 7, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2,
3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3, 2, 4, 2, 3, 2, 3, 2, 5, 2, 3, 2, 3
Em particular, verifique se sua resposta funciona para as entradas 1 e 2; nesse caso, o resultado é maior que a entrada.
E para alguns casos de teste maiores:
N f(N)
1234567 2
12252240 19
232792560 23
fonte
Respostas:
Mathematica, 19 bytes (codificação UTF-8)
Função sem nome, usando um argumento inteiro diferente de zero e retornando um número inteiro positivo. A barra vertical na metade do caminho é, na verdade, o caractere de três bytes U + 2223, que denota a relação de divisibilidade no Mathematica. Explicação:
Editado para adicionar: ngenisis indica que
//.
, por padrão, itera no máximo 65536 vezes. Portanto, essa implementação funciona para todos os números de entrada menores que o múltiplo menos comum dos números inteiros, de 1 a 65538 (em particular, em todos os números com no máximo 28436 dígitos), mas tecnicamente não para todos os números. Pode-se substituirx//.y
porReplaceRepeated[x,y,MaxIterations->∞]
para corrigir essa falha, mas obviamente ao custo de 34 bytes adicionais.fonte
For
,While
etcPitão, 3 bytes
Basicamente, faz um
f
loop do código até que%QT
(Q % T
ondeT
está a variável de iteração) seja verdadeira.Experimente online aqui.
fonte
.V1In%Qb0bB
vi sua resposta e não me sinto mais tão incrível.JavaScript (ES6),
2523 bytesNota: Uma coisa interessante aqui é que o
k
parâmetro é inicializado ex nihilo na primeira iteração. Isso funciona porquen % undefined
éNaN
(falso conforme o esperado) e-~undefined
é igual1
. Nas próximas iterações,-~k
é essencialmente equivalente ak+1
.Teste
Mostrar snippet de código
fonte
Python,
433635 bytesfonte
Hexagonia , 12 bytes
Embiggened:
Experimente online!
fonte
R, 28 bytes
Bem direto, nada extravagante. Pega a entrada de stdin, incrementa o valor
T
até que oi
móduloT
seja diferente de zero.Se você quiser algo um pouco mais sofisticado, há o seguinte para 29 bytes :
Explicado:
fonte
which.min
, mas depois vi a edição e parece quematch
faz um trabalho semelhante.T
, economizando a necessidade de defini-lo antes dowhile
loop.while
abordagem, o que é bom, pois consome muita memória para N. grande. OT
truque é um daqueles truques que são ótimos para o golfe, mas absolutamente horríveis para a programação real. (E, claro, você pode usarF
também quando você precisa de um0
.)%%
tem precedência sobre+
, então parens ainda são necessários:,(0:i+1)
com o mesmo número de bytes que1:(i+1)
. Na verdade, eu tinha o primeiro originalmente, mas mudei para o último, pois é mais fácil de ler.Haskell, 26 bytes
Todo mundo esquece
until
!fonte
Braquilog , 10 bytes
Experimente online!
Isso saiu muito semelhante à (mas menor que) a solução original da Fatalize. Desde então, o Fatalize mudou para um algoritmo diferente que se vincula a este por meio de um método diferente, então terei que explicar eu mesmo:
Quando invertemos a função, trocando "input" e "output", obtemos um algoritmo razoavelmente razoável (apenas expresso de uma maneira estranha): "tente possíveis números inteiros positivos, em sua ordem natural (ou seja, 1 para cima), até encontrar um que não pode ser multiplicado por nada para produzir a entrada ". O Brachylog não faz cálculos de ponto flutuante, a menos que todas as entradas sejam conhecidas, portanto, ele considera apenas o número A.
fonte
Braquilog ,
1110 bytesExperimente online!
Explicação
fonte
VACA, 174 bytes
Experimente online!
Esse código é apenas parcialmente meu - implementa um algoritmo de módulo que eu carregava do cérebro. O restante do código é meu. No entanto, como não escrevi o algoritmo de módulo, não investiguei verdadeiramente como ele funciona e não posso documentar essa parte do código. Em vez disso, darei meu detalhamento habitual, seguido de uma explicação mais aprofundada sobre por que o código funciona.
Repartição do código
Explicação
O código primeiro lê o número inteiro em [0]. Cada iteração do loop principal (linhas 2 a 26) é incrementada [1] e, em seguida, copia tudo o que é necessário para o algoritmo de módulo, que expõe seu resultado em [5]. Se [5] contiver algum valor, [1] será o número que precisamos imprimir. Nós o imprimimos e, em seguida, forçamos o encerramento do programa.
Como o COW é um derivado do cérebro, ele funciona relativamente semelhante ao modo como o cérebro funciona - faixa infinita de fita, você pode mover para a esquerda ou direita, aumentar ou diminuir e "girar" enquanto o valor atual da fita é diferente de zero. Além do brainfuck, o COW vem com alguns recursos úteis.
O verdadeiro ponto de interesse aqui é a instrução 3
mOO
,. O intérprete lê o valor atual da fita e executa uma instrução com base nesse valor. Se o valor for menor que 0, maior que 11 ou igual a 3, o intérprete encerrará o programa. Podemos usar isso como uma força rápida e suja para sair do loop principal (e do programa inteiramente) depois de encontrarmos nosso não-divisor. Tudo o que precisamos fazer é imprimir nosso número, limpar [1] (comOOO
), diminuí-lo para -1 comMOo
e executar a instrução -1 através damOO
qual termina o programa.A própria fita para este programa funciona da seguinte maneira:
O algoritmo do módulo limpa naturalmente [2], [3], [6] e [7] no final da operação. O conteúdo de [4] é sobrescrito com a pasta de registro na linha 4 e [5] é zero quando [0] é divisível por [1], portanto não precisamos limpá-lo. Se [5] for diferente de zero, forçamos o encerramento na linha 23 para não precisarmos nos preocupar com isso.
fonte
05AB1E , 7 bytes
Experimente online!
Explicação
fonte
Gelatina , 5 bytes
Experimente online!
Explicação:
Este é um abuso horrendo de
#
; Existem muitos operadores neste programa, mas há muitos operandos ausentes.#
realmente quer1
que seja dado explicitamente por algum motivo (caso contrário, ele tenta usar como padrão a entrada); no entanto, tudo o mais que não está especificado no programa é padronizado para a entrada do programa. (Então, por exemplo, se você fornecer 24 como entrada, este programa encontrará os primeiros 24 números que não dividem 24 e depois retorna o primeiro; meio desperdício, mas funciona.)fonte
2%@1#
C,
32bytes 35Editar: adicionado
i=1
no loopUso
Versão completa do programa, 64 bytes:
fonte
C #,
3937 bytesEconomizou dois bytes graças a Martin!
fonte
Perl, 19 bytes
18 bytes de código +
-p
sinalizador.Para executá-lo:
Explicações não muito detalhadas :
-
$.
é uma variável especial cujo valor padrão é o número da linha atual do último manipulador de arquivos acessado (stdin aqui); portanto, depois de ler a primeira linha de entrada, ele é definido como 1.-
$_
mantém a entrada e é impresso implicitamente no final (graças à-p
bandeira).-
redo
(nesse contexto) considera que o programa está em loop e refaz a iteração atual (somente$.
será diferente desde que tenha sido incrementada).- Então, se encontrarmos o menor número (armazenado em
$.
) que não se divide$_
, então o definiremos$_
, caso contrário, tentaremos o próximo número (graças aredo
).fonte
Oitava / MATLAB,
2624 bytesfind(...,1)
retorna o índice (1
com base) do primeiro elemento diferente de zero do vetor no primeiro argumento. O primeiro argumento é[n mod 1, n mod 2, n mod 3, n mod 4,...,n mod (n+1)]
Isso significa que precisamos adicionar+1
ao índice, pois começamos a testar em1
. Obrigado @ Giuseppe por -2 bytes.Experimente online!
fonte
@(n)find(mod(n,1:n+1),1)
é mais curto, não é?Gelatina , 6 bytes
Experimente online!
Explicação:
fonte
[1, 1, 1, 1, 5, ...]
.Perl 6 , 17 bytes
Tente
Expandido:
fonte
05AB1E , 6 bytes
Experimente online!
Além disso, soletra "LINK!" ... Meio ...
fonte
Gelatina , 5 bytes
Experimente online!
Como funciona
fonte
Python 2.7.9, 32 bytes
Teste em Ideona
Recursivamente conta potenciais não-divisores
d
. É mais curto para incrementar recursivamente o resultado do que produzird
. Um deslocamento de1
é obtido pelo booleano deTrue
, que é igual1
, mas comod==1
sempre é um divisor, a saída é sempre convertida em um número.Python 2.7.9 é usado para permitir allow
0or
. As versões iniciadas no 2.7.10 tentarão analisar0or
como o início de um número octal e receberão um erro de sintaxe. Veja isso na Ideone .fonte
Na verdade , 7 bytes
Experimente online! (nota: esta é uma solução muito lenta e levará muito tempo para grandes casos de teste)
Explicação:
fonte
Haskell , 29 bytes
A expressão
[k|k<-[2..]]
apenas cria uma lista infinita[2,3,4,5,...]
. Com a condiçãomod n k>0
, permitimos apenas aquelesk
na lista que não se dividemn
. Acrescentar!!0
apenas retorna a primeira entrada (a entrada no índice0
) dessa lista.Experimente online!
fonte
Dyalog APL , 8 bytes
1⍳⍨
posição da primeira True em0≠
os valores diferentes de zero de⍳|
os remanescentes da divisão de 1 ... N quando divididos por⊢
NTryAPL online!
Nota: isso funciona para 1 e 2 porque
1⍳⍨
retorna 1 + o comprimento do argumento, se nenhum for encontrado.fonte
julia, 28 bytes
Nota: como
1:N+2
não aloca memória, não há problemas de memória paraN
s grandes- @flawr
N+2
salva alguns bytes para mim- a sugestão de @Martin salvou 1 bytes
fonte
QBIC , 14 bytes
Explicação:
fonte
PHP, 30 bytes
se executado a partir do console com a
-r
opção (thx a @ ais523)32 bytes
graças a @manatwork por remover 1 byte
33 bytes (original)
fonte
<?
ele não precisa fazer parte da sua contagem de bytes (porque o PHP possui um modo de linha de comando que não exige).<1
vez de==0
.for(;!($argv[1]%$i);$i++);echo$i;
. A sua é a evolução natural minha. Isso tem o meu voto positivo!Cubix ,
1412 bytesEconomizou 2 bytes graças ao MickyT.
Tente
Explicação
No formato de cubo, o código é:
Basicamente, isso apenas recebe a entrada e inicia um contador. Em seguida, ele verifica cada valor sucessivo do contador até encontrar um que não seja um fator da entrada.
fonte
I2/L/);?%<@O
por alguns bytes a menos. Processo mesmo general, apenas caminho diferente> <> , 15 +3 = 18 bytes
A entrada deve estar na pilha no início do programa, portanto, +3 bytes para o
-v
sinalizador. Experimente online!fonte
Água-viva ,
1210 bytesLeva a entrada de STDIN e sai para STDOUT. Experimente online!
Martin Ender economizou 2 bytes, obrigado!
Explicação
Esta parte é uma função que usa o valor de entrada em sua definição.
Essa
~
célula recebe uma função e, portanto, vira seus argumentos: ela produz a função binária "left argument modulo (|
) right argument". A função módulo interna do Jellyfish leva seus argumentos na ordem inversa.Essa
~
célula recebe um valor e uma função, portanto aplica parcialmente: produz a função binária "input (i
) modulo right argument". Vamos chamar essa função de f .A
\
célula-recebe duas funções, por isso executa a iteração: produz a função unária "increment (>
) até que a função f aplicada aos valores anteriores e atuais forneça um resultado verdadeiro (diferente de zero) e retorne o valor atual". Isso significa que o argumento é incrementado até não dividir a entrada.Finalmente, aplicamos essa função ao valor inicial
1
e imprimimos o resultado comp
.fonte