Keluarkan angka-angka SEPANJANG


21

Pertimbangkan urutan alami hingga-6 (abaikan 1) :

2,3,4,5,6

Kami mulai memindai dari kiri (dalam hal ini dari 2), mencari nomor yang dapat dibagi 2 (di sini 4) dan kemudian menghapus kedua angka dari daftar (di sini 2 & 4), sehingga daftar tersebut berkurang menjadi:

3,5,6

Kami melanjutkan proses yang sama, di sini paling kiri adalah 3, jadi kami mencari angka yang dapat dibagi dengan 3. 6 pasti angka itu dan dengan demikian 3 dan 6 dihapus,

5 

Sekarang, tidak ada pencarian lebih lanjut yang dapat dilakukan. Jadi, ini menjadi daftar angka ALONED untuk n = 6.

OBJEKTIF

  1. Diberi angka n lebih besar dari 1, cetak semua angka yang diubah yang sesuai.

MEMASUKKAN

2
6
15
20
22

KELUARAN

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

BELUM CONTOH LAIN YANG BEKERJA

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

Ini adalah , jadi kode terpendek dalam byte menang.


7
Asal tahu saja, kami memiliki kotak pasir di mana Anda dapat memposting tantangan yang tidak lengkap untuk umpan balik sebelum mempostingnya ke situs utama.
DJMcMayhem

4
Apakah kita harus mengembalikan daftar angka dalam urutan menaik atau apakah daftar yang tidak teratur atau satu set juga dapat diterima?
Dennis

harus dalam urutan menaik.
officialaimm

Jawaban:


5

05AB1E , 22 17 15 14 byte

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

Cobalah online!

Penjelasan

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 terima kasih kepada xnor

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

Mengambil nomor input pada stdin. Ide itu!

Penjelasan

Kami membuat daftar awal dari nomor input dan menyimpannya di L. Selanjutnya, ulangi sementara angka terakhir lebih besar dari atau sama dengan 2 kali angka pertama dan hapus 2 kali angka pertama dari daftar. Ini akan selalu menjadi nomor berikutnya yang dapat dibagi L[0]. L=L[1:]melepas nomor pertama juga. Ketika kondisinya tidak lagi benar, tidak ada lagi pemindahan yang dapat dilakukan, dan daftar dicetak.


Di Python 2, rangesudah memberikan daftar.
xnor

@ Terima kasih! Lupa tentang itu.
DLosc

5

Python, 61 byte

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

Ini sedikit lebih mudah untuk memahami kode yang kurang golf ini:

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

Ini menggunakan karakterisasi langsung dari nomor yang diubah:

Sejumlah iadalah aloned jika, ketika didekomposisi sebagai i = a * 2^bdengan baneh, baik

  • a>1dan bbahkan, atau
  • a==1dan baneh

Nomor yang diubah untuk nsemua nomor yang diubah idalam interval n/2 + 1 <= i <= n.

Mengapa ini berlaku? Ketika melakukan proses untuk n, katakanlah kami menghapus nomor ganjil adi bagian bawah ( 1ke n/2). Kemudian, 2*adihapus di mana pun dalam daftar itu. Jadi, 4*atetap (jika ada). Tetapi jika itu di bagian bawah, proses penghapusan akan sampai ke sana dan menghapus keduanya 4*adan 8*a. Jadi, kita melihat bahwa jumlah upper-setengah akan dihapus jika itu bentuk 2*a, 8*a... dengan aneh c, tapi tetap jika memiliki bentuk a, 4*a, 8*a, ...

Pengecualian untuk a=1, yang tidak dimulai dalam daftar dan tidak dihapus. Akibatnya, rantai pelepasan dimulai dengan a=2, dan aturan untuk kekuatan 2 dibalik.

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

Dalam kode di atas, (i&-i)**.5%1>0periksa apakah itidak memiliki formulir i = a * 2^bdengan baneh, dengan trik-bit untuk mengekstrak faktor kekuatan dua terbesar 2^b = i&-i,, lalu memeriksa apakah hasilnya bukan kuadrat sempurna. Lalu, i&~-i>0ada sedikit trik lain untuk memeriksa apakah ibukan kekuatan sempurna 2. Kondisi ini kemudian diperbaiki.

Masih ada beberapa peningkatan di sini

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

Pertama, kami menggeser indeks kisaran 1 ke bawah menjadi range(n/2,n)dari range(n/2+1,n+1), mengkompensasi dengan mengganti semua idengan i+1(atau ~-i).

Apakah kekuatan 2 adalah angka adalah kekuatan 4(2 ^ bdengan bgenap) dapat diperiksa oleh dan 2**c/3untuk beberapa besar c. Ini karena 2**c/3memiliki representasi biner 10101...101dengan yang ada di bit yang diposisikan rata. Menggunakan c=2*ncukup. Untuk meniadakan hasil ketika ikekuatan 2, kita membagi dua angka ini adalah kasus itu, menempatkan 1di posisi aneh sebagai gantinya.


4

Groovy, 65 58 Bytes

Ide algoritma dari DSLoc , yang memperhatikan Anda hanya perlu menghapus ganda.

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

Berikut ini rinciannya:

{
    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

Termasuk +1 untuk -n

Berikan nomor input pada STDIN:

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

aloned.pl:

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

Secara langsung memeriksa nomor yang mungkin lebih lama:

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

Ini memeriksa semua angka dalam kisaran setengah atas. Simpan angka yang memiliki angka genap 2 sebagai faktor prima kecuali jika angka tersebut adalah kekuatan 2 maka ganjil (karena 1 ditinggalkan dari seri aslinya). Namun metode ini harus bekerja dengan baik untuk bahasa lain.


3

MATL , 18 byte

Pinjam ide "gandakan dengan 2" dari jawaban 05AB1E @ Emigna .

q:Qt"t1)tEhym?6MX-

Cobalah online!

Penjelasan

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

Anda hanya perlu memeriksa apakah k adalah anggota, tidak tahu apakah itu menghemat byte atau tidak.
Magic Gurita Guci

@cococuting Terima kasih! Saya awalnya hanya memeriksa 2 * k (jika itu yang Anda maksud). Lalu saya menambahkan k di sana karena nanti saya menggunakan kembali array dari dua elemen untuk menghapus keduanya dari array umum
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]

Contoh penggunaan: q 22-> [12,13,15,17,19,20,21].

Jika ada kelipatan dari angka pertama a, maka itu 2*a. Simpan ajika 2*atidak ada dalam daftar dan tambahkan panggilan rekursif dengan adan 2*adihapus dari daftar.


Hehe, saya akan memberi tahu Anda bahwa GCD berlebihan, tetapi Anda mendapatkannya sendiri.
Magic Gurita Guci


2

Ruby, 124

Membandingkan skor dengan jawaban lain, ini jelas pendekatan yang salah:

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

Bit yang agak pintar di sini adalah a[g[0]]=a[g[1]]=!g[1]yang menetapkan nilai hash ke true / false yang diperlukan.


2

PHP, 98 Bytes

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 simpan oleh @Titus Terima Kasih

Jika koma tertinggal diperbolehkan maka dapat mempersingkat 9 Bytes (!$a?:print"$a,");bukan(!$a?:print$x?",$a":$x=$a);


Jangan tugas $adan $bmembutuhkan tanda kurung? Jahat!
Titus

-1 byte dengan tanda koma: (!$a?:print"$a,")-> print$a?"$a,":"". -2 byte untuk kedua versi jika Anda menggunakan garis bawah sebagai pemisah.
Titus

-2 byte: foreach(... as$v), $v-2bukan $kdan $v*2-2bukan $k*2+2.
Titus

@Itus saya sudah mencobanya setelah Anda berkomentar $a=&$r[$k]&&$b=&$r[$k*2+2]bekerja seperti $a=$r[$k]and$b=$r[$k*2+2]. Saya menyesal tidak menemukan halaman yang menjelaskan kombinasi dengan referensi dan &&operator. Tapi saya butuh referensi bukan tugas. Saya tidak yakin apakah koma tertinggal atau pemisah lainnya diizinkan.
Jörg Hülsermann

@Titus menemukannya sekarang php.net/manual/en/language.operators.precedence.php & bitwise dan referensi memiliki Precedence yang lebih tinggi daripada &&operator
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;}

Ini contoh yang bagus. Semua fungsi HTML dan wrapper () benar-benar interaktif.

Cuplikan kode yang tidak dipisahkan ini memiliki beberapa komentar dan memungkinkan Anda melihat langkah-langkah untuk input yang diberikan secara interaktif.


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

Saya pikir saya telah memposting ini kemarin, tetapi jelas tidak ...

Ini versi lain:

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

Pasti bisa bermain golf lagi dengan menggunakan pendekatan yang berbeda, mungkin dengan menggunakan array dengan beberapa trik. Karena para pemain, istirahat, mengetik-daftar dan jika-periksa itu sedikit lebih lama dari yang diharapkan, tetapi berhasil.

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

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

1

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

Tidak digabungkan (komentar setelah ';'):

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

Pengujian:

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

Keluaran:

'(2)
'(5)
'(8 9 11 12 13 15)
'(11 12 13 15 17 19 20)
'(12 13 15 17 19 20 21)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.