範囲内のものを数える


20

チャレンジ:

ものの数をカウント1範囲の間のすべての数のバイナリ表現で。


入力:

2つの非10進正整数


出力:

12つの数値の間の範囲にあるすべてのs の合計。


例:

4 , 7        ---> 8
4  = 100 (adds one)   = 1
5  = 101 (adds two)   = 3
6  = 110 (adds two)   = 5
7  = 111 (adds three) = 8

10 , 20     ---> 27
100 , 200   ---> 419
1 , 3       ---> 4
1 , 2       ---> 2
1000, 2000  ---> 5938

最初の例のみを説明しました。そうしないと、すべての例について説明しようとすると、膨大なスペースを占有してしまいます。


注意 :

  • 数字は1000以上離れている可能性があります
  • すべての入力が有効になります。
  • 最小出力は1です。
  • numberは、2つの要素の配列として受け入れることができます。
  • 番号の順序を選択できます。

受賞基準:

これはので、各言語のバイト単位の最短コードが優先されます。



1
入力を何らかの種類の範囲型(IntRangeKotlin、RangeRuby)として取得できますか?
snail_

楽しい事実:ケースは1000 - 20005938を生成するが、1000で小文字、結果も1000でドロップします0-1000 = 4938証明
-steenbergh

回答:


9

JavaScript(ES6)、38バイト

カリー化構文の入力を受け取ります(a)(b)

a=>b=>(g=c=>a>b?0:1+g(c^c&-c||++a))(a)

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

コメント済み

a => b => (         // given the input values a and b
  g = c =>          // g = recursive function taking c = current value
    a > b ?         // if a is greater than b:
      0             //   stop recursion and return 0
    :               // else:
      1 +           //   add 1 to the final result
      g(            //   and do a recursive call to g() with:
        c ^ c & -c  //     the current value with the least significant bit thrown away
        || ++a      //     or the next value in the range if the above result is 0
      )             //   end of recursive call
)(a)                // initial call to g() with c = a


5

Java(JDK 10)、55バイト

a->b->{int c=0;for(;a<=b;)c+=a.bitCount(b--);return c;}

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


IntStream.range(a,b+1).map(Integer::bitCount).sum()
saka1029

@ saka1029インポートは必須です。つまり、実際a->b->java.util.stream.IntStream.range(a,b+1).map(Integer::bitCount).sum()には74バイト全体になります。インポートが必須ではなかったとしても、パラメーターは必須であるためa->b->IntStream.range(a,b+1).map(Integer::bitCount).sum()、57バイトとカウントされるを書く必要があります
オリビエグレゴワール

a->b->IntStream.range(a,b+1).map(Long::bitCount).sum()1バイト改善することもできます。わずかですが、まだ1つです。
NotBaal

@NotBaal上記のコメントでOlivierが述べたように、インポートは必須なので、a->b->java.util.stream.IntStream.range(a,b+1).map(Long::bitCount).sum()(71バイト)でなければなりません。
ケビンクルーイッセン




4

R41 34バイト

function(a,b)sum(intToBits(a:b)>0)

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

ngmによる他のRソリューションに大きな影響を受けてます。これは、ビットへの変換後に異なるアプローチを使用します。可能性のある34バイトのソリューションを示唆してくれたGiuseppeに大いに感謝します。


34バイトが可能です!私はトリックを見た場所を忘れました(私はそれを思いついていなかったと知っています)が、sumマーブルベクトルへのトリッキーな変換があります-あなた/ ngmがそれを見つけることができない場合、私は投稿します。
ジュゼッペ

@Giuseppe Indeed!
JayCe

2
私はそれを降りて37のバイトそれ以外の場合は役に立つかもしれない技術を使用して。また、それを発見しsdvar可能な限り倍増するよう強制しました。
ngm

pryr::f4バイトの保存に使用できます:tio.run
##

@pajonk良い点!しかし、R + pryrではなくベースRパッケージに固執しようとしています。「純粋なR」とみなせるメタを検索します。
JayCe

3

ゼリー、4バイト

rBFS

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

説明

rBFS –完全なプログラム。コマンドライン引数から2つの入力を取得します。
r –範囲。
 B –それぞれについて、バイナリに変換します。
  FS –フラット化および合計。

O_o、それは速かった?
ムハンマドサルマン

@MuhammadSalmanまあ、挑戦はまた些細なIMOのようなものです。
Mr Xcoder

かもしれませんが、投稿してから1分後に回答します。
ムハンマドサルマン

1
@MuhammadSalmanはい、これはこのような些細な課題にとってはそれほど速くありません。ゼリーの知識も続きます。実際の取り組みは、たとえば今月の言語であるQBasicで行われます。;-)
アウトゴルファーのエリック

@EriktheOutgolfer:QBasic / BrainF ** kでこれに答えることはできますか?
ムハンマドサルマン





2

Bash +一般的なユーティリティ、50

jot -w%o - $@|tr 247356 1132|fold -1|paste -sd+|bc

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

整数をバイナリ文字列に変換することは、bashでは常に少し苦痛です。ここでのアプローチは少し異なります-整数を8進数に変換し、各8進数をそれに含まれるバイナリ1の数で置き換えます。次に、変換されたすべての数字を合計することができます


2

APL + WIN、33 26バイト

整数のベクトルのプロンプト:

+/,((↑v)⍴2)⊤(1↓v)+0,⍳-/v←⎕

オンラインでお試しください!Dalog Classic提供

説明:

v←⎕ prompt for input of a vector of two integers max first

(v←1↓v)+0,⍳-/ create a vector of integers from min to max

(↑v)⍴2 set max power of 2 to max 

⊤ convert integers to a matrix of binaries

+/, convert matrix to a vector and sum





1

PHP、97バイト

(これを短縮できることを確認しますが、機能を使用したいです)

オンラインで試す

コード

<?=substr_count(implode(array_map(function($v){return decbin($v);},
 range($argv[0],$argv[1]))),1);

説明

<?=
 substr_count(   //Implode the array and count every "1"
  implode(
    array_map(function($v){return decbin($v);}, //Transform every decimal to bin
          range($argv[0],$argv[1])   //generate a range between the arguments
     )
),1);   //count "1"'s

あなたはちょうどこれを
-dzaima

しばらくの間、PHP関数の名前をパラメーターとして直接設定できることを絶対に忘れました:
フランシスコハーン

$argv[0]プログラム名または「-」です。$argv[1]およびで作業する必要があり$argv[2]ます。そして、あなたは使用することができますjoin代わりにimplode68バイトにこれを短縮し、:<?=substr_count(join(array_map(decbin,range($argv[1],$argv[2]))),1);
タイタス

1

PowerShell、72バイト

param($x,$y)$x..$y|%{$o+=([convert]::ToString($_,2)-replace0).length};$o

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

バイナリへの変換と[convert]::ToString($_,2)ゼロの除去のために長い-replace0。それ以外の場合は、入力番号を取得し、範囲$x..$yを作成し、範囲内の各数値をバイナリに変換し、ゼロを削除し、.lengthそれ(つまり、残りの1の数)を$o取得し、utputに追加します。


count代わりに使用してみてくださいlength:)
mazzy

1
@mazzy countは常に、配列ではなく文字列を1カウントしているために発生しますlength
AdmBorkBork

ひも!あなたが正しいです。ありがとう。-replace0スマートです。
奇抜な




1

、10バイト

IΣ⭆…·NN⍘ι²

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

     NN     Input numbers
   …·       Inclusive range
  ⭆         Map over range and join
        ι   Current value
         ²  Literal 2
       ⍘    Convert to base as string
 Σ          Sum of digits
I           Cast to string
            Implicitly print



1

K(ngn / k)19 13バイト

{+//2\x_!1+y}

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

{ }引数xを持つ関数であり、y

!1+y リストは0 1 ... yです

x_ 最初のx要素を削除します

2\ 各intを同じ長さの2進数のリストとしてエンコードします(これはngn / kに固有です)

+/

+//収束するまで合計します。この場合、すべての2進数字リストの合計


1

Perl 6の32の 30バイト

Brad Gillbertのおかげで-1バイト

{[…](@_)>>.base(2).comb.sum}

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

説明:

[…](@_)    #Range of parameter 1 to parameter 2
       >>    #Map each number to
                      .sum  #The sum of
                 .comb      #The string of
         .base(2)    #The binary form of the number

1
あなたが使用する場合は、1バイトで、それを減らすことができます[...](@_)代わりに($^a..$^b)
ブラッド・ギルバートはb2gills

1

J16、15の、14バイト

FrownyFrogのおかげで1バイト節約!

+/@,@#:@}.i.,]

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

説明:

二項動詞、左の引数はm範囲の下限、右の引数は上限nです。

            ,    append                      
             ]   n to the
          i.     list 0..n-1
         }.      drop m elements from the beginning of that list 
      #:@        and convert each element to binary 
    ,@           and flatten the table
 +/@             and find the sum

14にできますか?
FrownyFrog

@FrownyFrog今日は後で試してみます(あなたが尋ねているので、明らかに可能です:))
ガレンイワノフ

@FrownyFrog 15今のは、私はまだ...しようとしている
ガレン・イワノフ


@FrownyFrogああ、とても簡単!私は考えて}.いましたが、常にフォークではなく、フックでした。ありがとう!
ガレンイワノフ

1

QBasic、95 93 83 82バイト

@DLoscは私に保存されたいくつかのバイトがたくさん!

このテクニックを使用し別のバイトを保存しました!

INPUT a,b
FOR i=a TO b
k=i
FOR j=i TO 0STEP-1
x=k>=2^j
s=s-x
k=k+x*2^j
NEXT j,i
?s

今月の言語FTW!

説明

INPUT a,b           Ask user for lower and upper bound
FOR i=a TO b        Loop through that range
k=i                 we need a copy of i to not break the FOR loop
FOR j=i TO 0STEP-1  We're gonna loop through exponents of 2 from high to low.
                    Setting the first test up for 4 to 2^4 (etc) we know we're overshooting, but that 's OK
x=k>=2^j            Test if the current power of 2 is equal to or smaller than k 
                    (yields 0 for false and -1 for true)
s=s-x               If k is bigger than 2^j, we found a 1, so add 1 to our running total s
                    (or sub -1 from the total s...)
k=k+x*2^j           Lower k by that factor of 2 if the test is true, else by 0
NEXT                Test the next exponent of 2
NEXT                process the next number in range
?s                  print the total

Dosboxで実行されるQBasic 4.5では、1000〜2000の最後のテストケースが実際に機能します。 こんにちは!

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