整数の分割、反転、再結合


16

バックグラウンド

数学では、整数を整数のペアと1対1で対応させることができることはよく知られています。これを行うには多くの方法がありますが、この課題ではそのうちの1つとその逆の操作を実装します。

タスク

入力は正の整数n > 0です。a, b ≥ 0などの一意の非負整数が存在することが知られています。出力は、正の整数の「反転バージョン」です。n == 2a * (2*b + 1)n2b * (2*a + 1)

入力および出力は、言語の標準の符号なし整数データ型に適合すると仮定できます。

ルールとスコアリング

完全なプログラムまたは関数のいずれかを作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。

テストケース

in <-> out実装される関数はそれ自体が逆であるため、これらはformat で与えられます。出力をフィードバックする場合、元の入力を取得する必要があります。

1 <-> 1
2 <-> 3
4 <-> 5
6 <-> 6
7 <-> 8
9 <-> 16
10 <-> 12
11 <-> 32
13 <-> 64
14 <-> 24
15 <-> 128
17 <-> 256
18 <-> 48
19 <-> 512
20 <-> 20
28 <-> 40
30 <-> 384
56 <-> 56
88 <-> 224
89 <-> 17592186044416

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

## Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

## Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

## Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

## [><>](http://esolangs.org/wiki/Fish), 121 bytes


1
面白いことに、この問題は先週アナーキーゴルフ
feersum

@feersumああ、私は知らなかった。なんという偶然なんでしょう。
-Zgarb

回答:


11

ゼリー17 16 15 バイト

BUi1µ2*³:2*×Ḥ’$

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

使い方

BUi1µ2*³:2*×Ḥ’$    Main link. Input: n

B                  Convert n to base 2.
 U                 Reverse the array of binary digits.
  i1               Get the first index (1-based) of 1.
                   This yields a + 1.
    µ              Begin a new, monadic chain. Argument: a + 1
     2*            Compute 2 ** (a+1).
       ³:          Divide n (input) by 2 ** (a+1).
                   : performs integer division, so this yields b.
         2*        Compute 2 ** b.
              $    Combine the two preceding atoms.
            Ḥ      Double; yield 2a + 2.
             ’     Decrement to yield 2a + 1.
           ×       Fork; multiply the results to the left and to the right.

待って、問題に合うようにJellyにオペレーターを実装していますか?その場合のLOLで
アレクサンダーTorstling

私は違います。このチャレンジが投稿された後のJellyへの唯一のコミットはドキュメントの更新であり、この回答で使用されたすべてのオペレーターは少なくとも1か月間実装されています。自由に確認してください
デニス

心配する必要はありません。私はルールなどに慣れていません。自分の言語を発明する人々にゴルフがやってきたのはクールだと思いました!
アレクサンダートーストリング

2
そして、それらはたくさんあります。PPCGユーザーが作成したプログラミング言語を確認してください
デニス

10

Pyth、16 15バイト

*hyJ/PQ2^2.>QhJ

デニスのおかげで1バイト

テストスイート

説明:

*hyJ/PQ2^2.>QhJ
                    Implicit: Q = eval(input())
     PQ             Take the prime factorization of Q.
    /  2            Count how many 2s appear. This is a.
   J                Save it to J.
  y                 Double.
 h                  +1.
          .>QhJ     Shift Q right by J + 1, giving b.
        ^2          Compute 2 ** b.
*                   Multiply the above together, and print implicitly.

7

MATL、22バイト

Yft2=XK~)pq2/2w^Ks2*Q*

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

説明

Yf      % factor
t       % duplicate
2=      % compare to 2 (yields a logical array)
XK      % save a copy of that to variable K
~)      % keep only values != 2 in the factors array
p       % multiply that factors
q2/     % product - 1 / 2
2w^     % 2^x

K       % load variable K (the logical array)
s       % sum (yields the number of 2s)
2*Q     % count * 2 + 1

*       % multiply both values

非常に素晴らしい!Qfor 1+(これは最近導入されました)およびqfor を使用できます1-。また、スペースを節約できます(Hとにかく節約できます)。ここを
ルイスメンドー

@LuisMendoありがとう。その機能を知りませんでした。
レイナーP.

5
MATLを使用してLuisを破りました!
スチューウィーグリフィン

6

Python 2、39バイト

lambda n:2*len(bin(n&-n))-5<<n/2/(n&-n)

n & -nは、除算する2の最大のべき乗を与えnます。なぜなら、2の補数演算では-n == ~n + 1。末尾のゼロnk個ある場合、その補数を取ると、末尾のkkになります。次いで、1を加えてゼロにすべての後続のものを変更し、変更されます2 ^ k個のので0から1にビットを-n続いて1で終了K 0(ただなどnから反対のビットを有しながら、)nすべてのより高い場所です。


どのように機能するか簡単に説明できますn&-nか?私はこのトリックが何をするかを見るが、どのように:(
Erwan

n&-ndivdesの最高の2のべき乗を返しますn
ニール

@Erwanについて説明しましたn & -n
feersum

私はアナーキーゴルフn=1;exec"c=n&-n;print n,':',2*len(bin(c))-5<<n/2/c;n+=1;"*100で対応するプログラムを手に入れましたが、それは最良の解決策の裏に2つの文字があります。
-xnor

@xnorヒント:59バイトのソリューション(少なくとも私の場合)は、のすべての値に対して機能しませんn
-feersum

6

MATL、25 26バイト

:qt2w^w!2*Q*G=2#f2*q2bq^*

これは、現在のリリース(10.2.1)の言語/コンパイラーを使用します。

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

説明

総当たりに基づいて、非常に簡単です。abのすべての組み合わせを試し、適切な組み合わせを選択して、必要な計算を行います。

:q          % implicit input "n". Generate row vector [0,1,...,n-1], say "x"
t2w^        % duplicate and compute 2^x element-wise
w!2*Q       % swap, transpose to column vector, compute 2*x+1
*           % compute all combinations of products. Gives 2D array
G=2#f       % find indices where that array equals n
2*q2bq^*    % apply operation to flipped values

1
ハァッ!:-P自分の言語でBeatられた...初めて?
スチューウィーグリフィン

@StewieGriffinうん!素晴らしいマイルストーン:-)
ルイスメンドー

5

ジュリア、41バイト

n->2^(n>>(a=get(factor(n),2,0)+1))*(2a-1)

これは、整数を受け入れて整数を返す匿名関数です。呼び出すには、変数に割り当てます。

a素因数分解で1 + 2の指数を定義しますn。以来factorリターンはDict、我々が使用できるget場合にはデフォルト値の0で素因数分解は、2。我々の右ビットシフトが含まれていないnことではa、このパワーに2を取ります。2a-1結果を得るためにそれを掛けます。


4

Perl 5、40バイト

38バイト+ 2 -p

$i++,$_/=2until$_%2;$_=2*$i+1<<$_/2-.5

-pSTDINを変数に読み込みます$_

$i++,$_/=2until$_%2増分$i(0から始まる)で、mod 0が非ゼロになる$_まで半分になります$_。その後$_は、元の数値の奇数因子であり、$i2の指数です。

$_=2*$i+1<<$_/2-.5—の右側は、=求める数値の式です。{1は2の指数の2倍以上} {2は{奇数の半分から半分を引いたもの}のべき乗}}です。しかし、「倍{2の累乗…}」は「ビットシフトにより左に…」とゴルフされます。そして、その右側はに割り当てられ$_ます。

そして-p印刷し$_ます。



2

JavaScriptのES6、36の 33バイト

n=>63-2*Math.clz32(b=n&-n)<<n/b/2

私の理解は、それMath.clz32はいじるよりも短くなるだろうということですtoString(2).length

編集:@ user81655のおかげで3バイトを保存しました。


いいね n&-n変数に設定することで数バイトを保存することもできますn=>63-2*Math.clz32(x=n&-n)<<n/x/2
。– user81655

@ user81655ありがとう。使用できればよかったのですがn&=-nnもう一度必要になります
ニール

1

PARI / GP、38バイト

f(n)=k=valuation(n,2);(2*k+1)<<(n>>k\2)

>>\は同じ優先順位を持ち、左から右に計算されるため、最後の部分はでn>>k\2なくてもよいことに注意してください(n>>k)\2。改変されていないバージョンは次のようにkレキシカルになりmyます

f(n)=
{
  my(k=valuation(n,2));
  (2*k+1) << ((n>>k)\2);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.