Số không trong khoảng


14

Nhiệm vụ của bạn là viết một hàm hoặc chương trình mà phải mất hai số nguyên không âm ik( ik), và con số ra bao nhiêu zero bạn muốn viết nếu bạn đã viết tất cả các số nguyên từ iđến k(bao gồm) trong cơ sở của bạn lựa chọn trên một mảnh giấy. Xuất số nguyên này, số lượng không, đến thiết bị xuất chuẩn hoặc tương tự.

-30%nếu bạn cũng chấp nhận đối số thứ ba b, cơ sở số nguyên để ghi lại các số. Ít nhất hai cơ sở phải được xử lý để đạt được phần thưởng này.

  • Bạn có thể chấp nhận đầu vào trong bất kỳ cơ sở nào bạn thích và bạn có thể thay đổi cơ sở giữa các trường hợp thử nghiệm.
  • Bạn có thể chấp nhận các đối số i, kvà tùy chọn btheo thứ tự nào bạn muốn.
  • Câu trả lời phải xử lý ít nhất một cơ sở không phải là đơn nguyên.

Các trường hợp thử nghiệm (trong cơ sở 10):

i k -> output
10 10 -> 1
0 27 -> 3
100 200 -> 22
0 500 -> 92

Đây là môn đánh gôn; ít byte nhất giành chiến thắng.


2
Nếu bạn có thể đi với bất kỳ cơ sở nào bạn thích từ trường hợp này sang trường hợp khác, bạn không thể thực hiện từng cơ sở trong cơ sở k và in 0 hoặc 1, tùy thuộc vào việc tôi = 0?
StephenTG

4
Bạn có thể muốn loại trừ unary làm cơ sở, hoặc nếu không thì vấn đề này là không đáng kể: lấy đầu vào, in 0.
Mego

Bạn có thể thêm một số trường hợp thử nghiệm cho các căn cứ khác?
Morgan Thrapp

3
Tôi nghĩ rằng điều này sẽ thú vị hơn nếu yêu cầu đối số cơ sở. "Cơ sở của sự lựa chọn của bạn" là lạ đối với tôi.
Alex A.

1
Vâng, @AlexA. nhưng quá muộn để thay đổi điều đó ngay bây giờ, 10 câu trả lời.
Filip Haglund

Câu trả lời:


17

Thạch, 1 byte

¬

Điều này sử dụng cơ sở k+2, trong trường hợp có 0 iff duy nhất ilà 0. Nó cần hai đối số, nhưng áp dụng logic KHÔNG chỉ cho đối số đầu tiên.

Nếu chúng ta không muốn lừa dối:

7 byte - 30% = 4,9

-1,1 điểm bởi @Dennis

rb⁵$¬SS

Điều này nhận được tiền thưởng.

             dyadic link:
r            inclusive range
 b⁵$           Convert all to base input.
    ¬          Vectorized logical NOT
     S         Sum up 0th digits, 1st digits, etc.
      S        Sum all values

7
Đây là chương trình Jelly thứ hai tôi đã viết trên điện thoại của mình.
lirtosiast

13
Chết tiệt, 1 byte? Hãy cho chúng tôi một cơ hội.
Rɪᴋᴇʀ

2
Điều này có thể dễ dàng thực hiện trong rất ít byte trong bất kỳ ngôn ngữ nào khác. Tôi nói dính vào phiên bản không gian lận.
Sản phẩm điện tử

13
@ETHproductions Các quy tắc của câu hỏi rõ ràng cho phép làm điều này. Cheaty hay không, đó là câu trả lời mà các quy tắc yêu cầu.
Dennis

8

Python 2, 36 byte

lambda a,b:`range(a,b+1)`.count('0')

Tín dụng cho bùn lầy cho `` lừa.


1
Chào mừng bạn đến với Câu đố lập trình & Code Golf! Đây là một câu trả lời đầu tiên tốt đẹp. :)
Alex A.

Ồ Tôi không biết nó hoạt động!
Dantal

6

05AB1E , 3 1 byte

Sử dụng cơ sở k+2như câu trả lời Jelly, Code:

_

Giải trình:

_  # Logical NOT operator

Phiên bản không gian lận 3 byte:

Mã số:

Ÿ0¢

Giải trình:

Ÿ    # Inclusive range
 0¢  # Count zeroes

Phần thưởng mang lại cho tôi 3,5 byte do lỗi:

ŸB)0¢

Giải trình:

Ÿ      # Inclusive range
 B     # Convert to base input
  )    # Wrap into an array (which should not be needed)
   0¢  # Count zeroes

Sử dụng mã hóa CP-1252.


Cái này hoạt động ra sao?
lirtosiast

@ThomasKwa Giải thích thêm
Adnan

5

Japt, 3 byte

+!U

Sử dụng cơ sở k+2, như câu trả lời Jelly. Không có iff i==0. Kiểm tra nó trực tuyến!

Phiên bản tốt hơn, 10 8 byte

UòV ¬è'0

Cái này sử dụng cơ sở 10. Kiểm tra nó trực tuyến!

Phiên bản thưởng, 14 12 byte - 30% = 8.4

UòV msW ¬è'0

Đáng buồn thay, với việc chơi golf tôi đã làm, tiền thưởng không còn xứng đáng nữa ... Hãy thử trực tuyến!

Làm thế nào nó hoạt động

UòV msW ¬è'0   // Implicit: U = start int, V = end int, W = base
UòV            // Create the inclusive range [U..V].
    msW        // Map each item by turning it into a base-W string.
        ¬      // Join into a string.
         è'0   // Count the number of occurances of the string "0".

5

ES6, 91 86 - 30% = 60,2 byte

(i,k,b=10)=>([...Array(k+1-i)].map((_,n)=>(i+n).toString(b))+'0').match(/0/g).length-1

Hoặc lưu 3 (2.1) byte nếu b không cần mặc định là 10.

Phiên bản không thưởng tốt nhất tôi có thể làm là 65 byte:

(i,k)=>([...Array(k+1).keys()].slice(i)+'0').match(/0/g).length-1

Chỉnh sửa: Đã lưu 5 byte bằng cách sử dụng thủ thuật đếm không của @ edc65.


Khi tôi không quản lý để nhận được phiếu bầu cho câu trả lời của mình, tôi sẽ nâng cao tên của bạn (ít nhất là có tên của tôi bên trong)
edc65

4

Nghiêm túc, 10 byte

'0,,u@xεjc

Giải trình:

'0,,u@xεjc
'0,,u       push "0", i, k+1
     @x     swap i and k+1, range(i, k+1)
       εjc  join on empty string and count 0s

Hãy thử trực tuyến!

Với tiền thưởng: 11,9 byte

'0,,u@x,╗`╜@¡`Mεjc

Hãy thử trực tuyến!

Giải trình:

'0,,u@x,╗`╜@¡`MΣc
'0,,u@x             push "0", range(i, k+1)
       ,╗           push b to register 0
         `   `M     map:
          ╜@¡         push b, push string of a written in base b
               Σc   sum (concat for strings), count 0s

3

CJam, 12 10 3 byte

li!

Cái này sử dụng phím tắt @ThomasKwa.

Nếu điều này không được phép, thì đây là câu trả lời 10 byte.

q~),>s'0e=

Đẹp và ngắn! Hoạt động như câu trả lời nghiêm túc của @ Mego.

Cảm ơn @Dennis!

Có niềm vui viết câu trả lời đầu tiên của tôi!

Hãy thử nó ở đây!


3

T-SQL, 394 byte (Không có tiền thưởng)

Tôi hình 'tại sao không ', phải không?

DECLARE @i INT, @k INT SET @i = 100 SET @k = 200  WITH g AS (SELECT @i AS n UNION ALL SELECT n+1 FROM g WHERE n+1<=@k ) SELECT LEN(n) AS c FROM (SELECT STUFF((SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(n, 1, ''), 2, ''), 3, ''), 4, ''), 5, ''), 6, ''), 7, ''), 8, ''), 9, ''), ' ', '') FROM g FOR XML PATH ('')) ,1,0,'') n ) a OPTION (maxrecursion 0)

Và thân thiện:

-- CG!

DECLARE @i INT, @k INT 
SET @i = 100
SET @k = 200

WITH g AS 
(
    SELECT @i AS n
    UNION ALL
    SELECT n+1 FROM g WHERE n+1<=@k
)

SELECT LEN(n) AS c FROM 
(
    SELECT 
        STUFF((SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(n, 1, ''), 2, ''), 3, ''), 4, ''), 5, ''), 6, ''), 7, ''), 8, ''), 9, ''), ' ', '')
FROM g FOR XML PATH ('')) ,1,0,'') n
) a

OPTION (maxrecursion 0)

đó là sự cống hiến.
colsw

3

Ruby, 46 - 30% = 32,2 byte

Bạn có thể chơi golf này nhiều hơn, nhưng ít nhất tôi nhận được 30% tiền thưởng!

->i,k,b{((i..k).map{|a|a.to_s b}*"").count ?0}

... hoặc không có tiền thưởng (27 byte.)

->i,k{([*i..k]*"").count ?0}

Lời khuyên được chào đón, vẫn học toàn bộ điều "Ruby" này.


Câu trả lời hay, bạn không cần toán tử splat khi sử dụng bản đồ, điều này có thể tiết kiệm 1 byte. (i..k)là tốt như [*i..k]trong trường hợp đầu tiên.
GB

2

Brachylog , 26 byte

,{,.e?}?:1frcS:0xlI,Sl-I=.

Đưa đầu vào thành một danh sách [i,k] .

Giải trình

,{    }?:1f                § Unify the output with a list of all inputs which verify the
                           § predicate between brackets {...} with output set as the input
                           § of the main predicate

  ,.e?                     § Unify the input with a number between i and k with the ouput
                           § being the list [i,k]

           rcS             § Reverse the list and concatenate everything into a single
                           § number (we reverse it to not lose the leading 0 if i = 0 when
                           § we concatenate into a single number). Call this number S.

              :0xlI        § Remove all occurences of 0 from S, call I the length of this new
                           § number with no zeros

                   ,Sl-I=. § Output the length of S minus I.

2

Julia, 48 byte - 30% = 33,6

f(i,k,b)=sum(j->sum(c->c<49,[base(b,j)...]),i:k)

Đây là một hàm chấp nhận ba số nguyên và trả về một số nguyên. Một trong những đối số chỉ định cơ sở, vì vậy điều này đủ điều kiện nhận thưởng.

Ung dung:

function f(i, k, b)
    # For each j in the inclusive range i to k, convert j to base
    # b as a string, splat the string into a character array, and
    # compare each character to the ASCII code 49 (i.e. '1'). The
    # condition will only be true if the character is '0'. We sum
    # these booleans to get the number of zeros in that number,
    # then we sum over the set of sums to get the result.
    sum(j -> sum(c -> c < 49, [base(b, j)...]), i:k)
end

Việc thực hiện phần thưởng mang lại một số điểm chỉ tốt hơn so với việc không thực hiện nó (34 byte):

f(i,k)=sum(c->c<49,[join(i:k)...])

2

Nghiêm túc, 2 byte

Điều này có thể đưa thủ thuật trả lời Jelly đến giới hạn, nhưng đây là câu trả lời Nghiêm túc 2 byte đơn giản.

,Y

Hãy thử trực tuyến!


2

Pyth, 6,3 byte, có tiền thưởng (9 byte - 30%)

/sjRQ}EE0

Giải trình:

  jRQ     - [conv_base(Q, d) for d in V]
     }EE  - inclusive_range(eval(input), eval(input))
 s        - sum(^, [])
/       0 - ^.count(0)

Hãy thử nó ở đây

Hoặc 7 byte mà không có tiền thưởng:

/`}EE\0

Giải trình:

  }EE   - inclusive_range(eval(input), eval(input))
 `      - repr(^)
/    \0 - ^.count("0")

Hãy thử nó ở đây

Hoặc sử dụng bộ kiểm tra


Tôi nghĩ rằng nhận được tiền thưởng là xứng đáng: /sjRQ}EE0
FryAmTheEggman

Ơ, đó là cùng một mã với một chuyển đổi cơ bản, tôi khá chắc chắn bạn biết bạn đang làm gì, chỉ là vấn đề tiền thưởng buộc bạn phải thử các công cụ khác nhau và đếm ...: P
FryAmTheEggman

2

PHP, 50 byte

chỉ hỗ trợ số thập phân

<?=substr_count(join(range($argv[1],$argv[2])),0);

hỗ trợ số thập phân và nhị phân với Tiền thưởng 63

<?=substr_count(join(array_map([2=>decbin,10=>""][$argv[3]],range($argv[1],$argv[2]))),0);

hỗ trợ thập phân, thập lục phân, bát phân và nhị phân với Tiền thưởng 77,7

<?=substr_count(join(array_map([2=>decbin,8=>decoct,10=>"",16=>dechex][$argv[3]],range($argv[1],$argv[2]))),0);

hỗ trợ cơ sở 2 - 36 với Tiền thưởng 78,4

<?=substr_count(join(array_map(function($i){return base_convert($i,10,$_GET[2]);},range($_GET[0],$_GET[1]))),0);

Bộ sưu tập đẹp! Muốn làm một phiên bản 3a bao gồm cả cơ sở 64? : D
Tít

@Titus Thứ tự của căn cứ 64 như thế nào? Tại sao không en.wikipedia.org/wiki/Ascii85 hoặc kiếm thêm một chút với tất cả các ký tự ascii có thể in
Jörg Hülsermann

2

JavaScript (ES6), 50 (71 - 30%)

(n,k,b)=>eval("for(o=0;n<=k;++n)o+=n.toString(b)").match(/0/g).length-1

Không có tiền thưởng, cơ sở k + 2 là 10 byte(i,k)=>+!i

Không có tiền thưởng, unary là 8 byte(i,k)=>0

KIỂM TRA

f=(n,k,b)=>eval("for(o=0;n<=k;++n)o+=n.toString(b)").match(/0/g).length-1

function go() {
  var i=I.value.match(/\d+/g)
  R.textContent = f(i[0],i[1],i[2])
}

go()
i,k,b:<input id=I value='0,500,10' oninput="go()">
<span id=R></span>


Nếu bạn di chuyển o='0'trước vòng lặp, mã của bạn sẽ tiếp tục hoạt động ngay cả khi k<i.
Neil

@Neil đẹp, nhưng thông số kỹ thuật nói (i ≤ k). Cập nhật Tôi đã thử cách này nhưng thực tế nó không hoạt động cho k <i
edc65

Chà, nó hoạt động với tôi (và tôi biết thông số kỹ thuật đảm bảo rằng tôi <= k, nhưng mã của bạn gặp sự cố khi k <i; bằng cách so sánh mã của tôi chỉ gặp sự cố khi k <i - 1!)
Neil

@Neil uh ok bây giờ tôi hiểu rồi. Nó không đưa ra một câu trả lời hợp lý nhưng ít nhất là không sụp đổ
edc65

1
@ForcentVintier dù sao sau khi bạn nhập liệu, tôi đã sửa đổi mã lưu một số byte
edc65

1

Jolf, 7 byte

Thay thế bằng \x11. Hãy thử nó ở đây!

Zl♂sjJ0
   sjJ  inclusive range between two numeric inputs
  ♂      chopped into single-length elements
Zl    0  and count the number of zeroes
        implicitly printed

1

Lua 74 byte

z,c=io.read,""for a=z(),z()do c=c..a end o,b=string.gsub(c,"0","")print(b)

Phải có một cách hiệu quả hơn để làm điều này ...

Tôi nghĩ rằng tôi đã thực sự vào một cái gì đó ở đây:

c,m,z=0,math,io.read for a=z(),1+z()do c=c+((m.floor(a/10))%10==0 and 1 or a%100==0 and 1 or a%10==0 and 1 or 0) end print(c)

Nhưng than ôi ... Nó càng ngày càng dài hơn khi tôi nhận ra ngày càng có nhiều số 0 tôi quên mất ...


1

APL, 22 byte

{+/'0'⍷∊0⍕¨(⍺-1)↓⍳⍵}

Đây là một hàm đơn sắc chấp nhận các ranh giới phạm vi ở bên trái và bên phải và trả về một số nguyên.

Ung dung:

           (⍺-1)↓⍳⍵}  ⍝ Construct the range ⍺..⍵ by dropping the first
                      ⍝ ⍺-1 values in the range 1..⍵
       ∊0⍕¨           ⍝ Convert each number to a string
{+/'0'⍷               ⍝ Count the occurrences of '0' in the string

Hãy thử nó ở đây


1

Haskell, 29 byte

i#k=sum[1|'0'<-show=<<[i..k]]

Tôi đang sử dụng cơ sở 10 .

Ví dụ sử dụng: 100 # 200->22

Cách hoạt động: biến mỗi phần tử trong danh sách từ iđể kvào chuỗi đại diện của nó, concatenate thành một chuỗi duy nhất, hãy 1cho mọi char '0'và tổng hợp những 1s.


1

MATL , 7 (10 byte - 30% tiền thưởng)

2$:i:qYA~z

Hãy thử trực tuyến!

Điều này hoạt động trong phiên bản 11.0.2 , sớm hơn thử thách này.

Giải trình

2$:      % implicitly input two numbers and generate inclusive range
i:q      % input base b and generate vector [0,1,...,b-1]
YA       % convert range to base b using symbols 0,1,...,b-1. Gives 2D array
~        % logical negation. Zeros become 1, rest of symbols become 0
z        % number of nonzero elements in array

1

Matlab: 27 byte

@(q,w)nnz(num2str(q:w)==48)

tạo một vectơ từ số thấp hơn sang số lớn hơn, sau đó chuyển đổi tất cả các số thành chuỗi và đếm tất cả các ký hiệu '0'.


1

Trăn 3, 52.

Đã cố gắng để thực hiện phần thưởng, nhưng nó dường như không xứng đáng.

lambda a,b:''.join(map(str,range(a,b+1))).count('0')

Với các trường hợp thử nghiệm:

assert f(10, 10) == 1
assert f(0, 27) == 3
assert f(100, 200) == 22
assert f(0, 500) == 92

1
Tôi thực sự không bao giờ nghe về tuyên bố khẳng định trước bình luận này. Cảm ơn bạn đời!
sagiksp

1

Perl 6 , 23 byte

{+($^i..$^k).comb(/0/)}
  1. tạo một Phạm vi ( $^i..$^k)
  2. nối các giá trị với khoảng trắng ngầm định ( .comblà phương thức Str)
  3. tạo một danh sách chỉ các số không ( .comb(/0/))
  4. trả về số lượng elem trong danh sách đó ( +)

Sử dụng:

my &zero-count = {…}

for (10,10), (0,27), (100,200), (0,500), (0,100000) {
  say zero-count |@_
}
1
3
22
92
38895

Bạn biết đấy, nhận xét đó ở cuối mã của bạn làm cho nó có vẻ dài hơn ...
Sản phẩm ETH

@ETHproductions Tôi thường làm điều đó để nếu tôi nghĩ ra nhiều cách để làm những việc mà tôi có thể thấy nếu nó ngắn hơn những cách khác. Tôi chỉ tiếp tục thêm nhiều cách để làm điều đó cho đến khi tôi nghĩ ra cách mà tôi nghĩ là cách ngắn nhất.
Brad Gilbert b2gills


1

C # 112 byte

int z(int i,int k)=>String.Join("",Enumerable.Range(i,k-i+1)).Count(c=>c=='0')
  1. Tạo một chuỗi với các số từ số đầu tiên đến số cuối cùng
  2. Đếm các ký tự 0 trong chuỗi

Chào mừng đến với PPCG! Tôi không quá quen thuộc với C # nhưng tôi nghĩ bạn có thể tiết kiệm được một vài byte nếu bạn xóa một số khoảng trắng.
0 '

cảm ơn bạn 0, bạn đúng nhưng chỉ một vài byte. Tôi tin rằng câu trả lời được chỉnh sửa của tôi loại bỏ tất cả các khoảng trống tôi có thể. :)
lee

1

PHP, 84 byte * .7 = 58.8 (cơ sở 2 đến 36)

for(;($v=$argv)[2]>$a=$v[1]++;)$n+=substr_count(base_convert($a,10,$v[3]),0);echo$n;

hoặc là

for(;($v=$argv)[2]>$v[1];)$n+=substr_count(base_convert($v[1]++,10,$v[3]),0);echo$n;

lấy đầu vào thập phân từ các đối số dòng lệnh; chạy với -r.


Đối với niềm vui: <?=0hỗ trợ unary và chữ cái. ;)
Tít

1

PowerShell, 56 54 51 48 42 byte

param($i,$k)(-join($i..$k)-split0).count-1

Đưa đầu vào, tạo một phạm vi với s $i..$ksau đó -joinkết hợp thành một chuỗi, theo sau là -splitlệnh regex tách chuỗi thành một mảng bằng cách cắt tại0 s. Chúng tôi gói gọn điều đó ().count-1để đo xem có bao nhiêu số không. Điều đó còn lại trên đường ống, và đầu ra là ẩn.

Đã lưu 6 byte nhờ @ConnorLSW

Hãy thử trực tuyến!


Xử lý cơ sở trong PowerShell bị hạn chế và không hỗ trợ các cơ sở tùy ý, vì vậy tôi sẽ không nhận tiền thưởng.


param($i,$k)(-join($i..$k)-split'0').Length-1làm việc cho tôi, -3 hoặc sử dụng .Count-1để tiết kiệm hơn nữa, chưa được thử nghiệm.
colsw

@ConnorLSW Cảm ơn! Đừng cần các trích dẫn xung quanh '0', để cắt bớt một vài chi tiết.
admBorkBork

tốt đẹp, tôi luôn quên powershell xử lý những con số như thế.
colsw

0

Java 8, 102 byte - 30% = 71,4

Tại sao không.

(i,k,b)->{int j=0;for(;i<=k;i++)for(char c:Integer.toString(i,b).toCharArray())if(c==48)j++;return j;}

Không có phần thưởng, 96 byte (vì vậy phần thưởng thực sự cải thiện điểm số của tôi!):

(i,k)->{int j=0;for(;i<=k;i++)for(char c:String.valueOf(i).toCharArray())if(c==48)j++;return j;}

Điều này thực hiện như sau:

interface Function {
    public int apply(int i, int k, int b);
}

@ mbomb007 Vấn đề là định dạng theo cách này sẽ trả lời câu trả lời là 102 byte trên Bảng xếp hạng trong câu hỏi.
HyperNeutrino

Đó là một lỗ hổng với bảng xếp hạng, không phải bài viết. Nhìn vào cách hầu hết các câu trả lời khác đang làm điều đó theo cùng một cách.
mbomb007

@ mbomb007 Tôi đang xem các câu trả lời và tôi thấy rất nhiều định dạng khác nhau, một số trong đó hoạt động với bảng xếp hạng, một số thì không.
HyperNeutrino

0

Clojure, 50 49 byte

#(count(re-seq #"0"(apply str(range %(inc %2)))))

Oh regex ngắn hơn lọc. Nguyên:

#(count(filter #{\0}(apply str(range %(inc %2)))))

Rất cơ bản, sử dụng bộ ký tự \0để loại bỏ những người khác và đếm xem có bao nhiêu được tìm thấy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.