1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
use strict; use warnings; use feature qw(say); sub fairShuffle { my %count; ++$count{$_} for @_; my @result; for my $key (sort { $count{$a} <=> $count{$b} } keys %count) { my $newLength = @result + $count{$key}; for (1..$count{$key}) { splice @result, (($_-1) * $newLength / $count{$key}), 0, $key; } } return @result; } my @result = fairShuffle(('a') x 5, ('b') x 3, ('c') x 10, ('d') x 1, ('e') x 1); say "@result";
c a c b c a c b c a c d c a c b c a c e
2014-04-04T13:13:20 MuffiPS: Wenn die "c"s perfekt verteilt wären (also mit max. Abstand), dann wär e sicher nicht das letzte Element.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#!/usr/bin/python def fairShuffle(a): count = {} for i in a: if count.has_key(i): count[i] += 1 else: count[i] = 1 result = [] # Returns a sorted list of the dictionary's keys, # sorted by values, lowest first: for key in sorted(count, key = count.get): newLength = len(result) + count[key] for i in range(1, count[key] + 1, 1): result.insert((i - 1) * newLength / count[key], key) return result a = ["a" * 5, "b" * 3, "c" * 10, "d", "e"] b = [] for i in a: for u in i: b.append(u) c = fairShuffle(b) print " ".join(c)
2014-04-08T22:40:03 hlubenowSpontan dachte ich an "Normalverteilung", aber damit hat das wohl nichts zu tun.
Woher kennt Dein Algorithmus die "richtigen" Abstände?
1
2
3
solange noch neue Elemente da sind:
nimm die, die am wenigsten oft da sind
verteile sie gleichmäßig in die Ergebnisliste