Advertisement
MonsterScripter

CodinGame_2023_09_07__18_53_43__logic_gates.cpp

Sep 7th, 2023
1,209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.97 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <map>
  7.  
  8. using namespace std;
  9.  
  10. /**
  11.  * Objectif
  12.  * 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.
  13.  *
  14.  * Énoncé :
  15.  * É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.
  16.  *
  17.  * Tous les types de portes auront toujours deux entrées et une sortie.
  18.  * Toutes les données des signaux d'entrée ont toujours la même longueur.
  19.  *
  20.  * Les types de portes sont les suivants :
  21.  * - AND : effectue une opération ET logique.
  22.  * - OR : effectue une opération OU logique.
  23.  * - XOR : effectue une opération OU exclusif logique.
  24.  * - NAND : effectue une opération ET logique inversée.
  25.  * - NOR : effectue une opération OU logique inversée.
  26.  * - NXOR : effectue une opération OU exclusif logique inversée.
  27.  *
  28.  * 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).
  29.  **/
  30.  
  31. char boolToCharLogicGates(bool b) {
  32.     return b ? '-' : '_';
  33. }
  34.  
  35. bool charToBoolLogicGates(char c) {
  36.     return c == '-' ? true : false;
  37. }
  38.  
  39. enum class LogicOperator {
  40.     AND,
  41.     OR,
  42.     XOR,
  43.     NAND,
  44.     NOR,
  45.     NXOR
  46. };
  47.  
  48. bool doOperator(LogicOperator op, bool a, bool b) {
  49.     switch (op) {
  50.         case LogicOperator::AND:
  51.             return a && b;
  52.         case LogicOperator::OR:
  53.             return a || b;
  54.         case LogicOperator::XOR:
  55.             return a != b;
  56.         case LogicOperator::NAND:
  57.             return !(a && b);
  58.         case LogicOperator::NOR:
  59.             return !(a || b);
  60.         case LogicOperator::NXOR:
  61.             return a == b;
  62.         default:
  63.             return false;
  64.     }
  65. }
  66.  
  67. int main()
  68. {
  69.     int n;
  70.     cin >> n; cin.ignore();
  71.     int m;
  72.     cin >> m; cin.ignore();
  73.  
  74.     // Traitement des données des signaux d'entrée
  75.     map<string, string> inputSignals;
  76.     for (int i = 0; i < n; i++) {
  77.         string inputName;
  78.         string inputSignal;
  79.         cin >> inputName >> inputSignal; cin.ignore();
  80.         inputSignals[inputName] = inputSignal;
  81.     }
  82.  
  83.     // Traitement des signaux de sortie
  84.     for (int i = 0; i < m; i++) {
  85.         string outputName;
  86.         string type;
  87.         string inputName1;
  88.         string inputName2;
  89.         cin >> outputName >> type >> inputName1 >> inputName2; cin.ignore();
  90.  
  91.         // Récupère les données des signaux d'entrée
  92.         string signalForm1 = inputSignals[inputName1];
  93.         string signalForm2 = inputSignals[inputName2];
  94.         int length = min(signalForm1.length(), signalForm2.length());
  95.  
  96.         // Détermine le type d'opérateur logique
  97.         LogicOperator gateType;
  98.         if (type == "AND") gateType = LogicOperator::AND;
  99.         else if (type == "OR") gateType = LogicOperator::OR;
  100.         else if (type == "XOR") gateType = LogicOperator::XOR;
  101.         else if (type == "NAND") gateType = LogicOperator::NAND;
  102.         else if (type == "NOR") gateType = LogicOperator::NOR;
  103.         else if (type == "NXOR") gateType = LogicOperator::NXOR;
  104.  
  105.         // Calcule la sortie
  106.         string outputSignal;
  107.         for (int j = 0; j < length; j++) {
  108.             bool signal1 = charToBoolLogicGates(signalForm1[j]);
  109.             bool signal2 = charToBoolLogicGates(signalForm2[j]);
  110.             bool result = doOperator(gateType, signal1, signal2);
  111.             outputSignal += boolToCharLogicGates(result);
  112.         }
  113.         cout << outputName << " " << outputSignal << endl;
  114.     }
  115.     return EXIT_SUCCESS;
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement