Podaj numery ALONED

21

Rozważ naturalną sekwencję do 6 (pomiń 1) :

2,3,4,5,6

Rozpoczynamy skanowanie od lewej (w tym przypadku od 2), szukamy liczby podzielnej przez 2 (tutaj 4), a następnie usuwamy obie liczby z listy (tutaj 2 i 4), tak że lista zmniejsza się do:

3,5,6

Kontynuujemy ten sam proces, tutaj najbardziej na lewo jest 3, więc szukamy liczby podzielnej przez 3. 6 to z pewnością ta liczba, a zatem 3 i 6 są usuwane,

5 

Teraz nie można już przeprowadzać takich poszukiwań. Staje się to więc listą ZAWARTYCH liczb dla n = 6.

CEL

  1. Biorąc pod uwagę liczbę n większą niż 1, wydrukuj wszystkie odpowiadające sobie numery.

WKŁAD

2
6
15
20
22

WYDAJNOŚĆ

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

JESZCZE INNY WYKONANY PRZYKŁAD

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

To jest , więc wygrywa najkrótszy kod w bajtach.

Officialaimm
źródło
7
Właśnie dla Ciebie wiemy, że mamy piaskownicę, w której możesz publikować niekompletne wyzwania w celu uzyskania opinii przed opublikowaniem go na głównej stronie.
DJMcMayhem
4
Czy musimy zwracać listę liczb w kolejności rosnącej, czy też lista nieuporządkowana lub zestaw byłyby również do przyjęcia?
Dennis
powinien być w porządku rosnącym.
officialaimm

Odpowiedzi:

5

05AB1E , 22 17 15 14 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
Emigna
źródło
6

Python 2, 90 79 73 bajtów

-6 bajtów dzięki xnor

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

Pobiera numer wejścia na standardowe wejście. Ideone to!

Wyjaśnienie

Pierwszą listę konstruujemy na podstawie numeru wejściowego i przechowujemy w niej L. Następnie zapętl się, gdy ostatnia liczba jest większa lub równa 2-krotności pierwszej liczby i usuń 2-krotnie pierwszą liczbę z listy. Będzie to zawsze następna liczba podzielna przez L[0]. L=L[1:]zdejmuje również pierwszy numer. Gdy warunek nie jest już spełniony, nie można wykonać żadnych dalszych operacji usuwania, a lista jest drukowana.

DLosc
źródło
W Pythonie 2 rangejuż podaje listę.
xnor
@xnor Thanks! Zapomniałem o tym.
DLosc
5

Python, 61 bajtów

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

Nieco łatwiej zrozumieć ten mniej golfowy kod:

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

Wykorzystuje to bezpośrednią charakterystykę numerów w aloncie:

Wiele ijest aloned jeśli, gdy rozkłada się jak i = a * 2^bz bdziwne, albo

  • a>1i bjest parzysty, lub
  • a==1i bjest dziwny

Wydzielone liczby dla nto wszystkie wyodrębnione liczby iw przedziale n/2 + 1 <= i <= n.

Dlaczego tak się dzieje? Podczas wykonywania procesu npowiedzmy, że usuwamy liczbę nieparzystą aw dolnej połowie ( 1do n/2). Następnie 2*ajest usuwany bez względu na to, gdzie jest na liście. 4*aPozostaje więc (jeśli istniał). Ale jeśli jest w dolnej połowie, proces usuwania dojdzie do niego i usunie oba 4*ai 8*a. Tak więc widzimy, że liczba górna połowa zostanie usunięty, jeśli to formy 2*a, 8*a... z dziwne c, ale pozostaje, jeśli ma postać a, 4*a, 8*a, ...

Wyjątkiem jest a=1, który nie zaczyna się na liście i dlatego nie jest usuwany. W rezultacie łańcuch usuwania zaczyna się od a=2, a zasada dla potęg 2 jest odwrócona.

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

W powyższym kodzie (i&-i)**.5%1>0sprawdza, czy ibrakuje formy i = a * 2^bz bnieparzystym, za pomocą sztuczki bitowej w celu wyodrębnienia największego współczynnika potęgi dwóch 2^b = i&-i, a następnie sprawdza, czy wynik nie jest idealnym kwadratem. Następnie i&~-i>0jest kolejna sztuczka, aby sprawdzić, czy inie jest to doskonała potęga 2. Te warunki są następnie xor'owane.

Tutaj jest kilka ulepszeń

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

Po pierwsze, przesuwamy indeks zakresu 1 w dół, aby skrócić do range(n/2,n)z range(n/2+1,n+1), kompensując zastępując wszystko iprzez i+1(lub ~-i).

To, czy potęga 2 jest liczbą, jest potęgą 4(2 ^ bz bparzystą), można sprawdzić przez i 2**c/3dla niektórych dużych c. Jest tak, ponieważ 2**c/3ma reprezentację binarną 10101...101z bitami w parzystych pozycjach. Używanie c=2*nwystarcza. Aby zanegować wynik, gdy ijest potęgą 2, zmniejszamy tę liczbę o połowę, stawiając 1zamiast tego nieparzyste pozycje.

xnor
źródło
4

Groovy, 65 58 bajtów

Pomysł algorytmu od DSLoc , który zauważył, że wystarczy usunąć podwójne.

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

Oto podział:

{
    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.
}
Urna Magicznej Ośmiornicy
źródło
4

Perl, 53 49 45 44 bajtów

Obejmuje +1 dla -n

Podaj numer wejściowy na STDIN:

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

aloned.pl:

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

Bezpośrednie sprawdzanie możliwych numerów jest dłuższe:

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

To sprawdza wszystkie liczby w górnej połowie zakresu. Zachowaj liczby, które mają parzystą liczbę 2 jako czynniki pierwsze, z wyjątkiem sytuacji, gdy liczba jest potęgą 2, a następnie nieparzysta (ponieważ 1 jest pominięty w pierwotnej serii). Ta metoda powinna jednak działać dobrze w przypadku innych języków.

Ton Hospel
źródło
3

MATL , 18 bajtów

Zapożyczono pomysł „pomnóż przez 2” z odpowiedzi @ Emigna 05AB1E .

q:Qt"t1)tEhym?6MX-

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
Musisz tylko sprawdzić, czy k jest członkiem, nie wiem, czy to oszczędza bajty, czy nie.
Magic Octopus Urn
@carusocomputing Thanks! Początkowo sprawdziłem tylko 2 * k (jeśli o to ci chodzi). Następnie dodałem tam k, ponieważ później ponownie używam tej tablicy dwóch elementów, aby usunąć oba z ogólnej tablicy
Luis Mendo
3

Haskell, 71 69 62 56 bajtów

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

Przykład użycia: q 22-> [12,13,15,17,19,20,21].

Jeśli jest wielokrotność pierwszego numeru a, to jest 2*a. Zachowaj, ajeśli 2*anie ma jej na liście, dołącz połączenie rekurencyjne ai 2*ausuń je z listy.

nimi
źródło
Hehe, chciałem ci powiedzieć, że GCD to przesada, ale sam to rozumiesz.
Magic Octopus Urn
2

Pyth - 19 bajtów

Na pewno będzie refaktoryzacja.

u?Kf!%ThGtG-tGhKGtS

Pakiet testowy .

Maltysen
źródło
2

Ruby, 124

Porównując wyniki z innymi odpowiedziami, jest to oczywiście niewłaściwe podejście:

->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}

Nieco sprytny bit polega na a[g[0]]=a[g[1]]=!g[1]tym, że w razie potrzeby ustawia wartości skrótu na true / false.

Nie ten Charles
źródło
2

PHP, 98 bajtów

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

8 bajtów oszczędzanych przez @Titus Dziękujemy

Jeśli dozwolony jest przecinek końcowy, można go skrócić o 9 bajtów (!$a?:print"$a,");zamiast(!$a?:print$x?",$a":$x=$a);

Jörg Hülsermann
źródło
Czy zadania $ai $bnawiasy nie są potrzebne? Niegodziwy!
Tytus
-1 bajt z przecinkiem końcowym: (!$a?:print"$a,")-> print$a?"$a,":"". -2 bajty dla obu wersji, jeśli użyjesz podkreślenia jako separatora.
Tytus
-2 bajtów: foreach(... as$v), $v-2zamiast $ki $v*2-2zamiast $k*2+2.
Tytus
@Titus Wypróbowałem to po tym, $a=&$r[$k]&&$b=&$r[$k*2+2]jak Twój komentarz działa $a=$r[$k]and$b=$r[$k*2+2]. Przykro mi, że nie znalazłem strony wyjaśniającej kombinacje z referencjami i &&operatorem. Ale potrzebuję referencji, a nie zadań. Nie jestem pewien, czy dozwolony jest przecinek końcowy lub inny separator.
Jörg Hülsermann
@Titus stwierdził, że teraz php.net/manual/en/language.operators.precedence.php & bitowe i odniesienia mają wyższy priorytet niż &&operator
Jörg Hülsermann
1

JavaScript, 149 bajtów

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

Oto działający przykład. Wszystkie funkcje HTML i wrapper () są po prostu interaktywne.

Ten niestosowany fragment kodu ma kilka komentarzy i pozwala interaktywnie zobaczyć kroki dla każdego podanego wejścia.

MichaelS
źródło
1

JavaScript (ES6), 92 bajty

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

Myślałem, że opublikowałem to wczoraj, ale oczywiście nie ...

Oto kolejna wersja:

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
ETHprodukcje
źródło
1

Java 7, 210 bajtów

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

Można zdecydowanie zagrać w golfa, stosując inne podejście, prawdopodobnie używając tablicy z kilkoma sztuczkami. Ze względu na obsadę, break, listę typów i if-check jest nieco dłuższy niż oczekiwano, ale działa.

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wydajność:

[2]
[5]
[8, 9, 11, 12, 13, 15]
[11, 12, 13, 15, 17, 19, 20]
[12, 13, 15, 17, 19, 20, 21]
Kevin Cruijssen
źródło
1

Rakieta 191 bajtów

(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 (komentarze po ';'):

(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.

Testowanie:

(f 2)
(f 6)
(f 15)
(f 20)
(f 22)

Wydajność:

'(2)
'(5)
'(8 9 11 12 13 15)
'(11 12 13 15 17 19 20)
'(12 13 15 17 19 20 21)
rnso
źródło