バイナリバイナリ拡張


9

通常、係数を2のべき乗で割り当てることにより、数値を2進数に分解します。 01します。各項のまたはです。

25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1

選択0とは1非常にバイナリではない...です。2の累乗で拡張することにより真のバイナリ拡張を実行しますが、係数は1か、-1代わりに:

25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1

今、これはバイナリになります。

正の数が与えられた場合、次のことを確認することは簡単です。

  • すべての奇数には、無限に多くの真のバイナリ展開があります
  • すべての偶数には真のバイナリ展開はありません

したがって、真のバイナリ展開を明確に定義するには、展開を最小にする、つまり最短にする必要があります。


正の奇数の整数を指定するnと、最上位の桁から最下位の桁まで(または逆の順序で)、その真のバイナリ展開を返します。

ルール:

  • これは可能な限り短いバイト数でこれを行うことを目指す必要がありますビルトインは許可されています。
  • 係数を表してリストできる出力であればどれでも許容されます:配列、セパレータ付きの係数の文字列など...
  • 標準のゴルフ抜け穴が適用されます。
  • プログラムは、言語の標準整数サイズ内の値で動作するはずです。

テストケース

25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]

関連していますがかなり異なります。
ジュゼッペ

4
単純なアルゴリズム:基数2に変換し、0を-1に置き換え、LSDを先頭に配置します。
Josiah Winslow

Voile:私は反対票については説明していませんでした。私は自分の言語でベース変換コマンドを持っている人のためのアルゴリズムを概説していました。
Josiah Winslow

あなたは本当にバイナリであることに熱心なので、通常の場所の値を使用してパックされたビットとして値を返すことができますが、2つの状態の新しい解釈は可能ですか?つまり、電気的には高電圧または低電圧(または何でも)であり、標準のデバッガーが低電圧状態の0代わりに印刷する場合は、私のせいではありません-1。ビットを受け取った発信者は、その意味を知っています。(32ビットの有効ビットがある場合にのみ右回転が機能するため、これは重要なビット操作です。たとえば、5ビットの数値には5の回転幅が必要です。)
Peter Cordes 2017

出力にセパレータを含める必要がありますか?である111-1-1ため、有効な出力25
オリバー

回答:



3

Pyth 12  11バイト

|R_1.>jQ2 1

ここでお試しください!


どうやって?

| R_1。> jQ2 1完全なプログラム。

      jQ2入力をバイナリリストに変換します。
     。> 1上のリストを右に1回転循環します。
| R_1 0を-1に置き換えます。
               暗黙的に出力されます。

まず、タスクは「0バイナリの書き込みのsをsで置き換え-1、右に1桁シフトする」だけであることに気づきます。—それこそまさに私たちがすべきことです!バイナリ変換により、0sと1sのリストが得られます。私たちはここで行う必要があるすべては、変換するgolfy方法を見つけることです0しを-1。ビットワイズ演算子|(ビットワイズOR)は私たちの友人です。|およびでシフトされたバイナリ表現のマップ-1。現在の数値がの場合、0に変換され-1ます。


もっと良い方法はないと思います。;)
Josiah Winslow

@JosiahWinslowやります...それを見つけようとしています
Xcoder氏2017

えっ?アルゴリズムは最適のようですが、それはおそらくPythがわからないためです。
Josiah Winslow

@JosiahWinslowより良い方法が見つかりました。構文的に優れた方法であり、アルゴリズム的に優れた方法ではありません。
Xcoder氏2017

@ Mr.Xcoderそして今、少なくとも私には本当に何もありません。
Erik the Outgolfer 2017



2

Perl 6、72バイト

確かにもっと良い方法がありますが、これは私が持っているものです...

->$a {grep {$a==[+] @^a.reverse Z+< ^∞},[X] (1,-1)xx $a.base(2).chars}

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

説明:これは、1つの引数(->$a)を取る関数です。最初に必要な係数の数($a.base(2).chars=基数2表現の文字数)を取得し、次にXその数のペアのデカルト積()を作成し(1,-1)ます。([X]意味:次のリストをで減らしますX。)したがって、1と-1の可能なすべての組み合わせのリストを取得します。次にgrep、指定された数値をエンコードするリストのみをフィルタリング()します$a。1つしかないため、係数を含む1つのリストのリストを取得します。

grepブロックはこれを行います:引数をリスト(@^a)として受け取り、それを逆にし0,1,2,...て、「左ビットシフト」演算子を使用して無限リストで圧縮し+<ます。短いリストが空になるとすぐに圧縮が停止します(これは良いことです!)次に、すべての結果を合計して、指定された数値と比較します。.reverseOPは、係数が最も重要なものから最も重要でないものへの順序であることを要求するため、使用する必要がありました。




1

J、11バイト

1-~2*_1|.#:

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

アルゴリズムを提供してくれた@JosiahWinslowに感謝します。

変換を短くすることについての考えは?私の考えは使用することです!. -fitです(nvm、変換の許容範囲を変更するだけです)。

{-take を使用すると、1文字長くなります。

_1 1{~_1|.#:

1

Java 8、101バイト

n->{String s=n.toString(n,2);return(s.charAt(s.length()-1)+s.replaceAll(".$","")).replace("0","-1");}

@OliverのJAPTの答えと、いくつかのより多くのバイト..;)

この文字列アプローチの代わりに数学的なアプローチを使用することで間違いなくゴルフをすることができます。

説明:

ここで試してください。

n->{                             // Method with Integer parameter and String return-type
  String s=n.toString(n,2);      //  Convert the Integer to a binary String
  return(s.charAt(s.length()-1)  //  Get the last character of the binary String
    +s.replaceAll(".$","")       //   + everything except the last character
   ).replace("0","-1");          //  Then replace all zeroes with -1, and return the result
}                                // End of method

1

R90 88 46バイト

function(n)c((n%/%2^(0:log2(n))%%2)[-1],1)*2-1

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

オリバーのアルゴリズムを実装しますが、数字を逆の順序で返します。n決して偶数ではないことが保証されているため、最下位ビット(最初のビット)は常にな1ので、それを削除1し、最後にa を追加してRでの回転をシミュレートします数学を修正てくれた Shaggyに感謝

rev( )関数呼び出しをフッターに配置するだけで、同じ順序で値が返されます。

元の回答、88バイト:

function(n,b=2^(0:log2(n)))(m=t(t(expand.grid(rep(list(c(-1,1)),sum(b|1))))))[m%*%b==n,]

匿名関数; 列名を付けて逆の順序で値を返します。

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

説明:

function(n){
 b <- 2^(0:log2(n))         # powers of 2 less than n
 m <- expand.grid(rep(list(c(-1,1)),sum(b|1))) # all combinations of -1,1 at each position in b, as data frame
 m <- t(t(m))               # convert to matrix
 idx <- m%*%b==n            # rows where the matrix product is `n`
 m[idx,]                    # return those rows
}

その出力が有効であるとは思わないでしょう。チャレンジの作成者に確認を求めることを提案します。
シャギー2017

@Shaggyの逆順は明示的に許可されています。from the most significant digit to the least significant digit (or in reversed order).したがって、これは完全に許容できるはずです。
ジュゼッペ

1
逆の順序ではなく、逆の記号。25たとえばの有効な出力は、[1,1,1,-1,-1]またはになり[-1,-1,1,1,1]ます。
Shaggy

1
@シャギーああ、あなたは正しい、私はただ数学を間違っていた!の2*bits - 1代わりにすべきです1-2*bits。ありがとうございました。
ジュゼッペ




0

Golfscript、14 13 14バイト

%存在を忘れたので-1バイト。 入力も忘れているので、+ 1バイトは文字列です。

~2base{.+(}%)\

1
入力が整数であると想定する場合は、コードをラップ{}してブロックにする必要があります。完全なプログラムは文字列としてのみ入力を取得できます。
Peter Taylor

えっと…何?つまり、数値は、数値を含む文字列ではなく、整数としてプッシュされています。
ジョサイアウィンスロー2017

その場合、あなたの答えは完全なプログラムではないので、「関数」、またはGolfScriptの場合はブロックでなければなりません。したがって{2base{.+(}%\}、15バイト分です。同様にCJamの回答。
Peter Taylor

これは完全なプログラムです。Golfscriptの入力はプログラムの最初に暗黙的にスタックにプッシュされ、CJamの入力は実行前に指定され、qコマンドでアクセスされます。
ジョサイアウィンスロー2017

GolfScriptについてはある程度知っています。(そしてCJam)。完全なプログラムであると主張したい場合は、プレフィックスを付ける必要があります~
Peter Taylor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.