ขนาดของฉันคืออะไร


18

ภารกิจ:ให้พื้นที่ของสามเหลี่ยมหาสามเหลี่ยม Heronianกับพื้นที่นั้น อนุญาตให้สามเหลี่ยม Heronian ใด ๆ ที่มีพื้นที่ที่ระบุ

Heronian สามเหลี่ยมเป็นรูปสามเหลี่ยมที่มีด้านจำนวนเต็มและพื้นที่จำนวนเต็ม ตามสูตรของนกกระสาสามเหลี่ยมที่มีความยาวด้านa,b,cมีพื้นที่

sqrt(s*(s-a)*(s-b)*(s-c))

โดยที่s=(a+b+c)/2ครึ่งหนึ่งของสามเหลี่ยม สิ่งนี้สามารถเขียนเป็น

sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)) / 4

หากไม่มีสามเหลี่ยมดังกล่าวอยู่เอาต์พุตที่มีค่าความผิดพลาดที่สอดคล้องกัน

อินพุต:เลขจำนวนเต็มบวกเดียวแทนพื้นที่ของสามเหลี่ยม

เอาท์พุท:ความยาวสามด้านใด ๆ สำหรับรูปสามเหลี่ยมหรือค่าที่ไม่ถูกต้อง

ตัวอย่าง:

Input -> Output
6 -> 3 4 5
24 -> 4 15 13
114 -> 37 20 19
7 -> error

ช่องโหว่มาตรฐานใช้

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


6
คุณสามารถเขียนคำจำกัดความที่ค่อนข้างกระชับของสามเหลี่ยม Heronian ในความท้าทายของคุณได้หรือไม่?
Okx

1
@Okx: มันไม่ชัดเจนว่ามันเป็นรูปสามเหลี่ยมที่มีด้านจำนวนเต็มและพื้นที่จำนวนเต็ม?
Neil A.

@Okx: นั่นคือความคิด สิ่งที่คุณต้องทำคือหาตัวอย่างหนึ่งสำหรับพื้นที่ที่กำหนดถ้ามันมีอยู่
Neil A.

จากลิงค์ Wikipedia: "สามเหลี่ยม Heronian เป็นสามเหลี่ยมที่มีความยาวด้านและพื้นที่ที่เป็นจำนวนเต็มทั้งหมด"
Neil A.

5
คุณช่วยอธิบายสิ่งที่ทำให้สับสนเกี่ยวกับคำนิยามในคำถามได้ไหม
Neil A.

คำตอบ:


6

เยลลี่ , 17 16 ไบต์

-1 ไบต์ขอบคุณ Erik the outgolfer (ใช้ประโยชน์จาก Quick ¥)

SHð;_P
ṗ3Ç⁼¥Ðf²Ḣ

บังคับใช้สูตรของนกกระสา

ลองออนไลน์! (ถึงเวลาหมดเวลา 60 วินาทีสำหรับกรณีทดสอบ 114 ครั้งใช้เวลา 3M 30s ในพื้นที่ - ตรวจสอบ 114 3 = 1,481,544 อเนกประสงค์)

อย่างไร?

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

SHð;_P - Link 1, get the square of the area of a triangle: list of sides
S      - sum the sides (get the perimeter)
 H     - halve
  ð    - dyadic chain separation (call that p)
    _  - subtraction (vectorises) =    [p-side1,  p-side2,  p-side3]
   ;   - concatenate              = [p, p-side1,  p-side2,  p-side3]
     P - product                  =  p*(p-side1)*(p-side2)*(p-side3)
                                  = the square of Heron's formula = area squared

ṗ3Ç⁼¥Ðf²Ḣ - Main link: number a (area)
ṗ3        - third Cartesian power (all triples of [1,area] : [[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2], ... ,[a,a,a]]
       ²  - square a
     Ðf   - filter keep if:
    ¥     -   last two links as a dyad:
  Ç       -     call last link (1) as a monad f(list of sides)
   ⁼      -     left (that result) equals right (square of a)?
        Ḣ - head - get the first one (an empty list yields 0, perfect for the falsey case)

ฉันคิดว่ามีใครบางคนพยายามที่จะเดรัจฉานบังคับนี้ดี!
Neil A.

@NeilA ฉันคิดว่าการส่งสนามกอล์ฟส่วนใหญ่จะเป็นสิ่งที่ท้าทายสำหรับความท้าทายนี้ - แต่บางคนก็สามารถตีกอล์ฟได้ในขณะที่ไม่มีประสิทธิภาพที่น่าขันกว่านี้
Jonathan Allan

คุณสามารถแทนที่çด้วยÇ⁼¥และลบบรรทัดที่สองทั้งหมด
Erik the Outgolfer

@EriktheOutgolfer โอ้ขอบคุณฉันสงสัยว่าจะทำยังไงดี ...
Jonathan Allan

5

JavaScript (ES7), 109 102 100 98 ไบต์

ผลตอบแทนทั้งอาร์เรย์ของจำนวนเต็ม 3 falseหรือ เช่นเดียวกับคำตอบของ Jellyนี่คือสัตว์เดรัจฉานบังคับสูตรของ Heron

A=>[...Array(A**3)].some((_,a)=>A*A/(r=[b=a/A%A|0,c=a/A/A|0,a%=A],p=a+b+c>>1)/(p-a)/(p-b)==p-c)&&r

กรณีทดสอบ


เวอร์ชันแบบเรียกซ้ำ 83 ไบต์

ส่งคืนอาร์เรย์จำนวนเต็ม 3 จำนวนหรือส่งข้อผิดพลาดการเรียกซ้ำ น่าเศร้าที่ใช้งานได้กับอินพุตขนาดเล็กเท่านั้น

f=(A,n)=>A*A/(r=[a=n%A,b=n/A%A|0,c=n/A/A|0],p=a+b+c>>1)/(p-a)/(p-b)==p-c?r:f(A,-~n)

การสาธิต


4

Haskell , 69 ไบต์

f a=take 1[t|t<-mapM(\_->[1..a])":-)",a*a==product[sum t/2-x|x<-0:t]]

ลองออนไลน์!

[[3.0,4.0,5.0]]เอาท์พุทเดี่ยวของรายการของทั้งสามด้านสามเหลี่ยมเหมือนเป็น []ปัจจัยการผลิตที่เป็นไปไม่ได้ให้ ในทางเทคนิคFalseคือ Falsey for Haskell แต่เนื่องจาก Haskell ต้องการเอาท์พุทที่เป็นไปได้ทั้งหมดให้เป็นประเภทเดียวกันจึงไม่สามารถใช้งานได้ หากมีข้อผิดพลาดสามารถใช้เป็น Falsey, จะประหยัดกว่า[...]!!0 3 ไบต์take 1[..]

พยายาม triples ทั้งหมดtของความยาวด้านที่เป็นไปได้ในแต่ละตั้งแต่ไปยังพื้นที่1 aมีการใช้สูตรของนกกระสาเพื่อตรวจสอบว่าพื้นที่ตรงกับ(s-0)(s-x)(s-y)(s-z)==a*aที่s=(x+y+z)/2อยู่sum t/2หรือไม่ ผลิตภัณฑ์(s-0)(s-x)(s-y)(s-z)แสดงเป็นproductองค์ประกอบที่นำมาจาก0:tเช่นสามและ 0


+1 สำหรับหน้ายิ้มแม้ว่ามันจะเป็น noop
Julian Wolf

2

F #, 170 156 152 bytes

let f(a,b,c)=
 let s=(a+b+c)/2.0
 s*(s-a)*(s-b)*(s-c)
let g A=[for a in 1.0..A do for b in a..A do for c in b..A do yield a,b,c]|>List.find(f>>(=)(A*A))

ลองออนไลน์!

"Ungolfed"

let calculateArea (a, b, c) =
    let s = (a+b+c)/2.0
    s*(s-a)*(s-b)*(s-c)

let getTriangle A =
    [  for a in 1.0..A do
       for b in a..A do
       for c in b..A do yield a,b,c
    ]
    |> List.find(calculateArea>>(=)(A * A))

หากไม่พบผลลัพธ์โปรแกรมจะผิดพลาด หากไม่ต้องการฉันต้องแทนที่List.findด้วยList.filter(+2 ไบต์) ซึ่งจะสร้างรายการว่างเปล่าในกรณีที่ไม่พบสิ่งใดหรือList.tryFind(+3 ไบต์) กลับไม่มีในกรณีที่ไม่พบรูปสามเหลี่ยม

ฉันมักจะพบว่ารุ่น F # golfed ยังคงชัดเจนเหมาะสม


1
ผมไม่ทราบว่า F # แต่ฉันคิดว่าคุณสามารถจ่ายยาที่มีSystem.Math.Sqrtและเปรียบเทียบค่าผลลัพธ์เพื่อA * A?
ฌอน

@Sean แน่นอน! ขอบคุณสำหรับเคล็ดลับ :)
Brunner

การแทนที่1.0..A [...] 1.0..A [...] 1.0..Aด้วย1.0..A [...] a..A [..] b..Aควรช่วยคุณสองสามไบต์และเพิ่มความเร็วให้คุณเล็กน้อย (ถ้าใช้งานได้ฉันมีค่าประสบการณ์ F # น้อยมาก)
CAD97

@ CAD97 มันทำ! ขอบคุณสำหรับการชี้ให้เห็นว่า
Brunner

2

Python 2 (PyPy) , 131 123 118 ไบต์

n=input()
t=n*3;r=i=c=0
while c<t:
 i+=1;a,b,c=i%t,i/t%t,i/t/t;s=a+b+c>>1
 if(s-a)*s*(s-b)*(s-c)==n**2:r=a,b,c
print r

ลองออนไลน์!

ขณะนี้ยังทำงานกับ CPython ได้ PyPy นั้นเร็วกว่ามากและสามารถคำนวณสามเหลี่ยมได้ 114 ในเวลาที่ จำกัด ใน TIO

เวลาจากเครื่องของฉัน:

$ echo 114 | time pypy2 d.py
        0.55 real         0.52 user         0.02 sys
$ echo 114 | time python2 d.py
       52.46 real        51.76 user         0.27 sys

1

Pyth - 23 ไบต์

/mu*G-/sd2Hd/sd2^UQ3^Q2

ซึ่งพิมพ์ค่าความจริง / เท็จหรือ

fq^Q2u*G-/sT2HT/sT2^UQ3

ซึ่งพิมพ์ทางออกที่เป็นไปได้ทั้งหมดและช้ามากสำหรับอินพุตขนาดใหญ่ วาง 'h' ไว้ที่จุดเริ่มต้นเพื่อพิมพ์เพียงรายการเดียว

คำอธิบาย:

fq^Q2u*G-/sT2HT/sT2^UQ3
                    UQ    # List of numbers from 0 to input-1
                   ^  3   # All triples of these numbers
f                         # Filter this by the following test (on variable T, based on Hero's formula)
     u*G-/sT2HT/sT2       # s*(s-a)*(s-b)*(s-c), where s is the sum of the triple over 2 (calclated as /sT2 )
 q^Q2                     # Test if equal to input ^2

ลองมัน


1

Perl 6 , 54 ไบต์

->\a{first {a*a==[*] .sum/2 «-«(0,|$_)},[X] ^a xx 3}

ค้นหากำลังของสัตว์ประหลาดทุกด้านที่น้อยกว่าหนึ่งaพื้นที่การป้อนข้อมูล

  • ^aเป็นช่วงของตัวเลขจาก 0 a - 1ไปยัง
  • [X] ^a xx 3ลดโดยสินค้าข้ามสามชุดของช่วงที่ผลิตแฝดทั้งหมดจากการ(0, 0, 0)(a - 1, a - 1, a - 1)
  • เรามองหาfirstแฝดดังกล่าวว่าพื้นที่ของรูปสามเหลี่ยมที่มีด้านเหล่านั้นเท่ากับaใช้สูตรของนกกระสา

ภายในบล็อครหัสที่มอบให้กับfirst:

  • $_คือ triplet โทรหา(x, y, z)ที่นี่
  • (0,|$_)เป็นแฝดเหมือนกัน แต่มีใช้ได้:0(0, x, y, z)
  • .sum / 2คือครึ่งปริมณฑล (ปริมาณที่มีชื่อsอยู่ในสูตรปกติของนกกระสา)
  • .sum / 2 «-« (0, |$_)เป็น hyperoperator ลบกับsทางด้านซ้ายและด้านขวาให้(0, x, y, z)(s - 0, s - x, s - y, s - z)
  • [*] จากนั้นลดสี่ส่วนด้วยการคูณทำให้พื้นที่ของสี่เหลี่ยมจัตุรัส
  • a * a == ค้นหาพื้นที่กำลังสองเท่ากับสี่เหลี่ยมของพื้นที่ที่กำหนด

หากไม่พบ triplet Nil(ซึ่งเป็นเท็จ) จะถูกส่งกลับ


1

Haskell , 76 ไบต์

f s=[[a,b,c]|a<-[1..s],b<-[1..a],c<-[1..b],a*a*c*c-(a*a+c*c-b*b)^2/4==4*s*s]

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

หากคุณด้วยเหตุผลบางอย่างไม่สามารถทำได้

f s=[[a,b,c]|a<-[1..s],b<-[1..a],c<-[1..b],4*a*a*c*c-(a*a+c*c-b*b)^2==16*s*s]

นี่จะแสดงคำตอบเป็นรายการของรายการจำนวนเต็มสำหรับ89 77 ไบต์รวมหรือ13 1 ไบต์พิเศษ (ขอบคุณนีล)

หากคุณต้องการ / ต้องการเพียงองค์ประกอบแรกที่เพิ่งวาง!!0ที่ส่วนท้ายจะให้คุณองค์ประกอบแรกเท่านั้นหากมีตัวเลขที่ใช้และข้อผิดพลาดหากไม่มีใครสำหรับ 3 ไบต์เพิ่มเติมและtake 1ที่จุดเริ่มต้นจะใช้องค์ประกอบแรกโดยไม่ผิดพลาดสำหรับ อีก 6 ไบต์

ลองออนไลน์!


หากคุณต้องการหลีกเลี่ยงการเพิ่มเป็นสองเท่าคุณไม่สามารถคูณสมการที่ 4 ในแต่ละด้านได้หรือไม่?
Neil

0

TI-Basic, 70 69 ไบต์

Prompt A
For(B,1,A
For(C,1,B
For(D,1,C
(B+C+D)/2
If A2=Ansprod(Ans-{B,C,D
Then
Disp B,C,D
Return
End
End
End
End
/

แสดงความยาวทั้งสามด้านถ้ามีรูปสามเหลี่ยมแสดงข้อผิดพลาดทางไวยากรณ์หากไม่มี (ขอบคุณ/ที่ส่วนท้าย)

-1 ไบต์ขอบคุณความคิดเห็นของฌอนในคำตอบที่ต่างออกไป


0

Mathematica, 77 ไบต์

กับการแก้ปัญหาทางคณิตศาสตร์ของ

s=(a+b+c)/2;d=Sqrt[s(s-a)(s-b)(s-c)];Solve[d==#&&0<a<b<c<#,{a,b,c},Integers]&

Mathematica, 117 ไบต์

กำลังดุร้าย

s=(a+b+c)/2;l="error";(For[a=1,a<#,a++,For[b=1,b<a,b++,For[c=1,c<b,c++,If[Sqrt[s(s-a)(s-b)(s-c)]==#,l={a,b,c}]]]];l)&

1
Mathematica ไม่มี builtin หรือไม่? น่าแปลกใจ.
Neil A.

@ovs คุณสามารถบันทึกหนึ่งไบต์ด้วยArea@SSSTriangle[a,b,c]เช่นกัน
numbermaniac

0

จริงแล้ว 22 ไบต์

;╗R3@∙⌠;Σ½;)♀-π*╜²=⌡░F

ลองออนไลน์!

คำอธิบาย:

;╗R3@∙⌠;Σ½;)♀-π*╜²=⌡░F  (implicit input: A)
;╗                      store a copy of A in register 0
  R                     range(1, A+1)
   3@∙                  ternary Cartesian product (all triples with values in [1, A])
      ⌠;Σ½;)♀-π*╜²=⌡░   filter: take triples where function returns truthy
       ;Σ½                make a copy of the triple, compute s = (a+b+c)/2
          ;)              make a copy of s, move it to the bottom of the stack
            ♀-            subtract each value in the triple from s
              π*          product of those values and s (s*(s-a)*(s-b)*(s-c))
                ╜²        A*A
                  =       compare equality (does area of triangle with given dimensions equal input?)
                     F  take first triple that satisfies the filter (or empty list if none)

0

Casio Basic, 123 ไบต์

For 1⇒a To n
For 1⇒b To n
For 1⇒c To n
If(s*(s-a)*(s-b)*(s-c)|s=(a+b+c)/2)=n^2
Then
Print{a,b,c}
Stop
IfEnd
Next:Next:Next

วิธีการแก้ปัญหาแรงเดรัจฉานมาตรฐาน 122 ไบต์สำหรับโค้ด, 1 ไบต์เพื่อระบุnเป็นพารามิเตอร์


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