JavaScript, 225 221 212 байт
-9 байтов благодаря Конору О'Брайену
Обратите внимание, что ваши текстовые случаи конфликтуют друг с другом. Ваш первый контрольный пример начинается с середины спирали. Ваш второй контрольный пример начинается с верхней середины спирали. Я пошел с твоим первым тестовым примером, потому что это был первый, который я видел. Вы не редактировали свой вопрос более года, поэтому извините за презумпцию.
Первый тестовый пример:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Второй контрольный пример:
2<-1<-6
| |
3->4->5
| |
7->8->9
Без лишних слов, вот код для игры в гольф. Я на 100% уверен, что если сообщество сделает это, это может быть значительно сокращено. Это возвращает многострочный массив.
s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++}if(!s[i])break}a")
Фрагмент преттификации (выводит многострочную строку на консоль). Обратите внимание на различия в моем тестовом примере № 2 и тестовом сценарии № 2 OP (см. Выше, если вы этого еще не сделали):
(если кто-то с большим опытом работы с фрагментами кода хочет исправить это в HTML-вводе, не стесняйтесь редактировать это, мне нужно идти спать).
f=
s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++;g(a)}if(!s[i])break}a")
//replace argument here to change output
var arr = f("apples appeal");
function g(ar) {
var str = "";
for (x = 0; x < 3; x++) {
for (y = 0; y < 3; y++) {
str += ar[y][x] || " ";
}
str += "\n";
}
console.log(str);
}
Ungolfed и объяснение
f=(input)=>{
//remove spaces
input = input.replace(/ /g, "");
//convert to array (so I can uppercase individual letters)
input = input.split("");
//position in input
var pos = 0;
//positions inside output
var xPos = 1;
var yPos = 1;
//output container (3 rows, 3 columns)
var arr = [[],[],[]];
//counterclockwise indexes for x
var xOrder = "00122210";
//counterclockwise indexes for y
//var yOrder = "12221000"
var yOrder = xOrder * 100 + "";
//loop infinitely (breaks when input[pos] is undefined)
for (;;) {
//loop around circle
for (var i = 0; i < 8; i++) {
if (!input[pos]) {
break;
}
//if item already in array equal next item in input, set next item in input to caps before
if (arr[xPos][yPos] == input[pos]) {
input[pos] = input[pos].toUpperCase();
}
//write or overwrite in array with current from input
arr[xPos][yPos] = input[pos];
//increment last because we do not prime our loops
xPos = xOrder[i];
yPos = yOrder[i];
pos++;
}
if(!input[pos]) {
break;
}
}
return arr;
}