Resistor mesh: Difference between revisions

Content added Content deleted
m (→‎{{header|zkl}}: comments)
m (→‎{{header|Perl 6}}: flatten output from cross operators)
Line 912: Line 912:
sub calc_diff(@v, @d, Int $w, Int $h) {
sub calc_diff(@v, @d, Int $w, Int $h) {
my $total = 0;
my $total = 0;
for ^$h X ^$w -> $i, $j {
for (flat ^$h X ^$w) -> $i, $j {
my @neighbors = grep *.defined, @v[$i-1][$j], @v[$i][$j-1], @v[$i+1][$j], @v[$i][$j+1];
my @neighbors = grep *.defined, @v[$i-1][$j], @v[$i][$j-1], @v[$i+1][$j], @v[$i][$j+1];
my $v = [+] @neighbors;
my $v = [+] @neighbors;
Line 929: Line 929:
force-v(@v);
force-v(@v);
$diff = calc_diff(@v, @d, $w, $h);
$diff = calc_diff(@v, @d, $w, $h);
for ^$h X ^$w -> $i, $j {
for (flat ^$h X ^$w) -> $i, $j {
@v[$i][$j] -= @d[$i][$j];
@v[$i][$j] -= @d[$i][$j];
}
}
}
}


for ^$h X ^$w -> $i, $j {
for (flat ^$h X ^$w) -> $i, $j {
@cur[ @fixed[$i][$j] + 1 ]
@cur[ @fixed[$i][$j] + 1 ]
+= @d[$i][$j] * (?$i + ?$j + ($i < $h - 1) + ($j < $w - 1));
+= @d[$i][$j] * (?$i + ?$j + ($i < $h - 1) + ($j < $w - 1));