পরিধি লুপ দ্বারা আবদ্ধ অঞ্চল


14

90-ডিগ্রি টার্নের ক্রম হিসাবে তার ঘের লুপ প্রদত্ত ইউনিট কোষগুলির একটি অঞ্চলের অঞ্চল সন্ধান করুন।

উদাহরণস্বরূপ, তিন কক্ষের অঞ্চলটি ধরুন

XX
X

যার পরিধি লুপ আমরা আঁকছি

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

প্রতিটি বাঁকটি বাম (এল), সোজা (এস), বা ডান (আর) হিসাবে চিহ্নিত করা হয়। আর থেকে শুরু করে, মোড়গুলি হয় RLLSLSLL। সুতরাং, দেওয়া ইনপুটRLLSLSLL , আমাদের জন্য ক্ষেত্রের জন্য 3 আউটপুট করা উচিত।

ইনপুট ক্রমটি তার বামে একক অঞ্চলকে ঘিরে থাকা লুপটি বের করার গ্যারান্টিযুক্ত।

  • পথটি প্রথম দিকের দিকে ফিরে একটি লুপ তৈরির দিকে শুরু করে ends
  • লুপটি নিজেকে অতিক্রম করে না বা স্পর্শ করে না।
  • লুপটি একটি অঞ্চলের কাছাকাছি দিকের দিকে যায়।

ইনপুট / আউটপুট

আপনি অক্ষরগুলির তালিকা বা স্ট্রিং 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

ব্রেন-ফ্লাক , 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

এপিএল (ডায়ালগ ক্লাসিক) , 30 28 19 বাইট

-2 @ অ্যাডমকে ধন্যবাদ

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

এটি অনলাইন চেষ্টা করুন!

জটিল সংখ্যা সহ কৌশলগুলি ব্যবহার করে স্থানাঙ্ক গনা

অঞ্চলটি horiz (x i -x i + 1 ) (y i + y i + 1 ) বা সমানভাবে Σ (x i -x i + 1 ) y i লাইনগুলি কেবল অনুভূমিক বা উল্লম্ব


ট্রেডফেন বডি তে রূপান্তর করে এতে সংরক্ষণ করুন।
অ্যাডম

@ আদম ঠিক আছে, আমি একটি ট্রেনের জন্য আশা করছিলাম এবং কোনওভাবে এটি করতে ভুলে গিয়েছিলাম ...
এনজিএন

@ আদম আহ! আমি ট্রেনটি পেয়েছি :)
ngn

6

জাভাস্ক্রিপ্ট (ES6), 52 50 বাইট

সংরক্ষিত 2 বাইট @ নীলকে ধন্যবাদ

দ্বিতীয় ইনপুট ফর্ম্যাট আশা করে।

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

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

এই বিবরণটি পূর্ববর্তী সংস্করণে প্রযোজ্য : x এবং y পরে উল্টানো হয়েছে।

এটি ইতিমধ্যে @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 হয়।

কারণ একটি প্রাথমিকভাবে ইনপুট অ্যারের রয়েছে, একটি + K করতে বাধ্য করা হয় NaN প্রথম পুনরাবৃত্তির উপর এবং তারপর 0 যখন bitwise ও প্রয়োগ করা হয়। এর অর্থ হ'ল প্রথম দিকের পরিবর্তনটি আসলে অগ্রাহ্য করা হয় এবং আমরা সর্বদা পূর্ব দিকে যাত্রা শুরু করি। চূড়ান্ত আকারের দিকনির্দেশনা বিবেচনা না করে এলাকাটি একই থাকে বলে কিছু যায় আসে না।

তারপরে, আমরা y এর সাথে আপডেট করব y += (2 - a) % 2

পরিশেষে, আমরা কম্পিউট -dx সঙ্গে ~-a % 2ও বিয়োগ Y * -dx থেকে , যা - প্রক্রিয়া শেষে - আমাদের চূড়ান্ত ফলাফল।


1
a=>a.map(k=>r+=(2-(a=a+k&3))%2*(y+=~-a%2),r=y=0)|r2 বাইট সঞ্চয়
নীল


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 + to এ সরল করে তোলে = y = 0 (x কে + 1 + x কে ) * 0 = ΔxΔy যখন অক্ষগুলি বরাবর 90 ডিগ্রি হয়। এক্স পজিশন এবং নির্দেশকে ট্র্যাক করে রাখে এমন একটি পুনরাবৃত্তির টার্ন-গ্লোব্বিং ফাংশনের জন্য আমাদের নীচের সিউডোকোড রয়েছে:

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

যেখানে নতুন দিক, ΔA এবং Δx নিম্নলিখিত টেবিলগুলি থেকে দেখা যায়। আমরা তির্যক অক্ষ বরাবর ΔA এবং bothx উভয় দৈর্ঘ্যের একটি সাইনোসয়েডাল পর্যায়ক্রমিকতা দেখতে পাচ্ছি 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

ওল্ফ্রাম ভাষা (গণিত) , 36 30 বাইট a

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

যদি আপনার গাণিতিকের (~ v10) পুরানো সংস্করণ থাকে তবে বহুভুজটি বন্ধ করা এড়াতে আপনার Most@সামনে প্রয়োজন AnglePath। (টিপসটির জন্য @ ব্যবহারকারী 202729 কে ধন্যবাদ)।

আসল: অনলাইনে চেষ্টা করে দেখুন!

আপডেট হয়েছে: অনলাইনে চেষ্টা করুন!


#.5Piকাজ মনে হচ্ছে।
ব্যবহারকারী 202729

দেখে মনে হচ্ছে এটি Mostখুব সহজেই ফেলে দেওয়া সম্ভব ।
ব্যবহারকারী 202729

2

জেলি , 15 11 বাইট

অযৌক্তিক পদক্ষেপটি দেখানোর জন্য @ এক্সনোরকে ধন্যবাদ , 2 বাইট
সংরক্ষণ

দ্বিতীয় ইনপুট ফর্ম্যাট আশা করে। একটি ফ্লোট ফেরত দেয়।

+\ı*Ḟ_\×ƊĊ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একটি বাইট সংরক্ষণ করুন
ডাইলানান

@ এক্সনর এবং ডাইলান এই জমাটি গল্ফ করে আমাকে সাহায্য করার জন্য আপনাকে ধন্যবাদ। এবং অনুগ্রহের জন্য xnor অতিরিক্ত ধন্যবাদ!
আর্নল্ড



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.