キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2011.09.12 21:55|カテゴリ:Googleコメント(0)

[GDD2011][DevQuiz]スライドパズルをPerlで解く


 ついに終了しましたDevQuiz。最終的に私のスコアは146.55点。四捨五入で146.6点という表記になっております。

 さっそくソース晒しまつりが進行中ですので乗り遅れないように晒したいと思います。

 まだまだ改善の余地はありますがとりあえず提出した最終ソースです。ちなみに手数のカウントはしていませんw 手数をチェックするプログラムは別にあるんですけどほとんど使いませんでした。

 スライドパズルの挑戦開始が実質8日スタートで、その時点で先行組の方々のツイートに

「4000問解答してもまだ手数がそれぞれ2万手くらい余ってる」

 と言うツィートを発見したので、

「じゃあ、手数のことなんて考えなくっていいや」

 と手抜きした次第です。

 さて今回のクイズに挑戦する上での基本的な方針は以下のとおり、

1 LRやUDなど移動元に戻るなんて動きは当然除外
2 マップの状態をテーブルにストックして同一局面になったものは除外
3 各局面で次ループに残す局面はマンハッタン距離でソート

 以上の3点です。正直上記以外のことはしていないっす。まあこれくらいの実装でガリッとまわせば結果4000問くらいはすぐ解答できるということですね。

 それではソースの簡単な説明に入ります。マップデータは例のごとくから読み込んでいます。実際に提出したソースには5000問全部記述していますが今回のサンプルでは200問目まで記述しています。

※ソースが長いので以下のソースを他のテキストエディタなどにコピペしてソース以下の解説を読むほうがわかりやすいかとおもわれます( ̄▽ ̄;

※ソースのダウンロードはこちら

#!/usr/bin/perl
use utf8; #-ソースがUTF8だという宣言
use Encode;
use strict;
binmode STDOUT, ":utf8"; #-画面に出力したい文字コード
binmode STDERR, ":utf8"; #-エラー出力に使いたい文字コード
binmode STDIN, ":utf8"; #-標準入力から入ってくる文字コード

our %ans;

our %myValues = (
'1' => 1,
'2' => 2,
'3' => 3,
'4' => 4,
'5' => 5,
'6' => 6,
'7' => 7,
'8' => 8,
'9' => 9,
'A' => 10,
'B' => 11,
'C' => 12,
'D' => 13,
'E' => 14,
'F' => 15,
'G' => 16,
'H' => 17,
'I' => 18,
'J' => 19,
'K' => 20,
'L' => 21,
'M' => 22,
'N' => 23,
'O' => 24,
'P' => 25,
'Q' => 26,
'R' => 27,
'S' => 28,
'T' => 29,
'U' => 30,
'V' => 31,
'W' => 32,
'X' => 33,
'Y' => 34,
'Z' => 35,
'=' => '='
);

#--入力データを分解
my @buffer = ();
@buffer = ;
map {chomp $_} @buffer;


#--各種パラメータを設定
our ($LMAX,$RMAX,$UMAX,$DMAX) = split(/ /,shift(@buffer));
my $QCount = shift(@buffer);
my @lineData;
our $Width;
our $Height;
our @Zahyo;
my @myMap;
my $i = 0;
my $j = 0;
my $Pacman = {};
my $AnsText = '';
my $count = 0;
my $max = 0;
my $mapData;
$|=1;
for (@buffer) {
$AnsText = '';
$Pacman = {};
undef @lineData;
undef @myMap;
undef @Zahyo;
@lineData = split(/,/,$_);
$Width = shift(@lineData);
$Height = shift(@lineData);
$max = $Width * $Height;
$count++;

$Width--;
$Height--;
$mapData = shift(@lineData);
@lineData = split(//,$mapData);
$i=0;
for ($i=0;$i<=$Height;$i++) {
for ($j=0;$j<=$Width;$j++) {
$myMap[$i][$j] = shift(@lineData);
push(@Zahyo,$j . ':' . $i);
if ($myMap[$i][$j] eq '0') {
$Pacman->{'StartX'} = $j;
$Pacman->{'StartY'} = $i;
$Pacman->{'X'} = $Pacman->{'StartX'};
$Pacman->{'Y'} = $Pacman->{'StartY'};
$Pacman->{'mapData'} = $mapData;
$Pacman->{'mvoe'} = 'null';
$Pacman->{'history'} = '';
$Pacman->{'manhattan'} = 100;
}
}
}

my $Tansaku = 0;
my $eos = 1;
my @Pacmans = ();
my @tmpPacmans;
my $tmpPacman;
my @swapPacmans;
my $Add;
push(@Pacmans,$Pacman);
my %histMap;
while ($eos and $Tansaku < 200) {
$Tansaku++;
undef (@swapPacmans);
$Add = 0;
for (@Pacmans) {
undef (@tmpPacmans);
@tmpPacmans = &movePacman($_);
for $tmpPacman (@tmpPacmans) {
if (defined($histMap{$tmpPacman->{mapData}})) {
next;
} else {
$histMap{$tmpPacman->{mapData}} = 1;
}
$tmpPacman->{'manhattan'} = &getManhattan($tmpPacman,$Tansaku);
push(@swapPacmans,$tmpPacman);
if ($tmpPacman->{'X'} == $Width and $tmpPacman->{'Y'} == $Height) {
if (&checkMap($max,$tmpPacman)) {
$eos = 0;
print $count . ' : ' . $tmpPacman->{'history'} . "\n";
last;
}
}
}
last if ($eos == 0);
}
undef (@Pacmans);
@Pacmans = sort mySort (@swapPacmans);
#しきい値:とりあえずここを変更して調整してみる
splice(@Pacmans,41);
undef (@swapPacmans);
}
if ($eos != 0) {
print "$count : \n";
}
undef @Pacmans;
undef @tmpPacmans;
undef @swapPacmans;
undef %histMap;
}

sub mySort() {
$a->{'manhattan'} <=> $b->{'manhattan'};
}

sub getManhattan() {
my $Pacman = @_[0];
my $getZero = @_[1];
my @mapA = split(//,$Pacman->{'mapData'});
my $Xa;
my $Xb;
my $Ya;
my $Yb;
my $manhattanA = 0;
my $i = 0;
for ($i=0;$i<@mapA;$i++) {
next if ($mapA[$i] eq '=');
next if ($mapA[$i] eq '0');
$Xa = substr($Zahyo[$i],0,1);
$Ya = substr($Zahyo[$i],-1);
$Xb = substr($Zahyo[$myValues{$mapA[$i]}-1],0,1);
$Yb = substr($Zahyo[$myValues{$mapA[$i]}-1],-1);
$manhattanA = $manhattanA + abs($Xa-$Xb) + abs($Ya-$Yb);
}
return $manhattanA;
}

sub movePacman() {
my $Pacman = @_[0];
my $U;
my $D;
my $R;
my $L;
my @Pacmans = ();
my @lineData = split(//,$Pacman->{'mapData'});
my @myMap;

#現状のマップを展開
my $count = 0;
for ($i=0;$i<=$Height;$i++) {
for ($j=0;$j<=$Width;$j++) {
$myMap[$i][$j] = shift(@lineData);
}
}

#上に移動
$U = $Pacman->{'Y'} - 1;
if ($U > -1 and $Pacman->{'move'} ne 'D') {
if ($myMap[$U][$Pacman->{'X'}] ne '=') {
push(@Pacmans,&makePacman($Pacman,$Pacman->{'X'},$U,'U',@myMap));
}
}

#下に移動
$D = $Pacman->{'Y'} + 1;
if ($D <= $Height and $Pacman->{'move'} ne 'U') {
if ($myMap[$D][$Pacman->{'X'}] ne '=') {
push(@Pacmans,&makePacman($Pacman,$Pacman->{'X'},$D,'D',@myMap));
}
}

#右に移動
$R = $Pacman->{'X'} + 1;
if ($R <= $Width and $Pacman->{'move'} ne 'L') {
if ($myMap[$Pacman->{'Y'}][$R] ne '=') {
push(@Pacmans,&makePacman($Pacman,$R,$Pacman->{'Y'},'R',@myMap));
}
}

#左に移動
$L = $Pacman->{'X'} - 1;
if ($L > -1 and $Pacman->{'move'} ne 'R') {
if ($myMap[$Pacman->{'Y'}][$L] ne '=') {
push(@Pacmans,&makePacman($Pacman,$L,$Pacman->{'Y'},'L',@myMap));
}
}

return @Pacmans;
}

#-入るべき値の計算
sub trueValue() {
my $X = shift(@_);
my $Y = shift(@_);
return $Y * $Height + $X + 1;
}

#-次世代パックマンの生成
sub makePacman() {
my $Parent = shift(@_);
my $newX = shift(@_);
my $newY = shift(@_);
my $move = shift(@_);
my $Pacman;
my $mTmp = '';
my @lineData = split(//,$Parent->{'mapData'});
my @myMap;
#現状のマップを展開
for ($i=0;$i<=$Height;$i++) {
for ($j=0;$j<=$Width;$j++) {
$myMap[$i][$j] = shift(@lineData);
}
}

#マップの値を入れ替える
$mTmp = $myMap[$newY][$newX];
$myMap[$Parent->{'Y'}][$Parent->{'X'}] = $mTmp;
$myMap[$newY][$newX] = '0';

$Pacman->{'X'} = $newX;
$Pacman->{'Y'} = $newY;
$Pacman->{'move'} = $move;
$Pacman->{'history'} = $Parent->{'history'} . $move;
$Pacman->{'mapData'} = '';

#mapDataの取得
for (@myMap) {
for (@{$_}) {
$Pacman->{'mapData'} = $Pacman->{'mapData'} . $_;
}
}
return $Pacman;
}

sub checkMap() {
my $max = @_[0];
my $Pacman = @_[1];
my $nowValue = 0;
my $count = 0;
my @lineData = split(//,$Pacman->{'mapData'});
my @myMap;
#現状のマップを展開
for ($i=0;$i<=$Height;$i++) {
for ($j=0;$j<=$Width;$j++) {
$myMap[$i][$j] = shift(@lineData);
}
}

for (@myMap) {
for (@{$_}) {
$count++;
next if ($_ eq '=');
if ($nowValue < $myValues{$_} ) {
$nowValue = $myValues{$_}
} elsif($count == $max) {
return 1;
} else {
return 0;
}
}
}
return 1;
}

exit;

__DATA__
72187 81749 72303 81778
5000
5,6,12=E4D9HIF8=GN576LOABMTPKQSR0J
6,5,238=I67E9MBC1AF05HJKRLNGPDQSTO
4,6,94827601A3BCD5JGMEFNHLKI
6,5,82935=174ABCD=RHTNJKFLI0PQSOGM
5,5,13O7D69E0ABC524LGJIFMN8HK
6,5,2395OI1AHB4C07KT6SJR8F=M=QEDGL
3,3,168452=30
5,5,1245A9I7JN03HDO6GCKF8BLEM
6,4,7154N=D23GMIJ=8L09KFAHBC
5,6,B61D5H=42C0398A=IPRJESKMNLQOTF
5,6,C35AF184=D=627JGN0SEQLI=HMRTPK
5,5,7143506F9NC28JABIMDKGLOEH
6,3,1E3BC620F5A987D=H4
5,5,806E91245K=3=AJ=7HIF=CMNO
3,6,17=42=580HFEABD9GC
4,5,5G3486F7092C1ADJEHBI
6,6,1A3B458J26EZKF09LUD7GCIOP==MNTVWXYSH
5,6,6123J07=A5===49HGIPFML=EO=RSTK
4,6,27681534ABFC0EGK9NHMDILJ
4,6,123456B7AF08EJKHL9MCIDGN
4,4,32465871FAC0=9BE
5,4,1258A674390IBEFGCHDJ
3,3,120743586
5,6,61A8420735B=EF9HGNIJLSTDMQRPOK
5,4,123456===ABHD0JCG=FE
5,6,26D5817403BAK9JCEMIFQGLNORSHTP
6,3,8EF0H27A146539DGBC
4,6,34B026751AD89FGKHE=N=CIM
6,3,79B2H=15E8GC4D30AF
6,4,21IA46EF035CDJK=BH978LMN
3,5,=B02564=3A7CD9E
4,6,1924D5387EB=H6M0IKNFLAJG
6,5,=F8G23D79==4R=0ON5PJH=T6QKL=IC
4,5,1B7390D6248AI5HCJGEF
6,5,=2B65CD78=IGJ=43FNQP0MOTKL9RSH
6,5,1374==92FEABJDGL=0KR8==CPQSTOI
6,3,7GDB24E19CH680F3A5
6,4,JD38B650AEGC97KIHM412FNL
4,5,A74C2318H5FBI0J6E9DG
6,4,490K35D78A=612=GHCEJ=MNI
3,4,1327A40=5B96
5,5,2CAF3D1864BE759G=IOJLM0NK
5,4,62C5371HAF=4I=J=098D
5,4,=G27=69I3ADHC0B4JFE8
3,4,5362190=B47A
3,6,1029365B8G4=HE7DFA
6,5,1234CB789=6IJDF=HTKLESO5PQMR0N
5,5,358092=BDA6HL=4GI1JFCMNOK
5,6,864A3M215970CDJGBIFERHSOKLNQTP
4,6,=6839574G=2=NFBKE=JMDHL0
3,6,016248597BF3HAEDGC
4,6,52649837M1AFDKEIBLCGJH0N
6,6,124A56893BCIE7FGYHKD=X0=J=RTNMPVZWUS
5,4,=7C8A=G204H3IJ5B9EDF
5,3,506AE418=D=32C7
4,4,82C=9B1E05736ADF
5,6,1C34=6H=AF2I=O9B7JE=G==SPLQ0RT
5,6,==48367A95B==K=LNIT0QMJEORG=HP
5,4,475A96218FB3G=JD0HCI
5,4,1B835C4JE2IH7ADG06F9
4,6,0285731B=64FDECAML=GIHNK
5,4,617FAB0825HCEJ34G9DI
4,5,398=1BF7250CD6JHAIGE
3,5,41=9506BA2C8=7E
5,6,1265A94FD8=370KQC=JERHMNTGL=PO
6,4,K7123=J===5BDFECH40M=NIG
5,5,243891=DC5B6G=AL==KJM0NOF
6,5,=2P735QAGJ=6DK4HNCL8E9OI0FRSMT
5,5,2D=45CGE9A178KJBH=F06LMON
4,5,561=H3A89D2CEJFG7B0I
5,5,8345A720=ELB6DFHCM=KI1GNO
5,6,=384J6K295B7ADEGMPCSLRH0F=TNOI
6,3,8F9GBE251A0C7D634H
3,6,30D516=28=9BF4HECG
5,3,2745ADC03E861B9
5,5,=85732D4J9G6I0EMCABKHL=FO
4,4,D7019834A2=5E6FC
6,4,A312HC8JE65B7D04GMFLK9NI
3,5,21=967D8054BEAC
6,3,==E93D470F=A8GHC65
3,5,=74A86E39BD20C5
4,6,=23467F85MNCAB90DKIGHJLE
3,5,=62743C0=A5B8DE
6,5,27956I1AC3E0D8K=4B=FRMTN=QSLOH
3,6,=B6342705EC9DG8FHA
6,4,172AF6E935BCKD04=I8LJGMN
5,5,61=E527F8D==J4AGH=KOLMN09
5,5,B684=L12I9C70D3NJFHAGMOKE
3,6,85120G436HC9DEF7BA
5,5,36BE47K5OF18=MN=2A9H=CIJ0
6,4,12340CE7BA6NKD9FM5J8=IGH
4,5,=C46=380F7A2B9GI=DJE
4,5,613D5278HAC4IE09FGBJ
4,5,135B26049AF8DEICH7JG
5,6,B6192G=435LDI=8QJN0AHCTKORMSPF
6,3,8045H6172CBG==9A3F
5,3,61=E902784=CDA5
5,4,67235HGB14I==98EJ0FA
6,3,782BC5GE934H1DFA06
5,3,2BA0E694531C=87
3,5,D42C7380915AB6E
6,4,12E46H73GFC580JMNB9ADLKI
5,6,===9467=5ABHC=F=DMONIJL0TQRKSP
5,6,3725891AE4=6CKJ==FDP=RI=T=N0MS
3,5,3692=80174BA=EC
5,6,N6C9A1G28537D4FBSEJKHRLIPQ0MOT
6,5,2L73A481=G=50QKFI6JMCHSTEDPORN
4,4,=B8764F025ACE9D3
6,4,==A45BE0F9G6J3M8=CD7LKNI
3,4,082A=3416B79
5,5,1395872CADBMOJ46IL0EFGHKN
5,6,1235A7BE4869DCFLHO0JQIGTKRMSNP
4,5,16C=D2A75E38HIF0J9GB
4,5,=280=934A67CHGBEDJFI
6,5,7124==F=0GOCAK3H9BDE===IJPQRST
3,4,=64387290=5B
6,6,12956A7E84BCDL3GMOKHF0INJV=SZUQPWXTY
6,5,=92=56=83=BC=E=HNTKRMPG0LQJSOI
4,6,9613CD2J0H45KF78ENIGLMBA
5,4,74F3A162BEGD058HCI9J
5,6,765AFC983J412=IHBDK0QMLONRGSTP
4,6,04B7258C196A=J=3EKNGHMIL
6,5,EF123=KD==4587GSNTQP=BH0JRMIOC
5,4,I28451703FDGC6AH9EJB
6,4,=9546C0LA7=NDE3MIH==2F8G
3,4,41=768502=B9
6,6,431E5=29F=H=0K8NS=7P=YMGDJ=B=O=QWZXU
6,4,E2B5L631FG0CN849MA7DJKIH
6,5,=93=I6=28AHOEJ==B0DKLNTCPQ=M5S
5,6,863492BDC51EHA=MR7JKGISNOLQTP0
4,6,==8B57C4IEM3DA6=9NJH=KF0
6,3,D149B582C0H6EFG73A
6,6,123B5C07846H=E9FANKPMGTZVQJRSUWXL=IO
3,5,2E=1784A0B56=9C
3,3,041853276
5,4,27===18IF06=J9DBGHAE
5,5,16===C9DB=827JKGIHMN=O0FE
5,5,2B45A613=N08=JELGIOK7CMHF
5,6,1C===G6IK97B2EAS8N0D=MRFJ=HPTO
5,5,82AI59L6E73CGD4BHNOF01MKJ
6,3,239=56B=0AGC7D1EFH
6,5,17K35=28=4ABDEFG=CJ0QMNIRLP=TO
3,5,345126CB807EA9D
4,5,123460=FJAG58HIB9DCE
5,6,1493572CFAB68E0LHGIDQNJOKRMSTP
6,5,3K4A==728B0CF9P=OHE1Q=TSDJLRIN
6,6,23AB6518J4C0L9DEGI7FMSNHPKRXZOVQWYUT
4,6,91==H06=2DA5LGE7M=CBKNJF
5,5,7135462=F9B=A0EGMLJKNHDIO
6,5,=E8H45=JA96BPF2=C0QL3M=IDK=STO
5,3,1345A2B==E670CD
4,5,=2476380AD=CI59FEHGJ
6,4,D2F4A5E387B6JK190ILGMHNC
6,5,183C567D=AMTP2=40BEKLHINQJ==GO
3,5,6983=4ED7201ACB
5,3,20716CD=9E=4A53
4,6,564812709=B3D==CH=NKLMJG
3,4,251B604=97A3
6,3,3198B2DC0GA4E7=H65
6,6,9D3GH67E25A418=MBIJ=VLCNPXRSTOWQ0YZU
5,5,=3C===729DIJ8FOL0MHNBGAEK
5,5,453AF2=H=81BCEDL6MKJ0INGO
6,6,12=46C780B5A==9G=I=KF=TORXL=NZPVWQYU
4,5,30481795AF2BDCHGE6IJ
6,3,012H457===3BDEFGC6
4,6,93421576D=FBLHMNEIK0JGC8
5,4,321==687AJBC=I9=0HEF
3,6,A51482C73DG9BEHF60
5,5,6280N19A5J=3=4KG7=EFCHLMO
5,4,B1=F4GA865720D9HC=EJ
6,4,D126CHJ=4=IG35BMLN79K0EF
6,6,12=6C4D78FBGP=AH59JLX==IKQ0==O=RWYZU
5,5,D14A9236857LCEFGIH=0BMNOK
5,3,9D568CA0247B31E
5,6,A94J82D7FK365PT1HEI0BCL=SMQGNR
5,6,==93=6784EL==JAQRSHINBG=FTMPK0
6,4,2JL4NB87MACI039FE51KDG6H
6,5,D7=456E890=H21=AGTPKL=NIQJR=CO
3,6,74=50=2E1AC8FBH=D9
4,4,41EC86079BA532FD
6,4,1A=56H8294CB7=KMNLD0GJFI
4,6,0B6=31782JCA9EKM5IHNGFDL
3,6,7534261=HAE0DB9=FC
5,6,1234A6==59CDJ==B=K0PGM=OTLQRSI
6,6,182=BC739A05DFKGH6PJLMNIVQRZTOWE=SYU
6,6,41M69A8KSG5C023DTR7JEBNXP=WOIUVYZHFL
4,6,=64G5723AB089==CDH=K=IMN
6,6,148NG=3AC50HP2DBELJ9WFOIQXK7MTVSYRUZ
6,5,F82BA6G1D35H7Q9CT0JEK=4I=LRSON
5,4,B124=6C=A037=EIGHF9J
6,6,D762B5AEL31I9NM=04=FHZC=Q8==TUPKVWXY
5,5,26B9=G4KAIH8E0J1CDF3==ON7
4,5,=76==DG2CH08IJ39BFEA
6,4,189M==372AB=D40KINGEJLFH
5,6,124956=3PACD80EMJTFSKGOHNBLRIQ
3,5,761243850DA9EBC
6,3,309AG41D765C28FBEH
3,5,745816039AC2=BE
5,4,=20AIC87D56394FBGHJE
4,6,2CB135=9E8A4=6KG0HFILMJN


072行目:ループ開始
073~104行目:問題データを読み込んでメモリに展開しています
※ちなみに前年のパックマンを流用したので局面を表す変数は$Pacmanですw
113行目:一番最初の空白を表すPacmanを設定。すべてはここから!
115~144行目:この部分が実際に経路探索をおこなっているループです
$Tansakuは何手まで計算するかの数値今回は200手まで計算しています。当然これ以上かかる場合は未解答になります
119行目:@Pacmanに入ってる局面を順番にチェックしていきます
121行目:評価対象の局面から導きだされる次の局面を@tmpPacmansに入れます
122行目:@tmpPacmansに入っている局面を評価します
123行目:局面のパターンをチェックし既に評価済みのパターンであればスキップ。未評価の局面パターンであれば局面チェック変数にフラグを立てます
128行目:評価局面でのマンハッタン距離を設定します
129行目:次ループの評価候補として@swapPacmanに値をストック
130行目:空白部分(数値の0)がマップの一番右下にある場合は解答チェックを行います。ここで正解がでれば問題クリアとなります
141行目:次ループの評価候補が入った@swapPacmansをマンハッタン距離でソートします
143行目:マンハッタン距離でソートした局面の上位を残して後は捨てます
サンプルでは上位40件を残してすてています。ここの値を大きくすればそれだけ検索領域が広がりますので正答率がたかまりますが、演算に時間とメモリが必要になります。

 実際に私が提出した解答は閾値を5000と10000で計算した結果に50000で計算した結果の一部をマージして送りました。サンプルの40のままでもサンプルにある200問のうち108問はは解答(最適解ではない)がでてくるので今回チャレンジクイズに挑戦しなかった人はさらっと動かしてみるとおもしろいやもしれません。

 以上がメインロジックの説明になります。後はそれぞれのサブルーチンのソースです。今回はルールがシンプルなのでソースの内容自体はそれほど難しくないかと思いますので割愛させていただきます。

 今回の反省点と導入したかったこと、

【マンハッタン距離の算出方法】
 まあわかっていた部分ではあるのですが各局面において全てのパネルの値を計算しています。実際は一つ前の局面からパネルは一つしか動いてないのでそこの部分だけを計算しなおせばいいのですが最初にこう書いてしまったので修正しないでやっちゃいました。局面のオブジェクトに移動履歴を残しているのでちょっと考えればすぐ実装できたんですけど面倒臭くてやりませんでした。修正していれば相当数のステップが削れるはず。

【双方向検索の導入】
 やればきっと早くなるとわかっていたのが解答局面からの逆検索。こちらは導入しようと思いつつも結局導入しませんでした。局面のストックには双方向検索にも使おうという考えもあってのことなんですが結局見送り。導入しなくてもそこそこの時間でそこそこの結果が得られてしまったのが主な理由です。

 あと考えたのは、最初に1だけをスパッとそろえるロジックを動かしてから探索するとか、同一マンハッタン距離がたくさんあった場合は値が違うものを優先するとか、まあ考えただけで実装してません、効果があるかもわかりませんし。

 今回のDevQuizはお知らせメールを華麗にスルーして一週間スタートが遅れるという無駄なスルースキルと、チャレンジクイズの5000問という物量が響きました。誰かのツイートでちらっとみたのですが日替わりで500問とかのほうがよかったかも。

 チャレンジクイズしょっぱなは0.6点だったのでどうしようかと途方に暮れたのはいい思い出。
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。