头晕的整数枚举


25

今天的挑战是输出一个枚举所有整数的给定序列项。该序列如下:如果我们有一个0索引函数生成该序列,f(n)并且ceil(x)是上限函数,则f(0) = 0; abs(f(n)) = ceil(n/2); sign(f(n))nceil(n/2)都为偶数或均为奇数时为正。

为了帮助理解此顺序,前几个术语如下: 0 1 -1 -2 2 3 -3 -4 4 5 -5 -6 6 7 -7...

您的任务是编写一个程序,该程序需要一个整数n并输出n序列的第n个项。输入只能是0或1索引。

测试用例(0索引):

0  =>  0
1  =>  1
2  => -1
3  => -2
4  =>  2
5  =>  3

这是,最少字节获胜!



似乎是折叠函数
sergiol

Answers:




5

JavaScript(ES6),18个字节

1个索引。

n=>n/(++n&2||-2)|0

演示版


4

C,25个字节

f(n){return~n/2*~-(n&2);}

通过将返回值分配给第一个参数,而不使用关键字return,可以节省4个字节。f(n){n=~n/2*~-(n&2);}
cleblanc

5
@cleblanc这不是C的工作方式。
orlp

2
gcc -O0对于x86-64,确实将@cleblanc的版本编译为恰好在乘法结果保留在eaxgodbolt.org/g/dztKPV)中的指令,但这将是一个x86-64 gcc -O0答案,而不是C答案。我不会投票支持启用优化的C答案,尤其是不要将那个愚蠢的最后一个表达式当作返回值废话。即使这就是gcc的工作方式,也不是C的工作方式。
彼得·科德斯

做一个na指针。如果原始值和最终值不在堆栈中,则不需要优化。
mreff555

1
@ mreff555这将是一种非标准(虽然可以接受)的IO方法,并且不会再短一些。
orlp





3

Mathematica,24个字节

(s=⌈#/2⌉)(-1)^(#+s)&  

来自@Misha Lavrov的-14个字节


1
使用BooleOddQ具有将奇数转换为1并将偶数转换为0的效果,但是您在这里不需要这样做:无论如何,-1的幂可以为您提供所有奇数的正确答案。因此,您可以将这一步减少到(-1)^Tr@{#,s}(-1)^(#+s)
Misha Lavrov






2

批次,29个字节

@cmd/cset/a"%1/2^(%1<<30>>30)

2

JavaScript(ES6),18个字节

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

0索引。


2

Javascript,17个字节

n=>~n/2*~-(n&2)^0

该索引为0。这完全是按位欺骗。


2

大概是23个字节

(1索引)

FDF'$:7+8/0_0*0-8*7/0%6

在线尝试!

用Cubically编写代码的主要困难是:

  • 只有1个可写变量,并且
  • 获取常数很难。

因此,此解决方案计算

((((n+1)/2)%2)*2-1)*n/2

其中/表示整数除法。那只需要1个临时变量,以及常数1和2。

说明:

FDF'$:7+8/0_0*0-8*7/0%6
FDF'                      Set face value of face 0 to 2, and value of memory index 8 (cube is unsolved) to 1 (true = unsolved)
    $                     Read input
     :7                                 input
       +8                                + 1
         /0                        (        ) /2
           _0                     (             ) %2
             *0                  (                  ) *2
               -8                                        -1
                 *7             (                          ) *n
                   /0                                          /2
                     %6   Print

2

TI-Basic(TI-84 Plus CE),20字节

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2

称为的完整程序5:prgmNAME

TI-Basic是一种标记化语言,此处使用的所有标记均为一个字节,但remainder(其中有两个为令牌。表示使用令牌键入的监管令牌(-)

例子:

0:prgmNAME
 => 0
1:prgmNAME
 => 1
2:prgmNAME
 => -1
#etc

说明:

‾int(‾Ans/2)(1-2remainder(int(Ans/2),2
‾int(‾Ans/2)                           # -int(-X) is ciel(X), so ciel(Ans/2)
                          int(Ans/2)   # int(X) is floor(X), so floor(Ans/2)
                remainder(int(Ans/2),2 # 1 if floor(Ans/2) is odd else 0
            (1-2remainder(int(Ans/2),2 # -1 if floor(Ans/2) is odd, else 1
_int(_Ans/2)(1-2remainder(int(Ans/2),2 # -ciel(Ans/2) if floor(Ans/2) is odd, else ciel(Ans/2)

与Y-var函数相同的公式:

Y1= ‾int(‾X/2)(1-2remainder(int(X/2),2

2

dc,16字节

1+d2~+2%2*1-r2/*

我敢肯定有一种方法可以将DC中的0..1缩短为-1..1,但目前尚无任何想法。

在线尝试!


2

Java 8,15字节

n->~n/2*~-(n&2)

编辑:Java真的是非高尔夫语言中最短的语言吗?Ô

说明:

在这里尝试。

我将使用下表作为正在发生的事情的参考。

  1. ~n等于-n-1
  2. 由于Java中的整数除法会自动使正整数落在底数上,而对负整数~n/2会降低底线,因此将导致序列0,-1,-1,-2,-2,-3,-3,-4,-4,-5,-5,...
  3. n&2将导致序列中的020,0,2,2,0,0,2,2,0,0,2,...
  4. ~-x等于(x-1),所以~-(n&2)((n&2)-1))得出序列-1,-1,1,1,-1,-1,1,1,-1,-1,1,...
  5. ~n/2~-(n&2)给出的两个序列相乘是挑战中要求的正确序列:0,1,-1,-2,2,3,-3,-4,4,5,-5,...

概述表:

n       ~n      ~n/2    n&2     ~-(n&2)     ~n/2*~-(n&2)
0       -1      0       0       -1          0
1       -2      -1      0       -1          1
2       -3      -1      2       1           -1
3       -4      -2      2       1           -2
4       -5      -2      0       -1          2
5       -6      -3      0       -1          3
6       -7      -3      2       1           -3
7       -8      -4      2       1           -4
8       -9      -4      0       -1          4
9       -10     -5      0       -1          5
10      -11     -5      2       1           -5

2

Brain-Flak86 74 72 70字节

{({}[()]<({}<>([({})]{(<{}([{}]())>)}{}())<>)>)}{}<>{}{<>([{}])(<>)}<>

在线尝试!

说明

此代码分为两部分。第一部分

({}[()]<({}<>([({})]{(<{}([{}]())>)}{}())<>)>)}{}

进行计算的能力。它确定ceil(n/2)是否取消输出。

为了解释它是如何工作的,我将首先解释一个人如何计算ceil(n/2)。可以使用以下代码完成

{({}[()]<({}([{}]()))>)}{}

每次在计数器上执行非()运算时,此计数将从n开始递减([{}]()),并将计数器加到结果中。由于计数器的一半时间为零,因此我们仅从第一个运行开始就增加其他运行。

现在,我还要计算结果的符号。为此,我们启动另一个计数器。仅当第一个计数器关闭时,此计数器才会更改状态。这样我们就得到了所需的模式。我们将这两个计数器放在堆栈外,以方便在时间到时移动它们。

现在,一旦我们完成了计算,我们的堆栈就变成了这样

          parity(n)
ceil(n/2) sign

因此,我们需要做一些工作来获得预期的结果,这是第二部分要做的。

<>{}{<>([{}])(<>)}<>



1

QBIC27 26字节

g=(:+1)'\2`~(a-g)%2|?-g\?g

说明

g=          set worker var 'g' to
(:+1)           our index (plus one for the ceil() bit)
'\2`            integer divided by 2 (the int div needs a code literal: '..`
~(a-g)%2    IF index - temp result is odd (index 2 minus result 1 = 1)
|?-g        THEN PRINT g negated
\?g         ELSE PRINT g

1

Clojure 122字节

详细,即使打高尔夫球。我要在这里进行同情投票... :-)

打高尔夫球:

(defn d[n](let[x(int(Math/ceil(/ n 2)))y(cond(or(and(even? n)(even? x))(and(odd? n)(odd? x)))(Math/abs x):else(- 0 x))]y))

取消高尔夫:

(defn dizzy-integer [n]
  (let [x   (int (Math/ceil (/ n 2)))
        y   (cond
                (or (and (even? n) (even? x))
                    (and (odd? n)  (odd? x))) (Math/abs x)
                :else (- 0 x)) ]
    y))

1

Excel VBA 32位,39 37字节

匿名VBE立即窗口功能,它从单元格获取输入A1并输出到VBE立即窗口

?[Sign((-1)^Int(A1/2))*Int((A1+1)/2)]

限制为32位,因为A^B在64位中无效(A ^B尽可能接近)


是之间的空间(-1)^[Int需要?
帕维尔

@Pavel至少适用于Excel VBA的64位版本,是的;但这就是说我发誓它不适用于32位版本,但是可惜我无法在我手头的任何硬件上进行测试
Taylor Scott

@Pavel-我已经在32位系统(默认安装规格)下查看了该文件,并且在该系统下不需要空间-我将解决方案限制为32位以利用这一点
Taylor Scott

1
凉!但是您忘记添加校正后的字节数。
帕维尔

糟糕,感谢@Pavel-现在已解决
Taylor Scott

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.