Java

Как решить данную задачу с Codewars?

Пол часа не могу решить.

Нужно зашифровать каждое слово в тексте по заданным правилам:
• Первая буква должна быть преобразована в ее код ASCII;
• Вторая буква должна быть заменена последней буквой.
In:
"A wise old owl lived in an oak"
Ou:
"65 119esi 111dl 111lw 108dvei 105n 97n 111ka"

public static String encryptThis(String text) {
    // you're code goes here
}

Задача уровня сложности 6 kyu.
[https://www.codewars.com/kata/5848565e273af816fb000449/train/java]

Объясните мне, как это решить, ведь просто "присваивать" там не получиться.
import java.util.Objects;

import static java.util.Arrays.stream;
import static java.util.stream.Collectors.joining;

public class Kata {

public static void main(String[] args) {
System.out.println(Objects.equals("", Kata.encryptThis("")));
System.out.println(Objects.equals("65 119esi 111dl 111lw 108dvei 105n 97n 111ka", Kata.encryptThis("A wise old owl lived in an oak")));
System.out.println(Objects.equals("84eh 109ero 104e 115wa 116eh 108sse 104e 115eokp", Kata.encryptThis("The more he saw the less he spoke")));
System.out.println(Objects.equals("84eh 108sse 104e 115eokp 116eh 109ero 104e 104dare", Kata.encryptThis("The less he spoke the more he heard")));
System.out.println(Objects.equals("87yh 99na 119e 110to 97ll 98e 108eki 116tah 119esi 111dl 98dri", Kata.encryptThis("Why can we not all be like that wise old bird")));
System.out.println(Objects.equals("84kanh 121uo 80roti 102ro 97ll 121ruo 104ple", Kata.encryptThis("Thank you Piotr for all your help")));
}

public static String encryptThis(String text) {
return stream(text.split(" "))
.map(s -> {
if (s.isEmpty()) {
return s;
}
if (s.length() == 1) {
return "" + (int) s.charAt(0);
} else if (s.length() == 2) {
return "" + (int) s.charAt(0) + s.charAt(1);
}
return "" + (int) s.charAt(0) + s.charAt(s.length() - 1) + s.substring(2, s.length() - 1) + s.charAt(1);
})
.collect(joining(" "));
}
}
АМ
Андрей Макеев
55 095
Лучший ответ
Михаил Никонов Круто!
А почему мой не работает и выдаёт ошибку?
Вместо substring я использовал цикл while.
В Джаве не особо разбираюсь, я больше по Javascript. На нем и попробовал это решить ради интереса. Хотя знаю что Codewars вроде сервис суровый и задачи там обычно сложные. Но с этой справился без особых проблем
>>>
let s = "A wise old owl lived in an oak".split(' ');
for (var i = 0; i < s.length; i++) {
t1 = s[i].charCodeAt(0);
s[i] = s[i].split('');
for (var k = 0; k < s[i].length; k++) {
s[i][0] = t1;
if (typeof s[i][1] === 'undefined') {
break;
}
else {
t = s[i][1];
s[i][1] = s[i][s[i].length - 1];
s[i][s[i].length - 1] = t;
}
};
console.log(s[i]);
s[i] = s[i].join('');
};
alert(s.join(' '))
>>>
Результат:
65 119ise 111dl 111lw 108dvei 105n 97n 111ka
>>>
Только почему 119ise? Не должно такого быть...
Есть повод еще помозговать...
Можно создать StringBuilder и у него делать append.
Либо использовать регулярные выражения с заменой, а результат замены складывать в StringBuffer.
Агиевич Андрей
Агиевич Андрей
84 664
навскидку я бы пробовал примерно так:
1. распарсить строку в массив слов используя пробел как разделитель + наверно еще спецсимволы
2. Каждое слово преобразовать в отдельный массив и работать с ним циклом форич
3. Ну а внутри этого цикла уже работать с первым и вторым символов
Михаил Никонов Спасибо за идею. Попробую.