输出别名号码


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. 给定大于1的数字n,请打印所有对应的单独数字。

输入

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

Answers:


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

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

理解下面的代码比较容易一些:

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^bb

  • a>1b均匀,或
  • a==1而且b很奇怪

的独占编号ni区间中的所有独占编号n/2 + 1 <= i <= n

为什么会这样?在做的过程中n,说我们删除奇数a在下半部分(1n/2)。然后,2*a无论在列表中的何处都将被删除。因此,4*a仍然存在(如果存在)。但是,如果它位于下半部分,则删除过程将到达它并删除4*a8*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)]

在上面的代码中,(i&-i)**.5%1>0检查是否i缺少表格i = a * 2^bb,通过位技巧奇数,以提取最大的2的幂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),通过替换所有ii+1(或~-i)进行。

2的乘方是否是数字的乘方是否是4(2 ^ bb偶数)的乘方,可以通过-ing与2**c/3for进行比较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字节

@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是否为成员,不知道是否为您节省了一个字节。
魔术章鱼缸

@carusocomputing谢谢!我最初只检查2 * k(如果那是您的意思)。然后我在那里添加了k,因为稍后我会重用两个元素的数组以将其从常规数组中删除
Luis 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。保留aif 2*a不在列表中,并在列表中追加一个递归调用a并将2*a其从列表中删除。


呵呵,我要告诉你的是GCD太夸张了,但你自己弄懂了。
魔术章鱼缸


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保存8字节谢谢

如果允许尾随逗号,则可以将其缩短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]。很抱歉,我没有找到说明与参考资料和&&操作符组合的页面。但是我需要引用而不是作业。我不确定是否允许使用逗号或其他分隔符。
约尔格Hülsermann

@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-check,它比预期的要长一些,但是可以使用。

取消测试代码:

在这里尝试。

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

取消高尔夫(“;”之后的评论):

(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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.