fork(1) download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10. public static void main (String[] args) throws java.lang.Exception
  11. {
  12. // (4 == 2 + 2) && true
  13. No<Double> mais = new Galho<Double,Double>(new Soma(), new FolhaNumerica(2), new FolhaNumerica(2));
  14. No<Boolean> igual = new Galho<Double,Boolean>(new Igualdade(), new FolhaNumerica(4), mais);
  15. No<Boolean> raiz = new Galho<Boolean,Boolean>(new Conjuncao(), igual, new FolhaBooleana(true));
  16.  
  17. boolean resultado = raiz.avaliar(); // true
  18. System.out.println(resultado);
  19. }
  20. }
  21.  
  22. interface No<T> {
  23. T avaliar();
  24. }
  25.  
  26. class FolhaNumerica implements No<Double> {
  27. double valor;
  28. public Double avaliar() { return valor; }
  29. FolhaNumerica(double valor) { this.valor = valor; }
  30. }
  31.  
  32. class FolhaBooleana implements No<Boolean> {
  33. boolean valor;
  34. public Boolean avaliar() { return valor; }
  35. FolhaBooleana(boolean valor) { this.valor = valor; }
  36. }
  37.  
  38. interface Operador<E,S> {
  39. S aplicar(Object[] operandos);
  40. }
  41.  
  42. class Soma implements Operador<Double,Double> {
  43. public String toString() { return "+"; }
  44. public Double aplicar(Object[] operandos) {
  45. double ret = 0;
  46. for ( Object d : operandos )
  47. ret += (Double)d;
  48. return ret;
  49. }
  50. }
  51.  
  52. class Conjuncao implements Operador<Boolean,Boolean> {
  53. public String toString() { return "&&"; }
  54. public Boolean aplicar(Object[] operandos) {
  55. for ( Object b : operandos )
  56. if ( !(Boolean)b )
  57. return false;
  58. return true;
  59. }
  60. }
  61.  
  62. class Igualdade implements Operador<Double,Boolean> {
  63. public String toString() { return "=="; }
  64. public Boolean aplicar(Object[] operandos) {
  65. double primeiro = (Double)operandos[0];
  66. for ( Object d : operandos )
  67. if ( (Double)d != primeiro )
  68. return false;
  69. return true;
  70. }
  71. }
  72.  
  73. class Galho<E,S> implements No<S> {
  74. Operador<E,S> op;
  75. No<E>[] operandos;
  76.  
  77. public S avaliar() {
  78. List<E> args = new ArrayList<E>();
  79. for ( No<E> no : operandos )
  80. args.add(no.avaliar()); // Avalia cada sub-nó recursivamente
  81. return op.aplicar((E[])args.toArray()); // Passa os resultados para o operador
  82. }
  83.  
  84. Galho(Operador<E,S> op, No<E>... operandos) {
  85. this.op = op;
  86. this.operandos = operandos;
  87. }
  88. }
  89.  
Success #stdin #stdout 0.07s 380224KB
stdin
Standard input is empty
stdout
true