Project Euler 103

by uwi
@see http://projecteuler.net/index.php?section=problems&id=103
♥0 | Line 142 | Modified 2009-07-11 18:20:42 | MIT License
play

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/dIhn
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    // @see http://projecteuler.net/index.php?section=problems&id=103
    public class Euler103 extends Sprite {
        private var _tf : TextField;
  
        public function Euler103() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            _tf.appendText(solve().toString() + "\n");
            var g : int = getTimer();
            _tf.appendText((g - s).toString() + " ms\n");
        }
        
        private function choose3() : Array
        {
            var ret : Array = [];
            var a : Array = new Array(3)
            var b : Array = new Array(3);
            var used : int = 0;
            for(a[0] = 0;a[0] <= 6;a[0]++){
                used |= 1 << a[0];
            for(a[1] = 0;a[1] <= 6;a[1]++){
                if((used & (1 << a[1])) != 0)continue;
                if(a[0] > a[1])continue;
                used |= 1 << a[1];
            for(a[2] = 0;a[2] <= 6;a[2]++){
                if((used & (1 << a[2])) != 0)continue;
                if(a[1] > a[2])continue;
                used |= 1 << a[2];
            for(b[0] = 0;b[0] <= 6;b[0]++){
                if((used & (1 << b[0])) != 0)continue;
                if(a[0] > b[0])continue;
                used |= 1 << b[0];
            for(b[1] = 0;b[1] <= 6;b[1]++){
                if((used & (1 << b[1])) != 0)continue;
                if(b[0] > b[1])continue;
                used |= 1 << b[1];
            for(b[2] = 0;b[2] <= 6;b[2]++){
                if((used & (1 << b[2])) != 0)continue;
                if(b[1] > b[2])continue;
                if(a[0] < b[0] && a[1] < b[1] && a[2] < b[2])continue;
                    ret.push([a[0], a[1], a[2], b[0], b[1], b[2]]);
//                    _tf.appendText(a + "\t" + b + "\n");
                }
                used ^= 1 << b[1];
                }
                used ^= 1 << b[0];
                }
                used ^= 1 << a[2];
                }
                used ^= 1 << a[1];
                }
                used ^= 1 << a[0];
                }
            return ret;
        }
        
        private function choose2() : Array
        {
            var ret : Array = [];
            var a : Array = new Array(2);
            var b : Array = new Array(2);
            var used : int = 0;
            for(a[0] = 0;a[0] <= 6;a[0]++){
                used |= 1 << a[0];
            for(a[1] = 0;a[1] <= 6;a[1]++){
                if((used & (1 << a[1])) != 0)continue;
                if(a[0] > a[1])continue;
                used |= 1 << a[1];
            for(b[0] = 0;b[0] <= 6;b[0]++){
                if((used & (1 << b[0])) != 0)continue;
                if(a[0] > b[0])continue;
                used |= 1 << b[0];
            for(b[1] = 0;b[1] <= 6;b[1]++){
                if((used & (1 << b[1])) != 0)continue;
                if(b[0] > b[1])continue;
                if(a[0] < b[0] && a[1] < b[1])continue;
                    ret.push([a[0], a[1], b[0], b[1]]);
//                    _tf.appendText(a + "\t" + b + "\n");
                }
                used ^= 1 << b[0];
                }
                used ^= 1 << a[1];
                }
                used ^= 1 << a[0];
                }
           return ret;
        }
        
        private function solve() : int
        {
            var c2s : Array = choose2();
            var c3s : Array = choose3();
            
            var min : int = 999;
            var a : Array = new Array(7);
            var s : int = 0;
            for(a[0] = 11;a[0] <= 35;a[0]++){ s+= a[0];
            for(a[1] = a[0] + 1;a[1] < 50;a[1]++){ s += a[1];
            for(a[2] = a[1] + 1;a[2] < a[0] + a[1];a[2]++){ s += a[2];
            for(a[3] = a[2] + 1;a[3] < a[0] + a[1];a[3]++){ s += a[3];
            for(a[4] = a[3] + 1;a[4] < a[0] + a[1];a[4]++){ s += a[4]; if(s >= min){s -= a[4]; break;}
            for(a[5] = a[4] + 1;a[5] < a[0] + a[1];a[5]++){ s += a[5]; if(s >= min){s -= a[5]; break;}
            for(a[6] = a[5] + 1;a[6] < a[0] + a[1];a[6]++){ s += a[6]; if(s >= min){s -= a[6]; break;}
                var invalid : Boolean = false;
                for each(var c2 : Array in c2s){
                    if(a[c2[0]] + a[c2[1]] == a[c2[2]] + a[c2[3]]){
                        invalid = true;
                        break;
                    }
                }
                if(invalid){
                    s -= a[6];
                    continue;
                }
                
                for each(var c3 : Array in c3s){
                    if(a[c3[0]] + a[c3[1]] + a[c3[2]] == a[c3[3]] + a[c3[4]] + a[c3[5]]){
                        invalid = true;
                        break;
                    }
                }
                if(invalid){
                    s -= a[6];
                    continue;
                }
                
                /*
                if(a[0] + a[1] + a[2] <= a[5] + a[6]){
                    s -= a[6];
                    continue;
                }
                */
                
                if(a[0] + a[1] + a[2] + a[3] <= a[4] + a[5] + a[6]){
                    s -= a[6];
                    break;
                }
                
                _tf.appendText("" + a + "\t" + s + "\n");
                if(min > s)min = s;
            s -= a[6]; }
            s -= a[5]; }
            s -= a[4]; }
            s -= a[3]; }
            s -= a[2]; }
            s -= a[1]; }
            s -= a[0]; 
            if(s != 0){_tf.appendText("(ノ∀`)"); break;}
            }
            return min;
        }
    }
}