범위에있는 것을 세다


20

도전 :

1범위 사이의 모든 숫자의 이진 표현에서 1의 수를 계산하십시오 .


입력 :

두 개의 10 진수가 아닌 양의 정수


출력 :

1두 숫자 사이의 범위에있는 모든의 합입니다 .


예 :

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입니다.
  • 숫자를 두 요소의 배열로 사용할 수 있습니다.
  • 숫자 순서를 선택할 수 있습니다.

우승 기준 :

이것은 이므로 각 언어마다 가장 짧은 바이트 단위의 코드가 승리합니다.



1
입력을 일종의 범위 유형 ( IntRangeKotlin, RangeRuby) 으로 취할 수 있습니까?
달팽이 _

재미있는 사실 : case는 1000 - 20005938을 산출하지만 case를 1000만큼 낮추면 결과도 1000만큼 떨어집니다 0-1000 = 4938. 증명
steenbergh

답변:


9

자바 스크립트 (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

자바 (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 바이트 개선. 한계는 있지만 여전히 하나입니다.
NotBaal

@NotBaal 위의 주석에서 Olivier가 언급했듯이 가져 오기는 필수이므로 a->b->java.util.stream.IntStream.range(a,b+1).map(Long::bitCount).sum()(71 바이트) 여야합니다 .
케빈 크루이 ssen



4

MATL , 5 4 바이트

&:Bz

온라인으로 사용해보십시오!

바이트를 저장 한 Luis Mendo에게 감사합니다!

(implicit input a and b, a<b)
&:                              % two-element input range, construct [a..b]
  B                             % convert to Binary as a logical vector (matrix)
   z                            % number of nonzero entries
(implicit output of the result)


4

R , 41 34 바이트

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

온라인으로 사용해보십시오!

ngm의 다른 R 솔루션에서 많은 영향을 받았습니다 . 이것은 비트로 변환 한 후에 다른 접근법을 사용합니다. 가능한 34 바이트 솔루션을 암시하는 Giuseppe에게 큰 감사를드립니다.


34 바이트가 가능합니다! 나는 트릭을 본 곳을 잊어 버렸습니다 (내가 그것을 얻지 못했다는 것을 알고 있습니다).하지만 summable 벡터 로 더 까다로운 변환이 있습니다.
주세페

@Giuseppe Indeed!
JayCe

2
다른 방법으로 유용 할 수있는 기술을 사용하여 37 바이트 로 줄 였습니다. 또한 그 발견 sd하고 var그들이 두 배로하기 위해 할 수있는 강제 변환 아무것도.
ngm

pryr::f4 바이트를 절약 할 수 있습니다 : tio.run/##K/qfZvu/…
pajonk

@pajonk 좋은 지적! 그러나 R + pryr이 아닌 기본 R 패키지를 고수하려고합니다. 나는 "순수한 R"로 간주 될 수있는 메타를 검색 할 것입니다.
JayCe

3

젤리 , 4 바이트

rBFS

온라인으로 사용해보십시오!

설명

rBFS – 전체 프로그램. 명령 행 인수에서 두 입력을 가져옵니다.
r – 범위.
 B – 각각에 대해 이진으로 변환합니다.
  FS – 평탄화 및 합계.

O_o, 그건 빠르지?
Muhammad Salman 2016 년

@MuhammadSalman 글쎄, 도전은 사소한 IMO입니다.
Mr. Xcoder

게시 후 1 분이 지나도 답변이 될 수 있습니다.
Muhammad Salman 2016 년

1
@MuhammadSalman 그렇습니다. 실제로 이와 같은 사소한 문제는 그렇게 빠르지는 않습니다. 젤리에 대한 지식도 뒤 따릅니다. 실제 노력은 이달의 언어, QBasic에서 진행됩니다. ;-)
Outgolfer Erik

@EriktheOutgolfer : QBasic / BrainF ** k에서 이것에 대답 할 수 있습니까?
Muhammad Salman 2016 년





2

배쉬 + 공통 유틸리티, 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 함수의 이름을 매개 변수로 직접 설정할 수 있다는 것을 절대 잊어 버렸습니다 :-(
Francisco Hahn

$argv[0]프로그램 이름 또는 "-"입니다. 당신은 작업을해야 $argv[1]하고 $argv[2]. 그리고 join대신에 implode68 바이트로 단축 하여 사용할 수 있습니다 .<?=substr_count(join(array_map(decbin,range($argv[1],$argv[2]))),1);
Titus

1

PowerShell , 72 바이트

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

온라인으로 사용해보십시오!

바이너리로 변환 [convert]::ToString($_,2)하고 0을 제거 하기 때문에 오래 걸립니다 -replace0. 그렇지 않으면 우리는 입력 숫자를 취하고 범위를 만들고 범위의 $x..$y각 숫자에 대해 이진수로 변환하고 0을 제거하고 0을 제거하고 .length(즉, 남은 숫자 수) $output에 추가합니다 .


사용하려고 count하는 대신 length:)
mazzy

1
@mazzy count는 배열이 아닌 문자열의 1수를 계산하기 때문에 항상 그렇습니다 length.
AdmBorkBork

끈! 네 말이 맞아 감사. -replace0똑똑하다.
mazzy


1

, 10 바이트

$+JTB:a\,b

온라인으로 사용해보십시오!

설명

            a and b are command-line args (implicit)
      a\,b  Inclusive range from a to b
   TB:      Convert to binary (: forces TB's precedence down)
  J         Join into a single string of 1's and 0's
$+          Sum (fold on +)


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

Brachylog , 8 바이트

⟦₂ḃᵐcọht

온라인으로 사용해보십시오!

설명

⟦₂         Ascending range between the two elements in the input
  ḃᵐ       Map to base 2
    c      Concatenate
     ọ     Occurrences of each element
      h    Head: take the list [1, <number of occurrences of 1>]
       t   Tail: the number of occurrences of 1


1

K (ngn / k) , 19 13 바이트

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

온라인으로 사용해보십시오!

{ }인수가있는 함수 x이며y

!1+y 목록입니다 1 1 ... y

x_ 첫 x 요소를 삭제합니다

2\ 각 int를 동일한 길이의 이진 숫자 목록으로 인코딩합니다 (ngn / k에만 해당).

+/ 합집합

+//수렴까지의 합; 이 경우 모든 이진수 목록의 합의 합


1

펄 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)
Brad Gilbert b2gills

1

J , 16, 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 나는 오늘 나중에 시도 할 것입니다 (아마도 가능하기 때문에 가능합니다 :))
Galen Ivanov

@FrownyFrog 15 지금까지, 나는 여전히 노력하고 있습니다 ...
Galen Ivanov


@FrownyFrog 아아 너무 쉽게! 나는 생각 }.했지만 항상 갈고리가 아닌 포크 로 생각했다 . 감사!
Galen Ivanov

1

Q 기본, 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까지의 마지막 테스트 케이스가 실제로 작동합니다. j!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.