ツンデレ実装 の改造をしていて妙な壁にぶち当たってしまった。
2009年2月アーカイブ
# やばっ 普通に答えたらイカんのかな、これ(ビクビク
επιστημηさんの 祭りの仕掛け に 引っかかってみました。
use strict;
use warnings;
use encoding q/utf-8/, Filter => 1, STDOUT => q/cp932/;
use utf8;
use Scalar::Util;
package ツンデレ;
sub new {
my $pkg = shift;
my %arg = @_;
die "失格" if !exists $arg{デレに変わる条件};
bless \%arg, $pkg;
}
sub 態度 { shift->きっかけ || print "ツン" }
sub きっかけ {
my $self = $_[0];
if ( $self->{デレに変わる条件}->($self) )
{
no strict qw/refs/;
my $pkg = 'ツンデレ::_' . Scalar::Util::refaddr($self);
eval "package $pkg; our \@ISA = (q/ツンデレ/);";
die $@ if $@;
*{$pkg . '::態度'} = sub { print "デレ" };
$self = bless $self, $pkg;
$self->態度;
$self;
}
}
sub 相手 {
my $self = shift;
$self->{相手} = shift;
print "\n相手は " . $self->{相手} . "\t";
$self;
}
package main;
srand(time);
sub 突発的事項 { int rand 20 }
sub 発生した { 0 };
my $あの子 = ツンデレ->new(
デレに変わる条件 => sub {
my $self = shift;
$self->{$self->{相手}}{訪問回数}++ > 5;
});
$あの子->相手(("scott", "andrei", "epi")[int rand 3])->態度 for 1 .. 20;
print "\n";
my $その子 = ツンデレ->new(
デレに変わる条件 => sub {
突発的事項 == 発生した
});
$その子->態度 for 1 .. 20;
print "\n";
my $ビッチ = ツンデレ->new(
デレに変わる条件 => sub { 1 });
$ビッチ->態度 for 1 .. 5;
print "\n";
eval {
my $普通の子 = ツンデレ->new(); # エラー
};
print $@ if $@;
最初は「ツンツン」した態度だけどある条件をクリアすると「デレ」に移行するというタイプのツンデレの実装になります。なお、デレに変わる条件がない場合はツンデレとは認められません。
ツンデレ移行判定はStrategyパターンで。ツンからデレに移行するのは、インスタンス毎にツンデレのサブクラスを動的に生成して、インスタンスをそのサブクラスに所属替え(rebless)して"態度"を変える という多少強引な事をやってます。
use encoding の STDOUT => q/cp932/ は、Windows上で動かしてるからなだけです。
http://floralcompany.jp/archives/2009/02/obsolete.html のおまけ。
perlならone-linerでいけるよね っと。
perl -e 'print join q/ /, grep { grep /^Tag:.*special::obsolete/, qx/apt-cache show $_/ } map { (split /\s+/)[1] } grep /^.i/, split qq/\n/, qx/dpkg -l/'
元ネタは http://code.nanigac.com/forum/view/422 かな。
なんか流行ってるみたいなんでやってみた
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <iterator>
#include <cstring>
char convert(char c, int flg)
{
return flg ? std::toupper(c) : std::tolower(c);
}
int main(int c, char** v)
{
if ( c < 2 ) {
std::cerr << "usage: " << v[0] << " <target string>\n";
return 0;
}
std::string target(v[1]);
std::vector<int> flg;
flg.resize(target.size());
for (int i = 0; i <= target.size(); ++i )
{
std::fill_n(flg.rbegin(), i, 1);
do {
std::string res;
std::transform(
target.begin(), target.end(),
flg.begin(),
std::back_inserter(res),
convert);
std::cout << res << "\n";
} while ( std::next_permutation(flg.begin(), flg.end()) );
}
}
#/bin/sh
for i in `dpkg -l | egrep ^.i | awk '{print $2}'`
do
apt-cache show $i | grep Tag: | grep special::obsolete > /dev/null 2>&1
if [ $? == 0 ]; then
echo $i
fi
done
後は apt-get remove なり aptitude purge なり
前回から色々パワーアップ
なんと、IEにも対応しました :D (FirefoxとGoogleChromeでは動いてたけど、ためしにIEでやったら動かなかったので色々直した
SkyDriveに置いておきましたのでよろしければどうぞ。基本的に自分用なんで不親切この上ないですが :p
2009-03-04 こっそり機能追加。倉庫溢れ計算機能を追加しました。




