[00:15.72]会うたび心臓がバクバク(ばくばく)
[00:19.23]日ごとに膨らんでドキドキ(どきどき)
[00:22.80]心が揺れてるよユラユラ(ゆらゆら)
[00:26.74]解決出来なくてモヤモヤ(もやもや)

[01:45.65]毎日あしもとがフワフワ(ふわふわ)
[01:49.16]楽しみ見つかるよワクワク(わくわく)
[01:52.93]言葉に出来なくてモジモジ(もじもじ)
[01:56.76]身体はもたないわフラフラ(ふらふら)

Get the Flash Player to see the wordTube Media Player.

要完全明白miko的《アリス→デレ》的这段歌词可真不容易。仔细一看日语里ABAB形式的词汇还真是多,找个不算大的词典,随便一查,光ABAB形式的拟声/拟态词就找到500+,里面还没找到うにうに。看了一下,总还是有一些自己比较耳熟的,包括つかさ口中的「〇ん〇ん」还有k-on里的「ふわふわ」,还能条件反射的看到「ぐるぐる」想到「回ってる」,看到「つるつる」想到「つるぺった」。不过其余的几百个就云里雾里了,要是挑个几十个发音和意思相近的拟声/拟态词来玩释义连线题一定很大自然。

●○●○ English
いよいよ
愈々
adv (1) (uk) more and more; all the more; increasingly; (2) at last; finally; beyond doubt; (3) (at the) last moment; worst possible time;
おいおい int (1) Hey!; Wait a minute!; Whoa!; (adv, adv-to) (2) boohoo; waaaa;
きらきら
キラキラ
adv, adv-to, vs (on-mim) glitter; sparkle; glisten; twinkle;
ぐるぐる
グルグル
adv, vs, adv-to (1) (on-mim) turning round and round; going around in circles; (2) wrapped around;
さあさあ int come; come now;
さてさて int well; now; then;
さわ

Comments 5 Comments »

例大祭の新作Flash作品集「東方咲待夢(とうほうしょうたいむ)」のクロスフェードムービーです。

【参加クリエイター】
み~や、宇田てとら、カギ、yu-ki、I.C.yas、大羽龍一、yama_ko(敬称略)

【頒布予定】
3/14(日) へ30b

【OP楽曲】
「桜海の月~Ultimate Truth」myu (myu314)
(PopKorn & Hara-Kara「prism seal」より)

【PV作品 short ver.リンク】
Miracle∞Hinacle(カギ)
れみりあ☆デスティニー(I.C.yas)
Lotus Petal(yama_ko)
恋色魔砲一直線(大羽龍一)
MY Life(宇田てとら)

迷走ポタージュ的又一个flash作品集「東方咲待夢」,里面除了一如既往的flash PV外,还外加一个东方flash小游戏和一个利用flash素材DIY壁纸的工具。具体的看官方广告吧:

Comments 8 Comments »

昨天的HDOJ第三场月赛中hhanger出了一道非主流的Guess the number。援引官方解题报告:

本题属于非正常题,纯属娱乐。因为本题最多只有16个字符,所以可以用X分提交法来套取输入数据,可以利用的返回结果至少有6种,把字符先统一转化成小写后,基本上两次提交可以确定一个字符,因此可以在期望时间内得到解。

相信很多acmer对利用返回结果来套取输入数据并不陌生,我们经常用这招来获得case数或检验输入数据是否与题目描述不符。下面这段程序可以判断第off个字符在哪个范围内,利用了HDOJ中G++的TLE, MLE, OLE, RE(ACCESS_VIOLATION, STACK_OVERFLOW, DIVIDE_BY_ZERO)和WA七种不同返回结果。但平时编译器对包括尾递归、空循环和常量的优化此时却成了绊脚石,为了生成我们预期的返回结果,只好让代码复杂一点或产生一些副作用。

// author: watashi
#include <cctype>
#include <cstdio>
#include <cstring>

void gao(int ch) {
	if (ch < $_[1]) {	// Time Limit Exceeded
		while (true);
	} else if (ch < $_[2]) { // Memory Limit Exceeded
		char* p = new char[128 << 20];
		memset(p, 0xff, 128 << 20);
	} else if (ch < $_[3]) { // Output Limit Exceeded
		while (true) {
			fputs("[Output Limit Exceeded] (http://watashi.ws/wabots) quick brown fox jumps over the lazy dog", stdout);
		}
	} else if (ch < $_[4]) { // Runtime Error (ACCESS_VIOLATION)
		int p[1 << 10] = {-1};
		putchar(p[1 << 20]);
	} else if (ch < $_[5]) { // Runtime Error (STACK_OVERFLOW)
		gao(ch);
	} else if (ch < $_[6]) { // Runtime Error (INTEGER_DIVIDE_BY_ZERO)
		int p = sizeof(char);
		printf("%d", sizeof(int) / --p);
	} else { // Wrong Answer
		return;
	}
}

int main() {
    int off = $_[0];
    for (int i = 0; i < off; ++i) {
        getchar();
    }
    gao(tolower(getchar()));
	return 0;
}

有了这段程序,理论上就可以在32次内得到输入数据了。但由于人肉提交难免手抖,判断易出差错,而且需要很多的肉,实际次数远在这之上,不少人都提交上百次后才AC。对于又缺少肉,又容易手抖的我,连尝试的勇气都没有。不过,却可以写个从不手抖,有着用不完的肉的机器人来代劳。于是先实现一个HDOJ的自动提交机模块。

# HDOJAgent.pm
package HDOJAgent;
use strict;
use warnings;
use LWP::UserAgent;

my $prefix = "http://acm.hdu.edu.cn";
my $interval = 60;
my $maxretry = 2;

sub new {
    my $class = shift;
    my $self = {
        user => $_[0] || '',
        problemid => $_[1] || 1000,
        language => $_[2] || 0,
        ua => new LWP::UserAgent(
            agent => 'HDOJAgent (http://watashi.ws/wabots)',
            cookie_jar => {},
        )
    };
    bless $self, $class;
    return $self;
}

sub AUTOLOAD {
    my $self = shift;
    my $name = $HDOJAgent::AUTOLOAD;
    $name =~ s/.*://;
    return if $name eq 'DESTROY';
    $self->{$name} = shift if @_;
    return $self->{$name};
}

sub post {
    my ($self, $url, $form) = @_;
    my $ua = $self->ua;
    for (1 .. $maxretry) {
        my $response = $ua->post($url, $form);
        if (!$response->is_error) {
            return $response->decoded_content;
        }
        sleep $interval;
    }
    warn "maxretry exceeded!";
    return undef;
}

sub login {
    my ($self, $pass) = @_;
    $self->post("$prefix/userloginex.php?action=login", {
        username => $self->user,
        userpass => $pass,
        login => 'Sign In'
    });
}

sub submit {
    my ($self, $code) = @_;
    $self->post("$prefix/submit.php?action=submit", {
        problemid => $self->problemid,
        language => $self->language,
        usercode => $code
    });
}

sub laststatus {
    my $self = shift;
    my $user = $self->user;
    while (1) {
        my $_ = $self->post("http://acm.hdu.edu.cn/status.php?user=$user");
        s{^[\s\S]*Pro\.ID.*Exe\.Time.*Exe\.Memory}{}gs;
        s{</td><td><a href="/showproblem\.php\?pid=.*$}{}gs;
        s{^.*<td>}{}gs;
        s{^\s*|\s*|<[^>]*>}{}gs;
        return $_ unless /^$|Queuing|Compiling|Running/;
        sleep $interval;
    }
}

要完成提交操作需要提供cookie,通常有两种办法,一是直接在WebClient.Headers里设置好cookie,以前我用C#写的一个ZOJ的自动提交机就是这么实现的;更简单的办法是给UserAgent初始化一个空的cookie,通过完成login来设置cookie。有了cookie后就可以submit了,submit需要提供problemid, language和usercode。submit后可以通过laststatus来获得你最近一次提交的返回结果。先用A + B Problem来测试一下模块,这里用了caller函数,实现模块的测试和使用两不误。

# HDOJAgent.pm
return 1 if caller;

my $hdoj = new HDOJAgent('wabots');
$hdoj->login('~!@#$%^&*()_+');
$hdoj->problemid(1000); # A + B Problem
$hdoj->language(1); # GCC
$hdoj->submit(<<GCC
main(a,b){while(scanf("%d%d",&a,&b)>0)printf("%d\n",a+b);}
GCC
);
print $hdoj->laststatus, "\n";

最后在wabots.pl中使用HDOJAgent模块,不断通过七分法提交HDU3337,以得到输入数据中的字符,直到EOF。得到的输入数据,答案也就显而易见啦^ ^

#!/usr/bin/perl -w
# http://watashi.ws/wabots

use strict;
use warnings;
use HDOJAgent;

$| = 1;

sub getcpp {
    return <<CPP;
...
CPP
}

sub getpos {
    my ($min, $max, $cnt) = @_;
    my @ret = ();
    $max -= $min;
    for (my $i = 0; $i <= $cnt; ++$i) {
        push @ret, $min + int($max * $i / $cnt);
    }
    return @ret;
}

my @status = qw(Time Memory Output ACCESS STACK INTEGER Wrong);

my @charset = (' ', '0' .. '9', 'a' .. 'z');
@charset = sort {$a <=> $b} map {ord $_} @charset;
unshift @charset, -1;

my $hdoj = new HDOJAgent('wabots', 3337, 0);
$hdoj->login('~!@#$%^&*()_+');

my ($try, $off, $min, $max, $res) = (0, 0, 0, scalar @charset, '');
while (1) {
    ++$try;
    print "wabots# TRY #$try: [$off] in [$min, $max)\n";
    my @pos = getpos($min, $max, scalar @status);
    $hdoj->submit(getcpp($off, @charset[@pos[1 .. $#pos - 1]]));
    my $status = $hdoj->laststatus;
    print "wabots# \t$status\n";
    for (my $i = 0; $i < @status; ++$i) {
        if ($status =~ /$status[$i]/i) {
            $min = $pos[$i];
            $max = $pos[$i + 1];
        }
    }
    if ($min == $max - 1) {
        last if $charset[$min] < 0;
        $res .= chr $charset[$min];
        print "wabots# \t[$off] = $charset[$min] ($res)\n";
        ++$off;
        $min = 0;
        $max = @charset;
    }
    sleep 5;
}
print "RESULT = $res\n";

运行上面的程序,输出的日志如下:

由于文件中包含答案,为防止剧透,您需要输入本题正确答案以获取该文件:

Comments 6 Comments »

Workflow版A + B Problem (传送门:各种语言版)
在ADX实习了整三个月了,嗯

Sequence

Sequence

Flowchart

Comments 7 Comments »

浙江大学“网新国际杯”第十届大学生程序设计竞赛将于2010年4月10日举行

浙江省“网新国际杯”第七届大学生程序设计竞赛将于2010年4月17日举行

对比我知道的这两年校赛,吐槽开始:

  • 两回我都提前问校赛时间无果,最后都等到了本科生院正式通知,一点内部小道消息都没有。不能说我圡,消息不灵,因为每回本科生院的通知都是穿越回来发的。比如这回的通知时间其实是4天后;
  • “每支队伍必须由三名参赛队员组成,每个队伍必须所有队员到齐才可入场”这条规则是去年开始有的,虽然有它的道理,不过很多人,可能要郁闷了;
  • 校赛的规模一年比一年悲剧,于是我“大胆”预测,今年没有预赛;
  • 今年的省赛居然就接在校赛一周后,始料不及,说不定要提前结束实习了。去年这个时候,很多浙江高校询问省赛时间,那时我们自己都不还不知道;
  • 不得不说与其他程序设计竞赛和学校的其他类别竞赛相比,校赛的含金量是相当高的。特等奖备注里的“可空缺”让人看了真疼,前三回校赛的特等奖一个人也没用上,希望今年不要在浪费了;
  • 啊啊啊,为什么今年的报名系统又换回了前年那个操蛋的浙江大学本科生创新网啊,传统的报名系统多好啊,这个报名系统简直就一坨○啊;
  • 最后希望校赛省赛皆大欢喜!

关于举办浙江大学“网新国际杯”第十届大学生程序设计竞赛的通知

为了培养和展示我校大学生分析、解决问题和计算机编程的能力,鼓励和培养创新思维,丰富校园学术气氛,造就具有综合素质的面向21世纪的计算机人才,并选拔学生参加浙江省和亚洲程序设计竞赛,学校决定举行浙江大学“网新国际杯”第十届大学生程序设计竞赛。竞赛将于2010年4月11日在浙江大学紫金港校区计算中心机房举行,有关事项通知如下:
一、组织机构
主办单位:浙江大学本科生院教研处。
承办单位:浙江大学计算机学院。
赞助单位:

Comments 14 Comments »