ALONED sayıları çıktı


21

6'ya kadar olan doğal diziyi göz önünde bulundurun (dikkate almayın 1) :

2,3,4,5,6

Soldan taramaya başlayacağız (bu durumda 2'den itibaren), 2'ye bölünebilen bir sayı arayacağız (burada 4) ve ardından listedeki her iki sayıyı da (burada 2 ve 4) kaldırarak, listenin azaltacağı şekilde:

3,5,6

Aynı prosedüre devam ediyoruz, en solda 3, bu nedenle 3 ile bölünebilen sayıyı aradık. 6 kesinlikle bu sayı ve böylece 3 ve 6 silinir,

5 

Şimdi, böyle bir arama yapılamaz. Bu, n = 6 için ALONED numaralarının listesi haline gelir.

AMAÇ

  1. 1'den büyük bir sayı verildiğinde, karşılık gelen tüm sayıları yazdırın.

GİRİŞ

2
6
15
20
22

ÇIKTI

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

Başka bir örnekle çalışıldı

N = 22 için

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

Bu , yani bayt cinsinden en kısa kod kazanır.


7
Sadece bildiğiniz gibi, ana siteye göndermeden önce geri bildirim için eksik zorluklar gönderebileceğiniz bir sanal alana sahibiz .
DJMcMayhem

4
Artan sıradaki sayıların listesini döndürmek zorunda mıyız yoksa sıralanmamış bir liste ya da küme de kabul edilebilir mi?
Dennis,

artan düzende olmalıdır.
officialaimm

Yanıtlar:


5

05AB1E , 22 17 15 14 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

Xnor sayesinde -6 bayt

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

Stdin'deki giriş numarasını alır. Ideone!

açıklama

İlk listeyi giriş numarasından oluşturup saklıyoruz L. Ardından, son sayı ilk sayının 2 katından büyük veya ona eşitken döngü yapın ve ilk sayının 2 katını listeden kaldırın. Bu her zaman tarafından bölünebilen bir sonraki sayı olacaktır L[0]. L=L[1:]ilk sayıyı da çıkartıyor. Koşul artık doğru olmadığında, daha fazla kaldırma işlemi gerçekleştirilemez ve liste yazdırılır.


Python 2'de rangezaten bir liste var.
xnor

@xnor Teşekkürler! Bunu unuttum.
DLosc

5

Python, 61 bayt

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

Bu daha az golf kodunu anlamak biraz daha kolay:

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

Bu, aloned sayıların doğrudan karakterizasyonunu kullanır:

Çok sayıda iolan aloned olarak ayrıştırılmış zaman, eğer i = a * 2^bile btek ya

  • a>1ve bhatta
  • a==1ve bgarip

İçin aloned sayılar ntüm aloned sayılardır iaralığında n/2 + 1 <= i <= n.

Bu neden tutuyor? İçin işlem yaparken, alt yarıda ntek bir sayıyı kaldırdığımızı söyleyin a( 1to n/2). Sonra 2*alistenin neresinde olursa olsun silinir. Öyleyse 4*akalır (eğer varsa). O alt yarısında Ama eğer, silme işlemi bunu almak ve her iki kaldıracaktır 4*ave 8*a. Yani bunu formun ise bir üst yarısı numarası kaldırılırsa görüyoruz 2*a, 8*agarip ile ... co formu varsa, ancak kalır a, 4*a, 8*a, ...

Bunun istisnası, a=1listede başlamayan ve kaldırılmayan içindir. Sonuç olarak, çıkarma zinciri ile başlar a=2ve 2'nin güçleri için kural çevrilir.

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

Yukarıdaki kodda, (i&-i)**.5%1>0çekler olsun ibiçimde yoksun i = a * 2^bolan ben büyük güç-iki faktör ayıklamak için bit numarayla, tek, 2^b = i&-isonuç mükemmel bir kare değilse o zaman kontrol ediyorum. O zaman, 2 mükemmel bir güç olmadığını i&~-i>0kontrol etmek için başka bir hiledir i. Bu koşullar daha sonra xor'ed edilir.

Burada biraz daha gelişme var

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

İçin kısaltmak için aşağı Birincisi, biz aralığı 1 endeksini kaydırmaya range(n/2,n)gelen range(n/2+1,n+1)tüm değiştirerek telafi iile i+1(ya ~-i).

2'nin kuvvetlerine İster numara bir güç olduğunu 4(2 ^ bile bbirlikte ve-ing kontrol edilebilir çift) 2**c/3bazı büyük için c. Bunun nedeni 2**c/3, çift 10101...101konumlu bitlerde olanlarla ikili gösterime sahip olmasıdır. Kullanma c=2*nyeterli. i2'nin gücü olduğunda sonucu yok saymak için bu sayıyı yarıya düşeriz, 1bunun yerine tek sıralara koyarız .


4

Groovy, 65 58 Bayt

DSLoc'un Algoritma fikri, sadece çiftleri çıkarmanız gerektiğini farkeden kim.

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

İşte bir döküm:

{
    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 bayt

İçin +1 içerir -n

STDIN'e giriş numarası verin:

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

aloned.pl:

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

Olası numaraları doğrudan kontrol etmek daha uzun:

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

Bu, üst yarı aralıktaki tüm sayıları kontrol eder. Sayının 2 ve sonra güç olması dışında (1 orijinal serinin dışında kaldığından), asıl çarpan olarak eşit sayıları 2 olan sayıları saklayın. Ancak bu yöntem diğer diller için iyi çalışmalıdır.


3

MATL , 18 bayt

@ Emigna'nın 05AB1E yanıtından "2 ile çarp " fikrini ödünç aldım .

q:Qt"t1)tEhym?6MX-

Çevrimiçi deneyin!

açıklama

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

Sadece k'nin bir üye olup olmadığını kontrol etmeniz gerekir, bunun sizi bayt kurtarıp kaydetmediğini bilmemeniz gerekir.
Magic Octopus Urn

@carusocomputing Teşekkürler! Başlangıçta sadece 2 * k kontrol ettim (demek istediğin buysa). Sonra buraya k ekledim, çünkü daha sonra bu iki element dizisini her ikisini de genel diziden çıkarmak için tekrar kullandım
Luis Mendo

3

Haskell, 71 69 62 56 bayt

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

Kullanım örneği: q 22-> [12,13,15,17,19,20,21].

İlk sayının bir katı varsa a, o zaman 2*a. Tutun aeğer 2*alistede yok ve bir özyinelemeli çağrı eklemek ave 2*alisteden kaldırılır.


Hehe, sana GCD'nin aşırı öldürüldüğünü söyleyecektim, ama sen kendin aldın.
Magic Octopus Urn


2

Ruby, 124

Puanların diğer cevaplarla karşılaştırılması, bu açıkça yanlış bir yaklaşımdır:

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

Buradaki zekice bit a[g[0]]=a[g[1]]=!g[1], hash'ın değerlerini gerektiği gibi doğru / yanlış olarak ayarlayan şey .


2

PHP, 98 Bayt

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 Bayt save by @Titus Teşekkürler

Sonunda virgül girmesine izin verilirse, (!$a?:print"$a,");bunun yerine 9 Bayt kısaltılabilir .(!$a?:print$x?",$a":$x=$a);


İçin atamaları etmiyor musun $ave $bihtiyaç parantez? Wicked!
Titus

Son virgül ile -1 bayt: (!$a?:print"$a,")-> print$a?"$a,":"". Alt çizgi ayırıcı olarak kullanıyorsanız, her iki sürüm için -2 bayt.
Titus

-2 bayt: foreach(... as$v), $v-2yerine $kve $v*2-2yerine $k*2+2.
Titus

Yorum yapmadan sonra @Titus ben denedim $a=&$r[$k]&&$b=&$r[$k*2+2]gibi çalışır $a=$r[$k]and$b=$r[$k*2+2]. Referanslar ve &&operatör ile kombinasyonları açıklayan bir sayfa bulamadığım için üzgünüm . Fakat ödevlere değil referanslara ihtiyacım var. İzleyen bir virgül veya başka bir ayırıcıya izin verilip verilmediğinden emin değilim.
Jörg Hülsermann

@Titus şimdi buldu php.net/manual/en/language.operators.precedence.php & bitwise ve referanslar &&operatöre göre daha yüksek Önceliklidir
Jörg Hülsermann 24:16

1

Javascript, 149 bayt

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

İşte çalışan bir örnek. Tüm HTML ve wrapper () işlevi aslında etkileşimlidir.

Bu kodlanmamış kod parçacığının bazı yorumları var ve herhangi bir girişin adımlarını etkileşimli olarak görmenizi sağlar.


1

JavaScript (ES6), 92 bayt

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

Bunu dün gönderdiğimi sanıyordum ama belli ki ...

İşte başka bir sürüm:

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 bayt

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

Kesinlikle farklı bir yaklaşım kullanarak biraz daha golf oynayabilir, muhtemelen bazı hileler ile bir dizi kullanarak. Oyunculuk, mola, yazılı liste ve if kontrolleri nedeniyle beklenenden biraz daha uzun, ama işe yarıyor.

Ungolfed ve test kodu:

Burada dene.

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

Çıktı:

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

1

Raket 191 bayt

(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 (';' sonrası yorumlar):

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

Test yapmak:

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

Çıktı:

'(2)
'(5)
'(8 9 11 12 13 15)
'(11 12 13 15 17 19 20)
'(12 13 15 17 19 20 21)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.