Zadanie:
Twoim zadaniem jest podanie trzech danych wejściowych:
- licznik
n
- mianownik
d
- inna liczba całkowita,
x
Utwórz program / funkcję, która znajdzie x
dziesiątą cyfrę po przecinku.
Okular:
- Zakres
n
id
jest pomiędzy1
i2^31 - 1
włącznie. - Zakres
x
wynosi od1
i10,000,000
włącznie.- Możesz wybrać indeksowanie 1 lub 0
x
. Podaj w swojej odpowiedzi, którego używasz.
- Możesz wybrać indeksowanie 1 lub 0
n
może być większy niżd
.n
,d
Ix
są gwarancją całkowite dodatnie (dla wersji indeksu 1 opartejx
, jeśli zdecydujesz się skorzystać 0 indeksowanie oparte nax
czymx
może być0
).- Możesz przyjmować dane wejściowe w dowolny rozsądny sposób (tj. W dowolny sposób, który nie jest standardową luką).
Zasady:
- Musisz zwrócić dokładną
x
cyfrę th, nie po zaokrągleniu - więc np.15
Cyfra th1/6
nie jest7
, ale6
. - Twój program musi działać dla wszystkich
x
poniżej 10 milionów, chyba że Twój język nie obsługuje miejsc dziesiętnych do 10 milionów miejsc.
Przykład I / O:
W przykładowym danych wejściowych zastosowano indeksowanie oparte na 0, co oznacza, że x
nastąpi przejście od 0
do 9,999,999
. Oprócz tego „wejście” zapisywane jest jako ciąg znaków ze spacjami oddzielającymi liczby.
1 2 3: 0
5 6 0: 8
5 6 1: 3
1 6 15: 6 (not 7, as it's not rounded)
1 11 2: 0
1 10000 9999999: 0
11 7 1: 7
Odpowiedzi:
Python 2 , 25 bajtów
Port mojej odpowiedzi Haskell, ponieważ Python domyślnie obsługuje również bignum. Tam
x
jest 1-indeksowany.Wypróbuj online! (pożyczanie opakowania Keerthany Prabhakaran).
źródło
Mathematica 33 bajtów
Indeksowanie 1.
np. 10-milionowa cyfra Pi po przecinku:
na mojej starej maszynie zajmuje około 2 sekund.
Możesz spróbować online w WolframAlpha (kliknij znak równości)
źródło
Haskell , 26 bajtów
Działa dla wszystkich przypadków testowych. Yay bignums!
(n#d)x
bierzeInteger
s i zwraca anInteger
.x
ma indeks 1.Wypróbuj online!
źródło
PHP> = 7,1, 40 bajtów
bcdiv
Wersja online
źródło
<br /> <b>Notice</b>: Uninitialized string offset: -1 in <b>[...][...]</b> on line <b>6</b><br />
Galaretka , 7 bajtów
Wypróbuj online!
Przesyłanie funkcji (ale działa również jako pełny program). Funkcje galaretki mogą przyjmować tylko dwa argumenty bezpośrednio; dlatego zwracam cyfrę jako lewy argument, licznik jako prawy argument i mianownik ze standardowego wejścia (zamiast używania trzeciego argumentu).
Ludzie przyzwyczajeni do Galaretki mogą być świadomi, że pełny program może przyjąć więcej niż dwa argumenty, ale powoduje to utratę dostępu do najkrótszego sposobu na zapisanie stałej liczby całkowitej 10, co jest tutaj dość istotne. W związku z tym tego rodzaju mieszane dane wejściowe wydają się być raczej exploitem niż faktycznym golfem; Ja osobiście się z tym nie zgadzam, ale zasada na to pozwala obecnie na +40 / -12, więc tak długo, jak to jest w zasadach, równie dobrze mogę to wykorzystać (i właściwie muszę być konkurencyjny).
Lewy argument 1 odnosi się do cyfry bezpośrednio po przecinku („cyfra .1s”), argument 2 do cyfry .01s i tak dalej.
Wyjaśnienie
Galaretka ma arytmetykę o dowolnej precyzji na liczbach całkowitych, więc pomnożenie wstępne przez potęgę 10 skutecznie przenosi cyfrę, którą chcemy, do pozycji jednostek, gdzie jest znacznie łatwiej wyodrębnić.
źródło
sed
-r
, 93131136bajtówWypróbuj online!
( Patrz dane wyjściowe w postaci dziesiętnej )
Pobiera dane wejściowe w jednostkowej i wyjściowe w jednostkowej, a program ma indeks 1. Na szczęście to wyzwanie przygotowało mnie już do tego.
Koncepcja jest podobna, oba wdrażają długi podział. Tutaj wykonuję długi
x
czas podziału , gdziex
jest cyfra po przecinku, który muszę znaleźć. Po każdej iteracji odrzucam poprzednie miejsca po przecinku, ponieważ nie są już potrzebne.Podczas podziału program ma format
dividend;divisor;x,result
.s/$/,/
dodaje ten przecinek, przecinek jest wymagany do oddzielenia wyniku od wszystkiego innegoNastępnie następuje główna pętla programu
:d
etykieta ds/,.+/,/
usuń wszystko po przecinku:
pusta etykietas/(1+)(1*;\1;1*,)1{10}?/\21/
wykonaj podział, dodając 1 do wyniku każdej iteracji, jednocześnie usuwając bloki 10 ciągłych 1s w wynikut
rozgałęzić się do pustej etykiety, innymi słowy, zapętlić, aż dywidenda zostanie wyczerpanas/1*/&&&&&&&&&&/
pomnóż dywidendę przez 10, aby przygotować się do następnej iteracjita
gałąź, aby oznaczyć a:a
etykieta a, ta linia i powyższa linia są wymagane dotd
działanias/1,/,/
odejmij 1 od xtd
gałąź warunkowa do d, jest to wyzwalane, jeśli nastąpiło pomyślne podstawienie od ostatniej gałęzi warunkowej, ponieważs/1*/&&&&&&&&&&/
zawsze jest udane,td
zawsze zostanie uruchomione, ale wprowadzając gałąź a, naprawiamy to, aby zależało to tylko od poprzedniego podstawienias/.+,//
na koniec usuń wszystko oprócz wynikuźródło
Rubin ,
3433 bajtyWypróbuj online!
źródło
REXX, 76 bajtów
(Niezbyt krótki, ale sądził, że zmieniłoby się, aby zrobić jedną w REXX) Rexx opiera się na 1 z definicji.
Wyjaśnienie:
Połączenie 3 i 4 faktycznie wydłuża go z powodu zmiany składni:
Dla nie-REXX-ów: ciągi i liczby są całkowicie wymienne w REXX. Są one zdeterminowane tym, jak na nich postępujesz. Możesz więc parsować liczbę za pomocą funkcji żądła bez konwersji. Na przykład
zwraca 55, a nie 2728!
źródło
rexx main.rexx 1 2 3
. Powinieneś wspomnieć w swojej odpowiedzi, że dane wejściowe mają indeks 1.Partia, 70 bajtów
źródło
Asembler języka procesora Intel x86, 50 bajtów
tłumaczenie w nasm
Dla parametru „c” zakres zaczyna się od 0; byłoby 0..0xfffffffd. Jeśli parametry b = 0 lub c poza zakresem 0..0xfffffffd zwróci -1
źródło
Lua, 42 bajty
źródło
C,
4943 bajtówArgument „i” oznacza indeksowanie 0. Testuj kod i wynik
źródło
Java 7,
146139137133128 128122 bajtów-3 bajty dzięki Erikowi Outgolferowi, całkowicie zapomniałem, że importowanie nie musiało odbywać się we własnej linii
-4 bajty dzięki Qwerp-Derp za przeniesienie n% d do konstruktora
-6 bajtów dzięki Kevin Cruijssen za usunięcie toString ()
Mam nadzieję, że w ten sposób wykonywana jest liczba bajtów dla funkcji Java z importami
Używa klasy BigDecimal Java, aby uzyskać dokładną reprezentację rozwinięcia dziesiętnego. Zauważ, że nie jest to najszybciej działający kod, ale ostatecznie generuje poprawne dane wyjściowe dla wszystkich przypadków testowych. Nieskluczony kod:
Wypróbuj online!
źródło
BigDecimal(n)
sięBigDecimal(n%d)
i pozbyć sięn=n%d
?.toString()
i użyj+""
zamiast tego (z dwoma dodatkowymi nawiasami).Clojure, 39 bajtów
anonimowa funkcja z argumentami, w
n,d,x
którejx
wykorzystuje się indeksowanie oparte na jednym.źródło
F # (.NET Core) , 30 bajtów
Wypróbuj online!
(użyj indeksowania 1)
źródło
Groovy, 30 bajtów
x używa indeksowania 1.
Wyjaśnienie:
źródło
Python 2 ,
50,44,40,36 bajtówWypróbuj online!
źródło
1,7,10000000
Rubin, 39 bajtów
źródło
JavaScript (ES6), 34 bajty
x jest oparty na 0
źródło
f(1,7,10000000)
na przykład.Python 2 , 32 bajty
Wykorzystuje indeksowanie 0
Wypróbuj online!
Edytować:
Wróciłem do oryginalnego rozwiązania, jak widać w odpowiedzi Ørjana Johansena, że działa, ale nie będę go więcej grał w golfa
źródło
Groovy, 55 bajtów
Wyjaśnione przy użyciu
1,11,2
:źródło
Axiom,
71 6176 bajtówn oznacza indeksowanie 0 [0..M]. Testuj kod i wynik
źródło
JavaScript (Node.js) , 43 bajty, port
Wypróbuj online!
JavaScript (Node.js) , 51 bajtów
Wypróbuj online!
użyj Array zamiast rekurencyjnego, aby uniknąć przepełnienia stosu
źródło