ส่งออกหมายเลข ALONED


21

พิจารณาลำดับตามธรรมชาติสูงสุดถึง 6 (ไม่สนใจ 1) :

2,3,4,5,6

เราเริ่มการสแกนจากด้านซ้าย (ในกรณีนี้จาก 2) ค้นหาตัวเลขหารด้วย 2 (ที่นี่ 4) จากนั้นลบตัวเลขทั้งสองออกจากรายการ (ที่นี่ 2 และ 4) เช่นว่ารายการจะลดลงเป็น:

3,5,6

เราทำกระบวนการเดียวกันต่อไปทางซ้ายสุดคือ 3 ดังนั้นเราจึงหาจำนวนหารด้วย 3 6 แน่นอนว่าจำนวนนั้นจึงเท่ากับ 3 และ 6 จะถูกลบออก

5 

ตอนนี้ไม่สามารถทำการค้นหาเพิ่มเติมได้อีกดังนั้นนี่จะกลายเป็นรายการของหมายเลข ALONED สำหรับ n = 6

วัตถุประสงค์

  1. รับตัวเลข n มากกว่า 1 พิมพ์ตัวเลขที่ถูกลบทั้งหมดที่เกี่ยวข้อง

INPUT

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
เราต้องส่งคืนรายการตัวเลขตามลำดับจากน้อยไปหามากหรือจะเป็นรายการที่ไม่เรียงลำดับหรือชุดที่ยอมรับได้หรือไม่?
เดนนิส

ควรเรียงลำดับจากน้อยไปมาก
รับรองอย่างเป็นทางการ

คำตอบ:


5

05AB1E , 22 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

Python 2, 90 79 73 ไบต์

-6 ไบต์ขอบคุณ xnor

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

มันง่ายกว่าที่จะเข้าใจรหัส golfed ที่น้อยกว่านี้:

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

สิ่งนี้ใช้การอธิบายลักษณะเฉพาะของหมายเลขที่ถูกลบ:

จำนวนiจะถูกลบหากเมื่อย่อยสลายเช่นเดียวi = a * 2^bกับbคี่ทั้ง

  • a>1และbแม้กระทั่งหรือ
  • a==1และbแปลก

หมายเลข aloned สำหรับnตัวเลข aloned ทั้งหมดในช่วงเวลาin/2 + 1 <= i <= n

ทำไมสิ่งนี้ถือ? เมื่อดำเนินการตามขั้นตอนnสมมติว่าเราลบเลขคี่aในครึ่งล่าง ( 1ถึงn/2) จากนั้น2*aจะถูกลบออกไม่ว่าจะอยู่ที่ไหนในรายการ ดังนั้น4*aยังคงอยู่ (หากมีอยู่) แต่ถ้ามันอยู่ในครึ่งล่างกระบวนการลบจะได้รับมันและลบทั้งในและ4*a 8*aดังนั้นเราจะเห็นว่าจำนวนบนครึ่งหนึ่งจะถูกนำออกถ้าหากมันเป็นรูปแบบ2*a, 8*a... แปลกcแต่การเข้าพักถ้ามันมีรูปแบบa, 4*a, 8*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)]

ในโค้ดข้างต้น(i&-i)**.5%1>0การตรวจสอบว่าiขาดรูปแบบi = a * 2^bที่มีความbแปลกโดยบิตเคล็ดลับที่จะแยกตัวประกอบกำลังของทั้งสองที่ยิ่งใหญ่ที่สุด2^b = i&-iแล้วตรวจสอบว่าผลที่ได้คือไม่ได้เป็นตารางที่สมบูรณ์ จากนั้นi&~-i>0เป็นอีกหนึ่งเคล็ดลับในการตรวจสอบว่าiไม่ใช่พลังที่สมบูรณ์แบบของ 2 เงื่อนไขเหล่านี้คือ xor'ed แล้ว

มีการปรับปรุงเพิ่มเติมบางอย่างที่นี่

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

อันดับแรกเราเลื่อนดัชนีช่วง 1 ลงไปเป็นย่อลงมาrange(n/2,n)จากrange(n/2+1,n+1)ชดเชยโดยแทนที่ทั้งหมดiด้วยi+1(หรือ~-i)

ไม่ว่าจะเป็นอำนาจของ 2 จำนวนเป็นอำนาจของ4(2 ^ bด้วยbแม้) สามารถตรวจสอบได้โดยไอเอ็นจีด้วยสำหรับบางคนที่มีขนาดใหญ่2**c/3 cนี่เป็นเพราะ2**c/3มีการแสดงไบนารี10101...101กับคนในบิตที่อยู่ในตำแหน่ง ใช้c=2*nพอเพียง เมื่อต้องการลบผลลัพธ์เมื่อiมีกำลัง 2 เราลดจำนวนนี้ลงครึ่งหนึ่งและวาง1ตำแหน่งที่แปลกแทน


4

Groovy, 65 58 Bytes

แนวคิดขั้นตอนวิธีจากDSLocผู้ซึ่งสังเกตเห็นว่าคุณต้องการเพียงลบคู่ผสมออกเท่านั้น

{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 ไบต์

ยืมความคิด "คูณด้วย 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 เป็นสมาชิกไม่ทราบว่าจะช่วยคุณ bytes หรือไม่
Magic Octopus Urn

@carusocomputing ขอบคุณ! ฉันเริ่มตรวจสอบเพียง 2 * k (ถ้านั่นคือสิ่งที่คุณหมายถึง) แล้วฉันจะเพิ่ม k มีเพราะภายหลังที่ผมนำมาใช้อาร์เรย์ของสององค์ประกอบที่จะลบทั้งจากอาร์เรย์ทั่วไป
หลุยส์ Mendo

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ลบออกจากรายการ


Hehe ฉันจะบอกคุณว่า GCD เป็น overkill แต่คุณได้รับมันเอง
Magic Octopus Urn


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]ตั้งค่าของแฮชเป็นจริง / เท็จตามความจำเป็น


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

8 Bytes บันทึกโดย@Titus Thank You

หากอนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายสามารถย่อให้สั้นลง 9 ไบต์ (!$a?:print"$a,");แทน(!$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]ฉันขอโทษที่ฉันไม่พบหน้าใดที่อธิบายชุดค่าผสมที่มีการอ้างอิงและตัว&&ดำเนินการ แต่ฉันต้องการการอ้างอิงไม่ใช่การมอบหมาย ฉันไม่แน่ใจว่าอนุญาตให้ใช้เครื่องหมายจุลภาคต่อท้ายหรือตัวคั่นอื่นได้หรือไม่
JörgHülsermann

@Titus พบว่าตอนนี้php.net/manual/en/language.operators.precedence.php & bitwise และการอ้างอิงที่มีความสำคัญสูงกว่านั้น&&ผู้ประกอบการ
JörgHü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;}

สามารถตีกอล์ฟได้มากกว่านี้โดยใช้วิธีการที่ต่างกันอาจใช้อาเรย์กับลูกเล่นบางอย่าง เนื่องจากการร่าย, break, typed-list และ if-checks จะนานกว่าที่คาดไว้ แต่ใช้งานได้

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

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.