Rep-string: Difference between revisions

2,065 bytes added ,  2 years ago
Line 3,001:
 
=== Press any key to exit ===</pre>
 
 
=={{header|Picat}}==
<lang Picat>go =>
Strings = [
"1001110011", % 10011
"1110111011", % 1110
"0010010010", % 001
"1010101010", % 1010
"1111111111", % 11111
"0100101101", % no solution
"0100100", % 010
"101", % no solution
"11", % 1
"00", % 0
"1", % no solution
"", % no solution
"123123123123123", % 123123
"12312312312312", % 123123
"123123123123124", % no solution
"abcabcdabcabcdabc", % abcabcd
[1,2,3,4,1,2,3,4,1,2,3] % 1,2,3,4
],
foreach(S in Strings)
printf("%w: ", S),
if maxrep(S,Substr,N) then
println([substr=Substr,n=N])
else
println("no solution")
end
end,
nl.
% the largest repeating substring
maxrep(S,Substr,N) =>
maxof(rep(S,Substr,N),N).
 
rep(S,Substr,N) =>
between(1,S.length div 2, N),
Len = S.length,
Len2 = Len - (Len mod N),
Substr = slice(S,1,N),
% count the number of proper slices
SS = [1 : I in 1..N..Len2, slice(S,I,I+N-1) = Substr],
SS.length = Len div N,
% the last (truncated) slice (or []) must be a substring of Substr
Rest = slice(S,Len2+1,Len),
find(Substr,Rest,1,_). </lang>
 
{{out}}
<pre>1001110011: [substr = 10011,n = 5]
1110111011: [substr = 1110,n = 4]
0010010010: [substr = 001,n = 3]
1010101010: [substr = 1010,n = 4]
1111111111: [substr = 11111,n = 5]
0100101101: no solution
0100100: [substr = 010,n = 3]
101: no solution
11: [substr = 1,n = 1]
00: [substr = 0,n = 1]
1: no solution
[]: no solution
123123123123123: [substr = 123123,n = 6]
12312312312312: [substr = 123123,n = 6]
123123123123124: no solution
abcabcdabcabcdabc: [substr = abcabcd,n = 7]
[1,2,3,4,1,2,3,4,1,2,3]: [substr = [1,2,3,4],n = 4]</pre>
 
 
495

edits