五つ与えないで!


38

質問 :

シーケンスの開始整数と終了整数が与えられ、その中に数字を含まない整数の数を返す必要があります5。開始番号と終了番号を含める必要があります!

例:

1,9→1,2,3,4,6,7,8,9→結果8

4,17→4,6,7,8,9,10,11,12,13,14,16,17→結果12

50,60→60→結果1

-59、-50→→結果0

結果には5が含まれる場合があります。

開始番号は常に終了番号よりも小さくなります。両方の数値が負になることもあります!

私はあなたのソリューションとそれを解決する方法に非常に興味があります。たぶんあなたの誰かが簡単な純粋な数学の解決策を見つけるでしょう。

編集 これはコードとゴルフのチャレンジなので、最短のコードが優先されます。


3
@betseq:それは近いです。しかし、これには可変範囲があります(モジュロは不要です)。
タイタス

4
勝利の基準として最短のコードとcode-golfタグをお勧めします(そうでないことに気付かなかったのです!)。また、おそらく50または500に及ぶテストケースを配置する必要があります。また、-50にまたがる1つと、0にまたがる1つが良い考えです。
ジョナサンアラン

1
@JonathanAllan:例を更新します。
アラスベル

4
テストケース:50, 59 -> 0
ズガルブ

14
あなたは言う:「開始番号は常に終了番号よりも小さくなります。」しかし、あなたの例の1つ(-50、
-59

回答:


21

JavaScript(ES6)、36 33バイト

カリー化構文を使用して入力を受け取ります(a)(b)

a=>F=b=>b<a?0:!/5/.test(b)+F(b-1)

書式設定およびコメント化

a =>                 // outer function: takes 'a' as argument, returns F
  F = b =>           // inner function F: takes 'b' as argument, returns the final result
    b < a ?          // if b is less than a
      0              //   return 0
    :                // else
      !/5/.test(b) + //   add 1 if the decimal representation of b does not contain any '5'
      F(b - 1)       //   and do a recursive call to F with b - 1

テストケース


(通常、ブール値のみが必要な場合に優先testexecます。)
ニール

@Neilそれは確かにもっと理にかなっています。更新しました。
アーナルド

NB:ES6のカリー化構文に関するヒントを見つけることができなかったので、書きました
アーナルド

5
@TheLethalCoder b<aは、からbまでのすべての数をカウントした後、再帰を停止するために存在するため、a削除すると無限再帰が発生します。
ETHproductions

1
@HristiyanDodov無名の外側の関数が取るa引数としてと返すF関数で、順番に取りb、引数として、および-から反復するために再帰的に呼ばれている-あなたが気づいたようにba含まれていないすべての整数のカウンタをインクリメント、5その小数に表現。
アーナウド

17

ゼリー8 7 バイト

Dennisのおかげで-1バイト(数値へのインデックス付けはその数値を10進数リストとして扱うという事実を使用してください)

rAw€5¬S

TryItOnline!

どうやって?

rAw€5¬S - Main link: from, to    e.g. -51, -44
r       - range(from, to)        e.g. [-51,-50,-49,-48,-47,-46,-45,-44]
 A      - absolute value         e.g. [51,50,49,48,47,46,45,44]
  w€    - first index of... for €ach (0 if not present)
    5   - five                   e.g. [1,1,0,0,0,0,2,0]
     ¬  - logical not            e.g. [0,0,1,1,1,1,0,1]
      S - sum                    e.g. 5

*絶対値アトムAは、10進数リストにキャストされた負の数には負のエントリがあり、そのいずれも絶対にないために必要です5(この例では2つではなく8つすべてをカウントします)。


rAw€5¬Sバイトを保存します。
デニス

@デニスありがとう!私の説明は「その数を10進リストとして扱う」のは正確ですか?
ジョナサンアラン

2
かなり。w整数の引数を10進数にキャストします。
デニス


13

2sable6 5バイト

Adnanのおかげで1バイト節約

Ÿ5¢_O

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

説明

 Ÿ      # inclusive range
  5¢    # count 5's in each element of the range
    _   # negate
     O  # sum

注:これ¢は、リスト内の一致する要素をカウントするのではなく、関数を各要素に適用する際のバグが原因で機能します。


`配列:pで同じように動作するので、削除できます。
アドナン

@アドナン:ありがとう!私はそれをテストするつもりだったが、忘れていた;)
エミニャ

9

Python2、59の 55 52 51 47 43 42バイト

f=lambda a,b:a<=b and-(`5`in`a`)-~f(a+1,b)

再帰的なソリューション。論理演算子を使用して解決策を見つける動機を与えてくれた@xnorに感謝します!また、私をガイドし、バイトを43から42に切り刻んでくれた@JonathanAllan@xnorに感謝します!

43バイトでの他の試行

f=lambda a,b:a<=b and-~-(`5`in`a`)+f(a+1,b)
f=lambda a,b:a<=b and 1-(`5`in`a`)+f(a+1,b)

だろうif!`x`.count('5')動作しますか?
タイタス

2
@Titus Pythonにnot!、Cのような言語の演算子がありますが、3バイトかかります:(
Yytsi

1
andおよびで論理短絡を使用することを検討してくださいor
XNOR

1
うん、うまくやった!今、それを短くすることを考えてくださいnot
XNOR

1
あなたは本当に近いです!いろいろ試してみてください。
XNOR


6

05AB1E8 7 6バイト

Adnanのおかげで1バイト節約

Ÿ5.å_O

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

説明

Ÿ         # inclusive range
 5.å      # map 5 in y for each y in the list
    _     # logical negation 
     O    # sum

05AB1Eもvectorized åであるため、6バイトで実行できŸ5.å_Oます。
アドナン

negate意味-n、またはn==0?1:0
ETHproductions

@ETHproductions:申し訳ありませんが、それは不明瞭でした。私は論理否定を意味したのでn==0?1:0
エミグナ



5

Haskell、39バイト

s!e=sum[1|x<-[s..e],notElem '5'$show x]

オンラインでお試しください!使用法:

Prelude> 4 ! 17
12

説明:

             [s..e]                     -- yields the range from s to e inclusive
          x<-[s..e]                     -- for each x in this range
          x<-[s..e],notElem '5'$show x  -- if the char '5' is not in the string representation of x
       [1|x<-[s..e],notElem '5'$show x] -- then add a 1 to the resulting list      
s!e=sum[1|x<-[s..e],notElem '5'$show x] -- take the sum of the list

4

R、33バイト

f=function(x,y)sum(!grepl(5,x:y))

使用法:

> f=function(x,y)sum(!grepl(5,x:y))
> f(40,60)
[1] 10
> f(1,9)
[1] 8
> f(4,17)
[1] 12



4

PHP 7.1、57の 55バイト

for([,$a,$b]=$argv;$a<=$b;)$n+=!strstr($a++,53);echo$n;

で実行 php -r '<code>' <a> <b>


これはPHP7.1構文ではありませんか?
アロス

@aross:そうです。しかし、PHP 7.1は5時間(より古い年12月1日pubished
タイタス

1
もちろん、バージョンが7以上の場合はバージョンを指定するのに慣れているので、たった今尋ねました。それは一種のPythonのための条約のもだ
aross

1
PHPの規約-私が見た限りでは-は、特に指定がない限り、最新バージョンを使用することです。
タイタス

多くの人が最新のマイナーバージョンを持っているとは思わない。現時点で最も一般的な分母はおそらく5.5です。個人的には、現在FC 7.0を配布しているFC 25(かなり最先端と考えられています)を使用しています。Windowsを使用している場合は、おそらく手動で更新する必要があります。
アロス

4

Mathematica、46 44 42バイト

それぞれ2バイトを節約してくれたalephalphaとDavidCに感謝します!

Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&

2つの整数引数を取り、整数を返す名前のない関数。IntegerDigits@Range@##入力間のすべての数値を数字のリストに変換します。FreeQ@5これらのリストをテストして、どれにも含まないものを決定します5。次に、Booleブール値をゼロと1に変換しTr、結果を合計します。

その他のソリューション(44および47バイト):

Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&

IntegerDigits@x~FreeQ~5数字の桁のリストに5が含まれていないかどうかを判断し、Count[Range@##,x_/;...]&そのテストに合格する入力間の数字の数をカウントします。

Tr[Sign[1##&@@IntegerDigits@#-5]^2&/@Range@##]&

1##&@@IntegerDigits@#-5数字の桁のリストを取得し、それらすべてから5を減算し、答えを複数回乗算します。Sign[...]^2次に、ゼロ以外のすべての数値を1に変換します。


1
Count[Range@##,x_/;IntegerDigits@x~FreeQ~5]&
DavidC

1
Tr@Boole[FreeQ@5/@IntegerDigits@Range@##]&
-alephalpha

3

ルビー、36 35バイト

->a,b{(a..b).count{|x|!x.to_s[?5]}}

-1バイトのThx IMP1


1
これは、リストのサイズではなく、5を含む数字のないリストを返しませんか?
IMP1

あなたは正しいです、間違ったバージョンをコピー/貼り付けました。
GB

1
検索で/の代わりに?5'5'文字)を使用し/5てバイトを保存することもできます。
IMP1

3

Java 7、80 78バイト

int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

ゴルフをしていない:

int c(int a, int b){
  int r = 0;
  for (; a <= b; ) {
    r += ("" + a++).contains("5")
          ? 0
          : 1;
  }
  return r;
}

テストコード:

ここで試してみてください。

class M{
  static int c(int a,int b){int r=0;for(;a<=b;)r+=(""+a++).contains("5")?0:1;return r;}

  public static void main(String[] a){
    System.out.println(c(1, 9));
    System.out.println(c(4, 17));
  }
}

出力:

8
12

3

PowerShell、42 41バイト

param($a,$b)$a..$b|%{$z+=!($_-match5)};$z

コマンドラインから。\ no5s.ps1 1 20として呼び出されます


1
スペースをドロップして、バイトを節約できます。完全に数値の正規表現パターンを使用すると、(例えば、区切り文字を必要としない-replace3か、-split1または-notmatch5)。
AdmBorkBork

ああ、いいね、ありがとう@AdmBorkBork
mcmurdo

2

パイソン2、61の 56バイト

lambda a,b:len([n for n in range(a,b+1) if not"5"in`n`])

tukkaaXのおかげで-5バイト


落胆しないでください!楽しんで挑戦することが重要です。not "5" in:)で2つの空白を削除できます。また、Python2を使用している場合xは、を行う代わりに、「引用符で囲むことができますstr(x)
イッツィー

@TuukkaXありがとう!また、inと `
x`の

を削除でき[]ます。前にスペースも必要ありませんif
デニス

@Dennis私はすでにそれを試しましたが、「タイプ 'generator'のオブジェクトにはlen()がない」と文句を言います。
イッツィー

@TuukkaXそうです。lambda a,b:sum(not"5"in`n`for n in range(a,b+1))しかし動作します。tio.run/nexus/...
デニス

2

Swift 52バイト

($0...$1).filter { !String($0).contains("5") }.count

チャレンジはコードゴルフチャレンジなので、バイトカウントを含める必要があります。また、codegolfでは(少なくともここでは)、すべてのプログラムが実際に競合している必要があります(たとえば、関数名は1文字だけで、実際の関数は1行に減らすことができます)。私はスウィフトを知りません、あなたは私のことを修正する必要があるかもしれません。
clismique

2

バッチ、95バイト

@set/an=0,i=%1
:g
@if "%i%"=="%i:5=%" set/an+=1
@set/ai+=1
@if %i% leq %2 goto g
@echo %n%

とにかく変数にループカウンターが必要なため、手動でループを実行すると数バイト節約できます。


2

PHP、56バイト

for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;

次のように実行します。

php -r 'for($i=$argv[1];$i<=$argv[2];)trim(5,$i++)&&$x++;echo$x;' 1 9 2>/dev/null;echo
> 8

PHP 7.1のバージョンは53バイト(Titusのクレジット)です。

for([,$i,$e]=$argv;$i<=$e;)trim(5,$i++)&&$x++;echo$x;

説明

for(
  $i=$argv[1];          # Set iterator to first input.
  $i<=$argv[2];         # Loop until second input is reached.
)
  trim(5,$i++) && $x++; # Trim string "5" with the characters in the
                        # current number; results in empty string when
                        # `5` is present in the number. If that is not
                        # the case, increment `$x`

echo$x;                 # Output `$x`

ああ、trimもう二度目のパラメータを忘れてしまった。
タイタス

2

CJam「簡単な純粋数学ソリューション」、60

{{Ab5+_,\_5#)<\9e]);_4f>.m9b}%}:F;q~_:z$\:*0>{((+F:-}{F:+)}?

オンラインで試す

配列内の任意の順序で数値を受け取ります。

説明:

核となる問題の1つは、任意の正のnについて、f(n)= 1からn(5を含む)までの5以外の数の計算です。そして、答えは次のとおりです。nの10進数を取得し、最初の5(もしあれば)の後のすべての数字を9に置き換え、すべての数字5..9を4..8(デクリメント)に置き換え、基数9から変換します。 1759→1648→1 * 9 ^ 3 + 6 * 9 ^ 2 + 4 * 9 + 8 = 1259 基本的に、各桁の位置には9つの許容値があり、5xxxxは49999と同等です。それらの間には有効な数値がないためです。

これを解決すると、いくつかのケースがあります。入力数(たとえば、aとb、a <b)が(厳密に)正の場合、結果はf(b)-f(a-1)になります。それらが負の場合、絶対値を取得し、それらを並べ替えて同じ計算を使用できます。そして、a <= 0 <= bの場合、結果はf(-a)+ f(b)+1です。

プログラムは、最初に上記のように関数Fを実装します(ただし、配列の各数値に適用されます)。次に、入力を読み取り、数値を絶対値に変換して並べ替え、上記の2つの計算のいずれかを使用します。 * b> 0最初。


「純粋」ではなく、素晴らしい方法です。ここでは、1 :)を取得する
マシュー盧

@MatthewRohありがとう、しかし、あなたは純粋ではないという意味ですか?これは、範囲を反復することなく、入力数値に対してかなり直接的な数学計算を行うソリューションです。他に何を期待していましたか?
-aditsu

2

Python 2、54バイト

i,j=input();k=0
while i<=j:k+=not"5"in`i`;i+=1
print k

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

Pythonの最短回答ではありませんが、同じアルゴリズムを使用しますが、whileループを使用して実装する方法は異なり、ラムダ関数ではありません。


関数ではなくプログラムであり、forの代わりにwhileを使用します。違いは何ですか?OK、インクリメントされた入力内で文字列「5」をまだ探しています、同意しました。もっと良い方法はありますか?
エルペドロ

それはまさにそれが何であるかであり、それがそれが延期されている理由です。申し訳ありませんが、多分私のコメントを変えたはずです。
エルペドロ

同じアルゴリズム、異なる実装方法。コメントに問題はありません。それはより良い言葉遣いですか?
エルペドロ

はい、そうです:)コメントセクションをきれいにするために、これらのコメントを削除します。
イッツィー

1

Java 7、77バイト

これはKevins Answerの改良ですが、コメントする評判がまだないので、この新しい答えが必要になります。

だから私がやったことは:

  • indexOfステートメントをcontains(-1バイト)に置き換えます
  • forループの増分部分を条件ステートメントに移動します(-2バイト)

for-loop(77バイト):

int c(int a,int b){int r=1;for(;a++<b;)r+=(""+a).contains("5")?0:1;return r;}

再帰的(79バイト):

int d(int r,int a,int b){r+=(""+a).contains("5")?0:1;return a!=b?d(r,a+1,b):r;}

出力:

8
12

8
12

ここでテストしてください


PPCGへようこそ!すでに非常にうまくゴルフの答えで素敵な発見。私はJavaについてあまり知りません(""+a).contains("5")?0:1が、置き換えられるべきではありません!(""+a).contains("5")か?
クリストフ

1
@Christophは悲しいことにいいえ、Javaではブール値は実際には単なるブール値だからです。したがって、3進法の操作が唯一の方法です。
トビアスマイスター

悲しいですね。どう(""+a).contains("5")||r++
クリストフ

1
ブール式を単独で使用できないため、@ Christophも機能しません。私はそれを他の場所(forループ宣言など)で機能させようとしましたが、あまり成功していません。ナイスアイデアトー;)
トビアスマイスター

1

C#、67バイト

a=>b=>{int c=0;for(;a<=b;)c+=(a+++"").Contains("5")?0:1;return c;};

私が使用することを期待していたfor(int c=0;...)けど、それはリターンのための適用範囲外であるため、コンパイルに失敗したc
TheLethalCoder

1

JavaScript(ES6)、58 56 49バイト

let f =

(s,e)=>{for(c=0;s<=e;)c+=!/5/.test(s++);return c}

console.log(f(1, 9));
console.log(f(4, 17));
console.log(f(-9, -1));

ETHproductionsのおかげで7バイトをゴルフしました


1
を使用c+=!/5/.test(s++)して数バイトを保存できます:
ETHproductions

どうもありがとう!ただし、ゴルフを削除する必要がありました。私は彼らをとても誇りに思いました。:(
Hristiyan Dodov

カレーを使用できると思います。つまり、 `s => e =>`
TheLethalCoder

トップの答えは、構文を使用しカリー化。ほぼ同じになるので、私は編集しません。それを指摘してくれてありがとう!
Hristiyan Dodov

1

MATL、10バイト

&:!V53-!As

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

説明

        % Implicitly grab two input arguments
&:      % Create an array from [input1....input2]
!V      % Convert to a string where each number is it's own row
53-     % Subtract ASCII '5' from each character.
!A      % Detect which rows have no false values (no 5's). Returns a logical array
s       % Sum the logical array to get the # numbers without 5's
        % Implicitly display the result

1

C#、77バイト

(n,m)=>{var g=0;for(var i=n;i<m+1;i++)g+=(i+"").Contains("5")?0:1;return g;};

匿名のラムダ呼び出し。

用途n(最初の番号)およびm列封じ込めを介して入力として(最後の番号)、次いで、チェック("".Contains(""))。


私はダウンボットではありませんが、5を法とすることはOPによって与えられた課題に対する正しい解決策ではありません。数字に数字5が含まれているものはすべて除外する必要があるため、10(答えは数えま​​せんが)数える必要があります。
ケビンCruijssen

@KevinCruijssen修正済み。
devRicher

これは、コンパイルされませんg述べたとき、命名されるように初期化する必要がありますvarあなたが必要なのでvar g="";、あなたが使用することができカリー化すなわちn=>m=>
TheLethalCoder

また、このリストではない、カウント出力
TheLethalCoder

1
編集内容で@KevinCruijssenこれが私の答えは...本質的である
TheLethalCoder

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.