Phương pháp ngắn nhất để thực hiện Định lý Pythagore


14

Ai không thích định lý pythagore a² + b² = c²? Viết phương pháp ngắn nhất bạn có thể bằng bất kỳ ngôn ngữ nào có giá trị a và b và in ra "Đường huyền của tam giác vuông này là" + c. Giữ c chỉ ba chữ số thập phân.


3
Điều này có đủ điều kiện như một câu đố lập trình?
DavidC

1
@DavidCarraher Vấn đề mỗi se không phải là câu đố lập trình. Nhưng vì mục tiêu là đánh golf một giải pháp cho nó, nên nó thực sự là một câu đố lập trình.
Victor Stafusa

3
ngắn nhất trong các nhân vật
Vik P

4
Các code-golfthẻ một cách rõ ràng nói "Mã-golf là một cuộc thi để giải quyết một vấn đề cụ thể trong ít nhất byte của mã nguồn." Xem Ghi điểm mã golf (byte so với ký tự) .
res

1
@res: Đã sửa :-p
Timwi

Câu trả lời:


15

APL (54)

'The hypotenuse of this right triangle is',3⍕.5*⍨+/⎕*2

Kiểm tra:

      'The hypotenuse of this right triangle is',3⍕.5*⍨+/⎕*2
⎕:
      9 10
The hypotenuse of this right triangle is 13.454

Giải trình:

  • ⎕*2: nâng các giá trị trong đầu vào lên nguồn thứ hai
  • +/: lấy tổng
  • .5*⍨: nâng kết quả lên mức 0,5
  • 3⍕: làm tròn đến 3 chữ số thập phân

Đây là về bất khả chiến bại
Cruncher

@Cruncher: Tôi đã cố mã hóa chuỗi nhưng không thể có thói quen giải mã đủ nhỏ.
bến tàu

Theo nguyên tắc lỗ chim bồ câu, tôi nghĩ bạn sẽ có một khoảng thời gian thực sự khó khăn (có thể là không thể. Ít nhất là không thể đối với một số chuỗi) khi cố gắng nén chuỗi. Có thể nếu chuỗi có một số mẫu logic, nhưng điều đó dường như không xảy ra. Tôi rất muốn thấy những nỗ lực mà bạn đã có từ trước đến nay
Cruncher

7
Sửa lỗi chính tả của "hypotenuse" để cứu một nhân vật.
Tim S.

1
@Cruncher: Thật ra, tôi đã đánh bại nó trong Sclipting ...
Timwi

11

TI-BASIC, 76 55 53 52 byte

Input :Disp "THE HYPOTENUSE OF THIS RIGHT TRIANGLE IS
Fix 3:R▶Pr(X,Y

Không, không cần phải có dấu ngoặc đơn đóng. Ngoài ra, ít byte hơn câu trả lời APL đó :)


1
Có thể R▶Pr(A,B.
lirtosiast

3
2 năm để thực hiện một đề nghị, lol.
mbomb007

Định mệnh cho sự vĩ đại, tôi đoán. Và tôi chỉ cần cạo thêm hai byte để đánh bại APL!
Timtech

-1 byte:Fix 3:R►Pr(X,Y
Khuldraeseth na'Barya

Sử dụng Inputđể yêu cầu XYlà loại vui nhộn. Nếu chúng ta cho phép điều đó, chúng ta cũng nên cho phép cài đặt PolarGCtrước Input, sao cho độ dài của cạnh huyền được đưa ra bởi một byte R? Phải thừa nhận rằng, với PolarGCcác giá trị XYkhông còn được hiển thị khi chúng ta di chuyển con trỏ xung quanh, nhưng chúng vẫn được lưu trữ cho các biến thích hợp. (Điều mà sau đó chúng ta sẽ không bao giờ sử dụng, nhưng đó là suy nghĩ đáng kể.)
Misha Lavrov

9

Python 2.7 - 76 Ký tự

print'The hypotenuse of this right triangle is %.3f'%abs(input()+1j*input())

Giải trình

| a + ib | = √ (a 2 + b 2 ) = c

==> a 2 + b 2 = c 2

PJ trên cạnh huyền

Giáo viên: "Bạn có thể cho tôi biết, hypotenuse là gì?"

LJ: "Hypotenuse, một câu hỏi dễ. Nếu có một bữa tiệc cao cấp tối qua, và bạn đọc nó trên tờ báo, nó được gọi là Tin tức của Đảng cao"


8

Sclipting , 46 ký tự

글坼各갠方終加감半方갾밈乘增貶껠矽녆둥긆둹댆뭴뉖멵댶넠닶눠덆둩댲걲늖덨덂건댦땡닦덬뉒걩댲밀⓶

Yêu cầu đầu vào là hai số (có thể là phân số!) Được phân tách bằng khoảng trắng.

Điều này ngắn hơn APL, mặc dù phải sử dụng một vài thủ thuật bất tiện.

Giải trình

글坼 | split at space
各 | for each...
  갠方 | to the power of two
終
加 | add
감半方 | to the power of one half
갾밈乘 | multiply by 1000
增貶 | increment, then decrement (kludge for rounding)
껠矽 | insert '.' at 4th-last character position
녆둥긆둹댆뭴뉖멵댶넠닶눠덆둩댲걲늖덨덂건댦땡닦덬뉒걩댲밀⓶ | "The hypotenuse..."

2
không unicode làm điều này giống như 92 byte?
Cruncher

@Cruncher Tôi đã hỏi ngày hôm qua trong phần bình luận câu hỏi, số đếm là số ký tự, không phải số byte.
Joachim Isaksson

3

đc 54

Tiếp tục số điểm của câu trả lời APL!

2^r2^+3kv[The hypotenuse of this right triangle is ]Pp

Kiểm tra:

$ dc
3 4
2^r2^+3kv[The hypotenuse of this right triangle is ]Pp
The hypotenuse of this right triangle is 5.000

không thực sự làm việc cho tôi. dc -e '2^r2^+3kv[The hypotenuse of this right triangle is ]Pp'không đợi bất kỳ đầu vào nào, in "dc: stack empty"3 lần và sau đó "Đường huyền của tam giác vuông này là 2.000".
Tomas

1
@Tomas đó là một loại chức năng aa; bạn cần đặt các tham số lên ngăn xếp trước, như tôi hiển thị trong bài kiểm tra hoặc nếu bạn muốn gọi theo cách của mình, đó sẽ là dc -e '3 4 2^r2^+3kv[...nơi 3 và 4 là các tham số.
daniero

3

C, 77 hoặc 99

77 ký tự nếu đầu vào chỉ có thể là đối số chức năng:

f(a,b){printf("The hypotenuse of this right triangle is %.3f\n",hypot(a,b));}

99 nếu đầu vào phải được đọc từ stdin:

a,b;f(){scanf("%d %d",&a,&b);printf("The hypotenuse of this right triangle is %.3f\n",hypot(a,b));}

Xin chân thành cảm ơn @Yimin Rong!


1
Có một hypot (a, b) sẽ giúp bạn tiết kiệm ba ký tự.

Hàm đó không biên dịch bất cứ thứ gì biên dịch Tôi sử dụng gcc tcc clang trong tio ... có lẽ thiếu một tiêu đề
#incoide

3

Quyền hạn

Chỉ để xem liệu tôi có thể ...

echo "The hypotenuse of this right triangle is " ([math]::round([math]::sqrt(([math]::pow(([double](Read-Host -p "A")),2) + [math]::pow(([double](Read-Host -p "B")),2))),3))

1
Công việc tốt đẹp. Có vẻ như bạn đã làm điều này trong khi tôi đang bận rộn với giải pháp của riêng mình, nó đánh bại điều này khoảng 62 ký tự. Để tham khảo trong tương lai, các câu trả lời của Code Golf dự kiến ​​sẽ được "đánh gôn" và bao gồm "điểm số" của chúng. "Chơi gôn" có nghĩa là bạn nên thực hiện mọi nỗ lực để giảm thời lượng ký tự bằng cách sử dụng bí danh tay ngắn, thủ thuật cú pháp và các phương tiện khác để kéo dài quy tắc của ngôn ngữ. Bạn cũng nên xóa khoảng trắng không cần thiết nếu có thể (có ít nhất ba khoảng trắng có thể được xóa khỏi giải pháp của bạn). "Điểm số", trong trường hợp này là số lượng nhân vật của bạn - hiện là 173.
Iszi

Tôi khuyên bạn nên đọc wiki mã thẻ golf, các phần khác nhau của Trung tâm trợ giúp và Mẹo chơi gôn cho chủ đề PowerShell để có cảm nhận tốt hơn về cách viết câu trả lời cạnh tranh cho các thử thách chơi mã ở đây.
Iszi

Ngoài ra, tôi nhận được một lỗi với kịch bản của bạn. "... Tên tham số 'p' không rõ ràng ..." liên quan đến Read-Host.
Iszi

3

Hồng ngọc 94 90 82 ký tự

p "The hypotenuse of this right triangle is %.3f"%(Math.sqrt(gets.to_i**2+gets.to_i**2))

Cập nhật (cảm ơn các ý kiến):

p "The hypotenuse of this right triangle is %.3f"%(gets.to_i**2+gets.to_i**2)**0.5

1
Bạn có thể lưu một vài ký tự nếu bạn sử dụng a**0.5thay vì dài Math.sqrt(a). Và không gian sau pcũng có thể được gỡ bỏ.
Nik O'Lai

1
Và bạn không cần dấu ngoặc đơn trong %(Math...).
Nik O'Lai

2

MATLAB 79 74

@(a,b)sprintf('The hypotenuse of this right triangle is %.3f',norm([a b]))

2

Python 2.7 - 80 ký tự

print'The hypotenuse of this right triangle is %.3f'%(input()**2+input()**2)**.5

Tôi không nghĩ rằng đây là 3 chữ số thập phân ...?
Joachim Isaksson

Đó là lỗi của tôi, tôi đã sửa chữa, cảm ơn.
Andrea Ciceri

2

C ++ - 90

void h(int a,int b){printf("The hypotenuse of this right triangle is %.3f\n",hypot(a,b));}

pow(a,2)khi nào bạn có thể làm a*agì Tôi cũng không chắc là tôi hiểu mục đích của sàn và +.5 và nhân và chia cho 1000
Cruncher

@Cruncher Sàn là để đặt vị trí thập phân thành .3 vị trí. Tôi đang làm lại nó ngay bây giờ, và sẽ bao gồm đề xuất của bạn.

Có một hypot (a, b) sẽ giúp bạn tiết kiệm ba ký tự.

@YiminRong Tuyệt!

2

Perl 6 (68 74 byte)

{printf "The hypotenuse of this right triangle is %.3f
",sqrt [+] @_ X**2}

{}khai báo một hàm lambda. [+]là toán tử tổng, X**là toán tử công suất chéo (ví dụ: 1, 2 X+ 10, 20cho11, 21, 12, 22 ). Trong trường hợp này, toán tử công suất chéo lấy một đối số, do đó kết quả có cùng độ dài với @_. @_chứa tất cả các đối số chức năng.

Nếu nó không được phép có chức năng có thể lấy sai số lượng đối số (không an toàn), thì có thể thay thế [+] @_ X**2bằng $^a**2+$^b**2, ở đâu $^a$^blà đối số giữ chỗ.


2
Làm thế nào bạn sẽ giới hạn đến 3 chữ số thập phân?
Joachim Isaksson

@JoachimIsaksson: Tôi thất bại trong việc đọc. Nên sửa ngay.
Konrad Borowski

2

Javascript (97)

x=prompt;a=x(),b=x();x('The hypotenuse of this right triangle is '+Math.sqrt(a*a+b*b).toFixed(3))

.toFixed .. cảm ơn bạn! đã học được điều gì đó mới :)
micha

2

C, 100 ký tự (đánh bại giải pháp C khác bằng 1!)

Một thuật toán vô lý không hiệu quả.

x;f(a,b){for(;x-a*a-b*b;x=rand());printf("The hypotenuse of this right triangle is %.3f",sqrt(x));}

Xin lỗi, nhưng bạn đã viết "the" thay vì "this", vì vậy nếu bạn sửa nó có cùng độ dài; P
daniero

@daniero Ok, đã tìm thấy một bản sửa lỗi, hiện vẫn còn một char xuống :)
user12205

Trong trình biên dịch Borland C, nó sẽ không biên dịch ...
RosLuP

2

DELPHI / PASCAL

Với thụt lề (157)

program p;
{$APPTYPE CONSOLE}
var a,b:integer;
begin
     readln(a,b);
     writeln('the hypotenuse of this right triangle is',sqrt(b*b+a*a):2:3);
end.

1
ah anh bạn, tôi đã có chính xác như vậy :(
Teun Pronk

đến trễ để chỉnh sửa, vì vậy một lần nữa .. Chỉnh sửa: Bạn có thể tắt 2 ký tự bằng cách thay đổi integerthành int16Bạn không phải bao gồm 2 dòng đầu tiên cho câu trả lời của mình và bạn có thể xóa khoảng trắng. làm tất cả những gì mang lại cho bạn 106 ký tự.
Teun Pronk

2

EcmaScript 6, 82 79

f=(a,b)=>"The hypotenuse of this right triangle is "+Math.hypot(a,b).toFixed(3)

Sử dụng:

f(3, 5)
> "The hypotenuse of this right triangle is 5"

Cập nhật: Chuyển sangMath.hypot()


2

Golf ( 69 67 66 65)

Điều này sẽ dễ dàng hơn nhiều nếu điểm nổi thực sự được hỗ trợ mà không cần dùng đến cách giải quyết ... :)

~'The hypotenuse of this right triangle is '@.*@.*+2-1??+.'.'?4+<

Một liên kết để kiểm tra nó .


Tại sao bạn làm 2.!~khi 2-1ngắn hơn?
McKay

@McKay Câu hỏi hay, tôi luôn bị the difference between 2- 1` và 2-1sai, nên có lẽ tạm thời bị nhầm lẫn :) Đã sửa, cảm ơn.
Joachim Isaksson

2

Con trăn 2 (79)

def p(a,b):print'The hypotenuse of this right triangle is %.3d'%((a*a+b*b)**.5)

Phân phối với mathmột số tiền tiết kiệm. (a*a+b*b)**.5
Steven Rumbalski

Vì phần thân của hàm của bạn là một câu lệnh đơn, nên nó có thể nằm trên cùng một dòng với việc deflưu một dòng mới và một thụt lề.
Steven Rumbalski

1

AWK - 84 78 ký tự

awk '{printf"The hypotenuse of this right triangle is %.3f\n",($1^2+$2^2)^.5}'

Cảm ơn Wasi đã gợi ý toán tử ^ và loại bỏ ()!

ví dụ

$ echo 3 4 | awk '{printf"The hypotenuse of this right triangle is %.3f\n",($1^2+$2^2)^.5}'
The hypotenuse of this right triangle is 5.000

Bạn có thể chơi gôn xa hơn{printf"The hypotenuse of this right triangle is %.3f\n",($1^2+$2^2)^.5}
Wasi

1

PowerShell: 111

Mã Golf

1..2|%{sv $_ (read-host)};"The hypotenuse of this right triangle is $("{0:N3}"-f[math]::sqrt($1/1*$1+$2/1*$2))"

Hướng dẫn

1..2|%{sv $_ (read-host)};Nhận hai đầu vào tương tác từ người dùng và lưu trữ chúng trong $ 1 và $ 2. Có thể có thể cắt giảm một số độ dài bằng cách sử dụng đối số hoặc đầu vào đường ống thay thế.

"The hypotenuse of this right triangle is Văn bản cần thiết trong đầu ra, theo các thông số kỹ thuật thách thức.

$(... )"Khối mã được đóng gói sẽ được xử lý dưới dạng tập lệnh trước khi được đưa vào đầu ra.

"{0:N3}"-f Định dạng đầu ra từ bit mã tiếp theo dưới dạng một số có đúng ba chữ số sau dấu thập phân.

[math]::sqrt(... )Lấy căn bậc hai của giá trị được đóng gói.

$1/1*$1+$2/1*$2Phục vụ như "a ^ 2 + b ^ 2" của chúng tôi. Nhân một số với chính nó là cách ngắn nhất để bình phương nó trong PowerShell, nhưng các biến cần được chia cho 1 trước để buộc chúng thành số nguyên. Mặt khác, chúng được coi là văn bản và 3 * 3 + 4 * 4 sẽ là 3334444 thay vì 25.


1

JavaScript: 83

i=prompt,'The hypotenuse of this right triangle is '+Math.hypot(i(),i()).toFixed(3)

Hiện tại triển khai JS ngắn nhất bằng cách sử dụng stdin: D
Chỉ hoạt động trên Firefox 27.0+ (EcmaScript 6)

JavaScript: 78

Nếu chúng ta có thể sử dụng chỉ hai biến (nhiều kịch bản làm ở đây):

a=2,b=3,'The hypotenuse of this right triangle is '+Math.hypot(a,b).toFixed(3)

whoooo .. .hypot. Nắm bắt tốt!
micha

1

đc, 55

3k?d*?d*+v[The hypotenuse of this right triangle is ]Pp

1

Java, 112

(Cũng in ra lỗi Không có Phương pháp như vậy, mặc dù tôi không chắc liệu điều này có trái với quy tắc không)

class A{static{int a=1,b=1;System.out.printf("The hypotenuse of this right triangle is %.3f",Math.hypot(a,b));}}

Java, 149

(Không có lỗi)

class A{static{int a=1,b=1;System.out.printf("The hypotenuse of this right triangle is %.3f",Math.hypot(a,b));}public static void main(String[] a){}}

1

C #

Chỉ phương pháp (114)

void H(double a, double b)
{
    Console.Write("The hypotenuse of this right triangle is {0:N3}", Math.Sqrt(a * a + b * b)); 
}

Hoàn thành chương trình (171)

using System;
class P
{        
   static void H(double a, double b)
   {
     Console.Write("The hypotenuse of this right triangle is {0:N3}", Math.Sqrt(a * a + b * b));
   }                
   static void Main()
   {
    H(3, 4);
   }
}

Hoàn thành chương trình (không sử dụng phương pháp - 141)

using System;class P{static void Main(){double a=3,b=4;Console.Write("The hypotenuse of this right triangle is {0:N3}",Math.Sqrt(a*a+b*b));}}

1
Đây là chương trình hoàn chỉnh của tôi. 141 ký tự ... bạn có thể lưu một vài ký tự bằng cách sử dụng quá tải chuỗi định dạng bằng cách sử dụng System; class P {static void Main () {double a = 3, b = 4; Console.Write ("Giả sử của tam giác vuông này là {0: N3} ", Math.Sqrt (a a + b b));}}
Tim Bailey

1
Bạn có thể sử dụng định dạng chuỗi trong Console.Write thay vì gọi ToString () để lưu 9 ký tự.
Rik

1

JavaScript 118 106 93

Không giống như giải pháp của @ micha, tôi nhận hai biến thông qua hàm và gửi cảnh báo về kết quả.

function(a,b){m=Math;c=d=>d*d,e=1e3;alert("The hypotenuse of this right triangle is "+m.round(m.sqrt(c(a)+c(b))*e)/e)}

function(a,b){e=1e3;alert("The hypotenuse of this right triangle is "+Math.round(Math.sqrt(a*a+b*b)*e)/e)}

Mũi tên béo có chức năng giải cứu!

h=(a,b,e=1e3)=>"The hypotenuse of this right triangle is "+Math.round(Math.sqrt(a*a+b*b)*e)/e


1
Có thể ngắn hơn nếu bạn nội tuyến c(). Aliasing Mathkhông lưu byte trong trường hợp của bạn.
Florent

@Florent Ah, vâng ... một giây!
WallyWest


1

R, 61 76 byte

cat("The hypotenuse of this right triangle is",round(sqrt(sum(scan()^2)),3))

cat hiển thị nội dung của nó tới STDOUT.

Các scan()chức năng có đầu vào của người dùng từ bàn phím. Đầu vào này tồn tại dưới dạng một vectơ, trên đó ^2áp dụng ( ^hàm được vectơ hóa) và tính sum()tổng các phần tử của vectơ. sqrtxuất căn bậc hai, được làm tròn đến 3 chữ số thập phân theoround(,3)

Cảm ơn @caird coinheringaahing vì đã nhận thấy rằng câu trả lời trước đó không tròn.


Điều này có "Giữ c đến ba chữ số thập phân không?"?
caird coinheringaahing

@cairdcoinheringaahing: hiện tại! Cảm ơn !
Frédéric

1

CẠNH , 73 byte

"The hypotenuse of this right triangle is "..floor(sqrt(a^2+b^2)*1e3)/1e3

Hãy thử trực tuyến!


1
@ H.PWiz Tôi phải nói rằng, đối với một thử thách đáng lẽ ra sqrt(a^2+b^2), điều này có rất nhiều nồi hơi không cần thiết.
ATaco

1

OML , 57 byte

"The hypotenuse of this right triangle is "shnhn+A6`*N3eD

Hãy thử trực tuyến!

Phần 1

Điều này chỉ đơn giản là đầu ra chuỗi

"The hypotenuse of this right triangle is "s

Phần 2

hnhn+A6`*N3eD
hn              take input and square it
  hn            take another input and square it
    +           add them
     A6`        push 10^6
        *       multiply the sum with that number
         N      take integer square root
          3eD   output with three places of precision
                implicit output

1

Thạch , 32 ký tự

,²S½ær3µ,“¡ÆC⁷⁺ɱSoṿȤç½?⁶Ẏtḍỵŀ»ṚK

Hãy thử trực tuyến!

Có lẽ có một nén chuỗi tốt hơn cho phép tôi có được xung quanh cần tham gia với không gian nhưng tôi đã gặp khó khăn khi tìm thấy nó.

Giải trình:

,²S½ær3µ,“...»ṚK    Example inputs: 3, 4
,                   Pair the inputs. Result: [3, 4]
 ²                  Square them. Result: [9, 16]
  S                 Sum them. Result: 25
   ½                Get the square root of the sum. Result: 5
    ær3             Round to 3 decimal places. Result: 5
       µ            Take the result of that... Result: 5
         “...»       ...and  the compressed string Result: "The hypotenuse of this right triangle is"
        ,           And put them into a pair. Result: [5, "The hypotenuse of this right triangle is"]
              Ṛ     Reverse that. Result: ["The hypotenuse of this right triangle is", 5]
               k    Join it with spaces. Result: "The hypotenuse of this right triangle is 5.0"
                    Implicit output.

Miễn là only three decimal placescó nghĩa là less than or equal to three decimal places, đầu ra có vẻ tốt.
Kỹ sư Toast
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.