算术循环


13

输入:

整数n,其是>=0>=1f(0)可选)

输出:

n以下序列中的第'个数字,或直到第n'个数字并包括第一个数字的序列。

顺序:

(0),1,-1,-3,0,5,-1,-7,0,9,-1,-11,0,13,-1,-15,0,17,-1,-19,0,21,-1,-23,0,25,-1,-27,0,29,-1,-31,0,33,-1,-35,0,37,-1,-39,0,41,-1,-43,0,45,-1,-47,0,49,-1,-51,0,53,-1,-55,0,57,-1,-59,0,61,-1,-63,0,65,-1,-67,0,69,-1,-71,0,73,-1,-75,0,77,-1,-79,0,81,-1,-83,0,85,-1,-87,0,89,-1,-91,0,93,-1,-95,0,97,-1,-99

这个序列如何建立?

f(n=0) = 0(可选)
f(n=1) = f(0) + n或其他f(n=1) = 1
f(n=2) = f(1) - n
f(n=3) = f(2) * n
f(n=4) = f(3) / n
f(n=5) = f(4) + n

或使用伪代码:

function f(integer n){
  Integer result = 0
  Integer i = 1
  Loop as long as i is smaller than or equal to n
  {
    if i modulo-4 is 1:
      result = result plus i
    if i modulo-4 is 2 instead:
      result = result minus i
    if i modulo-4 is 3 instead:
      result = result multiplied with i
    if i modulo-4 is 0 instead:
      result = result integer/floor-divided with i
    i = i plus 1
  }
  return result
}

但是,您可能已经注意到,序列中有两种模式:

0, ,-1,  ,0, ,-1,  ,0, ,-1,   ,0,  ,-1,   ,0,  ,-1,   ,...
 ,1,  ,-3, ,5,  ,-7, ,9,  ,-11, ,13,  ,-15, ,17,  ,-19,...

因此,产生相同顺序的任何其他方法当然也都很好。

挑战规则:

  • 0索引输入和1索引输入将产生相同的结果(这就是为什么f(0)要包含0索引输入的可选)。
  • 允许您输出n此序列的'th号。或整个序列向上并包括n第一个数字。(因此f(5)可能会导致50,1,-1,-3,0,5。)
    • 如果选择输出不超过第n'个数字的序列,则输出格式很灵活。可以是列表/数组,逗号/空格/换行符分隔的字符串或打印到STDOUT等。
  • 除法(/)是整数/底数除法,四舍五入为0(在某些语言中不是朝负无穷大)。

通用规则:

  • 这是,因此最短答案以字节为单位。
    不要让代码高尔夫球语言阻止您发布使用非代码高尔夫球语言的答案。尝试针对“任何”编程语言提出尽可能简短的答案。
  • 标准规则适用于您的答案,因此您可以使用STDIN / STDOUT,具有正确参数的函数/方法和返回类型的完整程序。你的来电。
  • 默认漏洞是禁止的。
  • 如果可能的话,请添加一个带有测试代码的链接。
  • 另外,如有必要,请添加说明。

上面的其他测试用例n=100

Input     Output

1000      0
100000    0
123       -123
1234      -1
12345     12345
123456    0

1
我在oeis.org上找不到此文件,因此您可能要在此提交。这是一个有趣的序列,我很惊讶没有人注册它。
管道

1
@pipe似乎非常武断
qwr

Answers:


20

JavaScript(ES6),19个字节

n=>[0,n,-1,-n][n&3]

在线尝试!

证明

假设对于4的n倍,我们具有以下关系。

f(n)   = 0
f(n+1) = n+1
f(n+2) = -1
f(n+3) = -(n+3)

N = n + 4。然后,根据定义:

f(N)   = f(n+4) = f(n+3) // (n+4) = -(n+3) // (n+4) = 0
f(N+1) = f(n+5) = f(n+4) + (n+5)  = 0 + (n+5)       = N+1
f(N+2) = f(n+6) = f(n+5) - (n+6)  = (n+5) - (n+6)   = -1
f(N+3) = f(n+7) = f(n+6) * (n+7)  = -1 * (n+7)      = -(N+3)

通过数学归纳法证明该关系对于4的任何N倍均成立。


2
因为大多数答案都是该解决方案的端口,所以我想补充一点,我已证实它是可证明的。
Erik the Outgolfer


啊,疯了,在做一些非常相似的事情时,由于工作而分心。+1
Shaggy

出于好奇,是否有理由更喜欢“ n&3”而不是“ n%4”?
IanF1

2
@ IanF1我想这只是一个低级的编程习惯(在汇编中按位与计算比对模进行计算更容易,更快捷)。但这在这里没有多大意义,实际上我很想将其更改为n%4以后版本,以便它可以用于大于32位的数字。
Arnauld

4

05AB1E,8个字节

输出nth数量

ÎD(®s)sè

在线尝试!

05AB1E,14个字节

使用序列中的模式输出最多N个数字的列表

ÅÉāÉ·<*āÉ<‚øí˜

在线尝试!

说明

使用N = 7的示例

ÅÉ               # List of odd numbers upto N
                 # STACK: [1,3,5,7]
  ā              # Enumerate 1-based
   É             # is odd?
                 # STACK: [1,3,5,7],[1,0,1,0]
    ·<           # double and decrement
                 # STACK: [1,3,5,7],[1,-1,1,-1]
      *          # multiply
                 # STACK: [1,-3,5,-7]
       āÉ<       # enumerate, isOdd, decrement
                 # STACK: [1,-3,5,-7],[0,-1,0,-1]
          ‚ø     # zip
                 # STACK: [[1, 0], [-3, -1], [5, 0], [-7, -1]]
            í    # reverse each
             ˜   # flatten
                 # RESULT: [0, 1, -1, -3, 0, 5, -1, -7]

4

Python 2,25个字节

阿尔纳德港的答案:

lambda n:[0,n,-1,-n][n%4]

在线尝试!


天真的解决方案:

Python 3中50 49个字节

lambda n:n and eval('int(f(n-1)%sn)'%'/+-*'[n%4])

在线尝试!


Python 2中78个 77 76 58 57 53 52字节

lambda n:n and eval('int(1.*f(n-1)%sn)'%'/+-*'[n%4])

在线尝试!

在上使用了一堆字节int,因为python底部是分开的,而不是0像问题中那样朝向。


@KevinCruijssen是的,谢谢:)
TF


3

TIS -n 2 1,123字节

输出的nth号0 <= n <= 999。(上限是由于语言限制)。

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
JRO -5
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY
HCF

在线尝试!


TIS -n 2 1,124字节

输出的nth号0 <= n <= 999。(上限是由于语言限制)。n可以提供多个,以空格分隔。

@0
MOV UP ACC
MOV ACC ANY
L:SUB 4
JGZ L
JEZ L
ADD 5
MOV ACC ANY
@1
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

在线尝试!


TIS -n 3 1,192字节

产出值0..n0 <= n <= 999。(上限是由于语言限制)。

@0
MOV UP ACC
ADD 1
MOV ACC ANY
JRO -1
@1
SUB UP
JLZ C
HCF
C:ADD UP
MOV ACC ANY
ADD 1
SWP
ADD 1
MOV ACC ANY
SUB 4
JEZ W
ADD 4
W:SWP
@2
MOV UP ACC
JRO UP
SUB ACC
JRO 3
MOV 1 ACC
NEG
MOV ACC ANY

在线尝试!


全部使用数字I / O(-n标志)。前两个解决方案使用两个计算节点,一个位于另一个之上。第三个具有三个节点的堆栈。

对于前两个解决方案,上层节点读取输入,发送原始数字,然后重复减去4直到我们变为负数,然后为跳转表的索引加5。等同于(n % 4) + 1

第三种解决方案将该任务划分为两个节点。最上面的一个重复该限制直到时间结束,并且中间节点并行计算索引(与该限制相比)和上面的模。

这三种解决方案的下层节点都相同。它有一个跳转表,这就是魔术发生的地方。我们存放在原来的号码ACC,然后JRO(可能Ĵ UMP [R elative Ø ffset)向前123,或者4,这取决于上述的节点说。

向后工作:

  • 4aNEG吃饱ACC,然后bACC下移以输出。
  • 3会放1ACC,然后执行步骤44b
  • 2将直接跳到步骤4b
  • 1SUBACC关闭自身(有效地置零ACC),然后执行步骤2,其跳转到4b

2

C(gcc),62个字节

f(n,k){k=~-n;n=n?n%4?k%4?n-2&3?f(k)*n:f(k)-n:f(k)+n:f(k)/n:0;}

在线尝试!


您可以通过创建OlivierGrégoire的Java答案端口来将字节数(31个字节)精确地减半:f(n){n=n%2>0?n*(2-n%4):n%4/-2;}尽管我也喜欢您的递归方法,但我还是将其添加为第二个答案。:)
Kevin Cruijssen

@KevinCruijssen我确实看到了他们的Java 10解决方案并注意到了它的简洁性,尽管我不想简单地复制他们的解决方案,因为两种语言的算术语法太相似了。
乔纳森·弗雷希



1

视网膜,46字节

.+
*
r`(____)*$
_$.=
____
-
___.*
-1
__

_.*
0

在线尝试!说明:

.+
*

转换为一元。

r`(____)*$
_$.=

转换回十进制,但保留n%4+1下划线。

____
-

如果是4,则结果为-n

___.*
-1

情况3: -1

__

情况2: n

_.*
0

情况1: 0


1

Haskell,50个字节

f 0=0
f n=([(+),(-),(*),quot]!!mod(n-1)4)(f(n-1))n

在线尝试!

移植到Haskell的Arnauld解决方案为23个字节:

z n=cycle[0,n,-1,-n]!!n

1

APL(Dyalog Classic)22 12字节

由于Outgolfer的评论,节省了10个字节。谢谢!

4∘|⊃0,⊢,¯1,-

在线尝试!

输出第n个数字

我不了解APL,我只是想让我的Arnauld解决方案的J端口在Dyalog APL中工作。


2
不错的尝试!几点说明:1)您可以替换(0,⍵,¯1,-⍵)(0⍵¯1,-⍵)。2)您可以1+通过假定已将⎕IO系统变量分配给0(是,允许)来删除。3)f←在提交功能时,我们通常不计零件。4)您可以使用该函数代替[]索引。所有这些共同构成了这个:(⎕IO←0不算这个){(4|⍵)⊃0⍵¯1,-⍵}
暴民埃里克(Erik the Outgolfer

@Erik the Outgolfer谢谢!
Galen Ivanov '18

2
基于此方法的更高级的高尔夫运动:4∘|⊃0,⊢,¯1,-
暴民埃里克(Erik the Outgolfer)

1
@Outgolfer的Erik-是的,的确如此!我认为您4∘|⊃0,⊢,¯1,- 正是我的J解决方案4&|{0,],_1,-在APL中的样子。再次感谢!
Galen Ivanov '18

1
实际上,J是APL的一种变体,尽管它比Dyalog和NARS2000之类的其他APL风格更远。
暴民埃里克(Erik the Outgolfer)

1

Cubix20 19字节

Iun:^>s1ns:u@Ota3s0

在线尝试!

将相同的方法移植到cubix。

在多维数据集上:

    I u
    n :
^ > s 1 n s : u
@ O t a 3 s 0 .
    . .
    . .

第一位^Iu:n>s1ns:u0s建立堆栈,然后3at将适当的项目复制到TOS,然后O输出并@结束程序。


0

空白,84 83字节

[S S S N
_Push_0][S N
S _Duplicate_0][T   T   S _Store][S S S T   S N
_Push_2][S S T  T   N
_Push_-1][T T   S _Store][S S S T   N
_Push_1][S N
S _Duplicate_1][T   N
T   T   _Read_STDIN_as_integer][S S S T T   N
_Push_3][S S S T    N
_Push_1][T  T   T   ][S S T T   N
_Push_-1][T S S N
_Multiply][T    T   S _Store][T T   T   _Retrieve_input][S S S T    S S N
_Push_4][T  S T T   _Modulo][T  T   T   _Retrieve_result][T N
S T _Print_as_integer]

字母S(空格),T(制表符)和N(换行符)仅作为突出显示而添加。
[..._some_action]仅作为说明添加。

在线尝试(仅使用空格,制表符和换行符)。

@Arnauld的JavaScript答案端口。

说明(输入示例n=7):

Command   Explanation         Stack        Heap                  STDIN   STDOUT   STDERR

SSSN      Push 0              [0]
SNS       Duplicate top (0)   [0,0]
TTS       Store               []           {0:0}
SSSTSN    Push 2              [2]          {0:0}
SSTTN     Push -1             [2,-1]       {0:0}
TTS       Store               []           {0:0,2:-1}
SSSTN     Push 1              [1]          {0:0,2:-1}
SNS       Duplicate top (1)   [1,1]        {0:0,2:-1}
TNTT      Read STDIN as nr    [1]          {0:0,1:7,2:-1}        7
SSSTTN    Push 3              [1,3]        {0:0,1:7,2:-1}
SSSTN     Push 1              [1,3,1]      {0:0,1:7,2:-1}
TTT       Retrieve input      [1,3,7]      {0:0,1:7,2:-1}
SSTTN     Push -1             [1,3,7,-1]   {0:0,1:7,2:-1}
TSSN      Multiply (-1*7)     [1,3,-7]     {0:0,1:7,2:-1}
TTS       Store               [1]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve input      [7]          {0:0,1:7,2:-1,3:-7}
SSSTSSN   Push 4              [7,4]        {0:0,1:7,2:-1,3:-7}
TSST      Modulo (7%4)        [3]          {0:0,1:7,2:-1,3:-7}
TTT       Retrieve            [-7]         {0:0,1:7,2:-1,3:-7}
TNST      Print as integer    []           {0:0,1:7,2:-1,3:-7}           -7
                                                                                  error

因错误而停止:未定义退出。

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.