-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathebifuck.php
More file actions
108 lines (102 loc) · 3.12 KB
/
ebifuck.php
File metadata and controls
108 lines (102 loc) · 3.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
class Ebifuck
{
private $defineEbi;
private $ptr = 0;
private $pc = 0;
private $buffer;
private $buffer_size;
private $memory;
private $nest = 0;
// コンストラクタで定義すっか
function __construct()
{
$this->defineEbi = array (
// ポインタをインクリメント
"エ" => function($o) { $o->ptr ++; return null; },
// ポインタをデクリメント
"ビ" => function($o) { $o->ptr --; return null; },
// ポインタが指す値をインクリメント
"フ" => function($o) { $o->memory[$o->ptr] ++; return null; },
// ポインタが指す値をデクリメント
"ラ" => function($o) { $o->memory[$o->ptr] --; return null; },
// ポインタが指す値を出力に書き出す
"イ" => function($o) { return sprintf ( "%c", $o->memory[$o->ptr] ); },
// エビフライはおいしい!
"神" => function($o) { return "エビフライおいしい!一番好きな食べ物です!!"; },
// ポインタが指す値が0なら、対応する]の直後にジャンプする
"皮" => function($o)
{
// 値は0だよな?
if ( !$o->memory[$o->ptr] )
{
for ( ;; )
{
// プログラムカウンタを増加
$c = mb_substr($o->buffer, ++$o->pc, 1, "utf-8");
if ( $c === "皮" )
{
$this->nest ++;
break;
}
if ( $c === "衣" )
{
$this->nest --;
break;
}
}
}
return null;
},
// ポインタが指す値が0でないなら、対応する[の直後にジャンプする
"衣" => function($o)
{
for ( ;; )
{
// プログラムカウンタを減らす
$c = mb_substr($o->buffer, --$o->pc, 1, "utf-8");
if ( $c === "皮" )
{
$this->nest --;
break;
}
if ( $c === "衣" )
{
$this->nest ++;
break;
}
}
// 消す
$o->pc --;
return null;
}
);
}
// 実行命令
function exec ( $code )
{
$this->buffer = $code;
$this->memory = array_fill(0, 1024*1024, 0);
$this->buffer_size = mb_strlen($this->buffer, "utf-8");
$result = "";
for( $this->pc = 0, $this->ptr = 0; $this->pc < $this->buffer_size; $this->pc ++)
{
// 命令あるか?
$c = mb_substr($this->buffer, $this->pc, 1, "utf-8");
if ( !array_key_exists($c, $this->defineEbi) )
{ continue; }
// あったら実行
$w = $this->defineEbi[$c]($this);
// ついでに出力も拾う
if ( !is_null ( $w ) )
{
$result = sprintf ( "%s%s", $result, $w );
}
}
return $result;
}
}
// ためし
$d = new Ebifuck ();
echo $d->exec ( "フフフフフフフフフ皮エフフフフフフフフエフフフフフフフフフフフエフフフフフビビビラ衣エイエフフイフフフフフフフイイフフフイエライ
ラララララララララララライビフフフフフフフフイラララララララライフフフイラララララライラララララララライエフイ神" );