случайный вывод из ввода

Благодарю всех за помощь и прошу прощения за задержку. Наконец, я смог решить эту проблему, сначала удалив OpenSSL v1.0.1. @GracefulRestart -обновление yum не сработало. Я хотел поделиться этой информацией, чтобы она могла помочь другим.

Затем я установил только OpenSSL v1.0.2. Затем я смог выполнить остальные шаги с веб-сайта Python, чтобы установить 3.6, а также установить последнюю версию pip.

Большое спасибо.

-4
05.05.2021, 18:44
2 ответа

Использование Perl и Алгоритма ::Permute библиотечного модуля:

#!/usr/bin/perl

use strict;
use Algorithm::Permute qw(permute);

my $string = 'hello';
my @array = split //, $string;
permute { print join("",@array), "\n" } @array;
$./permute.pl | head
hello
helol
heoll
hoell
ohell
hello
helol
heoll
hoell
ohell

Приведенная выше версия печатает только перестановки той же длины, что и оригинал.

Версия ниже делает все перестановки от длины 1 до той же длины:

#!/usr/bin/perl

use strict;
use Algorithm::Permute;

my $string = shift; # New & Improved! Now takes an argument!

# un-comment only ONE of the following two lines:
#for my $i (reverse 1.. length($string)) {
for my $i (1.. length($string)) {

  my $p = Algorithm::Permute->new([split //, $string], $i);
  while (my @res = $p->next) {
    print join('',@res), "\n";
  };
};

Сохранить как, например, permute.pl. Сделайте исполняемый файл с chmod +x permute.plи запустите как:

$./permute.pl hello

Примечание 1. :Оказывается, существует известная ошибка. Исходный массив очищается при выполнении полных перестановок в модуле Algorithm ::Permute, который стирает массив, с которым он вызывается.

Это явно не -непершистское поведение, и, вероятно, потому, что модуль не является нативным Perl, это тонкая оболочка perl вокруг скомпилированной функции C... и функция C была написана таким образом, что разрушает массив.

В любом случае, именно поэтому я избавился от строки my @array = split //, $stringи использовал [split //, $string]для создания анонимного массива для метода Algorithm::Permute->new(). Это гарантирует, что массив воссоздается при каждом проходе цикла.

Обычно, если массив не (или не должен )изменяться внутри цикла, его следует создать только один раз вне цикла.

Примечание 2 :Если вы хотите изменить порядок вывода на обратный, либо направьте вывод сценария на tac, либо измените цикл for в сценарии на:

for my $i (reverse 1.. length($string)) {

Именно это насторожило меня об ошибке. Обновленная версия выше теперь работает с reverseили без нее.

1
28.07.2021, 11:34

Предположим, что пользовательский ввод находится в переменной userinput, тогда следующий awkкод будет генерировать никогда не заканчивающуюся -случайную выборку этого ввода.

userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'

Принимает значение $userinput, добавляет символ новой строки в конец строки, а затем начинает записывать случайные символы из этой строки, пока вы не прервете код. Добавленный символ новой строки гарантирует, что мы время от времени получаем новые строки в выводе.

С помощью команды headвы можете ограничить количество строк вывода. Если вам нужно 1000 строк, направьте вывод через head -n 1000. Тестирование первых 10 строк вывода с помощьюuserinput='Hello World!':

$ userinput='Hello World!'
$ userinput=$userinput awk '
    BEGIN {
        s = ENVIRON["userinput"] "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }' | head
ld l!lodd loWHe! o
H lolooel
o
eo !lll
WrlHellHod
rlll
o!Hddrd

l!lHelWloodWddeodldHHlo!d l ll oorordeoellrWHledW!!WrW W!l
l!od

Если вы хотите удалить пустые строки, то передайте вывод через sed '/./!d'.

Вариант команды, которая берет входную строку из первой строки ввода:

awk '{
        s = $0 "\n"
        n = length(s)
        while (1)
            printf "%s", substr(s,int(1+rand()*n),1)
    }'
2
28.07.2021, 11:34

Теги

Похожие вопросы