5
\$\begingroup\$

Given a string, mark which parts in the string repeat in box brackets, and write how many times it does so before the box.

Example:st st st Hello ThereThere
st(with a space after) repeats 3 times, There repeats 2 times, and l repeats 2 times in Hello, so the output will be:
3[st ]He2[l]o 2[There]
There is no space between [st ] and Hello because the space in the string is being taken up by the repeating part. [st ], 3 times with a Hello after it would be st st st Hello, which is what the string has.

Other examples:
st Hello st st Bye -> st He2[l]o 2[st ]Bye
Bookkeeper -> B2[o]2[k]2[e]per
/\/\/\\\\\\\\/\/\/ -> 3[/\]6[\]3[\/]

Shortestest code wins.

EDIT: To clarify the choice of selections, choose the largest possible repeating section, and try and leave as little non-repeating characters as possible. Do not nest boxed-in sections.

\$\endgroup\$
  • 4
    \$\begingroup\$ This is ambiguous. For example, ababababcabcabc -> 4[ab]2[cab]c? 4[ab]c2[abc]? 3[ab]3[abc]? What bout abcdefdefghiabcdefdefghi -> 2[abcdefdefghi]? abc2[def]ghiabc2[def]ghi? 2[abc2[def]ghi]? \$\endgroup\$ – Mechanical snail Jul 26 '12 at 6:06
  • 1
    \$\begingroup\$ this is not possible ;) just the typical first answer I get whenever I ask a developer something. \$\endgroup\$ – Kinjal Dixit Jul 26 '12 at 6:41
  • 3
    \$\begingroup\$ Shouldn't the output to your first example be "3[st ]He2[l]o 2[There]"? (Same for the second.) \$\endgroup\$ – Howard Jul 26 '12 at 8:20
  • 1
    \$\begingroup\$ Why gets “st Hello st st Bye” transformed into “st Hello 2[st ]Bye” and not into “st Hello2[ st] Bye”? So the repeating substring why not starts with the first repeated character, the space before “st”? \$\endgroup\$ – manatwork Jul 26 '12 at 8:54
  • 3
    \$\begingroup\$ The specification is still ambiguous because it lists multiple goals without clearly stating their relative priority, and without indicating what level of naïvety is acceptable. I don't see the point in constructing complicated test cases to elucidate the points: either the question needs to be largely rewritten to give precise acceptance criteria or it needs to be amended to indicate that wide latitude will be given. \$\endgroup\$ – Peter Taylor Jul 28 '12 at 21:33
6
\$\begingroup\$

Perl, 36 bytes

#!perl -p
s!(.+)\1+!@{[$&=~/\Q$1/g]}."[$1]"!eg

Try it online!


PHP 5.6, 68 bytes

Same code in PHP. Requires the command line option -F, and relies on deprecated /e modifier.

<?=preg_filter('/(.+)\1+/e','substr_count("\0","\1")."[\1]"',$argn);
\$\endgroup\$
  • \$\begingroup\$ +1 for perl -p \$\endgroup\$ – quantum Aug 22 '12 at 0:51
3
\$\begingroup\$

scala, 102 chars

print("(?!\\s)(.+)\\1+".r.replaceAllIn(readLine,m=>m.matched.size/m.group(1).size+"["+m.group(1)+"]"))

Output

st st st Hello ThereThere ->    3[st ]He2[l]o 2[There]
st Hello st st Bye        ->    st He2[l]o 2[st ]Bye
Bookkeeper                ->    B2[o]2[k]2[e]per
/\/\/\\\\\\\\/\/\/        ->    3[/\]2[\\\]3[\/]
\$\endgroup\$
  • \$\begingroup\$ +1, nice use of Regex.Match \$\endgroup\$ – schnaader Jul 26 '12 at 19:22
3
\$\begingroup\$

C, 224 205 203 199 195 193 chars

The string is given as program parameter. As usual, use double quotes if your string contains spaces, and for empty strings - calling the program without any parameter crashes, but calling with "" works.

Output for test cases is:

st st st Hello ThereThere => 3[st ]He2[l]o 2[There]
Bookkeeper                => B2[o]2[k]2[e]per
/\/\/\\\\\\\\/\/\/        => 3[/\]2[\\\]3[\/]

which looks correct to me regarding "choose the largest possible repeating section".

Code:

l,r,f,i;char*c;main(a,b)char**b;{l=strlen(c=b[1]);for(;putchar(*c);c++)for(a=l;--a;f=0)for(r=a;!f;r+=a){for(i=0;i<a;)f|=r>l||c[i]-c[r+i++];if(f*r>a)c[a]=0,printf("\b%i[%s]",r/a,c),c+=r-1,a=1;}}
\$\endgroup\$
1
\$\begingroup\$

Retina, 40 37 24 bytes

(.+)(\1)+
$.($#2*__)[$1]

-13 bytes thanks to @Neil.

Try it online or verify all test cases. (NOTE: Slightly different results for some test cases in comparison to the challenge description, but still the same as the accepted answer, so I assumed both are valid.)

Explanation:

(.+)(\1)+       # Look for the repeated sections (where the repeated string is captured in
                # group 1, and every time it's repeated in group 2)

Example: in the input "st st st Hello ThereThere" it will find the capture group 1 and 2 as: "st " & ["st ","st "]; "l" & ["l"]; and "There" & ["There"] respectively.

   $#2          # Get the amount of times group 2 was repeated
      *_        # Converted to unary (that amount of '_')
        _       # + 1 (with an additional '_' added)
$.(      )      # Convert that unary back to a number again by taking the length
          [$1]  # And append the match of the first capture group between block-quotes
                # after the number

Example: "st st st " will become "3[st ]"; "ll" will becomes "2[l]"; and "ThereThere" will become "2[There]". So "st st st Hello ThereThere" is now the intended result "3[st ]He2[l]o 2[There]" (which is output implicitly).

\$\endgroup\$
1
\$\begingroup\$

Perl 5 -p, 41 bytes

s|(.+)\1+|(length($&)/length$1)."[$1]"|ge

Try it online!

\$\endgroup\$
0
\$\begingroup\$

PowerShell, 82 bytes

[regex]::Replace($args,'(.+)\1+',{$a,$g=$args|% gr*
"$($a.Length/$g.Length)[$g]"})

Try it online!

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.