龙曲线序列


23

所述龙曲线序列(或常规纸张折叠序列)是一个二进制序列。 a(n)通过对的最低有效1的左位求反得到n。例如要进行计算,a(2136)我们首先将其转换为二进制:

100001011000

我们发现我们的最低有效位

100001011000
        ^

左移一点

100001011000
       ^

并返回其否定

0

任务

给定一个正整数作为输入,输出a(n)。(您可以按整数或布尔值输出)。您应该努力使代码尽可能地小(以字节为单位)。

测试用例

这是顺序的前100个条目

1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 1


9
的最低有效位1000010110000。你是说最不重要的1吗?
散布

Answers:


16

Mathematica 25字节

1/2+JacobiSymbol[-1,#]/2&

其他执行此操作的方法:

56个字节

(v:=1-IntegerDigits[#,2,i][[1]];For[i=1,v>0,i++];i++;v)&

58个字节

1-Nest[Join[#,{0},Reverse[1-#]]&,{0},Floor@Log[2,#]][[#]]&

3
哇!一个数学答案,而不仅仅是内置的。有一个赞!
KeyWeeUsr

2
唯一可以使此答案更好的方法是对其原因以及工作方式的解释。:P
Martin Ender

2
@MartinEnder arxiv.org/pdf/1408.5770.pdf参见示例13之后的评论
。– alephalpha

7

Python 3中22 21个字节

1个字节,感谢ETHproductions。

lambda n:n&2*(n&-n)<1

在线尝试!

按位运算ftw。


2
“您可以按整数或布尔值输出”,所以我想您不需要0+(...)
Martin Ender

这里的操作顺序确实让我感到困惑。可以n&1在括号内放?还是1+(n^~-n)<1可以放在括号中?还是它1+(n^~-n)……
ETHproductions

哦,天哪。这就是我想要的:太好了!
HyperNeutrino

&的优先级最低,所以是1+(n^~-n)
Leaky Nun

嗯,找到了优先级表。现在这一切都说得通:P
ETHproductions'Jun 28''17

6

视网膜38 34 29个字节

\d+
$*
+`^(1+)\1$|1111
$1
^1$

在线尝试!

Martin和Leaky本质上提出了这个想法,又减少了5个字节!

将输入转换为一元,然后将数字逐步除以2。一旦无法再均匀地处理数字(即数字为奇数),则从输入中删除4的补丁,计算最后一次操作mod 4的结果最后,这将检查结果是否为1,这意味着最低有效1位左侧的数字为零。如果为真,则最终结果为1,否则为零。


31个字节(我应该自己发布吗?)
Leaky Nun

我找到了一种避免完全二进制转换的方法,而只是除以2的因子并检查是否等于1(模4):tio.run/##K0otycxL/…
Martin Ender

@MartinEnder本质上是我的算法...减少了2个字节
Leaky Nun

@LeakyNun哦,是的,他们都是同一个主意。伟大的思想和东西...;)
马丁·恩德

我将在其中进行编辑,但是如果你们中的任何一个想要发布,我都会还原,因为我自己可能不会想到它;)
FryAmTheEggman

6

果冻,5个字节

&N&HṆ

在线尝试!

怎么运行的

&N&HṆ  Main link. Argument: n

 N     Negate; yield -n.
&      Bitwise AND; compute n&-n.
       This yields the highest power of 2 that divides n evenly.
   H   Halve; yield n/2.
  &    Bitwise AND; compute n&-n&n/2. This rounds n/2 down if n is odd.
    Ṇ  Take the logical NOT of the result.

4

爱丽丝,8字节

I2z1xnO@

在线尝试!

将输入作为Unicode字符的代码点,并相应地将结果输出为0x00或0x01字节。

为了进行测试,以下是12字节的十进制I / O版本,它使用完全相同的算法(只有I / O不同):

/o
\i@/2z1xn

在线尝试!

如果Alice是一种高尔夫语言,并且不需要显式的I / O和程序终止,那么它将仅以5个字节(2z1xn)的速度跳动05AB1E和Jelly。

说明

I    Read input.
2z   Drop all factors of 2 from the input, i.e. divide it by 2 as long
     as its even. This shifts the binary representation to the right
     until there are no more trailing zeros.
1x   Extract the second-least significant bit.
n    Negate it.
O    Output it.
@    Terminate the program.


3

明智28 20 16字节

::-~^~-&:[?>]~-^

在线尝试!

说明

这是Leaky Nun的Python回答的一部分。不幸的是,它不适用于TIO,因为TIO的解释器版本有些过时。

我们首先使用制作3个输入副本::,然后将最上面的副本减1。这会将所有位向上翻转直到第一个1。然后将其与输入的另一个副本进行异或。由于直到我们输入的第一个1之前的所有位都被翻转,这将导致结果中所有这些位均为1。如果再将~-结果加1 ,则在最低有效位1 左侧的位置将得到一个1。将其与输入进行“与”运算以从输入中获得该位。现在,0如果该位已关闭,并且有2的幂(该位已打开),我们可以将其更改为single 10with :[?>]。完成此操作后,我们只需要取反该位~-^就可以完成。



3

Haskell45 43 39字节

多亏了nimi,节省了6个字节

f x|d<-div x 2=[f d,mod(1+d)2]!!mod x 2

在线尝试!


您可以使用div代替quot
nimi

更妙的是:divModf x|(d,m)<-divMod x 2=[mod(1+d)2,f d]!!m
NIMI

@nimi我什至不知道它是如何工作的。您可能应该自己张贴。
小麦巫师

它仍然是相同的算法,只是用不同的方式来接分支(再次递归调用F对基础的情况下),可以随意编辑它。|(d,m)<-divMod x 2是一个模式守卫绑定ddiv x 2mmod x 2。我们m用来索引两个元素列表[...,...]!!m。如果m==0我们回来mod(1+d)2,如果我们m==1 f d
nimi

1
抱歉,您必须翻转列表元素:[f d,mod(1+d)2]在线尝试!
nimi

3

x86机器代码,17 16 15字节:

假定一个ABI,其中参数被压入堆栈,并且返回值在AL寄存器中。

8B 44 24 04 0F BC C8 41 0F BB C8 0F 93 C0 C3

分解如下:

_dragoncurve:
  00000000: 8B 44 24 04        mov         eax,dword ptr [esp+4]
  00000004: 0F BC C8           bsf         ecx,eax
  00000007: 41                 inc         ecx
  00000008: 0F BB C8           btc         eax,ecx
  0000000B: 0F 93 C0           setae       al
  0000000E: C3                 ret

1
@PeterTaylor我正在为答案计算以字节为单位的CPU指令的大小;在PPCG上,这是组装答案的相当普遍的做法。
Govind Parmar

1
我不能说这很普遍,但这绝对是错误的
Peter Taylor

1
这不仅是古怪的,也没有意义。就计算机而言,“机器代码”和“汇编代码”之间没有区别。区别仅仅是解释之一。我们将助记符分配给机器代码字节,以使人类更容易阅读它们。换句话说,我们取消字节存储,以使它们更易于理解。
科迪·格雷

3
没关系,@ Peter。汇编代码只是机器代码的人类可读翻译。它们是完全相同的语言,只是两种不同的形式/表示形式。TI BASIC与TI BASIC没什么不同,在TI BASIC中,我们通常令牌而不是字符字节计数为令牌,因为这是系统在内部存储令牌的方式。汇编语言也是如此:指令助记符不存储为单个字符,而是表示为等效机器码的字节。
科迪·格雷

2
此外,实际地说,为什么会有人曾经输入一个代码高尔夫比赛展开汇编语言助记符,什么时候才能将其转化为100%,相当于机器代码,其中的条目保证是免费的短?仅凭这一点,就可以将两者区别开来,即使不是完全荒谬的。
科迪·格雷

3

JavaScript(ES6),17个 14字节

f=
n=>!(n&-n&n/2)
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

编辑:我注意到布尔输出是可以接受的,通过移植@Dennis的答案节省了3个字节。


3

C(gcc),20个字节

f(n){n=!(n&-n&n/2);}

在线尝试!


这实际上不是“工作”;您依赖于针对一种特定体系结构的一种特定版本的编译器的代码生成器的怪癖,其中中间计算是在用于返回值的同一寄存器中完成的。启用任何类型的优化,更改目标体系结构或使用其他版本的GCC都会破坏这一点。您也可以说“ 10月13日满月时,我堆栈上的垃圾包含正确的输出”。
科迪·格雷

尽管您所说的都是正确的,并且此类代码永远不会在生产代码中使用,但我们还是根据代码实现的目的通过其实现定义语言。如果没有其他标志,则此功能可在gcc和tcc的所有最新版本中使用,并且仅必须在一个版本中才能被视为有效。
丹尼斯,

“为了代码高尔夫的目的,我们通过其实现定义语言”等等,这是什么?那么每个编译器标志和每个GCC版本都定义了不同的语言?您意识到这很疯狂,对吧?C语言标准定义了语言。
科迪·格雷

不在这里。如果有C标准但没有实现,我们甚至都不认为它是语言。如前所述,编译器定义了语言。结果是,允许依赖未定义的行为。不会将不同的标志集视为不同的语言,但是除非将它们添加到字节数中,否则所有答案都将使用标准编译标志。
丹尼斯

哇。真是的 我的意思是,如果您说允许实现定义的行为,但我可以理解,但未定义的行为是不是由实现定义。它实际上是未定义的。该实现每次都可以做随机的事情。而“标准编译标志”的概念就是您刚刚发明的。我的标准编译标志包括几个破坏您代码的标志。而且我几乎认为优化器不是非标准的。好吧,显然这个网站不适合我。
科迪·格雷

3

INTERCAL,50个字节

DOWRITEIN.1DO.1<-!?1~.1'~#1DOREADOUT.1PLEASEGIVEUP

INTERCAL的一元运算符非常适合此操作,因此我决定写我的第一篇文章。

DO WRITE IN .1
DO .1 <- !?1~.1'~#1
DO READ OUT .1
PLEASE GIVE UP



2

,,,10 9 个字节

::0-&2*&¬

说明

以输入为例3。

::0-&2*&1≥
               implicitly push command line argument       [3]
::             duplicate twice                             [3, 3, 3]
  0            push 0 on to the stack                      [3, 3, 3, 0]
   -           pop 0 and 3 and push 0 - 3                  [3, 3, -3]
    &          pop -3 and 3 and push -3 & 3 (bitwise AND)  [3, 1]
     2         push 2 on to the stack                      [3, 1, 2]
      *        pop 2 and 1 and push 2 * 1                  [3, 2]
       &       pop 2 and 3 and push 2 & 3                  [2]
        ¬      pop 2 and push ¬ 2 (logical NOT)            [0]
               implicit output                             []


2

八度,34字节

@(x)~(k=[de2bi(x),0])(find(k,1)+1)

在线尝试!

说明:

@(x)                               % Anonymous function taking a decimal number as input
    ~....                          % Negate whatever comes next
     (   de2bi(x)   )              % Convert x to a binary array that's conveniently 
                                   % ordered with the least significant bits first
        [de2bi(x),0]               % Append a zero to the end, to avoid out of bound index
     (k=[de2bi(x),0])              % Store the vector as a variable 'k'
                     (find(k,1)    % Find the first '1' in k (the least significant 1-bit)
                               +1  % Add 1 to the index to get the next bit
     (k=[de2bi(x),0])(find(k,1)+1) % Use as index to the vector k to get the correct bit

我怎么没听说过de2bi ...:O
Sanchises

1

提交内容:

Python 2中41 39个字节

x=input()
while~-x&1:x/=2
print 1-x/2%2

在线尝试!

-2字节归功于FryAmTheEggman

初始解决方案:

Python 2,43个字节

lambda x:1-int(bin(x)[bin(x).rfind('1')-1])

在线尝试!


那么,您提交的是哪一份?
Leaky Nun

@LeakyNun第一个,因为它更短;第二个是我最初提交的。我应该分开张贴吗?
HyperNeutrino

~-x&1我认为,它可以在一段时间内起作用。
FryAmTheEggman

(我忘记了用户名);我拒绝了您的修改,因为在PPCG上不建议编辑其他人的代码。您可以发布建议(顺便说一句,谢谢@FryAmTheEggman),但请不要进行高尔夫编辑。谢谢!
HyperNeutrino

@StewieGriffin是的,谢谢。不幸的是,由于编辑被拒绝,我无法ping通用户。
HyperNeutrino

1

MATL11个10字节

t4*YF1)Z.~

在线尝试!或查看前100个输出

说明

t    % Implicit input. Duplicate
4*   % Multiply by 4. This ensures that the input is a multiple of 2, and
     % takes into account that bit positions are 1 based
YF   % Exponents of prime factorization
1)   % Get first exponent, which is that of factor 2
Z.   % Get bit of input at that (1-based) position
~    % Negate. Implicit display


1

Befunge-98,19个字节

&#;:2%\2/\#;_;@.!%2

在线尝试!

&#                       Initial input: Read a number an skip the next command
  ;:2%\2/\#;_;           Main loop: (Direction: East)
   :2%                    Duplicate the current number and read the last bit
      \2/                 Swap the first two items on stack (last bit and number)
                          and divide the number by two => remove last bit
         \                swap last bit and number again
          #;_;            If the last bit is 0, keep going East and jump to the beginning of the loop
                          If the last bit is 1, turn West and jump to the beginning of the loop, but in a different direction.
&#;           @.!%2      End: (Direction: West)
&#                        Jump over the input, wrap around
                 %2       Take the number mod 2 => read the last bit
               .!         Negate the bit and print as a number
              @          Terminate

1

SCALA,99(78?)个字符,99(78?)个字节

if(i==0)print(1)else
print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

i输入在哪里。

如您所见,如果我不注意零,我确实会节省21个字节(就像作者在他的测试用例中所做的那样):

print(if(('0'+i.toBinaryString).reverse.dropWhile(x=>x=='0')(1)=='1')0 else 1)

这是我的第一个代码高尔夫球,所以我希望我做得很好:)

在线尝试!尽管计算哈哈很长。


欢迎光临本站!
DJMcMayhem



0

Japt10 8 9字节

!+¢g¢a1 É

在线尝试!

说明

!+¢   g    a1 É
!+Us2 gUs2 a1 -1 # Implicit input (U) as number
!+               # Return the boolean NOT of
      g          #   the character at index
       Us2       #     the input converted to binary
           a1    #     the index of its last 1
              -1 #     minus 1
      g          #   in string
  Us2            #     the input converted to binary

这将返回false所有内容,因为字符(0或1)始终是字符串。
毛茸茸的

糟糕,应该注意到...现在已修复
路加福音

看起来现在失败了1
毛茸茸的

0

JavaScript(ES6),53 34字节

a=>eval("for(;~a&1;a/=2);~a>>1&1")

42个字节:a=>!+(a=a.toString(2))[a.lastIndexOf(1)-1]
粗野的

我已经找到了一个较短的(数学)解决方案……
路加福音

尼斯:)介意我张贴那42个字节吗?
毛茸茸的

@Shaggy,一点都没有
路加福音



0

芯片,93字节

HZABCDEFG,t
 ))))))))^~S
H\\\\\\\/v~a
G\\\\\\/v'
F\\\\\/v'
E\\\\/v'
D\\\/v'
C\\/v'
B\/v'
A/-'

将输入作为小字节序字节。(TIO有一些python可以为您完成此操作)。输出为0x00x1。(TIO使用xxd检查该值)。

在线尝试!

这个怎么样

芯片一次只看输入一个字节,因此处理多字节输入会增加一些体积,但不如我所担心的那么大。

让我们开始吧:

HZABCDEFG

这些是HZ,前一个字节的高位(如果有的话),以及A-G,当前字节的低七位。这些用于查找数字的最低设置位。

        ,t
))))))))^~S

找到最低设置位后,我们有几件事要做。第一个块说:“如果我们有一个固定的位),则停止S升压输出,然后t在打印答案后终止。

H\\\\\\\/v~a
G\\\\\\/v'
...
A/-'

当前字节(A- H)的任何一位仅以一串零开头,然后是一个(\/:(这些字符直接看它们以北的位;我们可以相信所有以前的位均为零))传递到导线上向右(v,,'...),则取其取反的任何值,并指定为输出(~a)的低位。

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.