Thursday, October 10, 2013

Boolean OR of Two Digital Signals

Write a program to generate a boolean OR of two digital signals. A signal has two states, a high state and a low state. It is given as an array of positive integers in ascending order. Each pair of integer indicates the range of the signal in a high state. The array size will be even, so that the signal starts with a low state and ends with a low state.
Consider two signals named A and B described as follows:
A = 3 4 5 9 10 11
and
B = 1 2 6 12 13 14

Their boolean OR will be a signal A OR B = 1 2 3 4 5 12 13 14

This is illustrated in the figure below ...



Input Specification:

The input will describe two signals, one on each line. Every line will begin with an integer H, which specifies the number of high states of the signal. This is followed by 2*H positive integers describing the signal, as shown above. Assume that state change will never occur at same time (the integers can be thought of as a timeline) in the two given signals.

Output Specification:

The output signal should be the boolean OR of the two input signals, described in exactly the same manner as the input.

Sample Input and Output:

Input:
3 3 4 5 9 10 11
3 1 2 6 12 13 14
Output:
4 1 2 3 4 5 12 13 14
Input:
5 2 5 6 10 20 23 38 45 51 52
5 1 4 7 9 14 19 21 24 30 31
Output:
7 1 5 6 10 14 19 20 24 30 31 38 45 51 52
Input:
1 1 1000
1 999 10000
Output:
1 1 10000

Solutions:

Using C language ....

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j;
    //Input array for storing the input data
    int out[20000];
    //Output array for calculating boolean or
    int output[10000];
    //Temproary variables
    int width,l,h;
    int k,flag,flag2;
    
    //Clearing the array for storing input
    for(i=0;i<20000;i++)
    out[i]=0;

    //Reading first signal    
    scanf("%d",&width);
    for(i=0;i<width;i++)
    {
        scanf("%d %d",&l,&h);
        for(;l<h;l++)
        {
            out[l]=1;
        }
    }
    
    //Reading second signal and adding it to first
    scanf("%d",&width);
    for(i=0;i<width;i++)
    {
        scanf("%d %d",&l,&h);
        for(;l<h;l++)
        {
            out[l]=1;
        }
    }

    //Calculating output in output array
    width=0;
    k=0;
    for(i=0;i<20000;i++)
    {
        if(out[i]==1 && flag==0)
        {
            output[k]=i;
            flag=1;
            flag2=1;
            k++;
            width++;
        }
        
        else if(out[i]==0)
        {
            flag=0;
        }
        if(flag==0 && flag2==1)
        {
            output[k]=i;
            flag2=0;
            k++;
        }
    }

    //Printing output
    printf("%d",width);
    for(i=0;i<k;i++)
    {
        printf(" %d",output[i]);
    }
    printf("\n");

    return 0;
}

No comments:

Post a Comment