位浮点序列


22

LSBMSB都有一点浮动,每次移动一个位置,直到它浮动到容器的顶部为止:

0000
0001
0010
0100
1000

一旦一位浮到顶部,另一位开始其旅程,并在遇到另一位时停止:

1001
1010
1100

直到容器中填充了位,这种情况才会发生:

1101
1110
1111

挑战

给定一个整数,输出该位数的容器的“ 位浮点序列 ”。

  • 序列的每个术语都可以由您选择的任何分隔符分隔。
  • 编辑:序列必须显示为十进制整数,从第一个therm:开始0
  • 容器大小应大于零,并且最多为您选择的语言支持的最大整数的位数。您可以假定输入始终符合此要求。

例子

仅需要数字序列,以二进制表示为例:

  • 对于10 1

    0 -> 0
    1 -> 1
    
  • 对于30 1 2 4 5 6 7

    000 -> 0
    001 -> 1
    010 -> 2
    100 -> 4
    101 -> 5
    110 -> 6
    111 -> 7
    
  • 对于40 1 2 4 8 9 10 12 13 14 15

    0000 -> 0
    0001 -> 1
    0010 -> 2
    0100 -> 4
    1000 -> 8
    1001 -> 9
    1010 -> 10
    1100 -> 12
    1101 -> 13
    1110 -> 14
    1111 -> 15
    
  • 对于80 1 2 4 8 16 32 64 128 129 130 132 136 144 160 192 193 194 196 200 208 224 225 226 228 232 240 241 242 244 248 249 250 252 253 254 255

    00000000 -> 0
    00000001 -> 1
    00000010 -> 2
    00000100 -> 4
    00001000 -> 8
    …
    …
    …
    11111000 -> 248
    11111001 -> 249
    11111010 -> 250
    11111100 -> 252
    11111101 -> 253
    11111110 -> 254
    11111111 -> 255
    

2
我们可以按任何顺序(即反向)输出序列,还是必须将它们从最低到最高排序?
Kevin Cruijssen

1
我们可以输出浮点数吗?例如[0.0, 1.0]
Grimmy

8
我们可以使用二进制表示形式输出吗?
尼尔

我们可以输出零索引序列吗?即0 -> [0, 1]
attinat

Answers:


7

05AB1E,10个字节

LRL˜Íoî.¥ï

在线尝试!

L                 # range [1..input]
 R                # reversed
  L               # convert each to a range: [[1..input], [1..input-1], ..., [1]]
   ˜              # flatten
    Í             # subtract 2 from each
     o            # 2**each
      î           # round up (returns a float)
       ï          # convert to integer
        .¥        # undelta

2
我认为某个地方有一个元帖子.0,默认情况下允许浮点数用于整数,但不确定。我个人通常将ï页脚放在漂亮的页脚中,而不将其包括在字节数中。
凯文·克鲁伊森

7

Python 2,45个字节

y=n=2**input()
while y:print n-y;y=y&y-1or~-y

在线尝试!

事实证明,2**n在输入序列中生成负的每个项都更短n。如果我们查看它们的二进制展开式,n=5请参见下面的,我们在二进制展开式中看到一个不错的1的三角形的模式。

100000  32
011111  31
011110  30
011100  28
011000  24
010000  16
001111  15
001110  14
001100  12
001000  8
000111  7
000110  6
000100  4
000011  3
000010  2
000001  1

每个数字都是通过删除二进制扩展中最右边的数字从前一个数字获得的,除非那会使数字为0,否则我们减去1,创建一个新的1的块,该块开始一个新的较小的三角形。这实现为y=y&y-1or~-y,其中y&y-1有一个技巧可以删除最右边的1,并or~-y给出y-1该值是否为0的信息。

Python 2,49个字节

def f(n,x=0):1%n;print x;f(n-x%2,x+(x%2**n or 1))

在线尝试!

打印功能,错误终止。下面更漂亮的程序被证明需要更长的时间。

51字节

n=input()
x=0
while n:n-=x%2;print x;x+=x%2**n or 1

在线尝试!


6

果冻11 10字节

RUḶ’F2*ĊÄŻ

@Grimy的05AB1E端口的答案,所以请确保对他进行投票
-1字节感谢 @Grimy

在线尝试。

说明:

R           # Create a list in the range [1, (implicit) argument]
 U          # Reverse it to [argument, 1]
           # Create an inner list in the range [0, N) for each value N in this list
           # Decrease each by 1
    F       # Flatten the list of lists
     2*     # Take 2 to the power each
       Ċ    # Ceil
        Ä   # Undelta (cumulative sum) the list
         Ż  # And add a leading 0
            # (after which the result is output implicitly)

2
R_2-> Ḷ’为-1。唯一明智的范围,我真的希望05AB1E为此找到一个单骑兵。
Grimmy

@肮脏的啊,我怎么想念那个。我搜索范围,并且一定以某种方式跳过了它。>>>谢谢!
凯文·克鲁伊森

4

Perl 5(-n),41 40字节

-1字节对Xcali

map{/01.*1/||say oct}glob"0b"."{0,1}"x$_

蒂奥

  • "{0,1}"x$_:字符串"{0,1}"重复n次
  • "0b". :连接到 "0b"
  • glob :全局扩展(笛卡尔积)
  • map{... }:每个元素
  • /01.*1/||:在01后面跟随某些内容时跳过1
  • say oct :转换为十进制然后说


4

JavaScript(ES6),43个字节

如有疑问,请使用xnor的方法

n=>(g=x=>x?[n-x,...g(x&--x||x)]:[])(n=1<<n)

在线尝试!


JavaScript(ES6), 59 57 55  52字节

f=(n,x=0)=>x>>n?[]:[x,...f(n,x+=x+(x&=-x)>>n|!x||x)]

在线尝试!

怎么样?

pX2Xp0=0

X-X1个X

p52=52-52=4

p一种ñ一种ñ0=0并且:

一种ñķ+1个={一种ñķ+p一种ñķ如果 p一种ñķ0 和 一种ñķ+p一种ñķ<2ñ一种ñķ+1个除此以外

已评论

f = (                   // f is a recursive function taking:
  n,                    //   n = input
  x = 0                 //   x = current term of the sequence
) =>                    //
  x >> n ?              // if x is greater than or equal to 2**n:
    []                  //   stop recursion
  :                     // else:
    [                   //   update the sequence:
      x,                //     append the current term to the sequence
      ...f(             //     do a recursive call:
        n,              //       pass n unchanged
        x +=            //       update x:
          x + (x &= -x) //         given x' = lowest bit of x set to 1:
          >> n          //         if x + x' is greater than or equal to 2**n
          | !x          //         or x' is equal to 0: add 1 to x
          || x          //         otherwise, add x' to x
      )                 //     end of recursive call
    ]                   //   end of sequence update


3

Perl 6、43字节

{0 x$_,{say :2($_);S/(0)1|0$/1$0/}...1 x$_}

在线尝试!

带有一个数字并输出由换行符分隔的序列的匿名代码块。这是通过从0开始重复n次,然后0110或最后一个0以a 代替1直到数字为为止而的。

使用Nahuel Fouilleul的方法或40个字节

{grep /010*1/|{say :2($_)},[X~] ^2 xx$_}

在线尝试!


”,然后用或最后一个用代替01,直到数字只是个1001 “”这真是个天才!
PaperBirdMaster





2

05AB1E13 12 字节

Tsãʒ1ÛSO2‹}C{

-1个字节感谢@Grimy(在这里也可以看看他的较短方法)。

在线尝试验证所有测试用例

说明:

T             # Push 10
 sã           # Swap to get the (implicit) input, and get the cartesian product with "10"
   ʒ          # Filter it by:
    1Û        #  Remove leading 1s
      SO      #  Get the sum of the remaining digits
        !     #  Check that the sum is either 0 or 1 by taking the factorial
              #  (NOTE: Only 1 is truthy in 05AB1E)
         }C   # After the filter: convert all remaining strings from binary to integer
           {  # And sort (reverse) them
              # (after which the result is output implicitly)

备用13 :oL<ʒbIj1Û1¢2‹。看起来我无法降低它。
Grimmy

1
我刚遇到的@Grimy oL<ʒbIj1ÛSO2‹,正在尝试查看错误所在。:)但很高兴看到您无法为我的更改答案之一找到一个较短的版本。; p(inb4,您在所有xD中都会找到较短的一个)
Kevin Cruijssen

1
@Grimy我感觉SO2‹可能是3个字节某种程度上也许,但我没有看到它,也不能完全肯定。有一些替代品,像SO1~SÆ>d,但我无法找到一个3 byter。
凯文·克鲁伊森

1
10采用完全不同的方法
Grimmy

1
您的感觉是对的,我刚刚发现了3个字词:SO!。可以肯定的是,我有一些使用的旧答案2‹也可以从中受益。
Grimmy

2

视网膜,26字节

.+
*0
L$w`.(.*)
$.`*1$'1$1

在线尝试!输出为二进制。如果不可接受,则为39个字节:

.+
*0
L$w`.(.*)
$.`*1$'1$1
+`10
011
%`1

在线尝试!说明:

.+
*0

将输入转换n为零字符串。

L$w`.(.*)

匹配所有可能的非空子字符串。

$.`*1$'1$1

对于每个子字符串,输出:带有0s 的前缀更改为1s;后缀; 与首字母的匹配0更改为1

+`10
011
%`1

从二进制转换为十进制。



1

木炭,19字节

I⮌E⊕θEι⁺⁻X²IθX²ιX²λ

在线尝试!链接是详细版本的代码。说明:

    θ               Input
   ⊕                Incremented
  E                 Map over implicit range
      ι             Outer index
     E              Map over implicit range
           Iθ       Input cast to integer
               ι    Outer index
                  λ Inner index
         X²  X² X²  Power of 2
       ⁺⁻           Subtract and add
 ⮌                  Reverse outer list
I                   Cast to string
                    Implicitly print


1

视网膜,24字节

.+
*0
/0/+<0`(0)1|0$
1$1

输出为二进制。输入应包含尾随换行符。

尝试说明:

.+              #match the entire input
*0              #replace it with that many zeroes
/0/+<0`(0)1|0$  #while the string has a 0, substitute the first match and output
1$1             #if 01 is present in the string, replace it with 10, else replace the last character with $

我试图/0/通过重新排列选项来避免3个字节长的正则表达式选项,但不能这样做。

在线尝试!


我认为二进制输出是不允许的。有一条评论询问是否允许,但最好假设直到提问者答复为止,您才能这样做
Jo King

1

C(clang),73个字节

o,j,y;f(x){for(o=j=0;printf("%d ",o),x;o+=y+!y,y+=y+!y)j=!j?y=0,--x:--j;}

在线尝试!

for(o=j=0;printf("%d ",o),x;  o+=y+!y, y+=y+!y) 
// adds 1, 1+1=>2 , 2+2=> 4 .... sequence

 j=!j?y=0,--x:--j; 
// uses ternary instead of nested loop to decrement 'x' when 'j' go to 0

1

K4, 28 24个字节

0,+\"j"$2 xexp,/-1+|,\!:

@Grimy的方法移植到k4

编辑:-4感谢ngn!


1
!:'1+|!:->|,\!:
ngn

您可以在xexp
ngn

@ ngn,gh |,\!:看来我现在已经很明显了!
乱写
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.