Category: Off Topic

Topik selain programming

  • Perjanjian yang Menguntungkan

    Saya tidak tahu kapan dan di mana cerita ini terjadi. Mungkin juga tidak pernah terjadi.

    Suatu hari, seorang konglomerat bertemu dengan rekan bisnisnya. Rekan tersebut, yang juga sangat kaya raya, menawarinya suatu perjanjian yang menurutnya, orang paling bodoh sekalipun tidak akan melewatkan kesempatan tersebut. Menurut penghitungannya, transaksi tersebut mampu melipatgandakan kekayaannya hanya dalam waktu beberapa hari. Isi perjanjiannya sebagai berikut.

    Setiap hari selama satu bulan, si rekan akan meminjamkan uang sebesar 100.000 (seratus ribu) rupiah kepada si konglomerat. Tentu saja pinjaman itu tidak cuma-cuma. Si konglomerat diwajibkan untuk mengembalikannya, tapi dengan jumlah yang jauh lebih sedikit. Pada hari pertama, si konglomerat harus membayar 1 (satu) sen. Kemudian untuk 100.000 rupiah yang kedua, si konglomerat harus membayar 2 (dua) sen. Seratus ribu rupiah yang ketiga, 4 (empat) sen. Untuk yang keempat, 8 (delapan) sen. Untuk yang kelima, 16 (enam belas) sen. Jadi setiap hari, si konglomerat harus membayar dua kali lipat dari yang dibayarkan pada hari sebelumnya.

    Pada mulanya si konglomerat tampak kebingungan dan penasaran dengan bisnis tersebut. Sampai rekan bisnisnya meyakinkannya bahwa dia tidak akan meminta lebih dari yang sudah dijelaskan tadi. Si rekan hanya meminta si konglomerat untuk menepati janjinya. Setiap hari si rekan akan memberikan 100.000 rupiah dan setiap hari si konglomerat harus membayar sesuai jumlah yang sudah disepakati bersama. Ketentuan lain adalah tidak boleh berhenti sebelum satu bulan penuh.

    Si rekan mungkin sudah gila atau ingin bersenang-senang sebelum mati. Dia membuang jutaan rupiah dalam waktu satu bulan hanya untuk ditukar beberapa sen. Ini adalah kesempatan emas yang tidak mungkin dilewatkan.

    Hanya ada satu ketakutan dalam diri si konglomerat. Dia takut kalau si rekan menyadari kebodohannya dan membatalkan perjanjian tersebut.

    Namun keesokan harinya, si rekan benar-benar datang menepati janjinya dengan membawa uang 100.000 rupiah. Tak lupa dia langsung menagih hak 1 sen yang sudah mereka sepakati. Si konglomerat masih kurang percaya dengan si rekan. Berulang kali dia menghitung dan memeriksa uang tersebut. Uang tersebut asli dan jumlahnya pas, jadi si rekan memang tidak menipunya. Si konglomerat girang bukan kepalang. Rezeki nomplok!

    Sebelum pulang, si rekan mengatakan bahwa besok dia akan datang kembali membawa uang 100.000 rupiah sambil mengingatkan si konglomerat untuk menyiapkan uang 2 sen. Hari yang ketiga 4 sen, hari keempat 8 sen, hari kelima 16 sen, dan 32 sen untuk hari keenam. Pada hari ketujuh, si konglomerat menerima 700.000 rupiah dan hanya membayar:

    1 + 2 + 4 + 8 + 16 + 32 + 64 = 127 sen = 1 rupiah 27 sen.

    Konglomerat tamak ini merasa menyesal, mengapa perjanjiannya hanya untuk 1 bulan. Ini berarti dia hanya akan menerima 3.000.000 rupiah. Dia mulai berpikir untuk membujuk si rekan untuk memperpanjang perjanjian mereka. Tapi itu diurungkannya karena beresiko si rekan akan menyadari ketololannya.

    Hari kedelapan, si konglomerat membayar 128 sen (1 rupiah 28 sen). Hari kesembilan 256 sen (2 rupiah 56 sen). Hari kesepuluh 512 sen (5 rupiah 12 sen). Hari kesebelas 1024 sen (10 rupiah 24 sen). Hari kedua belas 2048 sen (20 rupiah 48 sen). Hari ketiga belas 4096 sen (40 rupiah 96 sen). Hari keempat belas 8192 sen (81 rupiah 92 sen).

    Namun nasib baik si konglomerat tak berumur panjang. Dia segera menyadari bahwa perjanjian itu akan menimbulkan bencana. Setelah 14 hari membayar dengan uang receh, kini dia harus membayar dengan uang ratusan rupiah. Parahnya lagi, pembayarannya meningkat tajam:

    Hari ke-15 => 163 rupiah 84 sen
    Hari ke-16 => 327 rupiah 68 sen
    Hari ke-17 => 655 rupiah 36 sen
    Hari ke-18 => 1.310 rupiah 72 sen
    Hari ke-19 => 2.621 rupiah 44 sen

    Dia masih belum rugi banyak, akan tetapi keuntungannya terus berkurang drastis. Setelah itu si konglomerat harus membayar:

    Hari ke-20 => 5.242 rupiah 88 sen
    Hari ke-21 => 10.485 rupiah 76 sen
    Hari ke-22 => 20.971 rupiah 52 sen
    Hari ke-23 => 41.943 rupiah 4 sen
    Hari ke-24 => 83.886 rupiah 8 sen
    Hari ke-25 => 167.772 rupiah 16 sen

    Pada hari kedua puluh lima, si konglomerat malah membayar lebih banyak dari pada yang diterimanya untuk satu hari. menurut perjanjian, dia tidak dapat berhenti sebelum tepat 1 bulan. Setelah itu segalanya bertambah buruk, nasi telah menjadi bubur. Si konglomerat baru menyadari bahwa dia tertipu.

    Hari ke-26 => 335.544 rupiah 32 sen
    Hari ke-27 => 671.088 rupiah 64 sen
    Hari ke-28 => 1.342.177 rupiah 28 sen
    Hari ke-29 => 2.684.354 rupiah 56 sen
    Hari ke-30 => 5.368.709 rupiah 12 sen

    Ketika si rekan datang untuk terakhir kalinya, si konglomerat dengan lunglai menghitung berapa banyak yang dia bayarkan untuk 3.000.000 rupiah. Ternyata jumlahnya adalah 10.737.418 rupiah 23 sen.

    Umpan 3 juta rupiah itu harus dibayar mahal dengan tekor lebih dari 7 juta rupiah!

    Sebelum mengakhiri cerita ini, saya akan memperlihatkan kalkulasi kerugian si konglomerat.

    1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 + 256 + 512 + 1024 + dst...

    Tentunya angka-angka tersebut tidak asing bagi seorang yang bergelut di bidang teknologi informasi. Untuk memperoleh jumlah uang pada hari ke-n, rumusnya adalah 2n / 100. Dimulai dari n = 0 untuk hari pertama dan karena satuan uang terkecil adalah sen maka hasilnya harus dibagi 100. Sehingga untuk mendapatkan jumlah uang yang harus dibayarkan si konglomerat pada hari terakhir adalah 229 / 100 = 536.870.912 / 100 = 5.368.709,12.

    Untuk menghitung jumlah keseluruhan yang harus dibayarkan juga tidak sulit:

     1 = (0) + 1 
     2 = (1) + 1
     4 = (1 + 2) + 1 
     8 = (1 + 2 + 4) + 1
    16 = (1 + 2 + 4 + 8) + 1
    ...
    

    Dapat dilihat bahwa setiap angka adalah sama dengan jumlah angka sebelumnya ditambah 1. Jadi misal kita ingin menambahkan semua angka dari hari pertama (1) sampai hari kelima (16), maka kita cukup menambahkan angka terakhirnya (16) dengan jumlah semua angka sebelumnya, atau dengan kata lain, angka yang sama dikurangi 1. Hasilnya adalah 16 + (16 – 1) = 31.

    Dengan cara tersebut dapat dengan mudah dihitung jumlah uang yang dibayarkan si konglomerat hanya dengan mengetahui jumlah pembayarannya yang terakhir. Jadi dengan menambahkan 5.368.709,12 dengan 5.368.709,11 maka akan diperoleh jumlah 10.737.418,23.

  • Pembagian dengan Nol dan Kesalahan Kalkulator Google

    Ketika duduk di bangku sekolah (baik dasar ataupun menengah), kita diajarkan bahwa pembagian dengan angka nol adalah tak hingga, atau infinity, dan biasanya ditulis dengan lambang ∞. Dengan menggunakan logika sederhana saja, kita dapat membuktikan bahwa pernyataan tersebut salah.

    Satu dibagi empat dapat dianalogikan dengan membagi sepotong kue kepada 4 orang, artinya adalah masing-masing orang mendapatkan 1/4 bagian. Sekarang jika satu kue dibagi 0 orang, bagaimana mungkin masing-masing mendapat tak hingga bagian? Orang yang menerima kue saja tidak ada.

    Lalu bagaimana jika 0/0? Biasanya setiap bilangan yang dibagi dengan dirinya sendiri hasilnya adalah 1. Namun itu tidak berlaku untuk angka 0. Bagaimana mungkin membagi 0 kue kepada 0 orang dan masing-masing mendapat 1 bagian? Kue dan orang yang menerima sama-sama tidak ada, jadi mustahil bisa muncul angka 1. Dalam matematika kemustahilan dari pembagian dengan angka nol disebut tak terdefinisi (undefined).

    Jika dihitung menggunakan kalkulator, pembagian dengan nol akan menghasilkan error. Namun, hasil yang mengejutkan diperoleh dari kalkulator Google. Menurut Google, 1 dibagi 0 adalah Infinity. Programer aplikasi kalkulator Google melakukan kesalahan! Lain halnya jika 0 dibagi 0, kalkulator Google menghasilkan Error.

    kalkulator google

    Analogi di atas mungkin berguna jika kita ingin menjelaskan pembagian dengan nol kepada orang awam atau anak kecil. Konsep matematika tidak bisa hanya dijelaskan dengan analogi, namun membutuhkan definisi atau aksioma.

  • Complement

    Saya menemukan sebuah lowongan menarik, yaitu setiap kandidatnya diharuskan mengerjakan sebuah soal dan jawabannya dikirimkan beserta surat lamaran.

    A complement of a number is defined as inversion (if the bit value = 0, change it to 1 and vice-versa) of all bits of the number starting from the leftmost bit that is set to 1.
    For example, if N = 5, N is 101 in binary. The complement of N is 010, which is 2 in decimal. Similarly if N = 50, then complement of N is 13
    Complete the function getIntegerComplement(). This function takes N as it’s parameter. The function should return the complement of N.

    Constraints :
    0 ≤ N ≤ 100000.
    Sample Test Cases:

    Input #00:
    50

    Output #00:
    13

    Explanation:
    50 in decimal form equals: 110010.
    Inverting the bit sequence: 001101. This is 13 in decimal
    Input #01:
    100

    Output #01:
    27

    Explanation:
    The bit sequence for 100 equals 1100100.
    Inverting the sequence we get 0011011 which is 27 in decimal.

    Tidak ada keterangan harus menggunakan bahasa pemrograman tertentu. Saya coba kerjakan dengan PHP dengan syarat tidak menggunakan fungsi bawaan PHP decbin() atau sebaliknya bindec(). Kita disuruh mencari complement bit dari masukan berupa bilangan desimal.

    Pertama kali kita harus mengkonversi bilangan tersebut menjadi bentuk biner (secara visual, karena pada dasarnya komputer hanya mengenal bilangan biner). Konversi dari desimal ke biner dapat dilakukan dengan menyimpan hasil bagi bilangan desimal dengan angka 2 dan menuliskannya secara terbalik dari hasil yang terakhir sampai hasil yang pertama. Kemudian hasilnya diubah satu persatu dari yang semula 0 ke 1 dan sebaliknya.

    <?php
    while ($input != 0) {
    
      $sisa[$i] = ~($input % 2) + 2;
      $input = floor($input / 2);
      $i++;
    }
    

    Kode di atas untuk memperoleh sisa hasil bagi, sekaligus dicari complement-nya. Namun kenapa harus ditambah 2? Karena komputer hanya mengenal bilangan biner, jadi kita harus menyesuaikan cara berpikir komputer. Kemudian komputer juga menggunakan two’s complement untuk operasi bilangan binernya. Sehingga angka 0 setelah di-complement akan menghasilkan -1 dan angka 1 akan menghasilkan -2. Hal ini tentu saja tidak sesuai harapan. Jadi ditambahkan dengan angka 2 sehinggan 0 -> -1 + 2 = 1 dan 1 -> -2 + 2 = 0.

    Penjelasannya adalah sebagai berikut. Misalnya pada komputer 8 bit, angka 0 bagi komputer adalah 0000 0000, jika dibalik menjadi 1111 1111. Bilangan biner 1111 1111 adalah two’s complement dari angka 1. Buktinya angka 1 biner 0000 0001 dibalik menjadi 1111 1110 lalu ditambah 1 = 1111 1111. Jadi pernyataan ~0 akan menghasilkan two’s complement dari 1. Operator tilde (~) hanya berfungsi membalik bit, interpretasi angkanya tetap bergantung kepada komputer.

    Tugas selanjutnya adalah mengkonversi lagi bilangan biner ke desimal. Caranya adalah dengan mengalikan tiap-tiap bit (dimulai dari LSB) dengan 2^0, 2^1, dst sampai ke MSB (most-significant bit), kemudian semua hasilnya dijumlahkan. Bilangan biner yang disimpan pada array sisa[] di atas urut dari LSB ke MSB (tidak diminta tampilannya jadi tidak perlu dibalik-balik urutannya).

    <?php
    foreach($sisa as $key => $value) {
    
      if ($key == 0) {
    
        $output = $value * 1;
        continue;
      }
    
      $output += $value * pangkat($key);
    }
    
    echo $output;
    

    Sebenarnya di PHP sudah ada fungsi pangkat, tapi kita buat sendiri aja toh sederhana ini. Sekaligus mengurangi ketergantungan terhadap satu bahasa.

    <?php
    function pangkat($a) {
    
      if ($a == 1)
        return 2;
    
      else
        return 2 * pangkat($a - 1);
    }
    

    Fungsi di atas rekursif. Parameternya adalah indeks dari array sisa[], jadi kalau indeks 3 berarti 2 * 2 * 2. Berikut ini ada listing lengkapnya.

    <?php
    $input = 50;
    $output = 0;
    $sisa[] = 0;
    $i = 0;
    
    if ($input >= 0 && $input <= 100000) {
    
      if ($input == 0)
        echo 1;
    
      else {
    	
        while ($input != 0) {
    
          $sisa[$i] = ~($input % 2) + 2;
          $input = floor($input / 2);
          $i++;
        }
    
        foreach($sisa as $key => $value) {
    
          if ($key == 0) {
    
            $output = $value * 1;
            continue;
          }
    
          $output += $value * pangkat($key);
        }
    
        echo $output;
      }
    }
    
    function pangkat($a) {
    
      if ($a == 1)
        return 2;
    
      else
        return 2 * pangkat($a - 1);
    }
    
  • Mengeblok Flash dari Browser

    Akhir-akhir ini semakin banyak website yang tidak beretika, menjejali pengunjungnya dengan iklan-iklan besar yang menutup hampir keseluruhan layar. Iklan yang muncul tiba-tiba dan menutup sebagian layar tidak hanya memakan bandwidth tetapi juga sangat mengganggu. Banyak sekali iklan bertebaran di situs-situs besar, baik yang berbentuk teks maupun gambar. Tapi di antara iklan yang paling menyebalkan tentunya adalah iklan berbentuk animasi Flash. Tidak hanya menampilkan gambar bergerak, terkadang iklan tersebut juga mengeluarkan suara yang mengagetkan.

    Browser adalah pintu gerbang menuju dunia maya, maka sudah sewajarnya kita melindunginya dari hal-hal yang tidak diinginkan. Untuk mengatasi masalah yang cukup mengganggu ini, kita dapat memasang plugin flashblock pada browser. Khusus untuk Google Chrome ada sebuah pilihan yang dapat diaktifkan untuk mengeblok script-script yang tidak bisa dijalankan secara alami oleh browser, atau dengan kata lain script yang berjalan menggunakan plugin seperti Flash. Cara mengaktifkannya adalah dengan menuju ke menu settings -> Under The Hood -> klik pada tombol Content Settings pada bagian Privacy -> cari pada bagian Plug-ins -> lalu pilih Click to play.

    click to play flash

    Dengan pilihan ini, pengguna diharuskan mengeklik tulisan “click to run the Flash plug-in” pada browser ketika sebuah animasi Flash muncul. Tentunya kita hanya mengeklik pada media yang dipercaya dan tau isinya tidak akan membuang-buang waktu atau bandwidth, misalnya pada saat menonton video di Youtube. Kini kita bisa berselancar, membaca informasi di dunia maya dengan nyaman dan aman tanpa gangguan animasi Flash. Mungkin pada versi Firefox berikutnya pilihan ini juga akan disertakan. Di bawah ini adalah tampilan pada saat dijumpai animasi/video Flash pada browser.

    click to play flash plugin

  • Peraturan Masyarakat

    Dalam kehidupan bermasyarakat, kita harus mematuhi peraturan (norma) yang berlaku. Peraturan yang dibuat oleh orang-orang terpandai dalam masyarakat. Peraturan tersebut dirancang supaya orang-orang pandai bisa hidup dengan nyaman.

    Orang-orang bodoh, tidak akan mengerti peraturan-peraturan tersebut. Tetapi orang-orang pandai tau, bagaimana menggunakan dan memainkannya. Peraturan-peraturan tersebut akan terus melayani orang-orang pandai. Sebagai contoh, pajak, gaji, dana pensiun, asuransi, pelayanan kesehatan, alokasi dana, subsidi, dan lain-lain.

    Orang-orang pandai dengan sengaja membuat peraturan yang sangat sulit untuk dimengerti. Sementara orang-orang bodoh yang berusaha memahami peraturan itu diperlakukan seperti idiot. Jadi bagi orang-orang bodoh, sepanjang hidupnya akan dicurangi dan diharuskan membayar lebih banyak.

    Orang-orang pandai tidak bisa ditipu dengan mudah, mereka akan mengambil manfaat dari situasi ini. Situasi orang-orang bodoh yang dicurangi dan ditindas sepanjang waktu. Ini adalah fenomena yang terjadi di masyarakat. Jika Anda tidak bisa menerima kenyataan ini, buatlah peraturan sendiri! Jika Anda ingin hidup tanpa dicurangi, belajarlah!