#python #linux #perl
Строки разной произвольной длины, различные символы. Как выполнить сдвиг символов строки на один символ и последовательно перебрать все варианты, чтобы на выходе из строки 1a2b3c получить: 1a2b3c a2b3c1 2b3c1a b3c1a2 3c1a2b c1a2b3 Требуется включить подобный скрипт в трубе в терминале средствами Unix ToolBox, Python, Perl.
Ответы
Ответ 1
На Питоне: import collections dq = collections.deque("1a2b3c") for __ in range(len(dq)): print("".join(dq)) dq.rotate(-1) Вывод: 1a2b3c a2b3c1 2b3c1a b3c1a2 3c1a2b c1a2b3 Объяснение: Объекты типа deque (double queue - двойная очередь, очередь с двумя концами) имеют метод rotate() (вращай), который делает точно то, что вы хотите, когда его параметр -1. (Положительные числа - вращение вправо, отрицательные - вращение влево.) Так что dq содержит одиночные символы заданной строки, нужно их перед печатей превратить в строку ("".join()).Ответ 2
s = "1a2b3c" for _ in range(len(s)): print(s) s = s[1:] + s[0] 1a2b3c a2b3c1 2b3c1a b3c1a2 3c1a2b c1a2b3Ответ 3
val = '1a2b3c' [ val[i:len(val)]+val[0:i] for i in range(len(val))] ['1a2b3c', 'a2b3c1', '2b3c1a', 'b3c1a2', '3c1a2b', 'c1a2b3']Ответ 4
#!/usr/bin/perl use Modern::Perl; my @chars = qw(1 a 2 b 3 c); # OR # my $s = '1a2b3c' # или из любого источника; # my @chars = split //, $s; while(1) { say @chars; push @chars, shift @chars; }Ответ 5
use strict; use warnings; my $str = '1a2b3c'; my $len = length($str) -1; for(0..$len){ $str =~ s/(.)(.{$len})/$2$1/; print "$str\n"; } a2b3c1 2b3c1a b3c1a2 3c1a2b c1a2b3 1a2b3cОтвет 6
Bash: echo "a1b2c3" | xargs -i@ bash -c 'seq $(($(expr length @-))) | sed -z "s/[0-9]*\n/@/g;s/$/\n/" | grep -oE .{$(($(expr length @-)))}' Работает не совсем корректно: a1b2c3a 1b2c3a1 b2c3a1b 2c3a1b2 c3a1b2c 3a1b2c3Ответ 7
Oldscool style :) #!/usr/bin/perl $chars = '1a2b3c'; my @chars = split(//,$chars); $\="\n"; foreach $i (@chars){ print @chars; push @chars, shift @chars; }Ответ 8
Еще вариант Perl => С использованием функции substr(): #!/usr/bin/perl $chars = '1a2b3c'; $\="\n"; for (my $i=0;$iОтвет 9
Perl с использованием regex (уже было но можно попроще): #!/usr/bin/perl $chars = '1a2b3c'; $\="\n"; for (my $i=0;$iОтвет 10
Python: s = "1a2b3c" for i in range(len(s)): s=print(s) or s[1:]+s[:1] Или одной строкой: print([(s[i+1:len(s)]+s[0:i+1]) for i in range(len(s))])
Комментариев нет:
Отправить комментарий