home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #23 / NN_1992_23.iso / spool / sci / math / 13289 < prev    next >
Encoding:
Text File  |  1992-10-15  |  8.4 KB  |  341 lines

  1. Xref: sparky sci.math:13289 sci.physics:16620
  2. Path: sparky!uunet!portal!lll-winken!sun-barr!news2me.EBay.Sun.COM!west.West.Sun.COM!smaug.West.Sun.COM!richard
  3. From: Richard.Mathews@West.Sun.COM (Richard M. Mathews)
  4. Newsgroups: sci.math,sci.physics
  5. Subject: Re: "The Universe of MOTION" (crackpot index)
  6. Message-ID: <1bkpg2INNmt1@smaug.West.Sun.COM>
  7. Date: 15 Oct 92 21:57:22 GMT
  8. References: <1992Oct13.191813.1751@cnsvax.uwec.edu> <1992Oct14.194338.8696@galois.mit.edu> <Oct.15.08.35.20.1992.24954@paul.rutgers.edu> <1992Oct15.190145.18782@galois.mit.edu>
  9. Organization: Sunsoft Inc., Los Angeles, CA.
  10. Lines: 327
  11. NNTP-Posting-Host: astro
  12. Originator: richard@astro.West.Sun.COM
  13.  
  14. jbaez@riesz.mit.edu (John C. Baez) writes:
  15.  
  16. >I want the index to be easy to compute.  In fact, what I'd really like
  17. >would be an index that could be computed automatically.
  18.  
  19. Ask and ye shall receive.  Just before reading your posting, I completed
  20. just such a program.  My simplified rules are:
  21.     100 points each for words in all caps.  To count as a word, it
  22.     must include at least one consonant and one vowel (to avoid the
  23.     words "I" and "A" and to weed out many acronyms).  It must also
  24.     include at least one letter which is not F A or Q.  Digits and
  25.     '@' are treated as lower case letters to weed out login names,
  26.     host names, and more acronyms.
  27.  
  28.     N consecutive exclamation points count for (N-1) * 100 points.
  29.  
  30.     100 points for any word which includes a substring which matches
  31.     an entry in the word list which is at the top of the program (see
  32.     below).  Comparisons are done ignoring case.
  33.  
  34. No negative base value is used on the theory that we must all have some
  35. crackpot in us.
  36.  
  37. Lines beginning with '>' don't count.  Lines in the article header don't
  38. count except for "Subject:" and "Keywords:".  Subject lines don't count
  39. if the subject begins with "Re:".
  40.  
  41. The crackpot index is calculated by taking the score determined as above
  42. and dividing by the number of lines examined.  The program prints the
  43. index followed by the name from the "From:" line.
  44.  
  45. I ran this program on every article in our sci.physics spool (about 2
  46. weeks worth) and then averaged the indices for each author.  The top 10
  47. winners are:
  48.  
  49. 63.0769 Joe Dellinger
  50. 64.7059 Khan
  51. 65 FRED W. BACH
  52. 73.3183 Alexander Abian
  53. 87.8875 mcelwre@cnsvax.uwec.edu
  54. 107.692 Dani Eder
  55. 113.755 John Hagerman
  56. 133.333 Scott Brigham, corp
  57. 182.353 <RVESTERM@vma.cc.nd.edu>
  58. 319.444 Brad Wallet
  59.  
  60. The prize for best crackpot spoof goes to Brad Wallet.  Hagerman had a
  61. chance at this prize, but blew it by submitting a couple serious articles.
  62. Other sci.physics celebrities (defined loosely as those whose name I
  63. recognized in a quick scan of the list) got the following scores:
  64.  
  65. 2.14634 Paul Budnik
  66. 2.56065 Steve Carlip
  67. 3.18687 Benjamin Weiner
  68. 3.81494 RING, DAVID WAYNE
  69. 4.23726 Cameron Randale Bass
  70. 5.13109 Douglas G. Danforth
  71. 5.66667 Tom Van Flandern
  72. 5.79702 Robert Firth
  73. 6.61422 Leigh Palmer
  74. 6.66667 Dr. Norman J. LaFave <lafave@ial4.jsc.nasa.gov>
  75. 7.21700 Ric Peregrino
  76. 7.60326 Mcirvin
  77. 7.89399 Matt Austern
  78. 8.72341 Bronis Vidugiris
  79. 8.75751 Daryl McCullough
  80. 9.08969 Hartmut Frommert
  81. 9.80049 Jim Carr
  82. 10.4906 John C. Baez
  83. 10.5006 hporopudas@tnclus.tele.nokia.fi
  84. 10.6189 Richard M. Mathews
  85. 11.1111 snarfy@cruzio.santa-cruz.ca.us
  86. 11.8265 SCOTT I CHASE
  87. 15.0000 Matthew P Wiener
  88. 15.4365 Blair P. Houghton
  89. 18.1966 Mcinnes B T (Dr)
  90. 20.1698 Terry Bollinger
  91. 25.6695 Jack Sarfatti
  92.  
  93. There are a few scores which I am disappointed came out so low and a few
  94. which I am disappointed came out so high.  Overall, though, this seems
  95. pretty good.
  96.  
  97. So here is the program.  It reads a single article on standard input.
  98. The shell script to pass each article through this program and to use
  99. awk or some such tool to do the averaging is left as an exercise for
  100. the reader.
  101.  
  102. /*
  103.  * crackpot.c   written by Richard M. Mathews   Richard.Mathews@West.Sun.COM
  104.  * version 0.9
  105.  */
  106. #include <stdio.h>
  107. #include <ctype.h>
  108.  
  109. char *words[] = {
  110.     "conspiracy",
  111.     "status quo",
  112.     "communication",
  113.     "transmit",
  114.     "ftl",
  115.     "hawking",
  116.     "einstein",
  117.     "newton",
  118.     "galileo",
  119.     "penrose",
  120.     "physicists",    /* as in "all them physicists are out to get me" */
  121.     "scientists",
  122.     "genius",
  123.     "super",    /* superior and super-anything (incl. collider;-) */
  124.     "principle",    /* just seems to be common in crackpot articles */
  125.     "b.s",
  126.     "m.a",
  127.     "ph.d",
  128.     "phd",
  129.     "dr.",
  130.     "provok",    /* variants of provoke and provocation */
  131.     "provoc",
  132.     "arrow",
  133.     "according",
  134. };
  135.  
  136. char *getline();
  137. extern char *malloc(), *realloc();
  138.  
  139. char *name;
  140.  
  141. main(argc, argv)
  142. int argc;
  143. char **argv;
  144. {
  145.     int nwords, i, lines = 0, score = 0;
  146.     char **ptrs;
  147.     int c;
  148.     int all_caps = 1, vowel = 0, consonant = 0, non_faq = 0, bang = 0;
  149.     int debug = 0;
  150.  
  151.     while ((c = getopt(argc, argv, "d")) != -1) {
  152.         switch (c) {
  153.         case 'd':
  154.             ++debug;
  155.             break;
  156.         default:
  157.             fprintf(stderr, "usage: crackpot [-d] < article\n");
  158.             exit(2);
  159.         }
  160.     }
  161.  
  162.     nwords = sizeof(words) / sizeof(words[0]) - 1;
  163.  
  164.     ptrs = (char **) malloc(nwords * sizeof(*ptrs));
  165.     if (ptrs == NULL) {
  166.         fprintf(stderr, "Can't alloc word table\n");
  167.         exit(1);
  168.     }
  169.     for (i = 0; i < nwords; ++i)
  170.         ptrs[i] = words[i];
  171.  
  172.     while ((c = nextchar()) != EOF) {
  173.         if (c == '\n')
  174.             ++lines;
  175.         /*
  176.          * Check whether this character helps us advance our pointer
  177.          * into any of the words on the word list.
  178.          */
  179.         for (i = 0; i < nwords; ++i) {
  180.             if (*ptrs[i] == c
  181.              || isupper(c) && *ptrs[i] == tolower(c)) {
  182.                 ++ptrs[i];
  183.                 if (*ptrs[i] == '\0') {
  184.                     ++score;
  185.                     if (debug)
  186.                         printf("%s\n", words[i]);
  187.                     ptrs[i] = words[i];
  188.                 }
  189.             }
  190.             else
  191.                 ptrs[i] = words[i];
  192.         }
  193.         /*
  194.          * Check whether this word might be all caps (but it
  195.          * must contain at least one vowel and one consonant to
  196.          * count as a word).  Mixtures of caps with digits are
  197.          * not counted as they are likely to be login names,
  198.          * acronyms, etc.  Words connected with an '@' aren't
  199.          * counted as they are probably login or host names.
  200.          * Words made up only from the letters F A and Q are
  201.          * not counted.
  202.          */
  203.         if (isalpha(c) || isdigit(c) || c == '@') {
  204.             if (isupper(c)) {
  205.                 switch (c) {
  206.                 case 'A':
  207.                 case 'E':
  208.                 case 'I':
  209.                 case 'O':
  210.                 case 'U':
  211.                     ++vowel;
  212.                     break;
  213.                 default:
  214.                     ++consonant;
  215.                     break;
  216.                 }
  217.                 switch (c) {
  218.                 case 'F':
  219.                 case 'A':
  220.                 case 'Q':
  221.                     break;
  222.                 default:
  223.                     ++non_faq;
  224.                 }
  225.             }
  226.             else {    /* lower case or digit or at-sign */
  227.                 all_caps = 0;
  228.             }
  229.         }
  230.         else {
  231.             if (all_caps && vowel && consonant && non_faq) {
  232.                 ++score;
  233.                 if (debug)
  234.                     printf("CAPS\n");
  235.             }
  236.             all_caps = 1;
  237.             vowel = consonant = non_faq = 0;
  238.         }
  239.         /*
  240.          * Check for consecutive exclamation points.
  241.          */
  242.         if (c == '!') {
  243.             if (bang) {
  244.                 ++score;
  245.                 if (debug)
  246.                     printf("bangs\n");
  247.             }
  248.             bang = 1;
  249.         }
  250.         else
  251.             bang = 0;
  252.     }
  253.     if (all_caps && vowel && consonant && non_faq) {
  254.         ++score;
  255.         if (debug)
  256.             printf("CAPS\n");
  257.     }
  258.     printf("%f %s", lines ? 100. * score / lines : 0., name ? name : "");
  259.     exit(0);
  260. }
  261.  
  262. nextchar()
  263. {
  264.     static char *buf;
  265.     static body = 0;    /* body of article? (as opposed to header) */
  266.  
  267.     while (buf == NULL || *buf == '\0') {
  268.         buf = getline();
  269.         if (buf == NULL)
  270.             return EOF;
  271.         else if (*buf == '>')    /* ignore included text */
  272.             buf = NULL;
  273.         else if (*buf == '\n')    /* start of body */
  274.             body = 1;
  275.         else if (body)
  276.             ;
  277.         else if (strncmp("Subject: Re:", buf, 12) == 0)
  278.             buf = NULL;    /* ignore "Subject" on responses */
  279.         else if (strncmp("Subject: ", buf, 9) == 0)
  280.             ;        /* don't ignore "Subject" otherwise */
  281.         else if (strncmp("Keywords: ", buf, 10) == 0)
  282.             ;        /* don't ignore "Keywords" */
  283.         else {        /* all other header lines */
  284.             if (strncmp("From: ", buf, 6) == 0) {
  285.                 name = malloc(strlen(buf) - 5);
  286.                 strcpy(name, buf + 6);    /* remember name */
  287.             }
  288.             buf = NULL;    /* ignore header lines */
  289.         }
  290.     }
  291.  
  292.     return *buf++;
  293. }
  294.  
  295. char *
  296. getline()
  297. {
  298.     static char *buf;
  299.     static int buflen;
  300.     char *bufp;
  301.  
  302.     if (feof(stdin)) {
  303.         return NULL;
  304.     }
  305.  
  306.     if (buf == NULL) {
  307.         buf = malloc(BUFSIZ);
  308.         if (buf == NULL) {
  309.             fprintf(stderr, "Can't alloc line buffer\n");
  310.             exit(1);
  311.         }
  312.         buflen = BUFSIZ;
  313.     }
  314.  
  315.     buf[buflen - 2] = '\0';
  316.     bufp = buf;
  317.     for (;;) {
  318.         if (fgets(bufp, BUFSIZ, stdin) == NULL) {
  319.             if (bufp == buf)
  320.                 return NULL;
  321.             else
  322.                 break;
  323.         }
  324.         if (buf[buflen - 2] != '\0' && buf[buflen - 2] != '\n') {
  325.             /* need to read more */
  326.             buf = realloc(buf, buflen + BUFSIZ - 1);
  327.             if (buf == NULL) {
  328.                 fprintf(stderr, "Can't realloc line buffer\n");
  329.                 exit(1);
  330.             }
  331.             bufp = buf + buflen - 1; /* point to the '\0' */
  332.             buflen += BUFSIZ - 1;
  333.             buf[buflen - 2] = '\0';
  334.         }
  335.         else
  336.             break;
  337.     }
  338.  
  339.     return buf;
  340. }
  341.