Considere a sequência natural de até 6 (desconsidere 1) :
2,3,4,5,6
Começamos a digitalizar a partir da esquerda (neste caso, de 2), procuramos um número divisível por 2 (aqui 4) e removemos os dois números da lista (aqui 2 e 4), de modo que a lista se reduz a:
3,5,6
Continuamos o mesmo processo, aqui mais à esquerda é 3, portanto, procuramos o número divisível por 3. 6 é certamente esse número e, portanto, 3 e 6 são removidos,
5
Agora, nenhuma pesquisa adicional pode ser feita. Assim, essa se torna a lista de números ALONADOS para n = 6.
OBJETIVO
- Dado um número n maior que 1, imprima todos os números correspondentes correspondentes.
ENTRADA
2
6
15
20
22
SAÍDA
2
5
8,9,11,12,13,15
11,12,13,15,17,19,20
12,13,15,17,19,20,21
AINDA OUTRO EXEMPLO EXPERIMENTAL
Para n = 22
=>2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
=>3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 2 & 4)
=>5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 3 & 6)
=>7,8,9,11,12,13,14,15,16,17,18,19,20,21,22 (remove 5 & 10)
=>8,9,11,12,13,15,16,17,18,19,20,21,22 (remove 7 & 14)
=>9,11,12,13,15,17,18,19,20,21,22 (remove 8 & 16)
=>11,12,13,15,17,19,20,21,22 (remove 9 & 18)
=>12,13,15,17,19,20,21 (remove 11 & 22) (OUTPUT)
Isso é código-golfe , então o código mais curto em bytes vence.
Respostas:
05AB1E ,
22171514 bytesExperimente online!
Explicação
fonte
Python 2,
907973 bytes-6 bytes graças ao xnor
Pega o número de entrada em stdin. Ideone it!
Explicação
Construímos a lista inicial a partir do número de entrada e a armazenamos
L
. Em seguida, faça um loop enquanto o último número for maior ou igual a 2 vezes o primeiro número e remova 2 vezes o primeiro número da lista. Este sempre será o próximo número divisível porL[0]
.L=L[1:]
tira o primeiro número também. Quando a condição não for mais verdadeira, nenhuma remoção adicional poderá ser feita e a lista será impressa.fonte
range
já dá uma lista.Python, 61 bytes
É um pouco mais fácil entender esse código menos eficiente:
Isso usa uma caracterização direta de números isolados:
Por que isso se aplica? Ao fazer o processo
n
, digamos que removemos um número ímpara
na metade inferior (1
paran/2
). Em seguida,2*a
é removido, não importa onde esteja na lista. Então,4*a
permanece (se existir). Mas se estiver na metade inferior, o processo de exclusão chegará a ele e removerá ambos4*a
e8*a
. Assim, vemos que um número superior a metade é removido se é de forma2*a
,8*a
... com estranhoc
, mas estadias se ele tem formaa
,4*a
,8*a
, ...A exceção é para
a=1
, que não inicia na lista e, portanto, não é removida. Como resultado, a cadeia de remoção começa coma=2
, e a regra para potências de 2 é invertida.No código acima,
(i&-i)**.5%1>0
verifica sei
falta o formulárioi = a * 2^b
comb
ímpar, pelo truque de bits para extrair o maior fator de potência dois,2^b = i&-i
e depois verifica se o resultado não é um quadrado perfeito. Então,i&~-i>0
é outro truque para verificar sei
não é uma potência perfeita de 2. Essas condições são então corrigidas.Há mais algumas melhorias aqui
Primeiro, deslocamos o índice do intervalo 1 para baixo, para reduzir para
range(n/2,n)
derange(n/2+1,n+1)
, compensando, substituindo todosi
pori+1
(ou~-i
).Se uma potência de 2 é um número, uma potência de
4
(2 ^b
comb
par) pode ser verificada com2**c/3
um valor grandec
. Isso ocorre porque2**c/3
possui representação binária10101...101
com as dos bits posicionados pares. Usando oc=2*n
suficiente. Para negar o resultado quandoi
é uma potência de 2, dividimos pela metade esse número, colocando1
as posições ímpares.fonte
Groovy,
6558 bytesIdéia de algoritmo do DSLoc , que percebeu que você só precisava remover os duplos.
Aqui está um detalhamento:
fonte
Perl,
53494544 bytesInclui +1 para
-n
Dê o número de entrada no STDIN:
aloned.pl
:A verificação direta dos números possíveis é mais longa:
Isso verifica todos os números na metade superior do intervalo. Mantenha números que tenham um número par de 2 como fatores primos, exceto se o número for uma potência de 2 e, em seguida, ímpar (porque 1 é deixado de fora da série original). Esse método, no entanto, deve funcionar bem para outros idiomas.
fonte
MATL , 18 bytes
Emprestou a idéia "multiplicar por 2" da resposta 05AB1E de @ Emigna .
Experimente online!
Explicação
fonte
Haskell,
71696256 bytesExemplo de uso:
q 22
->[12,13,15,17,19,20,21]
.Se houver um múltiplo do primeiro número
a
, será2*a
. Mantenhaa
se2*a
não estiver na lista e anexe uma chamada recursiva coma
e2*a
removida da lista.fonte
Pitão - 19 bytes
Vai definitivamente ser refatoração.
Conjunto de Teste .
fonte
Ruby, 124
Comparando pontuações com outras respostas, esta é obviamente a abordagem errada:
A parte um pouco inteligente aqui é
a[g[0]]=a[g[1]]=!g[1]
que define os valores do hash como true / false conforme necessário.fonte
PHP, 98 bytes
Economize 8 bytes por @Titus Obrigado
Se uma vírgula à direita for permitida, ela poderá encurtar 9 bytes em
(!$a?:print"$a,");
vez de(!$a?:print$x?",$a":$x=$a);
fonte
$a
e os$b
parênteses não precisam? Malvado!(!$a?:print"$a,")
->print$a?"$a,":""
. -2 bytes para as duas versões se você usar o sublinhado como separador.foreach(... as$v)
,$v-2
em vez de$k
e$v*2-2
, em vez de$k*2+2
.$a=&$r[$k]&&$b=&$r[$k*2+2]
funciona como$a=$r[$k]and$b=$r[$k*2+2]
. Lamento não ter encontrado uma página que explique combinações com referências e o&&
operador. Mas preciso de referências, não de atribuições. Não tenho certeza se uma vírgula à direita ou outro separador é permitido.&
bit a bit e referências haves uma precedência mais elevada, em seguida, o&&
operadorJavascript, 149 bytes
Aqui está um exemplo de trabalho. Todo o HTML e a função wrapper () são apenas interativos.
Mostrar snippet de código
Este snippet de código não-protegido possui alguns comentários e permite que você veja interativamente as etapas de qualquer entrada.
Mostrar snippet de código
fonte
JavaScript (ES6), 92 bytes
Eu pensei que tinha postado isso ontem, mas obviamente não ...
Aqui está outra versão:
fonte
Java 7, 210 bytes
Definitivamente, pode-se jogar um pouco mais usando uma abordagem diferente, provavelmente usando uma matriz com alguns truques. Devido ao elenco, quebra, lista de tipos e verificações de if, é um pouco mais longo do que o esperado, mas funciona.
Ungolfed & código de teste:
Experimente aqui.
Saída:
fonte
Raquete 191 bytes
Ungolfed (comentários após ';'):
Teste:
Saída:
fonte