Problème B : Un peu de logique
Fichier d’entrée : logic.in
Fichier de sortie : logic.out (IN+OUT)
Source : logic.c | logic.cpp | logic.java | logic.cs | logic.php
Parmi les tâches les plus pénibles de l’industrie électronique c’est d’optimiser les circuits qui assurent les opérations de la logique binaire : AND, OR, XOR et NOT.
Votre tâche est d’évaluer deux expressions, et voir si elles sont équivalents ou pas.
Format d’entrée
Le fichier d’entrée contient plusieurs cas de tests.
Chaque cas de test est décrit par une seule ligne, cette ligne contient une combinaison des variables de l’alphabet en minuscule, des opérations binaires, et les parenthèses.
Les opérations binaires seront notées par:
OR: |
AND: &
XOR: ^
NOT: ~
Les expressions devront être évaluées en ignorant les espaces supplémentaires.
Vous devez déterminer les deux expressions.
Chaque expression utilisera au maximum 100 opérations avec un maximum de 10 variables.
Format de sortie
Pour chaque cas de test, donner le résultat par une seule ligne utilisant le format:
‘=’ (Si les expressions sont équivalents) ou ‘<>’ (dans le cas contraire)
Exemple de fichiers entrée/sortie :
| logic.in | logic.out |
| zy
~~~~z~~z |
<>
= |



























import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
*
* @author MOAMMOUS
*/
public class logic {
private static String[] expressions(String s){
String[] expr = new String[2];
char[] exprChar = s.trim().toCharArray();
char c0 = exprChar[0];
expr[0]=String.valueOf(c0);
for(int i = 1; i<exprChar.length;i++){
char c1 = exprChar[i];
if (c1==' ')
continue;
String tmp = ""+c0+c1;
if(tmp.matches("\\)\\(|\\w\\w|\\w~|\\)\\w|\\w\\(|\\)~"))
{
expr[1]=String.valueOf(exprChar[i]);
for (int j = i+1; j < exprChar.length; j++) {
if(exprChar[j]==' ')
continue;
expr[1]+=exprChar[j];
}
break;
}
expr[0]+=String.valueOf(c1);
c0 = c1;
}
return expr;
}
private static void mapBincharToBoolean(char[] binChar, boolean[] booleanC) {
for (int i = 0; i < binChar.length; i++) {
if (binChar[i]=='0')
booleanC[i] = false;
else booleanC[i] =true;
}
}
private static char[] stringBinToChar(String boolstr, int N){
char[] binChar = new char[N];
for (int i = 0; i < N; i++) {
binChar[i] = '0';
}
for (int i = 0; i < boolstr.length(); i++) {
binChar[i] = new StringBuffer(boolstr).reverse().charAt(i);
}
return binChar;
}
private static boolean[][] generateBoolean(int N){
boolean[][] booleans = new boolean[(int)Math.pow(2, N)][N];
for(int a = 0; a<(int)Math.pow(2, N); a++)
logic.mapBincharToBoolean(logic.stringBinToChar(Integer.toBinaryString(a),N), booleans[a]);
return booleans;
}
private static Object evaluateExpr(String expr) throws ScriptException{
return (new ScriptEngineManager()).getEngineByName("JavaScript").eval(expr);
}
private static String process(String inp) throws ScriptException{
String outp = "=";
String[] expr = logic.expressions(inp);
Set variables = new TreeSet();
char[] charA0 = expr[0].toCharArray();
for(int i = 0;i<charA0.length;i++)
if(String.valueOf(charA0[i]).matches("\\w"))
variables.add(String.valueOf(charA0[i]).toUpperCase());
char[] charA1 = expr[1].toCharArray();
for(int i = 0;i<charA1.length;i++)
if(String.valueOf(charA1[i]).matches("\\w"))
variables.add(String.valueOf(charA1[i]).toUpperCase());
//System.out.println("Hal variable :"+variables);
List variableList = new ArrayList(variables);
//convertir les symboles math en symboles java
expr[0]=expr[0].replaceAll(« [|&]« , « $0$0″).toUpperCase();
expr[1]=expr[1].replaceAll(« [|&]« , « $0$0″).toUpperCase();
expr[0]=expr[0].replaceAll(« ~ », « ! »);
expr[1]=expr[1].replaceAll(« ~ », « ! »);
int n =variableList.size();
boolean[][] booleans = logic.generateBoolean(n);
for (int i = 0; i < booleans.length; i++) {
String tmp1 = expr[0];
String tmp2 = expr[1];
for (int j = 0; j Different! »);*/
return « »;
}
}
return outp;
}
public static void main(String[] args) throws ScriptException, FileNotFoundException {
Scanner in = new Scanner(new File(« ./logic.in »));
PrintWriter out = new PrintWriter(« ./logic.out »);
while(in.hasNext())
{
String inp = in.nextLine();
//System.out.println(« inp: « +inp);
out.print(logic.process(inp));
if(in.hasNext())
out.println();
else
break;
}
in.close();
out.close();
}
}
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.lang.Math;
import javax.script.*;
public class logic{
static String[] expression=new String[2];
static double nombrevariable=0;
static int[] nombredetest=new int[2];
static Boolean[][] resultat=new Boolean[2][1024];
static int i=0 , k=0;
static String suprimevide(String st){
while(st.indexOf(‘ ‘)!=-1){
st=st.substring(0,st.indexOf(‘ ‘))+st.substring(st.indexOf(‘ ‘)+1,st.length());
}
return st;
}
static boolean operateurexiste(String st){
if(st.indexOf(‘&’)!=-1||st.indexOf(‘|’)!=-1||st.indexOf(‘^’)!=-1||st.indexOf(‘~’)!=-1)
return true;
else return false;
}
static void traiter(String st, int n) throws Exception{
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(« JavaScript »);
st= »~~(« +st+ ») »;
nombrevariable=0;
char[] variable=new char[10];
int j=0;
for(i=0 ; i0 && st.substring(0,i).indexOf(c3)==-1)
nombrevariable++;
j++;
}
}
double l=Math.pow(2,nombrevariable);
nombredetest[n]=(int)l;
String[] lignetabverite=new String[1024];
for(i=0 ; i<l ; i++){
lignetabverite[i]=Integer.toBinaryString(i);
while(lignetabverite[i].length()<nombrevariable){
lignetabverite[i]="0"+lignetabverite[i];
}
}
while(st.indexOf('~')!=-1){
st=st.replace('~','!');
}
char a=' ';
char b=' ';
for(i=0 ; i<l ; i++){
String buff=st;
for(k=0 ; k<j ;k++){
a=variable[k];
b=lignetabverite[i].charAt(k);
buff=buff.replace(a,b);
}
resultat[n][i]=(Boolean)engine.eval(buff);
}
}
public static void main(String[] args) throws FileNotFoundException{
Scanner in=new Scanner(new File("logic.in"));
PrintWriter out=new PrintWriter("logic.out");
String line=new String("");
while(in.hasNextLine()){
line=in.nextLine();
if(line.indexOf(' ')!=-1)
line=suprimevide(line);
expression[0]=line.substring(0,1);
for(i=1 ; i<line.length() ; i++){
char c1=line.charAt(i-1);
char c2=line.charAt(i);
/* Recherche des deux expressions : */
//carctere_caractere
if(c2!='^'&&c2!='&'&&c2!='|'&&c2!='~'&&c2!='('&&c2!=')'&&c1!='|'&&c1!='^'&&c1!='&'&&c1!='~'&&c1!='('&&c1!=')')
break;
//parentheses fermante_ouvrante
else if(c2=='('&& c1==')')
break;
//caractere_tilda
else if(c2=='~'&& c1!='|'&& c1!='^'&& c1!='&'&& c1!='~')
break;
//parenthese fermante_tilda
else if(c2=='~'&& c1==')')
break;
//caractere_parenthese_ouvrante
else if(c2=='(' && c1!='|'&&c1!='^'&&c1!='&'&&c1!='('&& c1!='~')
break;
//parenthese_fermante_caractere
else if(c2!='|'&&c2!='^'&&c2!='&'&&c2!='~'&&c2!=')'&&c1==')')
break;
else
expression[0]+=line.substring(i,i+1);
}
expression[1]=line.substring(i,line.length());
if(!operateurexiste(expression[0])&&!operateurexiste(expression[1])){
if(expression[0].equals(expression[1]))
out.println("=");
else out.println(" »);
}
else{
try{
traiter(expression[0],0);
}
catch (Exception e) {
}
try{
traiter(expression[1],1);
}
catch (Exception e) {
}
int compteur=0;
if(nombredetest[0]<=nombredetest[1])
compteur=nombredetest[0];
else compteur=nombredetest[1];
for(i=0 ; i<compteur ;i++){
if(resultat[0][i]!=resultat[1][i]){
out.println(" »);
break;
}
}
if(i==compteur)
out.println(« = »);
}
}
in.close();
out.close();
}
}
Problème A : Numéros croisés
———————————–
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.regex.*;
import java.util.*;
import java.util.ArrayList;
public class chif{
static String ligne=new String( » « );
static ArrayList horizontal=new ArrayList();
static ArrayList titre=new ArrayList();
static ArrayList nlign=new ArrayList();
static ArrayList ncolon=new ArrayList();
static String[] hline=new String[30];
static String[] vline=new String[30];
static String st=new String(« »);
private static String afficher(String st){
if(!st.equals(« »))
nombre=Integer.valueOf(st);
if(nombre%2!=0 && nombre!=1){
nombre/=2;
st=st.valueOf(nombre)+ »+ »+st.valueOf(nombre+1)+ » « ;
trouve=true;
return st;
}
else if(nombre%2==0 && nombre!=2 && nombre!=0){
nombre/=2;
st=st.valueOf(nombre+1)+ »+ »+st.valueOf(nombre-1)+ » « ;
trouve=true;
return st;
}
return null;
}
static int numero=0 , nombre=0;
static int i=0 , j=0 , k=0 , nc=0 , m=0 , n=0, q=0 , lig=0, col=0 , l=0, d=0;
static boolean trouve=false;
public static void main(String[] args) throws FileNotFoundException{
Scanner in=new Scanner(new File(« chif.in »));
PrintWriter out=new PrintWriter(« chif.out »);
String s1= »", s2= »";
while(in.hasNextLine()){
ligne=in.nextLine();
horizontal.add(ligne);
}
if(horizontal.size()!=0){
numero++;
titre.add(« CROSSNUMBER : »+numero);
s1=horizontal.get(0);
n=(s1.length()-1)/2;
ncolon.add(n);
}
for(int i=1 ; i<horizontal.size() ; i++){
s1=horizontal.get(i);
s2=horizontal.get(i-1);
if(s1.indexOf('+')!=-1 && s2.indexOf('+')!=-1){
nlign.add(nc);
nc=0;
numero++;
titre.add("CROSSNUMBER :"+numero);
n=(s1.length()-1)/2;
ncolon.add(n);
}
else if(s1.indexOf('|')!=-1)
nc++;
}
nlign.add(nc);
for(k=0 ; k<numero ; k++){
m=0;
lig=nlign.get(k);
col=ncolon.get(k);
out.println(titre.get(k));
out.println(" ");
out.print(lig+" ");
out.print(col);
out.println("\n");
l+=2*lig+1;
for(i=d ; i<l ; i++){
ligne=horizontal.get(i);
int l=ligne.length();
String buf=new String("");
if(ligne.charAt(0)=='+') //affichage de la grille vide
out.print(ligne);
else if(ligne.charAt(0)=='|'){
buf="|";
for(j=1 ; j<l ; j++){
if(ligne.charAt(j)=='|')
buf=buf+"|";
else if(ligne.charAt(j)=='#')
buf=buf+"#";
else buf=buf+" ";
}
}
out.println(buf);
if(ligne.indexOf('+')==-1){ //Extraction des lignes
hline[m]=ligne;
while(hline[m].indexOf('|')!=-1)
hline[m]=hline[m].substring(0,hline[m].indexOf('|'))+hline[m].substring(hline[m].indexOf('|')+1,hline[m].length());
m++;
}
}
out.println(" ");
for(n=0 ; n<col ; n++){ //Extraction des colones
vline[n]=hline[0].substring(n,n+1);
for(j=1 ; j<lig ; j++)
vline[n]+=hline[j].substring(n,n+1);
}
Pattern p=Pattern.compile("#");
for(j=0 ; j<lig ; j++){
String[] parties=new String[30];
parties=p.split(hline[j]);
for(q=0 ; q<parties.length ; q++){
st=parties[q];
st=afficher(st);
if(st!=null)
out.println(st);
}
if(trouve==false)
out.println("-");
else trouve=false;
}
out.println(" ");
for(j=0 ; j<col ; j++){
String[] partico=new String[30];
partico=p.split(vline[j]);
for(q=0 ; q<partico.length ; q++){
st=partico[q];
st=afficher(st);
if(st!=null)
out.println(st);
}
if(trouve==false)
out.println("-");
else trouve=false;
}
d=i;
}
in.close();
out.close();
}
}