コンピュータサイエンス学部でのコードリトリート

SKB Konturのこの記事に触発され 、彼らは彼らの学部(トムスク州立大学、情報学部)でコードリトリートを開催することにしました。 確かに、私たちの目標は特定の技術を教えることではなく、単に知り合い(1〜2コースの参加者の半分)、ファン、そして少し異常なプログラミングを教えることでした。



イベントの形式について簡単に



  1. 45分のセッション(合計4セッション+入門クエスト)。
  2. セッションとセッションの間、コーヒーとパンで15分の休憩。
  3. すべてのセッションに対して1つのタスク。ただし、各セッションはこのラウンドの制限を宣言します。
  4. プログラミングはペア(エンコーダーとナビゲーター)で行われ、カップルには1台のコンピューターがあり、同時にコードを書き込むのは1人だけです(エンコーダー)。
  5. 各セッションはカップルが変わります。
  6. 11分ごとに、カップルは役割を変更します。


「各セッションの後にコードが削除される」という標準的な形式の制限により、イベントには参加しないことが決定されました。 誰もが時間通りにタスクを完了するという自信はありませんでした(結局、参加者はプロのプログラマーではなく、ほとんどが後輩でした)。

さらに、FpMインデックス(1分あたりの楽しみ)を増やすために、Code Retreat形式に関連しない追加の制限が導入されました。



  1. 各ラウンドは、娯楽のさらに別の一般的な制限が発表されています。
  2. 各チームには、個人的な娯楽の制限が適用されます。


タスク



次に詳細に進みます。 タスクは、難解なプログラミング言語HQ9 +のインタープリターを作成することです。 第0ラウンドのタスクは、タスクを決定することでした。 これを行うために、ソーシャルネットワーク(Twitter、Google +、Vkontakte)で、ヒント(テキストと写真)がタグ#coderetreat4csdで公開されました。 「Hello、world!」、「Quine」、「99 bottles of beer」(HQ9 +言語の3つの主要コンポーネント)という答えで終わるヒントの3つのブランチがあり、正しい答えにつながったはずです。 クエストのタスク自体はリストしません。さまざまなテクノロジーの特徴を研究することを目的としたと言えます:rarjpg、base64、コード難読化(例としてjsを使用)、クーラーコード(写真を使用)もちろん、あなたの人生で一度も会ったことがなく、0ラウンドの時間は30分に制限されていた場合は特にそうです。

その結果、割り当てられた時間に誰も決定しませんでしたが、少なくとも1つのチームが個別に各クエストラインを通過しました。 主要な質問を使用して、タスクは参加者に伝えられ、その後、全員が食べに行き、何人かがパニックになり始めたために、通訳が何であるかを互いに伝えました。



1ラウンド



制限はありません。 楽しい仕事はありません。 個々のタスクはありません。 ロボットが住んでいます

ここでは特別なことは何も起こらず、全員がチームに座ってコーディングを始めました。 ほとんどすべてのチームが割り当てられた時間のほとんどを費やしたと言わなければなりません。 ゆっくりと車を運転し、朝、若い人たちに教えました。 実際、pingは大きく、お母さんは電話をしました 。 しかし、最終的には全員が管理し(準備したテストを自動的に実行することさえできましたが、これは絶対に必要ではありませんでした)、サンドイッチを食べに行きました。



2ラウンド。



制約事項:プログラムのソースコードで文字H、Q、9、+を使用しないでください。 楽しいタスク:音楽はバックグラウンドで再生されるため、11分ごとではなく、曲ごとに変更する必要があります。 個別の制限があります(以降のすべてのラウンドでも)。

すべてがもっと楽しくなりました。 コードを再利用する機能はあまり役に立ちませんでした。なぜなら、 新しいコンピューターにアクセスし、初めてコードを目にしました。また、多くの場合、コードが書かれた言語でプログラミングする方法さえ知らなかったのです。 しかし、まだコードを書いた人は非常に少なく、誰もがすでに書いたものに何らかの形で適応しようとしました。 この意味で一番おかしいのは、誰かが最初のラウンドでなんとか書いたパターンコードです。 これは、このコンピューターに座っている他のチームが本当に快適だった唯一の時間でした。

この制限は、私たちが計画したよりもはるかに興味深いことがわかりました。 文字H、Q、9、+の文字列リテラルを使用できないため、すべての文字列をファイルに入れるか、ASCIIコードを使用する必要がありました。 while、then(pascalの場合)、throw、catchを使用できないため、コーディングプロセスはラウンド1よりもずっと楽しくなりましたが、ラウンド2を思いついたときはそれほど難しくないように思えました。

配信された音楽。 プレイリストは、たまにしか気を散らさないように、最大​​量のファンをもたらすような方法で選択されました。 参加者は、ラネツキーでもキルコロフでもない、根気強く、侵入されなかったと言わなければなりません。 すべての集中コーディング。

個々のタスクも優れていました。 それらの最も興味深いもの:



  1. エンコーダーはキーボードのみを使用し、ナビゲーターはマウスのみを使用します。
  2. 識別子はコーシャ名のみを使用するため。

    var cashrut = new StreatReader("input.txt"); string halacha = ""; string jewish; // List<int> rennet = new List<int>(); while ((jewish = cashrut.ReadLine()) != "" && jewish != null) { halacha = String.Concat(halacha, jewish); } List<int> curds = new List<int>(); while (curds.Count != 99) curds.Add(0); var birdsOfPrey = new StreamWriter("output.txt"); int rennet=halacha.Count(p => p == '+'); foreach (char clovenHoof in halacha) {
          
          



  3. 1本の指でコードを書きます。
  4. キャップをオンにしてコードを記述します。


その結果、個々のタスクはそれほど干渉しませんでしたが、参加者自身と他の人の両方に楽しみを追加しました。 一般に、ほぼすべてがこのタスクを完了しました。 そして、いつものように、食べ物。



3ラウンド



制限:算術演算子(ビット単位を含む)および比較演算子を使用しないでください。 楽しいタスク:参加者は、Code Retreatのプログラマーに関するおとぎ話を交互に書きます。

制限は予想したほど複雑ではありませんでした。 誰もが急いで長い追加を書くことを急ぐと思いましたが、それはありませんでした。 その結果、3つのソリューションがありました。文字列に追加して長さを取得し、.NET式を使用して追加し、LINQのCount拡張機能を使用して入力ファイルの「+」文字の数をカウントします(あまり正直なソリューションではありませんが、テストに合格し、本当にそれが好きだった)。

物語はくだらないことが判明した。 哲学、禅、絶望のある種の混合物。 次に、入力してレイアウトします。

このラウンドでの面白い個人制限の中で、「ビルドが成功するたびに、NYAを叫ぶ!」「小さなアヒルの子のダンスを踊る」だけを思い出しました。 しかし、チーム自体だけでなく、周りのすべての人を楽しませました。

食べ物。



4ラウンド



制限:ループ、goto、およびコレクションを使用しないでください(文字列を除く)。 楽しいミッション:いいえ。

主なアイデアは、連中が再帰を使用することを奨励することでした。 文字列は、文字列リテラルでの作業を単純化するためにのみ許可されました(再帰バージョンでは一般に何らかのゴミであるため、毎回ファイルから文字列を読み取らないようにするため)。 その結果、この甘やかしさのおかげで、String.Replaceの面白い解決策は合格しましたが、心配する必要はありません。 ほぼすべてのチームが再帰に到達しましたが、一部のチームは半分の時間で、非常に大きなコマンドシーケンスでのスタックオーバーフローの問題を解決することを提案しました。 ここで、大きなスタックの深さに達したときに新しいスレッドまたはプロセスを使用するという考えに到達する必要があり、このソリューションを思い付く人もいましたが、それを実装するのに十分な時間がありませんでした。

このラウンドに楽しいタスクを追加しなかったのは、 主な制限はすでに複雑であると信じていました。 その結果、参加者は平均して以前のラウンドよりもさらに速くこのラウンドを管理し、明らかに4時間でスイングしました。

興味深い個々の制限:



  1. ナビゲーターは目隠しします。
  2. 識別子には「_」のみを使用します。

      case '9': { var __________ = new StreamReader("lyrics.txt"); string _________ = __________.ReadToEnd(); __________.Close(); ________.WriteLine(_________); break; } } if (_.Length == 1) return ______; else { _ = _.Remove(0, 1); ______=__(_, ___, ______); return ______; } }
          
          



  3. 中国語の識別子。

     static void Main(string[] args) {輸入 = File.ReadAllText("input.txt"); FileStream 作為故事講述 = new FileStream("output.txt", FileMode.Create); FileStream 用故事畫裝飾 = new FileStream("counter.txt", FileMode.Create);閱讀 = new StreamWriter(作為故事講述); StreamWriter 他編造了他的學歷經歷 = new StreamWriter(用故事畫裝飾);表(輸入);他編造了他的學歷經歷.Write(計數器);他編造了他的學歷經歷.Close();閱讀.Close(); }
          
          



  4. スペースやタブを使用しないでください。

     private static void ReadSymbol(in i) { char[] c=new char[1]; if(file.Read(c,i,1)<=0) return; i++; switch(c[0]) { case 'H':file1.WriteLine("Hello,world!");break; case 'Q':file1.WriteLine(file);break; case '9':file1.WriteLine(stih);break; case '+':count++;break; } } } }
          
          





終わり。 清掃サービス。 ヴァリム。



イベントはとても楽しく、それほど難しくないことが判明しました。 16人の参加者(すべてのコースから、学士号1つから修士号2つまで)、オーガナイザー8人、食事の束、5時間のコーディング、3つのプログラミング言語(Object Pascal、C#、C ++)。 誰もが幸せなので、私たちもそうです。 もっと使います。 もっとプログラムして楽しんでください!



All Articles