#!/usr/bin/awk -f function unify( i, j, mi, mj ) { mi = 1 + int( N * rand( ) ); # Assure that two different elements are chosen while ( 1 ) { mj = 1 + int( N * rand( ) ); if ( Cl[ mj ] != Cl[ mi ] ) break; } print "################################"; # Message print "Change all " Cl[ mj ] " to " Cl[ mi ]; # Print array indices and array elements for ( j = 1; j <= N; j++ ) printf "%4d ", j; print; # Print array elements # Highlight the ones to be changed for ( j = 1; j <= N; j++ ) if ( Cl[ j ] == Cl[ mj ] ) printf " [%2d]", Cl[ j ]; else printf "%4d ", Cl[ j ]; print; # Change elements for ( j = 1; j <= N; j++ ) if ( Cl[ j ] == Cl[ mj ] ) Cl[ j ] = Cl[ mi ]; # Print result after changing for ( j = 1; j <= N; j++ ) printf "%4d ", Cl[ j ]; print; # Return value: 1 if there are at least two different values in Cl # 0 otherwise for ( j = 1; j < N; j++ ) if ( Cl[j] != Cl[j+1] ) return 1; return 0; } BEGIN { srand(); N = ARGV[ 1 ]; for ( i = 1; i <= N; i++ ) Cl[ i ] = i; while (unify()); }