Analisis game dari Classmates di Joker 2018


Halo semuanya! Beberapa hari yang lalu, kami memposting sebuah posting tentang teka-teki yang diberikan pada konferensi Joker 2018. Tapi itu belum semuanya! Tahun ini, terutama untuk Joker, kami membuat seluruh permainan dengan tugas Java yang tidak kalah menarik (dan tidak hanya), yang akan kita bicarakan hari ini.

Kami membuat game serupa di konferensi sebelumnya, misalnya, pada JPoint terakhir musim semi ini. Untuk membuat game, kami harus: 1) membuat mekanika game, 2) mengajukan pertanyaan, 3) menyadari semua ini.

Mekanika gim harus sangat sederhana, intuitif, tetapi pada saat yang sama tidak terlalu dangkal, agar tidak menghilangkan kesenangan. Sebagai hasil dari diskusi panjang, kami datang dengan permainan berikut:


Saat menjawab pertanyaan, kita harus mencoba mengarahkan Duke (di sudut kiri atas) ke salah satu pintu di sudut lain. Untuk satu sesi permainan, 3 menit diberikan. Untuk membuka sel, Anda harus menjawab pertanyaan dengan benar, yang dipilih setiap kali secara acak sesuai dengan kategorinya. Poin diberikan untuk jawaban yang benar, penalti untuk jawaban yang salah, sel dengan pertanyaan diblokir dan harus dilewati. Akibatnya, jalan mungkin berubah menjadi cukup panjang atau bahkan blok. Pemain dapat memilih strategi yang berbeda: sampai ke pintu keluar sesegera mungkin dan mendapatkan bonus tambahan; jawab pertanyaan sebanyak mungkin dalam waktu yang ditentukan; melangkah jauh pada pertanyaan sederhana, atau langsung pada yang lebih kompleks dan mendapatkan lebih banyak poin.


Kami berurusan dengan mekanik, sekarang kami perlu mengajukan pertanyaan. Mereka harus dari tiga kategori kompleksitas, dari yang paling sederhana hingga yang hardcore. Kata-kata dari pertanyaan harus sangat singkat, tidak akan ada waktu untuk membaca lembaran teks. Pilihan jawaban harus sedemikian rupa sehingga tidak memberikan terlalu banyak petunjuk. Nah, pertanyaannya sendiri harus menarik dan praktis. Selain itu, seharusnya ada banyak dari mereka sehingga mereka tidak mengulang terlalu cepat. Sebagai hasil dari upaya bersama, kami berhasil menghasilkan 130 pertanyaan tentang struktur data, algoritma, "java puzzle", pertanyaan hardcore tentang internal JVM, dan bahkan beberapa pertanyaan tentang Docker.


Ada masalah: permainan ditampilkan di layar lebar, dan mereka yang berdiri di dekatnya akan mengingat sebagian besar jawaban untuk beberapa permainan. Pada awalnya, sepertinya kita perlu ratusan pertanyaan untuk meminimalkan kemungkinan menghafal. Tetapi, setelah refleksi, mereka menyadari bahwa ada pilihan yang lebih sederhana. Untuk memulai, lepaskan kontrol mouse, hanya menyisakan keyboard. Sekarang mereka yang berdiri di dekat melihat pertanyaan, tetapi tidak melihat jawaban yang dipilih pemain. Menambahkan campuran pilihan jawaban, mempersulit mengingat. Untuk setiap pertanyaan, ditambahkan beberapa kata yang mirip tetapi sedikit berbeda. Tentu saja, Anda masih dapat mengingat jawabannya, dan ini terbukti dari hasil yang terlihat membaik pada hari kedua konferensi. Banyak pengguna menghabiskan puluhan menit bermain game, mencoba memecahkan rekor orang lain. Tapi di sini semuanya seperti dalam hidup - semangat dihargai.

Dua minggu berlalu dari ide ke realisasi pertanyaan dan implementasi. Tentu saja semuanya ada di Jawa. Spring boot bekas dan Gradle. WEB-interface dibuat pada Angular. Sebagai penyimpanan, basis data H2 built-in digunakan, yang keluar dari kotak dengan antarmuka web, yang sangat nyaman. Konfigurasi dudukan adalah dua MacBook, gambar yang diduplikasi pada dua TV. Untuk kemudahan pengaturan, aplikasi telah dikerahkan dari jarak jauh ke cloud kami ( https://habr.com/company/odnoklassniki/blog/346868/ ).


Kami belajar sejak lama: tidak ada fitur yang harus dikembangkan tanpa mengumpulkan statistik. Tentu saja, kami juga melampirkan statistik terperinci ke permainan, yang dapat kami bagikan.

Secara total, permainan dimainkan 811 kali dalam dua hari. Statistik jawaban tergantung pada kompleksitas pertanyaan:

KESULITAN
COUNT
CORRECT_PERCENT
1
3552
61
2
2031
49
3
912
46

Ke sel mana di lapangan dan seberapa sering pemain mencapai:


Persentase jawaban yang benar pada setiap sel bidang:


Tetapi yang paling menarik tentu saja adalah statistik pertanyaan. Itu tidak mudah untuk mengevaluasi kompleksitas mereka dengan mempertimbangkan distribusi berdasarkan kategori, evaluasi selalu subyektif, dan pertanyaan sederhana untuk satu pengguna sulit untuk yang lain. Oleg menyarankan untuk membuang salah satu pertanyaan dengan kata-kata "bahkan petugas kebersihan mengetahuinya," tetapi ternyata tidak banyak pembersih tahu jawaban yang tepat untuk banyak pertanyaan "sederhana", dan programmer juga. Kami menawarkan beberapa pertanyaan dari permainan kami - para pemimpin pada jawaban yang salah, cobalah untuk mengevaluasi kekuatan Anda!

  1. Hasil dari pemanggilan kode ini?

    System.out.println(1/0d) 

    • Melemparkan ArithmeticException
    • Mencetak Infinity
    • Cetakan "NaN"
    • Akan mencetak 0

    Jawabannya
    Ini sepertinya pertanyaan yang sangat sederhana. Berikut ini adalah aritmatika sederhana, apa yang bisa menjadi tangkapan, mengapa hanya 28% pemain yang memberikan jawaban yang benar? Membagi bilangan bulat dengan 0 di Jawa menghasilkan ArithmeticException . Tetapi apakah ada bilangan bulat di sini? Kami akan melihat dengan cermat. Apa itu "d" setelah 0? Huruf ini berarti bahwa ini bukan konstanta bilangan bulat 0, tetapi nilai tipe double . Dan ternyata ekspresinya identik dengan 1.0 / 0.0. Dan ini adalah pembagian dengan titik mengambang nol, yang hasilnya adalah Double.POSITIVE_INFINITY . Jadi jawaban yang benar adalah "b".
  2. Hasil dari pemanggilan kode ini?

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

    • cetak benar
    • akan mencetak false
    • melempar ArithmeticException

    Jawabannya
    Pertama, Anda perlu memahami apa yang lebih: Float.MAX_VALUE atau Long.MAX_VALUE ? Meskipun float memiliki rentang nilai yang lebih kecil dari double , nilai maksimumnya adalah sekitar 20 urutan besarnya di luar kisaran kemungkinan nilai long . Tapi bagaimana cara kerja casting tipe dalam kasus ini? Orang bisa menebak, tetapi lebih baik menjalankan kodenya. Lebih baik lagi, buka Java Language Specification, bagian tentang Narrowing Primitive Conversion, dan baca bahwa jika nilai angka floating-point terlalu besar dan berada di luar kisaran nilai yang tersedia dari tipe integer, maka hasil konversi sama dengan nilai maksimum yang dapat direpresentasikan menggunakan tipe integer . Yaitu hasil konversi adalah Long.MAX_VALUE . Jawaban yang benar diberikan oleh 27% responden.
  3. Kelas mana yang tidak Comparable ?

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

    Jawabannya
    Pertanyaan yang tampaknya sederhana ini membingungkan banyak, atau lebih tepatnya, 76% dari mereka yang menjawab. Tebak untuk diri sendiri jawaban mana di sini yang benar dan mana jawaban yang paling populer - 61% pemain memilihnya.
  4. Apa kode identik dengan?

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

    • Objek o = -1
    • Objek o = Dobel .IN_VALUE
    • Objek o = -1.0

    Jawabannya
    Nilai double minimum pasti kurang dari -1, apa lagi yang bisa salah? Tentu saja, semuanya tidak begitu sederhana, kalau tidak kita tidak akan bertanya. Ternyata Double.MIN_VALUE tidak mengandung persis apa yang diharapkan, yaitu "konstan yang memegang nilai bukan nol positif terkecil", menurut dokumentasi. Akan Double.MIN_POSITIVE_VALUE tepat menyebutnya Double.MIN_POSITIVE_VALUE . Double lagi melingkari jarinya! Jawaban yang benar adalah: Object o = -1.0 , dan hanya 22% pemain yang menjawab.
  5. Baris apa yang akan dihasilkan dari pemanggilan kode ini?

     Long.toHexString(0x1_0000_0000L + 0xcafe_babe) 

    • 1cafebabe
    • cafebabe
    • ffffffffcafebabe

    Jawabannya
    Jika Anda memilih jawaban kedua, maka Anda adalah di antara 22% dari mereka yang menjawab dengan benar. Pertanyaan ini diambil dari buku Java Puzzlers: Traps, Pitfalls, and Corner Cases, yang ditulis oleh Joshua Bloch dan Neal Gafter. Jika Anda menjawab salah, jangan berkecil hati, dan lari untuk membaca buku ini!
  6. JDK 8 memperkenalkan dukungan untuk anotasi pada parameter metode. Apakah mungkin menambahkan anotasi ke parameter metode this ?

    • Itu tidak mungkin
    • Mungkin, tetapi hanya dalam bytecode
    • Mungkin dengan mendefinisikan this secara eksplisit sebagai parameter pertama untuk metode ini

    Jawabannya
    Ketika kemampuan untuk menempatkan anotasi pada parameter metode ditambahkan di JDK 8, parameter ini tidak dicabut. Untuk tujuan ini, this sekarang dapat secara eksplisit ditentukan dalam tanda tangan metode:

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

    Meskipun Anda dapat berdebat tentang manfaat praktisnya, sekarang ini merupakan fitur bahasa. 32% pemain menebak jawaban yang benar.
  7. Di JDK 8, parameter concurrencyLevel di konstruktor ConcurrentHashMap memengaruhi:

    • Baca / Tulis Konkurensi Tersedia
    • Ukuran tabel awal
    • Pada kedua parameter

    Jawabannya
    Jika Anda memilih opsi 2, maka Anda adalah di antara 15% yang memberikan jawaban yang benar untuk pertanyaan paling sulit dari permainan ini. Masalahnya adalah bahwa di JDK 8 segmen yang ditinggalkan di ConcurrentHashMap , jadi concurrencyLevel kehilangan makna sebelumnya. Ini hanya mempengaruhi ukuran awal tabel, dan bahkan yang hanya membatasi nilai kapasitas awal dari bawah.

Source: https://habr.com/ru/post/id427735/


All Articles