Нулі в інтервалі


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

4
Можливо, ви хочете виключити уніар як основу, інакше ця проблема є тривіальною: отримайте введення, надрукуйте 0.
Mego

Чи можете ви додати кілька тестових випадків для інших баз?
Морган Трапп

3
Я думаю, що це було б цікавіше, якби потрібен був базовий аргумент. "База на ваш вибір" для мене дивна.
Олексій А.

1
Так, @AlexA. але занадто пізно, щоб змінити це зараз, 10 відповідей дюйма
Філіп Хаглунд

Відповіді:


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 Правила питання прямо дозволяють це робити. Обман чи ні, це відповідь, за якою закликають правила.
Денніс

8

Python 2, 36 байт

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

Кредит muddyfish для `` трюк.


1
Ласкаво просимо до головоломки програмування та коду для гольфу! Це хороша перша відповідь. :)
Олексій А.

Оце Так! Я не знав, що це працює!
Дантал

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 Додано пояснення
Аднан

5

Japt, 3 байти

+!U

Використовує базу k+2, як відповідь Желе. Є нульовий iff i==0. Перевірте це в Інтернеті!

Краща версія, 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.


Оскільки я не встигаю отримати голоси за свою відповідь, я піднесу вашу заяву (принаймні, там моє ім’я)
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

Брахілог , 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

Джулія, 48 байт - 30% = 33,6

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

Це функція, яка приймає три цілі числа і повертає ціле число. Один з аргументів вказує базу, тому це кваліфікується як бонус.

Безголівки:

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

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 Яким є порядок бази 64? Чому б не en.wikipedia.org/wiki/Ascii85 чи трохи більше не скористатися усіма символами для друку ascii
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

Без бонусу, базовий 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 приємно, але специфікація каже (i ≤ k). Оновлення Я спробував це, але насправді це не працює для k <i
edc65

Ну, це працювало для мене (і я знаю, що специфікація гарантує, що i <= k, але ваш код виходить з ладу, коли k <i; порівняно, мій код руйнується лише тоді, коли k <i - 1!)
Ніл

@Neil uh ok зараз я розумію. Він не дає розумної відповіді, але принаймні не дає збоїв
edc65

1
@ForcentVintier все одно після вашого введення я переглянув код, зберігаючи деякі байти
edc65


1

Луа 74 байти

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

Повинен бути більш ефективний спосіб зробити це ...

Я думав, що я дійсно на щось тут:

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)

Але на жаль ... Це стає все довше і довше, оскільки я розумію, що все більше і більше нулей я забув ...


1

APL, 22 байти

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

Це монадійна функція, яка приймає межі діапазону зліва та справа та повертає ціле число.

Безголівки:

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

Спробуйте тут


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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.