Saída dos números ALONED


21

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

  1. 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 é , então o código mais curto em bytes vence.


7
Só para você saber, temos uma sandbox na qual você pode postar desafios incompletos para feedback antes de publicá-lo no site principal.
DJMcMayhem

4
Temos que retornar uma lista dos números em ordem crescente ou seria aceitável também uma lista não ordenada ou um conjunto?
Dennis

deve estar em ordem crescente.
officialaimm

Respostas:


5

05AB1E , 22 17 15 14 bytes

L¦¹F¬·©¹›_i¦®K

Experimente online!

Explicação

L¦               # push the list [2..input]
  ¹F             # input nr of times do:
          i      # if
    ¬·©          # the first element in the list * 2
       ¹›_       # is less than or equal to input
                 # then
           ¦     # remove first element of list
            ®K   # and remove it's multiple

6

Python 2, 90 79 73 bytes

-6 bytes graças ao xnor

L=range(2,input()+1)
while L[0]*2<=L[-1]:L.remove(L[0]*2);L=L[1:]
print L

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 por L[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.


No Python 2, rangejá dá uma lista.
Xnor

@xnor Obrigado! Esqueceu sobre isso.
21416 DLosc

5

Python, 61 bytes

lambda n:[i+1for i in range(n/2,n)if-~i&~i&4**n/3>>(-~i&i<1)]

É um pouco mais fácil entender esse código menos eficiente:

lambda n:[i for i in range(n/2+1,n+1)if((i&-i)**.5%1>0)^(i&~-i>0)]

Isso usa uma caracterização direta de números isolados:

Um número ié aloned se, quando decomposto como i = a * 2^bcom bestranho, seja

  • a>1e bé par ou
  • a==1e bé estranho

Os números isolados para ntodos são números isolados ino intervalo n/2 + 1 <= i <= n.

Por que isso se aplica? Ao fazer o processo n, digamos que removemos um número ímpar ana metade inferior ( 1para n/2). Em seguida, 2*aé removido, não importa onde esteja na lista. Então, 4*apermanece (se existir). Mas se estiver na metade inferior, o processo de exclusão chegará a ele e removerá ambos 4*ae 8*a. Assim, vemos que um número superior a metade é removido se é de forma 2*a, 8*a... com estranho c, mas estadias se ele tem forma a, 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 com a=2, e a regra para potências de 2 é invertida.

lambda n:[i for i in range(n/2+1,n+1)if((i&-i)**.5%1>0)^(i&~-i>0)]

No código acima, (i&-i)**.5%1>0verifica se ifalta o formulário i = a * 2^bcom bímpar, pelo truque de bits para extrair o maior fator de potência dois, 2^b = i&-ie depois verifica se o resultado não é um quadrado perfeito. Então, i&~-i>0é outro truque para verificar se inão é uma potência perfeita de 2. Essas condições são então corrigidas.

Há mais algumas melhorias aqui

lambda n:[i+1for i in range(n/2,n)if-~i&~i&4**n/3>>(-~i&i<1)]

Primeiro, deslocamos o índice do intervalo 1 para baixo, para reduzir para range(n/2,n)de range(n/2+1,n+1), compensando, substituindo todos ipor i+1(ou ~-i).

Se uma potência de 2 é um número, uma potência de 4(2 ^ bcom bpar) pode ser verificada com 2**c/3um valor grande c. Isso ocorre porque 2**c/3possui representação binária 10101...101com as dos bits posicionados pares. Usando o c=2*nsuficiente. Para negar o resultado quando ié uma potência de 2, dividimos pela metade esse número, colocando 1as posições ímpares.


4

Groovy, 65 58 bytes

Idéia de algoritmo do DSLoc , que percebeu que você só precisava remover os duplos.

{n->a=(2..n);(2..(n/2)).each{if(it in a){a-=[it,it*2]}};a}

Aqui está um detalhamento:

{
    n->
    a=(2..n);             // Store [2,...,n].
    (2..(n/2)).each {     // From 2 to half of n.
        if(it in a){      // If it's there...
            a-=[it,it*2]  // Remove it and its double, store in a.
        }
    };
    a                     // Return a.
}

4

Perl, 53 49 45 44 bytes

Inclui +1 para -n

Dê o número de entrada no STDIN:

perl -M5.010 aloned.pl <<< 22

aloned.pl:

#!/usr/bin/perl -n
@F[$F[$_*2]/2,$_*2,1]=0,$_&&say for@F=0..$_

A verificação direta dos números possíveis é mais longa:

map{/$/;$_/=4until$_%4;$_%2^$_<3&&say$`}$_/2+1..$_

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.


3

MATL , 18 bytes

Emprestou a idéia "multiplicar por 2" da resposta 05AB1E de @ Emigna .

q:Qt"t1)tEhym?6MX-

Experimente online!

Explicação

q:Q        % Input n implicitly. Push [2 3 ... n]
t"         % Duplicate. For each: repeat n-1 times
  t1)      %   Duplicate. Get first element from current array, say k
  tEh      %   Append twice that value: gives array [k 2*k]
  y        %   Push another copy of current array
  m?       %   If both k and 2*k are members of the array 
    6M     %     Push [k 2*k] again
     X-    %     Set difference: remove from current array
           %   End if implicitly
           % End for each implicitly
           % Display implicitly

Você só precisa verificar se k é um membro, não sei se isso economiza alguns bytes ou não.
Magic Octopus Urn

@carusocomputing Obrigado! Inicialmente, verifiquei apenas 2 * k (se é isso que você quer dizer). Em seguida, adicionou-se K existe porque mais tarde I reutilizar a matriz de dois elementos para remover tanto a partir da matriz geral
Luis Mendo

3

Haskell, 71 69 62 56 bytes

g(a:b)|s<-filter(/=2*a)b=[a|s==b]++g s
g x=x
q n=g[2..n]

Exemplo de uso: q 22-> [12,13,15,17,19,20,21].

Se houver um múltiplo do primeiro número a, será 2*a. Mantenha ase 2*anão estiver na lista e anexe uma chamada recursiva com ae 2*aremovida da lista.


Hehe, eu ia lhe dizer que o GCD foi um exagero, mas você conseguiu.
Magic Octopus Urn


2

Ruby, 124

Comparando pontuações com outras respostas, esta é obviamente a abordagem errada:

->n{a={};b=[*2..n].each{|k|a[k]=7}
b.map{|i|g=b.select{|x|a[i]&&a[x]&&x%i<1}
a[g[0]]=a[g[1]]=!g[1]}
a.select{|k,v|v&k}.keys}

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.


2

PHP, 98 bytes

foreach($r=range(2,$argv[1])as$v)$a=&$r[$v-2]&&$b=&$r[$v*2-2]?$b=$a="":(!$a?:print$x?",$a":$x=$a);

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);


As tarefas $ae os $bparênteses não precisam? Malvado!
Titus

-1 byte com a vírgula à direita: (!$a?:print"$a,")-> print$a?"$a,":"". -2 bytes para as duas versões se você usar o sublinhado como separador.
Titus

-2 bytes: foreach(... as$v), $v-2em vez de $ke $v*2-2, em vez de $k*2+2.
Titus

@ Titus Eu tentei depois que você comentar $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.
Jörg Hülsermann 24/10

@Titus encontrado agora php.net/manual/en/language.operators.precedence.php & bit a bit e referências haves uma precedência mais elevada, em seguida, o &&operador
Jörg Hülsermann

1

Javascript, 149 bytes

function a(n){o=Array.from(Array((n+1)).keys());o.shift();o.shift();for(i=1;i<o.length;i++){if(o[i]%o[0]==0){o.splice(i,1);o.shift();i=0;}}return o;}

Aqui está um exemplo de trabalho. Todo o HTML e a função wrapper () são apenas interativos.

Este snippet de código não-protegido possui alguns comentários e permite que você veja interativamente as etapas de qualquer entrada.


1

JavaScript (ES6), 92 bytes

f=(n,R=[...Array(n-1)].map((_,i)=>i+2),[i,...r]=R)=>~r.indexOf(i*=2)?f(n,r.filter(x=>x-i)):R

Eu pensei que tinha postado isso ontem, mas obviamente não ...

Aqui está outra versão:

f=(n,R=[...Array(n-1)].map((_,i)=>i+2),[i,...r]=R,q=r.filter(x=>x-i*2))=>q+""!=r+""?f(n,q):R

1

Java 7, 210 bytes

import java.util.*;List c(int n){List<Integer>l=new ArrayList();int i=1;for(;i++<n;l.add(i));for(i=1;i++<n;)for(int x:l)if(i!=x&x%i<1&l.indexOf(i)>=0){l.remove((Integer)i);l.remove((Integer)x);break;}return l;}

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.

import java.util.*;
class M{
  static List c(int n){
    List<Integer> l = new ArrayList();
    int i = 1;
    for(; i++ < n; l.add(i));
    for(i = 1; i++ < n;){
      for(int x : l){
        if(i != x & x%i < 1 & l.indexOf(i) >= 0){
          l.remove((Integer)i);
          l.remove((Integer)x);
          break;
        }
      }
    }
    return l;
  }

  public static void main(String[] a){
    System.out.println(Arrays.toString(c(2).toArray()));
    System.out.println(Arrays.toString(c(6).toArray()));
    System.out.println(Arrays.toString(c(15).toArray()));
    System.out.println(Arrays.toString(c(20).toArray()));
    System.out.println(Arrays.toString(c(22).toArray()));
  }
}

Saída:

[2]
[5]
[8, 9, 11, 12, 13, 15]
[11, 12, 13, 15, 17, 19, 20]
[12, 13, 15, 17, 19, 20, 21]

1

Raquete 191 bytes

(let loop((fl(range 2(add1 n)))(fg #f))(define i(first fl))(for((j(rest fl))
#:when(= 0(modulo j i))#:final(= 0(modulo j i)))
(set! fl(remove*(list i j)fl))(set! fg #t))(if fg(loop fl #f)fl))

Ungolfed (comentários após ';'):

(define (f n)
  (let loop ((fl (range 2 (add1 n)))  ; create a full list of numbers
             (fg #f))                 ; flag to show if main list is modified
    (define i (first fl))
    (for ((j (rest fl)) #:when (= 0 (modulo j i))  ; test divisibility
                        #:final (= 0 (modulo j i)))
      (set! fl (remove* (list i j) fl))  ; remove these from main list
      (set! fg #t))
    (if fg (loop fl #f)              ; if main list modified, check again,
        fl)))                         ; else print modified list.

Teste:

(f 2)
(f 6)
(f 15)
(f 20)
(f 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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.