计算二进制Sierpinski三角序列


23

Binary Sierpinski Triangle序列是数字序列,其二进制表示形式表示Binary Sierpinski Triangle的行,该序列是通过在无限的零行中以1开头,然后用这些位的xor重复替换每一对位来给出的,就像这样:

f(0)=      1                    =1
f(1)=     1 1                   =3
f(2)=    1 0 1                  =5
f(3)=   1 1 1 1                 =15
f(4)=  1 0 0 0 1                =17

OEIS上提供了更多数字:https//oeis.org/A001317

输入:您喜欢的任何格式的非负整数n。(必须为所有n个(最多30个)工作。)

输出:序列的第n个项(0索引),为十进制数。

这是因此请尝试使用您的语言提供的最短答案(以字节为单位)。没有答案将被接受。存在标准漏洞(例如,不对序列进行硬编码),但您可以使用在发布此挑战后创建/修改的语言。(除非您的解决方案较短,否则请避免以已经使用的语言发布其他解决方案。)

排行榜

这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

## Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以通过打败旧分数保持标题。例如:

## Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

## Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在代码段中:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


8
我不是超级粉丝,绝对不能为任何n输出错误答案。这基本上迫使默认情况下不使用任意精度整数的语言检查输入是否足够小...
Dennis

请说明是否正确理解了规则(请参见此处此处的注释)以及舍入后的输出(例如,输入33的1.288490189e10)是否被认为是错误的
丹尼斯

“必须为不超过30个的所有n个工作,并且不得为任何n个输出错误的答案。” 。这是自相矛盾的-当然“一定不能输出错误的答案”“必须工作”相同
Digital Trauma 2015年

5
由于绝大多数人反对输入验证的不合理和令人心碎的负担,因此删除了此要求。您可以输出大n所需的任何垃圾。请享用!
quintopia

2
我不只是说输出应该没有错,我只是建议说提交必须支持输入,直到最大的输入n都不会溢出。
Alex A.

Answers:


14

05AB1E5 4字节

我很荣幸地向您介绍05AB1E。尽管它很短,但在长期挑战中可能很不好。

感谢ETHproductions削减了1个字节:)

$Fx^

说明:

$      # Pushes 1 and input
 F     # Pops x, creates a for-loop in range(0, x)
  x    # Pops x, pushes x and 2x
   ^   # Bitwise XOR on the last two elements
       # Implicit, ends the for-loop
       # Implicit, nothing has printed so the last element is printed automatically

您知道,一种以自定义语言在许多程序中脱颖而出的好方法是使尾随}自动插入。那么这将是4个字节。:)
ETHproductions 2015年

1
@ETHproductions等等,已经实现了:)。感谢您删除1个字节的哈哈。
阿德南(Adnan)2015年

2
这段代码中有一个错误。我怎么知道?击败丹尼斯。
Arcturus

2
@Ampora不仅击败了丹尼斯,而且击败了丹尼斯的自定义高尔夫语言。;)
ETHproductions 2015年

@Adnan Wow。你正在做某事。
RK。


6

果冻,6个字节

1Ḥ^$³¡

在线尝试!

此版本的Jelly解释器一起使用的二进制版本具有xxd转储

0000000: 31 a8 5e 24 8b 80  1.^$..

怎么运行的

1Ḥ^$³¡    Input: n

1         Set the left argument to 1.
 Ḥ        Multiple the left argument by two.
  ^       Hook; XOR it with its initial value.
   $      Create a monadic chain from the last two insructions.
    ³¡    Call the chain n times, updating the left argument after each call.

5

Haskell,44个字节

import Data.Bits
f n=iterate((2*)>>=xor)1!!n

((->) r)monad中,(f >>= g) x等于g (f x) x


我认为您可以将最后一行匿名化(iterate((2*)>>=xor)1!!)
xnor 2015年

我尝试过,但是由于可怕的单态性限制原因,它不起作用。
林恩

但是,这可能是合法的表达式,因为单态性限制不适用于表达式,而是声明。如果我没有记错的话,表达式被认为是合法的答案。
骄傲的haskeller

4

Matlab,45个字节

解:

@(i)2.^[0:i]*diag(mod(fliplr(pascal(i+1)),2))

测试:

ans(10)
ans =
1285

说明: pascal构造Pascal三角形,但从1开始,因此输入应为i+1fliplr从左向右翻转数组。mod(_,2)除以2后的余数。diag提取主对角线。使用2.^[0:i]乘法将向量转换为十进制

我很高兴,@ flawr在这里找到了Matlab竞争对手:)


似乎也可以与Octave一起使用。
丹尼斯

4

JavaScript(ES6),23个字节

f=x=>x?(y=f(x-1))^y*2:1

基于OEIS页面上的第一个公式。如果您不介意代码几乎花了30分钟才能完成,我们可以节省一个字节:

f=x=>x?f(--x)^f(x)*2:1

这是非递归版本,foreval:中使用循环((32字节))

x=>eval("for(a=1;x--;a^=a*2);a")

规则,按照目前的写,否定这一答案,因为f(35)回报15。另外,叉炸弹警报:我不得不强制关闭Chromium才能停止f(30)运行(原始版本)。:P
丹尼斯

1
@Dennis等待,所以如果我不能输出任何错误的值,那么输入大于30怎么办?
ETHproductions 2015年

我不确定(我希望规则能够更改),但是类似的方法f=x=>x?(y=f(x-(x<31)))^y*2:1会起作用。
丹尼斯

@Dennis Ah,无限递归=无输出。回到电脑后,我将解决此问题。我希望规则也能改变。
ETHproductions 2015年

该规则已从问题中删除。
丹尼斯

3

Matlab,77 70字节

该函数通过与[1,1](即二项式展开或与二项式的重复乘法)的重复卷积来计算Pascal三角形的第n行,并由此计算数字。

function r=c(n);k=1;for i=1:n;k=conv(k,[1,1]);end;r=2.^(0:n)*mod(k,2)'

3

Ruby,26个字节

带有迭代的匿名函数。

->n{a=1;n.times{a^=a*2};a}

此递归函数短了一个字节,但是由于需要对其进行命名才能引用自身,因此它的长度增加了一个字节。

f=->n{n<1?1:(s=f[n-1])^s*2}

3

Ruby,25个字节

->n{eval"n^=2*"*n+?1*n=1}

到目前为止比这里的其他答案短。它构造了这个字符串:

n^=2*n^=2*n^=2*n^=2*1

然后,它进行设置n=1(这实际上是在创建字符串时发生的)并评估上述字符串,并返回结果。


*n=1实际上可以节省任何时间吗?m=1;"m^=2*"*n+?1
马丁·恩德

不,但是仅使用一个变量即可完成操作:)
Lynn

3

萨摩(4)

现在,Samau具有用于XOR乘法和XOR幂的内置函数。

▌3$ⁿ

十六进制转储(Samau使用CP737编码):

dd 33 24 fc

说明:

▌       read a number
 3      push 3
  $     swap
   ⁿ    take the XOR power

通过交换前两个命令并取消交换,可以将其减少到3个字节吗?
quintopia '16

@quintopia号。Samau自动将输入作为字符串推入堆栈,并从字符串中读取一个数字。如果我们交换前两个命令,它将尝试从中读取一个3不是字符串的数字。
alephalpha

为什么Samau在可能的情况下不尝试评估字符串?
quintopia '16


2

Pure Bash(无外部实用程序),37

Bash整数是64位带符号的,因此它适用于不超过62的输入:

for((x=1;i++<$1;x^=x*2)){
:
}
echo $x

2

蟒2.7.6,38个 33字节

感谢Dennis节省了几个字节!

x=1
exec'x^=x*2;'*input()
print x

1
欢迎来到编程难题和代码高尔夫球!exec'x^=x*2;'*input()在该for方法上节省了一些字节。
丹尼斯

这超越了我的Python条目,我将在这里留下来作后代:f=lambda n:f(n-1)^2*f(n-1)if n>0 else 1
Jack Brounstein 2015年

2

Pyth,7个字节

uxyGGQ1

在线尝试:演示

说明:

u    Q1   apply the following statement input-times to G=1:
 xyGG        update G with (2*G xor G)


2

MIPS,28个字节

输入输入$a0,输出输入$v0

0x00400004  0x24020001          li      $v0, 1
0x00400008  0x10800005  loop:   beqz    $a0, exit
0x0040000c  0x00024021          move    $t0, $v0
0x00400010  0x00021040          sll     $v0, $v0, 1
0x00400014  0x00481026          xor     $v0, $v0, $t0
0x00400018  0x2084ffff          addi    $a0, $a0, -1
0x0040001c  0x08100002          j       loop


1

k4,26个字节

{x{2/:~(=). 0b\:'1 2*x}/1}

0b\:一个号码转换为布尔矢量(即比特串),XOR作为“不等于”来实现,2/:通过将其视为多项式,以评估转换一个位串回的数,并且x f/yx一整数被f施加到y第一,然后其连续输出x时间。

样品运行:

  {x{2/:~(=). 0b\:'1 2*x}/1}'!5                                                                                                                                                                                    
1 3 5 15 17

1

Ruby,31个 26字节

编辑:完全更改为另一种语言!欢迎所有高尔夫建议!

该程序对序列的前一个元素进行两次按位异或,即f(n) = f(n-1) ^ 2*f(n-1)

->n{v=1;n.times{v^=2*v};v}

1

MATL,15字节

类似于@flawr的答案

i:1w"TToX+]2\XB

编辑(2016年5月20日),在线尝试!X+取代Y+以符合语言的18.0.0版本。

>> matl i:1w"TToX+]2\XB
> 5
51

说明

i              % input                                                     
:              % vector of values 1, 2, ... to previous input                           
1              % number literal                                            
w              % swap elements in stack                                    
"              % for                                                       
    TTo        % vector [1 1]
    X+         % convolution                                               
]              % end                                                       
2\             % modulo 2
XB             % convert from binary to decimal              

1

疯子,87字节

,[>>[>]++<[[->+>+<<]>-->[-<<+>>]<[>+<-[>-<-]]>+<<<]>>>[[-<+>]>]<<[<]<-]>>[<[->++<]>>]<+

在线尝试!

假定无限大小的单元格(否则它不能超过7,即255)。实际上,由于昂贵的mod 2操作,Pascal的三角形mod 2方法要长得多,而XOR的实现则容易得多。


0

APL,31个字节

{({2⊥⊃~1 2=.{(64⍴2)⊤⍺×⍵}⍵}⍣⍵)1}

这几乎肯定是糟糕的代码,但是我是完整的APL新手。我希望任何技能的人都可以摆脱所有D功能,并将其大大缩短。逻辑与我的k4答案大致相同-用1或乘以2,用转换为位,使用不等于XOR 转换为,用转换回数字,将整个内容包装在函数中,并使用进行特定次数的迭代。我不知道为什么封闭从内部产品出来的结果,但是将其清理干净。


您应该能够通过更改保存一个字节~1 2=.1 2≠.
扎卡里

而且,这是哪个APL系统?如果是在Dyalog,你应该能够使它{({2⊥⊃1 2≠.((64⍴2)⊤×)⍵}⍣⍵)1}[28字节]
扎卡里

0

认真地,12个字节

2,╣`2@%`Mεj¿

十六进制转储:

322cb960324025604dee6aa8

在线尝试

由于认真地不包括任何进行按位异或的方法,因此该解决方案完全按字面意义直接处理了给定的三角形行。此方法给出的正确答案最多为n = 1029(此后没有足够的内存来计算Pascal三角形的给定行)。

说明:

 ,                       get input
  ╣                 push the nth row of pascal's triangle
   `2@%`M           take each element of the row mod 2
         εj         join all the binary digits into a string
2          ¿        interpret it as a base 2 number

0

Pyt40 10 字节

Đ0⇹Řć2%ǰ2Ĩ

说明:

观察到Binary Sierpinski Triangle等效于Pascal的Triangle mod 2,

                      Implicit input
Đ                     Duplicate input
 0⇹Ř                  Push [0,1,2,...,input]
    ć2%               Calculate the input-th row of Pascal's Triangle mod 2
       ǰ              Join elements of the array into a string
        2Ĩ            Interpret as a binary number
                      Implicit print

在线尝试!


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.