Create a gist now

Instantly share code, notes, and snippets.

Embed
What would you like to do?
サルベジオン社で宇宙船のデータを救え
#!/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 );
}
#!/bin/sh
curl -q http://salvageon.textfile.org/\?db=$1\&index=$2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment