เอาต์พุตตัวเลข nth ของจำนวนเต็ม


13

โดยไม่ต้องใช้สตริง (ยกเว้นเมื่อจำเป็นเช่นกับอินพุทหรือเอาท์พุท) คำนวณตัวเลขที่ n จากทางซ้ายของจำนวนเต็ม (ในฐาน 10)

อินพุตจะได้รับในรูปแบบนี้:

726433 5

ผลลัพธ์ควรเป็น:

3

ตามที่เป็นหลักที่ห้าของ "726433"

ข้อมูลที่ป้อนจะไม่มีศูนย์นำหน้าเช่น "00223"

กรณีทดสอบ / ตัวอย่างเพิ่มเติม:

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

นี่คือรหัสกอล์ฟ จำนวนน้อยที่สุดของการชนะตัวอักษร แต่สร้างใด ๆ ในฟังก์ชั่นเช่น "nthDigit (x, n)" เป็นที่ยอมรับไม่ได้

นี่คือโค้ดหลอกบางอย่างที่จะช่วยคุณเริ่มต้นใช้งาน:

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

อย่างที่คุณเห็นฉันเป็นนักกอล์ฟมือใหม่และถึงแม้ว่าฉันคิดว่ามันค่อนข้างไม่ยุติธรรมเลยที่ฉันจะถามคำถามก่อนที่ฉันจะตอบแม้แต่คนเดียว :)

แก้ไข : ฉันหวังว่าจะได้คำตอบทางคณิตศาสตร์ดังนั้นฉันจึงไม่สามารถยอมรับคำตอบที่ต้องพึ่งพาการแปลงสตริงเป็นอาร์เรย์หรือสามารถเข้าถึงตัวเลขเป็นรายการตัวเลขได้

เรามีผู้ชนะ

เขียนเป็น "dc" ขนาด12ไบต์ โดยDigitalTrauma


นี่เป็นเพียงฟังก์ชันหรือต้องจัดการ I / O หรือไม่ หากไม่จำเป็นต้องจัดการ I / O มันสามารถเป็นแลมบ์ดาแทนฟังก์ชั่นได้หรือไม่?
slebetman

การแก้ไขของคุณทำให้ไม่ชัดเจนว่าคุณไม่ชอบอะไร โดยเฉพาะอย่างยิ่งกับ "ความสามารถในการเข้าถึงตัวเลขเป็นรายการของตัวเลข" มันคือการใช้อาร์เรย์ในรูปแบบใด ๆ ที่คุณไม่ชอบหรือเพียงแค่การดำรงอยู่ของการแปลงฐานในตัวหรือไม่?
Peter Taylor

@PeterTaylor อาร์เรย์ของตัวเลขไม่เป็นไรเพราะใคร ๆ ก็สามารถคว้ารายการที่ n ในอาร์เรย์ได้อย่างง่ายดาย ฉันไม่แน่ใจว่าการแปลงฐานทำงานอย่างไร แต่ดูเหมือนง่าย
kukac67

ทำไมมันถึงมีปัญหาในการสร้างรายการตัวเลข? นั่นคือคณิตศาสตร์อย่างสูง - มันแสดงถึงจำนวนเป็นพหุนาม
2rs2ts

@ 2rs2ts หากคุณสามารถสร้างรายการตัวเลขทางคณิตศาสตร์เช่นโดยไม่ต้องแยกสตริงลงในอาร์เรย์ก็อาจเป็นที่ยอมรับได้
kukac67

คำตอบ:


2

dc , 12 ไบต์

?dZ?-Ar^/A%p

นี่คือคำตอบทางคณิตศาสตร์ นี่คือวิธีการทำงาน:

  • ? อ่านหมายเลขอินพุตและกดไปที่สแต็ก
  • d ซ้ำกันด้านบนของสแต็ก
  • Z ดึงค่าออกจากสแต็กคำนวณและผลักดันจำนวนหลัก
  • ? อ่านดัชนีหลักและกดไปที่สแต็ก
  • - ลบดัชนีหลักจากการนับจำนวน
  • A กด 10 ไปที่สแต็ก
  • r สลับค่าสูงสุด 2 บนสแต็ก
  • ^ เลขชี้กำลัง 10 ^ (จำนวนหลัก - ดัชนีหลัก)
  • / หารจำนวนด้วยผลลัพธ์ของการยกกำลัง
  • A กด 10 ไปที่สแต็ก
  • % คำนวณหมายเลข mod 10 เพื่อรับตัวเลขสุดท้ายและกดไปที่ด้านบนสุดของสแต็ก
  • p พิมพ์และพิมพ์ส่วนบนสุดของสแต็ก

ในการดำเนินการ:

$ {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
$ 

1
ฉันคิดว่าคุณเป็นผู้ชนะ นี่คือโค้ดที่สั้นที่สุดที่สาม แต่ที่สั้นที่สุด 2 base conversion -> arraysใช้
kukac67

5

GolfScript (10 ไบต์)

~(\10base=

สิ่งนี้ถือว่าอินพุตเป็นสตริง (เช่นผ่าน stdin) ถ้ามันเป็นจำนวนเต็มสองจำนวนบนสแต็ก~ควรลบค่าเริ่มต้นโดยประหยัด 1 อักขระ

หากการแปลงฐานถือว่าผิดกฎฟังก์ชันในตัวฉันมีตัวเลือก 16-char:

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

โปรแกรมแรกของคุณที่มีการแปลงฐานจะแสดงผลหลักแรกเฉพาะเมื่อคุณป้อน "0" และที่สองหากคุณป้อน "1" golfscript.apphb.com/?c=MjcwNiAxCgpcMTBiYXNlPQ%3D%3D
kukac67

@ kukac67 แก้ไขแล้ว
Peter Taylor

4

CJam - 7

l~(\Ab=

CJam เป็นภาษาใหม่ฉันกำลังพัฒนาคล้ายกับ GolfScript - http://sf.net/p/cjam นี่คือคำอธิบาย:

lอ่านบรรทัดจากอินพุต
~เพื่อประเมินสตริง (ดังนั้นรับตัวเลขสองตัว)
(ลดจำนวนที่สอง
\สลับตัวเลข
Aเป็นตัวแปร preinitialized ถึง 10
bทำการแปลงฐานทำให้อาร์เรย์ที่มีตัวเลขฐาน 10 หลักของตัวเลขแรก
=ต้องการ องค์ประกอบของอาร์เรย์

โปรแกรมนี้เป็นคำแปลของโซลูชันของ Peter Taylor


ฉันจะยืนยันว่าการใส่ฐาน 10 หลักลงในอาเรย์นั้นเป็นการดำเนินการของสตริงมากกว่าทางคณิตศาสตร์
Digital Trauma

4

Haskell 60 ไบต์และอ่านได้

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

ไม่มีส่วนเกี่ยวข้อง!

*Main> nth 1234567 4
4


ว้าวคุณต่อสู้เพื่อทุกไบต์ 1 <2 "แทนที่จะเป็น" ของจริง "- น่ารัก
มาร์ตินเดรทซ์บูร์ก


3

J - 15 24 ถ่าน

คำตอบทางคณิตศาสตร์ที่เพียงพอ

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

ผลลัพธ์เช่นเดียวกับด้านล่าง แต่ได้รับการรับรองด้วยคุณภาพที่ลึกลับของการเป็นคณิตศาสตร์


เวอร์ชั่นสั้นโดยใช้การขยายฐาน 10

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

เราเพิ่ม 0 เพื่อปรับสำหรับการจัดทำดัชนีแบบ 1

การใช้งาน:

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

2
ไม่อนุญาตให้ใช้เงื่อนไข
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

คุณไม่จำเป็นต้องกำหนดเป็น fn:def f(i,n): ... return d
smci

คุณไม่จำเป็นต้องมีสติตรวจสอบif n>k: return -1เคส
smci

... และแน่นอนว่าคุณไม่จำเป็นต้องทำบัตรผ่านรอบแรกเพื่อนับ k (จำนวนหลักใน i) เพื่อให้มีสติเปรียบเทียบกับ n
smci

2

C, 50

สิ่งนี้ใช้อาร์เรย์

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

เพียงเพิกเฉยต่อคำเตือนทั้งหมด

และใช่ใน C สตริงเป็นเพียงอาร์เรย์ดังนั้นนี่คือราคาถูก


คณิตศาสตร์เพิ่มเติม:

C, 83

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

มันไม่ได้ใช้ฟังก์ชั่นสตริง / อาร์เรย์?
VX

อย่างแรกคือ, อย่างที่มันบอก;) อันที่สองไม่ชัด, นอกเหนือจาก strlen, ซึ่งฉันเลือกเพียงเพราะว่ามันสั้นกว่าการใช้ท่อนซุง หากนั่นเป็นปัญหาที่แก้ไขได้ง่ายฉันสามารถเพิ่มได้เมื่อกลับถึงบ้าน
SBI

ที่นั่นเราไปเพิ่มรุ่นคณิตศาสตร์อย่างหมดจด
SBI

2
คณิตศาสตร์ - ไม่แม้แต่ครั้งเดียว!
Potzblitz

2

bc (ขับเคลื่อนโดยทุบตี), 41 29

ฉันคิดว่านี่เป็นคำตอบแรกของการคำนวณทางคณิตศาสตร์และไม่ใช้กับสตริง:

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

การใช้งานlength()อาจจะดูเป็นเรื่องเล็กน้อย แต่หน้า bc พูดถึงจำนวนของตัวเลขและไม่ใช่ความยาวของสตริง:

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

เอาท์พุท:

$ ./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 ฉันขอขอบคุณการโหวตโหวต! แต่ฉันคิดว่ามันเป็นเรื่องธรรมดาสำหรับคำถามเกี่ยวกับการตีกอล์ฟที่จะเปิดทิ้งไว้นานกว่า 2 ชั่วโมงเพื่อสนับสนุนคำตอบเพิ่มเติม บางทีประมาณหนึ่งสัปดาห์ ฉันจะไม่โกรธเคืองถ้าคุณไม่ยอมรับคำตอบนี้ :)
แผลเก่าแบบดิจิตอล

1
ตกลง. ฉันจะยกเลิกการยอมรับแล้ว หวังว่าคุณจะไม่ชนะ! : P
kukac67

1

Mathematica - 24 23

อันนี้ชัดเจนมาก :)

IntegerDigits[#][[#2]]&

ตัวอย่าง:

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

เอาท์พุท:

3

คุณสามารถทำให้สั้นลงโดยการเข้ารหัสจำนวนเต็มสองจำนวนอย่างหนักเช่น

IntegerDigits[n][[m]]

n = 726433; m = 5;แต่แล้วคุณต้องเขียน การเรียกใช้ฟังก์ชันรู้สึกคล้ายกับโปรแกรมมากขึ้น


1
1คุณสามารถวางจำนวน
DavidC

ตอนนี้นี่เป็นการโกง .. : D
kukac67

1

ค 145

โปรแกรมค้นหาระยะทางจากจุดสิ้นสุดของจำนวนเต็มและหารจนกว่าจะถึงดัชนีจากนั้นใช้โมดูลัส 10 เพื่อรับตัวเลขสุดท้าย

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

นี้สามารถเล่นกอล์ฟอย่างมีนัยสำคัญ เริ่มต้นด้วยเคล็ดลับเหล่านี้
Digital Trauma

สำหรับการเริ่มต้นการใช้งาน (int) casts และ parens ที่เกี่ยวข้องนั้นไม่จำเป็น
Digital Trauma

1
ฉันไม่สามารถต้านทาน ผมแข็งแรงเล่นกอล์ฟมันลงไป 87 i,a;main(){scanf("%d%d",&i,&a);for(a=log(i)/log(10)+1-a;a--;)i/=10;printf("%d",i%10);}ตัวอักษร:
บาดเจ็บทางดิจิตอล

1

Wolfram Alpha - ระหว่าง 40 และ 43

แน่นอนว่าฉันสามารถป้องกันการใช้งานได้อย่างสมบูรณ์IntegerDigitsคือกลลวงที่ไม่ตกอยู่ภายใต้

ฟังก์ชันในตัวเช่น "nthDigit (x, n)"

แต่เนื่องจากคำตอบก่อนหน้านี้ของฉันยังคงรู้สึกว่าโกงนิดหน่อยนี่เป็นทางเลือก น่าเสียดายที่มันค่อนข้างนานกว่านี้ แต่ฉันไม่เห็นวิธีที่จะย่อให้สั้นลงกว่าที่ฉันทำ

การนับในทำนองเดียวกันเหมือนเมื่อก่อน (ด้วยเครื่องหมายและโดยไม่ผ่านการขัดแย้งใด ๆ )

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

มี 43 ตัวอักษร โดยการลบล้างเลขชี้กำลังและสับเปลี่ยนเงื่อนไขฉันสามารถสูญเสียหนึ่งตัวดำเนินการทางคณิตศาสตร์ ( 10^(...)xจะถูกตีความเป็นการคูณ)

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

ฉันไม่ได้มี Mathematica ที่อยู่ในมือในการทดสอบผมสงสัยว่ามันจะเป็นอย่างที่ผมสงสัยว่า (และตามที่ได้กรุณาตรวจสอบโดย kukac67 ) ใน Mathematica นี้ไม่เป็นที่ยอมรับ แต่ก็ทำงานใน WolframAlpha

ฉันมีข้อสงสัยเกี่ยวกับการใช้RealDigitsเพราะฉัน จำกัด ตัวเองจากการใช้IntegerDigitsสำหรับคำตอบนี้และพวกเขาค่อนข้างคล้ายกัน อย่างไรก็ตามหากฉันอนุญาตให้ฉันรวมไว้ (หลังจากทั้งหมดมันจะไม่คืนค่าจำนวนเต็มโดยตรงจำนวนเท่าใดมี) ฉันสามารถเฉือนตัวละครอีกสองตัว:

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

ฉันลองมันใน Mathematica มันไม่ได้ส่งออกค่า ตัวละครหนึ่งตัวที่ 43 ใช้:Mod[Trunc[57 2^(3 - Trunc[Log[456]/Log[10]])5^Trunc[Log[456]/Log[10]]], 10]
kukac67

ใช่ฉันคิดมาก Wolfram Alpha ค่อนข้างอ่อนโยนในการตีความอินพุตมากขึ้น โชคดีที่ฉันให้ส่วนหัวที่ถูกต้อง;)
CompuChip

แต่ฉันเห็นว่ามันใช้ได้ผลกับ WolframAlpha
kukac67

{แก้ไข} แม้ว่าฉันจะเห็นลิงค์เสีย ... เห็นได้ชัดว่าไม่ชอบ[ตัวละครถึงแม้ว่าพวกเขาจะถูกเข้ารหัส ฉันจะดึงมันผ่านตัวย่อ URL {edit2} เห็นได้ชัดว่า W.Alpha มีหนึ่ง - เปลี่ยนลิงค์
CompuChip

1

Tcl (42 ไบต์แลมบ์ดา):

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

(49 ไบต์ฟังก์ชั่น):

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

(83 ไบต์ถ้าเราจำเป็นต้องยอมรับอินพุตจากเชลล์):

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

มันทำงานอย่างไร
kukac67

เพิ่มคำอธิบาย เป็นเพียงวิธีที่ชัดเจนที่สุดในการทำคณิตศาสตร์ วิธีที่คุณทำบนกระดาษ
slebetman

ฉันคิดว่าคุณกำลังนับจากจุดจบที่ผิด
Peter Taylor

อืม .. ใช่ ดูเหมือนว่ามัน ฉันจะแก้ไขเพื่อนับรูปทางซ้าย
slebetman

ฉันจะยอมรับ 31 ไบต์ แม้ว่าแลมบ์ดาจะวิ่งได้อย่างไร? Tcl มีล่ามซึ่งสามารถใช้งานได้หรือไม่? หรือเป็นเพียงส่วนหนึ่งของโปรแกรมที่กำหนดข้อโต้แย้ง?
kukac67

1

R (60)

แก้ไขปัญหาโดยใช้ log10 เพื่อคำนวณจำนวนหลัก กรณีพิเศษ x == 0 ค่าใช้จ่าย 13 ตัวอักษรถอนหายใจ

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

Ungolfed:

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

การใช้

> f(898,2)
[1] 9

1

สกาลา ( 133 99 ไบต์):

ใช้งานได้กับอินพุตที่เป็นบวกทั้งหมด หารด้วย 10 ถึงกำลังของตัวเลขที่มองจากด้านขวาจากนั้นนำโมดูโล 10

def k (i: Array [String]) = {val m = i (0) .toInt
(m * Math.pow (10 ฉัน (1) .toInt-1-Math.log10 (เมตร) toInt)). toInt% 10}

ขอบคุณสำหรับการสังเกตข้อผิดพลาดในสูตรก่อนหน้า อันนี้สั้นกว่านี้


ฉันชอบมัน! :) โหวตมากขึ้น
kukac67

ทดสอบวิธีการแก้ปัญหา: k (Array ("1234", "7")) ที่ให้ 9 มันไม่ทำงานสำหรับ n> #digits (x)?
lambruscoAcido

มันเป็นเพราะ 10 ^ -1 ไม่แน่นอนในสัญลักษณ์นี้ดังนั้นจึงมีข้อผิดพลาดในการปัดเศษเมื่อคุณใช้ 10% pow (10, -1) ซึ่งควรให้ศูนย์ แต่ให้ 0.0999 แทน แก้ไขคำตอบของฉันเพื่อรองรับผลข้างเคียงนี้
Mikaël Mayer

1

Haskell, 142

ฉันไม่แน่ใจว่าฉันเข้าใจคำถามอย่างถูกต้อง แต่นี่คือสิ่งที่ฉันคิดว่าคุณต้องการ: อ่าน stdin (string) ทำให้ตัวเลขสองตัวเป็น int (ไม่ใช่สายอักขระ) ทำสิ่งที่เป็นอัลกอริทึมแล้วส่งผลลัพธ์ (สตริง) ฉันยัดมันลงใน 142 chars ซึ่งมากเกินไป:

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

ตัวอย่างการใช้งาน:

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

คณิตศาสตร์ล้วนๆไม่มีสตริงไม่มีเลย ใช้หมายเลขแรกในพร้อมต์แรกและหมายเลขที่สองในพร้อมต์ที่สอง

กรณีทดสอบ :

Input: 97654 5
Output: 4

Input: 224658 3
Output: 4

รหัส Ungolfed:

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ตัวอักษร

(ไม่นับการป้อนบรรทัด)

นี่คือการโกงเนื้อหาเนื่องจากสวิตช์คำสั่ง แต่ขอบคุณที่ให้ฉันเล่น :-)

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

แก้ไข :

สามารถลบได้ 2 ตัวอักษร:

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

... จากนั้นอีก 6:

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

อย่างไร

เราแยกอินพุตของอาร์กิวเมนต์แรกเป็นสคริปต์$ARGV[0]ด้วยอักขระ ( split//) สร้างอาร์เรย์ที่มีดัชนีเป็นศูนย์ เพิ่มหนึ่งในอาร์กิวเมนต์ที่สอง$ARGV[1]ให้กับสคริปต์จากนั้นสอดคล้องกับองค์ประกอบที่ตำแหน่งนั้นในสตริงหรืออาร์กิวเมนต์แรก จากนั้นเราเก็บนิพจน์ภายใน()เป็นรายการองค์ประกอบหนึ่งซึ่งsayจะวนซ้ำผ่าน สำหรับเวอร์ชั่นสั้นที่สั้นกว่าเราอยู่shiftในอาร์กิวเมนต์แรกและใช้ส่วนที่เหลือของ @ARGV เพื่อใช้สำหรับดัชนี - เมื่อshiftมีการแก้ไขอาร์กิวเมนต์ที่สองจะยังคงอยู่ดังนั้นเราpop()จึงลบ 1

นี่ควรจะเป็นการฝึกคณิตศาสตร์หรือไม่? ฉันเพิ่งรู้ว่าฉันกำลังจัดทำดัชนีสตริงที่อ่านจากอินพุตดังนั้น ... ฉันเดาว่าฉันจะสูญเสีย ?? ทำเครื่องหมายให้ฉันถ้าฉันเข้าใจในสนามกอล์ฟแบบขนานและฉันจะลองอีกครั้ง - มากกว่าทางคณิตศาสตร์ - ในคำตอบที่แยกต่างหาก

เสียงเชียร์


Yup ขอโทษโดยไม่ต้องใช้สาย ยินดีต้อนรับสู่ PPCG ต่อไป!
บาดเจ็บทางดิจิทัล

ตกลงขออภัยด้วยว่า ... จนถึงตอนนี้วิธีการทางคณิตศาสตร์ของฉันยังไม่ค่อยคุ้มค่า :-)
Cito G.

0

PHP, 58

ใช้คณิตศาสตร์เท่านั้น

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


1
สิ่งนี้ไม่ได้ถูกค้นพบใช่ไหม?
cjfaure

2
คุณสามารถบันทึก 1 echo$n%10ถ่านโดยเปลี่ยนไป
Amal Murali

@ ไม่มีรูปแบบจริง ๆ แล้วมันวนซ้ำจนกว่าจำนวนที่ป้อนจะไม่มากกว่า 10 ^ x อีก x เป็นตัวเลขหลัก ตัวอย่างเช่นหากคุณป้อน 3457 เป็นตัวเลขและ 2 เป็นตัวเลขตัวเลขนั้นจะหายไปจากตัวเลขสุดท้ายจนกว่าตัวเลขจะเล็กกว่า 100 (10 ^ 2) นั่นหมายความว่ามันจะใช้เวลา 5 และ 7 เพราะตอนนี้เหลืออยู่ 34 ครั้งและมันจะไม่มากกว่า 100 แล้วมันก็แค่ออกตัวเลขสุดท้าย (4)
dkasipovic

แต่มันเป็นความจริงที่ว่าถ้าตัวเลขที่สองมากกว่าจำนวนหลักคุณจะได้ผลลัพธ์ที่ 9 และไม่ใช่ศูนย์
Mikaël Mayer

ฉันเห็นว่ามันส่งออกหลักสุดท้ายถ้าจำนวนถ้ามากกว่าจำนวนหลัก หากคุณป้อน 1234 และหลักที่ 5 คุณจะได้รับ 4 ตั้งแต่ 1234 ฉันน้อยกว่า 10 ^ 5
dkasipovic

0

~ - ~! - 94 93

ก้มกฏเล็กน้อย - มันเป็นฟังก์ชั่นที่ใช้ n เป็นอินพุทและสมมติว่าตัวเลขในการค้นหาตัวเลข n ของถูกเก็บไว้ใน'''''- และ ~ - ~! ไม่รองรับการลอย

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

'''''=~~~~,~~,~~,~~,~~,~~:''''''=''''&~:จะส่งผลให้''''''เป็น~~(2) ('' '' '= 128)


หืมม ... เป็นอีกภาษาที่ลึกลับ?
VisioN

@VisioN มันไม่ได้ลึกลับจริงๆเพียงแค่ชนิดข้อมูลดั้งเดิมเท่านั้นที่เป็นตัวเลขและไม่สามารถโต้ตอบกับระบบปฏิบัติการ / อินเทอร์เน็ตได้ esolangs.org/wiki/No_Comment
cjfaure

1
สำหรับฉันแล้วทุกไวยากรณ์ที่มนุษย์ไม่สามารถอ่านได้นั้นเป็นสิ่งที่ลึกลับ และใช่ Perl ก็มีความลับตามทฤษฎีนี้ด้วย:)
VisioN

@VisioN อ่านได้ง่ายหลังจากผ่านไประยะหนึ่ง : P
cjfaure

0

Python 2.7 (89 ไบต์)

ฉันแปลงจำนวนเต็มเป็น "พหุนาม" โดยใช้รายการตัวเลข ฉันรู้ว่าคุณบอกว่าคุณไม่สามารถยอมรับได้ แต่ฉันไม่เห็นว่าทำไมไม่เพราะใช้แนวคิดทางคณิตศาสตร์ของตัวเลขที่แสดงเป็นพหุนามของฐานของพวกเขา มันจะล้มเหลวเมื่อจำนวนเต็มผ่านเป็น0แต่คุณบอกว่าไม่มีศูนย์เบาะ;)

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]

ทำงานเป็นtest.py:

$ python test.py 726489 5
8

ฉันสมมติว่าคุณต้องการอินพุตเชลล์และฉันไม่สามารถใช้ประโยชน์จากความจริงที่ว่าอินพุตนั้นเป็นสตริง การข้ามอินพุตเชลล์เพียง 43 ไบต์ด้วย:

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

nถึงแม้ว่าผมจะใช้บางย้ำไม่จำเป็นฉันบันทึกไบต์บางอย่างโดยไม่เพิ่มพร่องเพิ่มเติมเกี่ยวกับ


0

BrainFuck แบบขยาย : 49

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

การใช้งาน:

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

ฉันไม่ได้ใช้คุณสมบัติพิเศษของ EBF แต่อย่างใดยกเว้นการใช้ตัวดำเนินการคูณ (เช่น10+ => ++++++++++) นอกเหนือจากนั้นBrainFuckบริสุทธิ์ส่วนใหญ่

มันทำงานอย่างไร:

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

โครงการ (R6RS): 100 (ไม่มีช่องว่างที่ไม่จำเป็น)

(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. ตัดแต่งตัวเลขตามส่วนเริ่มต้นด้วยสูงสุดที่เป็นไปได้สำหรับ 32 บิตที่ไม่ได้ลงชื่อ
  2. เมื่อเรากดด้านซ้ายของจำนวนเต็ม int ($ 1 / d) จะส่งกลับค่าที่ไม่ใช่ศูนย์
  3. ทำต่อไป ($ 2) ตัวเลขที่ผ่านมา

Ungolfed:

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

0

สกาลา (83)

ไม่ใช้คุณสมบัติพิเศษของสกาล่า ค่อนข้างเป็นโซลูชันมาตรฐาน

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

Ungolfed:

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, ไม่ถูกต้องเนื่องจากใช้อาร์เรย์

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

ฉันไม่อนุญาตให้ใช้อาร์เรย์ในการแก้ไข (ก่อนที่คุณจะโพสต์สิ่งนี้) ... แต่ฉันชอบวิธีที่คุณทำสิ่งนี้ :)
kukac67

ตกลงฉันดูไม่เหมาะสม ฉันได้เพิ่มวิธีการหลีกเลี่ยงอาร์เรย์
VX

0

Julia 37

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

เนื่องจากโอเปอเรเตอร์ในตัว ^ เลขคณิตความแม่นยำตามอำเภอใจอนุญาตให้มีขนาดใดก็ได้

ตัวอย่าง

julia> d(1231198713987192871,10)
3

0

perl (เพิ่มเติมเล็กน้อย mathy / ไม่ค่อย golfy) - 99 chars

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

เรียกใช้เป็น:

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


0

สมอลล์ทอล์ค, 44

แม้ว่า dc จะไม่สามารถเอาชนะได้ แต่นี่เป็นโซลูชัน Smalltalk:

อาร์กิวเมนต์หมายเลข n; d หลัก -nr เพื่อแยก:

[:n :d|(n//(10**((n log:10)ceiling-d)))\\10]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.