外壳脚本 将矩形文本旋转 45°



我需要为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代替awkPerl在处理文本方面非常强大,语法非常类似于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

相关内容

  • 没有找到相关文章