เลิกทำการรากที่สอง


16

งานของคุณคือแปลงทศนิยมให้เป็นผลรวมของสแควร์รูทของจำนวนเต็ม ผลลัพธ์จะต้องมีความถูกต้องของตัวเลขทศนิยมอย่างน้อย 6 หลัก

อินพุต :

ตัวเลขที่ระบุจำนวนของรากที่สองและทศนิยมที่แสดงถึงจำนวนโดยประมาณ

อินพุตตัวอย่าง:

2 3.414213562373095

เอาท์พุท : จำนวนเต็มคั่นด้วยช่องว่างที่เมื่อสแควร์รูทและเพิ่มจะประมาณทศนิยมเดิมที่ถูกต้องเป็นอย่างน้อย 6 หลักทศนิยมที่สำคัญ

ไม่อนุญาตให้ใช้ค่าศูนย์ในการแก้ปัญหา

หากมีหลายวิธีคุณจะต้องพิมพ์เพียงวิธีเดียว

ตัวอย่างผลลัพธ์ (ในลำดับใด ๆ ):

4 2

Math.sqrt(4) + Math.sqrt(2) == 3.414213562373095งานนี้เพราะ

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุด (พร้อมโบนัสเสริม) ชนะ!

จะมีวิธีแก้ปัญหาอยู่เสมอ แต่ -10 หากโปรแกรมของคุณพิมพ์ "ไม่" เมื่อไม่มีวิธีแก้ปัญหาด้วยจำนวนเต็ม นอกจากนี้ -10 หากโปรแกรมของคุณพิมพ์โซลูชั่นทั้งหมด (คั่นด้วยบรรทัดใหม่หรืออัฒภาคหรืออะไรก็ตาม) แทนที่จะเป็นเพียงหนึ่ง

กรณีทดสอบ:

3 7.923668178593959 --> 6 7 8
2 2.8284271247461903 --> 2 2
5 5.0 --> 1 1 1 1 1
5 13.0 --> 4 4 9 9 9 --> 81 1 1 1 1 --> 36 9 4 1 1 etc. [print any, but print all for the "all solutions bonus"]

และใช่โปรแกรมของคุณจะต้องเสร็จสิ้นในเวลาที่ จำกัด โดยใช้หน่วยความจำที่ จำกัด บนเครื่องที่เหมาะสม มันไม่สามารถใช้งานได้ "ในทางทฤษฎี" คุณต้องสามารถทดสอบได้จริง


หากมีวิธีแก้ปัญหาหลายวิธีมันเป็นสิ่งสำคัญที่เราจะพิมพ์โซลูชั่น? เช่นสำหรับกรณีทดสอบครั้งสุดท้ายของคุณ (5 13.0) นี่เป็นวิธีแก้ปัญหาที่ถูกต้อง: 81 1 1 1 1
Jakube

และอนุญาตให้มีค่าศูนย์ในการแก้ปัญหา?
Jakube

1
อินพุตถูกคั่นด้วยช่องว่างเสมอหรือไม่?
Sp3000

และป้อนอินพุตผ่านฟังก์ชันการโทรที่ได้รับอนุญาตหรือไม่
Jakube

นอกจากนี้ยังมีวิธีแก้ไขปัญหาซ้ำซ้อน สำหรับตัวอย่างแรกรหัสของเราอนุญาตให้พิมพ์การเปลี่ยนลำดับทั้งหกของ6 7 8สำหรับโบนัสที่สองหรือไม่
Martin Ender

คำตอบ:


9

Python 3, 90 - 10 = 80

def S(N,x,n=[],i=1):
 if x*x<1e-12>N==0:print(*n)
 while.1+x*x>i:S(N-1,x-i**.5,n+[i]);i+=1

(Mega ต้องขอบคุณ @xnor สำหรับคำแนะนำโดยเฉพาะการปรับโครงสร้างของการวนซ้ำไปอีกสักครู่)

ความพยายามแบบเรียกซ้ำง่าย ๆ มันเริ่มต้นด้วยหมายเลขเป้าหมายและลบรากที่สองอย่างต่อเนื่องจนกว่าจะถึง 0 หรือต่ำกว่า ฟังก์ชั่นSสามารถเรียกว่าชอบS(2,3.414213562373095)(อาร์กิวเมนต์ที่สองจะถือว่าเป็นบวก)

โปรแกรมไม่เพียงพิมพ์โซลูชั่นทั้งหมด แต่พิมพ์พีชคณิตของโซลูชันทั้งหมด (นอกเรื่องฉันรู้) นี่คือผลลัพธ์สำหรับกรณีล่าสุด: Pastebin

การปรับแต่งเล็กน้อยให้โซลูชัน98 - 10 = 88ซึ่งไม่ได้พิมพ์วิธีเรียงสับเปลี่ยนทำให้มีประสิทธิภาพมากขึ้น:

def S(N,x,n=[]):
 *_,i=[1]+n
 if x*x<1e-12>N==0:print(*n)
 while.1+x*x>i:S(N-1,x-i**.5,n+[i]);i+=1

และเพียงเพื่อความสนุกสนานนี้99-10 = 89หนึ่งเป็นเรื่องเกี่ยวกับที่มีประสิทธิภาพตามที่ได้รับ (ไม่เหมือนคนอื่น ๆ ก็ไม่ได้ระเบิดสแต็คในS(1,1000):

def S(N,x,n=[]):
 *_,i=[1]+n
 if x*x<1e-12>N:print(*n)
 while(.1+x*x>i)*N:S(N-1,x-i**.5,n+[i]);i+=1

โปรดทราบว่าแม้ว่าเราจะมีอาร์กิวเมนต์เริ่มต้นที่ไม่แน่นอน แต่สิ่งนี้จะไม่ทำให้เกิดปัญหาหากเราเรียกใช้ฟังก์ชันใหม่ตั้งแต่n+[i]สร้างรายการใหม่


พิสูจน์ความถูกต้อง

เพื่อที่จะจบลงในวง จำกัด เราต้องตีบางจุดที่x <0และ0.1 + x 2 > 1 นี้เป็นที่พอใจโดยx <-0.948 ...

แต่ทราบว่าเราเริ่มต้นจากบวกxและxมักจะลดลงดังนั้นเพื่อที่จะตีx <-0.948 ...เราต้องมีx '- ฉัน0.5 <-0.948 ...สำหรับบางx'> -0.948 .. .ก่อนxและจำนวนเต็มบวกฉัน สำหรับวงในขณะที่การทำงานเราก็ต้องมี0.1 + x' 2 > ฉัน

เราได้รับการจัดเรียงx ' 2 + 1.897x + 0.948 <i <0.1 + x ' 2ส่วนด้านนอกหมายความว่าx'<-0.447 แต่ถ้า-0.948 <x '<-0.447ดังนั้นจะไม่มีจำนวนเต็มบวกที่ฉันสามารถใส่เข้าไปในช่องว่างในความไม่เท่าเทียมกันข้างต้น

ดังนั้นเราจะไม่สิ้นสุดในวงวนไม่สิ้นสุด


คุณสามารถหลีกเลี่ยงกับabs x*x<1e-12
xnor

1
ฉันคิดว่าการwhileวนซ้ำนี้ทำงานเพื่อแทนที่for: while.1+x*x>i:S(x-i**.5,n+[i]);i+=1โดยเริ่มต้นได้i=1ในพารามิเตอร์ฟังก์ชัน แนวคิดคือการหลีกเลี่ยงการแปลงเป็นints .1คือการจัดการกับความไม่ถูกต้องลอย; ฉันคิดว่ามันปลอดภัยกับลูปไม่ จำกัด
xnor

@xnor ฉันได้ใช้เคล็ดลับแรกในตอนนี้ ฉันยังคงตรวจสอบความถูกต้องของอันที่สอง แต่ถ้าดีแล้วนั่นช่วยประหยัดจำนวนไบต์ได้! (และฉันก็คาดหวังให้คุณโพสต์วิธีแก้ปัญหา: P)
Sp3000

1
และNตอนนี้เป็นฟังก์ชั่นการโต้แย้งก็สั้นเพื่อ recurse ลงด้วยN-1และตรวจสอบเมื่อมากกว่าN==0 len(n)==N
xnor

@ Sp3000 ฉันเชื่อว่าตอนนี้.1ปลอดภัยแล้ว ฉันสามารถคุยกับคุณถ้าคุณต้องการ
xnor

6

อารัมภบท ECLiPSe - 118 (138-20)

ฉันใช้การใช้ Prolog ต่อไปนี้: http://eclipseclp.org/

:-lib(util).
t(0,S,[]):-!,S<0.00001,S> -0.00001.
t(N,S,[X|Y]):-A is integer(ceiling(S*S)),between(1,A,X),M is N-1,T is S-sqrt(X),t(M,T,Y).

นี่เป็นวิธีที่ไร้เดียงสาและมีความสำคัญมาก การแสดงรายการโซลูชันที่เป็นไปได้ทั้งหมดนั้นต้องใช้เวลาในการครอบคลุมชุดค่าผสมทั้งหมด ( แก้ไข : ช่วงของจำนวนเต็มที่เยี่ยมชมตอนนี้จะลดลงในแต่ละขั้นตอน

ต่อไปนี้เป็นบททดสอบการถอดเสียง โดยค่าเริ่มต้นสภาพแวดล้อมจะพยายามค้นหาวิธีแก้ปัญหาที่เป็นไปได้ทั้งหมด (-10) และพิมพ์ "ไม่" เมื่อไม่สามารถทำได้ (-10)

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

[eclipse 19]: t(1,0.5,R).

No (0.00s cpu)
[eclipse 20]: t(2,3.414213562373095,R).

R = [2, 4]
Yes (0.00s cpu, solution 1, maybe more) ? ;

R = [4, 2]
Yes (0.00s cpu, solution 2, maybe more) ? ;

No (0.01s cpu)
[eclipse 21]: t(3,7.923668178593959,R).

R = [6, 7, 8]
Yes (0.02s cpu, solution 1, maybe more) ? ;

R = [6, 8, 7]
Yes (0.02s cpu, solution 2, maybe more) ? ;

R = [7, 6, 8]
Yes (0.02s cpu, solution 3, maybe more) ? 
[eclipse 22]: t(5,5.0,R).

R = [1, 1, 1, 1, 1]
Yes (0.00s cpu, solution 1, maybe more) ? ;
^C

interruption: type a, b, c, e, or h for help : ? abort
Aborting execution ...
Abort
[eclipse 23]: t(5,13.0,R).

R = [1, 1, 1, 1, 81]
Yes (0.00s cpu, solution 1, maybe more) ? ;

R = [1, 1, 1, 4, 64]
Yes (0.00s cpu, solution 2, maybe more) ? ;

R = [1, 1, 1, 9, 49]
Yes (0.00s cpu, solution 3, maybe more) ?
[eclipse 24]:

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

    p(N,S):-t(N,S,L),write(L),fail.
    p(_,_).

ดูhttp://pastebin.com/ugjfEHpwสำหรับกรณี (5,13.0) ซึ่งเสร็จในเวลา 0.24 วินาทีและค้นหาคำตอบ 495 รายการ (แต่บางทีฉันอาจขาดวิธีแก้ไขบางอย่างฉันไม่รู้)


3
นอกจากนี้ยังพิมพ์ "ใช่" เมื่อสำเร็จ! โอ้อารัมภบท
Sp3000

3

Erlang, 305-10 302-10

f(M,D)->E=round(D*D),t(p(E,M,1),{M,E,D}).
p(_,0,A)->A;p(E,N,A)->p(E,N-1,A*E).
t(-1,_)->"No";t(I,{N,E,D}=T)->L=q(I,N,E,[]),V=lists:sum([math:sqrt(M)||M<-L])-D,if V*V<0.1e-9->lists:flatten([integer_to_list(J)++" "||J<-L]);true->t(I-1,T)end.
q(I,1,_,A)->[I+1|A];q(I,N,E,A)->q(I div E,N-1,E,[I rem E+1|A]).

ฟังก์ชันนี้ส่งคืนสตริง "ไม่" หรือสตริงที่มีค่าคั่นด้วยช่องว่าง มัน (ไม่มีประสิทธิภาพ) จะประมวลผลค่าที่เป็นไปได้ทั้งหมดที่เข้ารหัสให้เป็นจำนวนเต็มขนาดใหญ่และเริ่มต้นด้วยค่าที่สูงขึ้น ไม่อนุญาตให้ใช้ 0 ในโซลูชันและการเข้ารหัส 0 แทนค่าทั้งหมด ข้อผิดพลาดกำลังสอง

ตัวอย่าง:

f(1,0.5).               % returns "No"
f(2,3.414213562373095). % returns "4 2 "
f(3,7.923668178593959). % returns "8 7 6 "
f(5,5.0).               % returns "1 1 1 1 1 "
f(5,13.0).              % returns "81 1 1 1 1 "

โปรดอดใจรอด้วยf(5,13.0)พื้นที่ค้นหาฟังก์ชั่นคือ 13 ^ 10 สามารถทำได้เร็วขึ้นด้วย 2 ไบต์เพิ่มเติม


3

Python 3 2: 173 159 - 10 = 149

คำอธิบาย: แต่ละโซลูชันมีรูปแบบ x_1 x_2 ... x_n ที่มี 1 <= x_1 <= x ^ 2 โดยที่ x คือผลรวมเป้าหมาย ดังนั้นเราสามารถเข้ารหัสแต่ละวิธีเป็นจำนวนเต็มในฐาน x ^ 2 ขณะที่วนซ้ำทุกความเป็นไปได้ (x ^ 2) ^ n จากนั้นฉันแปลงจำนวนเต็มกลับมาและทดสอบผลรวม ตรงไปตรงมาสวย

i=input;n=int(i());x=float(i());m=int(x*x);a=m**n
while a:
 s=[a/m**b%m+1for b in range(n)];a-=1
 if abs(x-sum(b**.5for b in s))<1e-5:print' '.join(map(str,s))

พบวิธีแก้ปัญหาทั้งหมด แต่กรณีทดสอบสุดท้ายใช้เวลานานเกินไป


3

JavaScript (ES6) 162 (172 - 10) 173

แก้ไขสั้นกว่าเล็กน้อยช้ากว่าเล็กน้อย

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

(2016 ปรับปรุงกุมภาพันธ์) เวลาปัจจุบันสำหรับกรณีทดสอบครั้งสุดท้ายเมื่อ: ประมาณ 1 150 วินาที ข้อกำหนดหน่วยความจำ: เล็กน้อย

F=(k,t,z=t- --k,r=[])=>{
  for(r[k]=z=z*z|0;r[k];)
  { 
    for(;k;)r[--k]=z;
    for(w=t,j=0;r[j];)w-=Math.sqrt(r[j++]);
    w*w<1e-12&&console.log(r.join(' '));
    for(--r[k];r[k]<1;)z=--r[++k];
  }
}

รุ่น ES 5เบราว์เซอร์ใด ๆ

function F(k,t)
{
  var z=t- --k,r=[];  
  for(r[k]=z=z*z|0;r[k];)
  {
    for(;k;)r[--k]=z;
    for(w=t,j=0;r[j];)w-=Math.sqrt(r[j++]);
    w*w<1e-12&&console.log(r.join(' '));
    for(--r[k];r[k]<1;)z=--r[++k];
  }
}

ทดสอบตัวอย่างข้อมูลที่ควรรันบนเบราว์เซอร์ล่าสุด

F=(k,t)=>
{
   z=t- --k,r=[];
   for(r[k]=z=z*z|0;r[k];)
   { 
      for(;k;)r[--k]=z;
      for(w=t,j=0;r[j];)w-=Math.sqrt(r[j++]);
      w*w<1e-12&&console.log(r.join(' '));
      for(--r[k];r[k]<1;)z=--r[++k];
   }
}

console.log=x=>O.textContent+=x+'\n'

t=~new Date
console.log('\n2, 3.414213562373095')
F(2, 3.414213562373095)
console.log('\n5, 5')
F(5, 5)
console.log('\n3, 7.923668178593959')
F(3, 7.923668178593959)
console.log('\n5, 13')
F(5, 13)

t-=~new Date
O.textContent = 'Total time (ms) '+t+ '\n'+O.textContent
<pre id=O></pre>

( แก้ไข ) ด้านล่างนี้เป็นผลลัพธ์ในพีซีของฉันเมื่อฉันโพสต์คำตอบนี้เมื่อ 15 เดือนก่อน ฉันลองวันนี้และเร็วขึ้น 100 เท่าบนพีซีเครื่องเดียวกันกับ Firefox รุ่น 64 บิตอัลฟา (และ Chrome ล้าหลัง) - เวลาปัจจุบันด้วย Firefox 40 Alpha 64 บิต: ~ 2 วินาที, Chrome 48: ~ 29 วินาที

เอาท์พุท (บนพีซีของฉัน - หมายเลขสุดท้ายคือ runtime เป็นมิลลิวินาที)

2 4
1 1 1 1 1
6 7 8
1 1 1 1 81
1 1 1 4 64
1 1 1 9 49
1 1 4 4 49
1 1 1 16 36
1 1 4 9 36
1 4 4 4 36
1 1 1 25 25
1 1 4 16 25
1 1 9 9 25
1 4 4 9 25
4 4 4 4 25
1 1 9 16 16
1 4 4 16 16
1 4 9 9 16
4 4 4 9 16
1 9 9 9 9
4 4 9 9 9
281889

2

Mathematica - 76 - 20 = 56

f[n_,x_]:=Select[Union[Sort/@Range[x^2]~Tuples~{n}],Abs[Plus@@√#-x]<10^-12&]

ตัวอย่าง

f[2, 3.414213562373095]
> {{2, 4}}
f[3, 7.923668178593959]
> {{6, 7, 8}}
f[3, 12]
> {{1, 1, 100}, {1, 4, 81}, {1, 9, 64}, {1, 16, 49}, {1, 25, 36}, {4, 4, 64}, {4, 9, 49}, {4, 16, 36}, {4, 25, 25}, {9, 9, 36}, {9, 16, 25}, {16, 16, 16}}

พิมพ์นี้ได้Noอย่างไร นอกจากนี้เอาต์พุตไม่ได้คั่นด้วยช่องว่าง นอกจากนี้คุณไม่สามารถใช้Tr@แทนPlus@@? และคุณอาจจะสามารถบันทึกตัวอักษรบางตัวโดยการเปลี่ยนSelectไปCasesฟังก์ชั่นที่สิ้นสุดกับรูปแบบและทำให้fฟังก์ชั่นบริสุทธิ์ที่ไม่มีชื่อ
Martin Ender

2

Haskell, 87 80 - 10 = 70

นี่เป็นอัลกอริทึมแบบเรียกซ้ำที่คล้ายกับโปรแกรม Python 3 ของ @ Sp3000 มันประกอบด้วยฟังก์ชั่น infix #ที่ส่งกลับรายการของพีชคณิตทั้งหมดของการแก้ปัญหาทั้งหมด

0#n=[[]|n^2<0.1^12]
m#n=[k:v|k<-[1..round$n^2],v<-(m-1)#(n-fromInteger k**0.5)]

ด้วยคะแนน102 99 92 - 10 = 82เราสามารถพิมพ์แต่ละโซลูชั่นได้เพียงครั้งเดียวเรียงลำดับ:

0#n=[[]|n^2<0.1^12]
m#n=[k:v|k<-[1..round$n^2],v<-(m-1)#(n-fromInteger k**0.5),m<2||[k]<=v]

2

Pyth 55 54 47-20 = 27

DgGHKf<^-Hsm^d.5T2^10_12^r1hh*HHGR?jbmjdkKK"No

ลองออนไลน์

ยืมตัวออกจากความคิดเห็นของ xnor อย่างไร้ยางอาย;)

นี้จะวิ่งออกมาจากหน่วยความจำในคอมพิวเตอร์ที่มีเหตุผลใด ๆ 5,5.0แม้สำหรับค่าเช่น กำหนดฟังก์ชั่นที่สามารถเรียกได้ว่าเหมือนgg 3 7.923668178593959

โปรแกรมไพ ธ อน 3 นี้ใช้อัลกอริธึมเดียวกันเป็นหลัก (เพียง แต่ไม่ทำการพิมพ์ "ไม่" ในตอนท้ายซึ่งสามารถทำได้โดยการกำหนดตัวแปรให้กับผลลัพธ์ทั้งหมดแล้วเขียนprint(K if K else "No")) แต่ใช้ตัวสร้างดังนั้นมันจึงไม่ ' ไม่ได้รับข้อผิดพลาดของหน่วยความจำ (ใช้เวลานานมาก แต่ฉันพิมพ์ออกมาเพราะพบค่า):

สิ่งนี้ให้ผลลัพธ์เดียวกันกับที่ @ Sp3000 ได้รับ นอกจากนี้มันใช้เวลาหลายวันกว่าจะเสร็จ (ฉันไม่ได้เวลา แต่ประมาณ 72 ชั่วโมง)

from itertools import*
def g(G,H):
    for x in product(range(1,int(H*H+2)),repeat=G):
        if (H-sum(map(lambda n:n**.5,x)))**2<1e-12:print(*x)

1

Python 3 - 157 174 169 - 10 = 159

แก้ไข 1: เปลี่ยนรูปแบบผลลัพธ์เป็นจำนวนเต็มคั่นด้วยช่องว่างแทนคั่นด้วยเครื่องหมายจุลภาค ขอบคุณสำหรับเคล็ดลับในการลบวงเล็บปีกการอบ ๆ (n, x)

แก้ไข 2: ขอบคุณสำหรับเคล็ดลับการเล่นกอล์ฟ! ฉันสามารถตัดออกได้อีก 9 ตัวอักษรถ้าฉันใช้การทดสอบ == แทนการทดสอบเพื่อความเท่าเทียมโดยประมาณภายใน 1e-6 แต่นั่นจะทำให้การแก้ปัญหาโดยประมาณเป็นโมฆะหากมีอยู่จริง

ใช้ itertools เพื่อสร้างชุดค่าผสมจำนวนเต็มที่เป็นไปได้ทั้งหมดหวังว่าจะมีประสิทธิภาพ :)

ฉันไม่พบวิธีเพิ่มการพิมพ์ "ไม่" อย่างมีประสิทธิภาพดูเหมือนว่าจะใช้อักขระเกิน 10 ตัวเสมอ

from itertools import*
n,x=eval(input())
for c in combinations_with_replacement(range(1,int(x*x)),n):
 if abs(sum(z**.5for z in c)-x)<1e-6:print(' '.join(map(str,c)))

โปรแกรมของคุณมีรูปแบบผลลัพธ์ที่ไม่ถูกต้อง (เครื่องหมายจุลภาคแทนช่องว่าง) นอกจากนี้คุณยังสามารถโกนหนวดได้ 2 ไบต์ด้วยการลบเครื่องหมายวงเล็บn,xออก
Zgarb

ฉันดูเหมือนจะได้รับSyntaxErrorเมื่อผมลองevalบรรทัด ...
SP3000

@ Sp3000: ลองป้อน 3,7.923668178593959 คุณต้องการ ','
Jakube

4 การปรับปรุงเล็ก ๆ น้อย ๆ : from itertools import*บันทึก 1 ลบพื้นที่ที่z**.5forช่วยประหยัด 1 และลบ[]ในsum(z**.5for z in c)บันทึกที่ 2 และลบ()ในif(...)บันทึก 1.
Jakube

การเปลี่ยนเป็น Python 2 และการใช้n,x=input()จะมีขนาดเล็กลงหรือไม่
Octavia Togami

0

สกาลา (397 ไบต์ - 10)

import java.util.Scanner
object Z extends App{type S=Map[Int,Int]
def a(m:S,i:Int)=m updated(i,1+m.getOrElse(i,0))
def f(n:Int,x:Double):Set[S]={if(n==0){if(x.abs<1e-6)Set(Map())else Set()}
else((1 to(x*x+1).toInt)flatMap{(i:Int)=>f(n-1,x-Math.sqrt(i))map{(m:S)=>a(m,i)}}).toSet}
val s=new Scanner(System.in)
f(s.nextInt,s.nextDouble)foreach{(m:S)=>m foreach{case(k,v)=>print(s"$k "*v)};println}}

หากไม่มีการเรียงสับเปลี่ยนโปรแกรมนี้จะไม่พิมพ์ผลใด ๆ

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