ICFP プログラミングコンテストに 言語で参加してみた @kinaba (稲葉 一浩).

Slides:



Advertisements
Similar presentations
山元進.  for 文  while 文  do ~ while 文  文のネスト  break 文  continue 文.
Advertisements

プログラミング第5回 1 while ループ 文字列の操作
社会人学習講座 「Javaプログラミング概論」
東京工科大学 コンピュータサイエンス学部 亀田弘之
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング基礎I(再) 山元進.
IO - 入出力 小西 亨.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
稲葉 一浩 (k.inaba) Python と プログラミングコンテスト 稲葉 一浩 (k.inaba)
~手続き指向からオブジェクト指向へ(Ⅰ)~
Ex7. Search for Vacuum Problem
2008/03/01 D-BOF k.inaba はじめての initial D 2008/03/01 D-BOF k.inaba
Ex8. Search for Vacuum Problem(2)
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング基礎I(再) 山元進.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
haXeでオリジナルコンポーネント作り WCAN mini Vol 小笠原
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
アルゴリズムとデータ構造 2011年6月13日

リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
第20章 Flyweight ~同じものを共有して無駄をなくす~
C#とC++とオブジェクト指向 上甲 健史.
プログラミング言語入門 手続き型言語としてのJava
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
50年前のプログラミング言語 50年後のプログラミング言語
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
第11週:super/subクラス、継承性、メソッド再定義
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
Java8について 2014/03/07.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
Ex7. Search for Vacuum Problem
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
0からわかるF# Part1 中 博俊 F# September 2008 CTP Base.
pointcut に関して高い記述力を持つ アスペクト指向言語 Josh
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
アルゴリズムとプログラミング (Algorithms and Programming)
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとデータ構造 2012年6月11日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
参考:大きい要素の処理.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
プログラミング 2 静的変数.
Presentation transcript:

ICFP プログラミングコンテストに 言語で参加してみた @kinaba (稲葉 一浩)

自己紹介 D言語の言語仕様の日本語訳をしています 最近更新が遅くてすみません

日本語訳ページの紹介 去年から github に 翻訳レポジトリを 置きました。 1Clickで 誤訳等の 修正リクエスト できます。

本題

ICFP とは λ計算 型システム Haskell, ML, Scheme プログラム 検証

ICFP Programming Contest 6月か7月に開催 (の年が多い) 72時間勝負 (の年が多い) チーム人数制限なし (の年が多い) コンテストで競うテーマは年によってさまざま (ゲームの AI を作ることが多い)

勝つと、使った言語が表彰されます 使用言語は自由(関数型言語に限りません!) In addition (to 賞金), the organizers will declare ... the first place team's language is "the programming language of choice for discriminating hackers", the second place team's language is "a fine tool for many applications“, and ...

各言語のコミュニティで話題になれます

自分の戦績 2003 : OCaml 2004 : JavaScript 2005 : JavaScript 2006 : D, (Ruby, Java) => 2位 2007 : C++ 2008 : JavaScript 2009 : Java 2010 : D, Ruby, (OCaml, Java) 2011 : (出題) 2012 : D => 6位

今年の問題

今年の問題の入出力仕様 標準入力でマップのデータが渡される 標準出力に文字列で操作列を出力 アスキーアート 標準出力に文字列で操作列を出力 [UDLRS]* 制限時間160秒が近づくと SIGINT シグナルで 知らせるので適切に終了 という動作をする、Debian 32bitで動く 実行ファイルを提出すれば良い

www.kmonos.net/repos/icfpc12 やったこと

gui.d 「可視化」は超重要

google: icfp visualizer

gui.d DFL を使いました http://www.dprogramming.com/dfl.php https://github.com/Rayerd/dfl

gui.d の雰囲気 this.keyDown ~= (Control c, KeyEventArgs ev) { switch(ev.keyCode) { case Keys.DOWN: do_manual_command('D'); break; case Keys.UP: do_manual_command('U'); break; ... };

やりたかったけど できなかったこと

util.d いつも自分がつかっているユーティリティ

p.toString == “Point(x: 12, y:345)” util.d クラス定義に一行足すと、色々なメソッドを 自動定義します 名前は Haskell の deriving (Eq, Ord, Show) 由来 class Point { public immutable int x, y; mixin DeriveCreate; mixin DeriveCompare; mixin DeriveShow; } new Point(12, 345) (p1 == p2), p1.toHash() p.toString == “Point(x: 12, y:345)”

util.d の雰囲気 template DeriveShow() { override: string toString() const { string str = typeof(this).stringof ~ "("; foreach(i,mem; this.tupleof) { if(i) str ~= ", "; str = str ~ this.tupleof[i].stringof[5..$] ~ ":" ~ text(mem); } return str ~ ")";

solver.d がんばりました

solver.d 戦略 “一番近い 「λ」 へ最短で突き進む”の繰り返し 盤面が大きく変化しそうなルートは距離を大きく とる 20手先読みして Game Over なら ランダムに数手 動きを変える

戦略 そんなに賢いことはやっていない 実行速度が重要だった  72時間なので、他のチームもそんなに大したことはできない。当たり前のルーチンを確実に 実装するだけでそこそこな順位を取れる 実行速度が重要だった 最大 1000 × 1000 = 1MB のマップを160秒で 探索しきれないといけない

(実は久しぶりにそれなりの規模のD プログラムを書いてみて) 不満だったところ const なオブジェクトを 指す書き換え可能な変数が欲しい 昔は const Type と const(Type) の区別が できた気がする・・・ const(Point2d) p = new Point2d; p.x = 100; // ERROR. GOOD!! p = new Point2d; // ERROR! WHY?

余談 (去年の7月のコードを今のdmdでコンパイルしてみたら どうなるか) 今日の準備中にきづいたこと 余談 (去年の7月のコードを今のdmdでコンパイルしてみたら どうなるか)

2.059 -> 2.062 extern(C) static void catch_sigint(int) { ... } core.stdc.signal.signal(SIGINT, &catch_sigint); output.d(85): Error: function core.stdc.signal.signal ( int sig, extern (C) void function(int) nothrow @system func) is not callable using argument types (int,extern (C) void function(int _param_0)) Error: cannot implicitly convert expression (& catch_sigint) of type extern (C) void function(int _param_0) to extern (C) void function(int) nothrow @system

? 2.059 -> 2.062 a.d(6): Error: &a is not an lvalue import std.typecons; void main() { Tuple!(int,int)[] a, b; (true ? a : b) ~= tuple(1,2); } a.d(6): Error: &a is not an lvalue a.d(6): Error: __error is not an lvalue a.d(6): Error: cannot append type Tuple!(int, int) to type Tuple!(int, int)[]* ?

まとめ

ICFPコンテストは 関数型言語の会議ですが… ゲームAIを作れというタスクが多いですが… どんな言語で参戦しても OK! みなさまの好きな言語 (D!) を宣伝しましょう ゲームAIを作れというタスクが多いですが… 短期間の戦いなので、GUI や管理Webサービスなど、人間とインタラクトできる環境が簡単に作れることが重要 ゲームAIの知識はほとんどいらない 高機能で高速な言語は当然有利 (D!)

今年もあるようです(多分6月か7月) Let’s join and enjoy!!!

おまけ

全自動ソートキラー http://www.kmonos.net/wlog/128.html#_2343121201 ソートアルゴリズム非依存で sort 関数の最悪ケース 「を発見するアルゴリズム」

std.algorithm.sort #cmp array size