数値をバイナリに変換します...しかし、2を使用することも許可されています


20

このnumberphileビデオで言及されている「2進数で2進数」表記に基づいて、入力として単一の数値を取り、2が許可される「バイナリ」システムでその数値のすべてのバリエーションを出力する関数を記述します。

ルール

  • コードは完全なプログラムではなく、関数/メソッドでなければなりません
  • 入力は、関数への唯一のパラメーターとして渡される整数です
  • 出力は、「2進数で2進数」表記に変換された入力番号のすべての有効なバリエーションです
  • 出力は関数の戻り値ですが、明らかな限り(たとえば、3つのint、3つの文字列、コンマ/スペースで区切られた文字列、intの配列など)、順序は重要ではありません。
  • まれに、結果を得るために言語に組み込み関数が含まれている場合は、許可されません
  • バイト単位の最短コードが勝者です

出力の説明

あなたが番号を渡されている場合の例では、9、あなたにバイナリに変換することができ1001ますが、あなたが許可されている場合2、それぞれの位置でSを、あなたはまた、それを書くことができます201(つまり2*4 + 0*2 + 1*1)、または121(つまり1*4 + 2*2 + 1*1)、この表に示すように:

+----+----+----+----+
| 8s | 4s | 2s | 1s |
+----+----+----+----+
|  1 |  0 |  0 |  1 |
|  0 |  2 |  0 |  1 |
|  0 |  1 |  2 |  1 |
+----+----+----+----+

したがって、渡された9場合、関数は3つの数値1001201およびを返す必要があります121

フォーマットと順序は、それが明らかだとして(すなわち、無関係な[121,201,1001]"0201 0121 1001"("1001","121","201")の入力が与えられたとき、有効な結果です9)。

  • 2 => 10, 2
  • 9 => 1001, 201, 121
  • 10 => 1010, 210, 202, 1002, 122
  • 23 => 2111, 10111
  • 37 => 100101, 20101, 100021, 20021, 12101, 12021, 11221


1
二?バイナリで?これは量子コンピューティングですか?
マシュー

回答:


10

GolfScript(25バイト)/ CJam(19 17バイト)

GolfScript:

{:^.*,{3base}%{2base^=},}

これにより、匿名関数が作成されます(匿名関数の許容性に関するメタディスカッションを参照)。

オンラインデモ

CJamへのまっすぐな翻訳が(おかげであるマーティンBüttner文字のカップルを削るため)

{:X_*,3fb{2bX=},}

解剖

{             # Function boilerplate
  :^          # Store parameter as variable ^
  .*          # Square parameter - see detailed explanation below
  ,{3base}%   # Produce an array of 0 to ^*^-1 in ternary
  {2base^=},  # Filter to those which evaluate to ^ in binary
}

二乗演算の理由は、バイナリで解釈される3進表現がに等しい最大値まで反復する必要があるため^です。以来2 = 10、の「通常の」バイナリ表現が^重要です。これを3項に変換すると、「最悪」のケースは2の累乗であることがわかります。最適なアプローチは、の累乗の引数を取ることln 3/ln 2 ~= 1.585ですが、平方ははるかに短くなります。


CJamの翻訳はもっと小さくなります。
オプティマイザー14

1
@オプティマイザーが先に進みます;-)
ジョン・ドヴォルザーク14

GolfScript?男私は、このようなnoobのだ
pythonian29033

8

Python 2(59バイト)

S=lambda n,B="":[B][n:]or~n%2*S(n/2-1,"2"+B)+S(n/2,`n&1`+B)

(チャットを手伝ってくれた@ grc、@ xnor、@ PeterTaylorに感謝します)

単純な再帰、呼び出し、S(23)または類似。

説明

一般的な考え方は、nのバイナリ展開がa 1で終わる場合、すべての擬似バイナリ(「バイナリ、ただし2の場合」)展開もaで終わる必要があるということ1です。それ以外の場合は、0またはで終わる可能性があり2ます。

したがって、最後のビットを見て、nそれに応じて分割して分岐します。

解剖

S=lambda n,B="":           # Lambda expression
[B][n:]or                  # Short circuit, return [B] if n==0 else what follows
~n%2*                      # Keep next list result if n is even else turn into []
S(n/2-1,"2"+B)             # Add a "2" to B, recurse
+
S(n/2,`n&1`+B)             # Add "0" or "1" to B depending on n's last bit, recurse

変数:

  • n:擬似バイナリ展開を見つけたい数
  • B:右から左に構築される擬似バイナリ文字列

5

Bash + coreutils、77

f()(seq `dc -e2o$1p`|sed '/[3-9]/d;s/.*/&n9P2i&pAi/'|dc|grep -Po ".*(?= $1)")

(これはTABgrep式の文字です。)

これはこのルールを少し曲げています:

「万が一、結果を達成するために言語に組み込み関数が含まれている場合は、許可されません」

それdc組み込みが必要なものとはになります。たとえば、入力ベースを2に設定し、2の2進数を入力すると、正しく解析されます。(同様に、入力モードがベース10の場合、AFは10進数の「数字」10〜15として解析されます)。

seqnの標準バイナリ表現までのすべての10進数のリストを作成し、10進数として解析します。次に、{0,1,2}以外のものを含むすべての数値が除外されます。次にdc、残りの数値をバイナリとして解析し、どの評価がnに戻るかを確認します。

Bash関数は、0〜255のスカラー整数のみを「返す」ことができます。だから、リストをSTDOUTに出力する自由を「返品」の方法として取っています。これは、シェルスクリプトの慣例です。

出力:

$ f 2
2   
10  
$ f 9
121 
201 
1001    
$

4

ハスケル、82

t n=[dropWhile(==0)s|s<-mapM(\_->[0..2])[0..n],n==sum[2^(n-i)*v|(i,v)<-zip[0..]s]]

これは単なる総当たりのソリューションです。3 ^ nの可能性を突破すると予想されるため、非常に非効率的です。


3

ゼリー、10バイト、言語postdates挑戦

ṗ@3Ḷ¤Ḅ=¥Ðf

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

入力に等しい数のハイパービットまでのブルートフォースソリューション(この形式は「ハイパーバイナリ」として知られています)。そのため、O(3 n)で実行すると、非常に非効率的です。

説明

ṗ@3Ḷ¤Ḅ=¥Ðf
ṗ@            Construct all lists with the given length, and elements taken from
  3Ḷ¤         the list [0,1,2]
        Ðf    then take only those elements which
     Ḅ=¥      when interpreted as binary, equal {the original number}

2

PHP、138バイト

function p($v,$i=0,$r=""){global$a;if($v==0)$a[]=$r?:0;elseif($v>0)for(;$l<3;)p($v-2**$i*$l,$i+1,+$l++.$r);}p($argv[1]);echo join(",",$a);

壊す

function p($v,$i=0,$r=""){
    global$a;
    if($v==0)$a[]=$r?:0;  # fill result array
    elseif($v>0) # make permutations
        for(;$l<3;)
            p($v-2**$i*$l,$i+1,+$l++.$r); #recursive
}
p($argv[1]);
echo join(",",$a); # Output


1

k、21バイト

ピーターテイラーのGolfscript回答と同じ方法を使用します

{X@&x=2/:'X:3\:'!x*x}

例:

k) {X@&x=2/:'X:3\:'!x*x}9
(1 2 1;2 0 1;1 0 0 1)
k) {X@&x=2/:'X:3\:'!x*x}10
(1 2 2;2 0 2;2 1 0;1 0 0 2;1 0 1 0)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.