একটি সাধারণ সিস্টেমের ইলেক্ট্রোস্ট্যাটিক সম্ভাবনা


21

পদার্থবিজ্ঞানে যেমন বৈদ্যুতিক চার্জ প্রত্যাহার করা হয় এবং চার্জের মতো নয়।

দূরত্ব দ্বারা পৃথক দুটি ইউনিটের চার্জের মধ্যে সম্ভাব্য শক্তি dহ'ল 1/dচার্জের মতো এবং -1/dচার্জের বিপরীতে। চার্জ সিস্টেমের সম্ভাব্য শক্তি হ'ল সমস্ত জোড়ের চার্জের মধ্যে সম্ভাব্য শক্তির যোগফল।

চ্যালেঞ্জ

স্ট্রিং দ্বারা প্রতিনিধিত্ব করা ইউনিট চার্জের একটি সিস্টেমের সম্ভাব্য শক্তি নির্ধারণ করুন।

এটি , তাই বাইটগুলির মধ্যে সংক্ষিপ্ততম সমাধানটি জিতে।


ইনপুট

একজন nonempty একাধিক লাইন স্ট্রিং শুধুমাত্র সমন্বয়ে গঠিত +, -, , এবং নতুন লাইন প্রতিটি লাইনে একটি ধ্রুবক প্রস্থ সঙ্গে। +এবং -+1 এবং -1 যথাক্রমে অভিযোগে প্রতিনিধিত্ব করে। উদাহরণস্বরূপ, নিম্নলিখিত স্ট্রিং:

    + -
 +     

(উপরের বামটিকে মূল হিসাবে বিবেচনা করে) (4,0) এবং (1, -1) এবং (6,0) এ নেতিবাচক চার্জ সহ এমন একটি সিস্টেম প্রতিনিধিত্ব করে।

বিকল্পভাবে, আপনি লাইনগুলির তালিকা হিসাবে ইনপুট নিতে পারেন।

আউটপুট

চার্জ সিস্টেমের সম্ভাব্য শক্তি প্রতিনিধিত্ব করে একটি স্বাক্ষরিত আসল নম্বর। আউটপুট চারটি উল্লেখযোগ্য চিত্র বা 10 -4 , যাহা আলগা হয় সঠিক হওয়া উচিত ।

পরীক্ষার কেস:

   - 
     

আউটপুট করা উচিত 0। প্রতিরোধ বা আকর্ষণ করার জন্য কোনও জুড়ি চার্জ নেই, এবং শ্বেত স্থান কোনও কিছুই পরিবর্তন করে না।

+  
  -

দুটি মাত্র চার্জ রয়েছে; তারা উল্লম্ব দিক থেকে 1 ইউনিট দূরে এবং অনুভূমিক দিকের 2 ইউনিট দূরে, সুতরাং তাদের দূরত্ব স্কয়ার্ট (5)। আউটপুট -1 / স্কয়ার্ট (5) = হওয়া উচিত -0.447213595

+       -
-       +

দেওয়া উচিত -2.001930531

 - -- -+ - - -+-++-+
 +-- + +-- + ++-++ -
---++-+-+- -+- - +- 
-- - -++-+  --+  +  
-   + --+ ++-+  +-  
--  ++- + +  -+--+  
+ +++-+--+ +--+++ + 
-+- +-+-+-+  -+ +--+
- +-+- +      ---+  
-     - ++ -+- --+--

দেওয়া উচিত -22.030557890

---+--- ++-+++- -+ +
-+ ---+++-+- +- +  +
---+-+ - ----  +-- -
 -   + +--+ -++- - -
--+ - --- - -+---+ -
+---+----++ -   +  +
-+ - ++-- ++-  -+++ 
 +----+-   ++-+-+  -
++- -+ -+---+  -- -+
+-+++ ++-+-+ -+- +- 

দেওয়া উচিত 26.231088767


1
পর্যায়ক্রমিক সীমানা শর্তাবলী বাস্তবায়নের জন্য এবং মাদেলুং শক্তির গণনার জন্য প্লাস পয়েন্টস।
আন্দ্রেস ডেক

1
@ AndrasDeak- এ আকর্ষণীয় হবে।
লিরটোসিয়াস্ত

উত্তর:


3

পাইথ, 34 বাইট

smc*FhMd.atMd.cs.e+RkCUBxL" +"b.z2

প্রদর্শন

প্রথমে আমরা প্রতিটি অক্ষরকে +1 +, +1 -এবং 0 এর জন্য রূপান্তর করি । তারপরে, প্রতিটি সংখ্যা ম্যাট্রিক্সে এর অবস্থানের সাথে টীকায়িত হয়। এই মুহুর্তে, আমাদের কাছে একটি ম্যাট্রিক্স রয়েছে যা দেখে মনে হচ্ছে:

[[[-1, 0, 0], [-1, 1, 0], [-1, 2, 0], [1, 3, 0], [-1, 4, 0], [-1, 5, 0], [-1, 6, 0]],
 [[1, 0, 1], [1, 1, 1], [-1, 2, 1], [-1, 3, 1], [0, 4, 1], [1, 5, 1], [0, 6, 1]]]

এই পয়েন্টে পৌঁছানো কোডটি হল .e+RkCUBxL" +"b.z

তারপরে, আমরা এই ম্যাট্রিক্সকে একটি তালিকায় সমতল করি এবং সাথে সমস্ত সম্ভাব্য জোড়া নিয়ে যাই .cs ... 2

তারপরে, তিনি জুটির মধ্যবর্তী দূরত্ব .atMdএবং সম্ভাবনার চিহ্ন *FhMd, বিভাজন এবং যোগফলের সন্ধান করেন।


6

সিজাম, ৫১ টি চর

সমস্ত জোড়া গণনা করা, ফিল্টার Inf/NaNআউট এবং দুটি দ্বারা বিভাজন:

q_N#:L;N-" +"f#ee2m*{z~:*\Lfmd2/:.-:mh/}%{zL<},:+2/

বিকল্পভাবে, ফিল্টারিং স্থানাঙ্কগুলি প্রথমে যাতে আমরা প্রতিটি জুটি একবার গণনা করি এবং এতে প্রবেশ করি না Inf/NaN:

q_N#:L;N-" +"f#ee2m*{0f=:<},{z~:*\Lfmd2/:.-:mh/}%:+

ব্যাখ্যা (পুরানো)

q                        Get all input.
 _N#:L;                  Store the line width in L.
       N-                Flatten it into one long line.
         :i              Get all ASCII values.
           :(3f%:(       Map space to 0, + to 1, - to -1.
                  ee     Enumerate: list of [index, sign] pairs.
                    2m*  Get all possible pairs.

{                        }%     For each pair:
 e_~                              i1 s1 i2 s2
    @*                            i1 i2 s        (multiply signs)
      \aa@aa+                     s [[i2] [i1]]  (put indices in nested list)
             Lffmd                s [[x2 y2] [x1 y1]]  (divmod by L)
                  :.-             s [xD yD]      (point diff)
                     :mh          s d            (Euclidean dist.)
                        /         s/d            (divide)

{zL<},                   Filter out infinite results.
      :+2/               Sum all charges, and divide by two.
                           (We counted each pair twice.)

3
তাহলে ব্যাখ্যা টিবিএ? : পি
আর

2
আপনি যখন এটি স্যান্ডবক্স করার সময় লিখেছিলেন, বা আপনি কি সত্যিই দ্রুত?
lirtosiast

আমি বেশ দ্রুত :) প্রথম সংস্করণটি ছিল "সবচেয়ে সহজ জিনিস যা কাজ করেছিল", যা লিখতে আমাকে কয়েক মিনিট সময় লেগেছিল, তাই আমি তাৎক্ষণিকভাবে পোস্ট করেছিলাম, তারপরে পরের আধ ঘন্টা ধরে এটি গল্ফ করে।
লিন

4

হাস্কেল, 149 144 বাইট

z=zip[0..]
g n|f<-[(x,y,c)|(y,r)<-z$lines n,(x,c)<-z r,c>' ']=sum[c%d/sqrt((x-i)^2+(y-j)^2)|a@(x,y,c)<-f,b@(i,j,d)<-f,a/=b]/2
c%d|c==d=1|1<2= -1

ব্যবহারের উদাহরণ:

*Main> g " - -- -+ - - -+-++-+\n +-- + +-- + ++-++ -\n---++-+-+- -+- - +- \n-- - -++-+  --+  +  \n-   + --+ ++-+  +-  \n--  ++- + +  -+--+  \n+ +++-+--+ +--+++ + \n-+- +-+-+-+  -+ +--+\n- +-+- +      ---+  \n-     - ++ -+- --+--"
-22.030557889699853

fসমস্ত ট্রিপল এর একটি তালিকা (x-coord, y-coord, unit charge)gযা সমান নয় এমন দুই triples সব সমন্বয়, অঙ্কের তাদের এবং ভাগ দ্বারা ফলাফলের জন্য সম্ভাবনাময় শক্তি হিসাব 2


3

রুবি, 133

->n{t=i=j=0.0
c=[]
n.tr(' ',?,).bytes{|e|e-=44
z="#{j}+#{i}i".to_c
i+=1
e<-1?i=0*j+=1:(c.map{|d|t+=d[0]*e/(d[1]-z).abs};c<<[e,z])}
t}

টিপলস আকারে পূর্ববর্তী চার্জের একটি অ্যারে বজায় [charge, location(complex number)]রাখে এবং তালিকায় এটি যুক্ত করার আগে এই নতুন চার্জের সাথে এই তালিকার সাথে তুলনা করে।

ইনপুট সমস্ত স্থান কমা দিয়ে প্রতিস্থাপিত হয়। এটি তাদের এসকিআই কোড থেকে ৪৪ টি বিয়োগ করে নিম্নলিখিত অ্যাসাইনমেন্টটিকে সক্ষম করে:

symbol  charge (internal representation)
+        -1
,         0
-        +1

প্রোগ্রামটি +-1 এবং -+1 হিসাবে বিবেচিত হওয়ার বিষয়টি চূড়ান্ত ফলাফলের সাথে কোনও পার্থক্য করে না। প্রোগ্রামটি ফাঁকা জায়গাগুলির জন্য 0 চার্জের প্রভাব গণনা করার প্রয়াসে যায় তা আসলে কিছুটা কমিয়ে দেওয়া ছাড়াও কোনও পার্থক্য নেই :-)

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ

g=->n{
  t=i=j=0.0                           #t=total potential; i and j are coordinates of charge.
  c=[]                                #array to store tuples: charge + location (complex number).
  n.tr(' ',?,).bytes{|e|              #replace all spaces with commas, then iterate through characters.
    e-=44                             #subtract 44 from ascii code: + -> -1; comma -> 0; - -> 1
    z="#{j}+#{i}i".to_c               #position of current character as complex number
    i+=1                              #advance x coordinate to next character.
    e<-1?i=0*j+=1:                    #if current character is newline, set i to zero and advance j instead,
    (c.map{|d|t+=d[0]*e/(d[1]-z).abs};#else add up the contribution for interaction of the current charge with all previous charges, 
    c<<[e,z])}                        #and append the current charge to the list of previous charges.
t}                                    #return t

p g[
'+       -
-       +'
]

p g[
' - -- -+ - - -+-++-+
 +-- + +-- + ++-++ -
---++-+-+- -+- - +- 
-- - -++-+  --+  +  
-   + --+ ++-+  +-  
--  ++- + +  -+--+  
+ +++-+--+ +--+++ + 
-+- +-+-+-+  -+ +--+
- +-+- +      ---+  
-     - ++ -+- --+--'
]

3

এমএটিএল , 39 42 বাইট

`jt]N$v'- +'FT#m2-I#fbbhtZPwt!**1w/XRss

কাজ করে বর্তমান রিলিজ (5.1.0) । সংকলক মতলব বা অক্টাভাতে চলে।

প্রতিটি লাইন একটি পৃথক ইনপুট হয়। শেষটি খালি লাইনটি ইনপুট করে সংকেত দেওয়া হয়।

উদাহরণ

>> matl
 > `jt]N$v'- +'FT#m2-I#fbbhtZPwt!**1w/XRss
 > 
> +       -
> -       +
> 
-2.001930530821583

>> matl
 > `jt]N$v'- +'FT#m2-I#fbbhtZPwt!**1w/XRss
 > 
>  - -- -+ - - -+-++-+
>  +-- + +-- + ++-++ -
> ---++-+-+- -+- - +- 
> -- - -++-+  --+  +  
> -   + --+ ++-+  +-  
> --  ++- + +  -+--+  
> + +++-+--+ +--+++ + 
> -+- +-+-+-+  -+ +--+
> - +-+- +      ---+  
> -     - ++ -+- --+--
> 
-22.03055788969994

ব্যাখ্যা

`jt]           % keep inputting lines until an empty one is found
N$v            % concatenate all inputs vertically. This removes the last empty line
'- +'FT#m      % replace '-', ' ', '+'  by numbers 1, 2, 3
2-             % transform into -1, 0, 1 for '-', ' ', '+'
I#f            % find rows, columnss and values of nonzeros
bbh            % concatenate rows and columns into 2-col matrix or coordinates
tZP            % compute pair-wise distances for those coordinates
wt!*           % generate matrix of signs depending on signs of charges
*              % multiply distances by signs, element-wise
1w/            % invert element-wise
XR             % keep part over the diagonal
ss             % sum along colums, then rows
               % (output is implicitly printed)

3

লুয়া, 293 255 246 228 বাইট

e=0l={}p={}i=1while l[i-1]~=""do l[i]=io.read()for k=1,#l[i]do c=l[i]:sub(k,k)if(c>" ")then for h,v in ipairs(p)do e=e+(v.s==c and 1 or-1)/math.sqrt((v.y-i)^2+(v.x-k)^2)end table.insert(p,{s=c,x=k,y=i})end end i=i+1 end print(e)

অচ, 228 বাইট ... আমি সম্ভবত এটি উল্লেখযোগ্যভাবে গল্ফ করতে পারি, তবে আমি এটি আপাতত এখানে পোস্ট করব। সম্ভবত আরও কিছু সংগীত এবং (আশা) দৈর্ঘ্যে কিছু উন্নতি করে আজ রাতের পরে এটি আপডেট করুন।

Ungolfed

e=0l={}p={}i=1
while l[i-1]~=""do 
    l[i]=io.read()
    for k=1,#l[i]do
        c=l[i]:sub(k,k)
        if(c>" ")then
            for h,v in ipairs(p) do
                e=e+(v.s==c and 1 or-1)/math.sqrt((v.y-i)^2+(v.x-k)^2)
            end
            table.insert(p,{s=c,x=k,y=i})
        end
    end
    i=i+1 
end

print(e)

255 বাইট আপডেট করুন: লুপগুলির জন্য পুরানো নীচের অংশটিকে সরিয়ে ফেলা হয়েছে, স্ট্রিং অ্যারেতে স্ট্রিং যুক্ত হওয়ার সাথে সাথে এখন প্রক্রিয়াজাতকরণ করা হয়।

246 বাইট আপডেট করুন: নিমির পরামর্শ অনুসারে প্রতিস্থাপন c=="+"or"-"==cকরা হয়েছে c>" "। দুর্দান্ত ধারণা, ধন্যবাদ!

228 বাইট আপডেট করুন: লুপের জন্য টেবিলের মধ্যে statement োকানোর মাধ্যমে যদি বেশ কয়েকটি বাইট সংরক্ষণ করে বিবৃতি সম্পূর্ণরূপে অপসারণ করা যায়।


2

গণিত 223 বাইট

এখনও করতে গল্ফিং।

f[{{c1_,p1_},{c2_,p2_}}]:=N[(c1 c2)/EuclideanDistance[p1,p2],13];
h[charges_]:=Tr[f/@Subsets[DeleteCases[Flatten[Array[{r[[#,#2]],{#,#2}}&,Dimensions[r=Replace[Characters[charges],{"+"-> 1,"-"->-1," "->0},2]]],1],{0,_}],{2}]]

সর্বশেষ পরীক্ষার কেস:

h[{" - -- -+ - - -+-++-+", " +-- + +-- + ++-++ -", 
  "---++-+-+- -+- - +- ", "-- - -++-+  --+  +  ", 
  "-   + --+ ++-+  +-  ", "--  ++- + +  -+--+  ", 
  "+ +++-+--+ +--+++ + ", "-+- +-+-+-+  -+ +--+", 
  "- +-+- +      ---+  ", "-     - ++ -+- --+--"}]

-22,030557890

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.