De Bruijn sequences: Difference between revisions

m
syntax highlighting fixup automation
m (→‎{{header|J}}: J's sort is a stable sort)
m (syntax highlighting fixup automation)
Line 84:
{{trans|D}}
 
<langsyntaxhighlight lang="11l">V digits = ‘0123456789’
 
F deBruijn(k, n)
Line 148:
db[4443] = ‘.’
print("\nValidating the overlaid deBruijn sequence:")
validate(db)</langsyntaxhighlight>
 
{{out}}
Line 173:
 
=={{header|8080 Assembly}}==
<langsyntaxhighlight lang="8080asm">bdos: equ 5 ; BDOS entry point
putch: equ 2 ; Write character to console
puts: equ 9 ; Write string to console
Line 439:
arr: equ ($/256+1)*256 ; Place to store a[] (page-aligned)
val: equ arr+40 ; Place to store validation flags
seq: equ val+10000 ; Place to store De Bruijn sequence</langsyntaxhighlight>
 
{{out}}
Line 454:
=={{header|8086 Assembly}}==
 
<langsyntaxhighlight lang="asm">putch: equ 2 ; Print character
puts: equ 9 ; Print string
cpu 8086
Line 653:
arr: resb 40 ; a[]
val: resb 10000 ; validation array
seq: equ $</langsyntaxhighlight>
 
{{out}}
Line 668:
=={{header|Ada}}==
{{trans|D}}
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Fixed; use Ada.Strings;
with Ada.Strings.Unbounded;
Line 793:
Validate (Ovl);
New_Line;
end De_Bruijn_Sequences;</langsyntaxhighlight>
 
{{out}}
Line 820:
 
=={{header|BASIC}}==
<langsyntaxhighlight lang="gwbasic">10 DEFINT A-Z
20 K = 10: N = 4
30 DIM A(K*N), S(K^N+N), T(5), P(5), V(K^N\8)
Line 891:
770 IF M THEN PRINT " none";
780 PRINT " missing."
790 RETURN</langsyntaxhighlight>
{{out}}
<pre>Length: 10000
Line 908:
=={{header|C sharp|C#}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
using System.Text;
Line 1,011:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 1,034:
=={{header|C++}}==
{{trans|D}}
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <functional>
#include <iostream>
Line 1,148:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 1,170:
 
=={{header|CLU}}==
<langsyntaxhighlight lang="clu">% Generate the De Bruijn sequence consisiting of N-digit numbers
de_bruijn = cluster is generate
rep = null
Line 1,272:
db := string$substr(db, 1, 4443) || "." || string$rest(db, 4445)
validate(po, db, 4)
end start_up</langsyntaxhighlight>
{{out}}
<pre>Length: 10000
Line 1,287:
=={{header|D}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="d">import std.array;
import std.conv;
import std.format;
Line 1,383:
writeln("\nValidating the overlaid deBruijn sequence:");
validate(db);
}</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 1,405:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,514:
fmt.Println("\nValidating the overlaid de Bruijn sequence:")
validate(db)
}</langsyntaxhighlight>
 
{{out}}
Line 1,542:
=={{header|Groovy}}==
{{trans|Java}}
<langsyntaxhighlight lang="groovy">import java.util.function.BiConsumer
 
class DeBruijn {
Line 1,653:
validate(sb.toString())
}
}</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 1,678:
Straight-forward implementation of inverse Burrows—Wheeler transform [[wp:De_Bruijn_sequence#Construction|De_Bruijn_sequence#Construction] is reasonably efficient for the task (about a milliseconds for B(10,4) in GHCi).
 
<langsyntaxhighlight lang="haskell">import Data.List
import Data.Map ((!))
import qualified Data.Map as M
Line 1,703:
deBruijn :: Ord a => [a] -> Int -> [a]
deBruijn s n = let lw = concat $ lyndonWords n s
in lw ++ take (n-1) lw</langsyntaxhighlight>
 
<pre>λ> cycleForm [1,4,3,2,0]
Line 1,716:
The task.
 
<langsyntaxhighlight lang="haskell">import Control.Monad (replicateM)
 
main = do
Line 1,730:
 
let db' = a ++ ('.': tail b) where (a,b) = splitAt 4444 db
putStrLn $ "Words not in the corrupted sequence: " ++ unwords (validate db') </langsyntaxhighlight>
 
<pre>λ> main
Line 1,744:
{{trans|Python}}
 
<langsyntaxhighlight lang="haskell">import Control.Monad.State
import Data.Array (Array, listArray, (!), (//))
import qualified Data.Array as A
Line 1,772:
seqn = db 1 1 `evalState` listArray (0, k*n-1) (repeat 0)
in [ s !! i | i <- seqn ++ take (n-1) seqn ]</langsyntaxhighlight>
 
=={{header|J}}==
definitions. The C. verb computes the cycles. J's sort is a stable sort.
<langsyntaxhighlight Jlang="j">NB. implement inverse Burrows—Wheeler transform sequence method
 
repeat_alphabet=: [: , [: i.&> (^ <:) # [
Line 1,786:
groups=: [ ]\ ] , ({.~ <:)~ NB. length x infixes of sequence y cyclically extended by x-1
verify_PINs=: (/:~@:groups -: pins@:[) NB. LENGTH verify_PINs SEQUENCE
</langsyntaxhighlight>Task<syntaxhighlight lang J="j"> NB. A is the sequence
A=: 10 de_bruijn 4
 
Line 1,805:
4 verify_PINs (a.i.'.') (<: 4444)} A
0
</syntaxhighlight>
</lang>
 
=={{header|Java}}==
{{trans|C++}}
<langsyntaxhighlight lang="java">import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Line 1,923:
validate(sb.toString());
}
}</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 1,945:
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">function debruijn(k::Integer, n::Integer)
alphabet = b"0123456789abcdefghijklmnopqrstuvwxyz"[1:k]
a = zeros(UInt8, k * n)
Line 1,990:
print("Testing the reversed sequence: "), verifyallPIN(reverse(s), 10, 4)
println("\nAfter replacing 4444th digit with \'.\':"), verifyallPIN(s, 10, 4, 4444)
</langsyntaxhighlight>{{out}}
<pre>
The length of the sequence is 10003. The first 130 digits are:
Line 2,009:
=={{header|Kotlin}}==
{{trans|Go}}
<langsyntaxhighlight lang="scala">const val digits = "0123456789"
 
fun deBruijn(k: Int, n: Int): String {
Line 2,102:
println("\nValidating the overlaid deBruijn sequence:")
validate(db)
}</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 2,125:
=={{header|Lua}}==
{{trans|C++}}
<langsyntaxhighlight lang="lua">function tprint(tbl)
for i,v in pairs(tbl) do
print(v)
Line 2,236:
end
 
main()</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 2,257:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">seq = DeBruijnSequence[Range[0, 9], 4];
seq = seq~Join~Take[seq, 3];
Length[seq]
Line 2,274:
StringDrop[ToString[NumberForm[#, 4, NumberPadding -> {"0", "0"}]],
1] & /@ Range[0, 9999],
Union[StringJoin /@ Partition[ToString /@ seq, 4, 1]]]</langsyntaxhighlight>
 
{{out}}
Line 2,296:
=={{header|Nim}}==
{{trans|D}}
<langsyntaxhighlight Nimlang="nim">import algorithm, parseutils, strformat, strutils
 
const Digits = "0123456789"
Line 2,377:
db[4443] = '.'
echo "Validating the overlaid deBruijn sequence:"
db.validate()</langsyntaxhighlight>
 
{{out}}
Line 2,403:
 
For a given word length n, constructs a de Bruijn sequence by concatenating, in lexicographic order, all the Lyndon words whose length divides n. (See Wikipedia article "de Bruijn sequence", section "Construction".)
<langsyntaxhighlight lang="pascal">
program deBruijnSequence;
uses SysUtils;
Line 2,519:
end;
end.
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,545:
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 2,582:
substr $seq, 4443, 1, 5;
say "Incorrect 4 digit PINs in the revised sequence:";
check $seq;</langsyntaxhighlight>
{{out}}
<pre>de Bruijn sequence length: 10003
Line 2,608:
{{trans|zkl}}
{{trans|Go}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #004080;">string</span> <span style="color: #000000;">deBruijn</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">to</span> <span style="color: #000000;">99</span> <span style="color: #008080;">do</span>
Line 2,660:
<span style="color: #000000;">deBruijn</span><span style="color: #0000FF;">[</span><span style="color: #000000;">4444</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'.'</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Re-running checks: %s\n"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">check</span><span style="color: #0000FF;">(</span><span style="color: #000000;">deBruijn</span><span style="color: #0000FF;">))</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 2,682:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">
# from https://en.wikipedia.org/wiki/De_Bruijn_sequence
 
Line 2,774:
print("Validating the overlaid deBruijn sequence:")
validate(dboverlaid)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,801:
{{trans|Go}}
 
<langsyntaxhighlight lang="racket">#lang racket
(define (de-bruijn k n)
Line 2,846:
(validate "" seq)
(validate "reversed " (reverse seq))
(validate "overlaid " (list-update seq 4443 add1))</langsyntaxhighlight>
 
{{out}}
Line 2,877:
Deviates very slightly from the task spec. Generates a randomized de Bruijn sequence and replaces the 4444th digit with a the digit plus 1 mod 10 rather than a '.', mostly so it can demonstrate detection of extra PINs as well as missing ones.
 
<syntaxhighlight lang="raku" perl6line># Generate the sequence
my $seq;
 
Line 2,918:
put "Incorrect 4 digit PINs in the revised sequence:";
$seq.substr-rw(4443,1) = $digit;
check $seq;</langsyntaxhighlight>
{{out|Sample output}}
<pre>de Bruijn sequence length: 10003
Line 2,944:
The &nbsp; de Bruijn &nbsp; sequence generated by these REXX programs are identical to the sequence shown on the &nbsp; ''discussion'' &nbsp; page &nbsp; (1<sup>st</sup> topic).
=== hard-coded node to be removed ===
<langsyntaxhighlight lang="rexx">/*REXX pgm calculates the de Bruijn sequence for all pin numbers (4 digit decimals). */
$= /*initialize the de Bruijn sequence. */
#=10; lastNode= (#-2)(#-2)(#-1)(#-2) /*this number is formed when this # ···*/
Line 2,991:
if e==0 then e= 'No' /*Gooder English (sic) the error count.*/
say _ e 'errors found.' /*display the number of errors found. */
return</langsyntaxhighlight>
{{out|output}}
<pre>
Line 3,020:
 
This method slightly bloats the program and slows execution.
<langsyntaxhighlight lang="rexx">/*REXX pgm calculates the de Bruijn sequence for all pin numbers (4 digit decimals). */
$= /*initialize the de Bruijn sequence. */
do j=0 for 10; $= $ j; jj= j || j /*compose the left half of the numbers.*/
Line 3,067:
if e==0 then e= 'No' /*Gooder English (sic) the error count.*/
say _ e 'errors found.' /*display the number of errors found. */
return</langsyntaxhighlight>
{{out|output|text=&nbsp; is identical to the 1<sup>st</sup> REXX version.}} <br>
 
=={{header|Ruby}}==
{{trans|D}}
<langsyntaxhighlight lang="ruby">def deBruijn(k, n)
alphabet = "0123456789"
@a = Array.new(k * n, 0)
Line 3,144:
db[4443] = '.'
print "Validating the overlaid de Bruijn sequence:\n"
validate(db)</langsyntaxhighlight>
{{out}}
<pre>The length of the de Bruijn sequence is 10003
Line 3,164:
=={{header|Visual Basic .NET}}==
{{trans|C#}}
<langsyntaxhighlight lang="vbnet">Imports System.Text
 
Module Module1
Line 3,267:
End Sub
 
End Module</langsyntaxhighlight>
{{out}}
<pre>The first 130 digits of the de Bruijn sequence are: 0000100020003000400050006000700080009001100120013001400150016001700180019002100220023002400250026002700280029003100320033003400350
Line 3,290:
{{libheader|Wren-fmt}}
{{libheader|Wren-str}}
<langsyntaxhighlight lang="ecmascript">import "/fmt" for Fmt
import "/str" for Str
Line 3,348:
System.print("\n4,444th digit in the sequence: '%(deBruijn[4443])' (setting it to '.')")
deBruijn = deBruijn[0..4442] + "." + deBruijn[4444..-1]
System.print("Re-running checks: %(check.call(deBruijn))")</langsyntaxhighlight>
 
{{out}}
Line 3,373:
=={{header|zkl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="zkl">dbSeq:=Data(); // a byte/character buffer
foreach n in (100){
a,a01,a11 := "%02d".fmt(n), a[0,1], a[1,1];
Line 3,383:
}
}
dbSeq.append("000");</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">seqText:=dbSeq.text;
println("de Bruijn sequence length: ",dbSeq.len());
 
Line 3,400:
println("\n4444th digit in the sequence: ", seqText[4443]);
dbSeq[4443]=".";
println("Setting the 4444th digit and reruning checks: ",chk(dbSeq.text).concat(" "));</langsyntaxhighlight>
{{out}}
<pre>
10,333

edits