Wypisuje n-te cyfry liczby całkowitej

13

Bez użycia łańcuchów (z wyjątkiem, gdy jest to konieczne, na przykład z wejściem lub wyjściem) obliczyć n-tą liczbę od lewej liczby całkowitej (w podstawie 10).

Dane wejściowe zostaną podane w tym formacie:

726433 5

Dane wyjściowe powinny wynosić:

3

ponieważ jest to piąta cyfra „726433”.

Dane wejściowe nie będą zawierać zer wiodących, np. „00223”.

Przypadki testowe / dalsze przykłady:

9 1  ->  9
0 1  ->  0
444494 5  ->  9
800 2  ->  0

To jest kod golfowy; wygrywa najmniej znaków, ale jakiekolwiek wbudowane funkcje, takie jak „nthDigit (x, n)” są niedopuszczalne .

Oto pseudo-kod na początek:

x = number
n = index of the digit
digits = floor[log10[x]] + 1
dropRight = floor[x / 10^(digits - n)]
dropLeft = (dropRight / 10 - floor[dropRight / 10]) * 10
nthDigit = dropLeft

Jak widać, jestem nowy w kodowaniu golfa i choć myślę, że to trochę niesprawiedliwe, że zadaję pytanie, zanim jeszcze na nie odpowiem, naprawdę chciałbym zobaczyć, jakie to generuje odpowiedzi. :)

Edycja : Miałem nadzieję na matematyczne odpowiedzi, więc nie mogę zaakceptować odpowiedzi, które polegają na konwersji ciągów znaków na tablice lub na dostępie do liczb jako listy cyfr.

Mamy zwycięzcę

Napisane w „dc”, 12 bajtów. Przez DigitalTrauma .

kukac67
źródło
Czy może to być tylko funkcja, czy musi obsługiwać operacje we / wy? Jeśli nie musi obsługiwać I / O, to może być po prostu lambda zamiast funkcji?
slebetman
Twoja edycja pozostawia niejasne, czego dokładnie nie lubisz. W szczególności, w przypadku „możliwości dostępu do numerów jako listy cyfr”, czy jest to użycie tablic w dowolnej formie, która Ci się nie podoba, czy po prostu istnienie wbudowanych podstawowych procedur konwersji?
Peter Taylor
@PeterTaylor Tablice cyfr nie są OK, ponieważ łatwo można po prostu pobrać n-ty element w tablicy. Nie jestem pewien, jak dokładnie działa konwersja bazy, ale wydaje się to łatwe.
kukac67
Dlaczego budowanie listy cyfr jest problemem? Jest to wysoce matematyczne - reprezentuje liczbę jako wielomian.
2rs2ts
@ 2rs2ts Jeśli możesz utworzyć listę cyfr matematycznie, tzn. Bez parsowania łańcucha w tablicy, może to być dopuszczalne.
kukac67

Odpowiedzi:

2

dc , 12 bajtów

?dZ?-Ar^/A%p

To jest matematyczna odpowiedź. Oto jak to działa:

  • ? odczytać numer wejściowy i wcisnąć do stosu
  • d zduplikowany początek stosu
  • Z Zrzuca wartość ze stosu, oblicza i wypycha liczbę cyfr
  • ? odczytać indeks cyfr i nacisnąć na stos
  • - odejmij indeks cyfr od liczby cyfr
  • A pchnij 10 na stos
  • r zamień 2 górne wartości na stosie
  • ^ wykładnik 10 ^ (liczba cyfr - indeks cyfr)
  • / podziel liczbę przez wynik potęgowania
  • A pchnij 10 na stos
  • % obliczyć liczbę mod 10, aby uzyskać ostatnią cyfrę i przesunąć na górę stosu
  • p pop i wydrukuj górę stosu

W akcji:

{echo 987654321; echo 1; } | dc ndigit.dc
9
{echo 987654321; echo 2; } | dc ndigit.dc
8
{echo 987654321; echo 8; } | dc ndigit.dc
2)
{echo 987654321; echo 9; } | dc ndigit.dc
1
$ 
Cyfrowa trauma
źródło
1
Myślę, że jesteś zwycięzcą. Jest to trzeci najkrótszy kod, ale wykorzystano najkrótszą 2 base conversion -> arrays.
kukac67
5

GolfScript (10 bajtów)

~(\10base=

Zakłada się, że dane wejściowe są w postaci łańcucha (np. Przez stdin). Jeśli na stosie są dwie liczby całkowite, wartość początkowa ~powinna zostać usunięta, oszczędzając 1 znak.

Jeśli uważa się, że podstawowa konwersja jest niezgodna z regułą funkcji wbudowanych, mam 16-znakową alternatywę:

~~)\{}{10/}/=10%
Peter Taylor
źródło
Twój pierwszy program z podstawową konwersją wyprowadza pierwszą cyfrę tylko, jeśli wpiszesz „0”, a drugą, jeśli wpiszesz „1”. golfscript.apphb.com/?c=MjcwNiAxCgpcMTBiYXNlPQ%3D%3D
kukac67
@ kukac67, naprawiono.
Peter Taylor,
4

CJam - 7

l~(\Ab=

CJam to nowy język, który rozwijam, podobny do GolfScript - http://sf.net/p/cjam . Oto wyjaśnienie:

lczyta wiersz z danych wejściowych
~ocenia ciąg znaków (w ten sposób uzyskując dwie liczby)
(zmniejsza drugą liczbę
\zamienia liczby
Ajest zmienną wstępnie zainicjalizowaną na 10
bdokonuje konwersji podstawy, dzięki czemu tablica z cyframi podstawy 10 pierwszej liczby
=otrzymuje pożądane element tablicy

Program jest w zasadzie tłumaczeniem rozwiązania Petera Taylora.

aditsu zrezygnowało, ponieważ SE jest ZŁEM
źródło
Argumentowałbym, że umieszczenie 10 cyfr podstawowych w tablicy jest bardziej operacją na łańcuchach niż matematyczną.
Cyfrowa trauma
4

Haskell 60 bajtów i czytelny

nth x n
        | x < (10^n) = mod x 10
        | True = nth (div x 10) n

bez żadnych zobowiązań!

*Main> nth 1234567 4
4
Martin Drautzburg
źródło
Można to zagrać w golfa do 36
Cristian Lupascu
Wow, walczyłeś o każdy bajt. 1 <2 ”zamiast„ true ”- słodki.
Martin Drautzburg,
To właśnie robimy tutaj ...
Cristian Lupascu,
3

J - 15 24 znaków

Wystarczająco „matematyczna odpowiedź”.

(10|[<.@*10^]-10>.@^.[)/

Te same wyniki, co poniżej, ale mają mistyczną jakość bycia matematyką.


Krótka wersja, wykorzystująca rozszerzenie base-10.

({0,10&#.inv)~/

Poprzedzamy 0, aby skorygować indeksowanie 1.

Stosowanie:

   ({0,10&#.inv)~/ 1234567 3
3
   ({0,10&#.inv)~/ 444494 5
9
algorytmshark
źródło
2
Ciągi znaków są niedozwolone.
0xcaff
2

Python 127

def f(i,n):
 b=10;j=i/b;k=1;d=i-j*b
 while j>0:
  k+=1;j/=b
 if n>k:
  return -1
 while k>n:
  k-=1;j/=b;i/=b;d=i-j*b
 return d
Willem
źródło
Nie trzeba go definiować jako fn:def f(i,n): ... return d
smci
Nie musisz sprawdzać rozsądku if n>k: return -1.
smci
... i na pewno nie musisz wykonywać pierwszego przejścia, aby policzyć k (liczbę cyfr w i), aby porównać rozsądek do n.
smci
2

C, 50

To używa tablic.

main(int c,char**a){putchar(a[1][atoi(a[2])-1]);}

Po prostu zignoruj ​​wszystkie ostrzeżenia.

I tak, w C, ciągi są tak naprawdę tylko tablicami, więc jest to trochę tanie.


Więcej matematyki:

C, 83

main(int c,char**a){printf("%d",(atoi(a[1])/pow(10,strlen(a[1])-atoi(a[2])))%10);}
SBI
źródło
czy nie używa funkcji łańcuchowych / tablicowych?
VX
Pierwszy tak, jak mówi;) Drugi oczywiście nie ma, oprócz strlen, który wybrałem po prostu dlatego, że jest krótszy niż używanie logu. Jeśli to problem, łatwo go naprawić, mogę go dodać, kiedy wrócę do domu.
SBI,
Proszę bardzo, dodaliśmy wersję czysto matematyczną.
SBI
2
Matematyka - ani razu!
Potzblitz
2

bc (napędzany bash), 41 29

Myślę, że to pierwsza odpowiedź, aby zrobić to matematycznie, a nie za pomocą łańcuchów:

bc<<<"$1/A^(length($1)-$2)%A"

Użycie length()może wydaje się nieco rygorystyczne, ale strona podręcznika użytkownika bc mówi o liczbie cyfr, a nie o długości łańcucha:

  length ( expression )
          The value of the length function is the  number  of  significant
          digits in the expression.

Wynik:

$ ./ndigits.bc.sh 726433 5
3)
$ ./ndigits.bc.sh 9 1
9
$ ./ndigits.bc.sh 0 1
0
$ ./ndigits.bc.sh 444494 5
9
$ ./ndigits.bc.sh 800 2
0
$ 
Cyfrowa trauma
źródło
1
@ kukac67 Doceniam głosowanie za przyjęciem! Ale myślę, że zwyczajem jest, aby pytania związane z golfem pozostawały otwarte dłużej niż 2 godziny, aby zachęcić do większej liczby odpowiedzi. Może jakiś tydzień. Nie obrażę się, jeśli odrzucisz tę odpowiedź :)
Digital Trauma
1
dobrze. W takim razie nie zaakceptuję. Mam nadzieję, że nie wygrasz! : P
kukac67
1

Mathematica - 24 23

Ten jest dość oczywisty :)

IntegerDigits[#][[#2]]&

Przykład:

IntegerDigits[#][[#2]]& [726433, 5]

Wynik:

3

Możesz go skrócić, wpisując na stałe dwie liczby całkowite, np

IntegerDigits[n][[m]]

ale najpierw musisz napisać n = 726433; m = 5;. Wywołanie funkcji wydawało się bardziej podobne do programu.

CompuChip
źródło
1
Możesz upuścić numer 1.
DavidC
Teraz to oszustwo ..: D
kukac67
1

C 145

Program znajduje odległość od końca liczby całkowitej i dzieli aż do osiągnięcia indeksu, a następnie używa modułu 10, aby uzyskać ostatnią cyfrę.

int main()
{
int i,a,b,d,n;
scanf("%d %d",&i,&a);
d=(int)(log(i)/log(10))+1;
n=d-a;
while(n--){i=(int)(i/10);}
b=i%10;
printf("%d",b);
}
Bacchusbeale
źródło
Można to znacznie pograć w golfa. Zacznij od tych wskazówek
Digital Trauma
Na początek, (int) castingi i powiązane pareny są niepotrzebne
Digital Trauma
1
Nie mogłem się oprzeć. Ja grałem w dół do 87 znaków: i,a;main(){scanf("%d%d",&i,&a);for(a=log(i)/log(10)+1-a;a--;)i/=10;printf("%d",i%10);}.
Digital Trauma
1

Wolfram Alpha - od 40 do 43

Oczywiście mogę całkowicie bronić tego, że używanie IntegerDigitsjest lewą, która nie podlega

wszelkie wbudowane funkcje, takie jak „nthDigit (x, n)”

Ale ponieważ moja poprzednia odpowiedź wciąż była trochę oszustwem, oto alternatywa. Niestety jest nieco dłuższy, ale nie widziałem, jak go skrócić bardziej niż ja.

Liczenie w podobny sposób jak poprzednio (z ampersand, bez przekazywania żadnych argumentów),

Mod[Trunc[#/10^(Trunc[Log10[#]]-#2+1)],10]&

ma 43 znaków. Negując wykładnik potasowania i zmieniając terminy, mogę stracić jednego operatora arytmetycznego ( 10^(...)xzostanie zinterpretowane jako mnożenie)

Mod[Trunc[10^(#2-Trunc[Log10[#]]-1)#],10]&

Nie mam pod ręką Matematyki do przetestowania, wątpię, aby była tak, jak podejrzewałem (i jak to uprzejmie zweryfikował kukac67 ) w Mathematice, że nie jest to akceptowane, ale działa w WolframAlpha .

Mam wątpliwości co do użycia RealDigits, ponieważ ograniczyłem się do korzystania IntegerDigitsz tej odpowiedzi i są one dość podobne. Jednakże, jeśli mogę pozwolić sobie na włączenie go (po wszystkim, to nie zwraca liczb całkowitych bezpośrednio, podobnie jak wielu z nich istnieje), mogę ciąć się kolejne dwa znaki:

Mod[Trunc[10^(#2-RealDigits[#]-1)#],10]&
CompuChip
źródło
Próbowałem w Mathematica, nie wyświetla wartości. 43 znak pierwszy wypowiada to:Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
kukac67
Tak, doszedłem do wniosku. Wolfram Alpha jest nieco łagodniejszy w interpretacji danych wejściowych. Na szczęście dałem mu prawidłowy nagłówek;)
CompuChip
Ale widzę, że działa na WolframAlpha.
kukac67
{edit} Chociaż widzę, że link jest zepsuty ... najwyraźniej nie lubi [znaków, nawet jeśli są zakodowane. Przeciągnę go przez skracacz URL. {edit2} Najwyraźniej W.Alpha ma jeden - zmienił link.
CompuChip
1

Tcl (42 bajty, lambda):

{{x y} {expr $x/10**int(log10($x)+1-$y)%10}}

(49 bajtów, funkcja):

proc f {x y} {expr $x/10**int(log10($x)+1-$y)%10}

(83 bajty, jeśli musimy zaakceptować dane wejściowe z powłoki):

puts [expr [lindex $argv 0]/10**int(log10([lindex $argv 0])+1-[lindex $argv 1])%10]
Slebetman
źródło
Jak to działa?
kukac67
Dodano wyjaśnienie. To po prostu najbardziej oczywisty sposób na zrobienie tego matematycznie. Jak zrobiłbyś to na papierze.
slebetman
Myślę, że liczysz z niewłaściwego końca.
Peter Taylor
Hmm .. tak. Wygląda jak to. Zmienię to, by policzyć od lewej.
slebetman
Przyjmę 31 bajtów. Jak jednak można uruchomić lambda? Czy Tcl ma tłumacza, który może go używać? Czy tylko jako część programu, który definiuje argumenty?
kukac67
1

R (60)

Rozwiązano problem za pomocą log10 do obliczenia liczby cyfr. Przypadek specjalny x == 0 kosztuje 13 znaków, westchnienie.

f=function(x,n)if(x)x%/%10^(trunc(log10(x))-n+1)%%10 else 0

Nie golfowany:

f=function(x,n)
  if(x) 
    x %/% 10^(trunc(log10(x)) - n + 1) %% 10
  else
    0

Stosowanie

> f(898,2)
[1] 9
lambruscoAcido
źródło
1

Scala ( 133 99 bajtów):

Działa dla wszystkich pozytywnych danych wejściowych. Dzieli przez 10 na potęgę cyfry poszukiwanej z prawej strony, a następnie przyjmuje modulo 10.

def k (i: Array [String]) = {val m = i (0) .toInt
(m * Math.pow (10, i (1) .toInt-1-Math.log10 (m) toInt)). toInt% 10}

Dziękujemy za zauważenie błędu w poprzedniej formule. Ten jest krótszy.

Mikaël Mayer
źródło
Lubię to! :)
Pod
Przetestowałem rozwiązanie: k (tablica („1234”, „7”)), która daje 9. Czy to nie działa dla n> # cyfr (x)?
lambruscoAcido
To dlatego, że 10 ^ -1 nie jest dokładne w tym zapisie, więc występuje błąd zaokrąglenia, gdy weźmiesz 10% pow (10, -1), które powinno dać zero, a zamiast tego 0,0999. Poprawiłem moją odpowiedź, aby uwzględnić ten efekt uboczny.
Mikaël Mayer
1

Haskell, 142

Nie jestem pewien, czy poprawnie zrozumiałem pytanie, ale myślę, że chciałeś tego: przeczytaj stdin (ciąg), utwórz dwie liczby int (nie ciąg), zrób kilka algorytmicznych rzeczy, a następnie wyślij wynik (ciąg). Wcisnąłem go w 142 znaki, co jest zdecydowanie za dużo:

import System.Environment
a%b|a>9=div a 10%(b+1)|1<2=b
x#n=x`div`10^(x%1-n)`mod`10
u[a,b]=read a#read b
main=fmap(u.words)getContents>>=print

przykładowe użycie:

> echo 96594 4 | getIndex
9
Flonk
źródło
1

JavaScript - 84

p=prompt,x=+p(),m=Math;r=~~(x/m.pow(10,~~(m.log(x)/m.LN10)+1-+p()));p(r-~~(r/10)*10)

Czysto matematyczny, bez zobowiązań, bez żadnego z nich. Pobiera pierwszą liczbę w pierwszym monicie i drugą liczbę w drugim monicie.

Przypadek testowy :

Input: 97654 5
Output: 4

Input: 224658 3
Output: 4

Nieskluczony kod:

p = prompt,
x = +p(), // or parseInt(prompt())
m = Math;

r = m.floor( x / m.pow(10, m.floor(m.log(x) / m.LN10) + 1 - +p()) )
//                                               ^-- log(10) ^-- this is `n`

p(r - ~~(r / 10) * 10) // show output
Gaurang Tandon
źródło
1

perl, 38, 36   nr 30 znaków

(nie licząc linii)

Prawdopodobnie jest to oszustwo ze względu na przełącznik poleceń, ale dzięki za umożliwienie mi gry :-)

~/$ cat ndigits.pl
say((split//,$ARGV[0])[$ARGV[1]-1]);
~/$ tr -cd "[:print:]" < ndigits.pl |wc -m 
36
~/$ perl -M5.010 ndigits.pl 726433 5 
3

edycja :

Był w stanie usunąć 2 znaki:

 say for(split//,$ARGV[0])[$ARGV[1]-1];
 say((split//,$ARGV[0])[$ARGV[1]-1]);

... a potem jeszcze 6:

 say((split//,shift)[pop()-1]);

W jaki sposób

Podzieliliśmy wejście pierwszego argumentu do skryptu $ARGV[0]według znaków ( split//), tworząc tablicę indeksowaną zerowo; dodanie jednego do drugiego argumentu $ARGV[1]w skrypcie odpowiada następnie elementowi w tej pozycji w ciągu lub pierwszym argumencie. Następnie przechowujemy wyrażenie w środku ()jako listę jednego elementu, która saybędzie się powtarzać. W przypadku krótszej krótkiej wersji używamy tylko shiftpierwszego argumentu i używamy pozostałej części @ARGV do użycia dla indeksu - raz shifted pozostaje tylko drugi argument, więc pop()go odejmujemy 1.

Czy to ma być ćwiczenie matematyczne? Właśnie zdałem sobie sprawę, że indeksuję ciąg odczytany z danych wejściowych, więc ... Myślę, że przegrałem? Zaznacz mnie, jeśli mam sens na równoległym polu golfowym i spróbuję ponownie - bardziej matematycznie - w osobnej odpowiedzi.

Twoje zdrowie,

G. Cito
źródło
Tak, przepraszam, bez użycia ciągów . W każdym razie witamy w PPCG!
Digital Trauma
OK, przepraszam, że ... jak dotąd moje matematyczne podejście nie jest warte golfa :-)
G. Cito
0

PHP, 58

Używanie tylko matematyki

<?$n=$argv[1];while($n>pow(10,$argv[2]))$n/=10;echo $n%10;

dkasipovic
źródło
1
Czy to nie jest właściwe?
cjfaure
2
Możesz zapisać 1 znak, zmieniając go na echo$n%10.
Amal Murali
@Trimsty nie, faktycznie zapętla się, dopóki wprowadzona liczba nie będzie już większa niż 10 ^ x, x jest liczbą cyfrową. Na przykład, jeśli wpiszesz 3457 jako liczbę, a 2 jako cyfrę, usunie ostatnią cyfrę, dopóki liczba nie będzie mniejsza niż 100 (10 ^ 2). Oznacza to, że usunie 5 i 7, ponieważ wtedy 34 pozostanie i nie będzie większe niż 100. Następnie wypisze tylko ostatnią cyfrę (4).
dkasipovic
Ale prawdą jest, że jeśli druga liczba jest większa niż liczba cyfr, wyprowadzasz 9, a nie zero
Mikaël Mayer
Rozumiem, wyświetla ostatnią cyfrę, jeśli liczba jest większa niż liczba cyfr. Jeśli wpiszesz 1234 i 5 cyfrę, otrzymasz 4 od 1234 i już mniej niż 10 ^ 5.
dkasipovic
0

~ - ~! - 94 93

Wygina nieco reguły - jest to funkcja, która przyjmuje n jako dane wejściowe i zakłada, że ​​liczba, aby znaleźć cyfrę n, jest przechowywana w '''''- i ~ - ~! nie obsługuje pływaków.

'=~~~~~,~~:''=|*==~[']<''&*-~>,'|:'''=|*==%[%]~+*/~~~~/~~|:''''=|'''''/''&<<'''&'''''>-*-~>|:

'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:spowoduje ''''''bycie ~~(2) („” „= 128).

cjfaure
źródło
Hm ... Kolejny ezoteryczny język?
VisioN
@VisioN nie jest tak naprawdę ezoteryczny, tylko że jedynym rodzimym typem danych jest liczba i nie może wchodzić w interakcje z systemem OS / Internet. esolangs.org/wiki/No_Comment
cjfaure
1
Cóż, dla mnie każda składnia, której istota ludzka nie może łatwo odczytać, jest ezoteryczna. I tak, Perl jest również ezoteryczny zgodnie z tą teorią:)
VisioN
@VisioN Po chwili staje się łatwy do odczytania. : P
cjfaure
0

Python 2.7 (89 bajtów)

Przekształcam liczbę całkowitą na „wielomian” za pomocą listy cyfr. Wiem, że mówisz, że nie możesz tego zaakceptować, ale nie rozumiem, dlaczego nie, ponieważ wykorzystuje matematyczną koncepcję liczb reprezentowanych jako wielomiany ich podstaw. Nie powiedzie się to tylko wtedy, gdy podana jest liczba całkowita 0, ale nie powiedziałeś żadnych dopełnianych zer;)

import sys;v=sys.argv;p,x,n=[],int(v[1]),int(v[2])
while x:p=[x%10]+p;x//=10
print p[n-1]

Uruchom jako test.py:

$ python test.py 726489 5
8

Zakładam, że chciałeś danych wejściowych powłoki i że nie mogłem skorzystać z faktu, że dane wejściowe byłyby łańcuchami. Pomijanie danych wejściowych powłoki to zaledwie 43 bajty, z:

p=[]
while x:p=[x%10]+p;x//=10
print p[n-1]

Chociaż używam niepotrzebnej iteracji, oszczędzam niektóre bajty, nie dodając do nich dodatkowego zmniejszenia n.

2rs2ts
źródło
0

Extended BrainFuck : 49

+[>>,32-]<<-[<<-],49-[->>>[>>]+[<<]<]>>>[>>]<33+.

Stosowanie:

% bf ebf.bf < nth-digit.ebf > nth-digit.bf
% echo "112234567 7" | bf nth-digit.bf 
5

Nie używam żadnych specjalnych funkcji EBF poza operatorem mnożenia (np. 10+ => ++++++++++). Poza tym jest to w większości czysty BrainFuck

Jak to działa:

+                ; Make a 1 in the first cell
[>>,32-]         ; while cell is not zero: read byte 2 to the right and reduce by 32 (space)
<<-[<<-]         ; move back to the first cell by reducing every cell with 1
,49-             ; read index, reduce by 49 so that ascii 1 becomes 0
[->>>[>>]+[<<]<] ; use that to fill a trail of breadcrumbs to the desired number
>>>[>>]          ; follow the breadcrumbs
<33+.            ; go to value part, increase by 33 (32 + 1 which we substracted) and print

Schemat (R6RS): 100 (bez niepotrzebnych białych znaków)

(let*((x(read))(n(read))(e(expt 10(-(floor(+(/(log x)(log 10))1))n))))
  (exact(div(mod x(* e 10))e)))
Sylwester
źródło
0

awk - 53

{for(d=10^9;!int($1/d)||--$2;d/=10);$0=int($1/d)%10}1
  1. przycinaj cyfry według dzielenia, zaczynając od maks. możliwej dla 32 bitów bez znaku int
  2. kiedy uderzymy w lewą stronę liczby całkowitej, int (1 $ / d) zwraca wartość niezerową
  3. kontynuuj n (2 $) cyfry za tym

Nie golfowany:

{
    for(d = 1000000000; int($1 / d) != 0 || --$2; d /= 10);
    print int($1 / d) % 10;
}
laindir
źródło
0

Scala (83)

Nie używa żadnych specjalnych funkcji Scala. Raczej standardowe rozwiązanie.

def f(x:Int,n:Int)=if(x==0)0 else x/(math.pow(10,math.log10(x).toInt-n+1)).toInt%10

Nie golfowany:

def f(x:Int,n:Int) = 
  if(x==0)
    0
  else
    x / (math.pow(10, math.log10(x).toInt - n + 1)).toInt % 10 
lambruscoAcido
źródło
0

C, 94

main(x,y,z,n){scanf("%d%d",&x,&y);for(z=x,n=1-y;z/=10;n++);for(;n--;x/=10);printf("%d",x%10);}

C, 91, nieprawidłowa z powodu użycia tablic.

main(x,y,z){int w[99];scanf("%d%d",&x,&y);for(z=0;x;x/=10)w[z++]=x%10;printf("%d",w[z-y]);}
VX
źródło
Niedozwoliłem tablic w edycji (zanim to opublikowałeś) ... Ale podoba mi się, jak to zrobiłeś. :)
kukac67
OK, nie wyglądałem właściwie. Dodałem rozwiązanie pozwalające uniknąć tablic.
VX
0

Julia 37

d(x,y)=div(x,10^int(log10(x)-y+1))%10

Dzięki wbudowanemu operatorowi ^. Arbitralna precyzja arytmetyczna pozwala na dowolny rozmiar int.

Próba

julia> d(1231198713987192871,10)
3
waTeim
źródło
0

perl (nieco więcej mathy / niezbyt golfy) - 99 znaków

 ~/$ cat ndigits2.pl
  ($n,$i)=@ARGV;
  $r=floor($n/10**(floor(log($n)/log(10)+1)-$i));
  print int(.5+($r/10-floor($r/10))*10);

Uruchom jako:

 perl -M5.010 -MPOSIX=floor ndigits.pl 726433 1
G. Cito
źródło
0

Perl6 - 85 znaków

my ($n,$i)=@*ARGS;
my$r=$n/10**(log10($n).round-$i);
say (($r/10-floor($r/10))*10).Int;
G. Cito
źródło
0

Smalltalk, 44

Chociaż dc jest nie do pobicia, oto rozwiązanie Smalltalk:

argumenty, liczba n; d cyfra-nr do wyodrębnienia:

[:n :d|(n//(10**((n log:10)ceiling-d)))\\10]
blabla999
źródło