我需要为bash做一个脚本以解决8个方向的词游戏。我设法制作了一些代码,但是我坚持的最后一件事是如何旋转表以各个方向找到单词。90°不是问题,而是45°...我认为尴尬可以帮助,但我并不是很擅长。谢谢。
示例:
A B C DEFGHijkl
=>
AEBIFC JGD KH l
示例2:
AbcdefghijKlmno
=>
Afbkgc LHD mie 新泽西 o
示例3:
ABCdefg你好
=>
AD bHEC 如果 G
$ cat tst.awk
BEGIN { FS="" }
{
for (i=1;i<=NF;i++) {
a[NR,i]=$i
}
numCols = (NF>numCols?NF:numCols)
numRows = NR
}
END {
rowNr=1
for (colNr=1;colNr<=numCols;colNr++) {
for (;rowNr<=numRows;rowNr++) {
printf "%*s", colNr-1, ""
for (delta=0;delta<rowNr;delta++) {
printf "%s%s", a[rowNr-delta,colNr+delta], (delta<(rowNr-1)?FS:RS)
}
}
rowNr=numRows
}
}
。
$ awk -f tst.awk file1
a
eb
ifc
jgd
kh
l
$
$ awk -f tst.awk file2
a
fb
kgc
lhd
mie
nj
o
$
$ awk -f tst.awk file3
a
db
hec
if
g
wrt以下来自@josericardobustosm的评论。提示上述不会产生他的样本输入之一的所需输出,这是建议的input4
:
$ cat input4
Jose
y
Ricardo
y
Gloriset
上面的脚本在上面运行:
$ awk -f tst.awk input4
J
yo
Rs
yie
Gc
la
or
rd
io
s
e
t
,这是一个修改后的脚本,可以在不存在的情况下注入空白字符,如果我认为这是极不可能的所需行为:
$ cat tst2.awk
BEGIN { FS="" }
{
for (i=1;i<=NF;i++) {
a[NR,i]=$i
}
numCols = (NF>numCols?NF:numCols)
numRows = NR
}
END {
rowNr=1
for (colNr=1;colNr<=numCols;colNr++) {
for (;rowNr<=numRows;rowNr++) {
printf "%*s", colNr-1, ""
for (delta=0;delta<rowNr;delta++) {
printf "%s%s", ((rowNr-delta,colNr+delta) in a ? a[rowNr-delta,colNr+delta] : " "), (delta<(rowNr-1)?FS:RS)
}
}
rowNr=numRows
}
}
$ awk -f tst2.awk input4
J
yo
R s
yi e
G c
l a
o r
r d
i o
s
e
t
我建议使用perl
代替awk
。Perl
在处理文本方面非常强大,语法非常类似于C
。
据我了解,"将文本旋转45°"的含义是什么,以下脚本执行了这样的旋转:
rotate_text_45.pl
:
#!/usr/bin/perl
use strict;
use warnings;
my @input = <>;
my $lines_count = scalar @input;
my $global_max_diag = 0;
for my $i (0 .. scalar @input - 1){
chomp $input[$i];
$input[$i] = [split //, $input[$i]];
my $max_diag = $i + scalar(@{$input[$i]}) - 1;
$global_max_diag = $max_diag if $max_diag > $global_max_diag;
}
for my $diag (0 .. $global_max_diag){
for my $i (0 .. $diag){
next if $diag - $i >= $lines_count;
$input[$diag - $i][$i] = ' ' unless defined $input[$diag - $i][$i];
print $input[$diag - $i][$i];
}
print "n";
}
假设输入文件如下:
$ cat in.txt
iftkn
iarwp
cooop
froas
blmaz
脚本产生此结果:
$ ./rotate_text_45.pl in.txt
i
if
cat
fork
brown
loop
map
as
z
进行旋转135°或225°i建议旋转90°(180°),然后旋转45°。
awk '
BEGIN{
sum = 0;
}
{
words[NR] = $0;
sum += length($0);
}
END{
cant_words = length(words);
for(i=1; i<=cant_words; i++){
flag[i] = 2-i;
}
cont_letter = 0;
row = 1;
while(cont_letter<sum){
out = "";
for(i=0; i<row-cant_words; i++){
out = out" ";
}
cont_space = 0;
for(i=cant_words; i>=1; i--){
if(flag[i] >= 1 && flag[i] <= length(words[i])){
for(j=0; j<cont_space; j++){
out=out" "
}
cont_space = 0;
out=out""substr(words[i],flag[i],1);
cont_letter = cont_letter + 1;
}else{
if(flag[i] > length(words[i])){
cont_space = cont_space + 1;
}
}
flag[i] = flag[i]+1;
}
print out;
row = row + 1;
}
}
' input
input1:
A B C DEFGHijkl
输出1:
AEBIFC JGD KH l
input2
ABCdefg你好
输出2
AD bHEC 如果 G
input3
ABCdefg你好JKLM
输出3
AD bHECJIF 公斤 l m
input4
何塞y里卡多yGloriset
输出4
j哟r s是的GC l a 或者 r d 我 s e t