Advertisement
MonsterScripter

CodinGame_2023_09_07__18_57_28__logic_gates.c

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