Tiềm năng tĩnh điện của một hệ thống đơn giản


21

Trong vật lý, như điện tích đẩy lùi, và không giống như điện tích thu hút.

Năng lượng tiềm năng giữa hai điện tích đơn vị cách nhau một khoảng d1/dcho các điện tích giống như và -1/dkhông giống như các điện tích. Năng lượng tiềm năng của một hệ thống điện tích là tổng năng lượng tiềm năng giữa tất cả các cặp điện tích.

Thử thách

Xác định năng lượng tiềm năng của một hệ thống các đơn vị điện tích được biểu thị bằng một chuỗi.

Đây là , vì vậy giải pháp ngắn nhất tính bằng byte sẽ thắng.


Đầu vào

Một chuỗi rỗng multiline, bao gồm chỉ +, -, và dòng mới, với mỗi dòng một chiều rộng cố định. Các khoản phí +-đại diện tương ứng là +1 và -1. Ví dụ: chuỗi sau:

    + -
 +     

(coi phía trên bên trái là điểm gốc) biểu thị một hệ thống có điện tích dương tại (4,0) và (1, -1) và điện tích âm ở (6.0).

Ngoài ra, bạn có thể lấy đầu vào làm danh sách các dòng.

Đầu ra

Một số thực được ký đại diện cho năng lượng tiềm năng của hệ thống các khoản phí. Đầu ra phải chính xác đến bốn con số có ý nghĩa hoặc 10 -4 , tùy theo cái nào lỏng hơn.

Các trường hợp thử nghiệm:

   - 
     

Nên đầu ra 0. Không có cặp phí để đẩy lùi hoặc thu hút và khoảng trắng không thay đổi bất cứ điều gì.

+  
  -

Chỉ có hai khoản phí; chúng là 1 đơn vị đi theo hướng dọc và 2 đơn vị theo hướng ngang, vì vậy khoảng cách của chúng là sqrt (5). Đầu ra phải là -1 / sqrt (5) = -0.447213595.

+       -
-       +

Nên cho -2.001930531.

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

Nên cho -22.030557890.

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

Nên cho 26.231088767.


1
Điểm cộng để thực hiện các điều kiện biên định kỳ và tính toán năng lượng Madelung.
Andras Deak

1
@AndrasDeak Điều đó thật thú vị.
lirtosiast

Câu trả lời:


3

Bình thường, 34 byte

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

Trình diễn

Đầu tiên, chúng tôi chuyển đổi từng ký tự thành +1 cho +, -1 cho -và 0 cho . Sau đó, mỗi số được chú thích với vị trí của nó trong ma trận. Tại thời điểm này, chúng ta có một ma trận trông giống như:

[[[-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]]]

Mã đạt đến điểm này là .e+RkCUBxL" +"b.z

Sau đó, chúng tôi san phẳng ma trận này thành một danh sách và lấy tất cả các cặp có thể, với .cs ... 2.

Sau đó, anh ta tìm thấy khoảng cách giữa cặp với .atMdvà dấu hiệu của tiềm năng với *FhMd, chia và tổng.


6

CJam, 51 ký tự

Đếm tất cả các cặp, lọc Inf/NaNra và chia cho hai:

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

Ngoài ra, lọc tọa độ trước để chúng tôi đếm từng cặp một lần và không chạy vào Inf/NaN :

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

Giải thích (cũ)

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
Vậy giải thích là TBA? : P
Rɪᴋᴇʀ

2
Bạn đã viết điều này trong khi nó được hộp cát, hoặc bạn chỉ thực sự nhanh chóng?
lirtosiast

Tôi khá nhanh :) Phiên bản đầu tiên là "điều đơn giản nhất đã hoạt động", tôi chỉ mất vài phút để viết, vì vậy tôi đã ngay lập tức đăng nó, sau đó chơi golf trong nửa giờ tiếp theo.
Lynn

4

Haskell, 149 144 byte

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

Ví dụ sử dụng:

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

flà một danh sách của tất cả các bộ ba (x-coord, y-coord, unit charge). gtính toán năng lượng tiềm năng cho tất cả các kết hợp của hai bộ ba không bằng nhau, tính tổng chúng và chia kết quả cho 2.


3

Hồng ngọc, 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}

Duy trì một loạt các khoản phí trước đó dưới dạng bộ dữ liệu [charge, location(complex number)]và so sánh từng khoản phí mới với danh sách này, trước khi thêm nó vào danh sách.

Tất cả các khoảng trắng trong đầu vào được thay thế bằng dấu phẩy. Điều này cho phép gán sau bằng cách trừ 44 từ mã ascii của họ:

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

Việc chương trình được coi +là -1 và -là +1 không tạo ra sự khác biệt so với kết quả cuối cùng. Việc chương trình đi vào nỗ lực tính toán ảnh hưởng của các điện tích bằng 0 đối với các khoảng trắng không có gì khác biệt, ngoài việc làm chậm nó xuống một chút :-)

Ungolfed trong chương trình thử nghiệm

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 byte

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

Hoạt động trong phiên bản hiện tại (5.1.0) . Trình biên dịch chạy trên Matlab hoặc Octave.

Mỗi dòng là một đầu vào riêng biệt. Kết thúc được báo hiệu bằng cách nhập một dòng trống.

Ví dụ

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

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

Giải trình

`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

Lua, 293 255 246 228 byte

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)

Ouch, 228 byte ... Tôi có thể chơi golf này một cách đáng kể, nhưng tôi sẽ đăng nó ở đây bây giờ. Có thể cập nhật nó sau tối nay với một vài suy nghĩ và (hy vọng) một số cải tiến về chiều dài.

Ung dung

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)

Cập nhật 255 byte: Đã xóa hai đáy cũ cho các vòng lặp, việc xử lý hiện được thực hiện khi các chuỗi được thêm vào mảng chuỗi.

Cập nhật 246 Bytes: thay thế c=="+"or"-"==cvới c>" "theo đề nghị của Tên mẫu. Ý tưởng tuyệt vời, cảm ơn!

Cập nhật 228 byte: Nếu câu lệnh có thể được loại bỏ hoàn toàn bằng cách chèn vào bảng sau vòng lặp for, hãy lưu khá nhiều byte.


2

Toán học 223 byte

Vẫn chơi golf để làm.

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}]]

Trường hợp thử nghiệm cuối cùng:

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

-22.030557890

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.