자연수의 행


22

정의

연결된 자연수의 무한 행이 있습니다 (양의 정수, 1로 시작) :

1234567891011121314151617181920212223...

도전

  • 위치 번호를 입력으로 받아들이고 위에 정의 된 행에서 해당 위치의 숫자를 출력하는 모든 언어로 프로그램을 작성하십시오.
  • 위치 번호는 임의의 크기 양의 정수입니다. 첫 번째 위치는 1이며 출력 숫자는 '1'입니다.
  • 입력은 10 진수 (예 : 13498573249827349823740000191)이거나 양의 정수에 해당하는 e- 표기 (예 : 1.2e789)입니다.
  • 입력으로 매우 큰 인덱스 (예 : 1e123456-1은 123456 0) 인 경우 프로그램은 합리적인 시간 (현대 PC / Mac에서 10 초)으로 종료해야합니다. 따라서 간단한 반복 루프는 허용되지 않습니다.
  • 유효하지 않은 입력이 주어지면 프로그램은 1 초 안에 오류와 함께 종료되어야합니다. 예 : 1.23e (잘못된) 또는 1.23e1 (12.3과 같음-정수 아님)
  • 공개 BigNum 라이브러리를 사용하여 숫자를 구문 분석 / 저장하고 간단한 수학적 연산 (+-* / exp)을 수행해도됩니다. 바이트 페널티가 적용되지 않습니다.
  • 가장 짧은 코드가 승리합니다.

TL; DR

  • 입력 : bignum integer
  • 출력 : 무한 행의 해당 위치에있는 숫자 123456789101112131415...

일부 합격 시험 사례

"입력 : 출력"표기법. 그들 모두는 통과해야합니다.

  • 1 : 1
  • 999 : 9
  • 10000000 : 7
  • 1e7 : 7 (위의 행과 동일)
  • 13498573249827349823740000191 : 6
  • 1.1e10001 : 5
  • 1e23456 : 5
  • 1.23456e123456 : 4
  • 1e1000000 : 0
  • 1.23e : 오류 (유효하지 않은 구문)
  • 0 : 오류 (범위를 벗어남)
  • 1.23e1 : 오류 (정수가 아님)

보너스!

숫자 안의 숫자 위치 번호를 출력하고 숫자 자체를 출력합니다. 예를 들면 다음과 같습니다.

  • 13498573249827349823740000191: 6 24 504062383738461516105596714
    • 숫자 '50406238373846151610559 6 714' 의 위치 24에서 숫자 ' 6 '입니다.
  • 1e1000000: 0 61111 1000006111141666819445...933335777790000
    • 999995 자리 긴 숫자의 61111 위치에있는 숫자 '0'은 여기에 포함하지 않습니다.

보너스 작업을 수행하면 코드 크기에 0.75를 곱하십시오.

신용

이 작업은 2012 년에 많은 수의 요구 사항없이 devclub.eu 모임 중 하나에서 이루어졌습니다. 따라서 제출 된 대부분의 답변은 사소한 루프였습니다.

즐기세요!


나는 도전이 무엇인지 정말로 얻지 못한다. 우리는 입력을 받아 그 위치에서 숫자를 출력해야합니까?
The_Basset_Hound

1
이것은 OEIS 시퀀스 33307 입니다.
Tyilo

2
@vihan 일부 공용 bignum 라이브러리를 사용할 수 있습니다. 페널티 없음. 물론 솔루션을 라이브러리에 포함시키고 라이브러리를 하나의 라이너로 사용하는 것은 부정 행위를 고려하고 있습니다. 여기에는 상식이 적용됩니다.
metalim

1
44 바이트에서 클럭킹 되는 놀랍도록 간결한 F # 솔루션 을 보여주고 싶었습니다 . 물론 최대 2 ^ 31-1까지의 인덱스 만 처리 할 수 ​​있습니다 (그리고이 값을 작성할 때 해당 값을 계산하려고 시도 함). 실제로 규칙을 위반하기 때문에이 게시물을 게시하지는 않지만 F #에는 꽤 좋습니다!
Jwosty

7
1.23456e123456임의의 입력을 처리하기위한 요구 사항은 이러한 값을 기본적으로 처리 할 수없는 언어를 처벌하고 해당 과제에 접하는 문자열 처리를 수행하도록 요구합니다.
xnor

답변:


12

CJam , 78 바이트

r_A,s-" e . .e"S/\a#[SSS"'./~'e/~i1$,-'e\]s"0]=~~_i:Q\Q=Qg&/
s,:L{;QAL(:L#9L*(*)9/-_1<}g(L)md_)p\AL#+_ps=

프로그램의 길이는 104 바이트이며 보너스를받을 자격이 있습니다.

줄 바꿈은 순전히 화장품입니다. 첫 번째 줄은 입력을 구문 분석하고 두 번째 줄은 출력을 생성합니다.

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

생각

임의의 양의 정수를 들어 K 있다 9 × 10 K-1 정확하게의 양의 정수 K 자리 (선두 제로를 계산하지 않음). 우리가 그들 전부를 연결할 경우에 따라서, 우리의 정수를 구하는 9 × N × 10 K-1 .

이제 n 이하 의 모든 정수를 연결 하면 정수가

공식

숫자.

주어진 입력 q 에 대해 위의 표현식이 q 보다 작 도록 가장 높은 n을 결정하려고 시도합니다 . 우리 세트 N = ⌈log 10 q⌉-1 , 다음, N = ⌈log 10 q⌉-2 등을 표현하고자보다 작아 질 때까지 (Q) 에서 얻어진 식 감산 Q가 (항복 R ) 및 최종 저장 값 NL .

R 현재의 모든 양의 정수의 연결에 인덱스 지정 L + 1 개 원하는 출력이되는 것을 의미 숫자 R의 %을 (L + 1) 번째 의 숫자 / (L + 1) (R) 번째 의 정수 L + 1 숫자.

코드 (입력 파싱)

r_          e# Read from STDIN and duplicate.
A,s-        e# Remove all digits.
" e . .e"S/ e# Push ["" "e" "." ".e"].
\a#         e# Compute the index of the non-digit part in this array.

[SSS"'./~'e/~i1$,-'e\]s"0]

            e# Each element corresponds to a form of input parsing:
            e#   0 (only digits): noop
            e#   1 (digits and one 'e'): noop
            e#   2 (digits and one '.'): noop
            e#   3 (digits, one '.' then one 'e'):
            e#     './~    Split at dots and dump the chunks on the stack.
            e#     'e/~    Split the and chunks at e's and dump.
            e#     i       Cast the last chunk (exponent) to integer.
            e#     1$      Copy the chunk between '.' and 'e' (fractional part).
            e#     ,-      Subtract its length from the exponent.
            e#     'e\     Place an 'e' between fractional part and exponent.
            e#     ]s      Collect everything in a string.
            e#   -1 (none of the above): push 0

~           e# For s string, this evaluates. For 0, it pushes -1.
~           e# For s string, this evaluates. For -1, it pushes 0.
            e# Causes a runtime exception for some sorts of invalid input.
_i:Q        e# Push a copy, cast to Long and save in Q.
\Q=         e# Check if Q is numerically equal to the original.
Qg          e# Compute the sign of Q.
&           e# Logical AND. Pushes 1 for valid input, 0 otherwise.
/           e# Divide by Q the resulting Boolean.
            e# Causes an arithmetic exception for invalid input.

코드 (출력 생성)

s,:L     e# Compute the number of digits of Q and save in L.
{        e# Do:
  ;      e#   Discard the integer on the stack.
  Q      e#   Push Q.
  AL(:L# e#   Push 10^(L=-1).
  9L*(   e#   Push 9L-1.
  *)     e#   Multiply and increment.
  9/     e#   Divide by 9.
  -      e#   Subtract from Q.
  _1<    e#   Check if the difference is non-positive.
}g       e# If so, repeat the loop.
(        e# Subtract 1 to account for 1-based indexing.
L)md     e# Push quotient and residue of the division by L+1.
_)p      e# Copy, increment (for 1-based indexing) and print.
\AL#+    e# Add 10^L to the quotient.
_p       e# Print a copy.
s        e# Convert to string.
2$=      e# Retrieve the character that corresponds to the residue.

5

CJam, 75 * 0.75 = 56.25

이것은 원하는 위치를 포함하는 숫자의 자릿수마다 한 번씩 반복됩니다. 골프를 더 많이 할 수 있다고 확신합니다.

q~_i_@<{0/}&:V9{VT>}{T:U;_X*T+:T;A*X):X;}w;U-(_X(:X/\X%10X(#@+s_2$\=S+@)S+@

위치를 입력으로 지정하면 출력은 다음과 같습니다.

<digit> <position> <full number>

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


@Dennis 모든 입력 작업 :)
Andrea Biondo

그래도 여전히 오류가 발생하지 않습니다 1.23e1. 그러나 1.23456e123456입력이 Double로 표현 될 수 없으므로에 대한 오류가 발생합니다 . 또한 마지막 테스트 사례는 3 분이 걸립니다.
Dennis

2
@Dennis 이제 오류가 발생합니다. 큰 테스트 사례는 ... 젠장 모든 것을 다시 써야 할 수도 있습니다.
Andrea Biondo 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.