คำนวณสแควร์รูทเท่านั้นโดยใช้ ++


13

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

  • การตั้งค่าตัวแปร (เช่น squareRoot = 5)
  • การเพิ่ม (A + B)
  • การลบ (AB)
  • การคูณ (A * B)
  • ส่วน (A / B)
  • สแควร์, ลูกบาศก์, ที่สี่, ฯลฯ ราก
  • เลขยกกำลัง

ตัวดำเนินการเปรียบเทียบ (เช่น <,>, ==, ฯลฯ ) ไม่ถือเป็น "ตัวดำเนินการทางคณิตศาสตร์" สำหรับวัตถุประสงค์ของคำถามนี้และได้รับอนุญาตตราบเท่าที่พวกเขาไม่ได้เปลี่ยนค่าของตัวแปร

โอเปอเรเตอร์เดียวที่คุณสามารถใช้ได้คือ ++ มีข้อยกเว้นดังต่อไปนี้:

  • หากคุณต้องการคุณสามารถเริ่มต้นตัวแปรโดยการตั้งค่าเป็น 0
  • หากภาษาของคุณไม่มีไวยากรณ์ ++ คุณอาจใช้ไวยากรณ์ที่เทียบเท่าเช่น foo + = 1 หรือ foo = foo + 1
  • สแควร์รูทควรคำนวณอย่างน้อย 6 หลักเกินกว่าทศนิยม (ตำแหน่งหลักแสน) และเอาท์พุทเป็นจำนวนเต็มของทศนิยม (เช่นถ้าฉันใส่ 2 มันอาจออกมาเป็น 14142135624 หรือ 1414213 ขึ้นอยู่กับการปัดเศษ) . การปัดเศษขึ้นหรือลงไม่สำคัญ

ฟังก์ชั่นที่ผู้ใช้กำหนดไม่ได้รับอนุญาต นอกจากนี้ยังไม่อนุญาตให้จำลองการทำงานด้วย goto เช่นกัน

ฉันสนใจที่จะเห็นสิ่งที่ทุกคนส่ง! การเข้ารหัสที่มีความสุข!

ชี้แจง

ชี้แจงว่าหมายเลขนั้นเป็นจำนวนเต็มบวก คุณยินดีที่จะทำรหัสที่จะทำหมายเลขใด ๆ แต่มันไม่จำเป็น

CLARIFICATION # 2

ชี้แจงว่าผู้ประกอบการเปรียบเทียบได้รับอนุญาต

CLARIFICATION # 3

บวกลบคูณหารและฟังก์ชั่นการเปลี่ยนแปลงไปยังหมายเลขที่ไม่ได้รับอนุญาตที่ทุกคนไม่ว่าพวกเขาจะถูกบันทึกไว้ในตัวแปรหรือไม่ ฉันขอโทษที่สิ่งนี้ทำให้คำตอบที่มีอยู่ไม่ถูกต้องสองสามข้อ แต่ฉันหมายถึงการกำหนดกลุ่มผู้ประกอบการนี้ด้วย "เปลี่ยนหมายเลข" เพื่อป้องกันการหมุนรอบคำตอบ (เช่นฉันเพิ่งใช้ฟังก์ชัน sqrt () คุณห้ามเพิ่มเติมเท่านั้น การคูณการหารและการลบ) ขอโทษสำหรับความสับสน.

CLARIFICATION # 4

ชี้แจงว่าเราต้องการอย่างน้อย 5 หลัก รหัส 10 หลักทำให้โค้ดทำงานเป็นเวลานาน


1
ไม่ได้ - ไม่ได้รับอนุญาตขออภัยในความสับสน! ฉันวางแผนไว้ว่าจะมี ++ และ - แต่ฉันตัดสินใจที่จะออกในนาทีสุดท้าย
iggyvolz

5
"โดยไม่ใช้ตัวดำเนินการทางคณิตศาสตร์ใด ๆ เพื่อเปลี่ยนจำนวน" - ฉันคิดว่านี่อาจต้องมีการชี้แจง คุณหมายถึงว่าตัวดำเนินการเหล่านี้อาจไม่สามารถใช้งานได้เลยหรืออาจใช้ตัวดำเนินการ แต่เฉพาะในกรณีที่ผลลัพธ์ไม่ได้รับการบันทึกลงในตัวแปรเช่นwhile r*r<n*10e20:r+=1- เป็นเรื่องเล็กน้อย นอกจากนี้คุณอาจพิจารณาลดเอาต์พุตที่ต้องการเป็น 10 ^ 8 หรือมากกว่านั้น ก่อนอื่นเพราะ 10 ^ 10 ใหญ่กว่า 2 ^ 31 และวินาทีเพราะจะใช้เวลาสักครู่เพื่อเพิ่มความสูง
primo

1
ทำไมคุณเคยต้องการที่จะ "เปลี่ยน" ตัวแปรใด ๆ ที่ทั้งหมดหรือไม่ พวกคุณจำเป็นต้องมีวิธีการคิดที่แปลก ๆ ...
หยุดหันมาคุยกันเมื่อ

4
ฉันตั้งค่าสถานะเพื่อปิดคำถามนี้ การเปลี่ยนแปลงที่รุนแรงมากกับคำถาม คุณควรได้รับคำถามนี้ผ่านการตรวจสอบผ่าน Sandbox มิฉะนั้นคุณจะรอดพ้นจากการลงทุนที่จะตอบ
อภิสิทธิ์

3
การลดจำนวนตัวเลขที่ต้องการนั้นไม่มีความหมายโดยไม่มีการ จำกัด เวลา / หน่วยความจำ รหัสของฉันสามารถรองรับ 5 หลักได้ แต่เครื่องของฉันมี RAM ไม่เพียงพอ
Dennis

คำตอบ:


13

Python 66

print'%.0f'%reduce(lambda a,b:abs(a)+1e10j,range(-2,input())).real

เอาท์พุต

>>> print'%.0f'%reduce(lambda a,b:abs(a)+1e10j,range(-2,input())).real
121
110000000000
>>> print'%.0f'%reduce(lambda a,b:abs(a)+1e10j,range(-2,input())).real
1000
316227766017

วิธีนี้ใช้Spiral of Theodorusบนระนาบที่ซับซ้อนเพื่อให้ได้ผลลัพธ์


2
ฉันคิดว่าจะต้องถูกห่อหุ้มint(...*1e10)มิฉะนั้นจะดีมาก แม้ว่าการรับabsค่าที่ซับซ้อนนั้นมีการsqrtปลอมแปลงมากหรือน้อย
โม่

1
@primo ฉันไม่คิดว่าคุณจะได้รับอนุญาต*1e10...
Cruncher

@primo: แทนที่จะคูณด้วย 1e10 ฉันใช้เส้นทางที่ต่างออกไปเล็กน้อย และแม้ว่าฉันจะเห็นด้วยว่า abs อาจเป็น sqrt ปลอมตัว แต่ฉันก็รู้สึกว่ามันถูกกฎหมายอย่างที่ระบุไว้ในปัญหา
อภิสิทธิ์

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

9
@iggyvolz: ฉันประหลาดใจจริงๆที่คุณยังคงขยายคำถามของคุณและเพิ่มข้อ จำกัด เพิ่มเติม ผู้คนลงทุนเวลาและความพยายามในการเขียนคำตอบและคุณไม่สามารถคาดหวังว่าพวกเขาจะเป็น psycic
อภิสิทธิ์

6

Python 184 ตัวอักษร

โซลูชัน Python ต่อไปนี้ใช้ตัวดำเนินการเพิ่มเท่านั้นและไม่มีตัวดำเนินการทางคณิตศาสตร์อื่น ๆ เลย อย่างไรก็ตามด้วยความแม่นยำที่ต้องการ (10 หลัก) ทำให้ต้องใช้เวลานานในการทำงาน คุณสามารถทดสอบได้ด้วยความแม่นยำต่ำ (3 หลัก) โดยการลดการ1e201e6

import sys;t=0
for _ in range(int(sys.argv[1])):
 for _ in range(int(1e20)):t+=1
q=0
while 1:
 z=0
 for _ in range(q):
  for _ in range(q):z+=1
 if z>=t:break
 q+=1
print(q)

Ungolfed:

import sys

# t = N * 100000000000000000000 (magnitude of twice the precision)
t = 0
for _ in range(int(sys.argv[1])):
    for _ in range(int(1e20)):
        t += 1
q = 0
while True:
    # z = q * q
    z = 0
    for _ in range(q):
        for _ in range(q):
            z += 1
    if z >= t:
        break
    q += 1
print(q)

ฉันชี้แจงคำถามคุณสามารถทำได้หลายหลักตามที่คุณต้องการ (อย่างน้อย 5) ฉันไม่คุ้นเคยกับงูหลาม แต่ฉันคิดว่า int () เป็นเพียงลูกล้อประเภท? ถ้าเป็นเช่นนั้นก็ดีเพราะมันไม่เปลี่ยนค่าของตัวเลข
iggyvolz

@iggyvolz: ถูกต้องคุณจะต้องแปลงค่าอาร์กิวเมนต์สตริง (ที่ระบุในบรรทัดคำสั่ง) เป็นจำนวนเต็ม ฟังก์ชั่นธรรมดาไม่จำเป็นต้องมี
Greg Hewgill

2

Fortran 73

read*,t;s=0;do while(abs(s*s/1e10-t)>1e-10);s=s+1;enddo;print*,s/1e5;end

อาจใช้เวลาในการ loooong เพื่อกำหนดคำตอบสำหรับค่าบางอย่างจริง แต่มันจะทำงานแน่นอน ในขณะที่ผมใช้*และ-, เหล่านี้จะไม่เปลี่ยนแปลงค่าใด ๆเพียงs=s+1จริงอะไรเปลี่ยนแปลง


ว้าวฉันไม่คิดว่าจะใช้ตัวดำเนินการเพื่อเปลี่ยนค่าคงที่ เป็นสิ่งที่ดีอย่างสมบูรณ์และ +1 (ถ้าฉันมีชื่อเสียง 15
อันดับ

นี่ใช้*โอเปอเรเตอร์ซึ่งไม่ได้รับอนุญาตอย่างชัดเจน หรือฉันเข้าใจผิดข้อ จำกัด ที่ได้รับอย่างใด
เกร็กฮิวกิล

@GregHewgill: OP รัฐโดยไม่ต้องใช้ดำเนินการทางคณิตศาสตร์ใด ๆ ที่จะเปลี่ยนหมายเลข ; ตัวดำเนินการเหล่านี้จะไม่เปลี่ยนแปลงค่าใด ๆ
Kyle Kanos

7
แต่นั่นยังคงใช้*โอเปอเรเตอร์ในการเปลี่ยนตัวเลขคุณเพียงแค่ไม่บันทึกผลลัพธ์ใด ๆ หาก OP ต้องการเพียงไม่อนุญาตการมอบหมาย (นอกเหนือจากs=s+1) ดังนั้นเหตุใดจึงพูดถึงตัวดำเนินการทางคณิตศาสตร์ที่ไม่อนุญาตทั้งหมด
Greg Hewgill

1
@iggyvolz: การเปลี่ยนกฎ ~ 20 ชั่วโมงต่อมาเป็นรูปแบบที่ไม่ดี โปรดอย่าทำเช่นนั้นและใช้แซนด์บ็อกซ์เพื่อแก้ปัญหาข้อบกพร่องในปัญหาของคุณแทน
Kyle Kanos

2

CJam, 26 ไบต์

q~,1e20,m*,:N!{)_,_m*,N<}g

ลองออนไลน์ วางรหัสพิมพ์จำนวนเต็มที่ต้องการในการป้อนข้อมูลและคลิกRun ก่อนที่คุณจะทำอย่างไรผมขอแนะนำให้เปลี่ยน1e10ไป1e4แม้ว่า

Java ล่ามจับ1e6ด้วยการป้อนข้อมูล“2” ในประมาณ 15 วินาที 1e20จะต้องมีขนาดใหญ่จำนวน RAM

ตัวอย่าง

$ cjam <(echo 'q~,1e2,m*,:N!{)_,_m*,N<}g') <<< 4; echo
20
$ cjam <(echo 'q~,1e2,m*,:N!{)_,_m*,N<}g') <<< 2; echo
15
$ cjam <(echo 'q~,1e4,m*,:N!{)_,_m*,N<}g') <<< 4; echo
200
$ cjam <(echo 'q~,1e4,m*,:N!{)_,_m*,N<}g') <<< 2; echo
142
$ cjam <(echo 'q~,1e6,m*,:N!{)_,_m*,N<}g') <<< 4; echo
2000
$ cjam <(echo 'q~,1e6,m*,:N!{)_,_m*,N<}g') <<< 2; echo
1415

พื้นหลัง

เนื่องจากเราไม่ได้รับอนุญาตให้ตัวดำเนินการทางคณิตศาสตร์เปลี่ยนตัวเลขเราจะใช้ตัวดำเนินการ setwise เพื่อเปลี่ยนอาร์เรย์

รหัสเริ่มต้นด้วย "การคูณ" อินพุต (“ i”) โดย 1e20 แต่ไม่มีการคูณที่แท้จริง แต่เราดันอาร์เรย์ที่มีจำนวนเต็ม“ i” ซึ่งเป็นอาร์เรย์ที่มีจำนวนเต็ม 1e20 ใช้ผลิตภัณฑ์คาร์ทีเซียนและคำนวณความยาว

จากนั้นเราจะผลักดันศูนย์และเพิ่มขึ้นจนกว่าสินค้าของจำนวนเต็มด้วยตัวเอง (คำนวณข้างต้น) i * 1e20จะไม่มีขนาดเล็กกว่า นี่ทำให้รากที่สองถูกปัดเศษขึ้น

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

q~     " Read for STDIN and interpret. ";
,      " Push an array containing that many integers. ";
1e20,  " Push the array [ 0   …   1e20 - 1]. ";
m*,:N  " Get the length of the cartesian product and save it in “N”. ";
!      " Logical NOT. Since the input is a positive integer, this pushes 0. " ;
{      " ";
  )    " Increment the integer on the stack.";
  _,   " Push an array containing that many integers. ";
  _m*, " Get the length of the cartesian product of the array by itself. ";
  N<   " If the product is smaller than the target value, push 1; otherwise push 0. ";
}g     " Repeat the loop if the result was 1. ";

1

คอบร้า - 62

โพสต์ก่อนการแก้ไขครั้งที่สามไม่ถูกต้องอีกต่อไป

ไม่เพียง แต่จะสั้น แต่ควรเกินหาก n < Decimal.maxValue

def f(n)
    r,e=0d,10000000000
    while r/e*r/e<n,r+=1
    print r

แต่คุณใช้r/e*r/eซึ่งเห็นได้ชัดว่าเป็น++โอเปอเรเตอร์ที่ไม่ใช่คณิตศาสตร์ ...
nneonneo

@nneonneo สิ่งนี้ถูกโพสต์ก่อนการแก้ไขครั้งที่สามและฉันยังไม่ได้เปลี่ยนเลย
Οurous

0

สกาลา, 117

val z=BigInt(readLine+"0000000000")
print(Stream.from(1)find(x=>(BigInt(0)/:Stream.fill(x,x)(1).flatten){_+_}>=z)get)

ไม่เสร็จในเวลาที่สมเหตุสมผลแม้จะเป็น 2 สำหรับอินพุต แต่ก็ใช้งานได้ คุณอาจสังเกตเห็นว่าฉันกำลังทำอยู่_+_แต่เพียงเพิ่ม 1 เท่านั้นและ Scala ไม่มี++โอเปอเรเตอร์อยู่ดี ฉันสามารถบันทึกตัวละครสองตัวโดยแทนที่ Stream ภายในด้วย List แต่มันจะมีหน่วยความจำไม่เพียงพอ ตามที่เขียนไว้ฉันคิดว่ามันจะขยายเวลาการประมวลผลเท่านั้นไม่ใช่การใช้หน่วยความจำ


0

Haskell, 70 ไบต์

s i|r<-[1..i]=foldl1(.)[(+1)|j<-r,k<-r]
f i=[j-1|j<-[0..],s j 0>=i]!!1

fให้รากที่สองของจำนวนเต็มด้วยการหาจำนวนที่มากที่สุดซึ่งสแควร์น้อยกว่าหรือเท่ากับอินพุต ฟังก์ชันกำลังสองs iเพิ่มขึ้นทีละหนึ่งสำหรับทุกองค์ประกอบของ(i,i)เมทริกซ์ (พิมพ์บนโทรศัพท์ดังนั้นอาจมีการพิมพ์ผิด)


0

PHP, 124 ไบต์

มันเป็นอัลกอริทึมที่ละเอียดถี่ถ้วน มันแค่พยายามหาตัวเลขจนกระทั่งสแควร์ของตัวเลขนั้นใหญ่กว่าจำนวน "เป้าหมาย" (ซึ่งใส่ครั้ง 1E number of decimalsกำลังสอง (10.000 สำหรับผลลัพธ์ทศนิยม 2) จากนั้นมันพิมพ์หมายเลขสุดท้าย

for(;$a++<$z=$argv[1];)for(;$$a++<1e6;)$g++;for(;$b++<$g;$i=$x=0)for(;$i++<$b;)for($j=0;$j++<$b;)if(++$x>=$g)break 3;echo$b;

ทำงานแบบนี้ ( -dเพิ่มเพื่อความสวยงามเท่านั้น):

php -d error_reporting=32757 -r 'for(;$a++<$z=$argv[1];)for(;$$a++<1e6;)$g++;for(;$b++<$g;$i=$x=0)for(;$i++<$b;)for($j=0;$j++<$b;)if(++$x>=$g)break 3;echo"$b\n";' 2

ไม่แนะนำให้ลองใช้กับทศนิยมมากกว่า 3 ตัวหรือตัวเลขที่สูงกว่า 10

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.