Water collected between towers: Difference between revisions

Add Cowgol
(Added Wren)
(Add Cowgol)
Line 572:
(trapped-water [5 3 7 2 6 4 5 9 1 2]) ;; 14
</lang>
 
=={{header|Cowgol}}==
<lang cowgol>include "cowgol.coh";
include "argv.coh";
 
# Count the amount of water in a given array
sub water(towers: [uint8], length: intptr): (units: uint8) is
units := 0;
loop
var right := towers + length;
loop
right := @prev right;
if right < towers or [right] != 0 then
break;
end if;
end loop;
if right < towers then break; end if;
var blocks: uint8 := 0;
var col := towers;
while col <= right loop
if [col] != 0 then
[col] := [col] - 1;
blocks := blocks + 1;
elseif blocks != 0 then
units := units + 1;
end if;
col := @next col;
end loop;
if blocks < 2 then
break;
end if;
end loop;
end sub;
 
# Read list from the command line and print the answer
ArgvInit();
var towers: uint8[256];
var count: @indexof towers := 0;
var n32: int32;
loop
var argmt := ArgvNext();
if argmt == 0 as [uint8] then
break;
end if;
(n32, argmt) := AToI(argmt);
towers[count] := n32 as uint8;
count := count + 1;
end loop;
 
if count == 0 then
print("enter towers on command line\n");
ExitWithError();
end if;
 
print_i8(water(&towers[0], count as intptr));
print_nl();</lang>
 
{{out}}
 
<pre>$ ./water.386 1 5 3 7 2
2
$ ./water.386 5 3 7 2 6 4 5 9 1 2
14
$ ./water.386 2 6 3 5 2 8 1 4 2 2 5 3 5 7 4 1
35
$ ./water.386 5 5 5 5
0
$ ./water.386 5 6 7 8
0
$ ./water.386 8 7 7 6
0
$ ./water.386 6 7 10 7 6
0</pre>
 
=={{header|D}}==
2,094

edits