เลขศูนย์ในช่วงเวลา


14

งานของคุณคือการเขียนฟังก์ชั่นหรือโปรแกรมที่ใช้จำนวนเต็มสองจำนวนที่ไม่เป็นลบiและk( ik) และหาจำนวนศูนย์ที่คุณเขียนถ้าคุณเขียนตัวเลขทั้งหมดจากiถึงk(รวม) ลงในฐานที่คุณเลือก จากกระดาษ เอาท์พุทจำนวนเต็มนี้จำนวนศูนย์เพื่อ stdout หรือคล้ายกัน

-30%หากคุณยอมรับอาร์กิวเมนต์ที่สามbจำนวนเต็มฐานเพื่อเขียนตัวเลขในนั้นต้องมีการจัดการอย่างน้อยสองฐานเพื่อให้ได้โบนัสนี้

  • คุณอาจยอมรับอินพุตในฐานใดก็ได้ที่คุณชอบและคุณสามารถเปลี่ยนฐานระหว่างกรณีทดสอบได้
  • คุณอาจจะยอมรับข้อโต้แย้งi, kและเลือกbในลำดับใด ๆ ที่คุณต้องการ
  • คำตอบต้องจัดการอย่างน้อยหนึ่งฐานที่ไม่ใช่เอกภาพ

กรณีทดสอบ (ในฐาน 10):

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

นี่คือรหัสกอล์ฟ ไบต์ที่น้อยที่สุดจะชนะ


2
หากคุณสามารถไปกับฐานใดก็ได้ที่คุณต้องการในแต่ละกรณีคุณไม่สามารถทำแต่ละฐานในฐาน k และพิมพ์ 0 หรือ 1 ขึ้นอยู่กับว่า = i?
StephenTG

4
คุณอาจต้องการยกเว้นเอกฐานเป็นฐานมิฉะนั้นปัญหานี้เล็กน้อย: รับอินพุตพิมพ์ 0
Mego

คุณสามารถเพิ่มกรณีทดสอบสำหรับฐานอื่น ๆ ได้ไหม
Morgan Thrapp

3
ฉันคิดว่านี่น่าสนใจกว่าถ้าต้องการอาร์กิวเมนต์พื้นฐาน "ฐานที่คุณเลือก" นั้นแปลกสำหรับฉัน
Alex A.

1
ใช่ @AlexA แต่สายเกินกว่าที่จะเปลี่ยนแปลงได้ในตอนนี้ 10 คำตอบ
Filip Haglund

คำตอบ:


17

เยลลี่ 1 ไบต์

¬

ใช้ฐานk+2ซึ่งในกรณีนี้มี 0 iff เดียวiคือ 0 มันใช้เวลาสองข้อโต้แย้ง แต่ใช้ตรรกะไม่เพียงคนแรก

หากเราไม่ต้องการโกง:

7 ไบต์ - 30% = 4.9

-1.1 คะแนนโดย @Dennis

rb⁵$¬SS

สิ่งนี้จะได้รับโบนัส

             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
นี่เป็นโปรแกรม Jelly ที่สองที่ฉันเขียนบนโทรศัพท์ของฉัน
lirtosiast

13
บ้าตาย 1 ไบต์? ให้โอกาสเรา
Rɪᴋᴇʀ

2
สามารถทำได้อย่างง่ายดายในไม่กี่ไบต์ในภาษาอื่น ๆ ฉันพูดถึงเวอร์ชั่นที่ไม่ใช่การโกง
ETHproductions

13
@ETHproductions กฎของคำถามอย่างชัดเจนอนุญาตให้ทำเช่นนี้ โกงหรือไม่มันเป็นคำตอบที่กฎเรียก
Dennis

8

Python 2, 36 ไบต์

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

ให้เครดิตกับmuddyfishสำหรับเคล็ดลับ ``


1
ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! นี่เป็นคำตอบแรกที่ดี :)
Alex A.

ว้าว! ฉันไม่รู้ว่ามันใช้งานได้!
Dantal

6

05AB1E , 3 1 ไบต์

ใช้ฐานk+2เช่นคำตอบของ Jelly รหัส:

_

คำอธิบาย:

_  # Logical NOT operator

รุ่นที่ไม่ใช่การโกง 3 ไบต์:

รหัส:

Ÿ0¢

คำอธิบาย:

Ÿ    # Inclusive range
 0¢  # Count zeroes

โบนัสให้ฉัน3.5 ไบต์เนื่องจากข้อผิดพลาด:

ŸB)0¢

คำอธิบาย:

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

ใช้การเข้ารหัส CP-1252


มันทำงานอย่างไร
lirtosiast

@ThomasKwa เพิ่มคำอธิบาย
Adnan

5

Japt, 3 ไบต์

+!U

ใช้ฐานk+2เป็นคำตอบของเยลลี่ มี i==0IFF ทดสอบออนไลน์!

รุ่นที่ดีกว่า10 8 ไบต์

UòV ¬è'0

อันนี้ใช้ฐาน 10 ทดสอบออนไลน์!

รุ่นโบนัส14 12 ไบต์ - 30% = 8.4

UòV msW ¬è'0

น่าเสียดายที่ฉันเล่นกอล์ฟแล้วโบนัสก็ไม่คุ้มกับมันอีกต่อไป ... ทดสอบออนไลน์!

มันทำงานอย่างไร

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 ไบต์

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

หรือบันทึก 3 (2.1) ไบต์ถ้า b ไม่จำเป็นต้องมีค่าเริ่มต้นเป็น 10

รุ่นที่ไม่ใช่โบนัสที่ดีที่สุดที่ฉันสามารถทำได้คือ 65 ไบต์:

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

แก้ไข: บันทึก 5 ไบต์โดยใช้เคล็ดลับการนับศูนย์ของ @ edc65


ในขณะที่ฉันไม่ได้รับคะแนนสำหรับคำตอบของฉันฉันจะ upvote ของคุณ (อย่างน้อยก็มีชื่อของฉันอยู่ภายใน)
edc65

4

อย่างจริงจัง 10 ไบต์

'0,,u@xεjc

คำอธิบาย:

'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

ลองออนไลน์!

พร้อมโบนัส: 11.9 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

'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 ไบต์

li!

สิ่งนี้ใช้ทางลัด @ThomasKwa ทำ

หากไม่ได้รับอนุญาตนี่คือคำตอบ 10 ไบต์

q~),>s'0e=

ดีและสั้น! ทำงานเหมือนคำตอบที่จริงจังของ @ Mego

ขอบคุณ @Dennis!

สนุกกับการเขียนคำตอบ CJam แรกของฉัน!

ลองที่นี่!


3

T-SQL, 394 ไบต์ (ไม่มีโบนัส)

ฉันคิดว่า 'ทำไมไม่ ' ใช่ไหม

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)

และเป็นมิตร:

-- 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)

นั่นคือการอุทิศ
colsw

3

Ruby, 46 - 30% = 32.2 ไบต์

คุณอาจจะเล่นกอล์ฟมากกว่านี้ แต่อย่างน้อยฉันก็ได้รับโบนัส 30%!

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

... หรือไม่มีโบนัส (27 ไบต์)

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

ยินดีต้อนรับเคล็ดลับยังคงเรียนรู้สิ่ง "ทับทิม" ทั้งหมดนี้


คำตอบที่ดีคุณไม่จำเป็นต้องใช้เครื่องหมายแดงเมื่อใช้แผนที่ซึ่งสามารถบันทึกได้ 1 ไบต์ (i..k)ดีเท่า[*i..k]ในกรณีแรก
GB

2

Brachylogขนาด 26 ไบต์

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

[i,k]จะเข้าเป็นรายการ

คำอธิบาย

,{    }?: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 ไบต์ - 30% = 33.6

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

นี่คือฟังก์ชั่นที่รับจำนวนเต็มสามจำนวนและส่งคืนจำนวนเต็ม หนึ่งในข้อโต้แย้งระบุฐานดังนั้นจึงมีสิทธิ์ได้รับโบนัส

Ungolfed:

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

การใช้โบนัสให้คะแนนนั้นแทบจะดีกว่าการไม่ติดตั้ง (34 ไบต์):

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

2

อย่างจริงจัง 2 ไบต์

นี่อาจเป็นคำตอบที่หลอกลวงถึงขีด จำกัด แต่นี่เป็นคำตอบง่ายๆ 2 ไบต์อย่างจริงจัง

,Y

ลองออนไลน์!


2

Pyth, 6.3 ไบต์พร้อมโบนัส (9 ไบต์ - 30%)

/sjRQ}EE0

คำอธิบาย:

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

ลองที่นี่

หรือ 7 ไบต์โดยไม่มีโบนัส:

/`}EE\0

คำอธิบาย:

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

ลองที่นี่

หรือใช้ชุดทดสอบ


ฉันคิดว่าการได้รับโบนัสคุ้มค่า:/sjRQ}EE0
FryAmTheEggman

มันเป็นรหัสเดียวกันกับการแปลงฐานฉันค่อนข้างแน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ปัญหาของโบนัสบังคับให้คุณลองทำสิ่งต่าง ๆ และนับจำนวน ... : P
FryAmTheEggman

2

PHP, 50 ไบต์

รองรับทศนิยมเท่านั้น

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

รองรับทศนิยมและไบนารีพร้อมโบนัส 63

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

รองรับทศนิยมฐานสิบหกฐานแปดและไบนารีพร้อมโบนัส 77.7

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

รองรับฐาน 2 - 36 พร้อมโบนัส 78.4

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

คอลเลกชันที่ดี! สนใจที่จะทำรุ่น 3a รวมถึงฐาน 64? : D
ติตัส

@Titus คำสั่งของ base 64 เป็นอย่างไร? ทำไมไม่en.wikipedia.org/wiki/Ascii85หรือทำอะไรให้มากขึ้นกับ ascii chars ที่พิมพ์ได้ทั้งหมด
JörgHü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

ไม่มีโบนัสฐาน k + 2คือ 10 ไบต์(i,k)=>+!i

ไม่มีโบนัสและมีขนาด 8 ไบต์(i,k)=>0

ทดสอบ

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>


หากคุณย้ายก่อนที่จะห่วงรหัสของคุณยังคงทำงานแม้ในขณะที่o='0' k<i
Neil

@Neil ดี (i ≤ k)แต่สเปคกล่าวว่า อัปเดตฉันลองทำเช่นนี้ แต่อันที่จริงมันใช้ไม่ได้กับ k <i
edc65

มันใช้งานได้สำหรับฉัน (และฉันรู้ว่าข้อมูลจำเพาะรับประกันได้ว่าฉัน <= k แต่โค้ดของคุณล้มเหลวเมื่อ k <i; โดยการเปรียบเทียบรหัสของฉันจะเกิดปัญหาเมื่อ k <i - 1!)
Neil

@ Neil uh ตกลงตอนนี้ฉันเข้าใจแล้ว มันไม่ได้ให้คำตอบที่สมเหตุสมผล แต่อย่างน้อยก็ไม่ผิดพลาด
edc65

1
@ForcentVintier ต่อไปหลังจากที่คุณป้อนฉันแก้ไขรหัสบันทึกบาง bytes
edc65


1

Lua 74 bytes

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

There's gotta be a more effective way to do this...

I thought I was really onto something here:

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)

But alas... It keeps getting longer and longer as I realize there's more and more zeroes I forgot about...


1

APL, 22 bytes

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

This is a monadic function that accepts the range boundaries on the left and right and returns an integer.

Ungolfed:

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

Try it here


1

Haskell, 29 bytes

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

I'm using base 10.

Usage example: 100 # 200 -> 22

How it works: turn each element in the list from i to k into it's string representation, concatenate into a single string, take a 1 for every char '0' and sum those 1s.


1

MATL, 7 (10 bytes − 30% bonus)

2$:i:qYA~z

Try it online!

This works in release 11.0.2, which is earlier than this challenge.

Explanation

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 bytes

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

creates a vector from lower number to larger one, then converts all numbers to string and counts all the '0' symbols.


1

Python 3, 52.

Tried to implement the bonus, but it doesn't seem to be worth it.

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

With test cases:

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

1
I literally never heard about the assert statement before this comment. Thanks mate!
sagiksp

1

Perl 6, 23 bytes

{+($^i..$^k).comb(/0/)}
  1. creates a Range ( $^i..$^k )
  2. joins the values with spaces implicitly ( .comb is a Str method )
  3. creates a list of just the zeros ( .comb(/0/) )
  4. returns the number of elems in that list ( + )

Usage:

my &zero-count = {…}

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

You know, that comment at the end of your code makes it seem longer...
ETHproductions

@ETHproductions I usually do that so that if I come up with more than one way to do things that I can see if it is shorter than others. I just keep adding more ways to do it until I come up with what I think is the shortest way.
Brad Gilbert b2gills


1

C# 112 Bytes

int z(int i,int k)=>String.Join("",Enumerable.Range(i,k-i+1)).Count(c=>c=='0')
  1. Create a string with numbers from the first number up to the last number
  2. Count the zero characters in the string

Welcome to PPCG! I'm not super familiar with C# but I think you could probably save a few bytes if you removed some of the spaces.
0 '

thank you 0, you are right but only a couple bytes. I believe my edited answer removes all the spaces I can. :)
lee

1

PHP, 84 bytes *.7=58.8 (bases 2 to 36)

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

or

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

takes decimal input from command line arguments; run with -r.


For fun: <?=0 supports unary and alphabetic. ;)
Titus

1

PowerShell, 56 54 51 48 42 bytes

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

Takes input, creates a range with $i..$k then -joins that together into a string, followed by a regex -split command that separates the string into an array by slicing at the 0s. We encapsulate that with ().count-1 to measure how many zeros. That's left on the pipeline, and output is implicit.

Saved 6 bytes thanks to @ConnorLSW

Try it online!


Base-handling in PowerShell is limited and doesn't support arbitrary bases, so I'm not going for the bonus.


param($i,$k)(-join($i..$k)-split'0').Length-1 works for me, -3, or use .Count-1 to save even more, haven't tested that yet though.
colsw

@ConnorLSW Thanks! Don't need the quotes around '0', so that trimmed off a few more.
AdmBorkBork

nice one, I always forget powershell handles numbers like that.
colsw

0

Java 8, 102 bytes - 30% = 71.4

Why not.

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

Without the bonus, 96 bytes (so the bonus actually improves my score!):

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

This implements the following:

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

@mbomb007 The problem is that formatting it this way renders the answer as 102 bytes on the Leaderboard in the question.
HyperNeutrino

That's a flaw with the leaderboard, not the post. Look at how most of the other answers are doing it the same way.
mbomb007

@mbomb007 I'm looking at the answers and I see a ton of different formats, some of which work with the leaderboard, some of which don't.
HyperNeutrino

0

Clojure, 50 49 bytes

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

Oh regex is shorter than filtering. Original:

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

Very basic, uses the set of character \0 to remove others and counts how many were found.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.