K & R c - 188 196 199 229 ký tự
Với thông số kỹ thuật được thay đổi để chỉ định một chức năng, tôi có thể nhận được rất nhiều chi phí c ngoài tổng số. Đồng thời thay đổi để sử dụng hack đếm âm tiết của Strigoides, tốt hơn so với tinh chỉnh công thức của tôi và được mở rộng để đối phó với việc vượt quá các từ.
Sau khi tôi tìm thấy một cách ngắn hơn để thực hiện phát hiện nguyên âm mà đáng buồn là dựa vào đó stdchr
, tôi đã có động lực để vắt kiệt thêm một chút trong sự ghê tởm đôi chút mà tôi đã sử dụng để tôi không phải nhàm chán.
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;}
Logic ở đây là một máy trạng thái đơn giản. Nó chỉ đếm câu theo thời gian, từ theo chuỗi ký tự chữ cái và âm tiết dưới dạng chuỗi nguyên âm (bao gồm cả y).
Tôi đã phải điều chỉnh các hằng số một chút để đưa ra những con số phù hợp, nhưng tôi đã mượn mánh khóe của Strigoides khi chỉ vượt qua các âm tiết theo một phân số cố định.
Un-golfed , với các bình luận và một số công cụ sửa lỗi:
#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));
}
Đầu ra: (sử dụng giàn giáo từ phiên bản dài, nhưng chức năng đánh gôn.)
$ 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
Thiếu sót:
- Logic đếm câu là sai, nhưng tôi tránh xa nó vì chỉ một trong những đầu vào có a
!
hoặc a ?
.
- Logic đếm từ sẽ coi các cơn co thắt là hai từ.
- Logic đếm âm tiết sẽ coi những cơn co thắt tương tự như một âm tiết. Nhưng có lẽ số lượng vượt quá trung bình (ví dụ:
there
được tính là hai và nhiều từ kết thúc e
sẽ được tính quá nhiều), vì vậy tôi đã áp dụng hệ số không đổi là 96,9%.
- Giả sử một bộ ký tự ASCII.
- Tôi tin rằng việc phát hiện nguyên âm sẽ thừa nhận
[
và {
rõ ràng là không đúng.
- Rất nhiều sự phụ thuộc vào ngữ nghĩa K & R làm cho điều này trở nên xấu xí, nhưng hey, đó là môn đánh gôn.
Những điều cần xem xét:
Tôi (trong giây lát) đi trước cả hai giải pháp python ở đây, ngay cả khi tôi đang theo dõi perl.
Nhận một tải của điều khủng khiếp tôi đã làm để phát hiện các nguyên âm. Sẽ có ý nghĩa nếu bạn viết các biểu diễn ASCII ra dưới dạng nhị phân và đọc nhận xét trong phiên bản dài.