De Bruijn sequences: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) (Added Perl example) |
|||
Line 214: | Line 214: | ||
PIN number 8145 missing |
PIN number 8145 missing |
||
</pre> |
</pre> |
||
=={{header|Perl}}== |
|||
{{trans|Perl 6}} |
|||
<lang perl>use strict; |
|||
use warnings; |
|||
use feature 'say'; |
|||
my $seq; |
|||
for my $x (0..99) { |
|||
my $a = sprintf '%02d', $x; |
|||
next if substr($a,1,1) < substr($a,0,1); |
|||
$seq .= (substr($a,0,1) == substr($a,1,1)) ? substr($a,0,1) : $a; |
|||
for ($a+1 .. 99) { |
|||
next if substr(sprintf('%02d', $_), 1,1) <= substr($a,0,1); |
|||
$seq .= sprintf "%s%02d", $a, $_; |
|||
} |
|||
} |
|||
$seq .= '000'; |
|||
sub check { |
|||
my($seq) = @_; |
|||
my %chk; |
|||
for (0.. -1 + length $seq) { $chk{substr($seq, $_, 4)}++ } |
|||
say 'Missing: ' . join ' ', grep { ! $chk{ sprintf('%04d',$_) } } 0..9999; |
|||
say 'Extra: ' . join ' ', sort grep { $chk{$_} > 1 } keys %chk; |
|||
} |
|||
my $n = 130; |
|||
say "de Bruijn sequence length: " . length $seq; |
|||
say "\nFirst $n characters:\n" . substr($seq, 0, $n ); |
|||
say "\nLast $n characters:\n" . substr($seq, -$n, $n); |
|||
say "\nIncorrect 4 digit PINs in this sequence:"; |
|||
check $seq; |
|||
say "\nIncorrect 4 digit PINs in the reversed sequence:"; |
|||
check(reverse $seq); |
|||
say "\nReplacing the 4444th digit, '@{[substr($seq,4443,1)]}', with '5'"; |
|||
substr $seq, 4443, 1, 5; |
|||
say "Incorrect 4 digit PINs in the revised sequence:"; |
|||
check $seq;</lang> |
|||
{{out}} |
|||
<pre>de Bruijn sequence length: 10003 |
|||
First 130 characters: |
|||
0000100020003000400050006000700080009001100120013001400150016001700180019002100220023002400250026002700280029003100320033003400350 |
|||
Last 130 characters: |
|||
6898689969697769786979698769886989699769986999777787779778877897798779978787978887889789878997979887989799879998888988998989999000 |
|||
Incorrect 4 digit PINs in this sequence: |
|||
Missing: |
|||
Extra: |
|||
Incorrect 4 digit PINs in the reversed sequence: |
|||
Missing: |
|||
Extra: |
|||
Replacing the 4444th digit, '4', with '5' |
|||
Incorrect 4 digit PINs in the revised sequence: |
|||
Missing: 1459 4591 5814 8145 |
|||
Extra: 1559 5591 5815 8155</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |