Tính kháng (Nerd Sniping)


10

Chào buổi chiều

Thử thách của chúng tôi cho ngày hôm nay được lấy cảm hứng từ truyện tranh XKCD 356370 . Chúng ta sẽ viết một chương trình để tính toán điện trở của một nhóm điện trở. Một sự cảnh báo trước rằng điều này gần như đủ khó khăn để đảm bảo là một thách thức mã, tuy nhiên tôi nghĩ rằng có một nghệ thuật nhất định để viết các chương trình phức tạp hơn một chút trong định dạng golf. Số lượng nhân vật thấp nhất sẽ thắng.

Tính toán điện trở dựa vào hai công thức sau:

  • Nếu các điện trở mắc nối tiếp, điện trở là tổng của điện trở của mỗi điện trở
  • Nếu các điện trở mắc song song thì điện trở là nghịch đảo của tổng nghịch đảo của điện trở của mỗi điện trở

Ví dụ:

Ví dụ về tính toán điện trở

Thử thách của bạn là, trong số lượng ký tự ít nhất có thể, tính toán điện trở của một nhóm có tới 64 điện trở. Tôi xin lỗi vì sự phức tạp, đặc biệt là các quy tắc đầu vào. Tôi đã cố gắng định nghĩa chúng theo cách mà mọi ngôn ngữ sẽ có thể sử dụng được.

  • Mỗi điện trở sẽ được kết nối với 2 hoặc nhiều điện trở khác.

  • Đầu vào được đảm bảo là hợp lệ, chỉ có một mục nhập và một điểm thoát, sẽ kết nối

  • Mạng sẽ song song nối tiếp để ngăn không yêu cầu nhiều toán hơn sau đó trình bày

  • Đầu vào sẽ thông qua tập tin, đối số hoặc stdin, tùy thuộc vào những gì phù hợp với ngôn ngữ của bạn.

  • Đầu vào sẽ bao gồm một loạt các câu lệnh được phân tách theo dòng mới hoặc chuyển tiếp được cắt bao gồm một số nguyên điện trở của điện trở và khoảng cách giữa ID của các điện trở mà một bên của điện trở được kết nối với.

  • ID của điện trở thứ nhất sẽ là 1, tăng thêm một cho mỗi điện trở kế tiếp

  • Bắt đầu sẽ luôn có ID là 0

  • Điện trở cuối cùng sẽ luôn có điện trở 0 ohms và chỉ có các kết nối được xác định trong dòng của nó

Ví dụ:

Ví dụ 2

Có thể được đại diện như

3 0
6 1
1 0
5 0
0 2 3 4
  • Đầu ra có thể là thiết bị xuất chuẩn hoặc tập tin. Nó có thể được trình bày theo một trong những cách sau:
    • Một số có tối thiểu 2 chữ số thập phân, theo sau là một dòng mới
    • Một phân số bao gồm một số nguyên (tử số), dấu gạch chéo về phía trước và một số nguyên khác (mẫu số), theo sau là một dòng mới. Phân số không cần phải ở dạng thấp nhất - 4/4 hoặc 10/8, chẳng hạn, có thể chấp nhận được. Phân số phải chính xác trong vòng 1/100. Không có phần thưởng cho việc hoàn toàn chính xác - điều này được cung cấp là một cái nạng để cho phép các ngôn ngữ mà không có hoạt động điểm cố định hoặc dấu phẩy động để cạnh tranh.

Tôi hy vọng rằng bao gồm tất cả các điểm. Chúc may mắn!


/không phải là dấu gạch chéo ngược. Ý của bạn là `\` hay một dấu gạch chéo về phía trước?
John Dvorak

Chúng tôi có được phép tạo ra kết quả không chính xác nếu đầu vào không phải là mạng song song?
John Dvorak

1
các cầu Wheatstone không phải là loạt song song nếu bạn thay thế các vôn kế trung tâm với một điện trở
John Dvorak

1
điện trở sẽ luôn nối với những người có ID thấp hơn hoặc họ có thể được nhập theo thứ tự nào? Có 1 2/1 0/0 1hợp lệ không?
John Dvorak

9
Ví dụ song song là sai. Nó phải là 15/23, không phải 15/8.
Peter Taylor

Câu trả lời:


6

APL 190

Nguồn gốc chỉ số 1. (Các) vòng đầu tiên kết hợp tất cả các điện trở được mắc nối tiếp, thứ hai (p) được nối song song và lặp lại với vòng lặp đầu tiên để kết hợp bất kỳ điện trở song song nào trong chuỗi. Các đặc điểm kỹ thuật của điện trở zero cuối cùng dường như là dư thừa.

r←¯1↓⍎¨(c≠'/')⊂c        
o←⊃↑¨r                  
r←⊃1↓¨r                 
s:→(0=+/n←1=+/×r)/p     
n←↑n/i←⍳↑⍴r             
o[n-1]←+/o[n-0 1]       
o←(i←n≠i)/o             
r←i⌿r                   
r←r-r≥n                 
→s                      
p:n←1⍪2≠/r[;1]          
r←((⍴r),1)⍴r←¯1++\n~0   
o←∊1÷¨+/¨1÷¨n⎕penclose o
→(1<⍴o)/s               
3⍕o                     
' '  

Đã kiểm tra các ví dụ trong câu hỏi cộng với một câu hỏi phức tạp hơn một chút:

      Input: '5 0/3 1/1 2/0 2'
 9.000

      Input: '3 0/1 0/5 0/0 1 2 3'
 0.652

      Input: '3 0/6 1/1 0/5 0/0 2 3 4'
 0.763

      Input: '2 0/2 1/2 0/2 0/2 4/2 5/2 2 3 6/2 7/2 2 3 6/0 8 9'
 2.424

Luôn luôn ngạc nhiên bởi các câu trả lời của APL - chúng trông hoàn toàn điên rồ. Điện trở cuối cùng chỉ là để cung cấp một cái gì đó cho các điện trở khác kết nối với - một liên kết kết thúc giả. Làm tốt!
lochok

Tôi nghĩ bạn có thể cứu một vài nhân vật. Thay thế hai dòng đầu tiên bằng o←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂c. Mô hình này được áp dụng ở một vài nơi.
FUZxxl

5

Python, 329 ký tự

import sys
N=[[1]]+[map(int,x.split())for x in sys.stdin]
N[-1][0]=1
n=len(N)
S=[set([i])for i in range(2*n)]
for x in range(n):
 C=S[2*x]
 for y in N[x][1:]:C|=S[2*y+1]
 for x in C:S[x]|=C
V=[0]*(2*n-1)+[1]
for k in range(999):
 for i in range(1,2*n-1):V[i]+=sum((V[j^1]-V[i])/N[j/2][0]for j in S[i])/9./len(S[i])
print 1/V[1]-2

Tính điện trở bằng cách làm giãn điện áp trên mạch. Đầu tiên, nó xử lý điện trở 1 ohm khi bắt đầu và thay đổi điện trở cuối từ 0 ohm thành 1 ohm. Sau đó, nó đặt điện áp đầu vào thành 0 và điện áp đầu ra là 1 volt. Sau khi mô phỏng dòng điện qua mạng, điện trở mạng được tính bằng cách sử dụng điện áp rơi trên điện trở 1 ohm đầu tiên.

Mỗi điện trở được cho hai số, số cho thiết bị đầu cuối bên trái và số cho thiết bị đầu cuối bên phải. Thiết bị đầu cuối bên trái của điện trở r là 2 * r và thiết bị đầu cuối bên phải của nó là 2 * r + 1. Đầu vào được sử dụng để tính toán S, các bộ thiết bị đầu cuối được kết nối với nhau. Mỗi thiết bị đầu cuối được cung cấp một điện áp V[t]và thư giãn được thực hiện bằng cách tăng điện áp nếu dòng điện được truyền vào một bộ thiết bị đầu cuối và hạ thấp điện áp nếu dòng điện bị chảy ra.


2

(Đây là một nhận xét, nhưng tôi không thể làm nghệ thuật ascii trong một nhận xét thực sự ...)

Làm thế nào là một cái gì đó như thế này nhập vào?

    --1--     --3--
   /     \   /     \
---       ---       --0--
   \     /   \     /
    --2--     --4--

Cụ thể, 3 và 4 được kết nối với cái gì? 1 hoặc 2, hoặc cả 1 và 2?


Cả một và hai
lochok
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.