Çevre döngüsü ile çevrili alan


14

90 derece dönüş sırası olarak çevre döngüsü verilen birim hücrelerin bir bölgesini bulun.

Örneğin, üç hücreli bölgeyi ele alalım.

XX
X

kimin çevre döngüsünü çiziyoruz

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

Her tur sol (L), düz (S) veya sağ (R) olarak işaretlenir. R'den başlayarak, dönüşler RLLSLSLL. Bu nedenle, girdi verildiğinde RLLSLSLL, alan için 3 çıktı almalıyız.

Giriş dizisinin, solunda tek bir bölgeyi çevreleyen bir döngüyü izlemesi garanti edilir.

  • Yol, başlangıç ​​noktasında geriye doğru, ilk yöne bakar ve bir halka oluşturur.
  • Döngü kendi kendine geçmez veya kendisine dokunmaz.
  • Döngü bir bölge çevresinde saat yönünün tersine gider.

I / O

Girdiyi bir liste veya karakter dizisi olarak LSRveya -1, 0, 1sol, düz, sağ için sayılar olarak alabilirsiniz . Çıktı pozitif bir tamsayıdır. Şamandıralar iyi.

Test senaryoları

Girişler her iki formatta ve ardından ilgili çıkışlarla verilir.

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

Yanıtlar:


10

Brain-Flak , 112 bayt

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

Çevrimiçi deneyin!

Bu program alanı hesaplamak için Green teoremini kullanır

Geçerli konum sağ yığın üzerinde, karşılaşılan yöne bağlı bir biçimde saklanır.

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

Her durumda, yığındaki ikinci değer 1 artar ve alanın çizgi integrali yığının üstündeki değerin yarısı kadar azalır. Telafi etmek için, programın sonu çalışan toplamı -2'ye böler.

# 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 Klasik) , 30 28 19 bayt

@ Adám sayesinde -2

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

Çevrimiçi deneyin!

koordinatları hesaplamak için karmaşık sayılarla hileler kullanır

alan horizontal (x i -x i + 1 ) (y i + y i + 1 ) veya eşdeğer Σ (x i -x i + 1 ) y i şeklindedir, çünkü çizgiler yalnızca yatay veya dikeydir


Tradfn gövdeye dönüştürerek tasarruf edin.
Adám

@ Adám, bir tren bekliyordum ve bir şekilde bunu yapmayı unuttum ...
ngn

@ Adám ah! Treni buldum :)
ngn

6

JavaScript (ES6), 52 50 bayt

@Neil sayesinde 2 bayt kaydedildi

İkinci giriş formatını bekler.

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

Çevrimiçi deneyin!

Nasıl?

Bu açıklama önceki sürüm için geçerlidir : x ve y o zamandan beri ters çevrilmiştir.

Bu, @ngn : A = Σ (x i - x i + 1 ) y i tarafından daha önce sözü edilen formüle dayanmaktadır; bu formül , xdx i y i olarak da yazılabilir; burada dx i , -1, 0 veya 1'dir.

R = y = 0 ile başlıyoruz .

Biz mevcut yön izlemek tutmak bir :

          | 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

İle güncellenir a = a + k & 3, burada k giriş dizisinin geçerli öğesidir.

Çünkü bir ilk giriş dizi içeren, bir + k zorlanır olan NaN sonra birinci tekrar ve 0 lojik AND uygulandığı zaman. Bu, ilk yön değişikliğinin aslında göz ardı edildiği ve her zaman Doğu'ya gitmeye başladığımız anlamına gelir. Önemli değil, çünkü son şeklin yönü ne olursa olsun alan aynı kalır.

Ardından, y'yi ile güncelleriz y += (2 - a) % 2.

Son olarak, hesaplama -dx ile ~-a % 2ve çıkarma y * -dx gelen r , - sürecin sonunda - bizim nihai sonucudur.


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


3

Haskell , 71 70 69 bayt

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çıklama: Green Teoremi, A = ½∑ (x k + 1 + x k ) (y k + 1 -y k ) alanı için formülü verir: A = ½∑ Δx = 0 2x k Δy + ½∑ Δy = 0 (x k + 1 + x k ) * 0 = ∑xΔy, eksenler boyunca 90 derece olduğunda. X konumunu ve yönünü takip eden tekrarlayan bir dönüş-globbing işlevi için aşağıdaki sahte kodumuz var:

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

burada yeni yön, ΔA ve Δx aşağıdaki tablolardan görülebilir. Modüler aritmetik yerine dir+turnuygulanan diyagonal eksen boyunca hem A hem de Δx'te dört uzunluktaki sinüzoidal periyodikliği görebiliriz 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

Çevrimiçi deneyin!



2

Jöle , 15 11 bayt

@Xnor'a 2 bayt tasarruf ederek gereksiz bir adımı işaret ettiği için
teşekkürler Başka bir baytı kaydettiği için @dylnan'a teşekkürler

İkinci giriş formatını bekler. Bir şamandıra döndürür.

+\ı*Ḟ_\×ƊĊS

Çevrimiçi deneyin! veya tüm test senaryolarını çalıştırın

Yorumlananlar

+\ı*Ḟ_\×ƊĊ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

Sadece en az 2 önemli bit tutmak gerekli mi?
xnor

+\ı*Ḟ_\×ƊĊSbir bayt kaydeder
dylnan

@xnor ve dylnan Bu gönderimi golf oynarken bana yardımcı olduğunuz için teşekkür ederim. Ve ödül için xnor'a ekstra teşekkürler!
Arnauld



0

Pyth , 14 bayt

_smec^.j)sd2.:

Test odası

_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

Bu, alanı giriş -1/2 * g(sum(l))üzerindeki tüm bitişik alt listelerin toplamı olarak ifade eder ve lburada gmodüler indeksleme yapar [0,1,0,-1]. Kod uygular golarak g(x)=imag(1j**x). Doğrudan modüler indeksleme, kullanma sinveya aritmetik fonksiyon ile daha kısa bir yöntem olabilir x%4.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.