Страницы

Поиск по вопросам

понедельник, 10 декабря 2018 г.

Упростить код до 5 строк

Можно ли упростить этот код до 5 строк (вопрос из собеседования на позицию senior javascript developer)?:
function func(s, a, b) { var match_empty=/^$/ ; if (s.match(match_empty)) { return -1; } else { var i=s.length-1; var aIndex=-1; var bIndex=-1; while ((aIndex==-1) && (bIndex==-1) && (i>=0)) { if (s.substring(i, i+1) == a) aIndex=i; if (s.substring(i, i+1) == b) bIndex=i; i--; } if (aIndex != -1) { if (bIndex == -1) return aIndex; else return Math.max(aIndex, bIndex); } else { if (bIndex != -1) return bIndex; else return -1; } } };


Ответ

Навскидку, вроде бы, вот так можно «упростить»:
function func(s, a, b) { return Math.max( s.lastIndexOf(a), s.lastIndexOf(b)); }
Но это не правильно обработает случаи с пустыми строками в a или b. Поэтому:
upd. с тестами
function funcSergiks(s, a, b) { return Math.max( (a.length ? s.lastIndexOf(a) : -1), (b.length ? s.lastIndexOf(b) : -1) ) } // --------------------------------------- function func(s, a, b) { var match_empty = /^$/; if (s.match(match_empty)) { return -1; } else { var i = s.length - 1; var aIndex = -1; var bIndex = -1; while ((aIndex == -1) && (bIndex == -1) && (i >= 0)) { if (s.substring(i, i + 1) == a) aIndex = i; if (s.substring(i, i + 1) == b) bIndex = i; i--; } if (aIndex != -1) { if (bIndex == -1) return aIndex; else return Math.max(aIndex, bIndex); } else { if (bIndex != -1) return bIndex; else return -1; } } }; var tests = [ [ ['google', 'g', 'o'], 3 ], [ ['aba', 'a', 'b'], 2 ], [ ['', 'g', 'o'], -1 ], [ ['google', 'x', 'o'], 2 ], [ ['aba', '', ''], -1 ], [ ['aba', 'a', ''], 2 ], [ ['aba', '', 'b'], 1 ], [ ['aba', 'a', 'b'], 2 ], ]; tests.forEach(test => { var a = func.apply(this, test[0]); var b = funcSergiks.apply(this, test[0]); console.log(a == b && b == test[1] ? "PASSED" : "FAILED", JSON.stringify(test), a, b); });

Комментариев нет:

Отправить комментарий