JavaScript, 225 221 212 bytes
-9 bytes gracias a Conor O'Brien
Tenga en cuenta que sus casos de texto entran en conflicto entre sí. Su primer caso de prueba comienza en el medio de la espiral. Su segundo caso de prueba comienza en la mitad superior de la espiral. Fui con tu primer caso de prueba, porque fue el primero que vi. No ha editado su pregunta en más de un año, así que disculpe la presunción.
Primer caso de prueba:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Segundo caso de prueba:
2<-1<-6
| |
3->4->5
| |
7->8->9
Sin más adiós, aquí está el código de golf. Estoy 100% seguro de que si la comunidad lo procesa, esto podría reducirse significativamente. Esto devuelve una matriz multilínea.
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")
Fragmento de prettificación (imprime una cadena multilínea en la consola). Tenga en cuenta lo diferente en mi caso de prueba n. ° 2 y en el caso de prueba de OP n. ° 2 (consulte más arriba si aún no lo ha hecho):
(si alguien con más experiencia con fragmentos quiere corregir esto en la entrada HTML, siéntase libre de editar esto, necesito irme a la cama).
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);
}
Sin Golf y Explicación
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;
}
abcdefghab
?