Codegolf - Пересечение Двух Линий

  • Автор темы Alexmc007
  • Обновлено
  • 23, Oct 2024
  • #1

По уравнению двух прямых в формате Ax+By=C определите точку их пересечения. Если они параллельны, выведите слово «параллельно» без кавычек. Формат ввода/вывода см. в примере ввода/вывода.

 Input
1x+1y=1
1x-1y=1

Output
(1.00,0.00)

Input
0x+1y=0
1x+0y=0

Output
(0.00,0.00)
 
  1. -1000000 <= A,B,C <= 1000000.
  2. Обратите внимание, что их точка пересечения не может быть целым числом. Печатайте с точностью до двух десятичных знаков.
  3. Выигрывает самое короткое решение.

#код-гольф #геометрия

Alexmc007


Рег
05 Dec, 2016

Тем
76

Постов
178

Баллов
578
  • 26, Oct 2024
  • #2

Рубин — 119 символов

 
 
 
 
 
 
 
 
 
 float a,b,c,d,m,n,t;main(){scanf("%fx%fy=%f%fx%fy=%f",&a,&b,&m,&c,&d,&n);t=b*c-a*d;t?printf("(%.2f,%.2f)",(b*n-d*m)/t,(c*m-a*n)/t):puts("parallel");}
 
||answer||

Питон, 148 146 символов

u ||answer||

мудрец - 162 символа

Scanf.scanf"%fx%fy=%f\n%fx%fy=%f\n"Float.(fun a b c d e f->Printf.(fun u->if u=0.then printf"parallel"else printf"(%.2f,%.2f)"((b*f-c*e)/u)((d*c-a*f)/u))(b*d-a*e)) ||answer||

Python+sympy — 161 символ

words =: ;:;._2(1!:1)3 NB. Leverage J's parser itself to split each line into e.g. ax + by = c lines =: ".>{.`(<@}:@;@(1 2&{))`{:(`:0)"1 words NB. Use a 3-part gerund (`) to get boxed strings 'ax';'b';'c', unbox and parse calc_and_format =: 1|.')(',[:(,',',])&(0j2&":)/[:,,.@{:%.}: NB. %. (matrix multiply) first two rows (a d/b e) by third row turned (c/f) NB. And then format laboriously. 0j2&": formats numbers with 2 decimals. det_nonzero =: [:*@|[:-/ .*}: NB. 1 if determinant (-/ .*) of (a b/d e) is nonzero (*@|) echo'parallel'"_`[email protected]_nonzero|: lines NB. transpose parsed input to get (a d/b e/c f). NB. If det_nonzero, call calc_and_format, otherwise constant 'parallel' NB. Print

Python+sympy — 143 символа (другой формат вывода)

echo'parallel'"_`(1|.')(',[:(,',',])&(0j2&":)/[:,,.@{:%.}:)@.([:*@|[:-/ .*}:)|:".>{.`(<@}:@;@(1 2&{))`{:(`:0)"1;:;._2(1!:1)3

формат вывода для 143-символьной версии немного отличается от спецификации

In: 1x+1y=1 1x-1y=1 Out: {x: 1, y: 0} In: 0x+1y=0 1x+0y=0 Out: {x: 0, y: 0} ||answer||

Дж, 146 132 134 124

from sympy import* x,y=symbols('xy') e=lambda:eval(raw_input().replace('x','*x').replace('y=','*y-')) print solve([e(),e()],[x,y])or'parallel'

Разбирать это ужасно.

Редактировать: Понял, что мой вывод в принципе нерабочий, хотя для приведенных примеров и параллелей он работает...

Редактировать: Публикация более короткой версии у меня уже была.

Редактировать: Исправлено без особой боли...

Редактировать: исправлена ​​странная проблема, из-за которой программа располагалась на нескольких строках.

Несколько негольфированная версия:

from sympy import* x,y=symbols('xy') e=lambda:eval(raw_input().replace('x','*x').replace('y=','*y-')) r=solve([e(),e()],[x,y]) print r and`r[x],r[y]`or'parallel' ||answer||

OCaml + Батареи, 163 символа

Как можно проще:

x,y=var('x,y') e=lambda:eval(raw_input().replace('x','*x').replace('y','*y=')) try:r=solve([e(),e()],[x,y])[0];print`r[0].rhs(),r[1].rhs()` except:print'parallel'

Редактировать:

  • Начальная версия, 169
  • Используйте батареи для ограниченной перегрузки операторов, 164
  • Лямбда-привязка import re I=raw_input a,b,p,c,d,q=eval(re.sub('x|y=','.,',I()+','+I())) D=a*d-b*c print'(%.2f,%.2f)'%((p*d-q*b)/D,(a*p-c*q)/D)if D else'parallel' , 163
 

Orang


Рег
02 Jan, 2007

Тем
55

Постов
200

Баллов
475
  • 26, Oct 2024
  • #3

C-149 байт

Не так много игры в гольф, только основы.

a,b,c,d,e,f=(gets+gets).scan(/-?\d+/).map &:to_f puts (t=a*e-b*d)==0?'parallel':"(%.2f,%.2f)"%[(e*c-b*f)/t,(a*f-c*d)/t]

Здесь это ссылка на идею для тестирования.

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

 

Fedya84uz


Рег
24 Jun, 2009

Тем
75

Постов
180

Баллов
575
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно