Joker 2018でのクラスメートのゲームの分析







みなさんこんにちは! 数日前、Joker 2018カンファレンスで与えられたパズルに関する投稿投稿しましたが、それだけではありません! 今年、特にジョーカーにとって、私たちは本日お話しする、おもしろいJavaタスク(だけでなく)でゲーム全体を作りました。



たとえば、この春の最後のJPointで、以前の会議で同様のゲームを作成しました。 ゲームを作成するには、1)ゲームの仕組みを考案し、2)質問を考案し、3)これらすべてを実現する必要がありました。



ゲームの仕組みは非常にシンプルで直感的である必要がありますが、同時に興奮を奪わないように、あまり平凡ではありません。 長い議論の結果、次のゲームを思いつきました。









質問に答えるとき、デューク(左上隅)を他の隅にあるドアの1つに導くようにしなければなりません。 ゲームの1セッションには3分が割り当てられます。 セルを開くには、質問に正しく答える必要があります。質問は、カテゴリに従って毎回ランダムに選択されます。 正解、不正解に対するペナルティ、問題のあるセルはブロックされ、バイパスする必要があるため、ポイントが付与されます。 その結果、パスが非常に長くなったり、完全にブロックされたりする可能性があります。 プレイヤーはさまざまな戦略を選択できます。できるだけ早く出口に着いて、追加のボーナスを獲得してください。 割り当てられた時間内にできるだけ多くの質問に答えます。 単純な質問に長い道のりを踏み込んだり、より複雑な質問に直接進んでより多くのポイントを獲得したりできます。









私たちはメカニズムに対処しましたが、今度は質問をする必要があります。 それらは、最も単純なものからハードコアのものまで、3つのカテゴリーの複雑さである必要があります。 質問の文言は非常に短くする必要があります。テキストのシートを読む時間はありません。 答えの選択は、あまりにも多くの手がかりを与えないようなものでなければなりません。 さて、質問自体は興味深く実用的でなければなりません。 さらに、それらがあまりにも速く繰り返されないように十分な数があるはずです。 共同の努力の結果、データ構造、アルゴリズム、Javaパズル、JVM内部のハードコアな質問、さらにはDockerに関するいくつかの質問について130の質問を思いつくことができました。









問題があります。ゲームは大画面で表示され、近くに立っている人はいくつかのゲームの答えのほとんどを覚えているでしょう。 最初は、暗記を最小限に抑えるには何百もの質問が必要だと思われました。 しかし、熟考すると、彼らはより簡単なオプションがあることに気づきました。 まず、マウスコントロールを削除し、キーボードのみを残しました。 現在、近くに立っている人は質問を見ることができますが、プレーヤーが選択した答えはわかりません。 回答オプションの混合が追加され、暗記が複雑になりました。 各質問に対して、いくつかの類似した、しかしわずかに異なる文言が追加されました。 もちろん、あなたはまだ答えを思い出すことができます、そして、これは会議の2日目に著しく改善された結果から明白でした。 多くのユーザーが数十分間ゲームをプレイし、他のユーザーの記録を破ろうとしました。 しかし、ここではすべてが人生のようです-熱意は報われます。



アイデアの出現から、質問と実装の立ち上げまで2週間が経過しました。 もちろん、すべてがJavaで行われます。 スプリングブーツとGradleを使用。 Webインターフェイスは、Angularで作成されます。 ストレージとして、組み込みのH2データベースが使用されます。これは、すぐに使用できるWebインターフェースを備えており、非常に便利です。 スタンド構成は2台のMacBookで、その写真は2台のテレビに複製されています。 セットアップを簡単にするために、アプリケーションはクラウドにリモートでデプロイされています( https://habr.com/company/odnoklassniki/blog/346868/ )。









私たちはずっと前に学んだ:統計を収集せずに機能を開発すべきではない。 もちろん、ゲームに詳細な統計情報を添付して、共有することもできます。



合計で、このゲームは2日間で811回プレイされました。 質問の複雑さに応じた回答の統計:



難易度

COUNT

CORRECT_PERCENT

1

3552

61

2

2031

49

3

912

46



フィールドのどのセルに、プレイヤーがどのくらいの頻度で到達したか:









フィールドの各セルの正答率:









しかし、最も興味深いのは、もちろん、質問の統計です。 カテゴリごとの分布を考慮して複雑さを評価するのはそれほど簡単ではありませんでした。評価は常に主観的であり、あるユーザーに対する単純な質問は別のユーザーにとっては困難です。 Olegは、「クリーナーも知っている」という言葉で質問の1つを投げることを提案しましたが、多くの「単純な」質問に対する正しい答えを知っているクリーナーは多くなく、プログラマーも知っていることがわかりました。 私たちのゲームからいくつかの質問を提供します-間違った答えのリーダー、あなたの強さを評価してみてください!



  1. このコードを呼び出した結果は?



    System.out.println(1/0d)
          
          





    • ArithmeticExceptionをスローします
    • 無限を印刷します
    • 「NaN」を印刷します
    • 0を印刷します


    答え
    これは非常に単純な質問のようです。 ここに簡単な算数があります、キャッチは何ですか、なぜプレイヤーの28%だけが正しい答えを出したのですか? Javaで整数を0で除算すると、 ArithmeticException



    ます。 しかし、ここには整数がありますか? 注意深く見ていきます。 0の後の「d」とは何ですか? この文字は、これが整数定数0ではなく、 double



    型の値であることを意味します。 そして、式は1.0 / 0.0と同じであることがわかります。 そして、これはゼロによる浮動小数点による除算であり、その結果はDouble.POSITIVE_INFINITY



    です。 したがって、正しい答えは「b」です。

  2. このコードを呼び出した結果は?



     System.out.println( Long.MAX_VALUE==(long)Float.MAX_VALUE );
          
          





    • 印刷する
    • falseを出力します
    • ArithmeticExceptionをスローします


    答え
    まず、 Float.MAX_VALUE



    またはLong.MAX_VALUE



    詳細を理解する必要がありますか? float



    の値の範囲はdouble



    よりも小さくなりますが、その最大値は考えられるlong



    値の範囲を約20桁超えてlong



    ます。 しかし、この場合、型キャストはどのように機能しますか? 推測することはできますが、コードを実行することをお勧めします。 さらに良いことに、Java Language SpecificationのNarrowing Primitive Conversionのセクションを開き、浮動小数点数の値が大きすぎて整数型の利用可能な値の範囲外にある場合、変換結果は整数型を使用して表現できる最大値に等しいことを読んでください。 つまり 変換結果はLong.MAX_VALUE



    です。 回答者の27%が正しい答えを出しました。
  3. Comparable



    できないクラスはどれですか?



    • java.lang.String
    • java.util.TreeSet
    • java.io.File
    • java.lang.Enum


    答え
    この一見単純な質問は、回答者の76%を困惑させました。 ここの答えのどれが正しいか、どの答えが最も人気があったかを自分で推測してください-それはプレイヤーの61%によって選ばれました。

  4. 同一のコードとは何ですか?



     Object o = Math.min(-1, Double.MIN_VALUE)
          
          





    • オブジェクトo = -1
    • オブジェクトo = Double.MIN_VALUE
    • オブジェクトo = -1.0


    答え
    最小のdouble



    値は確かに-1未満です。 もちろん、すべてがそれほど単純ではありません。そうでなければ、私たちは尋ねません。 Double.MIN_VALUE



    と、 Double.MIN_VALUE



    は期待されるもの、つまり「定数はゼロ以外の最小の正の値を保持している」を正確には含んでいません。 Double.MIN_POSITIVE_VALUE



    と呼ぶDouble.MIN_POSITIVE_VALUE



    Double.MIN_POSITIVE_VALUE



    正しいでしょう。 Double



    再び彼の指を一周しました! 正解はObject o = -1.0



    であるため、回答したのは22%のプレーヤーのみです。

  5. このコードを呼び出すと、どの行が生成されますか?



     Long.toHexString(0x1_0000_0000L + 0xcafe_babe)
          
          





    • 1cafebabe
    • カフェベイブ
    • ffffffffcafebabe


    答え
    2番目の回答を選択した場合、あなたは正解した人の22%に含まれます。 この質問は、Joshua BlochとNeal Gafterによる書籍Java Puzzlers:Traps、Pitfalls、and Corner Casesから引用されています。 間違って答えた場合は、落胆しないで、この本を読んでください!

  6. JDK 8では、メソッドパラメーターの注釈のサポートが導入されています。 this



    メソッドのパラメーターに注釈を追加することは可能ですか?



    • 無理です
    • おそらく、ただしバイトコードのみ
    • おそらく、 this



      メソッドの最初のパラメーターとして明示的に定義することによって


    答え
    メソッドパラメーターに注釈を付ける機能がJDK 8で追加されたとき、 this



    パラメーターは奪われていませんでした。 この目的のために、 this



    をメソッドシグネチャで明示的に指定できるようになりました。



     class Foo { public void test(@Annotated Foo this) {} }
          
          





    あなたはその実用的な利点について議論することができますが、今では言語の機能です。 32%のプレイヤーが正しい答えを推測しました。

  7. JDK 8では、 ConcurrentHashMap



    コンストラクターのconcurrencyLevel



    パラメーターは以下に影響します。



    • 読み取り/書き込みの同時実行可能
    • 初期テーブルサイズ
    • 両方のパラメーター


    答え
    オプション2を選択した場合、ゲームのこの最も難しい質問に正解したのは15%です。 問題は、JDK 8ではConcurrentHashMap



    セグメントを破棄したため、 concurrencyLevel



    以前の意味concurrencyLevel



    失ったことです。 テーブルの初期サイズのみに影響し、それでもinitialCapacity



    値を下から制限します。




All Articles