c99-252 자
#include <stdio.h>
#define G for(i=0;i<6;i++)
char*n="Andy\0Barb\0Carl\0Didi\0Earl\0Fran",*p[7];int i,j;int main()
{FILE*r=fopen("/dev/random","r");G p[i]=n+5*i;G{j=fgetc(r)%6;p[7]=p[j]
;p[j]=p[i];p[i]=p[7];}G printf("%s buys for %s\n",p[i],p[(i+1)%6]);}
순열의 순환 특성을 활용하여 약간의 개선. 이 버전은 항상 루프와 같은 구매 전략을 구축하므로 이전 (271 자) 버전보다 덜 무작위 적이지만 여전히 사양을 충족한다고 생각합니다.
작동하는 플랫폼이 필요합니다 /dev/random. 나는 \0큰 문자열에서 s를 생략하여 약 8을 깰 수 있어야 하지만 내 libc는 %4s매뉴얼 페이지가 말하는 방식 으로 인쇄 지정자를 다루지 않는 것 같습니다 .
셔플은 나쁘지만, 그렇게하면 "Foo buys for Foo" 조건 을 확인하지 않아도됩니다 .
읽을 수있는 :
#include <stdio.h>
char *n="Andy\0Barb\0Carl\0Didi\0Earl\0Fran",
*p[7]; /* 7th cell for temp */
int i,j;
int main(){
FILE*r=fopen("/dev/random","r");
for(i=0;i<6;i++)
p[i]=n+5*i; /* Initialize the pointers */
for(i=0;i<6;i++){
j=fgetc(r)%6; /* Poor numeric properties. Cest le Code Golf */
p[7]=p[j];
p[j]=p[i];
p[i]=p[7];
}
for(i=0;i<6;i++)
printf("%s buys for %s\n",p[i],p[(i+1)%6]);
}