循环数组 的十六种常规变化 awk 版
时间:2009-06-29 来源:yjh777
旋转方向(2) x 升降序(2) x 起始点(4) == 16
(算上起始点不在四个角的情况就更多了,,)
usage:
./lx.awk [-b] [-r] [-e | -s | -w | -n] [side length]
---------------------------------------------------------------------
#!/usr/bin/awk -f
BEGIN {
i = 0;
j = 0;
for (i = 1; i < ARGC; i++) {
if (ARGV[i] == "-b")
bdirectf = 1;
else if (ARGV[i] == "-r")
reverse = 1;
else if (ARGV[i] == "-e")
direct = "east";
else if (ARGV[i] == "-s")
direct = "south";
else if (ARGV[i] == "-w")
direct = "weast";
else if (ARGV[i] == "-n")
direct = "north";
else
x = int(ARGV[i]);
}
if (x == 0) x = 9;
if (bdirectf == 1) {
bdirect(array, x, direct, reverse);
} else {
fdirect(array, x, direct, reverse);
}
for (i = 0; i < x; i++) {
for (j = 0; j < x; j++) {
if ((i == j) || ((i+j) == (x-1))) {
printf("\033[1;34m" "%.3d " "\033[0m", array[i*x+j]);
} else {
printf("%.3d ", array[i*x+j]);
}
}
printf("\n");
}
}
function fdirect(array, xlen, direct, rf, gnum, gc, k, stat, stat1, stat2, m, n, max)
{
max = xlen*xlen;
gnum = (xlen-1)*2;
gc = gnum;
if (direct == "south") {
gc -= 0;
m = 0; n = x-1;
}
else if (direct == "weast") {
gc -= 1;
m = x-1; n = x-1;
}
else if (direct == "north") {
gc -= 2;
m = x-1; n = 0;
}
for (k = 1; k <= max; k++) {
stat = gnum - gc;
stat1 = int(stat/2)%2;
stat2 = stat%2;
if (stat1 == 0) {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); n++; # 向东拐
if ((array[m*x + n] != 0) || (n >= x)) {
n--; m++;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); m++; # 向南拐
if ((array[m*x + n] != 0) || (m >= x)) {
m--; n--;
gc--;
}
}
} else {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); n--; # 向西拐
if ((array[m*x + n] != 0) || (n < 0)) {
n++; m--;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); m--; # 向北拐
if ((array[m*x + n] != 0) || (m < 0)) {
m++; n++;
gc--;
}
}
}
}
}
function bdirect(array, xlen, direct, rf, gnum, gc, k, stat, stat1, stat2, m, n, max)
{
max = xlen*xlen;
gnum = (xlen-1)*2;
gc = gnum;
if (direct == "east") {
gc -= 0;
m = x-1; n = 0;
}
else if (direct == "north") {
gc -= 1;
m = x-1; n = x-1;
}
else if (direct == "weast") {
gc -= 2;
m = 0; n = x-1;
}
for (k = 1; k <= xlen*xlen; k++) {
stat = gnum - gc;
stat1 = int(stat/2)%2;
stat2 = stat%2;
if (stat1 == 0) {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); m++; # 向南拐
if ((array[m*x + n] != 0) || (m >= x)) {
m--; n++;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); n++; # 向东拐
if ((array[m*x + n] != 0) || (n >= x)) {
n--; m--;
gc--;
}
}
} else {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); m--; # 向北拐
if ((array[m*x + n] != 0) || (m < 0)) {
m++; n--;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); n--; # 向西拐
if ((array[m*x + n] != 0) || (n < 0)) {
n++; m++;
gc--;
}
}
}
}
}
function ring(value, max, flag)
{
if (flag == 1)
return (max - value + 1);
return value;
}
(算上起始点不在四个角的情况就更多了,,)
usage:
./lx.awk [-b] [-r] [-e | -s | -w | -n] [side length]
---------------------------------------------------------------------
#!/usr/bin/awk -f
BEGIN {
i = 0;
j = 0;
for (i = 1; i < ARGC; i++) {
if (ARGV[i] == "-b")
bdirectf = 1;
else if (ARGV[i] == "-r")
reverse = 1;
else if (ARGV[i] == "-e")
direct = "east";
else if (ARGV[i] == "-s")
direct = "south";
else if (ARGV[i] == "-w")
direct = "weast";
else if (ARGV[i] == "-n")
direct = "north";
else
x = int(ARGV[i]);
}
if (x == 0) x = 9;
if (bdirectf == 1) {
bdirect(array, x, direct, reverse);
} else {
fdirect(array, x, direct, reverse);
}
for (i = 0; i < x; i++) {
for (j = 0; j < x; j++) {
if ((i == j) || ((i+j) == (x-1))) {
printf("\033[1;34m" "%.3d " "\033[0m", array[i*x+j]);
} else {
printf("%.3d ", array[i*x+j]);
}
}
printf("\n");
}
}
function fdirect(array, xlen, direct, rf, gnum, gc, k, stat, stat1, stat2, m, n, max)
{
max = xlen*xlen;
gnum = (xlen-1)*2;
gc = gnum;
if (direct == "south") {
gc -= 0;
m = 0; n = x-1;
}
else if (direct == "weast") {
gc -= 1;
m = x-1; n = x-1;
}
else if (direct == "north") {
gc -= 2;
m = x-1; n = 0;
}
for (k = 1; k <= max; k++) {
stat = gnum - gc;
stat1 = int(stat/2)%2;
stat2 = stat%2;
if (stat1 == 0) {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); n++; # 向东拐
if ((array[m*x + n] != 0) || (n >= x)) {
n--; m++;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); m++; # 向南拐
if ((array[m*x + n] != 0) || (m >= x)) {
m--; n--;
gc--;
}
}
} else {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); n--; # 向西拐
if ((array[m*x + n] != 0) || (n < 0)) {
n++; m--;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); m--; # 向北拐
if ((array[m*x + n] != 0) || (m < 0)) {
m++; n++;
gc--;
}
}
}
}
}
function bdirect(array, xlen, direct, rf, gnum, gc, k, stat, stat1, stat2, m, n, max)
{
max = xlen*xlen;
gnum = (xlen-1)*2;
gc = gnum;
if (direct == "east") {
gc -= 0;
m = x-1; n = 0;
}
else if (direct == "north") {
gc -= 1;
m = x-1; n = x-1;
}
else if (direct == "weast") {
gc -= 2;
m = 0; n = x-1;
}
for (k = 1; k <= xlen*xlen; k++) {
stat = gnum - gc;
stat1 = int(stat/2)%2;
stat2 = stat%2;
if (stat1 == 0) {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); m++; # 向南拐
if ((array[m*x + n] != 0) || (m >= x)) {
m--; n++;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); n++; # 向东拐
if ((array[m*x + n] != 0) || (n >= x)) {
n--; m--;
gc--;
}
}
} else {
if (stat2 == 0) {
array[m*x + n] = ring(k, max, rf); m--; # 向北拐
if ((array[m*x + n] != 0) || (m < 0)) {
m++; n--;
gc--;
}
} else {
array[m*x + n] = ring(k, max, rf); n--; # 向西拐
if ((array[m*x + n] != 0) || (n < 0)) {
n++; m++;
gc--;
}
}
}
}
}
function ring(value, max, flag)
{
if (flag == 1)
return (max - value + 1);
return value;
}
相关阅读 更多 +