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 .

kukac67
sumber
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
$ 
Trauma Digital
sumber
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%
Peter Taylor
sumber
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.

aditsu berhenti karena SE adalah JAHAT
sumber
Saya berpendapat bahwa menempatkan basis 10 digit ke dalam array lebih merupakan operasi string daripada yang matematika.
Digital Trauma
4

Haskell 60 byte dan dapat dibaca

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

tidak ada ikatan!

*Main> nth 1234567 4
4
Martin Drautzburg
sumber
Ini bisa bermain golf hingga 36
Cristian Lupascu
Wow, Anda berjuang untuk setiap byte. 1 <2 "bukannya" true "- cute.
Martin Drautzburg
Itu yang kami lakukan di sini ...
Cristian Lupascu
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
algoritme hiu
sumber
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
Willem
sumber
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);}
SBI
sumber
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
$ 
Trauma Digital
sumber
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.

CompuChip
sumber
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);
}
bacchusbeale
sumber
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]&
CompuChip
sumber
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]
Slebetman
sumber
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
lambruscoAcido
sumber
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.

Mikaël Mayer
sumber
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
Flonk
sumber
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
Gaurang Tandon
sumber
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,

G. Cito
sumber
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;

dkasipovic
sumber
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).

cjfaure
sumber
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.

2rs2ts
sumber
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)))
Sylwester
sumber
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;
}
laindir
sumber
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 
lambruscoAcido
sumber
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]);}
VX
sumber
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
waTeim
sumber
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
G. Cito
sumber
0

Perl6 - 85 karakter

my ($n,$i)=@*ARGS;
my$r=$n/10**(log10($n).round-$i);
say (($r/10-floor($r/10))*10).Int;
G. Cito
sumber
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]
blabla999
sumber