算術サイクル


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
}

ただし、ご指摘のとおり、シーケンスには2つのパターンがあります。

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このシーケンスの '番目の数を出力できます。または、シーケンス全体で、n'番目の番号を含みます。(つまりf(5)、どちらか5またはになり0,1,-1,-3,0,5ます。)
    • n'th までのシーケンスを出力することを選択した場合、出力形式は柔軟です。リスト/配列、コンマ/スペース/改行区切り文字列、または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それはかなりarbitrary

回答:


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
答えのほとんどはこのソリューションの移植であるため、証明可能であることを確認したことを付け加えます。
エリックアウトゴルファー


ああ、ナッツ、非常に似たようなことに取り組んでいる間、仕事に気を取られました。+1
シャギー

好奇心から、「n%4」よりも「n&3」を好む理由はありますか?
IanF1

2
@ IanF1これは単なる低レベルのプログラミングの習慣だと思います(モジュロを計算するよりも、アセンブリでビット単位のANDを計算する方が簡単で高速です)。しかし、ここではあまり意味がありません。実際にはn%4、32ビットより大きい数値で動作するように、後で変更したいと思いました。
アーナウルド

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バイト

Arnauld港の答え:

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

オンラインでお試しください!


素朴なソリューション:

Pythonの350の 49バイト

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

オンラインでお試しください!


パイソン278の 77 76 58 57 53 52バイト

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

オンラインでお試しください!

質問でのように、ではintなくpython floorが分割されるため、でバイトの束を使用0しました。


@KevinCruijssenええ、ありがとう:)
TFeld


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フラグ)を使用します。最初の2つのソリューションでは、2つの計算ノードを使用します。3番目には、3つのノードのスタックがあります。

最初の2つのソリューションでは、上位ノードが入力を読み取り、元の数値を送信し、負になるまで4を繰り返し減算し、ジャンプテーブルのインデックスに5を追加します。これはと同等(n % 4) + 1です。

3番目のソリューションは、このタスクを2つのノードに分割しました。一番上のノードは時間の終わりまで制限を繰り返し、中間ノードはインデックス(その制限と比較して)と上記のモジュロを並行してカウントアップします。

3つのソリューションすべての下位ノードは同じです。ジャンプテーブルがあり、ここで魔法が発生します。私たちは、元の番号を格納しACC、その後、JRO(おそらくJ UMP R elative O ffset)前進することにより123、または4、上記のノードが言うに応じました。

後方への作業:

  • 4ます)食べ、そしてB)に移動出力のためにダウン。NEGACCACC
  • 3に入れ1ACCから、ステップ4a4bを実行します。
  • 2ステップ4bに直接ジャンプします。
  • 1は、それ自体をSUBトラクトACCし(実質的にゼロ化ACC)、stepを実行し24bにジャンプします。

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;}

オンラインでお試しください!


次のポートを作成することにより、バイト数(31バイト)を正確に半減できます。 OlivierGrégoireのJavaの答えをf(n){n=n%2>0?n*(2-n%4):n%4/-2;}私はので、私だけでなく、あなたの再帰的なアプローチのように、かかわらず、第二の答えとして、それを追加します。:)
ケビンクルーッセン

@KevinCruijssen Java 10のソリューションを見て、その簡潔さに気付きましたが、2つの言語の算術構文があまりにも似ているため、単にソリューションをコピーしたくありませんでした。
ジョナサンフレッチ



1

網膜、46バイト

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

_.*
0

オンラインでお試しください!説明:

.+
*

単項に変換します。

r`(____)*$
_$.=

10進数に戻しますが、n%4+1下線は残します。

____
-

それが4の場合、結果はになり-nます。

___.*
-1

ケース3: -1

__

事例2: n

_.*
0

事例1: 0



1

APL(Dyalog Classic)22 12バイト

Erik the Outgolferの発言により、大量の10バイトが節約されました。ありがとうございました!

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

オンラインでお試しください!

n番目の数を出力します

私はAPLを知りません。ArnauldのJポートをDyalog APLで動作させようとしました。


2
いい試みだ!いくつかの発言:1)あなたは置き換えることができ(0,⍵,¯1,-⍵)(0⍵¯1,-⍵)。2)システム変数が割り当てられていると1+仮定し⎕IO0(はい、それは許可されています)を削除できます。3)私たちは通常、f←機能を提出するときに部品を数えません。4)インデックスの代わりに関数を使用できます[]。これらはすべてこれを形成します:(⎕IO←0これを数えないでください){(4|⍵)⊃0⍵¯1,-⍵}
Erik the Outgolfer

@Erik the Outgolferありがとうございます!
ガレンイワノフ

2
このアプローチに基づくより高度なゴルフ:4∘|⊃0,⊢,¯1,-
エリック・ザ・アウトゴルファー

1
@Erik the Outgolfer-はい、確かに!4∘|⊃0,⊢,¯1,- 私のJソリューション4&|{0,],_1,-がAPLでどのように見えるかはまさにあなたの考えだと思います。再度、感謝します!
ガレンイワノフ

1
実際、JはAPLバリアントですが、DyalogやNARS2000などの他のAPLのようなものよりも遠くにあります。
エリックアウトゴルファー

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

エラーで停止します:出口が定義されていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.