주어진 범위 내에서 행운의 티켓을 세십시오. 자리 숫자는 운이 좋은 것으로 간주됩니다 . 사진의

러시아에는 전통과 같은 것이 있습니다. 행운의 티켓을 찾는 것을 좋아합니다.

일반 항공권은 다음과 같습니다.

bus ticket

보시다시피 티켓에는 6 자리 숫자가 있습니다.

처음 세 자리의 합이 마지막 세 자리의 합과 같은 경우 6 자리 숫자는 운이 좋은 것으로 간주됩니다 .

사진의 숫자는 운이 좋지 않습니다.

038937
038 937
0 + 3 + 8 = 11
9 + 3 + 7 = 19
11 != 19

도전

범위 제한을 포함하여 (범위 포함) 그 안에 포함 된 행운의 티켓 번호 수를 반환합니다.

매개 변수

  • 입력 : 2 개의 정수 : 범위의 첫 번째 정수와 마지막 정수
  • 입력 값은 0에서 999999 사이입니다.
  • 출력 : 1 정수 : 범위에있는 행운의 숫자 수
  • 입력을 받아 허용되는 형식으로 출력을 반환 할 수 있습니다
  • 100000보다 작은 숫자의 앞에 0을 가정하십시오.

0, 1 => 1
100000, 200000 => 5280
123456, 654321 => 31607
0, 999999 => 55252

이것은 이므로 모든 언어에서 가장 짧은 바이트 단위의 대답이 이깁니다.

업데이트 : 여기 행운의 것이 있습니다.



답변

05AB1E , 8 (또는 10?) 11 (또는 13?) 바이트

Ÿʒ₄n+¦S3ôOË

온라인으로 시도 하거나 더 많은 테스트 사례를 확인 하십시오 .

참고 : 05AB1E에서 문자열과 정수는 서로 바꿔서 사용할 수 있으므로 출력 숫자에 선행 0이 포함되지 않습니다. 그러나 이것은 1 추가 바이트 ( 12 바이트) 로 고정 될 수 있습니다 ) .

Ÿ₄n+€¦ʒS3ôOË

온라인으로 사용해보십시오 하거나 더 많은 테스트 사례를 확인 .

길이가 3 이하인 버그 수정 번호에 +3 바이트 (범위) [000000, 000999] ).

설명:

Ÿ          # Create an inclusive (on both sides) range from the two inputs
           #  i.e. 038920 and 038910 → 
           #   [38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920]
 ʒ         # Filter this list by:
  n+      #  Add 1,000,000 to the number
     |     #  And remove the leading 1
           #   i.e. 38910 → 1038910 → '038910'
  S        #  Transform it to a list of digits
           #   i.e. '038910' → ['0','3','8','9','1','0']
   3ô      #  Split it into chunks of length 3
           #   i.e. ['0','3','8','9','1','0'] → [['0','3','8'],['9','1','0']]
     O     #  Sum the digits in both parts
           #   i.e. [['0','3','8'],['9','1','0']] → [11,10]
      Ë    #  Check if they are equal (if they are, they remain in the filtered list)
           #   i.e. [11,10] → 0

편집 : 나 (그리고 대부분의 다른 답변)가 도전을 약간 잘못 읽은 것으로 보이며 범위 내의 숫자 자체 대신 숫자의 양을 묻는 것입니다. 이 경우 후행 }g을 추가 할 수 있습니다 (필터를 닫고 필터링 된 목록에 남아있는 숫자의 양을 얻음). 대신 10 13 바이트입니다 .

Ÿʒ₄nS3ôOË}g

온라인으로 시도 하거나 더 많은 테스트 사례를 확인 하십시오 .


답변

C # (. NET 코어) , 93 + 18 = 111 바이트

a=>b=>Enumerable.Range(a,b-a+1).Select(e=>$"{e:D6}").Count(e=>e[0]+e[1]+e[2]==e[3]+e[4]+e[5])

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

18 바이트 using System.Linq;. 입력 및 출력 형식이 유연 할 수 있다고 가정했습니다. 그래서 두 개의 정수를 입력으로 사용합니다 (범위 포함).

일부 테스트 결과 :

a=1000
b=1100

Lucky numbers = 3 [001001, 001010, 001100]

a=2000
b=2100

Lucky numbers = 3 [002002, 002011, 002020]

a=222000
b=222100

Lucky numbers = 7 [222006, 222015, 222024, 222033, 222042, 222051, 222060]

a=0
b=999999

Lucky numbers = 55252 (that's 5.5% of the total numbers)

답변

자바 스크립트 (ES6), 66 바이트

currying 구문에서 입력을 받습니다. (m)(n)여기서 m배타적 상한값이고 n배타적 인 하한값입니다.

m=>g=n=>n<=m&&![...n+=''].reduce((t,d,i)=>t-=n[i+3]?d:-d,0)+g(-~n)

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

어떻게?

우리 는 숫자 d i 를 걷고 총 t를 업데이트하여 각 숫자 을 테스트합니다 .

n

di

t
  • 이 뒤에 3 자리 이상의 숫자가 남아 있으면
    t←t−di

  • 달리
    t←t+di

프로세스의 끝에 이 있으면 n 은 행운의 숫자입니다.

t=0

n

자바 스크립트 (ES6), 67 바이트

동일한 입력 형식.

m=>g=n=>n<=m&&!eval([...n/1e3+''].join`+`.split`+.`.join`^`)+g(n+1)

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

어떻게?

각 숫자 :

n
  • 나눕니다 : 예
    1000

    38937 --> 38.937
  • 줄로 강제하고 분열 : ['3','8','.','9','3','7']
  • 와 함께 +:"3+8+.+9+3+7"
  • 대체 +.와 함께 ^:"3+8^+9+3+7"
  • JS 코드로 평가하고 결과가 인지 테스트하십시오 . ( 11 XOR 19 )
    0

    24 11

    19

n 0 인 경우 이면 소수점이 생성되지 않으며 n = 0 (truthy)이아닌 한 평가 된 표현식은 양의 합(거짓)입니다. 두 경우 모두 예상되는 결과입니다.

n≡0(mod1000)

n=0

답변

루비 , 56 54 바이트

->a,b{(a..b).count{|i|j=i.digits;j[0,3].sum*2==j.sum}}

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

방법:

  1. 모든 숫자에 대해 숫자의 배열을 만듭니다 (반대 됨)
  2. 배열의 처음 3 자리 숫자 (숫자의 마지막 3)에 2를 곱한 값을 전체 배열의 합계와 비교합니다.
  3. 두 합이 같은 수를 센다

답변

apt , 38 15 바이트

õV Ëì ò3n)mx r¥

Shaggy에게 -23 감사합니다!

나의 첫번째 Japt 제출; 모든 도움을 주신 Shaggy에게 감사드립니다!

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


답변

파이썬 3 117 113 106 135 바이트

이것은 나의 첫 번째 대답이므로 개선의 여지가 있다고 확신합니다.

def x(a,b):
    n=0
    for i in range(a,b+1):
        if sum(map(int,str(i//1000)))==sum(map(int,str(i%1000))):n+=1
    print(n)
  • WW 덕분에 -4 바이트
  • Asone Tuhid 덕분에 -7 바이트
  • 함수를 생성하기위한 +29 바이트

정수 나누기를 통해 처음 세 자리를 가져오고 마지막 세 자리를 모듈로 통해 가져옵니다. 범위의 첫 번째 정수와 마지막 정수는 각각 xas a및 로 함수의 인수로 입력됩니다 b. 출력이 n인쇄됩니다.

언 골프 드 :

def x(a, b):
    n = 0
    for i in range(a, b + 1):
        if sum(map(int, str(i // 1000))) == sum(map(int, str(i % 1000))):
            n += 1
    print(n)

답변

R , 93 86 바이트

@ Giuseppe /의 최종 칭찬에 더 짧은 논리

function(a,b){for(i in sprintf("%06d",a:b)){x=utf8ToInt(i);F=F+!sum(x[1:3]-x[4:6])}
F}

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

정수 입력. 로 채 웁니다 0. 6 개의 ASCII 코드 포인트로 변환하십시오. F내장을 남용하십시오 .