めまい整数列挙


25

今日の課題は、すべての整数を列挙するシーケンスの特定の用語を出力することです。シーケンスは次のとおりです。シーケンスf(n)を生成する0インデックス関数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...

あなたの仕事は、整数を取り、シーケンスのth項をn出力するプログラムを書くことnです。入力は0または1インデックスのみです。

テストケース(0から始まる):

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

これは、最少バイトが勝ちます!



回答:


8

SOGL V0.128つの 6 バイト

I».»⌡±

ここで試してみてください!または、最初の数を試してください(少し変更して動作するように)
0インデックスを付けます

説明:

I       increment the input
 »      floor divide by 2
  .     push the original input
   »    floor divide by 2
    ⌡   that many times
     ±    negate

またはもっと簡単:

(input + 1) // 2 negated input // 2 times
        I     »     ±      .     »    ⌡

3
それは一分もかからなかった!
NieDzejkob

6
私は».»電話でいますI».»⌡±
ジョナサンアラン

@JonathanAllanわかりません。_。
パベル



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 -O0x86-64の場合、@ cleblancのバージョンをコンパイルして、乗算結果eaxgodbolt.org/g/dztKPV)を残す命令が発生しますが、x86-64 gcc -O0Cの答えではなく答えになります。私は、最適化を有効にすると壊れるCの回答、特に戻り値のがらくたとしての愚かな最後の式には賛成票を投じません。それがgccの動作方法であっても、Cの動作方法ではありません。
ピーターコーデス

naポインターを作成します。元の値と最終値がスタックにない場合、最適化は必要ありません。
mreff555

1
@ mreff555これは非標準の(許容できるものの)IOメソッドであり、これより短いものではありません。
orlp





3

Mathematica、24バイト

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

@Misha Lavrovから-14バイト


1
Booleand OddQを使用すると、奇数を1に、偶数を0に変換する効果がありますが、ここでは必要ありません。-1の累乗により、すべての奇数に対して正しい答えが得られます。あなたはそのステップを削減することができますので、(-1)^Tr@{#,s}またはちょうど(-1)^(#+s)
ミシャラヴロフ

3

Haskell25 43 42バイト

((do a<-[0..];[[-a,a],[a,-a]]!!mod a 2)!!)

オンラインでお試しください!1インデックス付き。

編集:以前のバージョンでは、指摘してくれた@ Potato44のおかげで、間違った順番でサインがありました。18バイトに固定...

編集2: -1バイトのBMOに感謝します!


do-notationを使用して1バイトを保存できます。オンライン
1

@BMOありがとう!...
ライコニ






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

通常、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(は2 バイトを除き1バイトです。キーとともに入力される正規トークンを表し(-)ます。

例:

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

Java 8、15バイト

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

編集:Javaは本当に非ゴルフ言語の最短ですか?!o.Ô

説明:

ここで試してみてください。

何が起こっているかの参照として、以下の表を使用します。

  1. ~nに等しい-n-1
  2. Javaの整数除算は、正の整数で自動的にフロアリングし、負の整数で終了~n/2するため、結果はシーケンスになります0,-1,-1,-2,-2,-3,-3,-4,-4,-5,-5,...
  3. n&2 いずれかの結果になります 02シーケンス内のまたはのかになります0,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バイト

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

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

説明

このコードには2つの部分があります。最初の部分

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

計算のブラウンを行います。決定するceil(n/2)出力を無効にするかどうかをします。

それがどのように機能するかを説明するために、最初に計算方法を説明しますceil(n/2)。これは次のコードで実行できます

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

これは、カウンターで否定()を実行するたびにnからカウントダウンし([{}]())、結果にカウンターを追加します。カウンターは時間の半分がゼロであるため、最初の実行から他の実行ごとに増分するだけです。

次に、結果の符号も計算します。これを行うには、別のカウンターを開始します。このカウンターは、最初のカウンターがオフの場合にのみ状態を変更します。そのようにして、目的のパターンを取得します。これらの2つのカウンターをオフスタックに配置して、時間が来たら簡単に移動できるようにします。

計算が終了すると、スタックは次のようになります

          parity(n)
ceil(n/2) sign

したがって、この2番目の部分で目的の結果を得るには、いくつかの作業を行う必要があります。

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



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

セルから入力を受け取りA1、VBEイミディエイトウィンドウに出力する匿名VBEイミディエイトウィンドウ関数

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

A^B64 ビットでは無効であるため、32ビットに制限さA ^Bれます(達成可能な限り近い)


間のスペースである(-1)^[Int必要?
パベル

少なくとも64ビットバージョンのExcel VBAでは@Pavel、はい。しかし、それは、私はそれが32ビットバージョンのためにないことを誓うが、私は、テストハードウェアのいずれかで、私が手に持つことができないという悲しいかな言った
テイラー・スコット

@Pavel-32ビットシステム(デフォルトのインストール仕様)で調べましたが、そのシステムではスペースは必要ありません-これを利用するためにソリューションを32ビットに制限しました
Taylor Scott

1
クール!ただし、修正されたバイトカウントを追加するのを忘れました。
パベル

おっと、@ Pavelに感謝-今すぐ修正
テイラースコット

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