サルベジオン社で宇宙船のデータを救え
#!/usr/bin/perl | |
use strict; | |
use warnings; | |
use utf8; | |
use bigint; | |
use LWP::Simple; | |
my $search_key = 208050656559285601386927895421059705239114932023754; # 探す key | |
my $min_index = 0; # index の下限 | |
my $max_index = 2 ** 100 - 1; # index の上限 | |
open my $log_file, '>', 'db1.log'; | |
my ( $key, $value, $search_index ); | |
while ( 1 ) { | |
# 上限と下限の中央の index | |
$index = int (( $max_index + $min_index ) / 2 ); | |
# print "$min_index < $search_index < $max_index\n"; | |
# WebAPI を用いて key と value を得る | |
( $key, $value ) = get_key_value( 1, $index ); | |
# print "$key $value\n"; | |
# key と一致したものを見つけたら抜ける | |
last if ( $key eq $search_key ); | |
if ( $key > $search_key ) { | |
# みつけた key が探している key よりも大きい | |
# ということは探している key はもっと下にある | |
# 上半分は無視して下のほうを探す | |
# print "-> $key > $search_key\n"; | |
$max_index = $index; | |
} else { | |
# 逆にみつけた key が探している key よりも小さい | |
# ということは探している key はもっと上にある | |
# 下半分は無視して上のほうを探す | |
# print "<- $key < $search_key\n"; | |
$min_index = $index; | |
} | |
# 見つけられなかった場合に無限ループになることを防止 | |
last if ( $min_index == $max_index ); | |
} | |
if ( $key eq $search_key ) { | |
print "FOUND : K$key $value\n"; | |
} else { | |
print "NOT FOUND\n"; | |
} | |
close $log_file; | |
exit 0; | |
# WebAPI を用いて key と value を得る | |
sub get_key_value { | |
my ( $db, $index ) = @_; | |
my $url = 'http://salvageon.textfile.org/'; | |
my ( $db_out, $index_out, $key, $value, $db_length ); | |
my $content = get( "$url?db=$db&index=$index" ); | |
print $log_file "$content\n"; | |
if ( $content =~ /^(\d+) (\d+) K(\d+) (V\d+) (\d+)$/ ) { | |
( $db_out, $index_out, $key, $value, $db_length ) = ( $1, $2, $3, $4, $5 ); | |
# 数値化 | |
$key += 0; | |
} | |
sleep 1; | |
return ( $key, $value ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment