Advertisement
MonsterScripter

CodinGame_2023_09_07__18_45_03__logic_gates.java

Sep 7th, 2023
878
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.97 KB | None | 0 0
  1. import java.util.Scanner;
  2. import java.util.Map;
  3. import java.util.HashMap;
  4.  
  5. /**
  6.  * Objectif
  7.  * Une porte logique est un dispositif électronique qui met en œuvre une fonction booléenne, effectue une opération logique sur une ou plusieurs entrées binaires et produit une seule sortie binaire.
  8.  *
  9.  * Énoncé :
  10.  * Étant donné n noms de signaux d'entrée et leurs données respectives, et m noms de signaux de sortie avec leur type de porte logique respective et deux noms de signaux d'entrée, fournissez les noms des signaux de sortie m et leurs données respectives, dans le même ordre que ceux fournis dans la description de l'entrée.
  11.  *
  12.  * Tous les types de portes auront toujours deux entrées et une sortie.
  13.  * Toutes les données des signaux d'entrée ont toujours la même longueur.
  14.  *
  15.  * Les types de portes sont les suivants :
  16.  * - AND : effectue une opération ET logique.
  17.  * - OR : effectue une opération OU logique.
  18.  * - XOR : effectue une opération OU exclusif logique.
  19.  * - NAND : effectue une opération ET logique inversée.
  20.  * - NOR : effectue une opération OU logique inversée.
  21.  * - NXOR : effectue une opération OU exclusif logique inversée.
  22.  *
  23.  * Les signaux sont représentés par des caractères de soulignement et de tiret, un soulignement correspondant à un niveau bas (0 ou faux) et un tiret correspondant à un niveau élevé (1 ou vrai).
  24.  *
  25.  * Entrée :
  26.  * Ligne 1 : le nombre n de signaux d'entrée.
  27.  * Ligne 2 : le nombre m de signaux de sortie.
  28.  * Les n lignes suivantes : deux chaînes de caractères séparées par un espace : le nom du signal d'entrée, puis la forme du signal.
  29.  * Les m lignes suivantes : quatre chaînes de caractères séparées par un espace : le nom du signal de sortie, le type de porte logique, le nom du premier signal d'entrée, puis le nom du deuxième signal d'entrée.
  30.  *
  31.  * Sortie :
  32.  * m lignes : deux chaînes de caractères séparées par un espace : le nom du signal de sortie, puis la forme du signal.
  33.  *
  34.  * Contraintes :
  35.  * 1 ≤ n ≤ 4
  36.  * 1 ≤ m ≤ 16
  37.  *
  38.  * Exemple :
  39.  * Entrée
  40.  * 2
  41.  * 3
  42.  * A __---___---___---___---___
  43.  * B ____---___---___---___---_
  44.  * C AND A B
  45.  * D OR A B
  46.  * E XOR A B
  47.  *
  48.  * Sortie
  49.  * C ____-_____-_____-_____-___
  50.  * D __-----_-----_-----_-----_
  51.  * E __--_--_--_--_--_--_--_--_
  52.  */
  53. class Solution {
  54.  
  55.     public static void main(String args[]) {
  56.         final Scanner in = new Scanner(System.in);
  57.         final int n = in.nextInt();
  58.         final int m = in.nextInt();
  59.         final Map<String, String> hm = new HashMap<String, String>();
  60.         for (int i = 0; i < n; i++) {
  61.             String inputName = in.next();
  62.             String inputSignal = in.next();
  63.             hm.put(inputName, inputSignal);
  64.         }
  65.         String outputName = null;
  66.         String type = null;
  67.         String inputName1 = null;
  68.         String inputName2 = null;
  69.         LogicOperator lo = null;
  70.         String signalForm1 = null;
  71.         String signalForm2 = null;
  72.         int length = 0;
  73.         Character signal1Char = null;
  74.         Character signal2Char = null;
  75.         Boolean signal1Bool = null;
  76.         Boolean signal2Bool = null;
  77.         Character result = null;
  78.         StringBuilder sb = new StringBuilder();
  79.         for (int i = 0; i < m; i++) {
  80.             outputName = in.next();
  81.             type = in.next();
  82.             inputName1 = in.next();
  83.             inputName2 = in.next();
  84.             lo = LogicOperator.getLogicOperatorByOperationName(type);
  85.             signalForm1 = hm.get(inputName1);
  86.             signalForm2 = hm.get(inputName2);
  87.             length = Math.min(signalForm1.length(), signalForm2.length());
  88.             sb.append(outputName + " ");
  89.             for (int j = 0; j < length; j++) {
  90.                 signal1Char = signalForm1.charAt(j);
  91.                 signal2Char = signalForm2.charAt(j);
  92.                 signal1Bool = charToBoolLogicGates(signal1Char);
  93.                 signal2Bool = charToBoolLogicGates(signal2Char);
  94.                 result = boolToCharLogicGates(lo.doOperator(signal1Bool, signal2Bool));
  95.                 sb.append(Character.toString(result));
  96.             }
  97.             sb.append("\n");
  98.         }
  99.         System.out.println(sb.toString().trim());
  100.     }
  101.  
  102.     private static Character boolToCharLogicGates(boolean b) {
  103.         return b ? '-' : '_';
  104.     }
  105.  
  106.     private static Boolean charToBoolLogicGates(char c) {
  107.         return c == '-' ? true : false;
  108.     }
  109.  
  110.     private enum LogicOperator {
  111.  
  112.         AND("AND") {
  113.             public Boolean doOperator(Boolean a, Boolean b) {
  114.                 return a & b;
  115.             }
  116.         },
  117.         OR("OR") {
  118.             public Boolean doOperator(Boolean a, Boolean b) {
  119.                 return a | b;
  120.             }
  121.         },
  122.         XOR("XOR") {
  123.             public Boolean doOperator(Boolean a, Boolean b) {
  124.                 return a ^ b;
  125.             }
  126.         },
  127.         NAND("NAND") {
  128.             public Boolean doOperator(Boolean a, Boolean b) {
  129.                 return !(a & b);
  130.             }
  131.         },
  132.         NOR("NOR") {
  133.             public Boolean doOperator(Boolean a, Boolean b) {
  134.                 return !(a | b);
  135.             }
  136.         },
  137.         NXOR("NXOR") {
  138.             public Boolean doOperator(Boolean a, Boolean b) {
  139.                 return !(a ^ b);
  140.             }
  141.         };
  142.  
  143.         private String logicOperatorName;
  144.         LogicOperator(String logicOperatorName) {
  145.             this.logicOperatorName = logicOperatorName;
  146.         }
  147.  
  148.         public String getLogicOperatorName() {
  149.             return this.logicOperatorName;
  150.         }
  151.  
  152.         public static LogicOperator getLogicOperatorByOperationName(String logicOperatorName) {
  153.             for (LogicOperator o : LogicOperator.values()) {
  154.                 if (o.getLogicOperatorName().equals(logicOperatorName)) {
  155.                     return o;
  156.                 }
  157.             }
  158.             return null;
  159.         }
  160.  
  161.         public abstract Boolean doOperator(Boolean a, Boolean b);
  162.  
  163.     }
  164. }
  165.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement