=begin
https :// ideone.com/OJiVYh の続き
入力オプションは "a1 b1 a2 b2 a3 b3 a4 b4 z"。 ex. "X Y X c1 Y c1 c2 c3 c4"
配線は手抜き
# NAND の SVG のオリジナルは
https :// ja.wikipedia.org/wiki/NAND%E3%82%B2%E3%83%BC%E3%83%88
https :// ja.wikipedia.org/wiki/NAND%E3%82%B2%E3%83%BC%E3%83%88#/media/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:NAND_ANSI_Labelled.svg
=end
ab = gets .split
exit if ab.size != 9
Logic = Struct .new ( :a , :b , :q , :stg , :x , :y , :no )
logics = [ ]
lHash = { 'x' => 0 ,'y' => 1 , 'c1' => 2 ,'c2' => 3 ,'c3' => 4 ,'c4' => 5 }
lName = % W{ X Y c1 c2 c3 c4 }
4 .times { | n|
logics << Logic.new ( lHash[ ab[ 2 * n] .downcase ] ,lHash[ ab[ 2 * n+ 1 ] .downcase ] ,false , false , - 1 ,- 1 , n )
}
logics[ lHash[ ab[ 8 ] .downcase ] - 2 ] .q = true
# ステージ調査
begin
lg = [ ]
logics.each { | s|
lg[ 2 * s.no ] = true if s.a < = 1
lg[ 2 * s.no + 1 ] = true if s.b < = 1
}
3 .times { | st|
sq = [ ]
4 .times { | i|
next if logics[ i] .stg
next unless lg[ 2 * i] && lg[ 2 * i+ 1 ]
logics[ i] .stg = st
sq << "c#{i+1}"
}
sq.each { | q|
ab.each_with_index { | s,i|
lg[ i] = true if s == q
}
}
}
end
# 座標決定
begin
max_stg = [ ]
logics.each { | s| max_stg[ s.stg ] = ( max_stg[ s.stg ] || 0 ) + 1 }
max_stg.size .times { | j|
si = 0
logics.each_with_index { | s,i|
next unless j == s.stg
s.x = s.stg * 120 * 2 + 20
s.y = si * 100 + 20
si + = 1
}
}
( max_stg.max - 1 ) .times { | n|
max_stg.each_with_index { | s,i|
next unless s == n + 1
logics.each { | x|
next unless x.stg == i
x.y + = 50 * ( s- n)
}
}
}
end
# SVG出力
# File.open( save_path, 'w:UTF-8' ){|fh|
print <<_EOT_
<svg xmlns:xlink="http://w...content-available-to-author-only...3.org/1999/xlink" xmlns="http://w...content-available-to-author-only...3.org/2000/svg" id="nand_logic"
width="#{120*8}"
height="#{50*8}"
>
<defs>
<g id="nand">
<path style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
d="M 40,5 L 40,6.4285714 L 40,43.571429 L 40,45 L 41.428571,45 L 60.47619,45 C 71.744098,45 80.47619,35.999955 80.47619,25 C 80.47619,14.000045 71.744099,5.0000002 60.47619,5 C 60.47619,5 60.47619,5 41.428571,5 L 40,5 z M 42.857143,7.8571429 C 50.834264,7.8571429 55.918368,7.8571429 58.095238,7.8571429 C 59.285714,7.8571429 59.880952,7.8571429 60.178571,7.8571429 C 60.327381,7.8571429 60.409227,7.8571429 60.446429,7.8571429 C 60.465029,7.8571429 60.471543,7.8571429 60.47619,7.8571429 C 70.236853,7.857143 77.142857,15.497098 77.142857,25 C 77.142857,34.502902 69.760662,42.142857 60,42.142857 L 42.857143,42.142857 L 42.857143,7.8571429 z" />
<g style="fill:none;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
<path d="M 41,15 L 15,15" />
<path d="M 41,35 L 15,35" />
<path d="M 88.11111,25 C 101.62222,25 105,25 105,25" />
<path d="M 88,25 A 4,4 0 1 1 80,25 A 4,4 0 1 1 88,25 z" />
</g>
</g>
</defs>
<style type="text/css">
.wire1{ stroke:black; stroke-width:2; stroke-opacity:1 }
.wire2{ stroke:blue; stroke-width:2; stroke-opacity:0.4; fill:none }
</style>
_EOT_
logics.each { | s|
puts % Q{ \t< use xlink:href="#nand" x="#{s.x}" y="#{s.y}" /> }
}
puts % Q{ < g font- weight="400" font- size="17px" > }
logics.each { | s|
puts % Q{ \t< text text- anchor="end" x="#{s.x+38}" y="#{s.y+10}" > a#{s.no+1}</text>}
puts % Q{ \t< text text- anchor="end" x="#{s.x+38}" y="#{s.y+32}" > b#{s.no+1}</text>}
puts % Q{ \t< text x="#{s.x+90}" y="#{s.y+21}" > c#{s.no+1}</text>}
}
puts " </g>"
puts % Q{ < g font- weight="bolder" font- size="20px" > }
logics.each { | s|
puts % Q{ \t< text text- anchor="end" x="#{s.x+12}" y="#{s.y+22}" > #{lName[s.a]}</text>} if s.a < 2
puts % Q{ \t< text text- anchor="end" x="#{s.x+12}" y="#{s.y+42}" > #{lName[s.b]}</text>} if s.b < 2
if s.q
puts % Q{ \t< path class ="wire1" d="M #{s.x+105},#{s.y+25} l 20,0" /> }
puts % Q{ \t< text x="#{s.x+112+20}" y="#{s.y+32}" > Z</ text> }
else
sno = s.no + 2
corner = s.no * 10
logics.each { | s2|
if s2.a == sno
puts % Q{ \t< path class ="wire2" d="M #{s.x+105},#{s.y+25} l #{50+corner},0 l 0,#{s2.y+15-s.y-25} L #{s2.x+15},#{s2.y+15}" /> }
end
if s2.b == sno
puts % Q{ \t< path class ="wire2" d="M #{s.x+105},#{s.y+25} l #{50+corner},0 l 0,#{s2.y+35-s.y-25} L #{s2.x+15},#{s2.y+35}" /> }
end
}
end
}
puts " </g>"
print <<_EOT_
</svg>
_EOT_
PWJlZ2luCgoJaHR0cHMgOi8vIGlkZW9uZS5jb20vT0ppVlloIOOBrue2muOBjQoJ5YWl5Yqb44Kq44OX44K344On44Oz44GvICAiYTEgYjEgYTIgYjIgYTMgYjMgYTQgYjQgeiLjgIIgZXguICJYIFkgWCBjMSBZIGMxIGMyIGMzIGM0IgoKCemFjee3muOBr+aJi+aKnOOBjQoKIyBOQU5EIOOBriBTVkcg44Gu44Kq44Oq44K444OK44Or44GvCmh0dHBzIDovLyBqYS53aWtpcGVkaWEub3JnL3dpa2kvTkFORCVFMyU4MiVCMiVFMyU4MyVCQyVFMyU4MyU4OApodHRwcyA6Ly8gamEud2lraXBlZGlhLm9yZy93aWtpL05BTkQlRTMlODIlQjIlRTMlODMlQkMlRTMlODMlODgjL21lZGlhLyVFMyU4MyU5NSVFMyU4MiVBMSVFMyU4MiVBNCVFMyU4MyVBQjpOQU5EX0FOU0lfTGFiZWxsZWQuc3ZnCgo9ZW5kCgoKCWFiID0gZ2V0cy5zcGxpdAoJZXhpdAlpZiBhYi5zaXplICE9IDkKCglMb2dpYyA9IFN0cnVjdC5uZXcoIDphLCA6YiwgOnEsIDpzdGcsIDp4LCA6eSwgOm5vICkKCWxvZ2ljcyA9IFtdCgoKCWxIYXNoID0geyAneCc9PjAsJ3knPT4xLCAnYzEnPT4yLCdjMic9PjMsJ2MzJz0+NCwnYzQnPT41IH0KCWxOYW1lID0gJVd7IFggWSBjMSBjMiBjMyBjNCB9CgoJNC50aW1lc3t8bnwKCQlsb2dpY3MgPDwgTG9naWMubmV3KCBsSGFzaFsgYWJbMipuXS5kb3duY2FzZSBdLGxIYXNoWyBhYlsyKm4rMV0uZG93bmNhc2UgXSxmYWxzZSwgZmFsc2UsIC0xLC0xLCBuICkKCX0KCWxvZ2ljc1sgbEhhc2hbIGFiWzhdLmRvd25jYXNlIF0tMiBdLnEgPSB0cnVlCgojIOOCueODhuODvOOCuOiqv+afuwoJYmVnaW4KCQlsZyA9IFtdCgkJbG9naWNzLmVhY2h7fHN8CgkJCWxnWzIqcy5ub10gICA9IHRydWUJaWYgcy5hIDw9IDEKCQkJbGdbMipzLm5vKzFdID0gdHJ1ZQlpZiBzLmIgPD0gMQoJCX0KCQkzLnRpbWVze3xzdHwKCQkJc3EgPSBbXQoJCQk0LnRpbWVze3xpfAoJCQkJbmV4dAlpZiBsb2dpY3NbaV0uc3RnCgkJCQluZXh0CXVubGVzcyBsZ1syKmldICYmIGxnWzIqaSsxXQoJCQkJbG9naWNzW2ldLnN0ZyA9IHN0CgkJCQlzcSA8PCAiYyN7aSsxfSIKCQkJfQoJCQlzcS5lYWNoe3xxfAoJCQkJYWIuZWFjaF93aXRoX2luZGV4e3xzLGl8CgkJCQkJbGdbaV0gPSB0cnVlCWlmIHMgPT0gcQoJCQkJfQoJCQl9CgkJfQoJZW5kCgkKCSMg5bqn5qiZ5rG65a6aCgliZWdpbgoJCW1heF9zdGcgPSBbXQoJCWxvZ2ljcy5lYWNoe3xzfCBtYXhfc3RnW3Muc3RnXSA9IChtYXhfc3RnW3Muc3RnXSB8fCAwKSArIDEgfQoJCW1heF9zdGcuc2l6ZS50aW1lc3t8anwKCQkJc2kgPSAwCgkJCWxvZ2ljcy5lYWNoX3dpdGhfaW5kZXh7fHMsaXwKCQkJCW5leHQJdW5sZXNzIGogPT0gcy5zdGcKCQkJCXMueCA9IHMuc3RnICogMTIwICogMiArIDIwIAoJCQkJcy55ID0gc2kgKiAxMDAgKyAyMAoJCQkJc2kgKz0gMQoJCQl9CgkJfQoJCShtYXhfc3RnLm1heC0xKS50aW1lc3t8bnwKCQkJbWF4X3N0Zy5lYWNoX3dpdGhfaW5kZXh7fHMsaXwKCQkJCW5leHQJdW5sZXNzIHMgPT0gbiArIDEKCQkJCWxvZ2ljcy5lYWNoe3x4fAoJCQkJCW5leHQJdW5sZXNzIHguc3RnID09IGkKCQkJCQl4LnkgKz0gNTAgKiAocy1uKQoJCQkJfQoJCQl9CgkJfQoJZW5kCgojIFNWR+WHuuWKmwojCUZpbGUub3Blbiggc2F2ZV9wYXRoLCAndzpVVEYtOCcgKXt8Zmh8CgkJcHJpbnQgPDxfRU9UXwo8c3ZnIHhtbG5zOnhsaW5rPSJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uMy5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi4zLm9yZy8yMDAwL3N2ZyIgaWQ9Im5hbmRfbG9naWMiCiAgIHdpZHRoPSIjezEyMCo4fSIKICAgaGVpZ2h0PSIjezUwKjh9Igo+CjxkZWZzPgoJPGcgaWQ9Im5hbmQiPgoJCTxwYXRoIHN0eWxlPSJmb250LXNpemU6bWVkaXVtO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1pbmRlbnQ6MDt0ZXh0LWFsaWduOnN0YXJ0O3RleHQtZGVjb3JhdGlvbjpub25lO2xpbmUtaGVpZ2h0Om5vcm1hbDtsZXR0ZXItc3BhY2luZzpub3JtYWw7d29yZC1zcGFjaW5nOm5vcm1hbDt0ZXh0LXRyYW5zZm9ybTpub25lO2RpcmVjdGlvbjpsdHI7YmxvY2stcHJvZ3Jlc3Npb246dGI7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6YmxhY2s7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjM7bWFya2VyOm5vbmU7dmlzaWJpbGl0eTp2aXNpYmxlO2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7ZW5hYmxlLWJhY2tncm91bmQ6YWNjdW11bGF0ZTtmb250LWZhbWlseTpCaXRzdHJlYW0gVmVyYSBTYW5zOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246Qml0c3RyZWFtIFZlcmEgU2FucyIKCQkJZD0iTSA0MCw1IEwgNDAsNi40Mjg1NzE0IEwgNDAsNDMuNTcxNDI5IEwgNDAsNDUgTCA0MS40Mjg1NzEsNDUgTCA2MC40NzYxOSw0NSBDIDcxLjc0NDA5OCw0NSA4MC40NzYxOSwzNS45OTk5NTUgODAuNDc2MTksMjUgQyA4MC40NzYxOSwxNC4wMDAwNDUgNzEuNzQ0MDk5LDUuMDAwMDAwMiA2MC40NzYxOSw1IEMgNjAuNDc2MTksNSA2MC40NzYxOSw1IDQxLjQyODU3MSw1IEwgNDAsNSB6IE0gNDIuODU3MTQzLDcuODU3MTQyOSBDIDUwLjgzNDI2NCw3Ljg1NzE0MjkgNTUuOTE4MzY4LDcuODU3MTQyOSA1OC4wOTUyMzgsNy44NTcxNDI5IEMgNTkuMjg1NzE0LDcuODU3MTQyOSA1OS44ODA5NTIsNy44NTcxNDI5IDYwLjE3ODU3MSw3Ljg1NzE0MjkgQyA2MC4zMjczODEsNy44NTcxNDI5IDYwLjQwOTIyNyw3Ljg1NzE0MjkgNjAuNDQ2NDI5LDcuODU3MTQyOSBDIDYwLjQ2NTAyOSw3Ljg1NzE0MjkgNjAuNDcxNTQzLDcuODU3MTQyOSA2MC40NzYxOSw3Ljg1NzE0MjkgQyA3MC4yMzY4NTMsNy44NTcxNDMgNzcuMTQyODU3LDE1LjQ5NzA5OCA3Ny4xNDI4NTcsMjUgQyA3Ny4xNDI4NTcsMzQuNTAyOTAyIDY5Ljc2MDY2Miw0Mi4xNDI4NTcgNjAsNDIuMTQyODU3IEwgNDIuODU3MTQzLDQyLjE0Mjg1NyBMIDQyLjg1NzE0Myw3Ljg1NzE0MjkgeiIgLz4KCQk8ZyBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpibGFjaztzdHJva2Utd2lkdGg6MjtzdHJva2UtbGluZWNhcDpidXR0O3N0cm9rZS1saW5lam9pbjptaXRlcjtzdHJva2Utb3BhY2l0eToxIj4KCQkJPHBhdGggZD0iTSA0MSwxNSBMIDE1LDE1IiAvPgoJCQk8cGF0aCBkPSJNIDQxLDM1IEwgMTUsMzUiIC8+CgkJCTxwYXRoIGQ9Ik0gODguMTExMTEsMjUgQyAxMDEuNjIyMjIsMjUgMTA1LDI1IDEwNSwyNSIgLz4KCQkJPHBhdGggZD0iTSA4OCwyNSBBIDQsNCAwIDEgMSA4MCwyNSBBIDQsNCAwIDEgMSA4OCwyNSB6IiAvPgoJCTwvZz4KCTwvZz4KPC9kZWZzPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLndpcmUxeyBzdHJva2U6YmxhY2s7IHN0cm9rZS13aWR0aDoyOyBzdHJva2Utb3BhY2l0eToxIH0KCS53aXJlMnsgc3Ryb2tlOmJsdWU7IHN0cm9rZS13aWR0aDoyOyBzdHJva2Utb3BhY2l0eTowLjQ7IGZpbGw6bm9uZSB9Cjwvc3R5bGU+CgpfRU9UXwoKCQlsb2dpY3MuZWFjaHt8c3wKCQkJcHV0cyAlUXtcdDx1c2UgeGxpbms6aHJlZj0iI25hbmQiIHg9IiN7cy54fSIgeT0iI3tzLnl9IiAvPn0KCQl9CgkJcHV0cyAlUXsgIDxnIGZvbnQtd2VpZ2h0PSI0MDAiIGZvbnQtc2l6ZT0iMTdweCIgPn0KCQlsb2dpY3MuZWFjaHt8c3wKCQkJcHV0cyAlUXtcdDx0ZXh0IHRleHQtYW5jaG9yPSJlbmQiIHg9IiN7cy54KzM4fSIgeT0iI3tzLnkrMTB9Ij5hI3tzLm5vKzF9PC90ZXh0Pn0KCQkJcHV0cyAlUXtcdDx0ZXh0IHRleHQtYW5jaG9yPSJlbmQiIHg9IiN7cy54KzM4fSIgeT0iI3tzLnkrMzJ9Ij5iI3tzLm5vKzF9PC90ZXh0Pn0KCQkJcHV0cyAlUXtcdDx0ZXh0IHg9IiN7cy54KzkwfSIgeT0iI3tzLnkrMjF9Ij5jI3tzLm5vKzF9PC90ZXh0Pn0KCQl9CgkJcHV0cyAiICA8L2c+IgoKCQlwdXRzICVReyAgPGcgZm9udC13ZWlnaHQ9ImJvbGRlciIgZm9udC1zaXplPSIyMHB4IiA+fQoJCWxvZ2ljcy5lYWNoe3xzfAoJCQlwdXRzICVRe1x0PHRleHQgdGV4dC1hbmNob3I9ImVuZCIgeD0iI3tzLngrMTJ9IiB5PSIje3MueSsyMn0iPiN7bE5hbWVbcy5hXX08L3RleHQ+fQlpZiBzLmEgPCAyCgkJCXB1dHMgJVF7XHQ8dGV4dCB0ZXh0LWFuY2hvcj0iZW5kIiB4PSIje3MueCsxMn0iIHk9IiN7cy55KzQyfSI+I3tsTmFtZVtzLmJdfTwvdGV4dD59CWlmIHMuYiA8IDIKCQkJaWYgcy5xCgkJCQlwdXRzICVRe1x0PHBhdGggY2xhc3M9IndpcmUxIiBkPSJNICN7cy54KzEwNX0sI3tzLnkrMjV9IGwgMjAsMCIgLz59CgkJCQlwdXRzICVRe1x0PHRleHQgeD0iI3tzLngrMTEyKzIwfSIgeT0iI3tzLnkrMzJ9Ij5aPC90ZXh0Pn0KCQkJZWxzZQoJCQkJc25vID0gcy5ubyArIDIKCQkJCWNvcm5lciA9IHMubm8gKiAxMAoJCQkJbG9naWNzLmVhY2h7fHMyfAoJCQkJCWlmIHMyLmEgPT0gc25vCgkJCQkJCXB1dHMgJVF7XHQ8cGF0aCBjbGFzcz0id2lyZTIiIGQ9Ik0gI3tzLngrMTA1fSwje3MueSsyNX0gbCAjezUwK2Nvcm5lcn0sMCBsIDAsI3tzMi55KzE1LXMueS0yNX0gTCAje3MyLngrMTV9LCN7czIueSsxNX0iIC8+fQoJCQkJCWVuZAoJCQkJCWlmIHMyLmIgPT0gc25vCgkJCQkJCXB1dHMgJVF7XHQ8cGF0aCBjbGFzcz0id2lyZTIiIGQ9Ik0gI3tzLngrMTA1fSwje3MueSsyNX0gbCAjezUwK2Nvcm5lcn0sMCBsIDAsI3tzMi55KzM1LXMueS0yNX0gTCAje3MyLngrMTV9LCN7czIueSszNX0iIC8+fQoJCQkJCWVuZAoJCQkJfQoJCQllbmQKCQl9CgkJcHV0cyAiICA8L2c+IgoKCQlwcmludCA8PF9FT1RfCjwvc3ZnPgpfRU9UXwoK
stdout
<svg xmlns:xlink="http://w...content-available-to-author-only...3.org/1999/xlink" xmlns="http://w...content-available-to-author-only...3.org/2000/svg" id="nand_logic"
width="960"
height="400"
>
<defs>
<g id="nand">
<path style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;fill:black;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
d="M 40,5 L 40,6.4285714 L 40,43.571429 L 40,45 L 41.428571,45 L 60.47619,45 C 71.744098,45 80.47619,35.999955 80.47619,25 C 80.47619,14.000045 71.744099,5.0000002 60.47619,5 C 60.47619,5 60.47619,5 41.428571,5 L 40,5 z M 42.857143,7.8571429 C 50.834264,7.8571429 55.918368,7.8571429 58.095238,7.8571429 C 59.285714,7.8571429 59.880952,7.8571429 60.178571,7.8571429 C 60.327381,7.8571429 60.409227,7.8571429 60.446429,7.8571429 C 60.465029,7.8571429 60.471543,7.8571429 60.47619,7.8571429 C 70.236853,7.857143 77.142857,15.497098 77.142857,25 C 77.142857,34.502902 69.760662,42.142857 60,42.142857 L 42.857143,42.142857 L 42.857143,7.8571429 z" />
<g style="fill:none;stroke:black;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1">
<path d="M 41,15 L 15,15" />
<path d="M 41,35 L 15,35" />
<path d="M 88.11111,25 C 101.62222,25 105,25 105,25" />
<path d="M 88,25 A 4,4 0 1 1 80,25 A 4,4 0 1 1 88,25 z" />
</g>
</g>
</defs>
<style type="text/css">
.wire1{ stroke:black; stroke-width:2; stroke-opacity:1 }
.wire2{ stroke:blue; stroke-width:2; stroke-opacity:0.4; fill:none }
</style>
<use xlink:href="#nand" x="20" y="70" />
<use xlink:href="#nand" x="260" y="20" />
<use xlink:href="#nand" x="260" y="120" />
<use xlink:href="#nand" x="500" y="70" />
<g font-weight="400" font-size="17px" >
<text text-anchor="end" x="58" y="80">a1</text>
<text text-anchor="end" x="58" y="102">b1</text>
<text x="110" y="91">c1</text>
<text text-anchor="end" x="298" y="30">a2</text>
<text text-anchor="end" x="298" y="52">b2</text>
<text x="350" y="41">c2</text>
<text text-anchor="end" x="298" y="130">a3</text>
<text text-anchor="end" x="298" y="152">b3</text>
<text x="350" y="141">c3</text>
<text text-anchor="end" x="538" y="80">a4</text>
<text text-anchor="end" x="538" y="102">b4</text>
<text x="590" y="91">c4</text>
</g>
<g font-weight="bolder" font-size="20px" >
<text text-anchor="end" x="32" y="92">X</text>
<text text-anchor="end" x="32" y="112">Y</text>
<path class="wire2" d="M 125,95 l 50,0 l 0,-40 L 275,55" />
<path class="wire2" d="M 125,95 l 50,0 l 0,60 L 275,155" />
<text text-anchor="end" x="272" y="42">X</text>
<path class="wire2" d="M 365,45 l 60,0 l 0,40 L 515,85" />
<text text-anchor="end" x="272" y="142">Y</text>
<path class="wire2" d="M 365,145 l 70,0 l 0,-40 L 515,105" />
<path class="wire1" d="M 605,95 l 20,0" />
<text x="632" y="102">Z</text>
</g>
</svg>