Xuất các chữ số thứ n của một số nguyên


13

Không sử dụng các chuỗi (trừ khi cần thiết, chẳng hạn như với đầu vào hoặc đầu ra), tính toán chữ số thứ n, từ bên trái , của một số nguyên (trong cơ sở 10).

Đầu vào sẽ được đưa ra trong định dạng này:

726433 5

Đầu ra phải là:

3

vì đó là chữ số thứ năm của "726433".

Đầu vào sẽ không chứa các số 0 đứng đầu, ví dụ "00223".

Các trường hợp thử nghiệm / ví dụ khác:

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

Đây là mã golf; số lượng ký tự ít nhất sẽ thắng, nhưng bất kỳ chức năng tích hợp nào như "nthDigit (x, n)" đều không được chấp nhận .

Đây là một số mã giả để giúp bạn bắt đầu:

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

Như bạn có thể thấy tôi mới chơi golf, và mặc dù tôi nghĩ hơi bất công khi tôi đặt câu hỏi trước khi tôi trả lời, tôi thực sự muốn xem loại phản hồi này tạo ra. :)

Chỉnh sửa : Tôi đã hy vọng cho các câu trả lời toán học, vì vậy tôi thực sự không thể chấp nhận các câu trả lời dựa trên việc chuyển đổi chuỗi thành mảng hoặc có thể truy cập các số dưới dạng danh sách các chữ số.

Chúng ta có một người chiến thắng

Viết bằng "dc", 12 byte. Bằng DigitalTrauma .


Đây có thể chỉ là một chức năng hoặc nó cần phải xử lý I / O? Nếu nó không cần xử lý I / O, nó có thể đơn giản là lambda thay vì hàm không?
slebetman

Chỉnh sửa của bạn khiến nó không rõ ràng chính xác những gì bạn không thích. Cụ thể, với "có thể truy cập các số dưới dạng danh sách các chữ số", đó có phải là việc sử dụng các mảng dưới bất kỳ hình thức nào bạn không thích hay chỉ là sự tồn tại của các thói quen chuyển đổi cơ sở tích hợp?
Peter Taylor

@PeterTaylor Mảng các chữ số không ổn, vì người ta có thể dễ dàng lấy mục thứ n trong mảng. Tôi không chắc chắn làm thế nào chính xác chuyển đổi cơ sở hoạt động, nhưng nó có vẻ dễ dàng.
kukac67

Tại sao nó là một vấn đề để xây dựng một danh sách các chữ số? Đó là tính toán học cao - nó đại diện cho số là một đa thức.
2rs2ts

@ 2rs2ts Nếu bạn có thể tạo một danh sách các chữ số theo toán học, tức là không phân tích chuỗi thành một mảng, thì có thể chấp nhận được.
kukac67

Câu trả lời:


2

dc , 12 byte

?dZ?-Ar^/A%p

Đây là một câu trả lời toán học. Đây là cách nó hoạt động:

  • ? đọc số đầu vào và đẩy để xếp
  • d trùng lặp đầu ngăn xếp
  • Z Bỏ giá trị ra khỏi ngăn xếp, tính toán và đẩy số chữ số
  • ? đọc chỉ số chữ số và đẩy để xếp
  • - trừ chỉ số chữ số từ số chữ số
  • A đẩy 10 đến ngăn xếp
  • r trao đổi 2 giá trị hàng đầu trên ngăn xếp
  • ^ lũy thừa 10 ^ (số chữ số - chỉ số chữ số)
  • / chia số cho kết quả của lũy thừa
  • A đẩy 10 đến ngăn xếp
  • % tính số mod 10 để lấy chữ số cuối cùng và đẩy lên trên cùng của ngăn xếp
  • p bật và in đỉnh ngăn xếp

Trong hành động:

$ {tiếng vang 987654321; tiếng vang 1; } | dc ndigit.dc
9
$ {tiếng vang 987654321; tiếng vang 2; } | dc ndigit.dc
số 8
$ {tiếng vang 987654321; tiếng vang 8; } | dc ndigit.dc
2
$ {tiếng vang 987654321; tiếng vang 9; } | dc ndigit.dc
1
$ 

1
Tôi nghĩ bạn là người chiến thắng. Đây là mã ngắn thứ ba, nhưng 2 mã ngắn nhất được sử dụng base conversion -> arrays.
kukac67

5

GolfScript (10 byte)

~(\10base=

Giả định đầu vào này là một chuỗi (ví dụ thông qua stdin). Nếu đó là hai số nguyên trên ngăn xếp, thì ban đầu ~nên xóa, lưu 1 char.

Nếu chuyển đổi cơ sở được coi là phạm lỗi của quy tắc chức năng tích hợp, tôi có một thay thế 16 char:

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

Chương trình đầu tiên của bạn với chuyển đổi cơ sở chỉ xuất ra chữ số đầu tiên nếu bạn nhập "0" và lần thứ hai nếu bạn nhập "1". golfscript.apphb.com/?c=MjcwNiAxCgpcMTBiYXNlPQ%3D%3D
kukac67

@ kukac67, đã sửa.
Peter Taylor

4

CJam - 7

l~(\Ab=

CJam là ngôn ngữ mới tôi đang phát triển, tương tự như GolfScript - http://sf.net/p/cjam . Đây là lời giải thích:

lđọc một dòng từ đầu vào
~đánh giá chuỗi (do đó nhận được hai số) làm
(giảm số thứ hai
\hoán đổi các số
Alà một biến được định sẵn thành 10
bđể chuyển đổi cơ sở, tạo một mảng với 10 chữ số cơ bản của số thứ nhất
= đạt được mong muốn phần tử của mảng

Chương trình về cơ bản là một bản dịch của giải pháp của Peter Taylor.


Tôi sẽ tranh luận việc đặt 10 chữ số cơ bản vào một mảng là một hoạt động chuỗi hơn là một toán học.
Chấn thương kỹ thuật số


3

J - 15 24 char

Một "câu trả lời toán học" đầy đủ.

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

Kết quả tương tự như dưới đây, nhưng được ban cho chất lượng thần bí của toán học.


Phiên bản ngắn, sử dụng mở rộng cơ sở 10.

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

Chúng tôi trả trước 0 để điều chỉnh cho lập chỉ mục dựa trên 1.

Sử dụng:

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

2
Chuỗi không được phép.
0xcaff

2

Con trăn 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

Bạn không cần định nghĩa nó là fn:def f(i,n): ... return d
smci

Bạn không cần phải tỉnh táo - kiểm tra if n>k: return -1trường hợp.
smci

... và bạn chắc chắn không cần phải thực hiện lần đầu tiên chỉ để đếm k (số chữ số trong i), để so sánh nó với n.
smci

2

C, 50

Điều này sử dụng mảng.

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

Chỉ cần bỏ qua tất cả các cảnh báo.

Và vâng, trong C, chuỗi thực sự chỉ là mảng, vì vậy đây là loại giá rẻ.


Toán học hơn:

C, 83

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

không phải nó sử dụng các hàm chuỗi / mảng sao?
VX

Cái thứ nhất làm, giống như nó nói;) Cái thứ hai rõ ràng là không, ngoài strlen, cái mà tôi chọn đơn giản vì nó ngắn hơn so với sử dụng nhật ký. Nếu đó là một vấn đề dễ dàng, tôi có thể thêm nó khi tôi về nhà.
SBI

Ở đó chúng tôi đi, thêm phiên bản toán học thuần túy.
SBI

2
Toán học - thậm chí không chỉ một lần!
Potzblitz

2

bc (điều khiển bởi bash), 41 29

Tôi nghĩ rằng đây là câu trả lời đầu tiên để làm điều này một cách toán học chứ không phải bằng các chuỗi:

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

Việc sử dụng length()có lẽ hơi phức tạp, nhưng trang bc man nói về số chữ số và không phải độ dài của chuỗi:

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

Đầu ra:

$ ./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 Tôi đánh giá cao sự chấp nhận bỏ phiếu! Nhưng tôi nghĩ rằng thông thường các câu hỏi về môn đánh gôn sẽ bị bỏ ngỏ hơn 2 giờ để khuyến khích nhiều câu trả lời hơn. Có lẽ một tuần hoặc lâu hơn. Tôi sẽ không bị xúc phạm nếu bạn không chấp nhận câu trả lời này :)
Chấn thương kỹ thuật số

1
đồng ý. Tôi sẽ không chấp nhận sau đó. Hy vọng bạn không thắng! : P
kukac67

1

Toán học - 24 23

Đây là một loại hiển nhiên :)

IntegerDigits[#][[#2]]&

Thí dụ:

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

Đầu ra:

3

Bạn có thể rút ngắn hơn bằng cách mã hóa hai số nguyên, vd

IntegerDigits[n][[m]]

nhưng sau đó bạn phải viết n = 726433; m = 5;. Các cuộc gọi chức năng cảm thấy tương tự như một chương trình.


1
Bạn có thể thả số 1.
DavidC

Bây giờ đây là gian lận ..: D
kukac67

1

C 145

Chương trình tìm khoảng cách từ cuối số nguyên và chia cho đến khi đạt được chỉ số sau đó sử dụng mô đun 10 để lấy chữ số cuối cùng.

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

Điều này có thể được đánh golf đáng kể. Bắt đầu với những lời khuyên này
Chấn thương kỹ thuật số

Để bắt đầu, các phôi (int) và parens liên quan là không cần thiết
Chấn thương kỹ thuật số

1
Tôi không thể cưỡng lại. Tôi đánh gôn xuống còn 87 ký tự : i,a;main(){scanf("%d%d",&i,&a);for(a=log(i)/log(10)+1-a;a--;)i/=10;printf("%d",i%10);}.
Chấn thương kỹ thuật số

1

Wolfram Alpha - từ 40 đến 43

Tất nhiên, tôi hoàn toàn có thể bảo vệ rằng sử dụng IntegerDigitslà một mánh khóe không thuộc

bất kỳ chức năng được xây dựng nào, chẳng hạn như "nthDigit (x, n)"

Nhưng bởi vì câu trả lời trước đây của tôi vẫn cảm thấy như gian lận một chút, đây là một giải pháp thay thế. Thật không may, nó khá lâu hơn một chút, nhưng tôi không thấy làm thế nào để rút ngắn nó nhiều hơn tôi đã làm.

Đếm theo cách tương tự như trước đây (với ký hiệu, mà không vượt qua trong bất kỳ đối số nào),

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

có 43 ký tự. Bằng cách phủ định số mũ và xáo trộn các thuật ngữ xung quanh, tôi có thể mất một toán tử số học ( 10^(...)xsẽ được hiểu là phép nhân)

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

Tôi không có Mathicala trong tay để kiểm tra, tôi nghi ngờ rằng đó sẽ là Như tôi nghi ngờ (và như đã được xác minh bởi kukac67 ) trong Mathicala, điều này không được chấp nhận, nhưng nó chạy trong WolframAlpha .

Tôi nghi ngờ về việc sử dụng RealDigits, bởi vì tôi đã hạn chế sử dụng IntegerDigitscho câu trả lời này và chúng khá giống nhau. Tuy nhiên, nếu tôi cho phép bản thân bao gồm nó (sau tất cả, nó không trả về số nguyên trực tiếp, chỉ có bao nhiêu trong số chúng), tôi có thể cắt giảm hai ký tự khác:

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

Tôi đã thử nó trong Mathicala, nó không tạo ra giá trị. 43 ký tự một xuất hiện điều này:Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
kukac67

Vâng, tôi đã tìm ra nhiều. Wolfram Alpha nhẹ nhàng hơn một chút trong việc diễn giải đầu vào. May mắn thay tôi đã cho nó tiêu đề chính xác;)
CompuChip

Nhưng tôi thấy nó hoạt động trên WolframAlpha.
kukac67

{sửa} Mặc dù tôi thấy liên kết bị hỏng ... dường như không giống như các [ký tự ngay cả khi chúng được mã hóa. Tôi sẽ kéo nó thông qua một trình rút ngắn URL. {edit2} Rõ ràng W.Alpha có một - đã thay đổi liên kết.
CompuChip

1

Tcl (42 byte, lambda):

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

(49 byte, hàm):

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

(83 byte, nếu chúng ta cần chấp nhận đầu vào từ shell):

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

Cái này hoạt động ra sao?
kukac67

Thêm lời giải thích. Đó chỉ là cách rõ ràng nhất để làm điều đó một cách toán học. Làm thế nào bạn làm điều đó trên giấy.
slebetman

Tôi nghĩ rằng bạn đang đếm từ kết thúc sai.
Peter Taylor

Hmm .. vâng. Hình như nó Tôi sẽ sửa lại để đếm mẫu bên trái.
slebetman

Tôi sẽ chấp nhận 31 byte. Mặc dù làm thế nào lambda có thể được chạy? Tcl có trình thông dịch có thể sử dụng nó không? Hay chỉ là một phần của chương trình xác định các đối số?
kukac67

1

R (60)

Giải bài toán bằng log10 để tính số chữ số. Trường hợp đặc biệt x == 0 có giá 13 ký tự, thở dài.

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

Ung dung:

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

Sử dụng

> f(898,2)
[1] 9

1

Scala ( 133 99 byte):

Hoạt động cho tất cả các đầu vào tích cực. Chia cho 10 cho sức mạnh của chữ số tìm kiếm từ bên phải, sau đó lấy nó theo modulo 10.

def k (i: Mảng [Chuỗi]) = {val m = i (0) .toInt
(m * Math.pow (10, i (1) .toInt-1-Math.log10 (m) toInt)). toInt% 10}

Cảm ơn bạn đã nhận thấy lỗi trong công thức trước. Cái này ngắn hơn


Tôi thích nó! :) Được bình chọn
kukac67

Đã thử nghiệm giải pháp: k (Mảng ("1234", "7")) cho 9. Nó không hoạt động cho n> #digits (x)?
lambruscoAcido

Đó là bởi vì 10 ^ -1 không chính xác trong ký hiệu này, do đó, có một lỗi làm tròn khi bạn lấy 10% pow (10, -1) đáng lẽ nên cho 0 nhưng thay vào đó là 0,0999. Sửa câu trả lời của tôi để chứa tác dụng phụ này.
Mikaël Mayer

1

Haskell, 142

Tôi không chắc mình đã hiểu chính xác câu hỏi, nhưng đây là điều tôi nghĩ bạn muốn: đọc stdin (chuỗi), tạo hai số int (không phải chuỗi), thực hiện một số điều thuật toán và sau đó xuất kết quả (chuỗi). Tôi nhồi nhét nó vào 142 ký tự, đó là quá nhiều:

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

sử dụng ví dụ:

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

Hoàn toàn là toán học, không có chuỗi, không ai trong số họ. Lấy số thứ nhất trong dấu nhắc thứ nhất và số thứ hai trong dấu nhắc thứ hai.

Trường hợp thử nghiệm :

Input: 97654 5
Output: 4

Input: 224658 3
Output: 4

Mã bị hủy bỏ:

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   không 30 ký tự

(không tính dòng thức ăn)

Điều này được cho là gian lận do chuyển đổi lệnh, nhưng cảm ơn vì đã cho tôi chơi :-)

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

chỉnh sửa :

Đã có thể xóa 2 ký tự:

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

... Sau đó thêm 6:

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

Làm sao

Chúng tôi chia đầu vào của đối số đầu tiên cho tập lệnh $ARGV[0]theo ký tự ( split//) tạo ra một mảng được lập chỉ mục bằng không; thêm một vào đối số thứ hai $ARGV[1]vào tập lệnh sau đó tương ứng với phần tử ở vị trí đó trong chuỗi hoặc đối số thứ nhất. Sau đó chúng ta giữ biểu thức bên trong ()dưới dạng một danh sách một phần tử saysẽ lặp lại. Đối với phiên bản ngắn hơn, chúng tôi chỉ cần shifttrong đối số đầu tiên và sử dụng phần còn lại của @ARGV để sử dụng cho chỉ mục - một khi shifted chỉ còn lại đối số thứ hai nên chúng tôi pop()trừ và trừ đi 1.

Đây có phải là một bài tập toán? Tôi mới nhận ra mình đang lập chỉ mục một chuỗi đọc từ đầu vào, vì vậy ... Tôi đoán là tôi thua ?? Đánh dấu tôi nếu tôi có ý nghĩa trong sân golf song song và tôi sẽ thử lại - về mặt toán học hơn - trong một câu trả lời riêng.

chúc mừng


Yup, xin lỗi, không sử dụng chuỗi . Chào mừng bạn đến với PPCG nào!
Chấn thương kỹ thuật số

Xin lỗi, xin lỗi vì ... cho đến nay phương pháp toán học của tôi không xứng đáng với môn đánh gôn :-)
G. Cito

0

PHP, 58

Chỉ sử dụng toán

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


1
Điều này không tìm thấy từ bên phải?
cjfaure

2
Bạn có thể lưu 1 char bằng cách thay đổi nó thành echo$n%10.
Amal Murali

@Trimsty không, nó thực sự lặp cho đến khi số đã nhập không lớn hơn 10 ^ x, x là số chữ số. Vì vậy, ví dụ, nếu bạn nhập 3457 dưới dạng số và 2 dưới dạng chữ số, nó sẽ lấy đi chữ số cuối cùng cho đến khi số trở nên nhỏ hơn 100 (10 ^ 2). Điều đó có nghĩa là nó sẽ lấy đi 5 và 7, bởi vì sau đó 34 vẫn còn và nó không lớn hơn 100. Sau đó, nó chỉ xuất ra chữ số cuối cùng (4).
dkasipovic

Nhưng sự thật là nếu số thứ hai lớn hơn số chữ số, bạn xuất ra 9 chứ không phải số 0
Mikaël Mayer

Tôi thấy, nó xuất ra chữ số cuối nếu số nếu lớn hơn số chữ số. Nếu bạn nhập 1234 và chữ số thứ 5, bạn sẽ nhận được 4 kể từ 1234 tôi đã ít hơn 10 ^ 5.
dkasipovic

0

~ - ~! - 94 93

Bẻ cong các quy tắc một chút - đó là một hàm lấy n làm đầu vào và giả sử số để tìm chữ số n của được lưu trữ trong '''''- và ~ - ~! không hỗ trợ phao.

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

'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:sẽ dẫn đến kết quả ''''''~~(2) ('' '' '= 128).


Hừm ... Còn một ngôn ngữ bí truyền nữa?
VisioN

@VisioN nó không thực sự bí truyền, chỉ là loại dữ liệu gốc duy nhất là một số và nó không thể tương tác với os / internet. esolangs.org/wiki/No_Ver
cjfaure

1
Chà, với tôi mọi cú pháp mà con người không thể dễ dàng đọc được là bí truyền. Và vâng, Perl cũng là bí truyền theo lý thuyết này:)
VisioN

@VisioN Nó dễ đọc sau một thời gian. : P
cjfaure

0

Python 2.7 (89 byte)

Tôi biến đổi số nguyên thành "đa thức" bằng cách sử dụng danh sách các chữ số. Tôi biết bạn nói rằng bạn không thể chấp nhận điều đó, nhưng tôi không hiểu tại sao không vì nó sử dụng khái niệm toán học về các số được biểu diễn dưới dạng đa thức của các cơ sở của chúng. Nó sẽ chỉ thất bại khi số nguyên được truyền vào là 0, nhưng bạn đã nói không có số 0 được đệm;)

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]

Chạy như test.py:

$ python test.py 726489 5
8

Tôi giả sử bạn muốn đầu vào shell và tôi không thể sử dụng thực tế là đầu vào sẽ là chuỗi. Bỏ qua đầu vào shell chỉ là 43 byte, với:

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

Mặc dù tôi sử dụng một số lần lặp không cần thiết, tôi vẫn lưu một số byte bằng cách không thêm phần giảm giá vào n.


0

BrainFuck mở rộng : 49

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

Sử dụng:

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

Tôi không sử dụng bất kỳ tính năng đặc biệt nào của EBF ngoại trừ toán tử nhân (ví dụ. 10+ => ++++++++++). Khác với điều đó chủ yếu là BrainFuck thuần túy

Làm thế nào nó hoạt động:

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

Lược đồ (R6RS): 100 (không có khoảng trắng không cần thiết)

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

0

ôi - 53

{for(d=10^9;!int($1/d)||--$2;d/=10);$0=int($1/d)%10}1
  1. cắt các chữ số bằng cách chia, bắt đầu với tối đa có thể cho int 32 bit không dấu
  2. khi chúng ta nhấn vào bên trái của số nguyên, int ($ 1 / d) trả về khác không
  3. tiếp tục n ($ 2) chữ số qua đó

Ung dung:

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

0

Scala (83)

Không sử dụng bất kỳ tính năng đặc biệt Scala. Thay vào đó là giải pháp chuẩn.

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

Ung dung:

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, không hợp lệ vì sử dụng mảng.

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

Tôi không cho phép các mảng trong một chỉnh sửa (trước khi bạn đăng bài này) ... Nhưng tôi thích cách bạn đã làm điều này. :)
kukac67

OK, tôi đã không nhìn đúng. Tôi đã thêm một giải pháp tránh mảng.
VX

0

Julia 37

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

Do toán tử dựng sẵn ^. Số học chính xác tùy ý cho phép bất kỳ kích thước int.

Mẫu vật

julia> d(1231198713987192871,10)
3

0

perl (toán học hơn một chút / không chơi gôn lắm) - 99 ký tự

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

Chạy nó như:

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

0

Perl6 - 85 ký tự

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

0

Smalltalk, 44

Mặc dù dc là vô địch, đây là một giải pháp Smalltalk:

đối số, số n; d chữ số-nr để giải nén:

[:n :d|(n//(10**((n log:10)ceiling-d)))\\10]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.