입력에 대한 무작위 출력

입력에 대한 무작위 출력

관련 질문:사용자 입력을 기반으로 무작위 출력을 생성하는 방법

와 같은 사용자(단 하나의 매개변수)로부터 입력을 받고 싶습니다 Hello. 그리고 다음과 같은 출력을 제공하고 싶습니다.

olleho
llohe
he
llo
lo

위와 같습니다. 또한 단일 입력에서 수백만 개의 샘플을 생성하고 싶습니다. 이 텍스트를 txt 형식 파일로 저장하고 싶습니다. 어떻게 하나요?


내 이메일 주소를 매개변수로 제공한다고 가정해 보겠습니다.[이메일 보호됨]`. 그래서 이제 이 계정과 관련된 비밀번호를 가질 수 있게 만들고 싶습니다. 일부 샘플 출력은 다음과 같습니다.
[email protected]
Istiakshovon
Istiak
Ishovon
Ishovon0
Iksgc
gmail
moc

가능한 모든 방법으로 샘플 비밀번호를 만들고 싶습니다.


나는 추가했다태그 이유 때문에 많은 사람들이 "awk"를 사용하여 텍스트 형식을 지정하는 것으로 나타났습니다. 나는 그것에 익숙하지 않습니다 (저는 단지 Linux 초보자입니다). 그래서 추가했습니다.

답변1

사용자의 입력이 변수에 있다고 가정하면 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

펄을 사용하고알고리즘::순열라이브러리 모듈:

#!/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 함수를 둘러싼 얇은 Perl 래퍼이고 C 함수가 배열을 파괴하는 방식으로 작성되었기 때문일 것입니다.

어쨌든, 이것이 바로 제가 이 my @array = split //, $string줄을 제거하고 이를 사용하여 메서드 [split //, $string]에 대한 Algorithm::Permute->new()익명 배열을 생성한 이유입니다. 이렇게 하면 루프를 통해 매번 배열이 다시 생성됩니다.

일반적으로 배열이 루프 내부에서 수정되지 않거나 수정되어서는 안되는 경우 루프 외부에서 한 번만 생성되어야 합니다.

참고 2: 출력 순서를 바꾸려면 스크립트 출력을 로 파이프 tac하거나 스크립트의 for 루프를 다음과 같이 변경하세요.

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

이렇게 하면 오류가 나에게 알려졌습니다. 위의 업데이트된 버전은 이제 그것과 함께 또는 그것 없이도 작동합니다 reverse.

관련 정보