Skip to content

Update konversi angka terbilang

Setelah sekian lama tidak menulis, akhirnya muncul lagi niat untuk menulis :) .

Di 2013 ini, saya meng-update kode konversi angka terbilang yang sudah pernah dibuat tahun 2010 lalu, di sini. Tidak banyak yang berubah. Kali ini, saya menulisnya di Visual Studio 2010, ada perampingan kode dan sudah ada unit test. Fitur yang ditambahkan adalah user bisa mengubah teks mata uang (default-nya adalah rupiah) dan teks sen (default-nya adalah sen) sesuai keinginan user.

Money class :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Guavabox.Accounting {
    public class Money {
        static string[] _units = {
            String.Empty, "satu", "dua", "tiga", "empat",
            "lima", "enam", "tujuh", "delapan", "sembilan"
        };

        static string[] _thousands = {
            String.Empty, "ribu", "juta", "miliar", "triliun"
        };

        public decimal Amount { get; private set; }
        public string CurrencyText { get; set; }
        public string CentText { get; set; }

        public Money(decimal amount)
        {
            if (amount < 0m)
                throw new ArgumentOutOfRangeException();

            Amount = amount;
            CurrencyText = "rupiah";
            CentText = "sen";
        }

        public override string ToString()
        {
            List<string> textHolder = new List<string>();
            ProcessIntegerPartConvertionToString(textHolder);
            ProcessFractionPartConvertionToString(textHolder);
            return String.Join(" ", textHolder.Where(x => x != String.Empty));
        }

        private void ProcessIntegerPartConvertionToString(List<string> textHolder)
        {
            long integerPart = (long)Amount;
            if (integerPart == 0L) {
                textHolder.Add("nol");
            } else {
                int[] parts = SplitIntegerPart(integerPart).ToArray();
                for (int index = parts.Length - 1; index >= 0; index--) {
                    ConvertToText(textHolder, parts[index], _thousands[index % _thousands.Length]);
                }
            }

            textHolder.Add(CurrencyText);
        }

        private IEnumerable<int> SplitIntegerPart(long amount)
        {
            while (amount != 0L) {
                yield return (int)(amount % 1000L);
                amount /= 1000L;
            }
        }

        private void ProcessFractionPartConvertionToString(List<string> textHolder)
        {
            decimal fraction = Amount - Decimal.Truncate(Amount);
            if (fraction > 0m) {
                int cent = (int)(fraction * 100m);
                ConvertToText(textHolder, cent, CentText);
            }
        }

        private void ConvertToText(List<string> textHolder, int amount, string suffix)
        {
            // amount == 123, parts[2] = 1, parts[1] = 2, parts[0] = 3
            int[] parts = new int[3];
            int temp = amount;
            for (int index = 0; index < parts.Length; index++) {
                parts[index] = temp % 10;
                temp /= 10;
            }

            if (parts[2] == 1) {
                textHolder.Add("seratus");
            } else if (parts[2] != 0) {
                textHolder.Add(_units[parts[2]]);
                textHolder.Add("ratus");
            }

            if (parts[1] == 1) {
                switch (parts[0]) {
                    case 0: // cek angka 10
                        textHolder.Add("sepuluh");
                        break;
                    case 1: // cek angka 11
                        textHolder.Add("sebelas");
                        break;
                    default:
                        textHolder.Add(_units[parts[0]] + " belas");
                        break;
                }

                textHolder.Add(suffix);
                return;
            } else if (parts[1] != 0) {
                textHolder.Add(_units[parts[1]]);
                textHolder.Add("puluh");
            }

            bool isOneThousand = amount == 1 && suffix == "ribu";
            if (isOneThousand) {
                textHolder.Add("seribu");
            } else {
                textHolder.Add(_units[parts[0]]);
                textHolder.Add(suffix);
            }
        }
    }
}

Contoh penggunaan kode program bisa dilihat di dalam project unit test.

Kode program bisa diunduh dengan mengklik link di bawah. Silahkan menggunakan kode program ini di program yang anda buat, dengan catatan ada kredit nama saya atau link yang mengarah ke blog ini. :)

This article is licensed under a
Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
Creative Commons License

Antara Logika dan Realita, Merancang Persepsi : Project Euler

What is the most resilient parasite? A bacteria? A virus? An intestinal worm? An idea. Resilient. Highly contagious. Once an idea has taken hold of the brain,it’s almost impossible to eradicate. An idea that is fully formed,fully understood, that sticks.

Argumentasi atau pendapat merupakan sebuah pernyataan bermakna yang dibuahkan oleh logika pikiran. Seringkali kita mendengar pendapat atau argumentasi dari seseorang yang kita rasa tidak masuk akal. Ketika seseorang mengutarakan ketidakmasukakalan pendapat orang lain, pada dasarnya orang tersebut membenturkan logikanya dengan logika orang lain.

Lalu, apa itu logika ? Logika adalah pembangunan persepsi seseorang terhadap suatu hal. Ketika seseorang menghadapi hal yang pernah ia jumpai sebelumnya, pada umumnya, dia mengeluarkan argumen sama seperti argumen telah dibangunnya dulu terhadap hal tersebut. Lain halnya, bila orang tersebut terbuka pikirannya (mau berimajinasi). Dia akan cenderung berusaha mencari apakah ada persepsi yang lebih baik daripada persepsi yang telah dibangun oleh logikanya dulu. Inilah tipe orang yang saya sebut sebagai open-minded.

Tetapi, ketika orang tersebut menghadapi dengan hal baru, hal yang belum pernah ia jumpai sebelumnya, maka ia akan mengkonstruksi sebuah ide imajinasi lalu membuat jembatan pondasi alasan antara imajinasi tersebut dengan persepsi realita yang dimilikinya.

Logic

Ketika ia merasa, meyakini jembatan pondasi alasan tersebut kuat dan mampu menghubungkan antara persepsi realitanya dengan ide imajinasi itu, maka ia akan menerima ide imajinasi itu menjadi salah satu bagian persepsi realita yang baru bagi dirinya. Pada saat itulah terjadi proses penanaman ide oleh diri sendiri, atau yang populer (klaim subjektif, hehehe :-) ) dikenal dengan SELF INCEPTION.

Recursive learning

Komponen logika :

- Ide (imajinasi)

Bentuk ide dan lebar jurang pemisah antara ide dengan persepsi realita tergantung kepada persepsi realita yang dimiliki saat ini dan kemampuan seseorang dalam membangun jembatan pondasi alasan.

- Jembatan alasan

Merupakan serangkaian alasan solid yang memungkinkan seseorang berjalan dari persepsi realita menuju ide (imajinasi) sehingga ide tersebut menjadi bagian persepsi realita yang bersangkutan.

- Persepsi realita

Yang dimaksud persepsi realita adalah pandangan/persepsi yang bisa diterima oleh akal pikirannya sendiri, salah satunya seperti pandangan hidup, keyakinan agama, atau banyaknya ilmu pengetahuan yang dimiliki. Persepsi realita mempengaruhi perilaku / respon kita terhadap keadaan sekitar.

Bumi dan Langit

Bertemu hal-hal baru bisa memicu imajinasi dan ide-ide baru. Berusaha menjadikan ide / imajinasi baru tersebut menjadi persepsi realita dengan membangun jembatan alasan yang solid seringkali memunculkan ide  / imajinasi lain, yang pada akhirnya akan memperkaya khasanah persepsi realita seseorang.

Manusia yang dulunya hanya berkuasa di muka bumi, mempunyai ide untuk bisa terbang di langit, sampai pada akhirnya zaman seperti yang kita lihat pada hari ini, manusia sudah terbiasa melakukan perjalanan di angkasa. Dalam prosesnya, muncul ide-ide baru, mulai dari balon udara, paragliding, pesawat terbang, hingga teknologi roket yang memungkinkan manusia pergi keluar angkasa.

Gagal dalam melakukan sesuatu lebih baik daripada berhasil tidak melakukan sesuatu apapun, karena kita sudah melakukan langkah pertama dalam meraih keberhasilan, yaitu berusaha. – Ni’am

Project Euler

“Okeh, lalu apa hubungannya semua penjelasan di atas dengan project Euler ?”

Sebelum ke sana, perlu dijelaskan sedikit tentang project Euler. Berdasarkan keterangan dari situsnya, Project Euler adalah sekumpulan soal matematika atau pemrograman komputer yang membutuhkan lebih dari kemampuan matematika untuk bisa menyelesaikannya.

Beberapa hari ini, saya mencoba menyelesaikan soal-soal yang ada di sana. Sampai saat ini sih, baru menyelesaikan 10 soal. Soal-soal di sana sangat menantang dan membuka banyak ide-ide baru. Setiap soal mampu membuat saya berpikir keras (itu mungkin karena saya tidak terlalu pintar :) ) dan memberikan banyak ide algoritma. Hal signifikan yang paling dirasakan adalah makin dalam pemahaman LINQ, Lambda Expression, dan Functional Programming dalam C#.
Aaah, nikmatnya menulis kode yang ringkas tetapi tetap ekspresif….

Untuk membuktikannya, kita buat kode sederhana, menghitung nilai factorial suatu angka.

public static class MyMath {
    public static long FactorialImperative (int number)
    {
        if (number < 0)
            throw new ArgumentOutOfRangeException ();

        if (number == 0)
            return 1;

        long retVal = 1;
        for (int m = 2; m <= number; m++) {
            retVal *= m;
        }

        return retVal;
     }

    public static long FactorialRecursive (int number)
    {
        if (number < 0)
            throw new ArgumentOutOfRangeException ();

        if (number == 0)
            return 1;

    	return number * FactorialRecursive (number - 1);
	}

    public static long FactorialFunctional (int number)
    {
    	if (number < 0)
            throw new ArgumentOutOfRangeException ();

        return Enumerable.Range (1, number).DefaultIfEmpty (1).Aggregate (1L, (c, n) => c * n);
    }
}

Yak!! Sekian dulu tentang project Eulernya. Bagi kalian yang tertarik, silahkan membuat akun di situsnya. Memang, tidak perlu membuat akun untuk melihat soal-soalnya, tetapi bila mempunyai akun, progress kalian akan dicatat.

PROJECT EULER SPOILER (GUNAKAN BILA TERPAKSA !! :D ) :
Kode implementasi untuk problem 1 sampai dengan 10 bisa diunduh di :

Bidip, bidip… terbang, terbang !! Kotak Ajaiiib :D

Bukan, bukan… Ini bukan tentang anime lama yang bercerita tentang teko ajaib yang bisa menjelajahi waktu :) , tetapi tentang teka-teki matematika yang lebih kurang berhubungan dengan game puzzle sudoku.

Magic Square

Magic square merupakan penyusunan / pengaturan n² buah angka di dalam sebuah matriks bujur sangkar yang berukuran n x n, , yang umumnya bilangan asli yang berbeda, sehingga bila dijumlahkan per baris, per kolom, dan secara diagonal akan berjumlah sama. Untuk magic square normal, berisi bilangan asli dari 1 sampai dengan n².

Jumlah angka-angka tersebut dalam per baris, per kolom, atau per diagonal pada magic square normal disebut magic sum atau magic constant, M. Persamaannya adalah sebagai berikut :

Read more…

Tutorial VirtualBox, Windows di atas Ubuntu

Kebetulan ada teman yang nan jauh di sana menanyakan tentang bagaimana menjalankan Windows di atas Ubuntu sehingga ia tidak perlu restart computer hanya untuk menggunakan software yang hanya bisa berjalan di Windows dan software tersebut tidak bisa berjalan dengan lancar bila menggunakan Wine. Karena hal itu, timbul ide untuk membuat tutorial ini =)

Virtualisasi

Virtualisasi adalah sebuah fasilitas (cara) yang memungkinan lebih dari satu sistem operasi dijalankan secara simultan di atas sebuah komputer (sistem operasi). Salah satu software virtualisasi yang populer dan mudah digunakan adalah Oracle VirtualBox.

Software virtualisasi dapat dianalogikan sebagai sebuah komputer maya. Ketika sebuah sistem operasi diinstall di dalam software virtualisasi, misalnya VirtualBox, maka data-data sistem operasi tersebut akan diinstall di dalam sebuah sebuah harddisk virtual. Pada VirtualBox, harddisk virtual tersebut adalah sebuah file yang berekstensi *.vdi (Virtual Desktop Image). Read more…

OpenOffice 3.2, open source office suite yang mencukupi

Tak terasa sudah lama ga nge-blog. Kali ini saya akan membahas tentang OpenOffice.org, sebuah office suite open-source. OpenOffice merupakan office suite yang bisa dikatakan sebagai pesaing MS Office. Walaupun secara keseluruhan fitur, masih belum bisa menyaingi MS Office saat ini (2007), mengingat OpenOffice adalah software yang gratis, fitur yang ditawarkan cukup untuk usaha bisnis hingga bisnis menengah atas.

Sebisa mungkin, saya menggunakan OpenOffice karena berdasarkan pengalaman pribadi dalam menggunakannya, fitur yang ditawarkan OpenOffice lebih baik daripada MS Office. Saya merasa OpenOffice lebih mudah menggunakannya dan lebih baik fiturnya daripada MS Office. Tapi, tentu saja, MS Office tidak bisa dilepaskan begitu saja, karena sebagian besar masyarakat kita menggunakan MS Office dan mungkin resistansinya terhadap perubahan. Ganjalan terbesar untuk lepas dari MS Office adalah file formatnya, seperti doc dan docx.

Trik yang biasa saya lakukan adalah bila yang bersangkutan hanya membutuhkan hasil akhir dari dokumen yang saya buat (tidak berkepentingan untuk mengeditnya), saya akan menggunakan OpenOffice untuk membuatnya, lalu menggunakan fitur export as PDF. Fitur export as PDF merupakan fitur standar di dalam OpenOffice. Sebagai perbandingan, di MS Office 2007, ini merupakan fitur optional. Pengguna MS Office 2007 bisa mendownloadnya di sini untuk bisa memperoleh fitur Save as PDF. Tetapi bila saya berkolaborasi dengan orang lain yang menggunakan MS Office, mau tak mau, saya harus menggunakan MS Office, karena sayangnya, MS Office tidak bisa membaca format ODF dengan baik (implementasinya tidak menyeluruh), yang notabene adalah format yang diakui secara internasioanl sebagai format standar untuk dokumen. Bisa saja saya menggunakan OpenOffice lalu disimpan dalam format doc, tetapi seringkali hasilnya berbeda bila dibuka dengan MS Office sehingga harus diperbaiki di dalam MS Office. Akibatnya, harus melakukan pekerjaan sebanyak dua kali.

Okeh, cukup sampai di sini curhatnya :) . Saat ini, rilis OpenOffice terbaru adalah OpenOffice.org 3.2 yang dirilis pada tanggal 11 Februari 2010. Pada versi ini, loading OpenOffice 46% lebih cepat daripada versi sebelumnya. Keterangan lebih detail mengenai apa saja yang baru dalam rilis ini, dapat dilihat di situs resminya di sini.

Hacking : Quick sort dan Intro sort

Tanpa sengaja, di Wikipedia, saya sampai pada beberapa artikel tentang macam-macam algoritma sorting beserta animasi dan pseudocode-nya. Terkesan dengan kualitas artikel dan animasinya, muncul ide untuk mencoba mengimplementasikan sebagian algoritma sorting yang ada dengan bahasa C#.

Untuk desain kodenya, saya mencontoh implementasi static method Array.Sort<T> (T[] array) pada .NET / mono framework, (menurut MSDN) yaitu generic method yang berfungsi mengurutkan setiap elemen dalam array yang setiap elemennya mengimplementasikan IComparable<T> .

Bubble Sort

Bagi yang pernah mengikuti / mengambil kuliah pemrograman, kemungkinan besar sudah mengenal algoritma sorting yang satu ini. Bubble sort merupakan algoritma sorting yang sederhana sehingga selalu dijadikan sebagai entry point dalam mempelajari algoritma sorting. Detail mengenai algoritma ini bisa dilihat di wikipedia, di sini. (sebenarnya malas nulis ulang sih :D ). Read more…

Follow

Get every new post delivered to your Inbox.

Join 250 other followers