Just out of curiosity

This is a discussion on Just out of curiosity within the C++ Programming forums, part of the General Programming Boards category; I was stumbling through some online message boards and I came across three problems that piqued my curiosity. Each problem ...

  1. #1
    Registered User
    Join Date
    Oct 2005
    Posts
    271

    Just out of curiosity

    I was stumbling through some online message boards and I came across three problems that piqued my curiosity. Each problem asks you to write code which will generate the following output:

    No 1.
    1 25
    2 8 20 26
    3 9 13 17 21 27
    4 10 14 16 18 22 28
    5 11 15 19 23 29
    6 12 24 30
    7 31

    *edit* I didn't know the board automatically deleted multiple spaces. The above is supposed to look like a ribbon or butterfly.

    No 2.
    1 3 6 10 15
    2 5 9 14 19
    4 8 13 18 22
    7 12 17 21 24
    11 16 20 23 25

    No. 3
    1 3 5 7 9 11 13
    47 49 51 53 55 57 15
    45 79 81 83 85 59 17
    43 77 95 97 87 61 19
    41 75 93 91 89 63 21
    39 73 71 69 67 65 23
    37 35 33 31 29 27 25


    It took me five hours to do it (and I made some improvements) but I eventually did complete it.
    Unfortunately, the message board did not indicate whether there was a terse, near-genius solution to these problems. My code nears some 160 lines of code but I know there is a solution out there written by some really smart guy that can do it in about 10 (maybe I exaggerate). If anybody knows where it is, or has the relevant bit of code, please feel free to give me a hand.

    Anyway, here's my code:
    Code:
    #include <stdio.h>
    
    void butterfly(int, int);
    void diagonal(int, int);
    void twine(int, int);
    
    int main()
    {
    	int i, j, k;
    	while(1)
    	{
    restart:
    		printf("Select figure to draw: (1. butterfly 2. diagonal stripes 3. ball 4. exit)   ");
    		scanf("%d", &i);		
    		if(i == 4) break;
    		else if(i > 4) goto restart;
    		printf("Define dimensions:");
    		scanf("%d", &j);
    		printf("Define common difference: ");
    		scanf("%d", &k);
    		switch(i)
    		{
    		case 1: butterfly(j, k); break;
    		case 2:	diagonal(j, k); break;
    		case 3:	twine(j, k); break;
    		default: break;
    		}
    	}
    	return 0;
    }
    
    void butterfly(int nD, int nStep)
    {
    	int** nArray;
    	int i, j, k = 1, nHalf;
    	nHalf = nD >> 1;
    	nArray = new int* [nD];
    	for(i = 0; i < nD; i++)
    		nArray[i] = new int [nD];
    	for(i = 0; i < nD; i++)
    		for(j = 0; j < nD; j++)
    			nArray[i][j] = 0;
    	for(i = 0; i < nD; i++)
    	{
    		if(i < nHalf)
                for(j = i; j < nD - i; j++, k+=nStep)
                    nArray[i][j] = k;
    		else
    			for(j = nD - i - 1; j < i + 1; j++, k+=nStep)
                    nArray[i][j] = k;
    	}
    	for(i = 0; i < nD; i++)
    	{
    		for(j = 0; j < nD; j++)
    		{
    			if(nArray[j][i] != 0) printf("%3d", nArray[j][i]);
    			else printf("   ");
    		}
    		printf("\n");
    	}
    	for(i = 0; i < nD; i++)
    		delete [] nArray[i];
    	delete [] nArray;
    }
    
    void diagonal(int nD, int nStep)
    {
    	int** nArray;
    	int i, j, k = 1, l = 0;
    	nArray = new int* [nD];
    	for(i = 0; i < nD; i++)
    		nArray[i] = new int [nD];
    	for(i = 0; i < nD; i++)
    		for(j = 0; j < nD; j++)
    			nArray[i][j] = 0;
    	for(i = 0; i < nD * 2 - 1; i++)
    	{
    		if(i < nD)
                for(j = 0; j <= i; j++, k+=nStep)
                    nArray[i-j][j] = k;
    		else
    		{
    			l++;
    			for(j = l;j < nD; j++, k+=nStep)
    				nArray[i-j][j] = k;
    		}
    	}
    	for(i = 0; i < nD; i++)
    	{
    		for(j = 0; j < nD; j++)
    			printf("%3d", nArray[i][j]);
    		printf("\n");
    	}
    	for(i = 0; i < nD; i++)
    		delete [] nArray[i];
    	delete [] nArray;
    }
    
    void twine(int nD, int nStep)
    {
    	int** nArray;
    	int i, j, k = 1, row = 0, column = 0, nt_D = nD, c_init = 0, r_init = 0;
    	bool horizontal = true, vertical = true;
    	nArray = new int* [nD];
    	for(i = 0; i < nD; i++)
    		nArray[i] = new int [nD];
    	while(k <= nD * nD * nStep)
    	{
    		if(horizontal && vertical)
    		{
    			for(i = column; i < nt_D; i++, k+=nStep)
    			{
    				nArray[row][i] = k;
    			}
    			c_init = column - 1;
    			vertical = !vertical;
    			row++;	
    			column = i - 1;
    			//nt_D--;
    		}
    		else if(horizontal && !vertical)
    		{
    			for(i = row; i < nt_D; i++, k+=nStep)
    			{
    				nArray[i][column] = k;
    			}
    			r_init = row - 1;
    			horizontal = !horizontal;
    			column--;
    			row = i - 1;
    		}
    		else if(!horizontal && !vertical)
    		{
    			for(i = column; i > c_init; i--, k+=nStep)
    				nArray[row][i] = k;			
    			vertical = !vertical;
    			row--;
    			column = i + 1;
    			nt_D--;
    		}
    		else if(!horizontal && vertical)
    		{
    			for(i = row; i > r_init; i--, k+=nStep)
    				nArray[i][column] = k;
    			horizontal = !horizontal;
    			row = i + 1;
    			column++;
    		}
    	}
    	for(i = 0; i < nD; i++)
    	{
    		for(j = 0; j < nD; j++)
    			printf("%3d", nArray[i][j]);
    		printf("\n");
    	}
    	for(i = 0; i < nD; i++)
    		delete [] nArray[i];
    	delete [] nArray;
    }

  2. #2
    Registered User
    Join Date
    Jan 2005
    Posts
    7,319
    Could you post a link to the message board where it states the problem. Also, perhaps you should post this on the C board.

  3. #3
    ^ Read Backwards^
    Join Date
    Sep 2005
    Location
    Earth
    Posts
    282
    If you put the numbers in the code bracket you can space it properly to show us.

  4. #4
    Registered User
    Join Date
    Oct 2005
    Posts
    271
    I've given up on getting the formatting right, but you can get the gist of it (I hope).

    Code:
    No 1. 
    1                                      25
    2     8                        20   26
    3     9   13          17   21   27
    4   10   14   16   18   22   28
    5   11   15          19   23   29
    6   12                        24   30
    7                                      31
    
    No 2.
      1     3     6   10   15
      2     5     9   14   19
      4     8   13   18   22
      7   12   17   21   24
    11   16   20   23   25
    
    No. 3
      1     3     5     7     9   11   13
    47   49   51   53   55   57   15
    45   79   81   83   85   59   17
    43   77   95   97   87   61   19
    41   75   93   91   89   63   21
    39   73   71   69   67   65   23
    37   35   33   31   29   27   25
    And as for the original post, it's in Korean but if you want to risk it, here's the link:

    http://kin.naver.com/db/detail.php?d...+Ivy100DHeWrED

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. quick question of curiosity about return statements
    By bobthebullet990 in forum C Programming
    Replies: 1
    Last Post: 08-31-2007, 07:56 AM
  2. Curiosity question...
    By Raigne in forum C++ Programming
    Replies: 2
    Last Post: 04-05-2007, 09:49 PM
  3. Out of curiosity?
    By voodoo3182 in forum Tech Board
    Replies: 6
    Last Post: 08-05-2005, 10:10 AM
  4. Not important, only a curiosity...
    By BrownB in forum C Programming
    Replies: 35
    Last Post: 12-27-2004, 02:32 PM
  5. Curiosity Question
    By Eber Kain in forum C++ Programming
    Replies: 2
    Last Post: 10-10-2001, 03:24 PM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21