Wiersz liczb naturalnych

22

Definicja

Istnieje nieskończony rząd połączonych liczb naturalnych (dodatnie liczby całkowite, zaczynające się od 1):

1234567891011121314151617181920212223...

Wyzwanie

  • Napisz program w dowolnym języku, który przyjmuje numer pozycji jako dane wejściowe i wypisuje cyfrę z tej pozycji w wierszu zdefiniowanym powyżej.
  • Numer pozycji jest liczbą całkowitą dodatnią o dowolnym rozmiarze. To jest pierwsza pozycja to 1, co daje cyfrę wyjściową „1”
  • Dane wejściowe są albo w systemie dziesiętnym (np. 13498573249827349823740000191), albo w e-notacji (np. 1,2e789) odpowiadającej dodatniej liczbie całkowitej.
  • Program musi zakończyć się w rozsądnym czasie (10 sekund na nowoczesnym komputerze PC / Mac), biorąc pod uwagę bardzo duży indeks jako dane wejściowe (np. 1e123456 - czyli 1 z 123456 zerami). Zatem prosta pętla iteracji jest niedopuszczalna.
  • Program musi zakończyć się z błędem w ciągu 1 s, jeśli otrzyma jakiekolwiek nieprawidłowe dane wejściowe. Na przykład. 1.23e (niepoprawny) lub 1.23e1 (odpowiada 12,3 - nie jest liczbą całkowitą)
  • Można używać publicznej biblioteki BigNum do analizowania / przechowywania numerów i wykonywania prostych operacji matematycznych na nich (+ - * / exp). Nie zastosowano kary bajtowej.
  • Najkrótszy kod wygrywa.

TL; DR

  • Dane wejściowe: liczba całkowita bignum
  • Wyjście: cyfra w tej pozycji w nieskończonym rzędzie 123456789101112131415...

Niektóre przypadki testów akceptacyjnych

w notacji „Wejście: Wyjście”. Wszyscy powinni przejść.

  • 1: 1
  • 999: 9
  • 10000000: 7
  • 1e7: 7 (taki sam jak wiersz powyżej)
  • 13498573249827349823740000191: 6
  • 1.1e10001: 5
  • 1e23456: 5
  • 1.23456e123456: 4
  • 1e1000000: 0
  • 1.23e: błąd (niepoprawna składnia)
  • 0: błąd (poza zakresem)
  • 1.23e1: błąd (nie liczba całkowita)

Premia!

Numer pozycji wyjściowej cyfry wewnątrz numeru i sam numer wyjściowy. Na przykład:

  • 13498573249827349823740000191: 6 24 504062383738461516105596714
    • To jest cyfra „6” w pozycji 24 numeru „50406238373846151610559 6 714”
  • 1e1000000: 0 61111 1000006111141666819445...933335777790000
    • Cyfra „0” na pozycji 61111 o długości 999995 cyfr, której nie będę tutaj uwzględniać.

Jeśli wykonasz zadanie premiowe, pomnóż rozmiar swojego kodu przez 0,75

Kredyt

To zadanie zostało powierzone na jednym ze spotkań devclub.eu w 2012 roku, bez dużej liczby wymagań. W związku z tym większość przesłanych odpowiedzi była trywialnymi pętlami.

Baw się dobrze!

metalim
źródło
Naprawdę nie rozumiem, jakie jest wyzwanie. Czy mamy przyjmować dane wejściowe i wyjściowe liczby w tej pozycji?
The_Basset_Hound
1
To jest sekwencja OEIS 33307 .
Tyilo,
2
@vihan Dopuszczalne jest używanie publicznej biblioteki bignum. Bez kary. Oczywiście włączenie rozwiązania do biblioteki i użycie biblioteki w jednym wierszu rozważa oszukiwanie. Obowiązuje tu zdrowy rozsądek.
metalim
1
Chciałem tylko pochwalić się zaskakująco zwięzłym rozwiązaniem F # , z taktowaniem 44 bajtów. To prawda, że ​​może obsłużyć tylko indeksy do 2 ^ 31-1 (i wciąż próbuje obliczyć tę wartość, gdy to piszę). Nie publikuję tego jednak, ponieważ to rzeczywiście łamie zasady, ale powiedziałbym, że jest całkiem dobry dla F #!
Jwosty
7
Wymagania dotyczące obsługi danych wejściowych, takich jak 1.23456e123456arbitralnie, karzą języki, które nie mogą przetwarzać takich wartości w sposób natywny i wymagają przetwarzania ciągów, które są styczne do wyzwania.
xnor

Odpowiedzi:

12

CJam , 78 bajtów

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=

Program ma długość 104 bajtów i kwalifikuje się do otrzymania premii.

Nowa linia jest czysto kosmetyczna. Pierwszy wiersz analizuje dane wejściowe, drugi generuje dane wyjściowe.

Wypróbuj online!

Pomysł

Dla każdej dodatniej liczby całkowitej k istnieje 9 × 10 k-1 dodatnich liczb całkowitych dokładnie k cyfr (nie licząc zer wiodących). Zatem łącząc je wszystkie, otrzymujemy liczbę całkowitą 9 × n × 10 k-1 .

Teraz łączenie wszystkich liczb całkowitych n lub mniej daje liczbę całkowitą

formuła

cyfry

Dla danego wejścia q próbujemy ustalić najwyższą wartość n, tak aby powyższe wyrażenie było mniejsze niż q . Ustawiamy n: = ⌈log 10 q⌉-1 , a następnie n: = ⌈log 10 q⌉-2 itd., Aż żądane wyrażenie stanie się mniejsze niż q , odejmij wynikowe wyrażenie od q (dając r ) i zapisz ostatnie wartość n w l .

R obecnie określa indeks złączonych dodatnich liczb całkowitych L + 1 cyframi, co oznacza, że sygnał wyjściowy IS r% (L + 1) p cyfra R / (L + 1) p całkowitą L + 1 cyfry

Kod (parsowanie danych wejściowych)

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.

Kod (generowanie danych wyjściowych)

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.
Dennis
źródło
5

CJam, 75 * 0,75 = 56,25

Jest to dość szybkie, jedna iteracja na cyfrę liczby zawierającej żądaną pozycję. Jestem pewien, że można grać w golfa o wiele więcej, jest dość prymitywny.

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

Podaj pozycję jako dane wejściowe, dane wyjściowe to:

<digit> <position> <full number>

Wypróbuj online .

Andrea Biondo
źródło
@Dennis Pracuję teraz ze wszystkimi danymi wejściowymi :)
Andrea Biondo
To nadal nie powoduje błędu (tak jak powinien) 1.23e1. Błąd jednak, 1.23456e123456ponieważ wejście nie może być reprezentowane przez Double. Ponadto ostatnie przypadki testowe trwają 3 minuty.
Dennis
2
@Dennis Teraz podnosi błąd. Co do wielkiego przypadku testowego ... Cholera. Być może będę musiał przepisać całość.
Andrea Biondo,