my %seen = (); my %xeen = (); sub op { my $a = shift; my $b = shift; return $a ^ $b; } my $min = 1; sub a { my $prev = shift; $seen{$prev}++; while ($seen{$min}) { $min++; } my $a = $min; while ($seen{$a} || $xeen{op($a, $prev)}) { $a++; } $xeen{op($a, $prev)}++; return $a; } my $a = 1; foreach my $n (1..10_000) { print "$n $a\n"; $a = a($a); }