間隔のゼロ


14

あなたの仕事は、2つの非負の整数ikik)を受け取る関数またはプログラムを作成し、すべての整数をiからkし、ピースの選択のベースに(含む)の紙の。この整数、ゼロの数をstdoutなどに出力します。

-30%3番目の引数も受け入れる場合はb、数値を書き留めるための整数ベース。このボーナスを達成するには、少なくとも2つのベースを処理する必要があります。

  • 任意のベースで入力を受け入れることができ、テストケース間でベースを変更できます。
  • あなたは、引数を受け入れることができik必要に応じてb好きなためです。
  • 回答は、単項でない少なくとも1つのベースを処理する必要があります。

テストケース(ベース10):

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

これはコードゴルフです。最小バイトが勝ちます。


2
場合に応じて任意のベースを使用できる場合、ベースkでそれぞれを実行し、i = 0かどうかに応じて0または1を出力できませんか?
-StephenTG

4
単項式をベースとして除外したい場合、またはこの問題は些細なことです。入力を取得し、0を出力します
。– Mego

他のベースにいくつかのテストケースを追加できますか?
モーガンスラップ

3
ベース引数が必要な場合、これはより興味深いと思います。「あなたの選択のベース」は私にとって奇妙です。
アレックスA.

1
はい、@ AlexA。しかし、遅すぎる変化にという点で、今、10件の答え。
フィリップハグランド

回答:


17

ゼリー、1バイト

¬

これはbaseを使用します。k+2その場合、単一の0 iffがありますiは0になります。2つの引数を取りますが、論理NOTは最初の引数のみに適用されます。

カンニングしたくない場合:

7バイト-30%= 4.9

@Dennisによる-1.1ポイント

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
これは、携帯電話で書いた2番目のJellyプログラムです。
リルトシアスト

13
くそー、1バイト?チャンスをください。
Rɪᴋᴇʀ

2
これは、他の言語ではごくわずかなバイトで簡単に実行できます。不正行為をしないバージョンに固執するといいます。
ETHproductions

13
@ETHproductions質問のルールはこれを明示的に許可しています。チートであろうとなかろうと、それはルールが求める答えです。
デニス

8

Python 2、36バイト

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

``トリックのためのmuddyfishへの信用。


1
プログラミングパズルとコードゴルフへようこそ!これはいい最初の答えです。:)
アレックスA.

うわー!私はそれが働いていることを知りませんでした!
ダンタル

6

05AB1E3 1バイト

k+2ゼリーの答え、コードのようなベースを使用します:

_

説明:

_  # 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エンコードを使用します。


これはどのように作動しますか?
リルトシアスト

@ThomasKwa説明が追加されました
アドナン

5

Japt、3バイト

+!U

k+2Jellyの回答としてbaseを使用します。ゼロの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

または、bのデフォルトを10にする必要がない場合は、3(2.1)バイトを節約します。

私ができる最高の非ボーナスバージョンは65バイトでした:

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

編集:@ edc65のゼロカウントトリックを使用して5バイトを保存しました。


私は自分の答えに投票することができませんので、私はあなたのものに投票します(少なくとも私の名前はそこにあります)
-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

ルビー、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}

ヒントは大歓迎ですが、この「Ruby」のこと全体を学習しています。


いい答えは、マップを使用するときにsplat演算子は必要ないことです。これにより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

ジュリア、48バイト-30%= 33.6

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

これは、3つの整数を受け入れて整数を返す関数です。引数の1つはベースを指定するため、これはボーナスの対象となります。

ゴルフをしていない:

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で10進数と2進数をサポート

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

ボーナス77.7で10進数、16進数、8進数、2進数をサポート

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

ボーナス78.4でベース2〜36をサポート

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

素敵なコレクション!Base 64を含むバージョン3aを実行しますか?:D
タイタス

@Titus Base 64の順序はどうですか?なぜen.wikipedia.org/wiki/Ascii85または印刷可能なすべてのアスキー文字でもう少し作ってはいけないか
ヨルクヒュルサーマン

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
ニール

@ニールいいですが、仕様は言う(i ≤ k)更新私はこれを試してみましたが、実際にはk <i
edc65

まあ、それは私のために働いた(そして仕様はi <= kを保証しているが、k <iのときにコードがクラッシュすることを知っている;比較して私のコードはk <i-1のときにのみクラッシュする!)
Neil

@Neilええ、わかりました。それは賢明な答えを与えませんが、少なくともクラッシュしません
-edc65

1
とにかくあなたの入力後@ForcentVintier私はいくつかのバイトを節約するコードを修正しました
-edc65


1

Lua 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バイト

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

私はベース10を使用しています。

使用例:100 # 200->22

仕組み:リスト内の各要素をito からk文字列表現に変換し、単一の文字列に連結し、1すべての文字に対してa を取り、'0'それらを合計し1ます。


1

MATL、7(10バイト-30%ボーナス)

2$:i:qYA~z

オンラインでお試しください!

これは、このチャレンジよりも前のリリース11.0.2で機能します。

説明

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バイト

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

小さい数値から大きい数値へのベクトルを作成し、すべての数値を文字列に変換して、すべての「0」記号をカウントします。


1

Python 3、52。

ボーナスを実装しようとしましたが、それは価値がないようです。

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

テストケースの場合:

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

1
このコメントの前に、私は文字通りアサートステートメントについて聞いたことがありません。どうも!
sagiksp

1

Perl 6、23バイト

{+($^i..$^k).comb(/0/)}
  1. Range( $^i..$^k
  2. 値を暗黙的にスペースで結合します( .comb Strメソッドです)
  3. ゼロのみのリストを作成します( .comb(/0/)
  4. そのリスト内の要素の数を返します(+

使用法:

my &zero-count = {…}

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

ご存知のように、コードの最後にあるコメントは長く見えるようになります
...-ETHproductions

@ETHproductions私は通常それを行うので、他の方法よりも短いかどうかを確認できることを行うために複数の方法を考え出した場合です。最短の方法と思われるものが見つかるまで、それを行う方法をさらに追加し続けます。
ブラッドギルバートb2gills

1

Mathematica、39バイト、27.3ボーナス付き

Count[#~Range~#2~IntegerDigits~#3,0,2]&

1

C# 112バイト

int z(int i,int k)=>String.Join("",Enumerable.Range(i,k-i+1)).Count(c=>c=='0')
  1. 最初の数字から最後の数字までの数字で文字列を作成します
  2. 文字列のゼロ文字を数えます

PPCGへようこそ!私はC#に精通していませんが、スペースの一部を削除した場合、おそらく数バイト節約できると思います。
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.