10
2
Good Afternoon Golfers,
Our challenge for today is inspired by XKCD comics 356 and 370. We're going to write a program to calculate the resistance of a group of resistors. A forewarning that this is nearly tough enough to warrant being a code challenge, however I think that there is a certain art to writing slightly more complex programs in a golfed format. The lowest amount of characters wins.
Calculating the resistance relies on the following two formulas:
- If the resistors are in series, the resistance is the sum of the each resistor's resistance
- If the resistors are in parallel, the resistance is the inverse of the sum of the inverse of the resistance of each resistor
So - for example:
Your challenge is to, in the least amount of characters possible, calculate the resistance of a group of up to 64 resistors. My apologies for the complexity, particularly of the input rules. I've attempted to define them in such a way that every language will be usable.
Each resistor will be connected to 2 or more other resistors.
The input is guaranteed to be valid, with only one entry and one exit point, which will connect
The network will be series-parallel to prevent requiring more maths then what is presented
Input will be via file, argument or stdin, depending on what is appropriate for your language.
Input will consist of a series of newline or forward slashed separated statements consisting of an integer of the resistance of the resistor, and spaces separating the IDs of the resistors that one side of the resistor is connected to.
The ID of the first resistor will be 1, incrementing by one for each successive resistor
The start will always have an ID of 0
The final resistor will always have a resistance of 0 ohms, and only have the connections defined in its line
For example:
Could be represented as
3 0
6 1
1 0
5 0
0 2 3 4
- Output can be to stdout or file. It may be represented in one of the following ways:
- A number with a minimum of 2 decimal places, followed by a newline
- A fraction consisting of an integer (the numerator), a forward slash and another integer (the denominator), followed by a newline. The fraction does not need to be the to be in its lowest form - 4/4 or 10/8 are, for instance acceptable. The fraction must be accurate within 1/100. There is no bonus for being perfectly accurate - this is provided is a crutch to enable languages without fixed or floating point operations to compete.
I hope that covers all the points. Good luck!
In example 1, how does 5 + 3 + 1 = 9 ohms? I don't think 2 = 1 yet. – ASCIIThenANSI – 2015-04-13T16:53:18.123
/
is not a backslash. Did you mean\\
or a forward slash? – John Dvorak – 2013-03-09T06:05:10.553Are we allowed to produce incorrect results if the input is not a series-parallel network? – John Dvorak – 2013-03-09T06:07:24.293
If there are two parallels in series, will it be represented as two resistors connected to the same two resistors (
1 0/1 0/1 1 2/1 1 2
)? – John Dvorak – 2013-03-09T06:11:36.443Slash fixed. My apologies. Yes - two parallels in series would be represented as you suggest. – lochok – 2013-03-09T06:19:41.767
The network will be a complete one, with a definite answer. What do you mean by not a series-parallel network? Example please? This might be something I missed – lochok – 2013-03-09T06:21:57.240
1
the Wheatstone bridge is not series-parallel if you replace the center voltmeter with a resistor
– John Dvorak – 2013-03-09T06:26:33.583OK - I see the issue. I thought that it might be an interesting mathematical issue - I didn't consider the details well enough. I will add that the circuit is guaranteed to be a series-parallel. – lochok – 2013-03-09T06:40:37.013
May I use forward slashes instead of newlines for input? It's hard to input newlines into a javascript prompt or command line arguments. – John Dvorak – 2013-03-09T07:44:21.117
Sounds reasonable. Added. – lochok – 2013-03-09T07:51:39.563
1will resistors always wire into those with a lower ID or they may be input in any order? Is
1 2/1 0/0 1
valid? – John Dvorak – 2013-03-09T08:07:12.5879The parallel example is wrong. It should be 15/23, not 15/8. – Peter Taylor – 2013-03-09T09:42:14.133
@ASCIIThenANSI where is 2=1? 5+3+1==9 as far as I know. – Stewie Griffin – 2017-11-02T07:43:00.107
@StewieGriffin It appears that two years ago, I clearly had no idea how to do math. :| Just looked it over again and 5+3+1 does equal 9. – ASCIIThenANSI – 2017-11-03T21:54:11.457