Квадратная сторона


13

Добро пожаловать на мой первый конкурс по коду! :) Давайте прыгать прямо в это.

Вызов:

Учитывая два вектора с плавающей точкой, O (начало) и T (цель), вы должны создать программу для вывода значений L и R в STDOUT.

  1. О - это один угол площади
  2. Т - один угол квадрата, который расположен напротив О
  3. L - это 2D точка (угол), обозначающая другую точку незавершенного квадрата
  4. R - это 2D точка (угол), противоположная L

правила

  1. Значения для O и T должны быть прочитаны из STDIN (см. Пример ввода).
  2. Опять же, значения L и R должны быть напечатаны в STDOUT.

Скоринг и бонусы

  1. Подсчитайте байты вашей программы.
  2. Если ваша программа рисует линии , которые соединяют между O с L до T в R , вычесть 15 байт из подсчета байтов.

Примеры

Первая строка охватывает входные данные (первые квадратные скобки для O и следующие квадратные скобки для T ), а другая строка представляет ожидаемый результат.

  • [0, 0] [3, 3] Ожидаемое: [0, 3] [3, 0]
  • [0, 0] [-2, -2] Ожидаемое: [-2, 0] [0, -2]
  • [1, -1] [4, 2] Ожидаемое: [1, 2] [4, -1]
  • [0, -1] [0, 1] Ожидаемое: [-1, 0] [1, 0]

ВНИМАНИЕ : входы и выходы могут быть числами с плавающей точкой!

Важная информация!

  • Значения O и T могут быть приняты в любом формате, если они поступают из STDIN (например, Inside [] или () ...), используйте любой формат, который вы хотите.
  • L и R могут быть напечатаны в любом порядке.
  • Помните: когда (O-> L-> T-> R-> O) соединены, каждая сторона должна иметь одинаковую длину!

выигрыш

  • Это код-гольф, поэтому побеждает ответ на меньшее количество байтов!
  • Ответ победителя будет принят в воскресенье 15.11.2015 с 20:00 до 22:00 (по финскому времени) (Если я не ошибаюсь, эта дата пишется как 15.11.2015 в США, не запутайтесь).

Удачного игры в гольф!


3
Если вы не знаете об этом, позвольте мне порекомендовать «песочницу» для будущих задач, где вы можете получить обратную связь и откорректировать свою задачу до ее запуска (и до того, как изменения могут сделать недействительными существующие ответы).
Мартин Эндер

Можем ли мы принять ввод как список двух комплексных чисел?
lirtosiast

@ThomasKwa уверен, что вы можете взять его в качестве списка. Разве ввод не является комплексным числом, когда он задан ...? Я имею в виду, что вам не нужно лично знать значение компьютера для его вычисления, верно?
Yytsi

Когда вы говорите «точка квадрата», похоже, вы имеете в виду угол? В квадрате много других точек.
Рето Коради

@RetoKoradi Ты прав. Я имею в виду угол с этим.
Yytsi

Ответы:


8

Серьезно , 11 байтов

Порт моего TI-BASIC ответа. Рассчитывает mean(X)+i*(X-mean(X)).

,;Σ½;)±+ï*+

Объяснение:

,           Read input
;           Duplicate
Σ½          Half the sum (the mean) of the top copy
;           Copy the mean
)           Rotate stack to the left
            Now there's a copy of the mean on the bottom
±+          Negate mean and add to input list
ï*          Multiply by i
+           Add to mean

Ввод в виде списка из двух комплексных чисел: [1-1j,4+2j]и выход в том же формате: [(4-1j), (1+2j)].


3
Я так горжусь ...
Мего

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

«Серьезно» хороший язык. @ThomasKwa
Эддисон Крамп

Разве не Σ2 байта?
Эш Бурлаченко

@AshBurlaczenko Серьезно, похоже, использует кодировку CP437 , где Σкодовая точка 0xF4.
Денис

6

Серьезно , 25 байтов

,i││-++½)+-+½)++-½)±+++½)

Принимает ввод в виде списка: [x1,y1,x2,y2]

Та же стратегия, что и в моем ответе на Python, но серьезно.

Объяснение:

,      get input
i      flatten list
││     duplicate stack twice, so that we have 4 copies of the input total
-++½)  calculate the first x-value using the formula (x1-y1+x2+y2)/2, and shove it to the end of the stack
+-+½)  calculate the first y-value using (x1+y1-x2+y2)/2, and shove it to the end of the stack
++-½)  calculate the second x-value using (x1+y2+x2-y2)/2, and shove it to the end of the stack
±+++½) calculate the second y-value using (-x1+y1+x2+y2)/2, and shove it to the end of the stack

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


3
Это серьезно круто! (Пун намеревался.)
kirbyfan64sos

5

TI-BASIC, 16 байтов

Для калькулятора серии TI-83 + или 84+.

Input X
i∟X+.5sum(∟X-i∟X

Если я не понял неправильно, OP сказал, что они хорошо воспринимают ввод и вывод как комплексные числа. iЗдесь мнимая единица, а не переменная статистика.

TI-BASIC имеет mean(функцию, но, к сожалению, он не работает со сложными списками, бросая ERR:DATA TYPE.

Ввод в форме {1-i,4+2i}для [[1,-1],[4,2]]. Выход в форме {4-i 1+2i}для [[1,2][4,-1]].


Это напоминает мне, как TI-BASIC не поддерживает списки строк. Вероятно, это было бы единственной вещью, которую я бы добавил к TI-BASIC: P
Конор О'Брайен,

4

Matlab, 51 45 46 45 42 байта

Теперь ввод ожидается в виде одного столбца: [x0;y0;x1;y1](вывод в том же формате) Я просто изменил его, чтобы он был полной программой.

z=eye(4);disp((.5-z([2:4,1],:))*input(''))

Или в качестве альтернативы

z=[1,1;-1,1];disp([z',z;z,z']*input('')/2)

Старое решение:

Вход ожидает вектор столбцов, например f([0;0],[3;3])

@(a,b)[0,1;-1,0]*(b-a)*[.5,-.5]+(b+a)*[.5,.5]

Он также возвращает два вектора столбцов (в виде матрицы 2x2).


3

Japt, 29 28 байт

Japt - это сокращенная версия Ja vaScri pt . переводчик

1o5 mZ=>$eval$(Uq'+)/2-UgZ%4

Обратите внимание, что для работы со стрелками требуется браузер, совместимый с ES6, например, более новые версии Firefox. Ввод идет как массив из 4 элементов, например [1,-1,4,2].

Как это устроено

         // Implicit: U = input array
1o5      // Create a range of integers from 1 to 5. Returns [1,2,3,4]
mZ=>     // Map each item Z in this range to:
$eval$(  //  evaluate:
 Uq'+    //   U joined with "+" (equivalent to summing U)
)/2      //  divided by 2,
-UgZ%4   //  minus the item at Z%4 in the input. This translates to [y₁,x₂,y₂,x₁],
         //  which in turn tranlsates to:
         //   [(x₁-y₁+x₂+y₂)/2, (x₁+y₁-x₂+y₂)/2, (x₁+y₁+x₂-y₂)/2, (-x₁+y₁+x₂+y₂)/2]
         //  which is [Lx,Ly,Rx,Ry], or [Rx,Ry,Lx,Ly], depending on the situation.
         // Implicit: Output last expression

Как это было в гольф

Сначала я попытался просто скопировать подход @ Mego's Python. Это оставило меня с этим 48-байтовым монстром:
(Примечание: ввод в настоящее время не должен быть заключен в массив.)

[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]

Поскольку каждый из этих элементов нужно разделить на 2, короче весь массив сопоставить с mY=>Y/2:

[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2

Что теперь? Ну, теперь массив просто добавляет три из входных данных и вычитает четвертый, следуя шаблону 1,2,3,0. Таким образом, мы можем упаковать входные данные в массив, затем сложить их вместе, разделить на 2 и вычесть необходимый элемент:

[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ

Здорово, сохранил байт! Но возможно ли уменьшить массив в начале? Давайте попробуем упаковать его в строку, а затем разделить обратно на массив с помощью a:

"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ

Посмотрите на это, еще один байт сохранен. Но есть ли еще лучший способ? Ну, мы можем использовать тот факт, что [1,2,3,0] ≡ [1,2,3,4] mod 4:

1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4

Еще два байта! Теперь мы куда-то едем. Но это Ug0 +Ug1 +Ug2 +Ug3занимает много места. Что если мы уменьшим массив с добавлением?

1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4

Вау, это действительно помогло! Теперь мы до 29 байтов. И благодаря @ ן nɟuɐɯɹɐ ן oɯ, я даже смог сыграть в гольф еще один байт от сокращения. Но если бы мы могли использовать встроенную функцию для суммирования массива, это было бы намного короче:

1o5 mZ=>Uu /2-UgZ%4

19 байт! Удивительный! К сожалению, у Japt нет таких встроенных модулей. Я добавлю это, когда у меня будет шанс. Приветствуются предложения, как для программы, так и для языка!


Что касается v1.4.4, я добавил в Japt гораздо больше возможностей, чем планировал изначально. Начиная с первоначального плана для более короткой версии:

1o5 mZ=>Uu /2-UgZ%4

Сначала нам нужно изменить несколько вещей: функции определены с {помощью функции sum x. Эта версия работает как есть:

1o5 mZ{Ux /2-UgZ%4

Теперь @это сокращение XYZ{, позволяющее нам сохранять байт, переключаясь с Zна X. Кроме того, £это ярлык для m@сохранения другого байта:

1o5 £Ux /2-UgX%4

Недавно я реализовал функцию, в которой Uв начале программы обычно можно не указывать. Однако из-за ошибки реализации это также работает с функциями:

1o5 £x /2-UgX%4

Наконец, gфункция теперь переносится, если индекс находится за концом строки, что позволяет нам удалить %4всего 13 байт :

1o5 £x /2-UgX

И я думал, что 19 было удивительно ;-) Проверьте это онлайн!


Вероятно, вы можете сохранить несколько байтов, используя эквивалент Japt eval(U.join`+`).
Mama Fun Roll

Я люблю этот язык: D
фаза

@ ן nɟuɐɯɹɐ ן oɯ Спасибо, хотя я еще не добавил evalэквивалент, это на самом деле экономит байт!
ETHproductions

2

Javascript (Node.js / ES6), 154 байта

process.stdin.on('data',s=>(s=s.toString().split(','),a=s[0]-0,b=s[1]-0,x=s[2]-0,y=s[3]-0,console.log([a+(c=(a+x)/2-a)+(d=(b+y)/2-b),b+d-c,a+c-d,b+d+c])))

Получение stdin - более длинная часть кода. Входные данные должны быть разделены запятыми:

echo "0,0,3,3" | node square.js

Это полная программа ...? Что выводит точки в STDOUT ...? Не похоже на это.
Yytsi

Ты прав. Блин, это добавит много байтов,
Науак

Вуаля, исправлено. почти в 3 раза дольше :(
Науак

Хмм: / Я все еще думаю, что смысл в том, чтобы сделать красивый арт-код, который хорошо работает. И код, который вы предоставили, очень сложный и красивый. :) спасибо за участие!
Yytsi

2

ngn APL, 21 байт

⎕←F.5 0J.5×(F←+/,-/)⎕

Он принимает входные данные в виде пары комплексных чисел (например, 1J¯1 4J2) и печатает выходные данные таким же образом (например, 4J¯1 1J2). Попробуйте онлайн в демоверсии ngn / apl .


Работает для всех положительных входных данных, однако ничего не выводит, когда я ввожу отрицательные числа. Я ввожу их в неправильном формате? 1J1 3J3 работает. 0J-1 0J1 нет. Я также попытался использовать верхний символ минус, чтобы объявить отрицательность числа.
Yytsi

@TuukkaX Высокий минус в пути. Я получаю вывод 1 ¯1для ввода 0J¯1 0J1, который является правильным ответом. Что вы получаете?
Денис

1
О, теперь у меня все получилось. Мне просто нужно было удалить крошечные пробелы перед знаком высокого минуса. Это работает и готовится.
Yytsi

2

Pyth, 12 байт

.jL.OQ-R.OQQ

Он принимает входные данные в виде пары комплексных чисел (например, 1-1j, 4+2j) и печатает выходные данные в виде массива (например, [(4-1j), (1+2j)]). Попробуйте онлайн.



1

CJam, 30 байтов

q~_:.+\:.-(W*+_2$.+@@.-].5ff*`

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

Это принимает входные данные в виде списка списков, например, для последнего примера:

[[0 -1] [0 1]]

Объяснение:

q~      Get and interpret input.
_       Make a copy.
:.+     Reduce the list of two points with vector sum operator.
\       Swap copy of input to top.
:.-     Reduce the list of two points with vector difference operator.
(W*+    Turn (x, y) into orthogonal (y, -x) by popping off first element, inverting
        its sign, and concatenating again. We now have center and offset vector.
_2$     Create a copy of both...
.+      ... and add them.
@@      Rotate original values to top...
.-      ... and subtract them.
]       Wrap the two results...
.5ff*   ... and multiply all values by 0.5.
`       Convert list to string.

1

Пролог, 118 байт

p([A,B],[C,D]):-read([E,F,G,H]),I is(E+G)/2,J is(F+H)/2,K is(G-E)/2,L is(H-F)/2,A is I-L,B is J+K, C is I+L, D is J-K.

Чуть более читабельно:

p([A,B],[C,D]):-read([E,F,G,H]),
                        I is(E+G)/2,
                        J is(F+H)/2,
                        K is(G-E)/2,
                        L is(H-F)/2,
                        A is I-L,
                        B is J+K, 
                        C is I+L, 
                        D is J-K.

Для запуска программы:

p(X,Y).

Пример ввода, когда известны известные углы [1, -1] [4, 2]:
[1, -1,4,2]

Пример вывода, где X и Y будут содержать неизвестные углы:
X = [1.0, 2.0],
Y = [4,0, -1,0]

Попробуйте онлайн здесь

Изменить: Изменены читать ввод из STDIN


Это читает из STDIN и печатает в STDOUT ...?
Yytsi

@TuukkaX: Наверное, нет. Он принимает входные данные в форме запроса. Я прочитал часть, в которой говорилось, что ввод может быть любым форматом, который мы хотели. Я пропустил часть о STDIN. Даже не уверен, что такое STDIN в Прологе. Будет ли чтение входных данных от пользователя в порядке?
Emigna

STDIN обозначает стандартный ввод. Таким образом, чтение от пользователя - это путь :), а под форматом я подразумеваю способ, которым пользователь вводит значения. Например [x, y] [x, y] или {x, y} ...
Yytsi

0

Python 3, 102 байта

g=lambda a,b,c,d:((a-b+c+d)/2,(a+b-c+d)/2,(a+b+c-d)/2,(d+b-a+c)/2)
print(g(*map(float,input().split())))

Ввод принимается в виде x1 y1 x2 y2 , в одной строке.

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


Вы делаете что - то не так, ваш счетчик байтова пошел с каждым редактированием, но я стараюсь довести ByteCount вниз с каждым редактированием = P
flawr

8
@ Flawr Я анти-Денис
Мего

Я полагаю, что все ответы должны быть полными программами, взятыми из STDIN (или ближайшей альтернативы). Это соответствует?
ETHproductions

0

Python 2, 56 байт

i=input()
s=sum(i)/2.0
print s-i[1],s-i[2],s-i[3],s-i[0]

Ввод может быть x1,y1,x2,y2или(x1,y1,x2,y2)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.