忍者ブログ

 BrainF*ck in JavaScript

JavaScriptのあらゆるコードは![]+()の6種類の記号で書ける
PR
READ MORE



1. 関数のコンストラクタを呼び出せばevalに相当する命令が書ける
Function.prototype.constructor('alert(0)')()
はalert(0)を実行する

単純に以下でもよい
Function('alert(0)')


2. FunctionはArrayオブジェクトの関数から呼び出せる
Array.prototype.join.constructor === Function //true
メソッドはjoinでなくても実装されていればなんでもよい。

Array.prototype.join.constructor('alert(0)')()
はalert(0)を実行する


3. Array.prototypeは[]で代用できる
[].join.constructor('alert(0)')()

4.プロパティは文字列に置き換えられる
[]['join']['constructor']('alert(0)')()

というわけで何らかのArrayのメソッド名1つと
'constructor'という文字列が![]+()の6種で出力できれば
使える文字列の範囲で任意のコードを打てるということになります

[][ARRAY_METHOD_NAME]['constructor'](CODE_STRING)()

あとは使える文字の範囲で打てるコードを使って、
さらに使える文字を拡張していく…の繰り返しで
すべての文字を使えるようにします。

というわけで文字列の出力を考えていきます

まず基本としてArray → Stringの暗黙の型変換について
Array.prototype.toStringは自身をjoinした文字列を返すようです。
ArrayがStringとして呼び出されるとjoinされた文字列が返されます。
例を挙げると
String([]) // ''
String([0]) // '0'
String([1]) // '1'
String(['a']) // 'a'
String('[0,1]') // '0,1'

Arrayを+演算子で呼び出すと文字列に型変換してから処理されます
[]+[] // ''
[1]+[] // '1'
'b'+[2] // 'b2'
ただし、[undefined]はこのようには機能しないので注意です。
0+[undefined] // '0'

Objectだったら大体String型として処理されるようです。

変数aのString型への型変換は
String(a)を使わずとも以下で書けます
a+[]

ではほかのStringへの型変換を見ていきます
String(true) // 'true'
String(false) // 'false'
String(undefined) // 'undefined'
String(NaN) // 'NaN'
String(Infinity) // 'Infinity'
こいつらはString型に型変換すると期待通りの文字列になります。

では簡単なundefinedを作ってみます
まず配列を作ります
a=[];

配列はオブジェクトなので実は数以外のキーも持てます
したがって値を持ってこようとしてもErrorにはなりません
a[''] // undefined

aを書き直すとこうなります
[]['']

配列のキーの部分にString以外を置くと
暗黙の型変換でStringに置き換わります
つまり
[][[]] // undefined
これでundefinedの完成です

次に文字列としての'undefined'を作ります
undefined+[]
でString(undefined)と同義の命令になります

よって書き下すと
[][[]]+[] // 'undefined'


次にtrueとfalseを作ってみます。
!aはaの否定を返しますが、その際にaをBoolean型に型変換します。
つまりBoolean(a)は!!aで代用できます。

さらに、ObjectからBooleanへの型変換はtrueとなるので
Objectの一種である[]を使って
!![]はtrueとなります
![]がfalseです

文字列としての'true', 'false'も簡単に作れます
[!![]]+[] // 'true'
[![]]+[] // 'false'


文字列は配列のように1文字ずつ取り出すことができます。
'undefined'.split('')という配列を扱うように文字を取り出せます。
例えば
'undefined'[0] // 'u'
'undefined'[1] // 'n'

よって0と1を作ることができれば任意の番地にアクセスできるので
'u', 'n', 'd', 'e', 'f', 'i'を得ることができます。

というわけで0と1を作ります
String型からNumber型への型変換のとき、
Stringの長さ(length)が0の場合はNumberとして、0に変換されます
つまり+''は0となります。
よって
+[] // 0
と書けます

Boolean(0)はfalseなので
!+[] // true
となります。

さらに、Numberへの型変換として、
Number(a)は+(a)とも書けるので、
これを用いると1は以下のように書けます
+!+[] // 1

trueは!![]でも書けるので
+!![]でも1を表現できます。(お好みで)
読みづらさ的には+!+[]のほうが高い気がします。

0と1ができたので早速英小文字を取り出しましょう

'undefined'[0]で'u'を得られるので書き下してみます。
(undefined+[])[0]
([][[]]+[])[+[]] // 'u'

'undefined'[1]で'n'が得られます
(undefined+[])[1]
([][[]]+[])[+!+[]] // 'n'

'undefined'[2]で'd'が得られます
(undefined+[])[1]
([][[]]+[])[!+[]+!+[]] // 'd'

2を作る上での注意は
2 = true + trueというところです
1を作るときは
1 = Number(true)
という感じで意識的に型変換をしなければなかったのが不要ということです
これにより文字数が少し減ります

'e'はundefinedから持ってくるよりもtrueから持ってきたほうが早いです
'true'[3]として'e'を持ってきましょう
(true+[])[1+1+1]
(!+[]+[])[!+[]+!+[]+!+[]] // 'e'

'f'もundefinedから持ってくるよりfalseから持ってきたほうが早いです
'false'[0]
(false+[])[0]
(![]+[])[+[]] // 'f'

'i'はundefinedから持ってきましょう。
'undefined'[5]
としたいところですが、5を作るために結構文字数がかかります。
1+1+1+1+1
!+[]+!+[]+!+[]+!+[]+!+[] // 5

ここでちょっとしたテクニックを使います。
何か適当に'undefined'の前に文字列を追加し、iを10番目や11番目に持ってきます。
('abcde' + 'undefined')['10'] // 'i'
keyの文字列は数値に型変換されるので無事に取り出せます。
'10'は'1'+'0'なので短く作ることができます。
1+[0]
(+!0)+[+""]
(+!+[])+[+[]]
+!+[]+[+[]] // '10'

'abcde'の部分は5文字であればなんでもいいので'false'にしましょう。
つまり
('false' + 'undefined')['10'] // 'i'
を書き下せばよいということになります。
([false]+undefined)['10']
([![]]+[][[]])[+!+[]+[+[]]] // 'i'

簡単ですね。
これで'u', 'n', 'd', 'e', 'f', 'i'の取得に成功しました。

次に'false'を分解しましょう。

'a'を取得します。
'false'[1]
(false+[])[+!0]
(![]+[])[+!+[]] // 'a'

'l'を取得します。
'false'[2]
(false+[])[2]
(![]+[])[!+[]+!+[]] // 'l'

's'を取得します。
'false'[3]
(false+[])[3]
(![]+[])[!+[]+!+[]+!+[]] // 's'

次に'true'を分解します。
't'を取得します。
'true'[0]
(true+[])[0]
(!+[]+[])[+[]] // 't'

'r'を取得します。
'true'[1]
(true+[])[1]
(!+[]+[])[+!+[]]

ついでにNaNを作っておきます。
NaNはStringをNumberに型変換するときに、
上手くいかないと返される値です。

'123'のように数に変換できる文字列であれば、
Numberとして123が返されます。
'abc'のような文字列をNumberに型変換すればよいわけです。
お手軽に作れる文字列は'false'ですね。
つまりNumber('false')を考えます。
+('false')
+([false])
+[![]] // NaN


以上で取得できた1文字の英小文字は以下のようになります。
'u', 'n', 'd', 'e', 'f', 'i', 'a', 'l', 's', 't', 'r'

この時点で'constructor'がほぼほぼ作れることが分かります。
あと必要なのは'c', 'o'ですね。
これをどう作るかを考えます。

関数のStringへの型変換を考えます。
String([].join)


chrome: "function join() { [native code] }"
firefox: "function join() {
[native code]
}"
opera: "function join() { [native code] }"
IE: "function join() { [native code] }"

ブラウザにもよりますが、
'function 'の9文字(半角スペース含む)の後に関数名() {が来る
というルールは変わらないようです。
(firefoxの場合そのあとの半角スペースが多いです。)

というわけなので'function 'の文字列は得ることができそうです。
問題はArrayで使えそうなメソッドがあるかということです。
'u', 'n', 'd', 'e', 'f', 'i', 'a', 'l', 's', 't', 'r'の文字のみで構成されたArrayのメソッドを探しましょう。

filterメソッドかfillメソッドがよさそうですね。
filterメソッドはchrome, firefox, IE(9以上), opera, safariで実装されているようです。
fillメソッドは名前が短い代わりにchrome, firefox, safariでしか実装されていないようです。

String([]['filter'])あるいはString([]['fill'])とすれば
先頭の9文字が'function 'である文字列を得ることができます。
少し書き下せば
([]['filter']+[])あるいは([]['filter']+[])ということです。

あとは文字列を+で足せばよいので
'filter'であれば
'f'+'i'+'l'+'t'+'e'+'r'
(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]] // 'filter'
'fill'であれば
'f'+'i'+'l'+'l'
(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]] // 'fill'
というように6種記号で表すことができます。

以下では[]['filter']と[]['fill']をまとめて
Function.prototypeと表すことにします。
'filter', 'fill'のどれに選んだかは本質ではなく、
あくまでFunction.prototypeにあるからです。
そして、'filter'を使うか'fill'を使うかを決めれば
![]+()の6種類だけで表現できますね。

というわけで'function 'から得られる1文字英小文字を取得していきましょう。
'c'の取得
String(Function.prototype)[3]
(Function.prototype+[])[!+[]+!+[]+!+[]] // 'c'

'o'の取得
String(Function.prototype)[6]
としたいところですが、やはり10に合わせたほうが短くなります。
前に4文字足しましょう。
('true'+Function.prototype)[10]
(true+Function.prototype)[10]
(!+[]+Function.prototype)[+!+[]+[+[]]]

' 'の取得(半角スペース)
String(Function.prototype)[8]
としたいところですがやはりずらします。
2文字で手ごろなものがないので3文字ずらして11番を取得します。
NaNですね。
('NaN'+String(Function.prototype))[11]
(NaN+Function.prototype)[11]
(+[![]]+Function.prototype)[+!+[]+[+!+[]]]

ということなので使える英小文字で表せる関数を
自由に呼び出せるようになりました。
[]['filter']['constructor'](CODE_STR)()
[]['fill']['constructor'](CODE_STR)()
ということですね。

これらをFunction.prototype['constructor']とまとめて書くことにします。
文字列としての'alert()'はもう作ることができるので
Function.prototype['constructor']('alert()')()
とすれば6種だけでアラートを呼び出すことができます。

次に考えるべきことはすべての文字を作ることです。
すべての文字を作ることができれば、
すべての標準関数やオブジェクトを扱うことができます。
つまり![]+()の6種でjavascriptが制限なく書けるということです。

まずはすべての英小文字を作成しましょう。
そのために必要なのがNumber.prototype.toString()です。

Number.prototype.toString(radix)はradixに基数を指定すると
それを文字列として返します。
10進数でいうところの15は
16進数でいうところのfにあたるので
(15).toString(16) // 'f'
がとなります。

'(', ')', 'to'とすべての数字はもう作ることができたので、
文字列として'String'が得られれば
(15)['to' + 'String'](16)
と呼び出すことができます。

次に考えるべきことは'String'の取得です。
これはString.nameで得られます。
String.name // 'String'

String.prototype.constructor === String // true
であることを利用すれば'String'が得られそうですね。
''.constructor.name // 'String'
すなわち
([]+[])['constructor']['name'] // 'String'

さああと一息です。
'constructor', 'nae'は作成可能なので、'm'を作ります。

ここで使えるのがNumberです。
String(Number) // 'function Number() { ...'
String(Number)[11] // 'm'
(Number+[])[11]
((0).constructor+[])[11]
((+[])['constructor']+[])[11]
((+[])['constructor']+[])[[+!+[]]+[+!+[]]] // 'm'

これでやっと'name'が使えるようになったので
aからzのすべての英小文字が使えるようになりました。
(15)['to'+([]+[])['constructor']['name']](16) // 'f'
(31)['to'+([]+[])['constructor']['name']](36) // 'v'
(35)['to'+([]+[])['constructor']['name']](36) // 'z'

なお'String'の取得法につかったnameプロパティは非標準です。
nameプロパティを避けるとString(''.constructor)から'S'と'g'を取得
という流れになると思います。
'S'の取得
(0+''.constructor)[10] // 'S'
'g'の取得
(0+[false]+''.constructor)[20] // 'g'


toStringする際の基数などを工夫することによって
かかる字数を少なくすることができます。
(+('11'))['toString']('20') // 'b'
(+('101'))['toString']('21')[1] // 'h'
(+('40'))['toString']('21')[1] // 'j'
(+('20'))['toString']('21') // 'k'
+('211'))['toString']('31')[1] // 'p'
(+('212'))['toString']('31')[1] // 'q'
(+('31'))['toString']('32') // 'v'
(+('32'))['toString']('33') // 'w'
(+('101'))['toString']('34')[1] // 'x'
(+('35'))['toString']('36') // 'z'

'y'だけは特殊な作り方で短くできます。
Infinityを作ります。
とにかくでかい数字文字列を作って数に型変換します。
具体的には10の1000乗でInfinityになります。
+('1e1000') // Infinity
+([+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]]) // Infinity

'Infinity'[7] // 'y'
(NaN+[Infinity])[10] // 'y'
(+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])])[+!+[]+[+[]]] // 'y'

さて、すべての英小文字を取得することができました。
次に考えるべきことはString.fromCharCodeの使用です。
すなわち''['constructor']['fromCharCode']です。
英小文字はすべて使えるわけですから、問題なのは'C'だけです。
'C'を作成できればすべての英大文字が使用できます。
すなわち、すべての標準オブジェクトや関数を使用できます。
また、日本語なども使えるようになります。
''['constructor']['fromCharCode'](12354) // 'あ'

では'C'を取得しましょう。
String.toUpperCaseメソッドで大文字にできるのですが、
このメソッドを使うために'C'が必要で循環してしまいます。
よってもっと別のアプローチを考えなければなりません。

ここで使えるのがescape関数あるいはencodeURI関数です。
escape('<') // '%3C'
encodeURI('<') // '%3C'
気を付けたいのは、escapeは非推奨関数であるというところです。
escapeのほうが短くて済むのですが、非推奨関数を避けたい場合は
encodeURIのほうに軍配が上がります。

とは言っても、'I'は取得できますが、'R', 'U'の取得が困難です。
'I'はInfinityを利用して
(Infinity+[])[+[]]
(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])+[])[+[]] // 'I'
として取得すればよいでしょう。

'U'に関しては、
Function.prototype['constructor']('return{}')()['toString']['call']() // '[object Undefined]'
として取得する方法があります。
(NaN+Function.prototype['constructor']('return{}')()['toString']['call']())[11] // 'U'

'R'に関してはRegExpを利用します。
Function.prototype['constructor']('return/'+false+'/')() // /false/
とすればRegExpオブジェクト/false/が得られます。
これのconstructorがRegExpになるので、
Function.prototype['constructor']('return/'+false+'/')()['constructor'] // function RegExp() {...
(+[]+Function.prototype['constructor']('return/'+false+'/')()['constructor'])[10] // 'R'
となって無事に'R'を取得できます。

どちらを使うにせよ、
Function.prototype['constructor']('return escape')()('<')[2]
Function.prototype['constructor']('return encodeURI')()('<')[2]
とすれば'C'が取得できます。
最後に'<'を取得しましょう。

'<'の取得にはString.prototype.italicsメソッドまたは
String.prototype.linkメソッドを使います。
前者のほうが短くて済みますが非推奨です。
('k'をtoStringに頼らないといけないので長くなる)
('')['italics']()[0] // '<'
('')['link']()[0] // '<'

これですべての文字を使うことができます。
さらに、
Function.prototype['construction'](CODE_STR)()
を使えば任意のコードを実行できます。

では最後にHello, world!をやって終わりましょう。
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+!+[]]]+([][[]]+[])[+[]]+([][[]]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(+(!+[]+!+[]+[+!+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+!+[]+[+!+[]])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]])()([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(+(!+[]+!+[]+[+!+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+!+[]+[+!+[]])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]])()(([]+[])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+[]])[+[]]+(!+[]+!+[]+!+[]+!+[]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]])+[])+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+[[]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]([[]])+[]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+!+[]]]+(+(!+[]+!+[]+!+[]+[!+[]+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]+!+[]])+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([][[]]+[])[!+[]+!+[]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+!+[]]]+([][[]]+[])[+[]]+([][[]]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(+(!+[]+!+[]+[+!+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+!+[]+[+!+[]])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]])()([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(+(!+[]+!+[]+[+!+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]](!+[]+!+[]+!+[]+[+!+[]])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]])()(([]+[])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+[]])[+[]]+(!+[]+!+[]+[+!+[]])+[])+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])()

| COMMENT:0 | HOME |

 opencvでテンプレートマッチング

必要なもの
python
numpy
opencv
PIL
READ MORE


画像ファイルの読み込み
import numpy
import cv2
import os.path
def readImg(fileName):
 if not os.path.isfile(fileName)
  raise FileNotFoundError(fileName)
 return cv2.imread(fileName, 1)

スクリーンキャプチャ
import numpy
import cv2
from PIL import ImageGrab
def captureScreen(x, y, w, h):
 image = ImageGrab.grab((x, y, w, h)) #引数はタプル 省略すると全体
 image = numpy.asarray(image) #cv2用に変換
 return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

画像の表示
templeteImage = readImg('test.png')
cv2.imshow('desktop', templeteImage)
cv2.waitKey(0) #0はanykey
cv2.destroyAllWindows()

screen = captureScreen(0, 0, 600 , 400)
cv2.imshow('desktop', screen)
cv2.waitKey(0) #0はanykey
cv2.destroyAllWindows()


テンプレートマッチング
result = cv2.matchTemplete(screen, templeteImage, cv2.TM_CCOEFF_NORMED)
(minval, maxval, minloc, maxloc) = cv2.minMaxLoc(result)
(h, w, d) = templeteImage.shape

この時点で以下の情報がわかる
maxloc[0]: screen上のtempleteImageのx座標
maxloc[1]: screen上のtempleteImageのx座標
maxval: 類似度
w: templeteImageのwidth
h: templeteImageのheight
この情報を使って四角を書く

(続けて)
topLeft = (maxloc[0], maxloc[1])
bottomRight = (maxloc[0] + w, maxloc[1] + h)
outputImage = screen.copy() #ディープコピー
cv2.rectangle(outputImage, topLeft, bottomRight, 0x00ff00)
cv2.imwrite("output.png", outputImage)
| COMMENT:0 | HOME |

 opencvでテンプレートマッチング

必要なもの
python
numpy
opencv
PIL
READ MORE


画像ファイルの読み込み
import numpy
import cv2
import os.path
def readImg(fileName):
 if not os.path.isfile(fileName)
  raise FileNotFoundError(fileName)
 return cv2.imread(fileName, 1)

スクリーンキャプチャ
import numpy
import cv2
from PIL import ImageGrab
def captureScreen(x, y, w, h):
 image = ImageGrab.grab((x, y, w, h)) #引数はタプル 省略すると全体
 image = numpy.asarray(image) #cv2用に変換
 return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

画像の表示
templeteImage = readImg('test.png')
cv2.imshow('desktop', templeteImage)
cv2.waitKey(0) #0はanykey
cv2.destroyAllWindows()

screen = captureScreen(0, 0, 600 , 400)
cv2.imshow('desktop', screen)
cv2.waitKey(0) #0はanykey
cv2.destroyAllWindows()


テンプレートマッチング
result = cv2.matchTemplete(screen, templeteImage, cv2.TM_CCOEFF_NORMED)
(minval, maxval, minloc, maxloc) = cv2.minMaxLoc(result)
(h, w, d) = templeteImage.shape

この時点で以下の情報がわかる
maxloc[0]: screen上のtempleteImageのx座標
maxloc[1]: screen上のtempleteImageのx座標
maxval: 類似度
w: templeteImageのwidth
h: templeteImageのheight
この情報を使って四角を書く

(続けて)
topLeft = (maxloc[0], maxloc[1])
bottomRight = (maxloc[0] + w, maxloc[1] + h)
outputImage = screen.copy() #ディープコピー
cv2.rectangle(outputImage, topLeft, bottomRight, 0x00ff00)
cv2.imwrite("output.png", outputImage)
| COMMENT:0 | HOME |

 よみこみもろもろ

外部ファイルの読み込み(.mp3, .txt)
READ MORE


audioファイルの読み込み(かんたん)
1. Audioオブジェクトのインスタンスを作る。
引数は読み込むファイルのURL。
インスタンスを作った時点で勝手にファイルが読み込まれる。素敵。

var audio = new Audio('bgm.mp3');

2. インスタンスにcanplay, errorイベントを追加する。
canplayイベントは読み込みに成功して再生可能になったときに発火。
errorは読み込みに失敗したときに発火する。

audio.addEventListener('canplay', function (e) {
console.log(e.path[0].src + 'の読み込みに成功');
});
audio.addEventListener('error', function (e) {
console.log(e.path[0].src + 'の読み込みに失敗');
});

まとめ
var audio = new Audio('bgm.mp3');
audio.addEventListener('canplay', function (e) {
console.log(e.path[0].src + 'の読み込みに成功');
});
audio.addEventListener('error', function (e) {
console.log(e.path[0].src + 'の読み込みに失敗');
});


textファイルの読み込み(かんたん)
ローカルで動かすのがややめんどい。(chrome)

chrome.exeのショートカットを作る。
プロパティを開き、リンク先を以下のように弄る。
「(省略) \chrome.exe" --allow-file-access-from-files」
開いているchromeをすべて閉じてショートカットからchromeを開き直す。

これで準備おk。

1. XMLHttpRequestのインスタンスを作る。
var xhr = new XMLHttpRequest();

2. 読み込むファイルのURLを指定する。
openメソッドを使う。
第一引数に'GET'または'POST'。
第二引数にパスを入れる。

xhr.open('POST', 'data.txt');


3. イベントを追加する。
load, errorがそれぞれ成功と失敗。
読み込みに成功した場合はe.targetにいろいろ入っている。

xhr.addEventListener('load', function (e) {
console.log(e.target.responseText);
});
xhr.addEventListener('error', function (e) {
console.log('data.txtの読み込みに失敗');
});


4. リクエストをsendする。
sendメソッドを使う。

xhr.send();

まとめ
var xhr = new XMLHttpRequest();
xhr.open('POST', 'data5.txt');
xhr.send();

xhr.addEventListener('load', function (e) {
console.log(e.target.responseText);
console.log(e.target.responseURL);
});
xhr.addEventListener('error', function (e) {
console.log('data.txtの読み込みに失敗');
console.log(e);
});
| COMMENT:0 | HOME |

 クソザコ計算機

仕様書
READ MORE


あらかじめ命令を文字列として指定しておく。
(例) iii++Ord-oO

すると指定した命令に従って結果を吐き出す装置を考える。
結果として数列が返る。
(上記の命令による結果の例) [6, 5, 1]


装置の仕様
boxとMemoryの2つの値を持ち、どちらも初期値は0である。
命令の文字列は左から1文字ずつ読み、順に解決していく。
outputされた値は左から順に格納していき、最後に数列として結果を返す。

命令一覧
i: boxに1を足す。
d: boxから1を引く。
c: boxの値を0にする。
C: Memoryの値を0にする。
+: Memoryの値にboxの値を足す。
-: Memoryの値からboxの値を引く。
*: Memoryの値にboxの値を掛ける。
/: Memoryの値からboxの値を割る。小数点以下は切り捨てる。(Floor)
r: boxの値をMemoryの値と等しくする。
o: boxの値をoutputする。
O: Memoryの値をoutputする。

(処理の流れの例)
命令: iii++Ord-oO

初期状態
残りの命令: iii++Ord-oO
box: 0
Memory: 0
output: []

iの実行
残りの命令: ii++Ord-oO
box: 1
Memory: 0
output: []

iの実行
残りの命令: i++Ord-oO
box: 2
Memory: 0
output: []

iの実行
残りの命令: ++Ord-oO
box: 3
Memory: 0
output: []

+の実行
残りの命令: +Ord-oO
box: 3
Memory: 3
output: []

+の実行
残りの命令: Ord-oO
box: 3
Memory: 6
output: []

Oの実行
残りの命令: rd-oO
box: 3
Memory: 6
output: [6]

rの実行
残りの命令: d-oO
box: 6
Memory: 6
output: [6]

dの実行
残りの命令: -oO
box: 5
Memory: 6
output: [6]

-の実行
残りの命令: oO
box: 5
Memory: 1
output: [6]

oの実行
残りの命令: O
box: 5
Memory: 1
output: [6, 5]

Oの実行
残りの命令:
box: 5
Memory: 1
output: [6, 5, 1]



このような装置を考えたとき、希望の数列が得られる最短の命令を考えたい。
(1) [100]
(2) [10, 8, 6, 4, 2]
(3) [1, 1, 4, 5, 1, 4]
| COMMENT:0 | HOME |
| HOME |NEXT

リンク

カレンダー

08 2016/09 10
S M T W T F S
1 2 3
4 6 7 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

カテゴリー

最新CM

[04/21 HermanOn]
[04/21 RonniehamE]
[04/21 StevenBaR]
[04/21 Haroldpr]
[04/21 StephenHozy]
[04/20 Nicolassr]
[04/20 Josephpi]
[04/20 JosephSoth]
[04/20 Douglasot]
[03/13 asa]

最新記事

(09/08)
(09/05)
(09/05)
(08/31)
(08/23)

ブログ内検索

プロフィール

HN:
飛び亀
HP:
性別:
非公開