c99 - 252 Zeichen
#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]);}
Leichte Verbesserung durch Ausnutzung der kreisförmigen Natur der Permutation. Diese Version entwickelt immer eine schleifenartige Kaufstrategie, daher ist sie weniger zufällig als die vorherige Version (271 Zeichen), aber ich glaube, sie entspricht immer noch der Spezifikation.
Benötigt eine funktionierende Plattform /dev/random. Ich sollte in der Lage sein, ungefähr 8 auszuschalten, indem ich das \0s in der großen Zeichenfolge weglasse , aber meine libc scheint sich nicht mit Druckspezifizierern zu befassen, %4swie es auf der Manpage steht.
Das Mischen ist schlecht, aber wenn ich es so mache, muss ich nicht nach den Bedingungen für "Foo kauft für Foo" suchen.
Lesbar:
#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]);
}