# Downgrade to a Palindrome

## J, 24 bytes

```
(0{::(-:|.)\.#&,<\)[email protected]#
```

Try it online!

### Explanation

```
(0{::(-:|.)\.#&,<\)[email protected]# Input: array of chars S
# Length of S
[email protected] Range, [0, 1, ..., len(S)-1]
( )~ Dyadic verb on range and S
\. For each outfix of S of size x in range
|. Reverse
-: Matches input (is palindrome)
<\ Box each infix of S of size x in range
#&, Flatten each and copy the ones that match
0{:: Fetch the result and index 0 and return
```

## Jelly, 16 bytes

```
Ḣ;Ṫµ=Ṛ
0,0jŒṖÇÞṪ
```

Try it online!

### How it works

```
0,0jŒṖÇÞṪ Main link. Argument: s (string)
0,0j Join [0, 0], separating by s. This prepends and appends a 0 to s.
ŒṖ Build all partitions of the resulting array.
ÇÞ Sort the partitions by the helper link.
As a side effect, this will remove the first and last element of each
partition. The 0's make sure that not removing any characters from s
will still remove [0] from both sides.
Ṫ Tail; extract the last one.
Ḣ;Ṫµ=Ṛ Helper link. Argument: A (array/partition)
Ḣ Head; yield and remove the first chunk of A.
Ṫ Tail; yield and remove the last chunk of A.
; Concatenate head and tail.
µ=Ṛ Compare the result, character by character, with its reverse.
A palindrome of length l will yield an array of l 1's, while a
non-palindrome of length l will yield an array with at least one 0 among
the first l/2 Booleans. The lexicographically largest result is the one
with the longest prefix of 1's, which corresponds to the longest
palindrome among the outfixes.
```

### Wolfram Language (Mathematica), ~~53~~ 51 bytes

Byte count assumes CP-1252 encoding.

```
±{a___,[email protected]___,c___}/;PalindromeQ[a<>c]:={b}
```

Try it online!

Defines a unary operator `±`

(or a function `PlusMinus`

). Input and output are lists of characters. The test suite does the conversion from and to actual strings for convenience.