Pages

Minggu, 31 Maret 2013

Angka Romawi

kemarin pernah ada temen yang nanya-nanya tentang gimana cara mengkonversi angka romawi ke dalam angka arab (angka latin) yang biasa kita gunakan. sebetulnya teorinya mudah, cuman ternyata menerapkannya susah juga :D
aturan penulisan romawi pada dasarnya seperti ini :
1. tidak mungkin lebih dari 4 angka sama yang berjajar, maksimal 3 seperti iii, xxx, mmm
2. memiliki urutan sebagai berikut i,v,x,l,c,d,m
3. terdapat aturan pengurangan hanya dengan angka dengan urutan +1 dan +2, misal i dan v, jika digabung iv hasilnya 5-1=4, begitu juga dengan ix, tetapi tidak ada il, ic dst
4. aturan diatas tidak berlaku untuk angka yang bila dikonversi, memiliki kepala 5, misal v=5, l=50 dan d=500, mungkin emang krn menunjukkan nilai 1/2 (nebak aja :D)
5. 1990=mcmxc dan bukan mdcdxc yang berarti prioritas penulisan adalah nilai 5+3 dan bukan 5+4, mudahnya jika kita ingin menuliskan 19 maka bukan dengan 10+5+4 tetapi 10+10-1, tetapi jika kita ingin menuliskan 18 maka 10+5+3. (maaf gak tau cara njelasinnya, pokoke gitu deh :D)

kodingan java ini masih memiliki kekurangan yaitu belum memiliki method validasi apakah penulisannya benar, jadi tidak bisa mendeteksi xix dengan xviv yang sama-sama 19.
sudah aku coba beberapa nilai romawi dan udah benar, gak tau ntar teman2 menemukan bug hasil yang tidak sesuai :D

oke ini kodingan javanya +++++++++++++++++++++++++++

public class Romawi {  
    String [] order = {"I","V","X","L","C","D","M"};
    String [] rom;
    int [] nilai; //attribut ini tidak dipakai
    int sum = 0;
    public Romawi(){
        nilai = new int[7];
        for(int i=0; i<7;i++){
            nilai[i]=0;
        }
    }
    public int romawiValue(String x){
        int len = x.length();
        if(len==1){
            return getValue(x);
        }else{
            return getValue(x,len);
        }
        //return 0;
    }
    /*
     * mendapatka nilai satu digit
     */
    private int getValue(String rom){
        String x = rom.toUpperCase();
        if(x.equalsIgnoreCase("I")){
            return 1;
        }else if(x.equalsIgnoreCase("V")){
            return 5;
        }else if(x.equalsIgnoreCase("X")){
            return 10;
        }else if(x.equalsIgnoreCase("L")){
            return 50;
        }else if(x.equalsIgnoreCase("C")){
            return 100;
        }else if(x.equalsIgnoreCase("D")){
            return 500;
        }else if(x.equalsIgnoreCase("M")){
            return 1000;
        }
        return 0;
    }
    /*
     * mendapatkan nilai > 1 digit
     */
    private int getValue(String rom, int length){
        if(length==2){
            if(cekOrder(rom)){
                return getValue(rom.substring(1, 2))-getValue(rom.substring(0, 1));
            }else{
               return getValue(rom.substring(1, 2))+getValue(rom.substring(0, 1));
            }
        }else{
            if(this.romValidate(rom)){
                return this.sum;
            }
        }
        return 0;
    }
    /*
     * hanya berlaku untuk 2 digit angka romawi
     */
    private boolean cekOrder(String rom){
        int len = this.order.length;
        for(int i=0; i<len-2; i++){
            if(rom.substring(0, 1).equalsIgnoreCase(this.order[i]) && rom.substring(1, 2).equalsIgnoreCase(this.order[i+1])){               
                return true;              
            }else if(rom.substring(0, 1).equalsIgnoreCase(this.order[i]) && rom.substring(1, 2).equalsIgnoreCase(this.order[i+2])){
                return true;
            }
        }
        return false;
    }
    private boolean cekOrder(int start){
        int len = this.order.length;           
        for(int i=0; i<len-2; i++){
            if(start<this.rom.length-2){               
                    if(this.rom[start].equalsIgnoreCase(this.order[i]) && this.rom[start+1].equalsIgnoreCase(this.order[i+1])){                       
                        return true;            
                    }else if(this.rom[start].equalsIgnoreCase(this.order[i]) && this.rom[start+1].equalsIgnoreCase(this.order[i+2])){                       
                        return true;
                    }
            }else if(start==this.rom.length-2){
                    if(this.rom[start].equalsIgnoreCase(this.order[i]) && this.rom[start+1].equalsIgnoreCase(this.order[i+1])){                       
                        return true;            
                    }else if(this.rom[start].equalsIgnoreCase(this.order[i]) && this.rom[start+1].equalsIgnoreCase(this.order[i+2])){                       
                        return true;
                    }
            }
        }
        return false;
    }
    private void splitToArray(String rom){
        char[] romchar = rom.toCharArray();
        int jml = romchar.length;
        this.rom = new String[jml];
        for(int i=0;i<jml;i++){
            this.rom[i] = ""+romchar[i];           
        }
    }
    /*
     * 1.validasi apakah huruf romawi benar huruf2nya
     * 2.validasi apakah huruf romawi benar urutannya.
     */
    public boolean romValidate(String rom){
        //pecah dulu menjadi array, biar mudah ngolahnya
        this.splitToArray(rom);
        int jml = this.rom.length;      
        //cek apakah huruf romawi benar per hurufnya
        for(int i=0;i<jml;i++){
            for(int j=0;j<this.order.length;j++){
                if(this.rom[i].equalsIgnoreCase(this.order[j].trim())) {
                    break;
                }
                if(j==this.order.length-1 && !this.rom[i].equalsIgnoreCase(this.order[j].trim())){
                    return false;
                }
            }
        }
        int len = this.order.length;      
        this.sumRom(this.rom, 0, jml);  
        return true;
    }
    public void sumRom(String[] rom, int start, int len){       
        if(start < len-2){          
            if(rom[start].equalsIgnoreCase(rom[start+1]) && rom[start+1].equalsIgnoreCase(rom[start+2])){               
                this.sum += (this.getValue(rom[start])+this.getValue(rom[start+1])+this.getValue(rom[start+2]));
                this.sumRom(rom, start+3, len);             
            }else if(rom[start].equalsIgnoreCase(rom[start+1]) && !rom[start+1].equalsIgnoreCase(rom[start+2])){             
                this.sum += (this.getValue(rom[start])+this.getValue(rom[start+1]));
                this.sumRom(rom, start+2, len);             
            }else if(!rom[start].equalsIgnoreCase(rom[start+1])){
                if(this.cekOrder(start)){                  
                    this.sum += (this.getValue(rom[start+1])-this.getValue(rom[start]));
                    this.sumRom(rom, start+2, len);                 
                }else{                 
                    this.sum += this.getValue(rom[start]);                  
                    this.sumRom(rom, start+1, len);
                }
            }
        }else if(start == len-2){
            if(this.cekOrder(start)){                  
                    this.sum += (this.getValue(rom[start+1])-this.getValue(rom[start]));                   
                }else{                  
                    this.sum += this.getValue(rom[start])+ this.getValue(rom[start+1]);                   
            }
        }
    }
    public static void main(String[] args) {
        // TODO code application logic here      
        Romawi rom = new Romawi();
        String x = "mmmcdxlix";
        System.out.println(x);
        System.out.println(rom.romawiValue(x));       
    }
}

contoh hasilnya :
mmmcdxlix
3449
BUILD SUCCESSFUL (total time: 0 seconds)

mcmxcix
1999
BUILD SUCCESSFUL (total time: 0 seconds)

Jumat, 01 Maret 2013

Russian Roullette ... entah apa namanya

berhubung kemarin sempat iseng-iseng ngobrol sama teman. dapat deh istilah ini, iseng-iseng lagi bikin kodingannya. semoga algo-nya bener
Kelas 

public class Chamber {
    
    private int id;
    private boolean bullet;
    
    public Chamber(){
        this.id=0;
        this.bullet = false;
    }
    
    public Chamber(int id, boolean bullet){
        this.id = id;
        this.bullet = bullet;        
    }
    
    public void setId(int id){
        this.id = id;
    }
    
    public void setBullet(boolean bullet){
        this.bullet = bullet;
    }
    
    public int getId(){
        return this.id;
    }
    
    public boolean getBullet(){
        return this.bullet;
    }    
    
    
} 



yang bawah ni, kelas utamanya :
import java.util.Random;
import java.util.Scanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author aisyah
 */
public class Pistol {
    
    private Chamber[] roller;
    public final int numHole = 7;
    //private int startPoint;
    private Chamber currentChamber;
    private Random random = new Random();
    public String[] player;
    public int numPlayer;
    
    
    
    public Pistol(int player){
        this.numPlayer = player;
        this.roller = new Chamber[this.numHole-1];        
        this.player = new String[player];
        for(int i=0;i<this.numHole-1;i++){
            this.roller[i] = new Chamber();
            this.roller[i].setId(i);
            this.roller[i].setBullet(false);
        }
        this.currentChamber = this.roller[0];
    }
    
    public void setPlayer(int player, String name){
        if(player<this.numPlayer-1 && player>-1){
            this.player[player] = name;
            //System.out.println(this.player[player]);
        }else{
            System.out.println("nomor pemain tidak sesuai jumlah pemain");
        }
        
    }
    
    public void fillBullet(int chamber){
        if(chamber>this.numHole-1){
            System.out.println("chamber hanya enam buah");            
        }else{
            this.roller[chamber].setBullet(true);
        }
        
    }
    
    /*
     * memutar roller
     */
    public boolean spinRevolver(){
        int current = this.randNum(this.numHole);        
        while(true){
            current = (current == 0) ? this.randNum(this.numHole) : current;
            if(current>0){
                this.setCurrentChamber(current);
                return true;
            }
        }  
    }
    
    public void initChamber(int i){
            this.roller[i] = new Chamber(i,false);
            //this.roller[i].setId(i);
            //this.roller[i].setBullet(false);
       
    }
    
    /*
     * memicu pemantik
     */
    public void strikeFire(int player){
        //this.spinRevolver();
        int current = this.currentChamber.getId();
        this.currentChamber = (current==5)?this.roller[0]:this.roller[current+1];
        if(this.currentChamber.getBullet()==true){
            System.out.println("BAM!! player : "+this.player[player]+ " die!");
            System.out.println("Permainan selesai!");
            System.exit(0);
        }else{
            System.out.println("klik!! you are still safe!");
        }
        
    }
    
    /*
     * random number, untuk memutar roller
     * @param titik mulai, 
     * @param nomor lubang di roller
     */
    private int randNum(int numChamber){
        
        return this.random.nextInt(numChamber);
    }
    
    /*
     * titik mulai pada hole yg selaras dengan pemantik.
     * default titik 0. setelah berputar akan berubah
     */
    private Chamber getCurrentChamber(){
        
        return this.currentChamber;
    }
    
    /*titik mulai
     * set titik mulai
     */
    private void setCurrentChamber(int current){
        for(int i=0; i<this.roller.length; i++){
          int j = i+1;
          if((j == current)) this.currentChamber = this.roller[i];
        }
        
        
    }
    
    public static void main(String[] args){
        
        int player = 6;
        Pistol pispot = new Pistol(player);
        /*for(int b=0;b<6;b++){
            //System.out.println(b);
            pispot.initChamber(b);
        }*/
        Scanner scanner = new Scanner(System.in);
        //======= isi peluru di chamber
        System.out.println("Isi peluru dulu !");
        int bull = scanner.nextInt();
        pispot.fillBullet(bull);
        //======= set pemain
        System.out.println("\nSet nama pemain dulu !");
        
        for(int c=0; c<player;c++){
            //System.out.println(c);
            String pemain = scanner.next();
            pispot.setPlayer(c, pemain);
        }
        
        //======= permainan dimulai
        int i = 0;
        while(i < player ){
            System.out.println("\nPilihan :"+i);
            System.out.println("1. puter revolver");
            System.out.println("2. tarik pemicu");
            System.out.println("Giliran pemain ke-"+(i+1)+" : "+pispot.player[i]);
            int pilihan = scanner.nextInt();
            
            switch(pilihan){
                case 1:
                    pispot.spinRevolver();
                    break;
                case 2:
                    pispot.strikeFire(i);
                    i++;
                    break;
                default:
                    System.out.println("pilihan tidak ada\n\n");
                    break;
            }
            
            
            if(i==player){
                i=0;
            }
        }
    }
    
}

klo tampilannya masih gini :
Pilihan :2
1. puter revolver
2. tarik pemicu
Giliran pemain ke-3 : d
2
BAM!! player : d die!
Permainan selesai!