Thursday, February 11, 2016

Bagaimana membahasakan bilangan dengan JavaFX

Ok saudara sekalian, tanpa berbasa-basi saya akan memberikan sebuah tutorial yang cukup sederhana mengenai bagaimana membuat program yang bisa membahasakan bilangan. Yakni ketika dimasukkan sebuah bilangan maka akan dikeluarkan bagaimana mengucapkannya dalam Bahasa Indonesia. Sebenarnya ini soal klasik. Kalo pembaca sekalian sudah pernah membuat compiler, maka pembaca skip saja tutorial ini. Prinsip kerjanya hampir sama dengan kompiler dalam hal memparsing text dan memetakan nilainya. Dan kalo pembaca benar-benar ingin membuat compiler, ada banyak contoh source code nya di internet.

Namun saya kemarin pernah menjumpai sebuah link di internet tentang sebuah program yang dapat mengcompile segala kemungkinan bahasa pemrograman yang ada. Jadi apapun bahasa pemrograman yang Anda buat, dan bisa dijalankan pada Mesin Turing, maka itu bisa digenerate menggunakan kompiler buatan mereka tersebut. Yakni dengan mengeset sejumlah perintah khusus pada macro nya.

Jadi apa yang saya buat kali ini ga ada sangkut pautnya dengan sebuah pamer keahlian. Saya hanya berbagi rasa. Kali aja ada mahasiswa yang mendapat soal seperti ini (misalnya dari wawancara kerjaan atau tugas dari dosen). Ya, tinggal dihapal aja source code nya dan Anda mendapatkan pekerjaan dengan gaji 7 juta sebulan atau mendapatkan nilai yang bagus.

Tapi kebetulan program bukan manusia, maka tidak selamanya bisa meniru kompleksitas otak manusia. Program itu jalannya logis aja, sementara manusia punya free-will. Bahkan programmer di Facebook yang jumlahnya ratusan tidak bisa menghasilkan translator yang layak pakai buat dipake mentranslate Bahasa Inggris ke dalam Bahasa Indonesia. Dalam program yang saya buat ini ada sedikit kelucuan yang diakibatkan jalannya yang logis logis aja. Misalnya 21 itu kan memang sudah seharusnya dibahasakan dua puluh satu. Yang heran manusia mengadakan pengecualian, yakni 12 bukannya dibahasakan satu puluh dua melainkan dua belas. Saya tidak perlu memasukkan pengecualian tersebut ke dalam program saya, karena ini hanya sebatas tutorial. Kalo iya, tentu saya sudah bisa menjual program saya ini di pasaran dan mendapatkan uang ketimbang sekedar pahala.  Berikut video hasil running program tersebut:

Adapun source code nya adalah:

import java.util.ArrayList;
import java.util.HashMap;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;


public class BilanganToKalimat extends Application{
 
 public String  printBilanganToKalimat(int a ){
  
  HashMap map1 = new HashMap<>(); 
  map1.put(1, "satu"); 
  map1.put(2, "dua");
  map1.put(3, "tiga"); 
  map1.put(4, "empat"); 
  map1.put(5, "lima"); 
  map1.put(6, "enam"); 
  map1.put(7, "tujuh"); 
  map1.put(8, "delapan"); 
  map1.put(9, "sembilan"); 
  map1.put( 0 , ""); 
  
  HashMap map2 = new HashMap<>();
  map2.put(0 , "" ); 
  map2.put(1, "puluh" ); 
  map2.put(2, "ratus" ); 
  map2.put(3, "ribu" ); 
  map2.put(4, "puluh ribu" ); 
  map2.put(5, "ratus ribu" ); 
  map2.put(6, "juta"); 
  map2.put(7, "puluh juta");
  map2.put(8, "ratus juta"); 
  map2.put(9, "miliar"); 
  map2.put(10, "puluh miliar"); 
  map2.put(11, "ratus miliar"); 
  
  
  int m, n; 
  String st = Integer.toString(a); 
  n = m = st.length() - 1;  
  
  StringBuilder builder = new StringBuilder(); 

  ArrayList lst = new ArrayList<>(); 
  
  while( n >=0  ){
   int c =  st.codePointAt(n); 
   c = c - 48; 
   builder.append(map1.get(c)); 
   builder.append(" "); 
   
   if( c!= 0){
    String sebutan = map2.get(m - n); 
    String[] sss = sebutan.split("\\s"); 
    if(sss.length == 2){
     if(!lst.contains(sss[sss.length - 1])){
      builder.append(sebutan); 
      lst.add(sss[sss.length - 1]); 
     }else{
      for( int j = 0; j < sss.length - 1; j++)
       builder.append(sss[j] + " "); 
     }
    }else{
     builder.append(sebutan); 
     lst.add(sebutan); 
    }
    
    builder.append("_");  
   }
   n--; 
  }
  
  String temp[] = builder.toString().split("\\_"); 
  StringBuilder bt = new StringBuilder();
  for( int i = temp.length - 1; i>= 0; i-- ){
   bt.append(temp[i]); 
   bt.append(" ") ; 
  }
   return bt. toString(); 
 }
 
 public static void main(String[] args){
  launch(args);
 }

 @Override
 public void start(Stage primaryStage) throws Exception {
  
  AnchorPane pane = new AnchorPane(); 
  pane.setPrefSize(400, 400); 
  primaryStage.setScene(new Scene(pane));
  
  primaryStage.show();
  initLayout(pane); 
 }
 
 Text area = new Text(); 
 
 private void initLayout(AnchorPane pane){
  
  VBox box = new VBox(); 
  box.setSpacing(10);
  
  TextField input = new TextField(); 
  input.setPrefSize(150, 30); 
  box.getChildren().add(input) ; 
  
  
  Button button = new Button("CONVERT"); 
  button.setPrefSize(150, 30); 

  button.setOnAction(new EventHandler() {
   @Override
   public void handle(ActionEvent arg0) {
    String c = input.getText(); 
    try{
     int a = Integer.parseInt(c); 
     String hasil = printBilanganToKalimat(a); 
     
     area.setText(hasil);
     
    }catch(Exception e){}
   }
  });
  
  box.getChildren().add(button); 

  HBox hbox = new HBox(); 
  hbox.setTranslateX(5);
  hbox.setTranslateY(5); 
  hbox.setSpacing(10);
  hbox.getChildren().add(box); 
  
  box.getChildren().add(area);  
  
  pane.getChildren().add(hbox); 
  
 }
}

Thursday, February 4, 2016

Penggunaan Induksi Matematika dalam fisika: Rewrite Soal no 1 chapter 7 buku Quantum Physics Gaziorowich

Nah tulisan ini sebenarnya hanya mengedit tulisan saya sebelumnya (http://fjr66.blogspot.co.id/2012/12/soal-no-1-chapter-7-buku-quantum.html). Sebenarnya saya agak bingung karena buku fisika kuantum Gaziorowich itu ada beberapa edisi, namun tidak semuanya ada soal yang dimaksud, contohnya di edisi 3 nya itu ga ada soal yang dimaksud. Masalahnya adalah saya lupa di edisi ke berapa buku tersebut soalnya muncul. Yang jelas buku fisika kuantum yang dimaksud saya beli di fotokopian di jalan Taman Sari Bandung, ga jauh dari kampus ITB (silakan pembaca liat di situ, kali aja ada).

Professor-professor fisika di Amerika sana benar-benar jago. Kerjaan mereka itu ga ada lain, hanya mencakar-mencakar-mencakar for entire their boring life, ga ada urusan cewek, urusan politik, atau urusan apa. Yang jelas cuma mencakar. Salah satu pekerjaan mereka adalah dengan membuat soal-soal guna menanamkan pemahaman konsep fisika ke para mahasiswa didikannya. Di samping itu untuk membuat fasih dalam hal problem solving dengan menggunakan bahasa matematika.

Salah satu teknik problem solving yang sangat terkenal dalam matematika itu namanya Induksi Matematika dan sudah digunakan sejak zaman Yunani Kuno (jadi sudah cukup klasik ya?). Nah ini yang ditekankan dalam soal yang diberikan pada buku Fisika Kuantum Gaziorowich tersebut.

Tanpa berbasi-basi kita masuk aja ke soalnya: Gunakan hubungan komutatif pada persamaan (7-15) dan defenisi bahwa state $u_n$ diberikan oleh persamaan (7-26) untuk membuktikan bahwa: $$ A a_n = \sqrt{n} u_{n-1} $$ Jawab:

Pertama-tama kita tunjukkan bahwa ini benar untuk $n = 1$

Dengan menggunakan persamaan (7-26), $ u_n = \frac{1}{\sqrt{n !}} \left ( {A^\text{*}} \right ) u_0 $ maka diperoleh

$$ A u_{1} = A \left ( \frac{1}{\sqrt{1}} \left ( A^{*} \right )^1 u_0 \right ) = A A^{*} u_0 = u_0 = \sqrt{1} u_{1-1} \nonumber $$ Dengan demikian pernyataan tersebut benar untuk $n = 1$. Dengan adanya base case tersebut maka dapat kita katakan pernyataannya benar untuk suatu $p$ tertentu dengan $p$ bilangan bulat. Selanjutnya

$$\begin{eqnarray} A u_{p + 1} & = & A \left ( \frac{( A^{*} )^{p +1} u_0 }{ \sqrt{( p + 1) ! }} \right ) \nonumber \\ & = & \frac{A A^{*} (A^{*})^p u_0 }{\sqrt{p + 1} \sqrt{p ! } } \nonumber \\ \end{eqnarray}$$ Sementara identitas (7-5) mengatakan $[A, A^{*}] = 1$ sehingga

$$\begin{eqnarray} A u_{p + 1} = (1 + A^{*} A) \frac{ (A^{*})^p u_0 }{\sqrt{p + 1} \sqrt{p ! } } \nonumber \end{eqnarray} $$ Kemudian dari persamaan (7.27) diketahui $A = \frac{d}{d A^{*}}$ yang mengakibatkan

$$\begin{eqnarray} A u_{p + 1} & = & (1 + \frac{d}{d A^{*}} ) \frac{ (A^{*})^p u_0 }{\sqrt{p + 1} \sqrt{p ! } } \nonumber \\ & = & (1 + p A^{*} ) \frac{ (A^{*})^{p-1} u_0 }{\sqrt{p + 1} \sqrt{p ! } } \nonumber \\ & = & (1 + p ) \frac{ (A^{*})^{p} u_0 }{\sqrt{p + 1} \sqrt{p ! } } \nonumber \\ & = & \sqrt{p + 1} \left ( \frac{ (A^{*})^{p} u_0 }{ \sqrt{p ! } } \right ) \nonumber \\ & = & \sqrt{p + 1} u_p && \text{Berdasarkan base case} \nonumber \\ & = & \sqrt{p + 1} u_{(p + 1) - 1} \nonumber \end{eqnarray} $$ Sehingga pernyataan $A a_n = \sqrt{n} u_{n-1}$ benar untuk semua $n$ $(\text{QED})$.