K&R C - 188の196 199 229文字
関数を指定するために仕様を変更すると、カウントから多くのcオーバーヘッドを得ることができます。また、Strigoidesの音節カウントハックを使用するように変更しました。これは、私の式の調整よりも優れており、単語のオーバーカウントに対処するために拡張されました。
悲しいことに基づいた母音検出のより短い方法を見つけた後stdchr
、私は退屈する必要がないように、私が使用してきた少しいじる嫌悪感からさらにいくつかを絞るインセンティブがありました。
d,a,v,s,t,w;float R(char*c){for(;*c;++c){s+=*c=='.';if(isalpha(*c)){
w+=!a++;d=(*c&30)>>1;if(*c&1&(d==7|((!(d&1))&(d<6|d>8)))){t+=!v++;}
else v=0;}else v=a=0;}return 206.835-1.*w/s-82.*t/w;}
ここでのロジックは、単純なステートマシンです。文はピリオドのみ、単語はアルファベット文字列、および音節は母音文字列(yを含む)としてカウントします。
正しい数字を出すには定数を少し調べなければなりませんでしたが、音節を一定の割合で過少カウントするというStrigoidesのトリックを借りました。
コメントといくつかのデバッグツールを使用したゴルフなし:
#include <stdlib.h>
#include <stdio.h>
d,a,/*last character was alphabetic */
v,/*lastcharacter was a vowel */
s, /* sentences counted by periods */
t, /* syllables counted by non-consequtive vowels */
w; /* words counted by non-letters after letters */
float R/*eadability*/(char*c){
for(;*c;++c){
s+=*c=='.';
if(isalpha(*c)){ /* a letter might mark the start of a word or a
vowel string */
w+=!a++; /* It is only the start of a word if the last character
wasn't a letter */
/* Extract the four bits of the character that matter in determining
* vowelness because a vowel might mark a syllable */
d=(*c&30)>>1;
if( *c&1 & ( d==7 | ( (!(d&1)) & (d<6|d>8) ) )
) { /* These bits 7 or even and not 6, 8 make for a
vowel */
printf("Vowel: '%c' (mangled as %d [0x%x]) counts:%d\n",*c,d,d,!v);
t+=!v++;
} else v=0; /* Not a vowel so set the vowel flag to zero */
}else v=a=0; /* this input not alphabetic, so set both the
alphabet and vowel flags to zero... */
}
printf("Syllables: %3i\n",t);
printf("Words: %3i (t/w) = %f\n",w,(1.0*t/w));
printf("Sentences: %3i (w/s) = %f\n",s,(1.0*w/s));
/* Constants tweaked here due to bad counting behavior ...
* were: 1.015 84.6 */
return 206.835-1. *w/s-82. *t/w;
}
main(c){
int i=0,n=100;
char*buf=malloc(n);
/* Suck in the whole input at once, using a dynamic array for staorage */
while((c=getc(stdin))!=-1){
if(i==n-1){ /* Leave room for the termination */
n*=1.4;
buf=realloc(buf,n);
printf("Reallocated to %d\n",n);
}
buf[i++]=c;
printf("%c %c\n",c,buf[i-1]);
}
/* Be sure the string is terminated */
buf[i]=0;
printf("'%s'\n",buf);
printf("%f\n",R/*eadability*/(buf));
}
出力:(長いバージョンの足場を使用しますが、ゴルフ機能を使用します。)
$ gcc readability_golf.c
readability_golf.c:1: warning: data definition has no type or storage class
$ ./a.out < readability1.txt
'I would not, could not, in the rain.
Not in the dark, not on a train.
Not in a car, not in a tree.
I do not like them, Sam, you see.
Not in a house, not in a box.
Not with a mouse, not with a fox.
I will not eat them here or there.
I do not like them anywhere!
'
104.074631
$ ./a.out < readability2.txt
'It was a bright cold day in April, and the clocks were striking thirteen.
Winston Smith, his chin nuzzled into his breast in an effort to escape
the vile wind, slipped quickly through the glass doors of Victory Mansions,
though not quickly enough to prevent a swirl of gritty dust from entering
along with him.
'
63.044090
$ ./a.out < readability3.txt
'When in the Course of human events, it becomes necessary for one people to
dissolve the political bands which have connected them with another, and to
assume among the powers of the earth, the separate and equal station to
which the Laws of Nature and of Nature's God entitle them, a decent respect
to the opinions of mankind requires that they should declare the causes
which impel them to the separation.
'
-1.831667
欠陥:
- 文のカウントロジックは間違っていますが、入力の1つだけがa
!
またはaを持っているので、私はそれを避け?
ます。
- 単語カウントロジックは、短縮を2つの単語として扱います。
- 音節のカウントロジックは、それらの同じ収縮を1つの音節として扱います。ただし、おそらく平均してオーバー
there
カウント(たとえば、2としてカウントされ、終わる単語e
が1つ多くカウントされます)で、96.9%の修正という一定の係数を適用しました。
- ASCII文字セットを想定しています。
- 母音の検出は
[
およびを認めると信じていますが{
、これは明らかに正しくありません。
- K&Rのセマンティクスに依存しているため、これは見苦しくなりますが、コードゴルフです。
見るべきもの: