나에게 5 개주지 마!


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 : 닫습니다. 그러나 이것은 가변 범위를 가지며 모듈로가 필요하지 않습니다.
Titus

4
나는 가장 짧은 코드를 승리 기준으로 사용하고 code-golf 태그를 추천합니다. 또한 50 또는 500 범위의 테스트 케이스를 배치해야합니다. 또한 -50에 걸쳐 있고 0에 걸쳐있는 것이 좋습니다.
Jonathan Allan

1
@JonathanAllan : 예제를 업데이트하겠습니다.
Arasuvel

4
테스트 사례 : 50, 59 -> 0.
Zgarb

14
"시작 번호는 항상 끝 번호보다 작습니다." 하지만 예제 중 하나 (-50, -59)가 직접 모순
theonlygusti

답변:


21

자바 스크립트 (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

테스트 사례


(I는 일반적으로 선호 test이상 exec만 부울을 필요로 할 때.)

@Neil 그것은 더 의미가 있습니다. 업데이트되었습니다.
Arnauld 2012 년

NB : ES6 카레 구문에 대한 팁을 찾을 수 없어서 썼습니다 .
Arnauld 2012 년

5
@TheLethalCoder는 b<a모든 숫자를 통해 계산 한 후 재귀가 중지하는 것입니다 ba그래서 그냥 무한 재귀 원인이 제거.
ETHproductions

1
@HristiyanDodov 무명 외부 기능이 소요 a인수로하고, 리턴 F기능, 차례로 소요 b인수로와 -에서 반복 재귀라고합니다 - 당신이 눈치를 ba를 포함하지 않는 모든 정수에 대한 카운터를 증가, 5그들의 진수로 대표.
Arnauld 2012 년

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

* A10 진수 목록으로 캐스트 된 음수는 음수 항목을 갖기 때문에 절대 값 원자가 필요합니다.이 중 어느 것도 절대로 존재하지 않습니다 5(주어진 예제는 2 개가 아닌 8 개로 모두 계산 됨).


rAw€5¬S바이트를 저장합니다.
Dennis

@ 데니스 감사합니다! 내 설명이 "숫자를 소수 목록으로 취급"입니까?
Jonathan Allan

2
거의 요 w정수 인수를 10 진수로 캐스트합니다.
Dennis


13

2sable , 6 5 바이트

Adnan 덕분에 바이트 절약

Ÿ5¢_O

온라인으로 사용해보십시오!

설명

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

참고 : 이것은 ¢목록에서 일치하는 요소를 계산하는 대신 함수가 각 요소에 적용 되도록하는 버그로 인해 작동 합니다.


`배열에서 동일하게 작동하므로를 제거 할 수 있습니다 : p.
Adnan

@Adnan : 감사합니다! 나는 그것을 테스트하려고했지만 잊었다;)
Emigna

9

Python2, 59 55 52 51 47 43 42 바이트

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

재귀 솔루션. 논리 연산자를 사용하여 솔루션을 찾도록 동기 를 부여한 @xnor 에게 감사드립니다 ! 또한 덕분 @JonathanAllan@xnor 나 안내 (43)로부터 42 바이트 마에 대한!

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')일?
Titus

2
@Titus Python에는 C와 같은 언어로 된 not연산자가 !있지만 3 바이트가 걸립니다. (
Yytsi

1
와로 논리적 단락 사용 and을 고려하십시오 or.
xnor

1
그래, 잘 했어! 이제 그 단축에 대해 생각하십시오 not.
xnor

1
당신은 정말 가깝습니다! 계속 노력하십시오.
xnor


6

05AB1E , 8 7 6 바이트

Adnan 덕분에 바이트 절약

Ÿ5.å_O

온라인으로 사용해보십시오!

설명

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

05AB1E는 벡터화 한 å이다, 당신이 할 수 있도록, Ÿ5.å_O6 바이트.
Adnan

negate의미 -n또는 n==0?1:0?
ETHproductions

@ETHproductions : 죄송합니다. 확실하지 않습니다. 나는 논리적 부정, 그래서 의미n==0?1:0
Emigna

6

Pyth, 9 8 바이트

FryAmTheEggman 덕분에 바이트를 절약했습니다!

lf-\5T}E

설명:

        Q # Input
      }E  # Form an inclusive range starting from another input
          #   order is reversed, but doesn't matter
 f-\5T    # Filter by absence of '5'
l         # Count the number of elements left

온라인으로 사용해보십시오!


5

펄 6 , 23 바이트

{+grep {!/5/},$^a..$^b}

온라인으로 사용해보십시오!

작동 원리

{                     }  # A lambda.
              $^a..$^b   # Range between the two lambda arguments.
  grep {!/5/},           # Get those whose string representation doesn't match the regex /5/.
 +                       # Return the size of this list.

5

하스켈 , 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 구문이 아닌가요?
06 초

@aross : 그렇습니다. 그러나 PHP 7.1은 5 시간보다 오래 되었습니다 (12 월
Titus

1
물론 버전이 7 이상이면 버전을 지정하는 데 익숙했기 때문에 방금 물었습니다. 그 종류 파이썬에 대한 협약도입니다
aross

1
내가 본 한, PHP에 대한 협약은 달리 명시되지 않는 한 최신 버전을 사용하는 것입니다.
Titus

많은 사람들이 최신 마이너 버전을 가지고 있다고 생각하지 않습니다. 현재 가장 일반적인 분모는 5.5 일 것입니다. 개인적으로 저는 현재 PHP 7.0을 배포하는 FC 25 (예쁜 최첨단으로 간주)를 사용하고 있습니다. Windows를 사용하는 경우 수동으로 업데이트해야합니다.
16:16

4

매스 매 티카, 46 44 42 바이트

각각 2 바이트를 절약 한 alephalpha와 DavidC에게 감사드립니다!

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

명명되지 않은 함수는 두 개의 정수 인수를 사용하여 정수를 반환합니다. IntegerDigits@Range@##입력 사이의 모든 숫자를 숫자 목록으로 변환합니다. FreeQ@5이 목록을 테스트하여 어떤 목록이 포함되어 있지 않은지 결정합니다 5. 그런 다음 Boole부울을 0과 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그런 다음 0이 아닌 모든 숫자를 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

자바 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
맥머도

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:) 또한 Python2를 사용하는 경우 x``따옴표 대신``을 둘러 쌀 수 있습니다 str(x).
Yytsi

트윗 담아 가기 in과`x` 사이의 공간을
제거함

를 제거 할 수 있습니다 []. 당신은 또한 전에 공간이 필요하지 않습니다 if.
데니스

@Dennis 이미 시도했지만 "generator '유형의 개체에는 len ()이 없다고 불평합니다.
Yytsi

@TuukkaX 맞아. lambda a,b:sum(not"5"in`n`for n in range(a,b+1))그래도 작동합니다. tio.run/nexus/…
Dennis

2

스위프트 52 바이트

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

챌린지는 코드 골프 챌린지이므로 바이트 수를 포함해야합니다. 또한 codegolf (적어도 여기)에서는 모든 프로그램 뮤즈가 실제로 경쟁해야합니다 (예 : 함수 이름은 단일 문자 일 수 있으며 실제 함수는 한 줄로 줄어 듭니다). 나는 스위프트를 모른다. 당신은 나를 교정해야 할지도 모른다.
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매개 변수를 다시 잊어 버렸습니다 .
Titus

2

CJam "쉬운 순수 수학 솔루션", 60

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

온라인으로 사용해보십시오

배열에서 어떤 순서로든 숫자를 가져옵니다.

설명:

한 가지 핵심 문제는 f (n) = 모든 양수 n에 대해 1에서 n까지 (비 포함) 5가 아닌 숫자의 수를 계산하는 것입니다. 답은 n의 십진수를 취하고 처음 5 이후의 모든 숫자 (있는 경우)를 9로 바꾼 다음 모든 숫자 5..9를 4..8 (감소)로 바꾸고 밑 9에서 변환합니다. 예 : 1752 → 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를 구현 한 다음 (배열의 각 숫자에 적용) 입력을 읽고 숫자를 절대 값으로 변환하고 순서를 다시 정한 다음 위의 두 가지 계산 중 하나를 사용합니다. 처음에는 * b> 0입니다.


"순수한"것이 아니라 좋은 방법입니다. 여기 +1 :)
Matthew Roh

@ MatthewRoh 감사하지만 순수하지 않은 것은 무엇을 의미합니까? 범위를 반복하지 않고 입력 숫자에 대한 수학적 계산을 상당히 지시하는 솔루션입니다. 그 밖의 무엇을 기대하고 있었습니까?
aditsu

2

파이썬 2 , 54 바이트

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

온라인으로 사용해보십시오!

가장 짧은 Python 답변은 아닙니다. 동일한 알고리즘을 사용하지만 while 루프로 구현하는 다른 방법을 사용하며 람다 함수가 아닙니다.


기능이 아닌 프로그램이며 대신 사용합니다. 다르지 않은가? OK, 그것은 여전히 ​​증가 된 입력 내에서 문자열 "5"를 찾고 있습니다. 더 좋은 방법이 있습니까?
ElPedro

그것이 바로 그것이 기 때문이며 그것이 이유입니다. 죄송합니다. 내 의견이 다를 수도 있습니다.
ElPedro

동일한 알고리즘, 다른 구현 방법. 당신의 의견에는 문제가 없습니다. 더 나은 말입니까?
ElPedro

그것은 그렇습니다 :) 주석 섹션을 깨끗하게 보이게하기 위해 이러한 주석을 제거합니다.
Yytsi

1

자바 7, 77 바이트

이것은 Kevins Answer 의 개선 사항 이지만 아직 언급 할 평판이 없기 때문에이 새로운 대답이 필요합니다.

그래서 내가 한 일은 :

  • indexOf명령문을 contains(-1 바이트)로 바꾸십시오 .
  • for 루프의 증분 부분을 조건문 (-2 바이트)으로 이동

for 루프 ( 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")없습니까?
Christoph

1
Java에서는 부울이 실제로 부울이기 때문에 @Christoph 슬프게도 아니요. 따라서 삼항 연산이 유일한 방법입니다.
Tobias Meister

흠, 슬프다. 무엇에 대해 (""+a).contains("5")||r++?
Christoph

1
@Christoph는 자체적으로 부울 식을 가질 수 없기 때문에 작동하지 않습니다. for-loop 선언과 같은 다른 곳에서 작동하도록 노력했지만 많은 성공을 거두지 못했습니다. 좋은 생각 tho;)
Tobias Meister

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

자바 스크립트 (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));

7 개 바이트 감사 Golfed ETHproductions을 .


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(제 1 개수) 및 m문자열 수납 통해 입력으로서 (마지막 번호), 다음 수표 ( "".Contains("")).


필자는 다운 보트가 아니지만 모듈로 5는 OP의 도전에 대한 올바른 해결책이 아닙니다. 숫자 5에 숫자 가 포함 된 것을 제외해야 하므로 10(답이 계산되지 않는) 계산되어야합니다.
Kevin Cruijssen

@KevinCruijssen 수정되었습니다.
devRicher

이것은 g이름이 명시되어있을 때 초기화 될 때 컴파일되지 않으므로 var필요에 따라 var g="";카레를 사용할 수 있습니다n=>m=>
TheLethalCoder

또한 이것은 카운트가 아닌리스트를 출력합니다
TheLethalCoder

1
@KevinCruijssen 당신의 편집으로 이것은 본질적으로 내 대답입니다 ...
TheLethalCoder

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.