home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1746 < prev    next >
Encoding:
Internet Message Format  |  1990-12-28  |  2.5 KB

  1. From: maart@cs.vu.nl (Maarten Litmaath)
  2. Newsgroups: rec.puzzles,alt.sources
  3. Subject: bugfix of perm() & perm_number() routines (was: balls)
  4. Message-ID: <7401@star.cs.vu.nl>
  5. Date: 29 Aug 90 18:17:44 GMT
  6.  
  7. Thanks to Icarus Sparry <I.Sparry@gdt.bath.ac.uk> for pointing out the
  8. erroneous calls to free().
  9.  
  10. : This is a shar archive.  Extract with sh, not csh.
  11. : This archive ends with exit, so do not worry about trailing junk.
  12. : --------------------------- cut here --------------------------
  13. PATH=/bin:/usr/bin:/usr/ucb
  14. echo Extracting 'perm.c'
  15. sed 's/^X//' > 'perm.c' << '+ END-OF-FILE ''perm.c'
  16. Xint    perm(n, nullperm, length, dest)
  17. Xlong    n;
  18. Xchar    *nullperm, *dest;
  19. Xint    length;
  20. X{
  21. X    long    f;
  22. X    int    d;
  23. X    char    *orig, *p, *q, *r, *malloc();
  24. X
  25. X    if (!(orig = p = malloc(length)))
  26. X        return -1;
  27. X
  28. X    strncpy(p, nullperm, length);
  29. X
  30. X    for (d = --length, f = 1; d > 0; d--)
  31. X        f *= d;
  32. X
  33. X    while (length > 0) {
  34. X        d = n / f;
  35. X        *dest++ = p[d];
  36. X        if (!d)
  37. X            p++;
  38. X        else
  39. X            for (q = p + d, r = q + 1; *q++ = *r++; )
  40. X                ;
  41. X        n -= f * d;
  42. X        f /= length--;
  43. X    }
  44. X
  45. X    *dest++ = *p;
  46. X    *dest = '\0';
  47. X
  48. X    free(orig);
  49. X
  50. X    return 0;
  51. X}
  52. X
  53. X
  54. Xmain(argc, argv)
  55. Xint    argc;
  56. Xchar    **argv;
  57. X{
  58. X    char    buf[32];
  59. X    long    atol();
  60. X
  61. X    if (argc > 2) {
  62. X        perm(atol(argv[1]), argv[2], strlen(argv[2]), buf);
  63. X        printf("%s\n", buf);
  64. X    }
  65. X}
  66. + END-OF-FILE perm.c
  67. chmod 'u=rw,g=r,o=r' 'perm.c'
  68. set `wc -c 'perm.c'`
  69. count=$1
  70. case $count in
  71. 661)    :;;
  72. *)    echo 'Bad character count in ''perm.c' >&2
  73.         echo 'Count should be 661' >&2
  74. esac
  75. echo Extracting 'perm_number.c'
  76. sed 's/^X//' > 'perm_number.c' << '+ END-OF-FILE ''perm_number.c'
  77. Xlong    perm_number(s, nullperm, n)
  78. Xchar    *s, *nullperm;
  79. Xint    n;
  80. X{
  81. X    long    number = 0;
  82. X    char    *q, *r, *c_index, *orig, *t, *malloc(), *index();
  83. X
  84. X    if (!(orig = t = malloc(n)))
  85. X        return -1;
  86. X
  87. X    strncpy(t, nullperm, n);
  88. X
  89. X    while (--n > 0) {
  90. X        if (!(c_index = index(t, *s++))) {
  91. X            number = -1;
  92. X            break;
  93. X        }
  94. X        number += c_index - t;
  95. X        number *= n;
  96. X        if (c_index == t)
  97. X            t++;
  98. X        else
  99. X            for (q = c_index, r = q + 1; *q++ = *r++; )
  100. X                ;
  101. X    }
  102. X
  103. X    free(orig);
  104. X
  105. X    return number;
  106. X}
  107. X
  108. X
  109. Xmain(argc, argv)
  110. Xint    argc;
  111. Xchar    **argv;
  112. X{
  113. X    if (argc > 2)
  114. X        printf("%ld\n",
  115. X            perm_number(argv[1], argv[2], strlen(argv[2])));
  116. X}
  117. + END-OF-FILE perm_number.c
  118. chmod 'u=rw,g=r,o=r' 'perm_number.c'
  119. set `wc -c 'perm_number.c'`
  120. count=$1
  121. case $count in
  122. 589)    :;;
  123. *)    echo 'Bad character count in ''perm_number.c' >&2
  124.         echo 'Count should be 589' >&2
  125. esac
  126. exit 0
  127. --
  128.      "What is a rabbit?  A particle that makes special tracks in the snow!"
  129.                                 (Paul M. Koloc)
  130.