Wednesday 16 October 2013

How to implement Short Quines in C?


1) Quine Using Macros :

#define Z(x)t=#x;x
Z(main(){printf("#define Z(x)t=#x;x\nZ(%s)",t);})

2) Use a variable without declaring
b;main(a,s){printf(s="b;main(a,s){printf(s=%c%s%c,34,s,34,a,b);}",34,s,34,a,b);}

In the above quine, there is no need to declare s char *s


3) Initialize variables without assigning values explicitly
b;main(a,s){printf(s="b;main(a,s){printf(s=%c%s%c,34,s,34,a,b);}",34,s,34,a,b);}

In the above quine, a and b are integer variables initialized to 1 and 0 respectively.

4) Use ternary operators if possible
#define Z(x)t=#x;x
Z(main(i){for(;12%++i;);printf(i-12?"#define Z(x)t=#x;x\nZ(%s)":"YES",t);})

The above program acts as a quine if a number is composite else prints “Yes”.
Replace 12 by other numbers to check.

5) Use logical operators:

Example :
The code :

if(n%2==0)
n=n/2;
else
n=n*2;
printf(“%d\n”, n);

can be rewritten as :

printf("%d\n", n%2?n*2:n/2);

Tuesday 15 October 2013

Shortest Quine Ever in Python

(Hint: empty source file)

Sorted subsequence of size 3 in O(n) time and O(n) extra space

#include<stdio.h>
#include<stdlib.h>
void size3Subsequence(int arr[], int n)
{
    int max = n-1, min=0, i;
     int *smaller = (int*)malloc(sizeof(int)*n);
     smaller[0] = -1;
     for (i = 1; i < n; i++)
    {
        if (arr[i] <= arr[min])
        {
            min = i;
            smaller[i] = -1;
        }
       
        else
            smaller[i] = min;
   }

    for (i = n-2; i >= 0; i--)
    {
        if (arr[i] >= arr[max])
            max = i;

        else if(smaller[i]!=-1)
        {
            printf("%d %d %d\n", arr[smaller[i]], arr[i], arr[max]);
                free(smaller);
            return;
        }  
    }

    printf("No such triplet found\n");
    free(smaller);
    return;
}

int main()
{
    int arr[] = {1,3,0, 2, 5, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    size3Subsequence(arr, n);
    return 0;
}

Monday 14 October 2013

Maximum of all subarrays of size k in O(n) time and O(1) extra space !!

#include<stdio.h>
#include<limits.h>

void printKMax(int *arr, int n , int k)
{
    int max=INT_MIN, sec_max=INT_MIN, tag=0,cnt=0;
    int i, max_i, sec_max_i;
   
    for(i=0;i<n;i++)
    {
        if(arr[i]>=max)
        {
            max = arr[i];
            max_i=i-cnt;
        }
       
        else if(arr[i]>=sec_max)
        {
            sec_max = arr[i];
            sec_max_i=i-cnt;
        }
       
        if(i==k-1)
            tag=1;
       
        if(tag)
        {
            cnt++;
            printf("%d ", max);
                   
            max_i--;
            sec_max_i--;
           
            if(max_i==-1)
            {
                max_i = sec_max_i;
                max=sec_max;
                sec_max = INT_MIN;
            }
        }
    }
        printf("\n");
}

int main()
{
    int arr[] ={3,7,1,213, 12, 312};
    int n = sizeof(arr)/sizeof(arr[0]);
    int k = 3;
    printKMax(arr, n, k);
    return 0;
}