एक साधारण प्रणाली की इलेक्ट्रोस्टैटिक क्षमता


21

भौतिकी में, जैसे विद्युत आवेशों का प्रतिकार होता है, और इसके विपरीत प्रभार आकर्षित होते हैं।

दूरी dसे अलग दो इकाई आवेशों के बीच की संभावित ऊर्जा आवेशों की 1/dतरह होती है और आवेशों -1/dके विपरीत होती है। आवेशों की एक प्रणाली की संभावित ऊर्जा सभी युग्मों के बीच संभावित ऊर्जाओं का योग है।

चुनौती

एक स्ट्रिंग द्वारा दर्शाए गए इकाई प्रभार की एक प्रणाली की संभावित ऊर्जा का निर्धारण करें।

यह , इसलिए बाइट्स जीत में सबसे छोटा समाधान है।


इनपुट

एक अरिक्त बहु स्ट्रिंग केवल से मिलकर, +, -, , और नई-पंक्तियों प्रत्येक पंक्ति एक निरंतर चौड़ाई के साथ। +और -+1 और -1 क्रमशः के आरोप में प्रतिनिधित्व करते हैं। उदाहरण के लिए, निम्नलिखित स्ट्रिंग:

    + -
 +     

(मूल से ऊपर-बाएं विचार करना) एक प्रणाली को सकारात्मक आरोपों (4,0) और (1, -1) और एक नकारात्मक आवेश (6,0) पर दर्शाती है।

वैकल्पिक रूप से, आप इनपुट को लाइनों की सूची के रूप में ले सकते हैं।

उत्पादन

आरोपों की प्रणाली की संभावित ऊर्जा का प्रतिनिधित्व करने वाला एक हस्ताक्षरित वास्तविक संख्या। आउटपुट चार महत्वपूर्ण आंकड़ों या 10 -4 के लिए सही होना चाहिए , जो भी कम है।

परीक्षण के मामलों:

   - 
     

आउटपुट चाहिए 0। रीपेल या आकर्षित करने के लिए चार्ज के जोड़े नहीं हैं, और व्हाट्सएप कुछ भी नहीं बदलता है।

+  
  -

केवल दो आरोप हैं; वे ऊर्ध्वाधर दिशा में 1 यूनिट दूर और क्षैतिज दिशा में 2 यूनिट दूर हैं, इसलिए उनकी दूरी sqrt (5) है। आउटपुट -1 / sqrt (5) = होना चाहिए -0.447213595

+       -
-       +

देना चाहिए -2.001930531

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

देना चाहिए -22.030557890

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

देना चाहिए 26.231088767


1
समय-समय पर सीमा की शर्तों को लागू करने और मैडेलंग ऊर्जा की गणना के लिए अंक।
एंड्रास डीक

1
@AndrasDeak यह दिलचस्प होगा।
lirtosiast

जवाबों:


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

CJam, 51 वर्ण

सभी जोड़ियों को गिनना, फ़िल्टर 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
तो स्पष्टीकरण TBA है? : P
R

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दो ऐसे त्रिगुणों के सभी संयोजनों के लिए संभावित ऊर्जा की गणना करता है जो समान नहीं हैं, उन्हें समेटता है और परिणाम को विभाजित करता है 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)]और इस सूची के साथ प्रत्येक नए शुल्क की तुलना करता है, इसे सूची में शामिल करने से पहले।

इनपुट के सभी स्पेस को कॉमा से बदल दिया जाता है। यह उनके एससीआई कोड से 44 घटाकर निम्नलिखित कार्य को सक्षम बनाता है:

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

MATL , 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 बाइट्स को अपडेट करें: यदि लूप के लिए टेबल में डालने के बाद स्टेटमेंट को पूरी तरह से हटाया जा सकता है, तो काफी बाइट्स की बचत होती है।


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[{" - -- -+ - - -+-++-+", " +-- + +-- + ++-++ -", 
  "---++-+-+- -+- - +- ", "-- - -++-+  --+  +  ", 
  "-   + --+ ++-+  +-  ", "--  ++- + +  -+--+  ", 
  "+ +++-+--+ +--+++ + ", "-+- +-+-+-+  -+ +--+", 
  "- +-+- +      ---+  ", "-     - ++ -+- --+--"}]

-२२.०३,०५,५७,८९०

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.