JavaScript, 225 221 212 byte
-9 byte grazie a Conor O'Brien
Si noti che i casi di testo sono in conflitto tra loro. Il tuo primo caso di test inizia nel mezzo della spirale. Il tuo secondo test case inizia nella parte superiore centrale della spirale. Sono andato con il tuo primo caso di test, perché è stato il primo che ho visto. Non hai modificato la tua domanda da oltre un anno, quindi mi dispiace per la presunzione.
Primo caso di test:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Secondo caso di prova:
2<-1<-6
| |
3->4->5
| |
7->8->9
Senza ulteriori indugi, ecco il codice golf. Sono sicuro al 100% che se la community chip questo potrebbe essere ridotto in modo significativo. Ciò restituisce un array multilinea.
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")
Snippet di prettificazione (stampa una stringa multilinea su console). Notare le differenze nel mio caso di test n. 2 e nel caso di test n. 2 di OP (vedi sopra se non lo hai già fatto):
(se qualcuno con più esperienza con i frammenti vuole sistemarlo nell'input HTML, sentiti libero di modificarlo, devo andare a letto).
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 e spiegazione
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;
}