정사각형 측면 핀 포인트


13

첫 번째 코드 골프 도전에 오신 것을 환영합니다! :) 바로 들어가 봅시다.

도전:

두 개의 부동 소수점 벡터 인 O (원점) 및 T (대상)가 주어지면 LR 값 을 STDOUT 에 인쇄하는 프로그램을 만들어야합니다 .

  1. O 는 사각형의 한 모서리입니다
  2. TO 와 반대쪽에 위치한 사각형의 한 모서리입니다.
  3. L 은 불완전한 사각형의 다른 점을 나타내는 2D 점 (코너)입니다.
  4. RL 과 반대 인 2D 점 (코너)입니다.

규칙

  1. STDIN에서 OT의 값을 읽어야합니다 (입력 예 참조).
  2. 다시 LR 의 값은 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]

주의 사항 : 입력 및 출력은 부동 소수점 일 수 있습니다!

중요한 정보!

  • OT 는 STDIN (예 : Inside [] 또는 () ...)에서 온 경우 원하는 형식을 사용하여 모든 형식으로 가져올 수 있습니다.
  • LR 은 어떤 순서로도 인쇄 할 수 있습니다.
  • (O-> L-> T-> R-> O)가 연결되면 각면의 길이가 같아야합니다!

승리

  • 이것은 코드 골프이므로 가장 적은 바이트 응답이 이깁니다!
  • 당첨자 답변은 일요일 15.11.2015 20 : 00-22 : 00 (핀란드 시간)에 접수됩니다 (내가 틀리지 않은 경우, 그 날짜는 미국에서 11.15.2015와 같이 작성되어 혼동하지 마십시오).

행복한 골프!


3
모르는 경우 향후 도전 과제에 대해 샌드 박스 를 추천 드리겠습니다 . 여기서 도전 과제가 시작되기 전에 (그리고 변경 사항이 기존 답변을 무효화하기 전에) 피드백을 받고 문제를 해결할 수 있습니다.
Martin Ender

두 개의 복소수 목록으로 입력 할 수 있습니까?
lirtosiast

@ThomasKwa 반드시 목록으로 가져갈 수 있습니다. 주어진 입력에 복소수가 아닌가 ...? 컴퓨터가 스스로 계산할 가치를 개인적으로 알 필요가 없다는 것을 의미합니까?
Yytsi

"정사각형의 지점"이라고 말하면 코너를 의미하는 것 같습니다. 사각형에는 다른 점이 많이 있습니다.
Reto Koradi

@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
나는 너무 자랑스러워 ...
Mego

이 답변이 게시 된 후 Mego æ는 목록 평균을 추가 î하고 경쟁을 유발 하지 않는 9 바이트 솔루션을 허용하여 (i를 곱하여) 벡터화했습니다. 진지하게 좋은 언어가되기 시작했습니다.
lirtosiast

"진실하게"좋은 언어. @ThomasKwa
애디슨

하지가 Σ2 바이트?
Ash Burlaczenko

@AshBurlaczenko 심각하게 사용하는 것 CP437 인코딩 , Σ코드 포인트 0xF4을 가지고 있습니다.
데니스

6

진심으로 , 25 바이트

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

입력을 목록으로 취합니다. [x1,y1,x2,y2]

내 파이썬 답변과 같은 전략이지만 심각하게!

설명:

,      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
이다 심각하게 냉각! (Pun 의도)
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이 문자열 목록을 지원하지 않는 방법을 상기시킵니다. P : 그건 아마 내가 TI-BASIC에 추가 할 한 가지는 것
코너 오브라이언

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

apt, 29 28 바이트

JaptJa vaScri pt 의 단축 버전입니다 . 통역사

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

화살표 기능에는 최신 버전의 Firefox와 같은 ES6 호환 브라우저가 필요합니다. 입력은 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

이제 뭐? 배열은 이제 세 개의 입력을 더하고 패턴에 따라 네 번째를 빼는 것입니다 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

또 다른 2 바이트! 이제 우리는 어딘가로 가고 있습니다. 그러나 그것은 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프로그램의 시작 부분에 보통을 생략 할 수 있는 기능을 구현 했습니다. 그러나 구현 실수로 인해 함수와 함께 작동합니다.

1o5 £x /2-UgX%4

마지막으로 g인덱스가 문자열의 끝을 지나면 함수가 줄 바꿈 %4되어 총 13 바이트 를 제거 할 수 있습니다 .

1o5 £x /2-UgX

그리고 나는 19가 놀랍다 고 생각했다 ;-) 온라인으로 테스트!


Japt equivalent을 사용하여 바이트를 절약 할 수 있습니다 eval(U.join`+`).
Mama Fun Roll

나는이 언어를 좋아한다 : D
phase

@ ן nɟuɐɯɹɐ ן oɯ 감사 eval합니다. 아직 동등한 항목을 추가하지 않았더라도 실제로 바이트를 절약합니다!
ETHproductions

2

자바 스크립트 (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

네가 옳아. 젠장, 이것은 많은 바이트를 추가 할 것입니다
Naouak

Voilà, 고정. 거의 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 ¯1input 0J¯1 0J1에 대한 출력 을 얻습니다 . 정답입니다. 무엇을 받고 있습니까?
데니스

1
아, 이제는 작동합니다. 마이너스 부호 앞에 작은 공백을 제거해야했습니다. 작동하고 자격이 있습니다.
Yytsi



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에 관한 부분을 놓쳤다. Prolog의 STDIN이 무엇인지조차 확실하지 않습니다. 사용자의 입력을 읽을 수 있습니까?
Emigna

STDIN은 표준 입력을 나타냅니다. 따라서 사용자로부터 읽는 것은 갈 길입니다 :) 그리고 형식에 따라 사용자가 값을 입력하는 방식을 의미합니다. 예 [x, y] [x, y] 또는 {x, y} ...
Yytsi

0

파이썬 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한 줄에 형식 으로 이루어집니다.

온라인으로 사용해보십시오


당신은 뭔가 잘못하고, 바이트 수는 각 편집 마다
올라갔지

8
@flawr 나는 안티 데니스입니다
Mego

STDIN (또는 가장 가까운 대안)의 의견을 수렴하여 모든 답변이 완전한 프로그램이어야한다고 생각합니다. 자격이 되나요?
ETHproductions

0

파이썬 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)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.