주변 루프로 둘러싸인 영역


14

둘레 루프가 주어진 단위 셀 영역의 영역을 90도 회전 순서로 찾으십시오.

예를 들어, 3 셀 영역을

XX
X

우리의 주변 루프

L<S<L
v   ^
S R>L
v ^
L>L

각 턴은 왼쪽 (L), 직선 (S) 또는 오른쪽 (R)으로 표시됩니다. R에서 시작하면 턴은 RLLSLSLL입니다. 따라서 input이 주어지면 RLLSLSLL영역에 대해 3을 출력해야합니다.

입력 시퀀스는 왼쪽의 단일 영역을 둘러싸는 루프를 추적합니다.

  • 경로는 시작점에서 다시 시작하여 초기 방향을 향하고 루프를 형성합니다.
  • 루프가 교차하거나 손대지 않습니다.
  • 루프는 한 영역을 시계 반대 방향으로 돌립니다.

I / O

입력을 문자 목록 또는 문자열 LSR또는 -1, 0, 1왼쪽, 직선, 오른쪽의 숫자로 사용할 수 있습니다. 출력은 양의 정수입니다. 플로트는 괜찮습니다.

테스트 사례

입력은 두 가지 형식으로 제공되며 각각의 출력이 이어집니다.

RLLSLSLL
LLLL
SLLSLL
LSRRSLLSSLSSLSSL
SSSSSLSSSSSLSSSSSLSSSSSL

[1, -1, -1, 0, -1, 0, -1, -1]
[-1, -1, -1, -1]
[0, -1, -1, 0, -1, -1]
[-1, 0, 1, 1, 0, -1, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]
[0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1]

3
1
2
7
36

답변:


10

Brain-Flak , 112 바이트

(([]){[{}]<{({}()){{}<>([{}]<([{}])>)(<>)}<>(({}[({})])[({}{})])<>}{}<>>({}<({}())>)<>([])}{})({()<({}()())>}{})

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

이 프로그램은 녹색 정리 를 사용하여 면적을 계산합니다.

현재 위치는 방향에 따라 다른 형식으로 오른쪽 스택에 저장됩니다.

Direction  top  second
north       -x       y
west        -y      -x
south        x      -y
east         y       x

모든 경우에 스택의 두 번째 값은 1 씩 증가하고 영역의 적분 선은 스택 상단의 값의 절반만큼 감소합니다. 이를 보상하기 위해 프로그램의 끝은 누계를 -2로 나눕니다.

# For each number in input
(([]){[{}]

  # Evaluate turn-handling to zero
  <

    # If turn:
    {

      # If right turn:
      ({}()){{}

        # Negate both values on other stack (reverse direction)
        <>([{}]<([{}])>)

      (<>)}

      # Swap the two stack elements and negate the new top of stack
      # This performs a left turn.
      <>(({}[({})])[({}{})])<>

    }{}

  <>>

  # Evaluate as top of stack and...
  ({}<

    # increment the number below it
    ({}())

  >)<>

([])}{})

# Divide total by -2
({()<({}()())>}{})

7

APL (Dyalog Classic) , 30 28 19 바이트

@ Adám 덕분에 -2

(+/9∘○×11○+\)0j1*+\

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

복잡한 숫자로 트릭을 사용 합니다 좌표를 계산하기를

선이 수평 또는 수직 이므로 면적은 ½Σ (x i -x i + 1 ) (y i + y i + 1 ) 또는 동등하게 Σ (x i -x i + 1 ) y i입니다


tradfn 본문으로 변환하여 저장하십시오.
Adám

@ Adám 맞다, 나는 기차를 바라고 있었다. 그리고 어떻게 든 그것을 잊었다.
ngn

@ Adám 아! 나는 기차를 발견했다 :)
ngn

6

자바 스크립트 (ES6), 52 50 바이트

@Neil 덕분에 2 바이트 절약

두 번째 입력 형식이 필요합니다.

a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r

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

어떻게?

이 설명 은 이전 버전에 적용됩니다 . xy 는 이후 반전되었습니다.

이를 기반으로 이미 언급 @ngn 화학식 : A는 = Σ (X I - X I + 1 ) Y I ,로도 쓸 수있는 Σdx i y i여기서 dx i 는 -1, 0 또는 1입니다.

r = y = 0으로 시작 합니다.

우리는 현재 방향을 다음과 같이 추적 합니다 .

          | a = 0 | a = 1 | a = 2 | a = 3
----------+-------+-------+-------+-------
direction | East  | South | West  | North
       dx |  +1   |   0   |  -1   |   0     <--  -(~-a % 2)
       dy |   0   |  +1   |   0   |  -1     <--  (2 - a) % 2

여기 a = a + k & 3에서 k 는 입력 배열의 현재 요소입니다.

처음에는 입력 배열이 포함 되므로 a + k NaN이 에 그 첫 번째 반복과 0 비트 단위 AND인가시. 이것은 첫 번째 방향 변경이 실제로 무시되고 우리는 항상 동쪽으로 향하기 시작한다는 것을 의미합니다. 최종 모양의 방향에 관계없이 영역이 동일하게 유지되므로 중요하지 않습니다.

그런 다음 업데이트합니다 y를y += (2 - a) % 2 합니다.

마지막으로, 우리 는 r 을 사용하여 -dx 를 계산 하고 r 에서 y * -dx~-a % 2뺍니다 . 이것은 프로세스의 마지막에 최종 결과입니다.


1
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r2 바이트를 절약합니다.
Neil


3

하스켈 , 71 70 69 바이트

a 0 0
a x d(t:r)|k<-t+d=x*g k+a(x+g(k-1))k r
a _ _ _=0
g a=sin$a*pi/2

설명 : 녹색 정리는 A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ) 영역에 대한 공식을 제공합니다. A = ½∑ Δx = 0 2x k Δy + ½∑ 회전이 축을 따라 90 도일 때 Δy = 0 (x k + 1 + x k ) * 0 = ∑xΔy. x 위치와 방향을 추적하는 재귀 턴 글 로빙 기능을위한 다음 의사 코드가 있습니다.

A x dir (turn:turns) = ΔA + A (xx) (dir+turn) turns

새로운 방향, ΔA 및 Δx는 다음 표에서 볼 수 있습니다. 우리는 대각선 축을 따라 ΔA와 Δx에서 길이 4의 정현파주기를 볼 수 있으며 dir+turn, 이는 sin모듈 식 산술 대신 사용 됩니다.

  ↔|L S R ΔA| L  S  R  Δx| L  S  R 
         -x  0  x      0 -1  0  
          0  x  0     -1  0  1
          x  0 -x      0  1  0
          0 -x  0      1  0 -1

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


2

Wolfram Language (Mathematica) , 36 30 바이트

Area@Polygon@AnglePath[.5Pi#]&

이전 버전의 Mathematica (~ v10)가 Most@있는 경우AnglePath 하는 경우 다각형을 닫지 않도록 있어야합니다. (팁은 @ user202729에게 감사합니다).

기발한: 온라인으로 사용해보십시오!

업데이트 : 온라인으로 사용해보십시오!


#.5Pi작동하는 것 같습니다.
user202729

떨어 뜨릴 수도있는 것 같습니다 Most.
user202729

2

젤리 , 15 11 바이트

쓸모없는 단계를 지적하여 2 바이트를 절약 한 @xnor 덕분에
를 절약 한 @xnor 덕분에 다른 바이트를 저장 한 @dylnan 덕분에

두 번째 입력 형식이 필요합니다. float를 반환합니다.

+\ı*Ḟ_\×ƊĊS

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 실행

댓글

+\ı*Ḟ_\×ƊĊS  - main link, taking the input list   e.g. [1, -1, -1, 0, -1, 0, -1, -1]
+\           - cumulative sum                     -->  [1, 0, -1, -1, -2, -2, -3, -4]
  ı*         - compute 1j ** d,                   -->  [(0+1j), (1+0j), (0-1j), (0-1j),
               which gives a list of (-dy + dx*j)       (-1+0j), (-1+0j), (0+1j), (1+0j)]
         Ċ   - isolate the imaginary part (dx)    -->  [1, 0, -1, -1, 0, 0, 1, 0] (floats)
        Ɗ    - invoke the last 3 links as a monad
    Ḟ        - isolate the real part (-dy)        -->  [0, 1, 0, 0, -1, -1, 0, 1] (floats)
     _\      - negated cumulative sum (gives y)   -->  [0, -1, -1, -1, 0, 1, 1, 0]
       ×     - compute dx * y                     -->  [0, 0, 1, 1, 0, 0, 1, 0]
          S  - sum                                -->  3

최소 2 개의 유효 비트 만 유지해야합니까?
xnor

+\ı*Ḟ_\×ƊĊS바이트 절약
dylnan

@xnor and dylnan이 제출물을 골프로 보내 주셔서 감사합니다. 현상금에 대한 xnor 덕분에 추가 감사합니다!
Arnauld



0

Pyth , 14 바이트

_smec^.j)sd2.:

테스트 스위트

_smec^.j)sd2.:
              Q     implicit input
            .:      take all non-empty contiguous sublists
  m                map this operation onto each one:
   ec^.j)sd2
         s           the sum of the sublist
     ^.j)            raise it to the complex unit 1j to that power
    c      2         halve it
   e                take the imaginary part
_s                take the negated sum of the result

이것의 합으로 표현 영역 -1/2 * g(sum(l))의 모든 인접 서브리스트를 통해 l상기 입력 위에 g로 모듈화 인덱싱을 수행 [0,1,0,-1]. 코드는 g로 구현 됩니다 g(x)=imag(1j**x). 직접 모듈 형 인덱싱, 사용 sin또는에 산술 함수를 사용하는 더 짧은 방법이있을 수 있습니다 x%4.

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