Кратчайший метод реализации теоремы Пифагора


14

Кто не любит теорему Пифагора a² + b² = c²? Напишите самый короткий метод, который вы можете, на любом языке, который принимает значения a и b и печатает «Гипотенуза этого прямоугольного треугольника» + c. Держите с только три знака после запятой.


3
Это квалифицируется как программирование?
DavidC

1
@DavidCarraher Проблема сама по себе не является загадкой программирования. Но поскольку цель состоит в том, чтобы найти решение для него, тогда это действительно головоломка для программирования.
Виктор Стафуса

3
самый короткий в символах
Vik P

4
В code-golfтеге прямо сказано: «Code-golf - это соревнование для решения конкретной проблемы в наименьшем количестве байтов исходного кода». См. Скоринг кода Гольф (байты против символов) .
Рез

1
@res: Исправлено :-p
Тимви

Ответы:


15

APL (54)

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

Тестовое задание:

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

Объяснение:

  • ⎕*2: повысить значения на входе до второй степени
  • +/: взять сумму
  • .5*⍨: поднять результат до 0,5 степени
  • 3⍕: округлить до 3 знаков после запятой

Это о непобедимом
Cruncher

@Cruncher: я пытался закодировать строку, но не смог сделать процедуру декодирования достаточно маленькой.
marinus

По принципу голубиного отверстия, я думаю, вам будет очень трудно (может быть, невозможно. Это должно быть невозможно, по крайней мере, для некоторых струн), пытаясь сжать струну. Возможно, если в строке был какой-то логический шаблон, но это не так. Мне интересно увидеть попытки, которые у вас были до сих пор
Cruncher

7
Исправьте написание слова «гипотенуза», чтобы спасти персонажа.
Тим С.

1
@Cruncher: На самом деле, я победил в Sclipting ...
Тимви

11

TI-BASIC, 76 55 53 52 байта

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

Нет, закрывающие скобки не требуются. Кроме того, меньше байтов, чем ответ APL :)


1
Может быть R▶Pr(A,B.
lirtosiast

3
2 года, чтобы реализовать предложение, лол.
mbomb007

Думаю, предназначено для величия. И я просто сбрил еще два байта, чтобы побить APL!
Timtech

-1 байт:Fix 3:R►Pr(X,Y
Хулдраесет на Барья

Использование, Inputчтобы просить Xи Yдовольно забавно. Если мы допустим это, должны ли мы также разрешить установку PolarGCраньше Input, чтобы длина гипотенузы определялась однобайтовым R? Следует признать, PolarGCчто значения Xи Yбольше не отображаются, когда мы перемещаем курсор, но они все еще сохраняются в соответствующих переменных. (То, что мы тогда никогда бы не использовали, но это мысль, которая имеет значение.)
Миша Лавров

9

Python 2.7 - 76 символов

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

объяснение

| а + И.Б. | = √ (a 2 + b 2 ) = c

==> a 2 + b 2 = c 2

ПЖ на гипотенузе

Учитель: «Можете ли вы сказать мне, что такое гипотенуза?»

ЖЖ: «Гипотенуза, простой вопрос. Если вчера вечером была громкая вечеринка, и ты прочитал ее в газете, она называется High Party News»


8

Скриптинг , 46 знаков

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

Ожидается ввод в виде двух чисел (может быть дробным!), Разделенных пробелом.

Это короче, чем APL, несмотря на необходимость использовать несколько неудобных приемов.

объяснение

글坼 | 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
Unicode не делает это как 92 байта?
Cruncher

@Cruncher Я спросил вчера в комментариях к вопросу, что считается количество символов, а не число байтов.
Иоахим Исакссон

3

DC 54

Касательная оценка APL ответ!

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

Тестовое задание:

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

действительно не работает для меня. dc -e '2^r2^+3kv[The hypotenuse of this right triangle is ]Pp'не ждет ввода, печатает "dc: stack empty"3 раза и затем «Гипотенуза этого прямоугольного треугольника равна 2.000».
Томас

1
@ Томас это своего рода функция; сначала вы должны поместить параметры в стек, как я покажу в тесте, или если вы хотите вызвать свой путь, это будет dc -e '3 4 2^r2^+3kv[...где 3 и 4 - параметры.
Даниеро

3

С, 77 или 99

77 символов, если на входе могут быть только аргументы функции:

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

99, если вход должен быть прочитан из стандартного ввода:

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

Большое спасибо @Yimin Rong!


1
Существует гипотеза (a, b), которая спасет вас от трех персонажей.

Эта функция не компилирует какую-либо компиляцию, которую я использую gcc tcc clang в tio ... возможно, отсутствует один заголовок #include и в заголовке точная версия компилятора
RosLuP

3

Powershell

Просто чтобы посмотреть, смогу ли я ...

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
Хорошо сделано. Похоже, вы сделали это, когда я был занят своим собственным решением, которое превосходит это примерно на 62 символа. Для дальнейшего использования ответы Code Golf, как ожидается, будут «сыгранными в гольф» и включат их «оценку». «Игра в гольф» означает, что вы должны приложить все усилия, чтобы уменьшить длину символа, используя псевдонимы сокращений, синтаксические трюки и другие способы расширения правил языка. Вы также должны удалить ненужные пробелы, где это возможно (есть как минимум три пробела, которые можно удалить из вашего решения). В данном случае «счет» - это количество ваших персонажей - в настоящее время 173.
Изи

Я предлагаю прочитать вики-код code golf wiki, различные разделы справочного центра и ветку Golfing Tips for PowerShell, чтобы лучше понять, как написать конкурентоспособный ответ на вызовы Code Golf здесь.
Изи

Также я получаю ошибку с вашим скриптом. «... имя параметра 'p' неоднозначно ..." в отношении Read-Host.
Изи

3

Рубин, 94 90 82 символа

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

Обновление (спасибо за комментарии):

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

1
Вы можете сохранить несколько символов, если вы используете a**0.5вместо длинных Math.sqrt(a). И пространство после pтакже может быть удалено.
Ник О'Лай,

1
И вам не нужно скобки в %(Math...).
Ник О'Лай,



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)когда ты можешь сделать a*a? Я также не уверен, что понимаю назначение пола, а также +.5 и умножение и деление на 1000
Cruncher

@Cruncher Пол должен установить десятичное место на .3 места. Я переделываю это прямо сейчас, и включу ваше предложение.

Существует гипотеза (a, b), которая спасет вас от трех персонажей.

@YiminRong Круто!

2

Perl 6 (68 74 байта)

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

{}объявляет лямбда-функцию. [+]является оператором суммы, X**является кросс-степенным оператором (например, 1, 2 X+ 10, 20дает 11, 21, 12, 22). В этом случае кросс-степенной оператор принимает один аргумент, поэтому результат имеет ту же длину, что и @_. @_содержит все аргументы функции.

Если запрещено использовать функцию, которая может принимать неправильное количество аргументов (небезопасно), ее можно заменить [+] @_ X**2на $^a**2+$^b**2, где $^aи $^bявляются аргументами-заполнителями.


2
Как бы вы ограничили до 3 десятичных знаков?
Иоахим Исакссон

@JoachimIsaksson: я не могу читать. Должно быть исправлено сейчас.
Конрад Боровски

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

.Исправлено .. спасибо! узнал что-то новое :)
миха

2

C, 100 символов (опережает другое решение C на 1!)

Смешно неэффективный алгоритм.

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

Извините, но вы написали «the» вместо «this», поэтому, если вы исправите, он имеет ту же длину; P
daniero

@daniero Хорошо, нашел исправление, теперь еще один символ отключен :)
user12205

В компиляторе Borland C он не будет компилироваться ...
RosLuP

2

ДЕЛЬФИ / ПАСКАЛЬ

С отступом (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
ах, чувак, у меня было точно так же :(
Теун Пронк

опоздать на редактирование, так что еще раз .. Редактировать: Вы можете получить 2 символа, изменив integerна int16Вы не должны включать первые 2 строки для своего ответа, и вы можете удалить пробелы. делать все, что дает вам 106 символов.
Теун Пронк

2

EcmaScript 6, 82 79

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

Использование:

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

Обновление: переключиться наMath.hypot()


2

Golfscript ( 69 67 66 65)

Это было бы намного проще, если бы плавающая точка фактически поддерживалась без использования обходных путей ... :)

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

Ссылка для проверки .


почему ты делаешь 2.!~когда 2-1короче?
Маккей,

@MCKay Хороший вопрос, я всегда получаю the difference between 2-1 и 2-1ошибаюсь, поэтому, вероятно, был временно сбит с толку :) Исправлено, спасибо.
Иоахим Исакссон

2

Python 2 (79)

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

Обойтись без mathнекоторых сбережений. (a*a+b*b)**.5
Стивен Румбальски

Поскольку тело вашей функции представляет собой один оператор, он может находиться на одной строке с defсохранением новой строки и отступа.
Стивен Румбальски

1

AWK - 84 78 персонажей

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

Спасибо Васи за предложение оператора ^ и удаление ()!

например

$ 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

Вы можете играть в гольф дальше {printf"The hypotenuse of this right triangle is %.3f\n",($1^2+$2^2)^.5}
Васи

1

PowerShell: 111

Гольф-код

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

Прохождение

1..2|%{sv $_ (read-host)};В интерактивном режиме получает два ввода от пользователя и сохраняет их в $ 1 и $ 2. Может быть в состоянии сократить некоторую длину, используя вместо этого аргументы или входные данные конвейера.

"The hypotenuse of this right triangle is Требуемый текст в выходных данных, в соответствии со спецификацией задачи.

$(... )"Блок инкапсулированного кода будет обработан как скрипт перед включением в вывод.

"{0:N3}"-f Форматирует вывод следующего бита кода как число, состоящее ровно из трех цифр после десятичной точки.

[math]::sqrt(... )Получает квадратный корень инкапсулированного значения.

$1/1*$1+$2/1*$2Служит нашим "a ^ 2 + b ^ 2". Умножение числа само по себе является кратчайшим способом возвести его в PowerShell, но сначала необходимо разделить переменные на 1, чтобы привести их к целым числам. В противном случае они обрабатываются как текст, и 3 * 3 + 4 * 4 будет 3334444 вместо 25.


1

JavaScript: 83

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

В настоящее время самая короткая реализация JS, использующая stdin: D
Работает только в Firefox 27.0+ (EcmaScript 6)

JavaScript: 78

Если мы можем использовать только две переменные (как это делают многие сценарии):

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

ууууу ... .гипот. Хороший улов!
Мика


1

Ява, 112

(Также печатает ошибку «Нет такого метода», хотя я не уверен, что это противоречит правилам)

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

Ява, 149

(Нет ошибок)

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 #

Только метод (114)

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

Полная программа (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);
   }
}

Полная программа (без использования метода - 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
Вот моя полная программа. 141 символ ... Вы можете сохранить несколько символов, используя перегрузку строки форматирования записи, используя System; класс P {static void Main () {double a = 3, b = 4; Console.Write ("Гипотенуза этого прямоугольного треугольника {0: N3} ", Math.Sqrt (a a + b b));}}
Тим Бэйли

1
Вы можете использовать форматирование строк в Console.Write вместо вызова ToString () для сохранения 9 символов.
Рик

1

JavaScript 118 106 93

В отличие от решения @ micha, моя функция принимает две переменные через функцию и отправляет предупреждение о результате.

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

На помощь пришла жирная стрела!

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


1
Может быть короче, если вы в строке c(). Псевдоним Mathне сохраняет байты в вашем случае.
Флорент,

@Florent Ах, да ... одну секунду!
WallyWest


1

R, 61 76 байт

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

cat отображает его содержимое на STDOUT.

scan()Функция принимает ввод пользователя с клавиатуры. Этот вход существует как вектор, к которому ^2применяется ( ^функция векторизована), и sum()суммирует элементы вектора. sqrtвыводит квадратный корень, который округляется до 3 знаков после запятойround(,3)

Спасибо @caird coinheringaahing за то, что заметил, что предыдущий ответ не округлился.


Означает ли это "держать с только три знака после запятой"?
Caird Coneheringaahing

@cairdcoinheringaahing: сейчас! Благодарность !
Фредерик

1

ARBLE , 73 байта

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

Попробуйте онлайн!


1
@ H.PWiz Я должен сказать, что для задачи, которая должна быть просто sqrt(a^2+b^2), у этого есть много ненужного образца.
ATaco

1

OML , 57 байт

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

Попробуйте онлайн!

Часть 1

Это просто выводит строку

"The hypotenuse of this right triangle is "s

Часть 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

Желе , 32 символа

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

Попробуйте онлайн!

Вероятно, есть лучшее сжатие строк, которое позволяет мне обходиться без необходимости соединяться с пробелами, но у меня были проблемы с его поиском.

Объяснение:

,²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.

Пока что, only three decimal placesзначит less than or equal to three decimal places, вывод выглядит нормально.
Тост инженера
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.