Skip to content

Instantly share code, notes, and snippets.

@madidier
Last active April 25, 2017 21:25
Show Gist options
  • Save madidier/26ac9009df1ae435df508af4fcf37c5e to your computer and use it in GitHub Desktop.
Save madidier/26ac9009df1ae435df508af4fcf37c5e to your computer and use it in GitHub Desktop.
***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii***i
*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i
*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii
***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii**
*i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii***
i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*
i*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*i
i***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii*
**i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**
*i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i
*i*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*
ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii
***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii*
**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**
i*i*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii
*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*i
i***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii
***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii*
*i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii*ii**i*i*ii***i*
i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii**i*i*ii**i*i*
i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*
ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**
i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*
i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*
i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii
**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i
*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i
*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*i
i*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i
*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i
*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i
*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*
i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii**
*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i
*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*
ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*i
i**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*i
i**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i
*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*
i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i
*ii**i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**
*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i
*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*
i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*
i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*
ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i
*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii*
*i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***
i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii*
*i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*i*ii***i*
i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*
i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*
ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i
*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i
*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i
*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*ii***i*i
*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii**i*i*i
i**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii
***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*
i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*i
i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i
*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**
i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i
*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i
*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*i
i**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*
i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*
i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*
ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*
i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*
i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*
i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i
*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*
i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**
*i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*
i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*
i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*i
i**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii*
**i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***
i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*
i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii
*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii**
*i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i
*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*
*i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*
ii*i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i
*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*i
i**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*
ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*
i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i
*ii*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*
i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii
***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii*
*i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i
*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*
i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**
i*i*ii**i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*i
i**i*i*ii*i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i
*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii
**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*
ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i
*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*
ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i
*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*
i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i
*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*i
i**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*
i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii
**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii*
**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i
*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i
*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**
i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii
***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii*
*i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i
*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii
**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i
*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*i
i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii*
*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**
i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*
i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i
*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii
*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*
ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**
i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii*
**i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*i
i**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*i
i*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*
ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*i
i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii
*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii
**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*
i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*
ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*i
i**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i
*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*
**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i
*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i
*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*
i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii**
*i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii
**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii
*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*i
i**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii*
*i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i
*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii
***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i*i*ii
**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i
*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii
**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii
*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*i
i**i*i*ii****i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*
ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*
i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i
*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***
i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*
i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*
i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii
***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii*
**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**
i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*
i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii**
*i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*i
i***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii*
*i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii
***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*
ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*i
i*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*
i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*i*
ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*
ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii**
*i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i
*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i
*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*
ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i
i***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii
**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii****i
*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*
i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**
i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*
i*i*ii**i*i*ii*i*i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*
i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii
**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i
*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i
*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*i
i*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i
*i*ii**i*i*ii*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i
*i*ii*ii**i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii**i*i*ii*i*i*ii***i*i*i
*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*
ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*i
i***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii
**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i
*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*
i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii
*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**
*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***
i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*ii
{-# LANGUAGE BangPatterns #-}
module Iota
( Expr(..)
, run
) where
import Prelude hiding (succ)
import Control.Monad (void)
import Data.Char (chr, ord)
data Expr
= Iota
| App Expr Expr
instance Show Expr where
show Iota = "i"
show (App f x) = "*" ++ show f ++ show x
run :: Expr -> IO ()
run = void . eval . wrapMain . toEval
data Eval
= Iota'
| S
| K
| Eval :$ Eval
| Bind
| Read
| Write
| Zero
| Succ
deriving Eq
infixl 9 :$
instance Show Eval where
show Iota' = "i"
show S = "s"
show K = "k"
show (f :$ x) = "*" ++ show f ++ show x
show Bind = ">"
show Read = "r"
show Write = "w"
show Zero = "0"
show Succ = "+"
toEval :: Expr -> Eval
toEval Iota = Iota'
toEval (App f x) = toEval f :$ toEval x
wrapMain :: Eval -> Eval
wrapMain e = e :$ Bind :$ Read :$ Write
interpret :: (Eval -> a) -> Eval -> a
interpret go (Iota' :$ x ) = interpret go $ x :$ S :$ K
interpret go (K :$ x :$ _ ) = interpret go x
interpret go (S :$ x :$ y :$ z) = interpret go $ x :$ z :$ (y :$ z)
interpret go (f :$ x ) | f /= f' = interpret go (f' :$ x) where f' = interpret id f
interpret go expr = go expr
eval :: Eval -> IO Eval
eval = interpret go
where
go (Bind :$ x :$ y) = eval x >>= eval . (y :$)
go Read = church . ord <$> getChar
go (Write :$ x ) = write x
go expr = pure expr
write x = case unChurch x of
Just c -> putChar (chr c) *> pure Iota'
Nothing -> error "Write: Not a number"
-- Huge thanks to:
-- http://journal.batard.info/post/2008/03/02/ski-calculus-in-haskell-shell
church :: Int -> Eval
church n = iterate succ zero !! n
where
succ n = S :$ (S :$ (K :$ S) :$ K) :$ n
zero = K :$ (S :$ K :$ K)
unChurch :: Eval -> Maybe Int
unChurch expr = interpret (go 0) (expr :$ Succ :$ Zero)
where
go !acc Zero = Just acc
go !acc (Succ :$ x) = interpret (go (acc + 1)) x
go _ x = Nothing
**i*i*ii**i*i*ii***i*i*i*ii*ii**i*i*ii****i*i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii
*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*i
i**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i
*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***
i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii*ii***i*i*i*ii**i*i*ii*i*
i*ii***i*i*i*ii*ii**i*i*ii**i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*
i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii
***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii*
*i*i*ii*i*i*ii*ii**i*i*ii*ii***i*i*i*ii**i*i*ii**i*i*i*ii***i*i*i*ii**i*i*ii*i*i
*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*
i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii**i*i*i*ii**i*i*ii*i*i
*ii***i*i*i*ii***i*i*i*ii**i*i*ii*i*i*i*ii***i*i*i*ii**i*i*ii*i*i*ii*ii**i*i*ii*
ii**i*i*ii**i*i*ii*ii
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment