JavaScript, 225 221 212 байт
-9 байт завдяки Conor O'Brien
Зверніть увагу, що ваші текстові справи суперечать один одному. Ваш перший тестовий випадок починається посередині спіралі. Ваш другий тестовий випадок починається у верхній середині спіралі. Я поїхав із вашим першим тестовим випадком, тому що це був перший, який я побачив. Ви не редагували своє запитання більше року, так що вибачте за презумпцію.
Перший тестовий випадок:
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 ОП (див. Вище, якщо ви ще цього не зробили):
(якщо хтось із більшим досвідом роботи з фрагментами хоче зафіксувати це у введенні 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);
}
Необов’язаний і пояснення
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;
}