{Kurung Kurawal}

Java, validasi String persamaan Penjumlahan/Pengurangan

Di group Facebook, ada pertanyaan menarik. Seperti terlihat di gambar.

Karena ini ditanyakan di group pemrograman Java, maka saya coba buatkan aplikasi sangat sederhana untuk mencari tau, apakah (misalnya) persamaan a+b itu sama dengan b+a, tanpa menghitungnya dengan angka asli, artinya sesuai permintaan, tanpa men-substitusi variabel dengan nilai angka.

Berikut screenshot aplikasinya,

Namun sebelumnya, ada keterbatasan dari aplikasi yang saya buat tersebut, yaitu bahwa aplikasi mengganggap persamaan yang ingin dievaluasi adalah ditulis dengan format yang benar, aplikasi tidak melakukan pengecekan apapun. Kedua bahwa aplikasi hanya valid jika persamaan hanya menggunakan penjumlahan dan/atau pengurangan saja.

Algoritma yang saya gunakan adalah sebagai berikut:

Contoh kasus, expr adalah a+b+c == a-d+b-(-c)+d.

  1. Pisahkan kedua persamaan menjadi 2 sisi, kita sebut L untuk sisi kiri, dan R untuk sisi kanan, pemisahnya adalah tanda “==”.
    maka L = a+b+c, dan R = a-d+b-(-c)+d
  2. Normalisasi, rapikan persamaan.
    1. Buang tanda spasi
    2. Untuk memudahkan operasi berikutnya, berikan tanda + variable bagian depan yang bernilai positif
      maka L = +a+b+c, dan R = +a-d+b-(-c)+d
    3. Buang tanda buka dan tutup kurung
      maka L = +a+b+c, dan R = +a-d+b--c+d
    4. Terjemahkan penanda positif dan negatif, artinya -- (minus minus) adalah positif, dan seterusnya.
      maka L = +a+b+c, dan R = +a-d+b+c+d
  3. Kemudian, kita akan mengumpulkan seluruh variabel yang terlibat, sebutlah namanya TheElement
    L memiliki koleksi TheElement yaitu +a, +b, +c
    L memiliki koleksi TheElement yaitu +a, -d, +b, +c, +d
  4. Buang TheElement yang saling menghabiskan. 1 buah TheElement hanya akan menghabiskan 1 buah TheElement yang lain.
    L tidak memiliki TheElement yang saling menghabiskan, koleksinya tetap +a, +b, +c
    R memiliki 1 buah -d dan 1 buah +d, maka TheElement tersebut akan dibuang, koleksinya menjadi +a, +b, +c
  5. Urutkan TheElement di kedua sisi secara alphabetic (kebetulan pada contoh sudah terurut semua)
    L, koleksinya tetap +a, +b, +c
    R, koleksinya tetap +a, +b, +c
  6. Jadikan kembali menjadi String
    L, menjadi +a+b+c
    R, menjadi +a+b+c
  7. Selesai. Cek saja, apakah nilai String L dan R adalah sama?

Source code tersedia di github.
Demikian, semoga berguna untuk kita semua.