From: genrad!decvax!ihnp4!homebru!ignatz
Subject: Telno: a telephone number permutation program
Newsgroups: mod.sources
Approved: jpn@panda.UUCP
Mod.sources: Volume 3, Issue 65
Submitted by: ihnp4!homebru!ignatz
This is a little bit of fluff that arose in the course of a night of
imbibing inspriational spirits; I'm sure it's been done before.
Simply enough, it takes a telephone number and provides all possible
permutations of the letters on the dial keycaps. It doesn't attempt to
be nifty and throw out combinations that aren't pronouncable; you've got
a neat array processor of your own that's quite a bit faster at complex
pattern recognition than the poor program. Besides, I was too hazy to
think that hard... The person who asked if this was possible is happy;
that's as far as I'm going to take this thing.
As I say, I only apologize slightly for the code quality; I'm rather
amazed that it worked...
Dave Ihnat
ihnp4!homebru!ignatz
===================== Cut me, hurt me, but do it here ==============
/*
* telno - permute telephone number letters
*
* Author: David M. Ihnat
*
* This is a trivial program to accept a typical United States-type,
* 7-digit telephone number, and provide all possible unique permutations of
* the letters found on the standard dial positions. Although this is
* a quick-and-dirty program, I did try to design it in such a manner
* that different characters and telephone number lengths should be
* easy to do.
*
* I freely grant anyone the right to do anything they wish with this
* thing, as long as it's (as usual) not for profit. I apologize only
* casually for the code, as I was more than 3 sheets to the wind when
* I slapped it out...logic and Jack Daniel's are strange glass-fellows...
*/
#include
#define VERSION "1.0" /* As if there's going to be a 2.0... */
#define TEL_LEN 7 /* Length of a telephone number in digits */
#define MAX_COMB 2188 /* Maximum number of combinations */
#define NULL_CHAR '@' /* Indicates not to do this character */
/*
* This must equal the length of the entries in telno_def[]. In this
* manner, you can add arbitrary combinations of letters, digits, etc.
* to satisfy different character sets; or, for instance, you may wish
* to allow the actual number in the string, as well. If you *do*
* change SUBSTR_LEN, don't forget to change MAX_COMB.
*/
#define SUBSTR_LEN 3
char *telno_def[10] = {
/* 0 1 2 3 4 5 6 7 8 9 */
"0@@", "1@@", "abc", "def", "ghi", "jkl", "mno", "prs", "tuv", "wxy"
};
/* The payoff; 3 possible/no, plus null string*/
char listary[MAX_COMB][TEL_LEN+1];
list_idx = 0;
extern int errno;
main(argc,argv)
int argc;
char *argv[];
{
register char *telptr;
register short index;
short tel_idx[TEL_LEN];
argc--,argv++; /* Most micros don't support argv[0] */
if(!argc)
{
fprintf(stderr,"Usage: xxx[-]yyyy\n",*argv);
exit(1);
}
telptr = *argv;
/* If there is a dash in the telephone string, cut it out. */
if(telptr[3] == '-')
{
register char *p1,*p2;
for(p1 = &telptr[3], p2 = &telptr[4];*p1 != '\0';)
*p1++ = *p2++;
}
fprintf(stderr,"Processing for %s....",telptr);
/*
* Now to break the telephone number apart into an array of
* indices
*/
for(index=0;index < TEL_LEN;index++)
tel_idx[index] = (*telptr++) - '0';
/* Now build the permuations */
proc_num(tel_idx);
/* Null-terminate the array */
listary[list_idx][0] = '\0';
/* Now sort the array */
sort_num();
/* Finally, print it out. */
fprintf(stderr,"done.\n\n");
dump_num();
}
proc_num(prim_idx)
short prim_idx[];
{
register int index;
short sec_idx[TEL_LEN];
/*
* Permute the given TEL_LEN-digit array for all possible
* combinations of related key-top digits. This could
* be done either iteratively or recursively; to keep
* stack usage down, I've selected an iterative approach.
*
* If you extend or shrink the length of a telepone number,
* change the number of for loops here.
*/
for(sec_idx[0] = 0;sec_idx[0] < SUBSTR_LEN;++sec_idx[0])
for(sec_idx[1] = 0;sec_idx[1] < SUBSTR_LEN;++sec_idx[1])
for(sec_idx[2] = 0;sec_idx[2] < SUBSTR_LEN;++sec_idx[2])
for(sec_idx[3] = 0;sec_idx[3] < SUBSTR_LEN;++sec_idx[3])
for(sec_idx[4] = 0;sec_idx[4] < SUBSTR_LEN;++sec_idx[4])
for(sec_idx[5] = 0;sec_idx[5] < SUBSTR_LEN;++sec_idx[5])
for(sec_idx[6] = 0;sec_idx[6] < SUBSTR_LEN;++sec_idx[6])
{
bld_str(prim_idx,sec_idx);
}
}
bld_str(prim_idx,sec_idx)
short prim_idx[],sec_idx[];
{
register int idx;
register char c;
for(idx=0; idx < TEL_LEN; idx++)
{
c = telno_def[prim_idx[idx]][sec_idx[idx]];
if(c == NULL_CHAR)
return;
listary[list_idx][idx] = c;
}
listary[list_idx][8] = '\0';
list_idx++;
}
sort_num()
{
int strcmp();
/*
* Cheat--use the library sort. If your library doesn't have
* one, well...have fun. It's not too hard...
*/
qsort(listary,(list_idx-1),8,strcmp);
}
dump_num()
{
/*
* Dump the permutations, 10 per line. (Just fits on 80-col
* printout)
*/
register int idx1,idx2;
for(idx1 = 0;*listary[idx1] != '\0';)
{
for(idx2=0;(*listary[idx1] != '\0') && (idx2 < 10); idx1++,idx2++)
{
fputs(listary[idx1],stdout);
fputc(' ',stdout);
}
fputc('\n',stdout);
}
fputc('\n',stdout);
}