直方定位


13

欢迎来到我的第一个高尔夫挑战赛!:)让我们跳进去吧。

挑战:

给定两个浮点向量,O(原点)和T(目标),您必须创建一个程序以将值LR打印到STDOUT。

  1. O是正方形的一个角
  2. T是正方形的一个角,位于O的对面
  3. L是2D点(角),表示不完整正方形的另一个点
  4. R是与L相反的2D点(角)

规则

  1. OT的值必须从STDIN中读取(请参见示例输入)。
  2. 同样,必须将LR的值打印到STDOUT。

计分和奖金

  1. 计算程序的字节数。
  2. 如果您的程序绘制的线在OLTR之间连接,请从字节数中减去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]

注意:输入和输出可以是浮点!

重要信息!

  • OT可以采用任何格式,只要它们来自STDIN(例如,在[]或()...之内),请使用所需的任何格式。
  • LR可以任何顺序打印。
  • 请记住:连接(O-> L-> T-> R-> O)时,每一侧的长度必须相同!

获奖

  • 这是代码高尔夫球,因此最少的字节答案会获胜!
  • 优胜者答案将在2015年11月15日星期日(芬兰时间)接受(如果我没记错的话,该日期写成美国2015年11月15日的样子,请不要感到困惑)。

打高尔夫球快乐!


3
如果您不知道它,让我为以后的挑战提供一个沙盒,您可以在该沙盒上线之前(以及在更改可能使现有答案无效之前)获得反馈并完善您的挑战。
Martin Ender 2015年

我们可以将输入作为两个复数的列表吗?
lirtosiast,2015年

@ThomasKwa确保您可以将其作为列表。给定输入不是一个复数吗?我的意思是您不必亲自知道计算机的价值,对吧?
Yytsi 2015年

当您说“正方形的点”时,您似乎是在说一个角?正方形中还有很多其他点。
Reto Koradi 2015年

@RetoKoradi你是对的。我的意思是说一个角落。
Yytsi 2015年

Answers:


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
我感到很骄傲...
Mego 2015年

发布此答案后,Mego添加æ了列表平均值,并导致î(乘以i)矢量化,从而允许使用非竞争性9字节解决方案。认真地开始成为一种认真的好语言。
lirtosiast 2015年

一种“认真”的好语言。@ThomasKwa
艾迪生·克伦普

是不是Σ2个字节?
Ash Burlaczenko 2015年

@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,2015年

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
Conor O'Brien 2015年

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字节

JaptJa 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的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

怎么办?好了,数组现在只需在pattern后面加三个输入,然后减去第四个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{,允许我们通过切换到保存一个字节ZX。同样,£是的快捷方式m@,它可以保存另一个字节:

1o5 £Ux /2-UgX%4

最近,我实现了一项功能,U通常可以将程序开头的a 忽略掉。但是,由于实现错误,这也可用于以下功能:

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

获取标准输入是代码的较长部分。输入应为逗号分隔的点:

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

这是完整程序吗?哪个将点输出到STDOUT ...?好像不是那样。
Yytsi 2015年

你是对的。该死,这会增加很多字节,
Naouak 2015年

Voilà,固定的。现在快三倍了:(
Naouak 2015年

嗯:/我仍然认为关键是要制作出功能良好的漂亮代码。您提供的代码是非常复杂且美观的艺术品。:)感谢您的参与!
Yytsi 2015年

2

ngn APL,21个字节

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

这会将输入作为一对复数(例如1J¯1 4J2),并以相同的方式打印输出(例如4J¯1 1J2)。在ngn / apl演示中在线尝试。


适用于所有正输入,但是当我输入负数时它什么也不会输出。我输入的格式错误吗?1J1 3J3有效。0J-1 0J1否。我还尝试使用高减号来声明数字负数。
Yytsi 2015年

@TuukkaX不利的一面。我得到输入1 ¯1的输出0J¯1 0J1,这是正确的答案。你得到什么?
丹尼斯

1
哦,现在我开始工作了。我只需要在高减号之前删除微小的空格。它有效并且合格。
Yytsi 2015年

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

Prolog,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 2015年

@TuukkaX:可能不是。它以查询的形式接受输入。我读了说输入可以是我们想要的任何格式的部分。我错过了有关STDIN的部分。甚至不确定Prolog中的STDIN是什么。可以从用户那里读取输入内容吗?
Emigna 2015年

STDIN代表标准输入。因此,从用户处读取是一种方法:),而格式指的是用户输入值的方式。例如[[x,y] [x,y]或{x,y} ...
Yytsi 2015年

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采用单行形式。

在线尝试


您做错了,每次编辑您的字节数都增加了,但是我尝试使每次编辑中的字节数都减少 = P
错误的

8
@flawr我是反丹尼斯
Mego

我认为所有答案都必须是完整的程序,并应从STDIN(或最接近的替代方法)获得意见。这符合条件吗?
ETHproductions 2015年

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.