Keluarkan digit ke-n dari integer


13

Tanpa menggunakan string (kecuali bila perlu, seperti dengan input atau output) hitung digit ke-n, dari kiri , dari sebuah bilangan bulat (pada basis 10).

Masukan akan diberikan dalam format ini:

726433 5

Output harus:

3

karena itu adalah digit kelima "726433".

Input tidak akan mengandung angka nol di depan, misalnya "00223".

Uji kasus / contoh lebih lanjut:

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

Ini adalah kode golf; paling sedikit jumlah karakter yang menang, tetapi fungsi bawaan seperti "nthDigit (x, n)" tidak dapat diterima .

Berikut beberapa pseudo-code untuk Anda mulai:

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

Seperti yang Anda lihat, saya baru mengenal kode golf, dan meskipun saya pikir agak tidak adil untuk mengajukan pertanyaan bahkan sebelum saya menjawabnya, saya benar-benar ingin melihat respons seperti apa yang dihasilkannya. :)

Sunting : Saya berharap untuk jawaban matematis, jadi saya tidak dapat benar-benar menerima jawaban yang mengandalkan konversi string ke array atau dapat mengakses angka sebagai daftar angka.

Kami punya pemenang

Ditulis dalam "dc", 12 byte. Oleh DigitalTrauma .


Apakah ini hanya sebuah fungsi atau haruskah ia menangani I / O? Jika tidak perlu menangani I / O, bisakah itu hanya lambda daripada fungsi?
slebetman

Hasil edit Anda tidak jelas seperti apa tepatnya yang tidak Anda sukai. Khususnya, dengan "dapat mengakses angka sebagai daftar angka", apakah penggunaan array dalam bentuk apa pun yang tidak Anda sukai, atau hanya keberadaan rutin konversi dasar bawaan?
Peter Taylor

@PeterTaylor Array angka tidak OK, karena orang dapat dengan mudah hanya mengambil item ke-n dalam array. Saya tidak yakin bagaimana konversi basis bekerja dengan tepat, tetapi tampaknya mudah.
kukac67

Mengapa masalah membangun daftar angka? Itu sangat matematis - ini mewakili angka sebagai polinomial.
2rs2ts

@ 2rs2ts Jika Anda dapat membuat daftar angka secara matematis, yaitu tanpa menguraikan string ke dalam array, maka itu bisa diterima.
kukac67

Jawaban:


2

dc , 12 byte

?dZ?-Ar^/A%p

Ini jawaban matematis. Begini cara kerjanya:

  • ? baca nomor input dan tekan untuk menumpuk
  • d duplikat atas tumpukan
  • Z Muncul nilai dari tumpukan, menghitung dan mendorong jumlah digit
  • ? baca indeks angka dan tekan untuk menumpuk
  • - kurangi indeks angka dari jumlah digit
  • A dorong 10 ke tumpukan
  • r menukar 2 nilai teratas pada stack
  • ^ exponentiate 10 ^ (angka digit - indeks angka)
  • / bagi angka dengan hasil eksponensial
  • A dorong 10 ke tumpukan
  • % menghitung angka mod 10 untuk mendapatkan digit terakhir dan tekan ke atas tumpukan
  • p pop dan cetak bagian atas tumpukan

Beraksi:

$ {echo 987654321; gema 1; } | dc ndigit.dc
9
$ {echo 987654321; gema 2; } | dc ndigit.dc
8
$ {echo 987654321; gema 8; } | dc ndigit.dc
2
$ {echo 987654321; gema 9; } | dc ndigit.dc
1
$ 

1
Saya pikir kamu pemenangnya. Ini adalah kode terpendek ketiga, tetapi 2 terpendek digunakan base conversion -> arrays.
kukac67

5

GolfScript (10 byte)

~(\10base=

Ini mengasumsikan input adalah sebagai string (misalnya via stdin). Jika dua bilangan bulat di tumpukan, yang awal ~harus dihapus, menghemat 1 char.

Jika konversi basis dianggap melanggar aturan fungsi bawaan, saya memiliki alternatif 16-char:

~~)\{}{10/}/=10%

Program pertama Anda dengan konversi basis hanya menghasilkan digit pertama jika Anda memasukkan "0" dan yang kedua jika Anda memasukkan "1". golfscript.apphb.com/?c=MjcwNiAxCgpcMTBiYXNlPQ%3D%3D
kukac67

@ kukac67, diperbaiki.
Peter Taylor

4

CJam - 7

l~(\Ab=

CJam adalah bahasa baru yang saya kembangkan, mirip dengan GolfScript - http://sf.net/p/cjam . Berikut penjelasannya:

lmembaca garis dari input
~mengevaluasi string (sehingga mendapatkan dua angka)
(decrements angka kedua
\menukar angka
Aadalah variabel yang diinisialisasi menjadi 10
bmelakukan konversi basis, membuat array dengan basis-10 digit angka pertama
=mendapatkan yang diinginkan elemen array

Program ini pada dasarnya adalah terjemahan dari solusi Peter Taylor.


Saya berpendapat bahwa menempatkan basis 10 digit ke dalam array lebih merupakan operasi string daripada yang matematika.
Digital Trauma


3

J - 15 24 char

"Jawaban matematis" yang cukup.

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

Hasil yang sama seperti di bawah ini, tetapi diberkahi dengan kualitas mistis menjadi matematika.


Versi singkatnya, menggunakan ekspansi base-10.

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

Kami menambahkan 0 untuk menyesuaikan pengindeksan berbasis 1.

Pemakaian:

   ({0,10&#.inv)~/ 1234567 3
3
   ({0,10&#.inv)~/ 444494 5
9

2
String tidak diizinkan.
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

Anda tidak perlu mendefinisikannya sebagai fn:def f(i,n): ... return d
smci

Anda tidak perlu memeriksa kewarasannya if n>k: return -1.
smci

... dan Anda tentu tidak perlu membuat first-pass hanya untuk menghitung k (jumlah digit di i), untuk kewarasan-bandingkan dengan n.
smci

2

C, 50

Ini menggunakan array.

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

Abaikan semua peringatan.

Dan ya, di C, string benar-benar hanya array, jadi ini agak murah.


Lebih banyak matematika:

C, 83

main(int c,char**a){printf("%d",(atoi(a[1])/pow(10,strlen(a[1])-atoi(a[2])))%10);}

bukankah itu menggunakan fungsi string / array?
VX

Yang pertama tidak, seperti katanya;) Yang kedua jelas tidak, terlepas dari strlen, yang saya pilih hanya karena lebih pendek daripada menggunakan log. Jika itu masalah, itu adalah perbaikan yang mudah, saya dapat menambahkannya saat saya pulang.
SBI

Di sana kita pergi, menambahkan versi matematika murni.
SBI

2
Matematika - tidak sekali pun!
Potzblitz

2

bc (didorong oleh bash), 41 29

Saya pikir ini adalah jawaban pertama untuk melakukan ini secara matematis dan bukan dengan string:

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

Penggunaan length()mungkin tampak agak berserabut, tetapi halaman manual bc berbicara tentang jumlah digit dan bukan panjang string:

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

Keluaran:

$ ./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
$ 

1
@ kukac67 Saya menghargai suara penerimaan! Tapi saya pikir itu adalah kebiasaan untuk pertanyaan kode-golf dibiarkan terbuka lebih dari 2 jam untuk mendorong lebih banyak jawaban. Mungkin sekitar seminggu. Saya tidak akan tersinggung jika Anda tidak menerima jawaban ini :)
Digital Trauma

1
baik. Saya akan de-terima kalau begitu. Semoga kamu tidak menang! : P
kukac67

1

Mathematica - 24 23

Yang ini agak jelas :)

IntegerDigits[#][[#2]]&

Contoh:

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

Keluaran:

3

Anda bisa membuatnya lebih pendek dengan mengkodekan dua bilangan bulat, mis

IntegerDigits[n][[m]]

tapi pertama-tama kamu harus menulis n = 726433; m = 5;. Panggilan fungsi terasa lebih mirip dengan program.


1
Anda dapat menjatuhkan nomornya 1.
DavidC

Sekarang ini curang ..: D
kukac67

1

C 145

Program menemukan jarak dari ujung integer dan membaginya hingga indeks tercapai kemudian menggunakan modulus 10 untuk mendapatkan digit terakhir.

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);
}

Ini bisa bermain golf secara signifikan. Mulailah dengan tips ini
Trauma Digital

Sebagai permulaan, gips (int) dan paren terkait tidak diperlukan
Digital Trauma

1
Saya tidak bisa menolak. Aku golfed itu ke 87 chars: 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 - antara 40 dan 43

Tentu saja, saya benar-benar dapat mempertahankan bahwa menggunakan IntegerDigitsadalah trik yang tidak jatuh di bawah

fungsi bawaan seperti "nthDigit (x, n)"

Tetapi karena jawaban saya sebelumnya masih merasa sedikit curang, inilah alternatifnya. Sayangnya ini sedikit lebih lama, tetapi saya tidak melihat bagaimana mempersingkatnya daripada saya.

Menghitung dengan cara yang sama seperti sebelumnya (dengan ampersand, tanpa melewati argumen apa pun),

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

memiliki 43 karakter. Dengan meniadakan eksponen dan menyeret istilah-istilah di sekitar, saya dapat kehilangan satu operator aritmatika ( 10^(...)xakan diartikan sebagai multiplikasi)

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

Saya tidak memiliki Mathematica untuk diuji, saya ragu bahwa itu akan menjadi Seperti yang saya duga (dan seperti yang diverifikasi oleh kukac67 ) di Mathematica ini tidak diterima, tetapi berjalan di WolframAlpha .

Saya ragu tentang penggunaannya RealDigits, karena saya membatasi diri saya untuk menggunakan IntegerDigitsjawaban ini dan mereka sangat mirip. Namun, jika saya membiarkan diri saya untuk memasukkannya (setelah semua, itu tidak mengembalikan bilangan bulat secara langsung, berapa banyak dari mereka ada), saya dapat memotong dua karakter lain:

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

Saya mencobanya di Mathematica, tidak menghasilkan nilai. The 43 karakter satu ouputs ini:Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
kukac67

Ya, saya pikir banyak. Wolfram Alpha sedikit lebih lunak dalam menafsirkan input. Untungnya saya memberikannya header yang benar;)
CompuChip

Tapi saya melihat itu berhasil pada WolframAlpha.
kukac67

{sunting] Meskipun saya melihat tautannya rusak ... ternyata tidak menyukai [karakter bahkan ketika mereka dikodekan. Saya akan menariknya melalui penyingkat URL. {edit2} Rupanya W.Alpha memiliki satu - mengubah tautan.
CompuChip

1

Tcl (42 byte, lambda):

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

(49 byte, fungsi):

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

(83 byte, jika kita perlu menerima input dari shell):

puts [expr [lindex $argv 0]/10**int(log10([lindex $argv 0])+1-[lindex $argv 1])%10]

Bagaimana cara kerjanya?
kukac67

Penjelasan tambahan. Itu hanya cara yang paling jelas untuk melakukannya secara matematis. Bagaimana Anda melakukannya di atas kertas.
slebetman

Saya pikir Anda menghitung dari ujung yang salah.
Peter Taylor

Hmm .. ya. Sepertinya begitu. Saya akan merevisinya untuk menghitung dari kiri.
slebetman

Saya akan menerima 31 byte. Padahal bagaimana lambda bisa dijalankan? Apakah Tcl memiliki juru bahasa yang dapat menggunakannya? Atau hanya sebagai bagian dari program yang mendefinisikan argumen?
kukac67

1

R (60)

Memecahkan masalah menggunakan log10 untuk menghitung jumlah digit. Kasing khusus x == 0 dikenakan biaya 13 karakter, desah.

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

Tidak Disatukan:

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

Pemakaian

> f(898,2)
[1] 9

1

Scala ( 133 99 bytes):

Berfungsi untuk semua input positif. Dibagi dengan 10 pangkat digit yang dicari dari kanan, lalu bawa 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}

Terima kasih telah memperhatikan bug di rumus sebelumnya. Yang ini lebih pendek.


Saya suka itu! :) Di-voting
kukac67

Menguji solusi: k (Array ("1234", "7")) yang memberikan 9. Apakah itu tidak bekerja untuk n> #digits (x)?
lambruscoAcido

Itu karena 10 ^ -1 tidak tepat dalam notasi ini, jadi ada kesalahan pembulatan ketika Anda mengambil 10% pow (10, -1) yang seharusnya memberikan nol tetapi memberi 0,0999 sebagai gantinya. Mengoreksi jawaban saya untuk mengakomodasi efek samping ini.
Mikaël Mayer

1

Haskell, 142

Saya tidak yakin saya memahami pertanyaan dengan benar, tetapi ini adalah apa yang saya pikir Anda inginkan: baca stdin (string), buat dua angka int (bukan string), lakukan beberapa hal algoritmik, dan kemudian hasilkan hasilnya (string). Saya menjejalkannya ke 142 karakter, yang terlalu banyak:

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

contoh penggunaan:

> echo 96594 4 | getIndex
9

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)

Murni matematis, tidak ada dawai, tidak satupun dari mereka. Mengambil nomor pertama di prompt pertama dan nomor kedua di prompt kedua.

Test case :

Input: 97654 5
Output: 4

Input: 224658 3
Output: 4

Kode Tidak Terkunci:

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

1

perl, 38, 36   no 30 karakter

(tidak termasuk linefeed)

Ini bisa dibilang curang karena saklar perintah, tapi terima kasih telah mengizinkan saya bermain :-)

~/$ 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

edit :

Dapat menghapus 2 karakter:

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

... lalu 6 lainnya:

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

Bagaimana

Kami membagi input argumen pertama ke skrip $ARGV[0]dengan karakter ( split//) membuat array yang diindeks nol; menambahkan satu ke argumen kedua $ARGV[1]ke skrip kemudian sesuai dengan elemen pada posisi itu di string atau argumen pertama. Kami kemudian memegang ekspresi di dalam ()sebagai daftar satu elemen yang sayakan diulangi. Untuk versi pendek yang lebih pendek, kita hanya perlu shiftargumen pertama dan menggunakan bagian @ARGV yang tersisa untuk digunakan untuk indeks - setelah diedit shifthanya argumen kedua yang tersisa jadi kita pop()dan kurangi 1.

Apakah ini seharusnya menjadi latihan matematika? Saya baru sadar saya mengindeks string yang dibaca dari input, jadi ... Saya kira saya kehilangan ?? Tandai saya jika saya masuk akal di lapangan golf paralel dan saya akan mencoba lagi - lebih matematis - dalam jawaban terpisah.

Bersulang,


Yup, maaf, Tanpa menggunakan string . Selamat datang di PPCG!
Digital Trauma

OK maaf soal itu ... sejauh ini pendekatan matematis saya tidak terlalu layak untuk golf :-)
G. Cito

0

PHP, 58

Hanya menggunakan matematika

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


1
Tidakkah ini menemukan dari kanan?
cjfaure

2
Anda dapat menyimpan 1 char dengan mengubahnya ke echo$n%10.
Amal Murali

@ Benar tidak, itu benar-benar loop sampai angka yang dimasukkan tidak lebih besar dari 10 ^ x, x menjadi angka digit. Jadi, misalnya, jika Anda memasukkan 3457 sebagai angka dan 2 sebagai angka, itu akan menghilangkan digit terakhir hingga jumlahnya menjadi lebih kecil dari 100 (10 ^ 2). Itu berarti akan menghilangkan 5 dan 7, karena 34 akan tetap ada dan tidak lebih besar dari 100. Kemudian hanya menampilkan digit terakhir (4).
dkasipovic

Tetapi memang benar bahwa jika angka kedua lebih besar dari jumlah digit, Anda menghasilkan 9 dan bukan nol
Mikaël Mayer

Begitu ya, itu mengeluarkan digit terakhir jika angkanya lebih besar dari jumlah digit. Jika Anda memasukkan angka 1234 dan 5, Anda akan mendapatkan 4 sejak 1234 saya sudah kurang dari 10 ^ 5.
dkasipovic

0

~ - ~! - 94 93

Tekuk aturan sedikit - ini adalah fungsi yang mengambil n sebagai input dan mengasumsikan nomor untuk menemukan digit n disimpan ''''' - dan ~ - ~! tidak mendukung pelampung.

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

'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:akan menghasilkan ''''''menjadi ~~(2) ('' '' '= 128).


Hm ... Namun bahasa esoterik lainnya?
VisioN

@VisioN itu tidak terlalu esoteris, hanya saja satu-satunya tipe data asli adalah angka dan tidak dapat berinteraksi dengan os / internet. esolangs.org/wiki/No_Comment
cjfaure

1
Bagi saya setiap sintaks yang tidak mudah dibaca oleh manusia adalah esoterik. Dan ya, Perl juga esoteris menurut teori ini:)
VisioN

@VisioN Mudah dibaca setelah beberapa saat. : P
cjfaure

0

Python 2.7 (89 bytes)

Saya mengubah bilangan bulat menjadi "polinomial" dengan menggunakan daftar angka. Saya tahu Anda mengatakan Anda tidak dapat menerimanya, tetapi saya tidak mengerti mengapa tidak karena menggunakan konsep matematika angka yang direpresentasikan sebagai polinomial dari pangkalan mereka. Ini hanya akan gagal ketika bilangan bulat yang lewat adalah 0, tetapi Anda mengatakan tidak ada nol empuk;)

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]

Jalankan sebagai test.py:

$ python test.py 726489 5
8

Saya berasumsi bahwa Anda menginginkan input shell dan bahwa saya tidak dapat memanfaatkan fakta bahwa input tersebut adalah string. Melewatkan input shell hanya 43 byte, dengan:

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

Meskipun saya menggunakan beberapa iterasi yang tidak perlu, saya menyimpan beberapa byte dengan tidak menambahkan pengurangan tambahan n.


0

Extended BrainFuck : 49

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

Pemakaian:

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

Saya tidak menggunakan fitur-fitur khusus EBF kecuali untuk operator perkalian (mis. 10+ => ++++++++++). Selain itu kebanyakan BrainFuck murni

Bagaimana itu bekerja:

+                ; 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

Skema (R6RS): 100 (tanpa spasi yang tidak perlu)

(let*((x(read))(n(read))(e(expt 10(-(floor(+(/(log x)(log 10))1))n))))
  (exact(div(mod x(* e 10))e)))

0

awk - 53

{for(d=10^9;!int($1/d)||--$2;d/=10);$0=int($1/d)%10}1
  1. potong digit dengan pembagian, dimulai dengan maks. mungkin untuk 32 bit int tanpa tanda
  2. ketika kita menekan sisi kiri bilangan bulat, int ($ 1 / d) mengembalikan non-nol
  3. lanjutkan n ($ 2) digit yang melewati itu

Tidak Disatukan:

{
    for(d = 1000000000; int($1 / d) != 0 || --$2; d /= 10);
    print int($1 / d) % 10;
}

0

Scala (83)

Tidak menggunakan fitur khusus Scala. Melainkan solusi standar.

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

Tidak Disatukan:

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

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, tidak valid karena menggunakan array.

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]);}

Saya melarang array dalam edit (sebelum Anda memposting ini) ... Tapi saya suka bagaimana Anda melakukan ini. :)
kukac67

OK, saya tidak melihat dengan benar. Saya telah menambahkan solusi menghindari array.
VX

0

Julia 37

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

Karena operator bawaan. Aritmatika presisi sewenang-wenang memungkinkan untuk berbagai ukuran int.

Sampel

julia> d(1231198713987192871,10)
3

0

perl (sedikit lebih gila / tidak terlalu golf) - 99 karakter

 ~/$ 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);

Jalankan sebagai:

 perl -M5.010 -MPOSIX=floor ndigits.pl 726433 1

0

Perl6 - 85 karakter

my ($n,$i)=@*ARGS;
my$r=$n/10**(log10($n).round-$i);
say (($r/10-floor($r/10))*10).Int;

0

Smalltalk, 44

Meskipun dc tidak terkalahkan, berikut adalah solusi Smalltalk:

argumen, nomor n; d digit-nr untuk mengekstrak:

[:n :d|(n//(10**((n log:10)ceiling-d)))\\10]
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.