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