คำนวณ A (N) / B (N) ด้วยตัวเลข C (N)


15

พิจารณาสามลำดับหมายเลขA, BและC:

  • A: ลำดับบนพื้นฐานของความสัมพันธ์ที่เกิดขึ้นอีก, เริ่มต้นด้วยf(n) = f(n-1)+f(n-2) f(1) = 3, f(2) = 4ดังนั้นลำดับเริ่มต้นดังนี้:3 4 7 11 18 29 47 76 ...
  • B: ตัวเลขรวมที่เป็นจำนวนเต็มทั้งหมดที่ไม่ใช่เฉพาะ (หรือ 1):4 6 8 9 10 12 14 15 16 ...
  • C: ตัวเลขของ Pi: 3 1 4 1 5 9 2 6 5 ...

รับจำนวนเต็มบวกN < 50ไม่ว่าจะเป็นอาร์กิวเมนต์ของฟังก์ชันหรือ STDIN ให้ส่งคืนค่าทศนิยมของเศษส่วนA(N)/B(N)ด้วยC(N)ตัวเลขหลังจุดทศนิยม ใช้กฎปกติสำหรับการปัดเศษ (ปัดเศษหากตัวเลข N + 1'th คือ 5 หรือสูงกว่า) หากตัวเลข Nth ของpiเป็นศูนย์จะต้องพิมพ์จำนวนเต็ม สัญลักษณ์ทางวิทยาศาสตร์ / รูปแบบมาตรฐานเป็นที่ยอมรับสำหรับตัวเลขที่สูงกว่า 1,000

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่างบางส่วน:

N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750

แน่นอนว่าต้องใช้กฎมาตรฐานของรหัสกอล์ฟ

ฟังก์ชั่นนี้จะต้องสิ้นสุดในเวลาไม่ถึงสองนาทีบนแล็ปท็อปสมัยใหม่


เมื่อคุณพูดC(n)ตัวเลขเราต้องรวม 0 ต่อท้ายหรือไม่
Maltysen

การ จำกัด เวลาใช้กับอินพุตใด
Dennis

@Dennis คุณหมายถึงNอะไร ถ้าเป็นเช่นนั้นมากถึง N = 49 หรืออะไรอย่างอื่น?
Stewie Griffin

JavaScript มีความแม่นยำจุดลอยตัว จำกัด อยู่ที่ 16 ที่ผ่านมาคุณจะเริ่มได้รับผลลัพธ์ที่ไม่ถูกต้อง ไม่เป็นไร
Downgoat

1
@vihan โซลูชันของฉัน (ATM ที่ไม่ได้เผยแพร่) จัดเก็บ pi 49 หลักแรกในสตริง และคุณไม่ต้องการความแม่นยำมากกว่า 9 หลักในผลลัพธ์หากคุณกังวล
ETHproductions

คำตอบ:


9

Pyth, 60 57 58 ไบต์

.[K`.Rchu,eGsGQjT7e.ftPZQ)Je/u+/*GHhyHy^TQr^T3ZZT\0+xK\.hJ

สายรัดทดสอบ

มันค่อนข้างตรงไปตรงมา - คำนวณไพ, อนุกรมฟีโบนักชีและคอมโพสิต, ปัดเศษเป็น C (n) ดิจิต, แพดถึง C (n) หลักบวกกับตำแหน่งของเลขทศนิยม

A (n): hu,eGsGQjT7

B (n): e.ftPZQ)

C (n): e/u+/*GHhyHy^TQr99ZZT

60 -> 57: ทำความสะอาด n = 1 กรณีพิเศษในการคำนวณ pi

57 -> 58: ไม่ได้ใช้ precsion สูงพอสำหรับ pi สำหรับช่วงอินพุตทั้งหมด - เพิ่ม 99 iterations เป็น 1,000 iterations

หมายเหตุเกี่ยวกับการปัดเศษ:วิธีนี้ใช้ระบบการปัดเศษแบบ "ใกล้แม้" ของ Python แทนที่จะใช้ระบบ OP ที่ระบุ "ไปยังอินฟินิตี้" อย่างไรก็ตามความแตกต่างนั้นสำคัญหากตัวเลขที่ตามหลังจุดปัดเศษ5000...เช่น 1.25 ปัดเศษเป็น 1 หลัก ฉันตรวจสอบช่วงอินพุตและไม่เคยเกิดขึ้นดังนั้นผลลัพธ์ที่ถูกต้องจะถูกส่งคืน


2

PowerShell, 420 ไบต์ (ayyyyyyyy) 378 ไบต์

param($n);[int[]]$p="03141592653589793238462643383279502884197169399375"-Split'';$a=@(0,3,4);for($i=3;$i-lt50;$i++){$a+=$a[$i-1]+$a[$i-2]};$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111";$b=@(0);for($i=4;$i-le70;$i++){if($c[$i]-eq'1'){$b+=$i}};[double]$r=$a[$n]/$b[$n];$q=$p[$n+1];$s="";(0..($q-1))|%{$s+="0"};([math]::Round($r,$q,[MidpointRounding]::AwayFromZero)).ToString("0.$s")

ขอบคุณisaacgสำหรับการบันทึก 41 ไบต์สำหรับการคำนวณว่าคำถามจะปัดเศษอย่างไร หมายความว่าฉันไม่ได้มีการรวมที่น่ากลัวและไม่จำเป็นต้องโยนเป็นอย่างชัดเจน[MidpointRounding]::AwayFromZero[double]

อันนี้สนุกมาก!

ขยาย:

# Take input N
param($n)

# First digits of pi, stored as integer array
[int[]]$p="03141592653589793238462643383279502884197169399375"-Split''

# Fibonacci sequence A(N)
$a=@(0,3,4)
for($i=3;$i-lt50;$i++){
  $a+=$a[$i-1]+$a[$i-2]
}

# Zero-indexed bitmask for if the n-th integer is composite (1) or not (0)
$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111"

# Populate B(N) as an array using the $c mask
$b=@(0)
for($i=4;$i-le70;$i++){
  if($c[$i]-eq'1'){
    $b+=$i
  }
}

# Calculation Time!
$r=(a($n))/$b[$n]

# A small golf, as $p[$n+1] gets used a couple times
$q=$p[$n+1]

# Need to generate a string of zeroes for padding
$s=""
(0..($q-1))|%{$s+="0"}

# Round the number, then send it to a string so we get the necessary number of zeroes
([math]::Round($r,$q)).ToString("0.$s")

การเรียกใช้ซ้ำใน PowerShell คือ ... เราจะพูดช้าดังนั้นเราต้องสร้างA(N)ทิศทางอื่นและเก็บไว้ในอาร์เรย์จากนั้นทำดัชนี


OLD

นอกจากนี้โคศักดิ์สิทธิ์ยังมีข้อกำหนดด้านผลผลิตที่จะกำจัดสิ่งนี้ ค่าเริ่มต้น PowerShell การปัดเศษเพื่อที่ใกล้ที่สุด k / ที่ / การปัดเศษของนายธนาคารซึ่งความจำเป็นการใช้เป็นพิเศษอย่างละเอียด[MidpointRounding]::AwayFromZeroที่จะเปลี่ยนรูปแบบการปัดเศษ ยิ่งไปกว่านั้นเราจำเป็นต้องใส่เลขศูนย์ต่อท้ายหากมี ข้อกำหนดทั้งสองนั้นรวมกันเพื่อเปลี่ยนคู่สุดท้ายของบรรทัดจาก20 ไบต์ [math]::Round($r,$q)เป็น102 ไบต์ (จาก$s=""ถึง+$s)) ... ว้าว


คำอธิบายที่ยอดเยี่ยม / แสดงความคิดเห็น! 32 ตัวอักษร[MidpointRounding]::AwayFromZeroเพียงอย่างเดียวเกือบจะดีเกินไป / ไม่ดีที่จะเป็นจริง ... =)
Stewie Griffin

1
ดูบันทึกของฉันในการปัดเศษในคำตอบของฉัน การปัดเศษเริ่มต้น PowerShell ควรเป็นเรื่องปกติ
isaacg

1

Javascript (ES6), 302 ไบต์

คำเดียว: ยังไม่เสร็จ

x=>{a=[0,3,4],b=[0],c='03141592653589793238462643383279502884197169399375';for(i=1;i<x;a[i+2]=a[i]+a[++i]);for(i=1,p=[];++i<70;v=p.every(x=>i%x),(v?p:b).push(i));r=''+Math.round(a[x]/b[x]*(l=Math.pow(10,c[x])))/l;if(x==33)return r;r.indexOf`.`<0&&(r+='.');while(!r[r.indexOf`.`+ +c[x]])r+='0';return r}

49 หลักแรกของ pi ถูกเก็บไว้ในสตริงและอีกสองซีเควนซ์นั้นสร้างขึ้นโดยอัตโนมัติ นี่เป็นเรื่องเกี่ยวกับกอล์ฟไปครึ่งทางแล้ว ฉัน (เกือบ) แน่ใจว่าฉันสามารถบีบอีก 50 ไบต์จากมัน

ใช้งานได้กับทุกกรณีทดสอบและควรใช้งานได้ตลอดเวลา เกิดปัญหากับสิ่งใดก็ตามที่มากกว่า 49 หรือน้อยกว่า 0 ฉันชอบผลของมันเป็นพิเศษสำหรับ 0:

NaN.

ทำไมสิ่งนี้ถึงไม่เสร็จ?
สลายตัวเบต้า

@BetaDecay ฉันหมายถึงฉันยังเล่นกอล์ฟไม่เสร็จ ฉันจะทันทีที่ฉันมีเวลา
ETHproductions

1

คู่, 276 236 ไบต์

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

function c(A)p="3141592653589793238462643383279502884197169399375";f=ones (1,50);f(1)=3;f(2)=4;for i=3:53f(i)=f(i-1)+f(i-2);end
i=0;x=1;while i<A
x++;for j=2:x/2
if mod(x,j)==0 i++;break;end end end
printf(["%." p(A) "f\n"],f(A)/x);end

ยังอ่านค่อนข้างใช่มั้ย

การใช้

ฟังก์ชั่นการคัดลอกวางลงในระดับแปดเสียง, ฟังก์ชั่นการโทรcกับอาร์กิวเมนต์ของค่าที่ต้องการ:

>>> c(1)
0.750
>>> c(49)
407880480.04348

การเพิ่มประสิทธิภาพ:

  • แทนendif, endforและคล้ายกับendที่ทำงานในลักษณะเดียวกัน
  • การลดตัวแปรiหนึ่งบันทึกหนึ่งไบต์
  • ลบnum2str(str2num(p(A)))เรื่องไร้สาระ :)

ฉันชอบที่คุณโพสต์ทางออกคู่ (ฉันเป็นผู้ชาย MATLAB ด้วยตัวเอง!) โปรดทราบว่ารหัสนี้เป็นอ็อกเทฟเท่านั้นไม่ใช่ MATLAB MATLAB ใช้endไม่endifกี่ไบต์ที่บันทึกไว้ หากคุณยังเกิดขึ้นจะมีกล่องเครื่องมือสัญลักษณ์ MATLAB คุณสามารถใช้เพื่อให้ได้แต้มทศนิยมเพียงพอสำหรับปี่:vpa vpa(sym(pi),49)ฉันไม่ได้ใช้แล็ปท็อปนี้ดังนั้นฉันไม่แน่ใจว่าsymจำเป็นหรือไม่ แต่ควรบันทึกไบต์ไว้บ้าง =) และการอ่านไม่จำเป็นต้องเป็นสิ่งที่ดีใน code golf =)
Stewie Griffin

x ++ ไม่ใช่คำสั่ง MATLAB ฉันไม่รู้ว่ามันมีความแตกต่างอย่างมากระหว่างสอง ... IMO มันไม่ควรจะเป็น ฉันคิดว่ารหัสทั้งหมดที่เขียนใน Octave ควรพกพาไปที่ MATLAB (แต่ไม่จำเป็นว่าจะเป็นวิธีอื่นเนื่องจาก MATLAB มีตัวเลือกเพิ่มเติม)
Stewie Griffin

อนุมัติการแก้ไขของคุณ ฉันไม่มี matlab อยู่ที่นี่ดังนั้นฉันจึงไม่สามารถทดสอบได้ ฉันค้นหาวิธีแก้ปัญหาเพื่อให้ได้ทศนิยมทศนิยมมากขึ้นในอ็อกเทฟ แต่ไม่มีอะไรสั้นไปกว่าอาเรย์ แต่ ommiting whileจากendwhileและผลงานที่คล้ายกันดีดังนั้นฉันการปรับปรุงคำตอบกับตัวละครน้อยไม่กี่ :)
Jakuje
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.