Skip to main content
@ceilingcat strikes again.
Source Link
G. Sliepen
  • 1.3k
  • 9
  • 17

C (gcc), 180180 168168 159159 157 140157 140 139 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;i++;p&&i<m;)p=s[i]^s[jp=s[i++]^s[j--]&&!++p?s[i+1]s[i]-s[j+1]?s[i]s[i-1]-s[j]?p:j--+2:++ii++:p;return p<0?m+1:p?p:-1;} 

Try it online!Try it online!

2 162 16 17 bytes shaved off thanks to ceilingcat! And 3 more bytes since the rules state the minimum length of the input is 2 characters, so don't have to check for empty strings.

C (gcc), 180 168 159 157 140 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;i++)p=s[i]^s[j--]&&!++p?s[i+1]-s[j+1]?s[i]-s[j]?p:j--+2:++i:p;return p<0?m+1:p?p:-1;} 

Try it online!

2 16 bytes shaved off thanks to ceilingcat! And 3 more bytes since the rules state the minimum length of the input is 2 characters, so don't have to check for empty strings.

C (gcc), 180 168 159 157 140 139 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;)p=s[i++]^s[j--]&&!++p?s[i]-s[j+1]?s[i-1]-s[j]?p:j--+2:i++:p;return p<0?m+1:p?p:-1;} 

Try it online!

2 16 17 bytes shaved off thanks to ceilingcat! And 3 more bytes since the rules state the minimum length of the input is 2 characters, so don't have to check for empty strings.

Added ceilingcat's improvements, removed check for empty input.; edited body
Source Link
G. Sliepen
  • 1.3k
  • 9
  • 17

C (gcc), 180 168 159 157157 140 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;j;p&&i<m;i++)p=s[i]^s[j--,i++)s[i]^s[j]&&(]&&!++p&&(s[i+1]==s[j]&&(p=++i)||s[i]==s[j++p?s[i+1]-1]&&(p=js[j+1]?s[i]-s[j]?p:j-+1)));return*s&&p<0-+2:++i:p;return p<0?m+1:p?p:-1;} 

Try it online!Try it online!

22 16 bytes shaved off thanks to ceilingcat! And 3 more bytes since the rules state the minimum length of the input is 2 characters, so don't have to check for empty strings.

f(char *s)   {   int j = strlen(s), ; // j = length of input   int m = j-- / 2, 2; // m = midpoint of string,   // j = index of right character  int p = -1;  // p = -1,position of extra character  // p =  -1 means no extra character found yet,   0 means invalid input  i = 0;  // 0 means invalid input int i = 0; // i = index of left character   for (; p && i < m; j--, i++)  { // loop over the string from both sides,   // as long as the input is valid.   p = s[i] ^ s[j--] // if (left character != right character  && !++p ? // increment i and decrement j.  s[i] ^// s[j] && ( and we didn't remove a character yet*)  // ifs[i (left+ character1] !=- rights[j character)+ { 1] ? // if (left+1 char != right char)  !++p && ( s[i] - s[j] ? // if (we didn'tleft removechar a!= characterright-1 yetchar) { p s[i + 1] == s[j] && ( // // if (left+1 char == rightdo char)nothing, : p = ++i // // else  remove left char,  j-- + 2 // )  remove right char.  || s[i] ==: s[j - 1] && ( // else if (left char == right-1 char)  // else  ++i p = j-- + 1 // remove left char.  remove right char,  : )  // else  )  p; // }do elsenothing, theor:  input is invalid.  ); //  *the input is marked invalid    // }    return *s && p < 0 ? // if (non-zeroinput stringvalid and we didn't remove a character yet)   m + 1 // return the midpoint character,  // : return the midpoint character,  : p ? // else  p ?  // else  if (we did remove a character)   p  // return that character,  : // return that character,  : -1; // else  -1;  // else  the input was invalid. } ``` 

C (gcc), 180 168 159 157 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;j--,i++)s[i]^s[j]&&(!++p&&(s[i+1]==s[j]&&(p=++i)||s[i]==s[j-1]&&(p=j--+1)));return*s&&p<0?m+1:p?p:-1;} 

Try it online!

2 bytes shaved off thanks to ceilingcat!

f(char *s)  {   int j = strlen(s),  // j = length of input   m = j-- / 2,  // m = midpoint of string,   // j = index of right character p = -1, // p = -1 means no extra character found yet, 0 means invalid input  i = 0; // i = index of left character   for (; p && i < m; j--, i++)  // loop over the string from both sides,   // as long as input is valid.   // increment i and decrement j.  s[i] ^ s[j] && ( // if (left character != right character) {  !++p && ( // if (we didn't remove a character yet) { s[i + 1] == s[j] && ( // if (left+1 char == right char) p = ++i // remove left char,  )  || s[i] == s[j - 1] && ( // else if (left char == right-1 char)  p = j-- + 1 // remove right char,  )  ) // } else the input is invalid.  ); // }   return *s && p < 0 ? // if (non-zero string and we didn't remove a character yet) m + 1 // return the midpoint character,  : p ? // else if (we did remove a character) p // return that character,  : -1; // else the input was invalid. } ``` 

C (gcc), 180 168 159 157 140 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;i++)p=s[i]^s[j--]&&!++p?s[i+1]-s[j+1]?s[i]-s[j]?p:j--+2:++i:p;return p<0?m+1:p?p:-1;} 

Try it online!

2 16 bytes shaved off thanks to ceilingcat! And 3 more bytes since the rules state the minimum length of the input is 2 characters, so don't have to check for empty strings.

f(char *s) { int j = strlen(s); // j = length of input int m = j-- / 2; // m = midpoint of string, // j = index of right character  int p = -1;  // p = position of extra character  //   -1 means no extra character found yet     // 0 means invalid input int i = 0; // i = index of left character for (; p && i < m; i++) { // loop over the string from both sides, // as long as the input is valid. p = s[i] ^ s[j--] // if (left character != right character  && !++p ? // and we didn't remove a character yet*)  s[i + 1] - s[j + 1] ? // if (left+1 char != right char)  s[i] - s[j] ? // if (left char != right-1 char) p // do nothing, : // else  j-- + 2 // remove right char.  : // else  ++i // remove left char.  : // else    p; // do nothing, or:  //  *the input is marked invalid    }  return p < 0 ? // if (input valid and we didn't remove a character yet)   m + 1 // return the midpoint character,  : // else  p ?  //   if (we did remove a character)   p  // return that character,  : // else  -1;  //   the input was invalid. } ``` 
Remove superfluous braces thanks to ceilingcat.
Source Link
G. Sliepen
  • 1.3k
  • 9
  • 17

C (gcc), 180 168 159159 157 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;j--,i++){s[i]^s[j]&&(!++p&&(s[i+1]==s[j]&&(p=++i)||s[i]==s[j-1]&&(p=j--+1)));}return*s&&p<0;return*s&&p<0?m+1:p?p:-1;} 

Try it online!Try it online!

2 bytes shaved off thanks to ceilingcat!

f(char *s) { int j = strlen(s), // j = length of input m = j-- / 2, // m = midpoint of string, // j = index of right character p = -1, // p = -1 means no extra character found yet, 0 means invalid input i = 0; // i = index of left character for (; p && i < m; j--, i++) {  // loop over the string from both sides, // as long as input is valid. // increment i and decrement j. s[i] ^ s[j] && ( // if (left character != right character) { !++p && ( // if (we didn't remove a character yet) { s[i + 1] == s[j] && ( // if (left+1 char == right char) p = ++i // remove left char, ) || s[i] == s[j - 1] && ( // else if (left char == right-1 char) p = j-- + 1 // remove right char, ) ) // } else the input is invalid. );    // } return *s && p < 0 ? // if (non-zero string and we didn't remove a character yet) m + 1 // return the midpoint character, : p ? // else if (we did remove a character) p // return that character, : -1; // else the input was invalid. } ``` 

C (gcc), 180 168 159 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;j--,i++){s[i]^s[j]&&(!++p&&(s[i+1]==s[j]&&(p=++i)||s[i]==s[j-1]&&(p=j--+1)));}return*s&&p<0?m+1:p?p:-1;} 

Try it online!

f(char *s) { int j = strlen(s), // j = length of input m = j-- / 2, // m = midpoint of string, // j = index of right character p = -1, // p = -1 means no extra character found yet, 0 means invalid input i = 0; // i = index of left character for (; p && i < m; j--, i++) { // loop over the string from both sides, // as long as input is valid. // increment i and decrement j. s[i] ^ s[j] && ( // if (left character != right character) { !++p && ( // if (we didn't remove a character yet) { s[i + 1] == s[j] && ( // if (left+1 char == right char) p = ++i // remove left char, ) || s[i] == s[j - 1] && ( // else if (left char == right-1 char) p = j-- + 1 // remove right char, ) ) // } else the input is invalid. );   } return *s && p < 0 ? // if (non-zero string and we didn't remove a character yet) m + 1 // return the midpoint character, : p ? // else if (we did remove a character) p // return that character, : -1; // else the input was invalid. } ``` 

C (gcc), 180 168 159 157 bytes

f(char*s){int j=strlen(s),m=j--/2,p=-1,i=0;for(;p&&i<m;j--,i++)s[i]^s[j]&&(!++p&&(s[i+1]==s[j]&&(p=++i)||s[i]==s[j-1]&&(p=j--+1)));return*s&&p<0?m+1:p?p:-1;} 

Try it online!

2 bytes shaved off thanks to ceilingcat!

f(char *s) { int j = strlen(s), // j = length of input m = j-- / 2, // m = midpoint of string, // j = index of right character p = -1, // p = -1 means no extra character found yet, 0 means invalid input i = 0; // i = index of left character for (; p && i < m; j--, i++)   // loop over the string from both sides, // as long as input is valid. // increment i and decrement j. s[i] ^ s[j] && ( // if (left character != right character) { !++p && ( // if (we didn't remove a character yet) { s[i + 1] == s[j] && ( // if (left+1 char == right char) p = ++i // remove left char, ) || s[i] == s[j - 1] && ( // else if (left char == right-1 char) p = j-- + 1 // remove right char, ) ) // } else the input is invalid. );  // } return *s && p < 0 ? // if (non-zero string and we didn't remove a character yet) m + 1 // return the midpoint character, : p ? // else if (we did remove a character) p // return that character, : -1; // else the input was invalid. } ``` 
Ungolfing is harder than it seems.
Source Link
G. Sliepen
  • 1.3k
  • 9
  • 17
Loading
Avoid unnecessary repetition of `p++`
Source Link
G. Sliepen
  • 1.3k
  • 9
  • 17
Loading
Got rid of `if` and `else`.
Source Link
G. Sliepen
  • 1.3k
  • 9
  • 17
Loading
Source Link
G. Sliepen
  • 1.3k
  • 9
  • 17
Loading