Just out of curiosity

• 12-01-2005
cunnus88
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; }```
• 12-01-2005
Daved
Could you post a link to the message board where it states the problem. Also, perhaps you should post this on the C board.
• 12-01-2005
Enahs
If you put the numbers in the code bracket you can space it properly to show us.
• 12-01-2005
cunnus88
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