menzilde olanları say


20

Meydan okuma :

1Bir aralık arasındaki tüm sayıların ikili gösterimindeki sayısını sayın .


Giriş:

Ondalık olmayan pozitif tamsayılar


Çıktı :

1İki sayı arasındaki aralıktaki tüm s'lerin toplamı .


Misal :

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

Sadece ilk örneği açıkladım, aksi takdirde hepsini açıklamaya çalışırsam çok fazla yer kaplardı.


Not :

  • Sayılar 1000'den fazla olabilir
  • Tüm girişler geçerli olacak.
  • Minimum çıktı bir olacaktır.
  • Sayıyı iki öğeden oluşan bir dizi olarak kabul edebilirsiniz.
  • Sayıların nasıl sıralanacağını seçebilirsiniz.

Kazanma kriterleri:

Bu her dil için bayt olarak en kısa kod kazanır.



1
Girdiyi bir çeşit aralık türü olarak alabilir miyiz ( IntRangeKotlin'de, RangeRuby'de)?
snail_

Eğlenceli bir gerçek: Vaka 1000 - 20005938 verir, ancak 1000 ile harfe, sonuç da 1000 ile düşer: 0-1000 = 4938. Proof
steenbergh

Yanıtlar:


9

JavaScript (ES6), 38 bayt

Körili sözdiziminde girdi alır (a)(b).

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

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

Çevrimiçi deneyin!


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

@ saka1029 İthalat zorunludur. Yani aslında a->b->java.util.stream.IntStream.range(a,b+1).map(Integer::bitCount).sum(), 74 bayt için. İthalat zorunlu olmasa bile, parametreler, bu yüzden yazmak zorundayız a->b->IntStream.range(a,b+1).map(Integer::bitCount).sum(), bu da 57 bayt olarak sayılır
Olivier Grégoire

Ayrıca a->b->IntStream.range(a,b+1).map(Long::bitCount).sum()1 baytlık bir iyileştirme için de olabilir . Marjinal, ama yine de bir tane.
NotBaal

@NotBaal Olivier tarafından yukarıdaki yorumda belirtildiği gibi, ithalat zorunludur, bu yüzden a->b->java.util.stream.IntStream.range(a,b+1).map(Long::bitCount).sum()(71 bayt) olmalıdır.
Kevin Cruijssen



4

MATL , 5 4 bayt

&:Bz

Çevrimiçi deneyin!

Bayt'ı kurtardığı için Luis Mendo'ya teşekkürler!

(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 bayt

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

Çevrimiçi deneyin!

Ngm tarafından diğer R çözeltisinden yoğun şekilde esinlenmiştir . Bu, bitlere dönüştürüldükten sonra farklı bir yaklaşım kullanır. Olası 34 baytlık bir çözümü ima ettiği için Giuseppe'ya çok teşekkürler.


34 bayt mümkündür! Hile gördüğüm yeri unuttum (onunla gelmediğimi biliyorum) ama bir summable vektörüne daha hileli bir dönüşüm var - eğer bulamazsanız gönderirim.
Giuseppe

@Giuseppe Gerçekten!
JayCe

2
Aksi takdirde yararlı olabilecek bir teknik kullanarak 37 bayta düştüm . Ayrıca bunu keşfetti sdve varikiye katlamak için ellerinden gelen her şeyi zorla.
ngm

pryr::f4 bayt kaydetmek için kullanabilirsiniz : tio.run/##K/qfZvu/…
pajonk

@pajonk iyi bir nokta! Ama R + pryr yerine temel R paketlerine bağlı kalmaya çalışıyorum. Ben "saf R" olarak kabul edilebilir meta arayacağım.
JayCe

3

Jöle , 4 bayt

rBFS

Çevrimiçi deneyin!

açıklama

rBFS - Tam program. İki girdiyi komut satırı bağımsız değişkenlerinden alır.
r - Aralık.
 B - Her biri için ikiliye dönüştürün.
  FS - Düzleştir ve toplam.

O_o, hızlı mıydı?
Muhammed Salman

@MuhammadSalman Bu meydan okuma aynı zamanda önemsiz bir IMO.
Bay Xcoder

Bu olabilir, ancak gönderdikten bir dakika sonra bir cevap.
Muhammed Salman

1
@MuhammadSalman Evet, bunun gibi önemsiz zorluklar için bu kadar hızlı değil; Jelly bilgisi de ortaya çıkar. Asıl çaba, örneğin bu ayın dili olan QBasic. ;-)
Erik Outgolfer

@EriktheOutgolfer: Buna QBasic / BrainF ** k'de cevap verebilir misiniz?
Muhammed Salman





2

Bash + genel altyapı, 50

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

Çevrimiçi deneyin!

Tam sayıları ikili dizelere dönüştürmek her zaman bash'de biraz acıdır. Buradaki yaklaşım biraz farklıdır - tam sayıları sekizlik biçime dönüştürün, ardından her sekizlik basamağı içerdiği ikili 1 sayısı ile değiştirin. Sonra tüm dönüştürülmüş rakamları toplayabiliriz


2

APL + WIN, 33 26 bayt

Tamsayıların vektörü için uyarılar:

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

Çevrimiçi deneyin! Dalog Classic'in izniyle

Açıklama:

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

2

R , 44 40 37 bayt

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

Çevrimiçi deneyin!

Önceden:

function(a,b)sum(strtoi(intToBits(a:b)))
function(a,b)sum(as.integer(intToBits(a:b)))

2

İletişim araç kutulu oktav , 21 bayt

@(a,b)nnz(de2bi(a:b))

Çevrimiçi deneyin!

Kod oldukça açık olmalıdır. Aralıktaki sayıların her birinin ikili gösterimindeki sıfır olmayan öğelerin sayısı.

Bu @(a,b)nnz(dec2bin(a:b)-48)iletişim araç kutusu olmadan olurdu .


1

Kabuk , 4 bayt

Σṁḋ…

Çevrimiçi deneyin!

açıklama

Σṁḋ…
   …     Get the (inclusive) range.
 ṁḋ      Convert each to binary and concatenate.
Σ        Get the sum.


1

PHP, 97 Bayt

(bunun kısaltılabileceğinden, ancak işlevleri kullanmak istediğinden emin olun)

Çevrimiçi deneyin

kod

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

açıklama

<?=
 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

o sadece yapabileceği gibi görünüyor bu
dzaima

Bir saniye için kesinlikle php işlevinin adını doğrudan parametre olarak ayarlayabileceğinizi unuttum :-(
Francisco Hahn

$argv[0]program adı veya "-"; Sen ile çalışmalıdır $argv[1]ve $argv[2]. Ve joinbunun yerine, implodebunu 68 bayta kısaltarak kullanabilirsiniz :<?=substr_count(join(array_map(decbin,range($argv[1],$argv[2]))),1);
Titus

1

PowerShell , 72 bayt

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

Çevrimiçi deneyin!

İkili dönüşüm [convert]::ToString($_,2)ve sıfırlardan kurtulma nedeniyle uzun -replace0. Aksi takdirde, sadece giriş sayılarını alırız, bir aralık yaparız ve aralıktaki $x..$yher sayı için .lengthonu $oikiliye dönüştürür, sıfırları kaldırırız, bunları alırız (yani kalanların sayısını) ve işimize ekleriz.


countbunun yerine kullanmayı deneyin length:)
mazzy

1
@mazzy counther zaman olacaktır 1çünkü lengthbir diziyi değil, bir dizeyi sayıyoruz .
AdmBorkBork

dize! Haklısın. Teşekkürler. -replace0akıllı.
mazzy


1

Pip , 10 bayt

$+JTB:a\,b

Çevrimiçi deneyin!

açıklama

            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

Kömür , 10 bayt

IΣ⭆…·NN⍘ι²

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

     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 bayt

⟦₂ḃᵐcọht

Çevrimiçi deneyin!

açıklama

⟦₂         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 bayt

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

Çevrimiçi deneyin!

{ } bağımsız değişkenleri olan bir işlevdir x vey

!1+y liste 0 1 ... y

x_ ilk x elemanını düşürür

2\ her int'i aynı uzunluktaki ikili basamakların bir listesi olarak kodlar (bu ngn / k'ye özgüdür)

+/ toplam

+//yakınsamaya kadar toplam; bu durumda tüm ikili basamak listelerinin toplamı


1

Perl 6 , 32 30 bayt

Brad Gillbert sayesinde -1 bayt

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

Çevrimiçi deneyin!

Açıklama:

[…](@_)    #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
Eğer kullanırsanız, bir byte bir oranda düşürür [...](@_)yerine($^a..$^b)
Brad Gilbert b2gills

1

J , 16, 15 14 bayt

FrownyFrog sayesinde 1 bayt kurtarıldı!

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

Çevrimiçi deneyin!

Açıklama:

Bir ikili fiil, sol argüman maralığın alt sınırı , sağ olanı - üst 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 yapabilir misin?
FrownyFrog

@FrownyFrog Bugün daha sonra deneyeceğim (görünüşe göre, çünkü soruyorsun :))
Galen Ivanov

Şimdilik @FrownyFrog 15 , hala deniyorum ...
Galen Ivanov


@FrownyFrog Aah, çok kolay! Düşünüyordum }.ama her zaman bir çatalı ve bir çengelde değil. Teşekkürler!
Galen Ivanov

1

QBasic, 95 93 83 82 bayt

@DLosc bana kurtardı bazı bayt bir sürü!

Bu tekniği kullanarak başka bir bayt kurtardı !

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

Ayın Dili FTW!

açıklama

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

1000'den 2000'e kadar olan son testcase aslında Dosbox üzerinde çalışan QBasic 4.5'te çalışıyor: Selam doet het!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.