Виведіть 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.

МЕТА

  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

Відповіді:



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

Пітон, 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^bз bнепарних, або

  • a>1і bє рівним, або
  • a==1і bдивно

Алонізовані числа для - nце всі відмічені числа iв проміжку n/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. Ці умови потім скориговані.

Тут є ще деякі вдосконалення

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парним), можна перевірити за допомогою і-ing з 2**c/3деякими великими c. Це тому, що 2**c/3має бінарне представлення 10101...101з одиницями в рівномірно розміщених бітах. Використання c=2*nдостатньо. Щоб заперечувати результат, коли iє потужність 2, ми вдвічі зменшуємо це число, і тоді ставимо 1його в непарні позиції.


4

Groovy, 65 58 Байт

Ідея алгоритму від 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" з відповіді @ Emigna 05AB1E .

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 є членом, не знайте, чи економить вам байт чи ні.
Magic Octopus Urn

@carusocomputing Дякую! Я спочатку перевіряв лише 2 * k (якщо це ви маєте на увазі). Потім я додав k туди, тому що пізніше я повторно використовую цей масив з двох елементів, щоб видалити обидва із загального масиву
Луїс Мендо

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 був надмірним, але ви самі це зрозуміли.
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]що встановлює хеш-значенням значення 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);

8 байт зберегти за допомогою @Titus Дякую

Якщо дозволена кома, то її можна скоротити на 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]. Вибачте за те, що не знайшов жодної сторінки, яка пояснює поєднання з посиланнями та &&оператором. Але мені потрібні посилання, а не завдання. Я не впевнений, чи дозволена кінцева кома чи інший роздільник.
Йорг Гюльсерманн

@Titus знайшов це зараз php.net/manual/en/language.operators.precedence.php побіжно & та посилання мають більшу прецедент, ніж &&оператор
Jörg 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 та функція обгортки () - просто така, що насправді інтерактивна.

Цей фрагмент коду, який не використовується для коду, має деякі коментарі та дозволяє вам інтерактивно бачити кроки для будь-якого даного вводу.


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-чекам він трохи довший, ніж очікувалося, але він працює.

Невикористаний і тестовий код:

Спробуйте тут.

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.