基本的なバイナリについてのすべて


29

面白いタイトルを言い訳してください。

これは、82000のCurious Propertyに触発された質問です。その中で、著者は、82000という数値が2、3、4、および5の基数が2進数であることを指摘しています。 「?(好奇心が強い人のために、10 ^ 1,000,000までの値をチェックしましたが、これまでのところ答えはノーです。)

これは私に考えさせられました:数を与えられて、それどんなベースでバイナリですか?

私たちの好奇心8盛な数字82000は、実際には6つのベースのバイナリです。

Base 2 = 10100000001010000
Base 3 = 11011111001
Base 4 = 110001100
Base 5 = 10111000
Base 81999 = 11
Base 82000 = 10

すべての数値が連続したバイナリベースを持つわけではありません。番号83521を検討してください。2、17、289、83520、83521の基数のバイナリです。

あなたの課題は、どの基数がバイナリであるかを判断して表示することです。

ルール

  • 数値は、そのベース内の表現がゼロと1のみで構成されている場合、そのベース内の「バイナリ」と見なされます。 110110はバイナリ値ですが、12345そうでA380Fはありませんが、間違いなく違います。
  • 番号は標準入力で提供されます。2から2 ^ 32-1までの整数値で、10進形式で提供されます。
  • 昇順で、数値が2進数である1よりも大きい各ベースを表示します。各ベースは独自の行にある必要があります。そのベースにバイナリ値を含める場合(以下のボーナススコアリングを参照)、ベースとバイナリ値をスペースで区切ります。標準出力への出力のみが判定され、標準エラーおよびその他のソースは無視されます。

得点

スコアは、プログラムのバイト単位のサイズです。スコアが低いほど優れています。

ボーナス
プログラムが検出されたベースのバイナリ値も出力する場合、スコアに0.75を掛けます。
表示されるバイナリ値には、余分な句読点、余分なゼロ、小数点、ゼロ、1はありません。

入力:

82000

出力(ボーナスを受け取る):

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10

入力:

1234321

出力(ボーナスなし):

2
1111
1234320
1234321

入力は改行で終了できますか?
LegionMammal978

@ LegionMammal978-うーん...確かに?私の意図は、単純なfgets、readline、または同様のもので入力番号を取得できるようにすることでした。
ラマ氏

1
一般的に、n常に少なくとも塩基にバイナリである1(カウントしない)、 、2n-1およびn
mbomb007

1
「あなたの番号は標準入力で提供されます」と言うとき、STDINのみを意味しますか、それともサイトの標準であるように、関数引数として番号を受け入れることができますか?
アレックスA.

(ボーナス部分の)バイナリ表現には特定の形式が必要ですか?特に[1, 0, 1, 1, 0]大丈夫でしょうか、または数字を次のように結合する必要があり10110ますか?
ジャクベ

回答:


14

Pyth、14 13

jbf!-jQTU2tSQ

新しいS機能を指摘してくれたJakubeに感謝します。

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

オンラインバージョンは遅すぎて実行できません1234321。これは、各ベースへの入力を2からそれ自体に変換し、0と1以外の値を含む結果を破棄します。

説明:

                           : Q=eval(input) (implicit)
jb                         : join on newlines the list...
  f!                       : filter away nonempty values (impliticly named T)
    -jQTU2                 : sewtise difference of number converted to base and range(2)
     jQT                   : convert Q to base T
        U2                 : range(2)
          tSQ              : over the range [2 Q+1)

さらに、これは(今度はよくゴルフされていませんが、再びジャクベのおかげで)ボーナスバージョン(20 * .75 = 15)です。

VQI!-JjQK+2NU2pdKjkJ

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


Pythが更新されました。したがって、実際のソリューションにリンクできます。
寂部

そして、ここに20 * 0.75 = 15の解決策がVQI!-JjQK+2NU2pdKjkJあります。関数型プログラミングが最良のアプローチではない場合があります。
寂部

10

ジュリア、72 70バイト

実際にはボーナスがあるので、ボーナスはありません。

n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end

これはSTDINから行を読み取り、整数に変換して結果を出力します。強引な方法であるにもかかわらず、入力1234321は1秒もかかりませんでした。

Ungolfed +説明:

# Read n from STDIN and convert to integer
n = int(readline())

# For every potential base from 2 to n
for j = 2:n
    # If all digits of n in base j are 0 or 1
    if all(i -> i0:1, digits(n, j))
        # Print the base on its own line
        println(j)
    end
end

例:

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
1234321
2
1111
1234320
1234321

julia> n=int(readline());for j=2:n all(i->i0:1,digits(n,j))&&println(j)end
82000
2
3
4
5
81999
82000

:入力がSTDINからではなく関数の引数として取得できる場合(OPからの確認を待つ)、解決策は55バイトです。


7

CJam、20バイト(または27バイト* 0.75 = 20.25)

ボーナスなしのバージョン、20バイトを次に示します。

ri:X,2f+{X\b2,-!},N*

こちらをお試しください。

楽しみのために、27バイトのボーナスバージョンを次に示します。

ri:X{X\)b2,-!},1>{)SX2$bN}/

こちらからオンラインでお試しください


はい。少しゴルフが終わったら。
オプティマイザー

1
ri_,f{2+S@2$bN}4/{2=2,-!},(19.5バイト)
デニス

7

Mathematica、59バイト

Print/@Select[1+Range[n=Input[]],Max@IntegerDigits[n,#]<2&]

うーん... IntegerDigitsD:

コードについて本当に説明することはあまりありません... STDINとSTDOUTを使用するための要件により、12バイトが無駄になります。

ボーナスを請求できるとは思わない。私が持っている最高のものは84バイトです(これは60以上のスコアをもたらします):

Print@@@Select[{b=#+1," ",##&@@n~IntegerDigits~b}&/@Range[n=Input[]],Max@##3<2&@@#&]

7

Python 2、88 86 80

かなり簡単で、ボーナスはありません。Pythonは、グローバル変数に対して素晴らしく寛大です。

N=input();g=lambda n:n<1or(n%b<2)*g(n/b)
for b in range(2,N+1):
 if g(N):print b

ボーナスで手に入れたベストは118 * .75 = 87.75です。

N=input();g=lambda n:0**n*" "or" "*(n%b<2)and(g(n/b)+`n%b`)*(g(n/b)>'')
for b in range(2,N+1):
 if g(N):print`b`+g(N)

素敵な解決策、はるかに短いコードで私を打ち負かしました。
カデ

g(N)代わりに行うだけで短くなりますn=N
feersum

@feersumそうそう(以前g(N,b)はコンマで2つを等しくしていました)が、Nの変数は必要ないという意味ですか?
KSab

@KSabその2番目の部分を削除しました。気にしないでください。
feersum

私は間違っているかもしれませんが、「バックティックを表す」に変更g(n/b)するだけではボーナスを得ることができませんでした(g(n/b)+'n%b')か?
feersum

4

Python 2、90 * 0.75 = 67.5

n=input();b=1
while b<n:
 b+=1;s="";c=k=n
 while k:s=`k%b`+s;c*=k%b<2;k/=b
 if c:print b,s

非常に簡単な反復アプローチ。

ボーナスがない場合、これは73バイトです。

n=input();b=1
while b<n:
 b+=1;c=k=n
 while k:c*=k%b<2;k/=b
 if c:print b

4

SQL(PostgreSQL)、247.5 255 230.25(307 * .75)

SQLはこれらの種類の課題で素晴らしいことが知られているので、1つを組み合わせた方がよいと思いました:)このボーナスは本当に価値がありました。
仕様に準拠する必要がありますが、COPY I FROM STDINをテストする簡単な方法はありません。固定順序を
編集します。列Rが配列を使用するように処理される方法を変更しました。

CREATE TABLE IF NOT EXISTS I(I INT);TRUNCATE TABLE I;COPY I FROM STDIN;WITH RECURSIVE R AS(SELECT n,I/n I,ARRAY[I%n] R FROM generate_series(2,(SELECT I FROM I))g(n),(SELECT I FROM I)I(I)UNION ALL SELECT n,I/n,I%n||R FROM R WHERE I>0)SELECT n||' '||array_to_string(R,'')FROM R WHERE 2>ALL(R)and i=0ORDER BY n

テストとして、Iテーブルへのストレートインサートを使用しました。テスト実行が拡張され、コメントが付けられました。

-- Create the table to accept the input from the copy command
CREATE TABLE IF NOT EXISTS I(I INT);
-- Make sure that it is empty
TRUNCATE TABLE I;
-- Popoulate it with a value from STDIN
--COPY I FROM STDIN;
INSERT INTO I VALUES(82000); -- Testing
--Using a recursive CTE query
WITH RECURSIVE R AS (
    -- Recursive anchor
    SELECT n,                -- base for the row
       I/n I,                -- integer division
       ARRAY[I%n] R   -- put mod value in an array
    FROM generate_series(2,(SELECT I FROM I))g(n), -- series for the bases
         (SELECT I FROM I)I(I) -- Cross joined with I,  saves a few characters
    UNION ALL 
    -- for each row from r recursively repeat the division and mod until i is 0
    SELECT n,
        I/n,
        I%n||R -- Append mod to beginning of the array
    FROM R WHERE I>0
    )
-- return from r where i=0 and r has 1's and 0's only
SELECT n||' '||array_to_string(R,'')
FROM R 
WHERE 2 > ALL(R)and i=0
ORDER BY n -- Ensure correct order

2 10100000001010000
3 11011111001
4 110001100
5 10111000
81999 11
82000 10


近い!出力ベースは昇順である必要があります。しかし、型破りな言語を使用するための+1。
ラマ氏

@ Mr.Llamaはorder by。これらのキャラクターを取り戻すことができるかどうかを確認するために
-MickyT

3

Haskell 109 * 0.75 = 81.75バイト

0#x=[]
n#x=n`mod`x:div n x#x 
f n=[show x++' ':(n#x>>=show)|x<-[2..n+1],all(<2)$n#x]
p=interact$unlines.f.read

使用例(注:バイナリ値は最初にlsbです):

p 82000

2 00001010000000101
3 10011111011
4 001100011
5 00011101
81999 11
82000 01

入出力の制限なし、つまり、関数引数による入力、REPLによるネイティブ形式の出力):

Haskell、67 * 0.75 = 50.25バイト

0#x=[]
n#x=n`mod`x:div n x#x
f n=[(x,n#x)|x<-[2..n+1],all(<2)$n#x]

(ベース、値)ペアのリストを返します。値は最初にlsbです(例:表示を改善するために改行/スペースが追加されます)。

 f 82000
 [ (2,[0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,1]),
   (3,[1,0,0,1,1,1,1,1,0,1,1]),
   (4,[0,0,1,1,0,0,0,1,1]),
   (5,[0,0,0,1,1,1,0,1]),
   (81999,[1,1]),
   (82000,[0,1]) ] 

2

R、111

現時点ではこれを改善する余地はおそらく大きい

i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')

警告付きで実行

> i=scan();b=2:i;R=i%%b;I=rep(i,i-1);while(any(I<-I%/%b))R=cbind(I%%b,R);for(x in b)if(all(R[x-1,]<2))cat(x,'\n')
1: 82000
2: 
Read 1 item
There were 17 warnings (use warnings() to see them)
2 
3 
4 
5 
81999 
82000
>

@AlexA。句のI%/%b論理を強制することによって引き起こされる警告any()。`
-MickyT

2

Java、181 155.25(207 * .75) 151.5(202 * .75)バイト

class I{public static void main(String[]a){a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1;d++<b;){String e="";for(c=b;c>0;e=c%d+e,c/=d)if(c%d>1)continue a;System.out.println(d+" "+e);}}}

説明付きで展開:

class I {
    public static void main(String[]a){
        a:for(long b=new java.util.Scanner(System.in).nextLong(),c,d=1; //b = input(), d = base
              d++<b;) {                                           //For all bases in range(2,b+1)
            String e="";
            for(c = b;c > 0; e = c % d + e,c /= d)                //Test all digits of base-d of b
                           //e = c % d + e                        //Append digits to string
                if (c % d > 1)                                    //Reject base if the digit is greater than 1
                    continue a;
            System.out.println(d+" "+e);                          //Print base and digits.
        }
    }
}

オリジナル(ボーナスなし):

class I{public static void main(String[]a){long b=new java.util.Scanner(System.in).nextLong(),c,d=1;a:for(;d++<b;){c=b;while(c>0){if(c%d>1)continue a;c/=d;}System.out.println(d);}}}

Ypnypnのおかげで3.75バイト:)


2

R、94 83 79

n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")

使用法:

> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 82000
2: 
Read 1 item
2
3
4
5
81999
82000
> n=scan();cat((2:n)[!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})],sep="\n")
1: 1234321
2: 
Read 1 item
2
1111
1234320
1234321

関数のコアは、!sapply(2:n,function(x){while(n&n%%x<2)n=n%/%x;n})2からnまでの各ベースxについて、剰余が0および1である限り商n / xを保持することです。そして、結果を出力します(すべての剰余が1または0)そしてそれを否定します(0はTRUEに否定し、他はすべてFALSEに否定します)。関数スコープのおかげで、nにダミー変数を作成する必要はありません。結果として得られるブール値のベクトルは、インデックス付けに使用される2:nため、機能するベースのみを出力します。


1

TI-Basic、45バイト

Input N
For(B,2,N
If prod(seq(BfPart(iPart(N/B^X)/B),X,0,log(N)/log(B))<2
Disp B
End

説明

  • 入力N
  • 2からNまでのすべてのB
    • NがベースBでちょうど0と1の場合
      • ディスプレイB
  • 終了ループ

複雑な部分

2行目は次のように機能します。

  • 0からログBまでのすべてのXについて N
  • B×fPart(iPart(N / B X)/ B)はベースBのN番目の数字で、逆方向にカウントします
  • これをリストとして考えてください
  • 各要素について、数字が2未満の場合は1(true)、そうでない場合は0(false)になります。
  • 製品を取る:すべての要素が1の場合、1

注意

)2番目の行の終わりに閉じ括弧が置かれている場合、プログラムは非常に速く実行されます。詳細については、こちらご覧ください


1

TI-BASIC、31 29

For(B,2,Ans
If 2>round(Bmax(fPart(Ans/B^randIntNoRep(1,32
Disp B
End

これはおそらくTI-BASICに最適です。

説明:

randIntNoRep(1,32)1から32までの数字のランダムな順列を返します(必要なのはそれらの数字を何らかの順序で並べるだけです。TI-BASICにはAPLのiotaコマンドのようなものはありません)。可能な最小のベースは2で、最大の数は2 ^ 32-1なので、32要素で十分です。B^randIntNoRep(1,31)そのリストをB乗します。これにより、リストにはすべてのB^1,B^2,...,B^32(何らかの順序で)。

次に、入力(Ansフォームに入力されるwer変数[number]:[program name])がその数で除算されます。入力が42で、ベースが2の場合、結果はリストになります21,10.5,5.25,...,42/32,42/64,[lots of numbers less than 1/2]再びになります。

小数部分を取得し、数値にベースを掛けると、base-b表現のその位置の数字が得られます。すべての桁が2未満の場合、最大桁は2未満になります。

Ypnypnが述べたように、 Forステートメントのパーサーのバグによりこれを高速化します。

31-> 31:バイトを保存しましたが、バイトを再度追加する丸めエラーを修正しました。

31-> 29:のRandIntNoRep()代わりにを使用して2バイトを保存しましたcumSum(binomcdf())


TI-BASICにはシーケンス機能がありますか?
ラマ氏

はい、コマンドはseq(expression, variable, start, end[, step])です。ステップが指定されていない場合、デフォルトは1です。ただし、cumSum(binomcdf(31,08バイトであるのに対してseq(X,X,1,329バイトです。
リルトシアスト

ああ、それはそれを説明しています。私はTI-Basicでの採点作業に慣れていません。
氏ラマ

1

ゼリー、9バイト

³bṀỊµÐfḊY

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

チャットコイアリンガーと一緒に行わます

使い方

³bṀỊµÐfḊY完全なプログラム。

     Ðf暗黙的に生成された範囲[1、input]をフィルタリングします。
    µ新しいモナド連鎖を開始します。
³b入力を現在の数値の基数にリストとして変換します。
  Ṁ最大。
   Ị重要ではありません。abs(Z)≤1かどうかをチェックします。
       queueデキュー。リストの最初の要素を削除します(ベース1を削除するため)。
        Y改行で結合します。

0

Javascript、ES6、118 * .75 = 88.5 110 * .75 = 82.5

f=x=>{res={};for(b=2;b<=x;++b)if(!+(res[b]=(c=x=>x%b<2?x?c(x/b|0)+""+x%b:"":"*")(x)))delete res[b];return res}

前のバージョン:

f=x=>{res={};for(q=2;q<=x;++q)if(!+(res[q]=(c=(x,b)=>x%b<2?x?c(x/b|0,b)+""+x%b:"":"*")(x,q)))delete res[q];return res}

チェック:

f(82000)
Object { 2: "10100000001010000", 3: "11011111001", 4: "110001100", 5: "10111000", 81999: "11", 82000: "10" }

ここでは、入力も出力もありません。
edc65

0

JavaScript(ES6)65

パラメーターとコンソール出力を持つ関数の場合は68バイト。

f=n=>{s=n=>n%b>1||b<n&&s(n/b|0);for(b=1;b++<n;)s(n)||console.log(b)}

ポップアップ経由のI / Oで65バイト

n=prompt(s=n=>n%b>1||b<n&&s(n/b|0));for(b=1;b++<n;)s(n)||alert(b)

ボーナスの請求:88 * 0.75 => 66

n=prompt(s=n=>n%b>1?9:(b<=n?s(n/b|0):'')+n%b);for(b=1;b++<n;)s(n)<'9'&&alert(b+' '+s(n))

0

Mathematica、76 * 0.75 = 57

n=Input[];G=#~IntegerDigits~b&;If[Max@G@n<2,Print[b," ",Row@G@n]]~Do~{b,2,n}

最初は入力要件を忘れていました...幸いなことに、それらは余分なものを追加しませんでした。



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