Xuất ra số ALONED


21

Xem xét trình tự tự nhiên lên đến 6 (bỏ qua 1) :

2,3,4,5,6

Chúng tôi bắt đầu quét từ bên trái (trong trường hợp này là từ 2), tìm kiếm một số chia hết cho 2 (ở đây 4) và sau đó xóa cả hai số khỏi danh sách (ở đây 2 & 4), để danh sách giảm xuống:

3,5,6

Chúng tôi tiếp tục quá trình tương tự, ở đây ngoài cùng bên trái là 3, vì vậy chúng tôi tìm kiếm số chia hết cho 3. 6 chắc chắn là số đó và do đó 3 và 6 bị xóa,

5 

Bây giờ, không có thêm các tìm kiếm như vậy có thể được thực hiện Do đó, đây trở thành danh sách các số ALONED cho n = 6.

MỤC TIÊU

  1. Cho một số n lớn hơn 1, in tất cả các số được sắp xếp tương ứng.

ĐẦU VÀO

2
6
15
20
22

ĐẦU RA

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

YET KHÁC LÀM VIỆC NGOÀI RA

Với 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)

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


7
Để bạn biết, chúng tôi có một hộp cát nơi bạn có thể đăng các thử thách chưa hoàn thành để phản hồi trước khi đăng nó lên trang web chính.
DJMcMayhem

4
Chúng ta có phải trả về một danh sách các số theo thứ tự tăng dần hay một danh sách không có thứ tự hoặc một bộ cũng được chấp nhận?
Dennis

nên theo thứ tự tăng dần.
chính thức tuyên bố

Câu trả lời:


5

05AB1E , 22 17 15 14 byte

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

Hãy thử trực tuyến!

Giải trình

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 byte

-6 byte nhờ xnor

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

Lấy số đầu vào trên stdin. Nghĩa là nó!

Giải trình

Chúng tôi xây dựng danh sách ban đầu từ số đầu vào và lưu trữ nó trong L. Tiếp theo, lặp trong khi số cuối cùng lớn hơn hoặc bằng 2 lần số đầu tiên và xóa 2 lần số đầu tiên khỏi danh sách. Đây sẽ luôn là số tiếp theo chia hết cho L[0]. L=L[1:]cũng mất số đầu tiên. Khi điều kiện không còn đúng nữa, không thể xóa thêm nữa và danh sách được in.


Trong Python 2, rangeđã đưa ra một danh sách.
xnor

@xnor Cảm ơn! Quên về điều đó.
DLosc

5

Python, 61 byte

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

Dễ hiểu hơn một chút về mã ít chơi gôn này:

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

Điều này sử dụng một đặc tính trực tiếp của các số được sắp xếp:

Một số iđược aloned nếu, khi bị phân hủy như i = a * 2^bvới bkỳ quặc, hoặc

  • a>1bthậm chí, hoặc
  • a==1blà số lẻ

Các số nđược sắp xếp cho tất cả các số được sắp xếp itrong khoảng n/2 + 1 <= i <= n.

Tại sao điều này giữ? Khi thực hiện quá trình n, giả sử chúng ta xóa một số lẻ aở nửa dưới ( 1đến n/2). Sau đó, 2*ađược loại bỏ bất kể nó ở đâu trong danh sách. Vì vậy, 4*avẫn còn (nếu nó tồn tại). Nhưng nếu nó ở nửa dưới, quá trình xóa sẽ đến và loại bỏ cả hai 4*a8*a. Vì vậy, chúng ta thấy rằng một số trên nửa bị loại bỏ nếu nó là hình thức 2*a, 8*a... với số lẻ c, nhưng ở lại nếu nó có hình thức a, 4*a, 8*a, ...

Ngoại lệ là cho a=1, không bắt đầu trong danh sách và do đó không bị xóa. Kết quả là, chuỗi loại bỏ bắt đầu a=2và quy tắc cho quyền hạn 2 được lật.

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

Trong đoạn mã trên, (i&-i)**.5%1>0kiểm tra xem có ithiếu biểu mẫu i = a * 2^bvới bsố lẻ hay không, bằng thủ thuật bit để rút ra yếu tố sức mạnh lớn nhất của hai 2^b = i&-i, sau đó kiểm tra xem kết quả có phải là một hình vuông hoàn hảo hay không. Sau đó, i&~-i>0là một mẹo nhỏ khác để kiểm tra xem icó phải là một sức mạnh hoàn hảo không 2. Những điều kiện này sau đó được xor'ed.

Có một số cải tiến hơn ở đây

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

Đầu tiên, chúng tôi chuyển chỉ số phạm vi 1 xuống để rút ngắn range(n/2,n)từ range(n/2+1,n+1), bù lại bằng cách thay thế tất cả ibằng i+1(hoặc ~-i).

Cho dù công suất 2 là số có phải là công suất của 4(2 ^ bvới số bchẵn) hay không, có thể được kiểm tra bằng và 2**c/3đối với một số lớn c. Điều này là do 2**c/3có biểu diễn nhị phân 10101...101với các bit trong các vị trí chẵn. Sử dụng c=2*nđủ. Để phủ nhận kết quả khi icó lũy thừa bằng 2, chúng ta giảm một nửa số này là trường hợp đó, 1thay vào đó là đặt các vị trí lẻ.


4

Groovy, 65 58 byte

Ý tưởng thuật toán từ DSLoc , người nhận thấy bạn chỉ cần loại bỏ các nhân đôi.

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

Đây là một sự cố:

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

Bao gồm +1 cho -n

Cung cấp số đầu vào trê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..$_

Kiểm tra trực tiếp các số có thể dài hơn:

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

Điều này kiểm tra tất cả các số trong phạm vi nửa trên. Giữ các số có số chẵn là 2 là các thừa số nguyên tố trừ khi số đó là lũy thừa 2 thì lẻ (vì 1 bị bỏ ngoài chuỗi gốc). Phương pháp này tuy nhiên sẽ hoạt động tốt cho các ngôn ngữ khác.


3

MATL , 18 byte

Mượn ý tưởng "nhân với 2" từ câu trả lời 05AB1E của @ Emigna .

q:Qt"t1)tEhym?6MX-

Hãy thử trực tuyến!

Giải trình

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

Bạn chỉ cần kiểm tra xem k có phải là thành viên không, có biết điều đó có giúp bạn tiết kiệm một byte hay không.
Bạch tuộc ma thuật Urn

@carusocomputing Cảm ơn! Ban đầu tôi chỉ kiểm tra 2 * k (nếu đó là ý bạn). Sau đó, tôi đã thêm k vào đó bởi vì sau này tôi sử dụng lại mảng hai phần tử đó để loại bỏ cả hai khỏi mảng chung
Luis Mendo

3

Haskell, 71 69 62 56 byte

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

Ví dụ sử dụng: q 22-> [12,13,15,17,19,20,21].

Nếu có bội số của số đầu tiên a, thì đó là số 2*a. Giữ anếu 2*akhông có trong danh sách và nối thêm một cuộc gọi đệ quy với a2*axóa khỏi danh sách.


Hehe, tôi sẽ nói với bạn rằng GCD là quá mức cần thiết, nhưng bạn đã tự mình lấy nó.
Bạch tuộc ma thuật Urn


2

Ruby, 124

So sánh điểm số với các câu trả lời khác, đây rõ ràng là cách tiếp cận sai:

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

Một chút thông minh ở đây là a[g[0]]=a[g[1]]=!g[1]đặt giá trị của hàm băm thành đúng / sai khi cần thiết.


2

PHP, 98 byte

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 byte tiết kiệm bằng @Titus Cảm ơn bạn

Nếu dấu phẩy được cho phép thì có thể rút ngắn 9 byte (!$a?:print"$a,");thay vì(!$a?:print$x?",$a":$x=$a);


Donett các bài tập đến $a$bcần dấu ngoặc đơn? Xấu xa!
Tít

-1 byte với dấu phẩy: (!$a?:print"$a,")-> print$a?"$a,":"". -2 byte cho cả hai phiên bản nếu bạn sử dụng dấu gạch dưới làm dấu phân cách.
Tít

-2 byte : foreach(... as$v), $v-2thay vì $k$v*2-2thay vì $k*2+2.
Tít

@Titus Tôi đã thử nó sau khi bạn bình luận $a=&$r[$k]&&$b=&$r[$k*2+2]hoạt động như thế nào $a=$r[$k]and$b=$r[$k*2+2]. Tôi xin lỗi về việc tôi không tìm thấy trang nào giải thích các kết hợp với tài liệu tham khảo và &&toán tử. Nhưng tôi cần tài liệu tham khảo không phải bài tập. Tôi không chắc chắn nếu dấu phẩy hoặc dấu phân cách khác được cho phép.
Jörg Hülsermann

@Titus tìm thấy nó bây giờ php.net/manual/en/language.operators.precedence.php & Bitwise và tài liệu tham khảo có của một Precedence cao hơn thì &&nhà điều hành
Jörg Hülsermann

1

Javascript, 149 byte

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

Đây là một ví dụ hoạt động. Tất cả hàm HTML và hàm bao () chỉ để nó thực sự tương tác.

Đoạn mã không mã hóa này có một số nhận xét và cho phép bạn tương tác xem các bước cho bất kỳ đầu vào nào.


1

JavaScript (ES6), 92 byte

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

Tôi nghĩ rằng tôi đã đăng bài này ngày hôm qua, nhưng rõ ràng là không ...

Đây là phiên bản khác:

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 byte

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

Chắc chắn có thể được đánh gôn thêm bằng cách sử dụng một cách tiếp cận khác, có thể bằng cách sử dụng một mảng với một số thủ thuật. Do diễn viên, phá vỡ, gõ danh sách và kiểm tra nếu nó dài hơn một chút so với dự kiến, nhưng nó hoạt động.

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

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

1

Vợt 191 byte

(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 (bình luận sau ';'):

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

Kiểm tra:

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

Đầu ra:

'(2)
'(5)
'(8 9 11 12 13 15)
'(11 12 13 15 17 19 20)
'(12 13 15 17 19 20 21)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.