Skip to content

Commit 5eb7a36

Browse files
committed
PHP and Javascript solutions to freshly added easy challenge #123 - Efficient Delivery (still a little buggy on oil-to-be-added calculation)
1 parent 59d049d commit 5eb7a36

File tree

6 files changed

+279
-0
lines changed

6 files changed

+279
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// https://www.codeeval.com/open_challenges/123/
2+
var solutions = null;
3+
var min_diff = 0;
4+
5+
function efficient_delivery( tankers, idx, oil, allocation){
6+
7+
if( oil > 0 ){
8+
var capacity = tankers[idx];
9+
var nb = tankers.length;
10+
var last_tanker = false;
11+
if( capacity ){
12+
var cnt = Math.floor(oil / capacity);
13+
var rest = oil%capacity;
14+
15+
if( idx == (nb-1) ){
16+
last_tanker = true;
17+
18+
if( rest === 0 ){
19+
allocation[idx] = cnt;
20+
oil = 0;
21+
}
22+
else{
23+
oil -= cnt * capacity;
24+
}
25+
}
26+
else{
27+
for(var i = 0; i <= cnt ; i++ ){
28+
29+
var new_allocation = [];
30+
for( var a in allocation){
31+
new_allocation[a] = allocation[a];
32+
}
33+
new_allocation[idx] = i;
34+
efficient_delivery(tankers, idx + 1, oil - i * capacity, new_allocation);
35+
}
36+
}
37+
}
38+
39+
if( last_tanker && oil>0 ){
40+
41+
// no more tankers available
42+
// amount of oil left < amount possible on a tanker
43+
var diff = Number.POSITIVE_INFINITY;
44+
for( var t in tankers ){
45+
if( oil < tankers[t] ){
46+
diff = tankers[t] - oil;
47+
}
48+
}
49+
if( diff < min_diff ){
50+
min_diff = diff;
51+
}
52+
// console.log(min_diff);
53+
}
54+
}
55+
56+
if( oil === 0 ){
57+
// oil = 0
58+
// ok
59+
allocation.reverse();
60+
solutions.push( allocation.join(',') );
61+
}
62+
}
63+
64+
65+
66+
function solution_cmp(a,b){
67+
a = a.split(',');
68+
b = b.split(',');
69+
var aa = '';
70+
var bb = '';
71+
for(var i=0, cnt=a.length ; i < cnt ; i++){
72+
aa += new Array(5 - a[i].length).join('0') + a[i];
73+
bb += new Array(5 - b[i].length).join('0') + b[i];
74+
}
75+
return aa > bb ? 1 : -1;
76+
}
77+
78+
79+
var fs = require("fs");
80+
fs.readFileSync(process.argv[2]).toString().split('\n').forEach(function (line) {
81+
line = line.trim();
82+
if( line !== '' ){
83+
// console.log(line);
84+
var tmp = line.split(', ');
85+
var tankers = tmp[0];
86+
var oil = Number(tmp[1]);
87+
tankers = tankers.substr(1,tankers.length-2).split(',').reverse();
88+
89+
min_diff = oil - 1;
90+
solutions = [];
91+
92+
for(var i=0, cnt=tankers.length; i < cnt ; i++){
93+
tankers[i] = Number(tankers[i]);
94+
}
95+
96+
efficient_delivery( tankers, 0, oil, new Array( tankers.length + 1 ).join('0').split('') );
97+
var result = '';
98+
if( solutions.length ){
99+
solutions.sort(solution_cmp);
100+
for(var s=0, max=solutions.length; s < max ; s++){
101+
result += '[' + solutions[s] + ']';
102+
}
103+
}
104+
else{
105+
result = min_diff;
106+
}
107+
console.log(result);
108+
}
109+
});
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
<?php
2+
header('Content-Type: text/plain; charset=utf-8');
3+
4+
// https://www.codeeval.com/open_challenges/123/
5+
6+
if( isset($_GET['f_i_l_e']) && $_GET['f_i_l_e'] ) $argv[1] = $_GET['f_i_l_e'];
7+
8+
function efficient_delivery($tankers, $idx, $oil, $allocation){
9+
global $solutions, $min_diff;
10+
if( $oil > 0 ){
11+
$capacity = $tankers[$idx];
12+
$nb = count($tankers);
13+
$last_tanker = false;
14+
if( $capacity ){
15+
$cnt = ($oil / $capacity)|0;
16+
$rest = $oil - $cnt * $capacity;
17+
18+
if( $idx == ($nb-1) ){
19+
$last_tanker = true;
20+
21+
if( $rest === 0 ){
22+
$allocation[$idx] = $cnt;
23+
$oil = 0;
24+
}
25+
else{
26+
$oil -= $cnt * $capacity;
27+
}
28+
29+
}
30+
else{
31+
for($i = 0; $i <= $cnt ; $i++ ){
32+
$allocation[$idx] = $i;
33+
efficient_delivery($tankers, $idx+1, $oil - $i * $capacity, $allocation);
34+
}
35+
}
36+
}
37+
38+
if( $last_tanker && $oil ){
39+
// no more tankers available
40+
// amount of oil left < amount possible on a tanker
41+
$diff = INF;
42+
for($i = 0; $i < $nb ; $i++ ){
43+
if( $oil < $tankers[$i] ){
44+
$diff = $tankers[$i] - $oil;
45+
}
46+
}
47+
if( $diff < $min_diff ){
48+
$min_diff = $diff;
49+
}
50+
}
51+
}
52+
53+
if( $oil === 0 ){
54+
// oil = 0
55+
// ok
56+
// print_r($allocation);
57+
$solutions[] = array_reverse($allocation);
58+
}
59+
}
60+
61+
62+
63+
// $t0 = microtime(true);
64+
65+
function solution_cmp($a,$b){
66+
$aa = $bb = '';
67+
for($i=0, $cnt=count($a);$i<$cnt;$i++){
68+
$aa .= sprintf('%04d', $a[$i]);
69+
$bb .= sprintf('%04d', $b[$i]);
70+
}
71+
return $aa > $bb ? 1 : -1;
72+
}
73+
74+
if( isset($argv[1]) && $argv[1] ){
75+
$filename = $argv[1];
76+
if( file_exists($filename) ){
77+
if( is_readable($filename) ){
78+
$fp = fopen($filename, 'r');
79+
if( $fp ){
80+
while ( $fp && !feof( $fp ) ) {
81+
$line = trim(fgets($fp));
82+
if( $line ){
83+
list($tankers, $oil) = explode(', ', $line);
84+
$tankers = array_reverse(explode(',',substr($tankers,1,-1)));
85+
$solutions = array();
86+
$min_diff = $oil;
87+
// print_r($tankers);
88+
// echo $oil ."\n";
89+
efficient_delivery($tankers, 0, $oil, array_fill(0,count($tankers),0) );
90+
if( $solutions ){
91+
usort($solutions,'solution_cmp');
92+
for($i=0, $cnt=count($solutions); $i < $cnt ; $i++){
93+
echo '['.implode(',', $solutions[$i]).']';
94+
}
95+
echo "\n";
96+
}
97+
else{
98+
echo $min_diff . "\n";
99+
}
100+
}
101+
}//
102+
fclose( $fp );
103+
}
104+
else{
105+
echo '!fp'."\n";
106+
}
107+
}
108+
else{
109+
echo '!readable'."\n";
110+
}
111+
}
112+
else{
113+
echo '!file_exists'."\n";
114+
}
115+
}
116+
else{
117+
echo '!argv[1]'."\n";
118+
}
119+
120+
// echo (microtime(true) - $t0) . "\n";
121+
122+
exit(0);
123+
124+
?>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(2,5), 12
2+
(6,9,20), 44
3+
(197,8170), 155862
4+
(2,4,8), 8
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(197,8170), 155862
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
(193,479,614,690), 7138
2+
(2716,6130,7782), 168116
3+
(958,1645,5534), 169731
4+
(423,826,949,960), 10638
5+
(97,330,666,715,951), 5155
6+
(145,537,768,915), 3754
7+
(175,235,249,363,715), 3460
8+
(86,327,875,895,911), 6410
9+
(81,549,571,777), 3238
10+
(6,9,20), 44
11+
(180,419,755,962), 5012
12+
(422,589,633,920,934), 8253
13+
(1626,2222,9244), 140756
14+
(180,196,316,523,956), 2588
15+
(243,478,493,819), 7655
16+
(2,294,298,817), 2219
17+
(118,135,431,879,987), 2718
18+
(2,4,8), 8
19+
(69,892,973,979), 7226
20+
(131,416,586,670,936), 3067
21+
(197,8170), 155862
22+
(278,484,562,596), 2198
23+
(277,674), 121318
24+
(183,342,410,526), 4327
25+
(5,487,724,805,813), 904
26+
(102,214,611,748), 3574
27+
(511,516,734,759,829), 8767
28+
(74,265,471,713), 4207
29+
(266,542,732,909), 5451
30+
(1447,3779,9197), 175226
31+
(2,5), 12
32+
(14,118,319,711), 889
33+
(164,514,871,897,975), 3006
34+
(407,653,942,998), 11316
35+
(359,387,589,791), 24415
36+
(58,222,721,777,956), 2466
37+
(68,98,651,733,929), 733
38+
(253,1979,5415), 143535
39+
(168,176,437,774,834), 4220
40+
(488,605,703,891,946), 5045
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
(6,9,20), 44

0 commit comments

Comments
 (0)