정수 발생 횟수 [닫힘]

질문에 기초하여 1,000,000 미만의 양의 정수는 숫자 2를 포함합니까? . 나는에서 모든 정수를 계산하는 가장 창조적 인 솔루션을 찾고 있어요 XY정수를 포함 Z. Z0에서 사이 일 수 있습니다 Y.

발견 된 모든 정수는 정수 Z가 더 자주 나타나는 경우에도 한 번만 계산 합니다. 예를 들면 다음과 같습니다.

Z = 2
123 counts 1
22222 also counts 1

Java로 작성된 매우 간단한 알고리즘부터 시작하겠습니다 (모든 사람이 사랑하기 때문에).

public class Count {
    public static void main(String[] args) {
        int count = 0;
        for (int i = Integer.parseInt(args[0]); i <= Integer.parseInt(args[1]); i++) {
            if (Integer.toString(i).contains(args[2])) {
                count++;
            }
        }
        System.out.println(count);
    }
}

이걸로 실행하면

java -jar Count.jar 0 1000000 2

결과로 이것을 얻습니다.

468559

이 문제는 해결하기 어렵지 않기 때문에 입니다. 2 월 28 일에 게시 된 가장 많이 투표 된 답변이 승리합니다!



답변

배쉬 (20)

seq $1 $2|grep -c $3

용법

$ bash count.sh 0 1000000 2
468559

답변

펀시 턴

평상시처럼 StackExchange에서 추가 한 줄 높이가 줄을 나누 $('pre').css('line-height',1)므로 브라우저 콘솔에서 실행 하여 문제를 해결하십시오.

다른 Funciton 답변과 달리이 함수는 함수 선언을 사용하지 않습니다. 프로그램 일뿐입니다. 그러나 람다 식을 사용합니다. 12 월에 Funciton에 추가 한 기능입니다. 🙂

공백으로 구분 된 3 개의 10 진수 (음수 일 수 있음)로 입력을 예상합니다 (예 🙂 x y z. 실제로, z임의의 문자열이 될 수 있습니다. 예를 들어, 간격에서 음수의 수를 세는 것은 빼기 부호 ( , U + 2212) 일 수 있습니다. 🙂

           ┌───╖
     ┌───┬─┤ ♯ ╟──────────┐
     │   │ ╘═══╝ ╔════╗ ┌─┴─╖             ┌────╖ ╔═══╗
   ┌─┴─╖ └────┐  ║ 21 ║ │ × ╟─────────────┤ >> ╟─╢   ║
 ┌─┤ ʃ ╟───┐  │  ╚══╤═╝ ╘═╤═╝             ╘═╤══╝ ╚═══╝
 │ ╘═╤═╝   │  └──┐  └─────┘   ┌───────────┐ │
 │ ╔═╧═╗ ┌─┴─╖ ┌─┴─╖ ╔════╗ ┌─┴─╖   ┌───╖ ├─┴────────┐
 │ ║   ╟─┤ · ╟─┤ ʘ ╟─╢ 32 ╟─┤ · ╟───┤ ʘ ╟─┘          │
 │ ╚═══╝ ╘═╤═╝ ╘═══╝ ╚════╝ ╘═╤═╝   ╘═╤═╝ ┌─────┐    │
 │         └───────┐  ╔═══╗ ┌─┴─╖     │ ┌─┴─╖   │    │
 │ ┌───────────┐   └──╢ 0 ╟─┤ ʃ ╟─┐   │ │ ♯ ║   │    │
 │ │   ┌───╖ ┌─┴─╖    ╚═══╝ ╘═╤═╝ │   │ ╘═╤═╝ ┌─┴─╖  │
 │ │ ┌─┤ ♯ ╟─┤   ╟─┬─┐ ╔════╗ │ ┌─┴─╖ │   │ ┌─┤ × ║  │
 │ │ │ ╘═══╝ └─┬─╜ └─┘ ║ −1 ║ └─┤ · ╟─┴───┘ │ ╘═╤═╝  │
 │ │ │    ┌────┴────┐  ╚══╤═╝   ╘═╤═╝       │ ╔═╧══╗ │
 │ │ │    │ ┌───╖ ┌─┴─╖ ┌─┴─╖ ┌───┴─────╖   │ ║ 21 ║ │
 │ │ │    └─┤ ♯ ╟─┤ ? ╟─┤ = ║ │ str→int ║   │ ╚════╝ │
 │ │ │      ╘═══╝ ╘═╤═╝ ╘═╤═╝ ╘═╤═══════╝   │ ┌────╖ │
 │ │ │      ╔═══╗ ┌─┴─╖   └─┐ ┌─┴─╖         └─┤ >> ╟─┘
 │ │ │      ║ 0 ╟─┤ ? ╟─┐   └─┤ · ╟───┐       ╘═╤══╝
 │ │ │      ╚═══╝ ╘═╤═╝ └─┐   ╘═╤═╝   └───┐   ┌─┴─╖
 │ │ │            ┌─┴─╖   └─┐ ┌─┴─╖       └───┤ ʘ ║
 │ │ └────────────┤ · ╟─┐   └─┤ ≤ ║           ╘═╤═╝
 │ │              ╘═╤═╝ │     ╘═╤═╝ ┌─────────╖ │
 │ │        ╔═══╗ ╔═╧═╕ │       └─┬─┤ int→str ╟─┘
 │ │        ║ 0 ╟─╢   ├─┤         │ ╘═════════╝
 │ │        ╚═══╝ ╚═╤═╛ └─────────┘
 │ └────────────────┴─┐              │
 │    ┌─────────╖   ┌─┴─╖ ┌─┐   ┌────┴────╖
 └────┤ str→int ╟───┤   ╟─┴─┘   │ int→str ║
      ╘═════════╝   └─┬─╜       ╘════╤════╝
                      └──────────────┘

답변

씨#

public class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine(Enumerable.Range(Convert.ToInt32(args[0]), (Convert.ToInt32(args[1]) + 1) - Convert.ToInt32(args[0])).Count(x => x.ToString().Contains(args[2])));
    }
}

count.exe 0 1000000 2
468559

답변

APL (29)

{+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵}

이것은 Z왼쪽 인수로 사용하고 간격 [X,Y]을 오른쪽 인수로 사용하는 함수입니다.

      2 {+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵} 0 1e6
468559
      0 {+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵} 0 1e6
402131
      42 {+/∨/¨(⍕⍺)∘⍷¨⍕¨⊃{⍺+0,⍳⍵-⍺}/⍵} 0 1e6
49401

답변

파이썬 2.7

속도 필요

설명

이행

def Count(lo,hi,key):
    if hi == 0: return 0
    # Count(lo,hi,key) = Count(0,hi,key) - Count(0,lo - 1,key)
    if lo != 0: return Count(0, hi, key) - Count(0, lo - 1, key)
    # Calculate no of digits in the number to search
    # LOG10(hi) may be a descent trick but because of float approximation
    # this would not be reliable
    n = len(str(hi)) - 1
    # find the most significant digit
    a_n = hi/10**n
    if a_n < key:
        count = a_n*(10**n - 9**n)
    elif a_n > key:
        count = (a_n - 1)*(10**n - 9**n) + 10**n
    else:
        count = a_n*(10**n - 9**n) + 1
    if hi % 10**n != 0:
        if a_n != key:
            return count + Count(0, hi%10**n, key)
        else:
            return count + hi%10**n
    else:
        return count

데모

In [2]: %timeit Count(0,123456789987654321,2)
100000 loops, best of 3: 13.2 us per loop

비교

@ 데니스

$ \time -f%e bash count.sh 0 1234567 2
585029
11.45

아리따움

In [6]: %timeit count(0,1234567,2)
1 loops, best of 3: 550 ms per loop

답변

파이썬 2.7

정규식을 사용하는 솔루션 :

>>> from re import findall as f
>>> count=lambda x,y,z:len(f('\d*%d\d*'%z,str(range(x,y+1))))
>>>
>>> count(0,1000000,2)
468559

답변

배쉬- 32 31 17 14 자 + X, Y 및 Z 길이

제안 해 주신 devnull에게 감사드립니다 seq!

seq [X] [Y]|grep -c [Z]

예 : X = 100, Y = 200, Z = 20

$ seq 100 200|grep -c 20
2

예 : X = 100, Y = 200, Z = 10

$ seq 100 200|grep -c 10
11

예 : X = 0, Y = 1000000, Z = 2

$ seq 0 1000000|grep -c 2
468559