ALONED番号を出力します


21

6までの自然なシーケンスを考慮します(1を無視)

2,3,4,5,6

左からスキャンを開始し(この場合は2から)、2で割り切れる数値(ここでは4)を検索し、リストから次のように両方の数値を削除します(ここでは2と4)。

3,5,6

同じプロセスを続けます。ここでは左端が3なので、3で割り切れる数を検索します。6は確実にその数なので、3と6は削除されます。

5 

現在、このような検索はこれ以上できません。したがって、これはn = 6のALONED番号のリストになります。

目的

  1. nが1より大きい場合、対応するすべての番号を出力します。

入力

2
6
15
20
22

出力

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

まだ別の例

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)

これはであるため、バイト単位の最短コードが優先されます。


7
ご存知のように、メインサイトに投稿する前に、フィードバックのために不完全なチャレンジを投稿できるサンドボックスがあります。
DJMcMayhem

4
数字のリストを昇順で返す必要がありますか、それとも順不同のリストまたはセットでも受け入れられますか?
デニス

昇順である必要があります。
officialaimm

回答:


5

05AB1E22 17 15 14バイト

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

オンラインでお試しください!

説明

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

パイソン2、90の 79 73バイト

xnorのおかげで-6バイト

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

stdinの入力番号を取得します。できた!

説明

入力番号から初期リストを作成し、に保存しLます。次に、最後の数値が最初の数値の2倍以上である間にループし、リストから最初の数値の2倍を削除します。これは、常に次の数値で割り切れL[0]ます。L=L[1:]最初の番号も同様に離陸します。条件が真でなくなると、それ以上削除できなくなり、リストが出力されます。


Python 2では、rangeすでにリストが提供されています。
-xnor

@xnorありがとう!それを忘れました。
DLosc

5

Python、61バイト

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

このゴルフの少ないコードを理解するのは少し簡単です:

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

これは、単独番号の直接の特性化を使用します。

番号がiされalonedとして分解する際、場合i = a * 2^bb奇数のどちらか、

  • a>1そしてb偶数である、または
  • a==1そしてb奇妙です

の単独番号は、区間内のn単独番号です。in/2 + 1 <= i <= n

なぜこれが成り立つのですか?のプロセスを実行する場合、下半分のn奇数a1to n/2)を削除するとします。次に、2*aリストのどこにいても削除されます。したがって、4*a残ります(存在する場合)。しかし、下半分にある場合、削除プロセスはそれに到達し、との両方4*aを削除し8*aます。だから、我々はそれが形式だ場合、上半分の数が削除されることがわかり2*a8*a奇数で... cそれは形を持っている場合、しかしステイa4*a8*a、...

例外はa=1で、リストで開始されないため、削除されません。その結果、除去チェーンはで始まりa=2、2のべき乗のルールが反転します。

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

上記のコードでは、ビットトリックによって最大の2のべき乗因子を抽出することにより、奇数の形式が(i&-i)**.5%1>0ないかどうかをチェックし、結果が完全な正方形でないかどうかをチェックします。次に、2の完全な累乗ではないかどうかを確認するためのもう1つのトリックです。これらの条件はxor'edです。ii = a * 2^bb2^b = i&-ii&~-i>0i

ここにいくつかの改善点があります

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

最初に、範囲1のインデックスをにシフトしてrange(n/2,n)from を短縮し、range(n/2+1,n+1)すべてii+1(または~-i)に置き換えて補正します。

2のパワーが数であるかどうかはの力である4(2 ^ bbさえ)がでと-INGで確認することができ2**c/3、いくつかの大規模なためc。これは、偶数位置のビットに1の2**c/3バイナリ表現があるため10101...101です。c=2*n十分に使用します。結果iが2のべき乗である場合、結果を無効にするために、この数を半分に1し、代わりに奇数を配置します。


4

Groovy、65 58バイト

DSLocのアルゴリズムのアイデアは、doubleを削除するだけでよいことに気付きました。

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

内訳は次のとおりです。

{
    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バイト

+1を含む -n

STDINに入力番号を指定します。

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

aloned.pl

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

可能な数を直接確認する方が長くなります。

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

これにより、上半分の範囲のすべての数値がチェックされます。偶数が2のべき乗である場合と奇数の場合を除いて、偶数の2の数を素因数として保持します(元の系列から1が除外されるため)。ただし、この方法は他の言語でもうまく機能するはずです。


3

MATL、18バイト

@Emignaの05AB1E回答から「2で乗算」というアイデアを取り入れました

q:Qt"t1)tEhym?6MX-

オンラインでお試しください!

説明

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

kがメンバーであるかどうかを確認するだけでよく、それによってバイトが節約されるかどうかはわかりません。
魔法のタコUr

@carusocomputingありがとう!最初にチェックしたのは2 * kだけです(もしそれがあなたの言う意味なら)。その後、kを追加しました。これは、後で2つの要素の配列を再利用して、両方を一般的な配列から削除するためです
ルイスメンドー

3

Haskell、71 69 62 56バイト

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

使用例:q 22-> [12,13,15,17,19,20,21]

最初の数の倍数がある場合a、それは2*aです。キープa場合2*a、リストにないとして再帰呼び出しを追加aし、2*aリストから削除。


ふふ、GCDはやりすぎだと言っていましたが、あなたはそれを自分で手に入れました。
魔法のタコUr


2

ルビー、124

スコアを他の回答と比較すると、これは明らかに間違ったアプローチです。

->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[g[0]]=a[g[1]]=!g[1]、必要に応じてハッシュの値をtrue / falseに設定します。


2

PHP、98バイト

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

@Titus Thank Youによる8バイトの節約

末尾のコンマが許可されている場合は、(!$a?:print"$a,");代わりに9バイトを短くすることができます (!$a?:print$x?",$a":$x=$a);


括弧への割り当て$a$b必要はありませんか?邪悪な!
タイタス

末尾にコンマが付いた-1バイト:(!$a?:print"$a,")-> print$a?"$a,":""。アンダースコアをセパレータとして使用する場合、両方のバージョンで-2バイト。
タイタス

-2バイト:foreach(... as$v)$v-2代わりの$k及び$v*2-2代わりに$k*2+2
タイタス

@Titusの$a=&$r[$k]&&$b=&$r[$k*2+2]ようにコメントしてから試してみました$a=$r[$k]and$b=$r[$k*2+2]。参照と&&演算子の組み合わせを説明するページが見つからなかったことが残念です。しかし、割り当てではなく参照が必要です。末尾のコンマまたは他の区切り文字が許可されているかどうかはわかりません。
ヨルクヒュルサーマン

@Titusは、それが今見つけphp.net/manual/en/language.operators.precedence.php &ビット単位と参照がより高い優先順位をぐるぐる&&オペレータ
イェルクHülsermann

1

Javascript、149バイト

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

これが実際の例です。すべてのHTMLおよびwrapper()関数は、実際にはインタラクティブであるためです。

この未使用のコードスニペットにはいくつかのコメントがあり、任意の入力の手順をインタラクティブに確認できます。


1

JavaScript(ES6)、92バイト

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

私は昨日これを投稿したと思っていましたが、明らかにそうではありません...

別のバージョンを次に示します。

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バイト

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

別のアプローチを使用して、おそらくいくつかのトリックを使用してアレイを使用することにより、間違いなくさらにゴルフをすることができます。キャスト、ブレーク、型付きリスト、およびif-checksにより、予想より少し長くなりますが、動作します。

未ゴルフ&テストコード:

ここで試してみてください。

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

出力:

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

1

ラケット191バイト

(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(「;」の後にコメント):

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

テスト:

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

出力:

'(2)
'(5)
'(8 9 11 12 13 15)
'(11 12 13 15 17 19 20)
'(12 13 15 17 19 20 21)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.