class Main {
public static void main
( String [ ] args
) { System .
out .
println ( breakString
( "That little pup treating you alright? I bet he'll grow strong if you give it lots of love!" ,
42 ) ) ; System .
out .
println ( "-----------------" ) ; System .
out .
println ( breakString
( "Boosts the power of a move that's used repeatedly. Once the chain is broken, the move's power returns to normal." ,
23 ) ) ; System .
out .
println ( "-----------------" ) ; System .
out .
println ( breakString
( "A bizarre orb that gives off heat when touched and will afflict the holder with a burn during battle." ,
23 ) ) ; System .
out .
println ( "-----------------" ) ; System .
out .
println ( breakString
( "This headband exudes strength, slightly boosting the power of the holder's physical moves." ,
23 ) ) ; System .
out .
println ( "-----------------" ) ; System .
out .
println ( breakString
( "This herb will allow the holder to mirror an opponent's stat increases to boost its own stats - but only once." ,
23 ) ) ; System .
out .
println ( "-----------------" ) ; System .
out .
println ( breakString
( "This water can be crossed!\n (You need 4 badges to use Surf outside of battle!)" ,
42 ) ) ; }
public static String breakString
( String input,
int maxChar
) { if ( input == null || maxChar <= 0 ) {
return null ;
}
StringBuilder result = new StringBuilder( ) ;
StringBuilder currentLine = new StringBuilder( ) ;
int currentLength = 0 ;
// split on spaces and tabs but not \n
for ( String word
: input.
split ( "[ \\ t]+" ) ) { // split the word if it contains \n
String [ ] parts
= word.
split ( "\n " ,
- 1 ) ;
for ( int i = 0 ; i < parts.length ; i++ ) {
// check if need to wrap before adding this part
if ( currentLength + part.length ( ) > maxChar) {
result.append ( currentLine.toString ( ) .trim ( ) ) .append ( "\n " ) ;
currentLine.setLength ( 0 ) ;
currentLength = 0 ;
}
currentLine.append ( part) ;
currentLength += part.length ( ) ;
// if this part was followed by a \n break the line
if ( i < parts.length - 1 ) {
result.append ( currentLine.toString ( ) .trim ( ) ) .append ( "\n " ) ;
currentLine.setLength ( 0 ) ;
currentLength = 0 ;
} else {
currentLine.append ( " " ) ;
currentLength += 1 ;
}
}
}
// append any leftover line
if ( currentLine.length ( ) > 0 ) {
result.append ( currentLine.toString ( ) .trim ( ) ) ;
}
return result.toString ( ) ;
}
}
Y2xhc3MgTWFpbiB7CiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJyZWFrU3RyaW5nKCJUaGF0IGxpdHRsZSBwdXAgdHJlYXRpbmcgeW91IGFscmlnaHQ/IEkgYmV0IGhlJ2xsIGdyb3cgc3Ryb25nIGlmIHlvdSBnaXZlIGl0IGxvdHMgb2YgbG92ZSEiLCA0MikpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYnJlYWtTdHJpbmcoIkJvb3N0cyB0aGUgcG93ZXIgb2YgYSBtb3ZlIHRoYXQncyB1c2VkIHJlcGVhdGVkbHkuIE9uY2UgdGhlIGNoYWluIGlzIGJyb2tlbiwgdGhlIG1vdmUncyBwb3dlciByZXR1cm5zIHRvIG5vcm1hbC4iLCAyMykpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYnJlYWtTdHJpbmcoIkEgYml6YXJyZSBvcmIgdGhhdCBnaXZlcyBvZmYgaGVhdCB3aGVuIHRvdWNoZWQgYW5kIHdpbGwgYWZmbGljdCB0aGUgaG9sZGVyIHdpdGggYSBidXJuIGR1cmluZyBiYXR0bGUuIiwgMjMpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJyZWFrU3RyaW5nKCJUaGlzIGhlYWRiYW5kIGV4dWRlcyBzdHJlbmd0aCwgc2xpZ2h0bHkgYm9vc3RpbmcgdGhlIHBvd2VyIG9mIHRoZSBob2xkZXIncyBwaHlzaWNhbCBtb3Zlcy4iLCAyMykpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0iKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYnJlYWtTdHJpbmcoIlRoaXMgaGVyYiB3aWxsIGFsbG93IHRoZSBob2xkZXIgdG8gbWlycm9yIGFuIG9wcG9uZW50J3Mgc3RhdCBpbmNyZWFzZXMgdG8gYm9vc3QgaXRzIG93biBzdGF0cyAtIGJ1dCBvbmx5IG9uY2UuIiwgMjMpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tIik7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJyZWFrU3RyaW5nKCJUaGlzIHdhdGVyIGNhbiBiZSBjcm9zc2VkIVxuKFlvdSBuZWVkIDQgYmFkZ2VzIHRvIHVzZSBTdXJmIG91dHNpZGUgb2YgYmF0dGxlISkiLCA0MikpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyZWFrU3RyaW5nKFN0cmluZyBpbnB1dCwgaW50IG1heENoYXIpIHsKICAgICAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCBtYXhDaGFyIDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgU3RyaW5nQnVpbGRlciBjdXJyZW50TGluZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgaW50IGN1cnJlbnRMZW5ndGggPSAwOwoKICAgICAgICAvLyBzcGxpdCBvbiBzcGFjZXMgYW5kIHRhYnMgYnV0IG5vdCBcbgogICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBpbnB1dC5zcGxpdCgiWyBcXHRdKyIpKSB7CiAgICAgICAgICAgIC8vIHNwbGl0IHRoZSB3b3JkIGlmIGl0IGNvbnRhaW5zIFxuCiAgICAgICAgICAgIFN0cmluZ1tdIHBhcnRzID0gd29yZC5zcGxpdCgiXG4iLCAtMSk7CgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCA9IHBhcnRzW2ldOwoKICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIG5lZWQgdG8gd3JhcCBiZWZvcmUgYWRkaW5nIHRoaXMgcGFydAogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMZW5ndGggKyBwYXJ0Lmxlbmd0aCgpID4gbWF4Q2hhcikgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY3VycmVudExpbmUudG9TdHJpbmcoKS50cmltKCkpLmFwcGVuZCgiXG4iKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluZS5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY3VycmVudExpbmUuYXBwZW5kKHBhcnQpOwogICAgICAgICAgICAgICAgY3VycmVudExlbmd0aCArPSBwYXJ0Lmxlbmd0aCgpOwoKICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgcGFydCB3YXMgZm9sbG93ZWQgYnkgYSBcbiBicmVhayB0aGUgbGluZQogICAgICAgICAgICAgICAgaWYgKGkgPCBwYXJ0cy5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjdXJyZW50TGluZS50b1N0cmluZygpLnRyaW0oKSkuYXBwZW5kKCJcbiIpOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lLnNldExlbmd0aCgwKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudExpbmUuYXBwZW5kKCIgIik7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudExlbmd0aCArPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBhcHBlbmQgYW55IGxlZnRvdmVyIGxpbmUKICAgICAgICBpZiAoY3VycmVudExpbmUubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY3VycmVudExpbmUudG9TdHJpbmcoKS50cmltKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogICAgfQp9