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 ще немає таких вбудованих програм. Я додам це, коли отримаю можливість. Пропозиції вітаються як для програми, так і для мови!
Що ж, з версії 1.4.4, я реалізував у Japt зовсім більше функцій, ніж спочатку планував. Починаючи з початкового плану для коротшої версії:
1o5 mZ=>Uu /2-UgZ%4
Спочатку нам потрібно змінити кілька речей: Функції визначаються за допомогою {, а функція сума - 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 було дивовижним ;-) Перевірте це в Інтернеті!