Najkrótsza metoda implementacji twierdzenia Pitagorasa

14

Kto nie lubi twierdzenia Pitagorasa a² + b² = c²? Napisz najkrótszą możliwą metodę w dowolnym języku, który przyjmuje wartość aib i wypisuje „Przeciwprostokąt tego prawego trójkąta to” + c. Zachowaj c do tylko trzech miejsc po przecinku.

Vik P.
źródło
3
Czy to kwalifikuje się jako łamigłówka programistyczna?
DavidC
1
@DavidCarraher Problem per se nie polega na układaniu puzzli. Ale ponieważ celem jest znalezienie rozwiązania golfa, jest to rzeczywiście zagadka programistyczna.
Victor Stafusa,
3
najkrótsza z postaci
Vik P
4
code-golfTag wyraźnie mówi „Code-golf jest konkurencja w celu rozwiązania konkretnego problemu w jak najmniejszej liczbie bajtów kodu źródłowego.” Zobacz punktacja golfa (bajty vs. znaki) .
res
1
@res: Naprawiono :-p
Timwi

Odpowiedzi:

15

APL (54)

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

Test:

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

Wyjaśnienie:

  • ⎕*2: podnieś wartości na wejściu do drugiej mocy
  • +/: weź sumę
  • .5*⍨: podnieś wynik do 0,5 potęgi
  • 3⍕: zaokrąglić do 3 miejsc po przecinku
marinus
źródło
To jest nie do pobicia
Cruncher
@Cruncher: Próbowałem zakodować ciąg, ale nie udało mi się uzyskać wystarczająco małej procedury dekodowania.
marinus
Zgodnie z zasadą gołębnika myślę, że miałbyś naprawdę trudny czas (być może niemożliwy. Musi być to niemożliwe dla przynajmniej niektórych strun) próbując skompresować strunę. Może gdyby łańcuch miał jakiś logiczny wzór, ale nie wydaje się, że tak jest. Interesuje mnie jednak próba, którą do tej pory miałeś
Cruncher
7
Popraw pisownię „przeciwprostokątnej”, aby zapisać postać.
Tim S.
1
@Cruncher: Właściwie pobiłem go w Sclipting ...
Timwi
11

TI-BASIC, 76 55 53 52 bajty

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

Nie, nawiasy zamykające nie są wymagane. Ponadto mniej bajtów niż ta odpowiedź APL :)

Timtech
źródło
1
Może być R▶Pr(A,B.
lirtosiast
3
2 lata na wdrożenie sugestii, lol.
mbomb007,
Przeznaczony do wielkości, tak sądzę. I właśnie ogoliłem jeszcze dwa bajty, żeby pokonać APL!
Timtech,
-1 bajt:Fix 3:R►Pr(X,Y
Khuldraeseth na'Barya
Korzystanie Inputprosić Xi Yjest trochę zabawne. Jeśli pozwolimy na to, czy powinniśmy również zezwolić na ustawienie PolarGCwcześniej Input, aby długość przeciwprostokątnej była podana w jednym bajcie R? Trzeba przyznać, że z PolarGCwartościami Xi Ynie są już wyświetlane, gdy przesuwamy kursor, ale nadal są przechowywane w odpowiednich zmiennych. (Z czego nigdy byśmy nie skorzystali, ale liczy się myśl).
Misza Ławrow
9

Python 2.7 - 76 znaków

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

Wyjaśnienie

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

==> a 2 + b 2 = c 2

PJ na przeciwprostokątnej

Nauczyciel: „Czy możesz mi powiedzieć, co jest przeciwprostokątne?”

LJ: „Hipotenuza, proste pytanie. Jeśli wczoraj wieczorem odbyła się głośna impreza i przeczytałeś ją w gazecie, zatytułowanej High Party News”

Abhijit
źródło
8

Sclipting , 46 znaków

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

Oczekuje danych wejściowych w postaci dwóch liczb (może być ułamkowych!) Oddzielonych spacją.

Jest to krótszy niż APL, pomimo konieczności użycia kilku niewygodnych sztuczek.

Wyjaśnienie

글坼 | 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..."
Timwi
źródło
2
czy unicode nie robi z tego 92 bajtów?
Cruncher
@Cruncher Zapytałem wczoraj w komentarzach do pytania, co się liczy, to liczba znaków, a nie liczba bajtów.
Joachim Isaksson
3

dc 54

Styczne do wyniku odpowiedzi APL!

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

Test:

$ dc
3 4
2^r2^+3kv[The hypotenuse of this right triangle is ]Pp
The hypotenuse of this right triangle is 5.000
daniero
źródło
naprawdę nie działa dla mnie. dc -e '2^r2^+3kv[The hypotenuse of this right triangle is ]Pp'nie czeka na żadne dane, drukuje "dc: stack empty"3 razy, a następnie „Przeciwprostokąt tego prawego trójkąta wynosi 2.000”.
Tomas
1
@Tomas to rodzaj funkcji; musisz najpierw umieścić parametry na stosie, tak jak pokazuję w teście, lub jeśli chcesz wywołać swoją drogę, byłoby to, dc -e '3 4 2^r2^+3kv[...gdzie 3 i 4 są parametrami.
daniero
3

C, 77 lub 99

77 znaków, jeśli dane wejściowe mogą być tylko argumentami funkcji:

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

99, jeśli dane wejściowe należy odczytać ze standardowego wejścia:

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

Ogromne podziękowania dla @Yimin Rong!

Josh
źródło
1
There is a hypot(a,b) which will save you three characters.
That function not compile whatever compile I use gcc tcc clang in tio...perhaps lack one #include header and in the title the precise version of the compiler
RosLuP
3

Powershell

Just to see if i could...

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))
Brandon
źródło
1
Dobra robota. Wygląda na to, że to zrobiłeś, kiedy byłem zajęty własnym rozwiązaniem, które bije to o około 62 znaki. Do wykorzystania w przyszłości, odpowiedzi Code Golf powinny być „w golfa” i zawierać ich „wynik”. „Gra w golfa” oznacza, że ​​powinieneś dołożyć wszelkich starań, aby zmniejszyć długość postaci, używając krótkich aliasów, sztuczek składniowych i innych sposobów rozciągania reguł języka. W miarę możliwości należy również usunąć niepotrzebne białe znaki (z rozwiązania można usunąć co najmniej trzy spacje). „Wynik” w tym przypadku to liczba twoich postaci - obecnie 173.
Iszi
Sugeruję przeczytanie kodu wiki tagu golfowego, różnych części Centrum pomocy oraz Porady dotyczące gry w golfa dla PowerShell, aby lepiej zrozumieć, jak napisać konkurencyjną odpowiedź na wyzwania związane z golfem.
Iszi
Ponadto pojawia się błąd w twoim skrypcie. „... nazwa parametru„ p ”jest niejednoznaczna…” w odniesieniu do Read-Host.
Iszi
3

Rubin, 94 90 82 znaki

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

Aktualizacja (dzięki za komentarze):

p "The hypotenuse of this right triangle is %.3f"%(gets.to_i**2+gets.to_i**2)**0.5
epson121
źródło
1
You could save a few chars if you use a**0.5 instead of lengthy Math.sqrt(a). And the space after p can also be removed.
Nik O'Lai
1
And you do not need parenthesis in %(Math...).
Nik O'Lai
2

MATLAB 79 74

@(a,b)sprintf('The hypotenuse of this right triangle is %.3f',norm([a b]))
mmumboss
źródło
2

Python 2.7 - 80 chars

print'The hypotenuse of this right triangle is %.3f'%(input()**2+input()**2)**.5
Andrea Ciceri
źródło
I don't think this does 3 decimal places...?
Joachim Isaksson
It's my fault, I've corrected, thanks.
Andrea Ciceri
2

C++ - 90

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

źródło
pow(a,2) when you can do a*a? I'm also not sure I understand the purpose of the floor and the +.5 and the multiply and divide by 1000
Cruncher
@Cruncher The floor is to set the decimal place to .3 places. I am reworking it right now, and will include your suggestion.
There is a hypot(a,b) which will save you three characters.
@YiminRong Cool!
2

Perl 6 (68 74 bytes)

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

{} declares a lambda function. [+] is sum operator, X** is cross power operator (for example, 1, 2 X+ 10, 20 gives 11, 21, 12, 22). In this case, cross power operator takes one argument, so the result has the same length as @_. @_ contains all function arguments.

If it's disallowed to have function that may take wrong number of arguments (unsafe), it's possible to replace [+] @_ X**2 with $^a**2+$^b**2, where $^a and $^b are placeholder arguments.

Konrad Borowski
źródło
2
How would you limit to 3 decimal places?
Joachim Isaksson
@JoachimIsaksson: I fail at reading. Should be fixed now.
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))
elixenide
źródło
.toFixed .. thank you! learned something new :)
micha
2

C, 100 chars (beats the other C solution by 1!)

A ridiculously inefficient algorithm.

x;f(a,b){for(;x-a*a-b*b;x=rand());printf("The hypotenuse of this right triangle is %.3f",sqrt(x));}
user12205
źródło
Sorry, but you've written "the" instead of "this", so if you correct that it's the same length ;P
daniero
@daniero Ok, found a fix, now still one char down :)
user12205
In the Borland C compiler it would not compile...
RosLuP
2

DELPHI / PASCAL

With indent (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.
bela
źródło
1
ah man, i had the exact same :(
Teun Pronk
to late for an edit, so again.. Edit: You can get 2 characters off by changing integer to int16 You dont have to include the first 2 lines for your answer, and you can remove whitespace. doing all that gives you 106 characters.
Teun Pronk
2

EcmaScript 6, 82 79

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

Usage:

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

Update: Switch to Math.hypot()

Florent
źródło
2

Golfscript (69 67 66 65)

This would be much easier if floating point was actually supported without resorting to workarounds... :)

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

A link to test it.

Joachim Isaksson
źródło
why are you doing 2.!~ when 2-1 is shorter?
McKay
@McKay Good question, I always getthe difference between 2- 1` and 2-1 wrong, so was probably temporarily confused :) Fixed, thanks.
Joachim Isaksson
2

Python 2 (79)

def p(a,b):print'The hypotenuse of this right triangle is %.3d'%((a*a+b*b)**.5)
nyuszika7h
źródło
Dispense with math for some savings. (a*a+b*b)**.5
Steven Rumbalski
Since the body of your function is a single statement, it can be on the same line as the def saving a newline and an indent.
Steven Rumbalski
1

AWK — 84 78 characters

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

Thanks to Wasi for suggesting ^ operator and removing ()!

e.g.

$ 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

źródło
You can golf it further {printf"The hypotenuse of this right triangle is %.3f\n",($1^2+$2^2)^.5}
Wasi
1

PowerShell: 111

Golfed Code

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

Walkthrough

1..2|%{sv $_ (read-host)}; Gets two inputs interactively from the user, and stores them in $1 and $2. Might be able to cut some length by using arguments or pipeline inputs instead.

"The hypotenuse of this right triangle is Required text in the output, per the challenge specifications.

$(...)" Encapsulated code block will be processed as script before being included in the output.

"{0:N3}"-f Formats output from the next bit of code as a number with exactly three digits after the decimal point.

[math]::sqrt(...) Gets the square root of the encapsulated value.

$1/1*$1+$2/1*$2 Serves as our "a^2+b^2". Multiplying a number by itself is the shortest way to square it in PowerShell, but the variables need to be divided by 1 first to force them to integers. Otherwise, they are treated as text and 3*3+4*4 would be 3334444 instead of 25.

Iszi
źródło
1

JavaScript: 83

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

Currently the shortest JS implementation using stdin :D
Works only on Firefox 27.0+ (EcmaScript 6)

JavaScript: 78

If we can use just two variables (as lot of scripts do here):

a=2,b=3,'The hypotenuse of this right triangle is '+Math.hypot(a,b).toFixed(3)
Fez Vrasta
źródło
whoooo .. .hypot. Good catch!
micha
1

dc, 55

3k?d*?d*+v[The hypotenuse of this right triangle is ]Pp
Tomas
źródło
1

Java, 112

(Also prints out a No Such Method error, though I'm not sure if this is against the rules)

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

(No error)

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){}}
James Webster
źródło
1

C#

Method Only (114)

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

Complete Program (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);
   }
}

Complete Program (without using method - 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));}}
Merin Nakarmi
źródło
1
Heres my complete program. 141 chars...you can save a few chars using the formatstring overload of write 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(aa+bb));}}
Tim Bailey
1
You can use string formatting in the Console.Write instead of calling ToString() to save 9 characters.
Rik
1

JavaScript 118 106 93

Unlike @micha's solution, mine takes in two variables via function and sends the alert of the result.

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

Fat arrow functions to the rescue!

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

WallyWest
źródło
1
Could be shorter if you inline c(). Aliasing Math doesn't save bytes in your case.
Florent
@Florent Ah, yes... one sec!
WallyWest
1

c64 basic v2, 60 66 bytes

0inputa,b:?"The hypotenuse of this right triangle is";sQ(a*a+b*b)

Screenshot:

enter image description here

How to try it.

peterh - Reinstate Monica
źródło
should say "The hypotenuse of this right triangle is"
Skidsdev
@Mayube Sad :-( +6 byte :-( Post fixed.
peterh - Reinstate Monica
1

R, 61 76 bytes

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

cat displays its content to STDOUT.

The scan() function takes user's input from keyboard. This input exists as a vector, on which the ^2 is applied (^function is vectorized), and the sum() sums the elements of the vector. sqrt outputs the square-root, which is rounded to 3 decimal places by round(,3)

Thanks to @caird coinheringaahing for noticing that the previous answer didn't round.

Frédéric
źródło
Does this "Keep c to only three decimal places."?
caird coinheringaahing
@cairdcoinheringaahing : it does now ! Thanks !
Frédéric
1

ARBLE, 73 bytes

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

Try it online!

ATaco
źródło
1
@H.PWiz I must say, for a challenge that should just be sqrt(a^2+b^2), this has a lot of unnecessary boilerplate.
ATaco
1

OML, 57 bytes

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

Try it online!

Part 1

This simply outputs the string

"The hypotenuse of this right triangle is "s

Part 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
Conor O'Brien
źródło
1

Jelly, 32 characters

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

Try it online!

There is probably a better string compression that allows me to get around needing to join with spaces but I was having trouble finding it.

Explanation:

,²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.
Comrade SparklePony
źródło
So long as only three decimal places means less than or equal to three decimal places, the output looks fine.
Engineer Toast