파일 1에는 무작위로 쌍을 이루어야 하는 단어 목록이 포함되어 있습니다.
Tiger
Cat
Fish
Frog
Dog
Mouse
Elephant
Monkey
파일 2에는 무작위 페어링 중에(모든 솔루션에서) 사용해서는 안 되는 쌍이 포함되어 있습니다.
Elephant-Dog
Cat-Fish
Monkey-Frog
Dog Elephant, Fish Cat, Frog Monkey도 쌍이 File2에 나타나므로(방향에 관계없이) 제거해야 합니다. 총 6개의 솔루션이 필요하고 각 솔루션에는 최대 5쌍이 있어야 합니다. Tiger-Cat과 Cat-Tiger는 동일한 것으로 간주되어야 하며 솔루션에 함께 나타나는 경우 제거해야 합니다. 동일한 쌍(예: 개구리-개)이 여러 솔루션에 나타날 수 있습니다.
출력은 다음과 같습니다(여기에는 하나의 솔루션만 제공됩니다).
Tiger-Cat
Cat-Dog
Monkey-Cat
Frog-Dog
Elephant-Cat
답변1
bash
해결책:
for i in {1..6}; do
printf '==== solution %d ====\n' "$i"
# initialize solution
solution=()
while [ ${#solution[@]} -lt 5 ]; do
# select two random lines from file1
w1=$(shuf -n 1 file1)
w2=$(shuf -n 1 file1)
# skip if word1 is the same as word2
[ "$w1" == "$w2" ] && continue
# skip if pair exists in same solution or is not allowed from file2
cat <(printf '%s\n' "${solution[@]}") file2 | grep -qx "$w1-$w2" && continue
cat <(printf '%s\n' "${solution[@]}") file2 | grep -qx "$w2-$w1" && continue
# output
solution+=("${w1}-${w2}")
done
printf '%s\n' "${solution[@]}"
done
산출:
==== solution 1 ====
Fish-Monkey
Elephant-Mouse
Dog-Tiger
Mouse-Fish
Dog-Cat
==== solution 2 ====
Cat-Frog
Elephant-Monkey
Cat-Mouse
Tiger-Elephant
Fish-Tiger
==== solution 3 ====
Cat-Frog
Tiger-Monkey
Frog-Elephant
Dog-Fish
Elephant-Cat
==== solution 4 ====
Cat-Dog
Mouse-Elephant
Monkey-Elephant
Cat-Monkey
Tiger-Cat
==== solution 5 ====
Tiger-Monkey
Tiger-Cat
Mouse-Monkey
Mouse-Fish
Monkey-Cat
==== solution 6 ====
Monkey-Mouse
Dog-Monkey
Monkey-Fish
Tiger-Elephant
Cat-Tiger
답변2
펄 솔루션.
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use List::Util qw{ shuffle };
open my $fh_list, '<', shift or die $!;
chomp( my @words = sort <$fh_list> );
open my $fh_ban, '<', shift or die $!;
my %ban;
while (<$fh_ban>) {
chomp;
my ($ban1, $ban2) = sort split /-/;
undef $ban{"$ban1-$ban2"};
}
my @all;
for my $i1 (0 .. $#words) {
for my $i2 ($i1 + 1 .. $#words) {
my $pair = [ $i1, $i2 ];
push @all, $pair unless exists $ban{"$words[$i1]-$words[$i2]"};
}
}
my @solutions;
my %used;
while (@solutions < 6) {
my $solution = join ' ', sort +(shuffle(0 .. $#all))[0 .. 4];
redo if exists $used{$solution};
undef $used{$solution};
push @solutions, [
map join('-', @words[
@{ $all[$_] }[int rand 2 ? (0, 1) : (1, 0)]
]), split ' ', $solution
];
}
say join "\n", @$_, '---' for @solutions;
먼저 단어를 배열로 읽고 금지된 단어 쌍을 해시로 읽습니다. 그런 다음 첫 번째 요소가 두 번째 요소보다 먼저 정렬되는 가능한 모든 조합을 생성합니다. 그런 다음 가능한 모든 쌍을 섞고 6개의 서로 다른 솔루션이 나올 때까지 상위 5개를 선택합니다. "@all" 배열에는 요소의 인덱스만 포함되어 있으며, 해당 요소를 출력할 때 무작위로 섞이므로 "Cat-Dog"와 "Dog-Cat"을 모두 얻게 됩니다.
출력 예:
Elephant-Cat
Monkey-Cat
Fish-Elephant
Monkey-Fish
Frog-Tiger
---
Tiger-Cat
Tiger-Fish
Fish-Elephant
Dog-Monkey
Cat-Frog
---
Tiger-Fish
Cat-Elephant
Elephant-Frog
Mouse-Elephant
Frog-Cat
---
Tiger-Fish
Mouse-Fish
Monkey-Fish
Frog-Tiger
Cat-Dog
---
Dog-Frog
Elephant-Frog
Dog-Tiger
Tiger-Mouse
Tiger-Monkey
---
Tiger-Cat
Elephant-Frog
Tiger-Mouse
Cat-Frog
Cat-Dog
---