/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
// (4 == 2 + 2) && true
No
<Double
> mais
= new Galho
<Double,Double
>(new Soma
(),
new FolhaNumerica
(2),
new FolhaNumerica
(2)); No
<Boolean
> igual
= new Galho
<Double,Boolean
>(new Igualdade
(),
new FolhaNumerica
(4), mais
); No
<Boolean
> raiz
= new Galho
<Boolean,Boolean
>(new Conjuncao
(), igual,
new FolhaBooleana
(true));
boolean resultado = raiz.avaliar(); // true
System.
out.
println(resultado
); }
}
interface No<T> {
T avaliar();
}
class FolhaNumerica implements No<Double> {
double valor;
public Double avaliar
() { return valor
; } FolhaNumerica(double valor) { this.valor = valor; }
}
class FolhaBooleana implements No<Boolean> {
boolean valor;
public Boolean avaliar
() { return valor
; } FolhaBooleana(boolean valor) { this.valor = valor; }
}
interface Operador<E,S> {
S aplicar
(Object[] operandos
);}
class Soma
implements Operador
<Double,Double
> { public String toString
() { return "+"; } double ret = 0;
return ret;
}
}
class Conjuncao
implements Operador
<Boolean,Boolean
> { public String toString
() { return "&&"; } return false;
return true;
}
}
class Igualdade
implements Operador
<Double,Boolean
> { public String toString
() { return "=="; } double primeiro
= (Double)operandos
[0]; return false;
return true;
}
}
class Galho<E,S> implements No<S> {
Operador<E,S> op;
No<E>[] operandos;
public S avaliar() {
List<E> args = new ArrayList<E>();
for ( No<E> no : operandos )
args.add(no.avaliar()); // Avalia cada sub-nó recursivamente
return op.aplicar((E[])args.toArray()); // Passa os resultados para o operador
}
Galho(Operador<E,S> op, No<E>... operandos) {
this.op = op;
this.operandos = operandos;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewogICAgICAgIC8vICg0ID09IDIgKyAyKSAmJiB0cnVlCiAgICAgICAgTm88RG91YmxlPiBtYWlzID0gbmV3IEdhbGhvPERvdWJsZSxEb3VibGU+KG5ldyBTb21hKCksIG5ldyBGb2xoYU51bWVyaWNhKDIpLCBuZXcgRm9saGFOdW1lcmljYSgyKSk7CiAgICAgICAgTm88Qm9vbGVhbj4gaWd1YWwgPSBuZXcgR2FsaG88RG91YmxlLEJvb2xlYW4+KG5ldyBJZ3VhbGRhZGUoKSwgbmV3IEZvbGhhTnVtZXJpY2EoNCksIG1haXMpOwogICAgICAgIE5vPEJvb2xlYW4+IHJhaXogPSBuZXcgR2FsaG88Qm9vbGVhbixCb29sZWFuPihuZXcgQ29uanVuY2FvKCksIGlndWFsLCBuZXcgRm9saGFCb29sZWFuYSh0cnVlKSk7CgogICAgICAgIGJvb2xlYW4gcmVzdWx0YWRvID0gcmFpei5hdmFsaWFyKCk7IC8vIHRydWUKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0YWRvKTsKCX0KfQoKaW50ZXJmYWNlIE5vPFQ+IHsKICAgIFQgYXZhbGlhcigpOwp9CgpjbGFzcyBGb2xoYU51bWVyaWNhIGltcGxlbWVudHMgTm88RG91YmxlPiB7CiAgICBkb3VibGUgdmFsb3I7CiAgICBwdWJsaWMgRG91YmxlIGF2YWxpYXIoKSB7IHJldHVybiB2YWxvcjsgfQogICAgRm9saGFOdW1lcmljYShkb3VibGUgdmFsb3IpIHsgdGhpcy52YWxvciA9IHZhbG9yOyB9Cn0KCmNsYXNzIEZvbGhhQm9vbGVhbmEgaW1wbGVtZW50cyBObzxCb29sZWFuPiB7CiAgICBib29sZWFuIHZhbG9yOwogICAgcHVibGljIEJvb2xlYW4gYXZhbGlhcigpIHsgcmV0dXJuIHZhbG9yOyB9CiAgICBGb2xoYUJvb2xlYW5hKGJvb2xlYW4gdmFsb3IpIHsgdGhpcy52YWxvciA9IHZhbG9yOyB9Cn0KCmludGVyZmFjZSBPcGVyYWRvcjxFLFM+IHsKICAgIFMgYXBsaWNhcihPYmplY3RbXSBvcGVyYW5kb3MpOwp9CgpjbGFzcyBTb21hIGltcGxlbWVudHMgT3BlcmFkb3I8RG91YmxlLERvdWJsZT4gewogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuICIrIjsgfQogICAgcHVibGljIERvdWJsZSBhcGxpY2FyKE9iamVjdFtdIG9wZXJhbmRvcykgewogICAgICAgIGRvdWJsZSByZXQgPSAwOwogICAgICAgIGZvciAoIE9iamVjdCBkIDogb3BlcmFuZG9zICkKICAgICAgICAgICAgcmV0ICs9IChEb3VibGUpZDsKICAgICAgICByZXR1cm4gcmV0OwogICAgfQp9CgpjbGFzcyBDb25qdW5jYW8gaW1wbGVtZW50cyBPcGVyYWRvcjxCb29sZWFuLEJvb2xlYW4+IHsKICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiAiJiYiOyB9CiAgICBwdWJsaWMgQm9vbGVhbiBhcGxpY2FyKE9iamVjdFtdIG9wZXJhbmRvcykgewogICAgICAgIGZvciAoIE9iamVjdCBiIDogb3BlcmFuZG9zICkKICAgICAgICAgICAgaWYgKCAhKEJvb2xlYW4pYiApCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0KCmNsYXNzIElndWFsZGFkZSBpbXBsZW1lbnRzIE9wZXJhZG9yPERvdWJsZSxCb29sZWFuPiB7CiAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gIj09IjsgfQogICAgcHVibGljIEJvb2xlYW4gYXBsaWNhcihPYmplY3RbXSBvcGVyYW5kb3MpIHsKICAgICAgICBkb3VibGUgcHJpbWVpcm8gPSAoRG91YmxlKW9wZXJhbmRvc1swXTsKICAgICAgICBmb3IgKCBPYmplY3QgZCA6IG9wZXJhbmRvcyApCiAgICAgICAgICAgIGlmICggKERvdWJsZSlkICE9IHByaW1laXJvICkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQoKY2xhc3MgR2FsaG88RSxTPiBpbXBsZW1lbnRzIE5vPFM+IHsKICAgIE9wZXJhZG9yPEUsUz4gb3A7CiAgICBObzxFPltdIG9wZXJhbmRvczsKCiAgICBwdWJsaWMgUyBhdmFsaWFyKCkgewogICAgICAgIExpc3Q8RT4gYXJncyA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKICAgICAgICBmb3IgKCBObzxFPiBubyA6IG9wZXJhbmRvcyApCiAgICAgICAgICAgIGFyZ3MuYWRkKG5vLmF2YWxpYXIoKSk7IC8vIEF2YWxpYSBjYWRhIHN1Yi1uw7MgcmVjdXJzaXZhbWVudGUKICAgICAgICByZXR1cm4gb3AuYXBsaWNhcigoRVtdKWFyZ3MudG9BcnJheSgpKTsgLy8gUGFzc2Egb3MgcmVzdWx0YWRvcyBwYXJhIG8gb3BlcmFkb3IKICAgIH0KCiAgICBHYWxobyhPcGVyYWRvcjxFLFM+IG9wLCBObzxFPi4uLiBvcGVyYW5kb3MpIHsKICAgICAgICB0aGlzLm9wID0gb3A7CiAgICAgICAgdGhpcy5vcGVyYW5kb3MgPSBvcGVyYW5kb3M7CiAgICB9Cn0K