新订单2:改变方向


15

简介(可以忽略)

将所有正数按其常规顺序(1、2、3,...)有点无聊,不是吗?因此,这是围绕所有正数的排列(重新排列)的一系列挑战。这是本系列的第二个挑战。第一个挑战可以在这里找到。

在此挑战中,我们使用格雷码重新排列自然数。格雷码或“反射二进制码”是以这样的方式进行二进制编码的,即两个连续的值仅相差一位。这种编码的一个实际应用是在旋转编码器中使用它,因此我对“ Turn My Way”的引用。

用于以3位二进制标记的角度测量设备的旋转编码器。

注意,这种编码留下了一定程度的自由度。例如,以下这些二进制1100,存在四种可能的以下代码:1101,1110,1000和0100。这就是为什么我将定义a(n)为最小,而不是先前使用的值,该值不同之处仅在二进制编码一个字符。该序列与A163252相对应。

由于这是一个“纯序列”质询,因此任务是针对给定的输出作为输入,其中是A163252a(n)na(n)

任务

给定一个整数输入,以整数格式(而不是二进制格式)输出)。na(n)

a(n)被定义为至少正整数不早的顺序,使得在发生a(n1)a(n)写入二进制时仅在一个位相差。

注意:此处假定基于1的索引;您可以使用基于0的索引,因此a(0)=1;a(1)=3,等等。如果您选择使用它,请在答案中提及。

测试用例

Input | Output
--------------
1     | 1
5     | 4
20    | 18
50    | 48
123   | 121
1234  | 1333
3000  | 3030
9999  | 9997

规则

  • 输入和输出是整数(您的程序至少应支持1到32767之间的输入和输出)
  • 无效的输入(0,浮点数,字符串,负值等)可能导致无法预测的输出,错误或(未定义的)行为。在A163252中a(0)定义为0。对于此挑战,我们将忽略它。
  • 默认的I / O规则适用。
  • 禁止默认漏洞
  • 这是,因此最短的答案以字节为单位

最后说明

请参阅以下相关(但不相等)的PP&CG问题:

Answers:


1

Stax19 17 字节

êÑ{╚α8è╙mc┼σ▀»É▲ü

运行并调试

由于硬编码的位索引迭代,它在指定域之后的某个时刻停止工作。(32767)

拆开包装,松开包装并进行评论,看起来像这样。

z0,         push an empty array, literal zero, and the input, in that order
             - the zero represents the last calculated value in the sequence
             - the array contains all the previous ones
D           repeat the rest of the program n times (from input)
  +         append the last calculated value to the array
  17r       [0 .. 16] (these are the bit indices necessary to cover the input range)
  {|2nH|^m  calculate candidate values; previous value with each of these bits toggled 
  n-        remove all values previously calculated
  |m        keep the minimum candidate remaining

运行这个


您比最短的05AB1E答案落后1个字节。您打算进一步优化吗?否则,我会接受凯文的答案...
agtoever

1
如果有机会,我今天将在接下来的14个小时内进行研究。
递归

行。我将其开放一天。祝好运!
agtoever

@agtoever:谢谢。我完成了。
递归

做得好!你赢了!恭喜你!
agtoever

4

JavaScript(ES6),65个字节

1个索引。

n=>{for(o=p=[k=1];o[k]|~-(i=p^k)&i?k++:k=o[p=k]=!!n--;);return p}

在线尝试!

已评论

n => {                  // n = index of requested term
  for(                  // for loop:
    o =                 //   o = storage object for the terms of the sequence
    p =                 //   p = last term found in the sequence
      [k = 1];          //   k = current term
    o[k] |              //   if k was already encountered
    ~-(i = p ^ k) & i ? //   or (p XOR k) has more than 1 bit set:
      k++               //     increment k
    :                   //   else:
      k = o[p = k]      //     set o[k], set p to k
        = !!n--;        //     stop if n is equal to 0 or set k to 1; decrement n
  );                    // end of for()
  return p              // return p
}                       // end

在TIO上,我得到n>〜1024的堆栈溢出。关于在其他环境中如何处理该问题有什么建议吗?规则:“ 你的程序应该TOT 32767至少支持输入和输出theorie范围为1点了
agtoever

1
@agtoever我已经将其更新为非递归版本。
阿诺尔德

4

果冻26 20字节

ṀBLŻ2*^1ị$ḟ⁸Ṃ;
0Ç⁸¡Ḣ

在线尝试!

一个以n作为单个参数的完整程序。适用于所有测试用例。还要注意,尽管不是必需的,但它处理n = 0。

说明

助手链接:查找下一个词并加前缀

Ṁ              | maximum of list so far
 B             | convert to binary
  L            | number of binary digits
   Ż           | 0..above number
    2*         | 2 to the power of each of the above
      ^        | exclusive or with...
       1ị$     | ... the most recent term in the list so far
          ḟ⁸   | filter out anything used already
            Ṃ  | find the minimum
             ; | prepend to existing list

主链接

0              | start with zero
 Ç             | call the above link
  ⁸¡           | and repeat n times
    Ḣ          | take the last term added

3

的Java(JDK) 142 138 124 123 132 130 98字节

n->{int s[]=new int[9*n],j,k=0;for(;n-->0;s[k=j]++)for(j=0;s[++j]>0|n.bitCount(j^k)>1;);return k;}

在线尝试!


1
恐怕进口必须包括在字节数中。但是,您可以将import java.util.*;+ Set s=new HashSet();打入var s=new java.util.HashSet();。此外,其他部分可以golfed到:Integer i=0,j,k=0;for(;i++<n;s.add(k=j))for(j=0;s.contains(++j)|i.bitCount(j^k)>1;);return k;。不过,答案很不错,因此请+1。:)
Kevin Cruijssen

1
使用Stack而不是节省了2个字节HashSet。慢很多,但是行得通!
Daniel Widdis

1
ØñØññ

2
您仍然可以将其打高尔夫球至126个字节,这是我在第一条评论中建议的第二个高尔夫球。:)
Kevin Cruijssen


2

Python 2 2,81个字节

基于1的索引

l=[0];p=0
exec"n=0\nwhile(p^n)&(p^n)-1or n in l:n+=1\np=n;l+=p,;"*input()
print p

在线尝试!


Python 2 2,79字节

这需要很多时间(在本地运行7分钟后,9999仍未完成)

l={0};p=0;n=input()
exec'p=min({p^2**k for k in range(n)}-l);l|={p};'*n
print p

在线尝试!


1
不支持最大输入32767(默认递归深度与系统无关)。
暴民埃里克(Erik the Outgolfer)

甚至不支持给定的测试用例9999。:)
Daniel Widdis

@EriktheOutgolfer将其更改为迭代方法,可能仍无法在TIO上及时完成,但可以在本地运行。
ovs

@ovs哦,超时本身并不重要。
暴民埃里克(Erik the Outgolfer)

凉!我刚刚尝试了n = 9999,它在大约一个小时后成功完成。+1。好极了!;-)
agtoever



1

木炭,65字节

≔⁰θFN«⊞υθ≔¹ηW¬‹θ⊗η≦⊗ηW∧›η¹∨¬&θη№υ⁻θη≧÷²ηW№υ⁻|θη&θη≦⊗η≔⁻|θη&θηθ»Iθ

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

≔⁰θ

将结果初始化为0。

FN«

循环n时间。

⊞υθ

保存之前的结果,以免再次使用。

≔¹ηW¬‹θ⊗η≦⊗η

查找上一个结果中的最高位。

W∧›η¹∨¬&θη№υ⁻θη≧÷²η

当该位大于1时,如果在上一个结果中将其设置为1,请尝试减去该位以查看结果是否为看不见的结果。这样可以确保按价值升序尝试潜在结果。

W№υ⁻|θη&θη≦⊗η

现在,尝试对该位与先前的结果进行异或,将位加倍,直到找到看不见的结果。这可以处理需要再次按值的升序设置的情况,也可以处理最低有效位需要切换的情况,前一个循环无需费心测试(因为要测试的是高尔夫球手)在这里)。如果前一个循环发现了看不见的结果,则该循环永远不会运行;如果没有,则此循环将无用地重新测试这些结果。

≔⁻|θη&θηθ

通过实际对该位进行XOR运算来更新结果。

»Iθ

在循环结束时输出最终结果。


1

05AB1E21 20 18 字节

ÎFˆ∞.Δ¯θy^bSO¯yå_*

效率很低,因此输入越大,获得结果所需的时间越长。可以输入0不过也。

在线尝试验证第一个ñ条款

说明:

Î                # Push 0 and the input
 F               # Loop the input amount of times:
  ˆ              #  Pop the current number and add it to the global_array
  ∞.Δ            #  Inner loop starting at 1 to find the first number which is truthy for:
     ¯θy^        #   XOR the last number of the global_array with the loop-number `y`
         b       #   Convert it to binary
          SO     #   Sum it's binary digits
     ¯yå_        #   Check if the loop-number `y` is NOT in the global_array yet
            *    #   Multiply both (only if this is 1 (truthy), the inner loop will stop)
                 # (after the loops, output the top of the stack implicitly)

1

Haskell,101个字节

import Data.Bits
(u!n)0=n
(u!n)m|q<-minimum[x|r<-[0..62],x<-[xor(2^r)n],notElem x u]=(n:u)!q$m-1
[]!0

在线尝试!

仅仅为引入一个导入似乎很可惜xor,但是我还没有找到一个好的解决方法。我也想知道是否有更好的方式来表达循环。


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.