#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char b[ 9 ] ;
void pr
( ) { for ( int i
= 0 ; i
< 9 ; i
++ ) { if ( i
% 3 == 0 ) printf ( "\n " ) ; printf ( " %c " , b
[ i
] ? b
[ i
] : ' ' ) ; if ( i
% 3 != 2 ) printf ( "|" ) ; } printf ( "\n " ) ; } int win( ) {
int W[ 8 ] [ 3 ] = { { 0 , 1 , 2 } , { 3 , 4 , 5 } , { 6 , 7 , 8 } , { 0 , 3 , 6 } , { 1 , 4 , 7 } , { 2 , 5 , 8 } , { 0 , 4 , 8 } , { 2 , 4 , 6 } } ;
for ( int i= 0 ; i< 8 ; i++ ) if ( b[ W[ i] [ 0 ] ] && b[ W[ i] [ 0 ] ] == b[ W[ i] [ 1 ] ] && b[ W[ i] [ 1 ] ] == b[ W[ i] [ 2 ] ] ) return b[ W[ i] [ 0 ] ] ;
return 0 ;
}
int find_move( char p) {
for ( int i= 0 ; i< 9 ; i++ ) if ( ! b[ i] ) { b[ i] = p; if ( win( ) == p) { b[ i] = 0 ; return i; } b[ i] = 0 ; }
return - 1 ;
}
int any_empty( ) { for ( int i= 0 ; i< 9 ; i++ ) if ( ! b[ i] ) return 1 ; return 0 ; }
int take_from( int arr[ ] , int n) { for ( int i= 0 ; i< n; i++ ) if ( ! b[ arr[ i] ] ) return arr[ i] ; return - 1 ; }
int ai_move( int diff, char ai, char hu) {
if ( diff== 1 ) { // random
int empties[ 9 ] , c= 0 ;
for ( int i= 0 ; i< 9 ; i++ ) if ( ! b[ i] ) empties[ c++ ] = i;
if ( ! c) return - 1 ;
return empties
[ rand ( ) % c
] ; }
// smart: win
int mv = find_move( ai) ;
if ( mv!=- 1 ) return mv;
// block
mv = find_move( hu) ;
if ( mv!=- 1 ) return mv;
// center
if ( ! b[ 4 ] ) return 4 ;
// corners
int corners[ 4 ] = { 0 , 2 , 6 , 8 } , t = take_from( corners, 4 ) ; if ( t!=- 1 ) return t;
// sides
int sides[ 4 ] = { 1 , 3 , 5 , 7 } ; return take_from( sides, 4 ) ;
}
int main( ) {
for ( int i= 0 ; i< 9 ; i++ ) b[ i] = 0 ;
printf ( "Tic-Tac-Toe vs AI\n 1) You first\n 2) AI first\n Choose who starts (1/2): " ) ; int who
; if ( scanf ( "%d" ,& who
) != 1 ) return 0 ; printf ( "Difficulty: 1=easy(random) 2=smart\n Choose difficulty: " ) ; int diff
; if ( scanf ( "%d" ,& diff
) != 1 ) diff
= 2 ; char human = ( who== 2 ) ? 'O' : 'X' , ai = ( human== 'X' ) ? 'O' : 'X' ;
int turn = ( who== 1 ) ? 0 : 1 ; // 0 human,1 ai
while ( 1 ) {
pr( ) ;
if ( win
( ) ) { printf ( "%c wins!\n " , win
( ) ) ; break ; } if ( ! any_empty
( ) ) { printf ( "Draw!\n " ) ; break ; } if ( turn== 0 ) {
int pos
; printf ( "Your move (1-9): " ) ; if ( scanf ( "%d" ,& pos
) != 1 ) break ; pos
--; if ( pos
< 0 || pos
> 8 || b
[ pos
] ) { printf ( "Invalid\n " ) ; continue ; } b[ pos] = human;
} else {
int m = ai_move( diff, ai, human) ;
if ( m
==- 1 ) { printf ( "No move\n " ) ; break ; } printf ( "AI places %c at %d\n " , ai
, m
+ 1 ) ; b[ m] = ai;
}
turn^= 1 ;
}
pr( ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCmNoYXIgYls5XTsKdm9pZCBwcigpeyBmb3IoaW50IGk9MDtpPDk7aSsrKXsgaWYoaSUzPT0wKSBwcmludGYoIlxuIik7IHByaW50ZigiICVjICIsIGJbaV0/YltpXTonICcpOyBpZihpJTMhPTIpIHByaW50ZigifCIpOyB9IHByaW50ZigiXG4iKTsgfQppbnQgd2luKCl7CiAgICBpbnQgV1s4XVszXT17ezAsMSwyfSx7Myw0LDV9LHs2LDcsOH0sezAsMyw2fSx7MSw0LDd9LHsyLDUsOH0sezAsNCw4fSx7Miw0LDZ9fTsKICAgIGZvcihpbnQgaT0wO2k8ODtpKyspIGlmKGJbV1tpXVswXV0gJiYgYltXW2ldWzBdXT09YltXW2ldWzFdXSAmJiBiW1dbaV1bMV1dPT1iW1dbaV1bMl1dKSByZXR1cm4gYltXW2ldWzBdXTsKICAgIHJldHVybiAwOwp9CmludCBmaW5kX21vdmUoY2hhciBwKXsKICAgIGZvcihpbnQgaT0wO2k8OTtpKyspIGlmKCFiW2ldKXsgYltpXT1wOyBpZih3aW4oKT09cCl7IGJbaV09MDsgcmV0dXJuIGk7IH0gYltpXT0wOyB9CiAgICByZXR1cm4gLTE7Cn0KaW50IGFueV9lbXB0eSgpeyBmb3IoaW50IGk9MDtpPDk7aSsrKSBpZighYltpXSkgcmV0dXJuIDE7IHJldHVybiAwOyB9CmludCB0YWtlX2Zyb20oaW50IGFycltdLCBpbnQgbil7IGZvcihpbnQgaT0wO2k8bjtpKyspIGlmKCFiW2FycltpXV0pIHJldHVybiBhcnJbaV07IHJldHVybiAtMTsgfQoKaW50IGFpX21vdmUoaW50IGRpZmYsIGNoYXIgYWksIGNoYXIgaHUpewogICAgaWYoZGlmZj09MSl7IC8vIHJhbmRvbQogICAgICAgIGludCBlbXB0aWVzWzldLGM9MDsKICAgICAgICBmb3IoaW50IGk9MDtpPDk7aSsrKSBpZighYltpXSkgZW1wdGllc1tjKytdPWk7CiAgICAgICAgaWYoIWMpIHJldHVybiAtMTsKICAgICAgICByZXR1cm4gZW1wdGllc1tyYW5kKCklY107CiAgICB9CiAgICAvLyBzbWFydDogd2luCiAgICBpbnQgbXYgPSBmaW5kX21vdmUoYWkpOwogICAgaWYobXYhPS0xKSByZXR1cm4gbXY7CiAgICAvLyBibG9jawogICAgbXYgPSBmaW5kX21vdmUoaHUpOwogICAgaWYobXYhPS0xKSByZXR1cm4gbXY7CiAgICAvLyBjZW50ZXIKICAgIGlmKCFiWzRdKSByZXR1cm4gNDsKICAgIC8vIGNvcm5lcnMKICAgIGludCBjb3JuZXJzWzRdPXswLDIsNiw4fSwgdCA9IHRha2VfZnJvbShjb3JuZXJzLDQpOyBpZih0IT0tMSkgcmV0dXJuIHQ7CiAgICAvLyBzaWRlcwogICAgaW50IHNpZGVzWzRdPXsxLDMsNSw3fTsgcmV0dXJuIHRha2VfZnJvbShzaWRlcyw0KTsKfQoKaW50IG1haW4oKXsKICAgIHNyYW5kKHRpbWUoMCkpOwogICAgZm9yKGludCBpPTA7aTw5O2krKykgYltpXT0wOwogICAgcHJpbnRmKCJUaWMtVGFjLVRvZSB2cyBBSVxuMSkgWW91IGZpcnN0XG4yKSBBSSBmaXJzdFxuQ2hvb3NlIHdobyBzdGFydHMgKDEvMik6ICIpOwogICAgaW50IHdobzsgaWYoc2NhbmYoIiVkIiwmd2hvKSE9MSkgcmV0dXJuIDA7CiAgICBwcmludGYoIkRpZmZpY3VsdHk6IDE9ZWFzeShyYW5kb20pICAyPXNtYXJ0XG5DaG9vc2UgZGlmZmljdWx0eTogIik7CiAgICBpbnQgZGlmZjsgaWYoc2NhbmYoIiVkIiwmZGlmZikhPTEpIGRpZmY9MjsKICAgIGNoYXIgaHVtYW4gPSAod2hvPT0yKT8nTyc6J1gnLCBhaSA9IChodW1hbj09J1gnKT8nTyc6J1gnOwogICAgaW50IHR1cm4gPSAod2hvPT0xKT8wOjE7IC8vIDAgaHVtYW4sMSBhaQogICAgd2hpbGUoMSl7CiAgICAgICAgcHIoKTsKICAgICAgICBpZih3aW4oKSl7IHByaW50ZigiJWMgd2lucyFcbiIsIHdpbigpKTsgYnJlYWs7IH0KICAgICAgICBpZighYW55X2VtcHR5KCkpeyBwcmludGYoIkRyYXchXG4iKTsgYnJlYWs7IH0KICAgICAgICBpZih0dXJuPT0wKXsKICAgICAgICAgICAgaW50IHBvczsgcHJpbnRmKCJZb3VyIG1vdmUgKDEtOSk6ICIpOwogICAgICAgICAgICBpZihzY2FuZigiJWQiLCZwb3MpIT0xKSBicmVhazsKICAgICAgICAgICAgcG9zLS07IGlmKHBvczwwfHxwb3M+OHx8Yltwb3NdKXsgcHJpbnRmKCJJbnZhbGlkXG4iKTsgY29udGludWU7IH0KICAgICAgICAgICAgYltwb3NdPWh1bWFuOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGludCBtID0gYWlfbW92ZShkaWZmLCBhaSwgaHVtYW4pOwogICAgICAgICAgICBpZihtPT0tMSl7IHByaW50ZigiTm8gbW92ZVxuIik7IGJyZWFrOyB9CiAgICAgICAgICAgIHByaW50ZigiQUkgcGxhY2VzICVjIGF0ICVkXG4iLCBhaSwgbSsxKTsKICAgICAgICAgICAgYlttXT1haTsKICAgICAgICB9CiAgICAgICAgdHVybl49MTsKICAgIH0KICAgIHByKCk7CiAgICByZXR1cm4gMDsKfQ==
stdin
LyogIEJlcmVjaG51bmcgZGVzIEhhbW1pbmctQWJzdGFuZGVzIHp3aXNjaGVuIHp3ZWkgMTI4LUJpdCBXZXJ0ZW4gaW4gCSovCi8qCWVpbmVyIFRleHRkYXRlaS4gCQkJCQkJCQkJCQkJCSovCi8qICBEaWUgV2VydGUgbSZ1dW1sO3NzZW4gYXVmIGVpbmVyIHNlcGFyYXRlbiBaZWlsZSBnZXNwZWljaGVydCBzZWluCQkJKi8KLyogCQkJCQkJCQkJCQkJCQkJCQkJKi8KLyoJRXJzdGVsbHQ6IDE3LjUuMjAxMAkJCQkJCQkJCQkJCQkqLwovKiAgQXV0b3I6IFRob21hcyBTY2hlZmZsZXIJCQkJCQkJCQkJCQkqLwoKI2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKCiNkZWZpbmUgQVJSQVlfU0laRSAzMgoKdW5zaWduZWQgSGFtZGlzdCh1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KQp7CiAgdW5zaWduZWQgZGlzdCA9IDAsIHZhbCA9IHggXiB5OwogCiAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBzZXQgYml0cwogIHdoaWxlKHZhbCkKICB7CiAgICArK2Rpc3Q7IAogICAgdmFsICZhbXA7PSB2YWwgLSAxOwogIH0KIAogIHJldHVybiBkaXN0Owp9CgoKCmludCBtYWluICh2b2lkKQp7CgljaGFyIGhleDsKCWludCBpOwoJaW50IGFbQVJSQVlfU0laRV07CglpbnQgYltBUlJBWV9TSVpFXTsKCWludCBoYW1EaXN0ID0gMDsKCUZJTEUqIGZwOwoJCgkvL0FycmF5cyBtaXQgMCBpbml0aWFsaXNpZXJlbgoJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkU7ICsraSkKCXsKICAJCWFbaV0gPSAwOwogIAkJYltpXSA9IDA7Cgl9CgoJCglmcCA9IGZvcGVuKCZxdW90O2hleC50eHQmcXVvdDssJnF1b3Q7ciZxdW90Oyk7CglpZiAoZnAgPT0gTlVMTCkgCgl7CgkJcHJpbnRmKCZxdW90O0RpZSBEYXRlaSBoZXgudHh0IHd1cmRlIG5pY2h0IGdlZnVuZGVuISZxdW90Oyk7CgkJZXhpdChFWElUX0ZBSUxVUkUpOwoJfQoKCWk9MDsKCXByaW50ZigmcXVvdDsxLlplaWxlIGVpbmxlc2VuLlxuJnF1b3Q7KTsKCiAJd2hpbGUoKGhleD1mZ2V0YyhmcCkpIT0nXG4nICZhbXA7JmFtcDsgaGV4ICE9IEVPRikKICAgIHsKICAgICAgICBhW2ldPXN0cnRvbCgmYW1wO2hleCwwLDE2KTsKCQlpKys7CiAgICB9CglpPTA7CglwcmludGYoJnF1b3Q7Mi5aZWlsZSBlaW5sZXNlbi5cbiZxdW90Oyk7CgogCXdoaWxlKChoZXg9ZmdldGMoZnApKSE9J1xuJyAmYW1wOyZhbXA7IGhleCAhPSBFT0YpCiAgICB7CiAgICAJYltpXT1zdHJ0b2woJmFtcDtoZXgsMCwxNik7CiAgICAgICAgaSsrOwogICAgfQoJZmNsb3NlKGZwKTsKCglwcmludGYoJnF1b3Q7SGFtbWluZy1BYndlaWNodW5nIHBybyBOaWJibGU6XG4mcXVvdDspOwoJZm9yIChpID0gMDsgaSAmbHQ7IEFSUkFZX1NJWkU7ICsraSkKCXsKCQlwcmludGYgKCZxdW90OyVpXHQlaVx0JWlcbiZxdW90OyxhW2ldLGJbaV0sSGFtZGlzdChhW2ldLGJbaV0pKTsKCQloYW1EaXN0ICs9IEhhbWRpc3QoYVtpXSxiW2ldKTsKCX0KCXByaW50ZiAoJnF1b3Q7XG5IYW1taW5nLUFid2VpY2h1bmcgZGVyIEhhc2gtV2VydGU6JWRcbiZxdW90OyxoYW1EaXN0KTsKfQoK
/* Berechnung des Hamming-Abstandes zwischen zwei 128-Bit Werten in */
/* einer Textdatei. */
/* Die Werte müssen auf einer separaten Zeile gespeichert sein */
/* */
/* Erstellt: 17.5.2010 */
/* Autor: Thomas Scheffler */
#include <stdio.h>
#include <stdlib.h>
#define ARRAY_SIZE 32
unsigned Hamdist(unsigned x, unsigned y)
{
unsigned dist = 0, val = x ^ y;
// Count the number of set bits
while(val)
{
++dist;
val &= val - 1;
}
return dist;
}
int main (void)
{
char hex;
int i;
int a[ARRAY_SIZE];
int b[ARRAY_SIZE];
int hamDist = 0;
FILE* fp;
//Arrays mit 0 initialisieren
for (i = 0; i < ARRAY_SIZE; ++i)
{
a[i] = 0;
b[i] = 0;
}
fp = fopen("hex.txt","r");
if (fp == NULL)
{
printf("Die Datei hex.txt wurde nicht gefunden!");
exit(EXIT_FAILURE);
}
i=0;
printf("1.Zeile einlesen.\n");
while((hex=fgetc(fp))!='\n' && hex != EOF)
{
a[i]=strtol(&hex,0,16);
i++;
}
i=0;
printf("2.Zeile einlesen.\n");
while((hex=fgetc(fp))!='\n' && hex != EOF)
{
b[i]=strtol(&hex,0,16);
i++;
}
fclose(fp);
printf("Hamming-Abweichung pro Nibble:\n");
for (i = 0; i < ARRAY_SIZE; ++i)
{
printf ("%i\t%i\t%i\n",a[i],b[i],Hamdist(a[i],b[i]));
hamDist += Hamdist(a[i],b[i]);
}
printf ("\nHamming-Abweichung der Hash-Werte:%d\n",hamDist);
}