Project Euler 166
@see http://projecteuler.net/index.php?section=problems&id=166
♥0 |
Line 73 |
Modified 2009-08-04 00:49:05 |
MIT License
archived:2017-03-09 21:03:11
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/3ocB
*/
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.getTimer;
// @see http://projecteuler.net/index.php?section=problems&id=166
public class Euler166 extends Sprite {
private var _tf : TextField;
public function Euler166() {
_tf = new TextField();
_tf.width = 465;
_tf.height = 465;
addChild(_tf);
var s : int = getTimer();
t(solve());
var g : int = getTimer();
t((g - s) + " ms");
}
// 2つの対角線を最初に決めてしまうと、
// 残りは、4要素に対して4つの式がある状態が独立に2個できる。
// 条件下での4要素の取り得る個数を先に計算しておいて、
// あとは対角線の要素でループ
// O(10^7)
private function solve() : Number
{
var s22 : Array = new Array(19 * 19 * 19);
var i : int, j : int, k : int, a : int;
for(i = 0;i <= 18;i++){
for(j = 0;j <= 18;j++){
for(k = 0;k <= 18;k++){
var ct : int = 0;
for(a = 0;a <= 9;a++){
var b : int = i - a;
var c : int = k - a;
var d : int = j - c;
if(b >= 0 && b <= 9 && c >= 0 && c <= 9 && d >= 0 && d <= 9)ct++;
}
s22[(i * 19 + j) * 19 + k] = ct;
}
}
}
// d1 * * e1
// * d2 e2 *
// * e3 d3 *
// e4 * * d4
var d1 : int, d2 : int, d3 : int, d4 : int;
var e1 : int, e2 : int, e3 : int, e4 : int;
var c1 : int, c2 : int, c3 : int, c4 : int;
var code : int, s1 : int, s2 : int;
var gct : Number = 0;
for(d1 = 0;d1 <= 9;d1++){
for(d2 = 0;d2 <= 9;d2++){
for(d3 = 0;d3 <= 9;d3++){
for(d4 = 0;d4 <= 9;d4++){
for(e1 = 0;e1 <= 9;e1++){
for(e2 = 0;e2 <= 9;e2++){
for(e3 = 0;e3 <= 9;e3++){
e4 = d1 + d2 + d3 + d4 - e1 - e2 - e3;
if(e4 < 0 || e4 > 9)continue;
var s : int = d1 + d2 + d3 + d4;
c1 = s - d1 - e1;
c2 = s - d4 - e4;
c3 = s - d2 - e3;
c4 = s - d3 - e2;
if(c1 + c2 != c3 + c4)continue;
code = (c1 * 19 + c2) * 19 + c3;
s1 = s22[code];
c1 = s - d2 - e2;
c2 = s - d3 - e3;
c3 = s - d1 - e4;
c4 = s - d4 - e1;
if(c1 + c2 != c3 + c4)continue;
code = (c1 * 19 + c2) * 19 + c3;
s2 = s22[code];
gct += s1 * s2;
}}}}}}}
return gct;
}
private function t(o : *) : void
{
_tf.appendText("" + o + "\n");
}
}
}