TSG駒場祭前ハッカソンでesolang百マス陣取りゲームをやり、pikeというプログラミング言語を知ったが日本語のレファレンスが少なく、かつ感動したためここにまとめる。
esolang陣取り大会のルールは簡単、「100桁の2進数を10進数に変換するプログラム」を指定された言語で書くと陣地をゲットできます。現在6つの言語がTSG部員の手に落ちました。 pic.twitter.com/voEVTBlq5U
— 東大コンピュータサークルTSG (@tsg_ut) November 20, 2016
pikeとは?
Cに見た目がよく似たプログラミング言語で、動的型付けも静的型付けも可能。wikipediaを見よう。
インストール
公式サイトからダウンロードしてコンパイルするが、そのままでは動かなかったので、多倍長ライブラリのGMPを公式サイトからダウンロードし、解凍してインストールする。
またエラーが出るので、Nettleをダウンロードしインストールする。
READMEに従い、rootのディレクトリでmake,make install.
コマンドpikeを打つと対話型で使え、適当な拡張子で(例えばtest.pike)ファイルを作り、pike test.pike などとすると実行される。
型の種類
basic typeはint,float,stringの三種類。(Cと違いcharがなくてハマった)特殊な型として、mixed型(型はなんでも良いという型)が存在する。
intは同じ78が、
10進数で78
8進数で0116
16進数で0x4e
2進数で0b1001110
1文字の'N'('N'はasciiコードで78)
と表せる。
pikeではintが表せる範囲は非常に大きく、またその範囲を超えた場合にはbignumというintより遅いが大きい型に勝手に変更してくれるので、intしか使う必要がない。
このように動的型付けと静的型付けが混在しているため、変数aがint,float,stringのどれかを確認するためのintp(a),floatp(a),stringp(a)という関数が用意されている。(戻り値はaがint型ならintp(a)==1でそれ以外なら0)
stringは"+"で連結ができるが,
string s = "hogehoge\n"のとき、
s[2]="g"ではなく
s[2]=103
となるので注意。
Zero is special
0は整数値であるだけでなく、すべての型の値がない状態を表し、したがって初期化されずに宣言されたすべての変数は0になる。
公式サイトより↓
float f; // Now, f contains the integer value 0. f = f + 1;// Now, f contains the integer value 1. f = 0; // Now, f contains the integer value 0 again! f = 0.0; // Now, f contains the real value 0.0.
正直気持ち悪いですねー・・・。
したがって、下記のコードの出力は「0Hi!」になります。
int main(){ string s; //s==0!!! s += "Hi!\n"; write(s); }
配列
こういうのが配列になります({2,3,4,1})
({"pohe",4,2.1,"hoge!?",334,({1,1,4,"cookie"}) })
宣言は、
array a; 型はなんでも良い
array(string) a; stringのarray
array(mixed) a; 型何でも良い
でできる。
array a = ({2,3,4});
array b = ({3,5,6});
のとき、
a[1]==3
a + b == ({2,3,4,3,5,6})
となります。
Sample
Hello world!int main(){ write("Hello world!\n"); }
Fizz Buzz
int main(){ for(int i=1;i<100;i++){ if(i%3 == 0 || i%5 == 0){ if(i%3 == 0) write("Fizz"); if(i%5 == 0) write("Buzz\n"); else write("\n");} else write("%d\n",i); } }
標準入力で与えられた二進数を十進数に変換して標準出力に出す
(ハッカソンの課題だった)
int main() { string s=Stdio.stdin.gets(); int i=strlen(s); int res=0; int j=i-1; while(j>=0){ if(s[j]==49){ res= res+pow(2,i-j-1); } j = j-1; } write("%d\n",res); return 0; }
参考リンク
インストールめんどくさいのでちょっとここで試してみよう。https://ideone.com/
公式。
http://pike.lysator.liu.se/
感想
pike,気持ち悪すぎて逆に好きになってしまった。疑問質問まさかりなどがあれば本当にお気軽にどうぞ。