Code initiative – Rabat 2011

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

<>

=

Je partage avec :
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • email
  • Add to favorites
  • Google Buzz
  • LinkedIn
  • Live
  • MySpace
  • Netvibes
  • Orkut
  • Posterous
  • Reddit
Categories: Coding challenge

3 Responses so far.

  1. Mohamed Amine MOUSSAID dit :

    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();
    }

    }

  2. Driss Kahfy dit :

    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();
    }
    }

  3. Driss Kahfy dit :

    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();
    }
    }