Boyutlarım nelerdir?


18

Görev: Bir üçgenin alanı göz önüne alındığında, bu alana sahip bir Heron üçgeni bulun . Belirtilen alana sahip herhangi bir Heroniyen üçgene izin verilir.

Heronian üçgeni, tamsayı kenarları ve tamsayı alanı olan bir üçgendir . Heron'un formülüne göre, kenar uzunlukları a,b,colan bir üçgen alana sahiptir

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

burada s=(a+b+c)/2üçgenin çevresinin yarısı. Bu aynı zamanda şu şekilde de yazılabilir:

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

Böyle bir üçgen yoksa, tutarlı bir falsey değeriyle çıktı alın.

Girdi: Üçgenin alanını temsil eden tek, pozitif bir tam sayı.

Çıktı: Böyle bir üçgen VEYA hatalı değer için herhangi bir üç yan uzunluk.

Örnekler:

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

Standart boşluklar geçerlidir

Bu kod golf, bayt kazanır en kısa cevap kazanır.


6
Meydan okumanızda Heron üçgeninin nispeten özlü bir tanımını yazabilir misiniz?
Okx

1
@Okx: Tamsayı kenarları ve tamsayı alanı olan bir üçgen olduğu belli değil mi?
Neil A.

@Okx: Fikir bu. Tek yapmanız gereken verilen alan için böyle bir örnek bulmaktır.
Neil A.

Wikipedia bağlantısından: "Heronian üçgeni, yan uzunlukları ve alanı tamsayı olan bir üçgendir."
Neil A.

5
Sorudaki tanım hakkında neyin kafa karıştırıcı olduğunu açıklar mısınız?
Neil A.

Yanıtlar:


6

Jöle , 17 16 bayt

Outgolfer Erik sayesinde -1 bayt (hızlı kullanın, ¥)

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

Heron formülünün kaba kuvvet uygulaması.

Çevrimiçi deneyin! (114 test vakası için 60s zaman aşımına ulaşır. Yerel olarak 3m 30s alır - 114 3 = 1.481.544 üçe kadar kontrol eder)

Nasıl?

Gerçek bir golf çözümü - bir alan göz önüne alındığında ve arasında (ve tekrarlanan üçgenlerde ve alan olmayanlarda) üç tamsayı içeren tüm tuplleri abulur , alanlarını ve filtrelerini istenen alana sahip olanlar için alır (en kısa sürede bile durmaz bir tane bulunursa, bunların hepsini pulluk eder ve daha sonra ilk sonucu çıkarır). Getirileri hiçbiri varsa.1a0

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)

Birisinin bunu kaba kuvvet yapmaya çalışacağını düşündüm, güzel!
Neil A.

@NeilA. Çoğu golf başvurusunun bu meydan okuma için kaba kuvvet olacağını hayal ediyorum - ancak bazıları bundan daha gülünç verimsizken golf oynamayı başarabilir.
Jonathan Allan

Sen yerini alabilir çile Ç⁼¥çekilebilir ve ikinci satırını kaldırın.
Outgolfer Erik

@EriktheOutgolfer Oh, teşekkürler, bununla nasıl başa çıkacağımı merak ediyordum ...
Jonathan Allan

5

JavaScript (ES7), 109 102 100 98 bayt

3 tamsayı bir dizi veya döndürür false. Gibi Jelly cevap , bu Heron formülü zorlayarak kaba olduğunu.

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

Test senaryoları


Özyinelemeli sürüm, 83 bayt

3 tamsayı bir dizi döndürür veya özyineleme hatası atar. Ne yazık ki, sadece küçük girdiler için çalışıyor.

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)

gösteri


4

Haskell , 69 bayt

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

Çevrimiçi deneyin!

Gibi üç üçgen taraf listesinin tek bir çıktısını verir [[3.0,4.0,5.0]]. İmkansız girdiler verir []. Teknik olarak sadece FalseHaskell için Falsey'dir, ancak Haskell tüm olası çıkışların aynı tipte olmasını gerektirdiğinden, kullanılamaz. Bir hata Falsey olarak kullanılabilseydi, [...]!!03 bayt tasarruf ederdi take 1[..].

tHer biri 1bölgeden bölgeye değişen tüm olası yan uzunluktaki üçlüyü dener a. Heron'un formülü, alanın (s-0)(s-x)(s-y)(s-z)==a*anerede s=(x+y+z)/2olduğu ile eşleşip eşleşmediğini kontrol etmek için kullanılır sum t/2. Ürün (s-0)(s-x)(s-y)(s-z), productelemanların alınmasıyla birlikte ifade edilir 0:t, yani üçlü ve 0.


Gülen yüz için +1, sorta bir noop olsa bile
Julian Wolf

2

F #, 170 156 152 bayt

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

Çevrimiçi deneyin!

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

Herhangi bir sonuç bulunmazsa, program arızalanır. Bu arzu edilmez, ben değiştirmek zorunda List.findbiriyle List.filtervaka hiçbir şey bulunamadı veya boş bir liste üretecek olan (2 byte) List.tryFinddurumunda Hiçbiri hiçbir üçgen bulunmuştur dönen, (3 bayt).

Her zaman bir golf F # sürümü hala okunaklı bulmak.


1
F # bilmiyorum, ama hayal edersiniz System.Math.Sqrtve ortaya çıkan değeri karşılaştırmak A * A?
Sean

@ Elbette Tabii! Bahşiş için teşekkürler :)
Brunner

Değiştirme 1.0..A [...] 1.0..A [...] 1.0..Aile 1.0..A [...] a..A [..] b..A(eğer çalışırsa, ben çok az F # deneyime sahip) Bir kaç bayt ve hızını sizi biraz kaydetmek gerekir.
CAD97

@ CAD97 Var! Bunu işaret ettiğiniz için teşekkürler.
Brunner

2

Python 2 (PyPy) , 131 123 118 bayt

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

Çevrimiçi deneyin!

Bu CPython üzerinde de çalışırken, PyPy çok daha hızlıdır ve TIO'daki zaman sınırında 114 için üçgeni hesaplayabilir.

Makinemden zamanlamalar:

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

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

Gerçek / sahte bir değer basan veya

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

bu da tüm olası çözümleri basar ve büyük girdiler için son derece yavaştır. Yalnızca bir tane yazdırmak için başında 'h' koyun.

Açıklama:

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

Dene


1

Perl 6 , 54 bayt

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

aGiriş alanından bir taneye kadar tüm olasılıkların yanlarında kaba kuvvet araması .

  • ^a0 ile 0 arasındaki sayılardır a - 1.
  • [X] ^a xx 3Tüm üçüz üreten çapraz ürün, bu aralığın, üç kopya ile azaltır (0, 0, 0)için (a - 1, a - 1, a - 1).
  • Biz bakmak firstbu tarafla da üçgenin alanı eşittir, öyle ki üçlü akullanarak, Heron formülü .

Aşağıdaki kod bloğunda first:

  • $_üçlüdür. Diyelim (x, y, z)burada.
  • (0,|$_)Aynı üçlü ama ile 0de başa: (0, x, y, z).
  • .sum / 2çevrenin yarısıdır s(Heron formülünün olağan ifadesinde adlandırılan bir miktar ).
  • .sum / 2 «-« (0, |$_)ile çıkarma hyperoperator olan ssol ve üstünde (0, x, y, z)vererek sağda (s - 0, s - x, s - y, s - z).
  • [*] daha sonra bu dörtgeni çarpma ile azaltır ve alanın karesini verir.
  • a * a == verilen alanın karesine eşit kare bir alan arar.

Üçlü bulunmazsa Nil(falsey) döndürülür.


1

Haskell , 76 bayt

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]

Bu, kaba kuvvet yoluyla doğru alanı oluşturan tüm olası integral boyutlarını içeren listelerin bir listesini çıkarır (yoksa boş listenin çıktısını alır). Ortadaki bölünme nedeniyle bu uyarı iki katına çıkar, ancak kesirli kısımları her zaman 0'dır.

Eğer bir sebepten ötürü bunu alamıyorsanız,

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]

Bu, toplamda 89 77 bayt veya 13 1 ekstra bayt için bir tamsayı listesi listesi olarak cevapları verecektir . (Neil'e teşekkürler)

Eğer sadece ilk öğeye ihtiyacınız varsa / istiyorsanız, sadece !!0sayılar geçerliyse sadece ilk öğeyi verir ve 3 bayt için hiçbiri yoksa ve take 1başlangıçta ilk öğeyi hata yapmadan alır 6 daha fazla bayt.

Çevrimiçi deneyin!


Çiftlerden kaçınmak istiyorsanız, denklemi her iki tarafta 4 ile çarpamaz mısınız?
Neil

0

TI-Basic, 70 69 bayt

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
/

Bir üçgen varsa üç kenar uzunluğunu gösterir, yoksa bir sözdizimi hatası atar ( /sonunda).

Sean'ın farklı bir cevap hakkındaki yorumu sayesinde -1 byte


0

Mathematica, 77 bayt

mathematica Çöz ile

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 bayt

kaba kuvvet

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'da yerleşik yok mu? Şaşırtıcı.
Neil A.

@ovs ile bir bayt kaydedebilirsiniz Area@SSSTriangle[a,b,c].
numbermaniac

0

Aslında 22 bayt

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

Çevrimiçi deneyin!

Açıklama:

;╗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 bayt

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

Standart kaba kuvvet çözeltisi. Kod için 122 bayt, nparametre olarak belirtilecek 1 bayt .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.