JavaScript, 225 221 212 Bytes
-9 Bytes dank Conor O'Brien
Bitte beachten Sie, dass Ihre Textfälle miteinander in Konflikt stehen. Ihr erster Testfall beginnt in der Mitte der Spirale. Ihr zweiter Testfall beginnt in der oberen Mitte der Spirale. Ich habe Ihren ersten Testfall durchgeführt, weil es der erste war, den ich gesehen habe. Sie haben Ihre Frage seit über einem Jahr nicht mehr bearbeitet. Entschuldigen Sie die Vermutung.
Erster Testfall:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Zweiter Testfall:
2<-1<-6
| |
3->4->5
| |
7->8->9
Hier ist ohne weiteres der Golfcode. Ich bin mir zu 100% sicher, dass dies erheblich reduziert werden könnte, wenn die Community dies tut. Dies gibt ein mehrzeiliges Array zurück.
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")
Prettification-Snippet (druckt eine mehrzeilige Zeichenfolge an die Konsole). Bitte beachten Sie die Unterschiede in meinem Testfall Nr. 2 und dem Testfall Nr. 2 von OP (siehe oben, falls Sie dies noch nicht getan haben):
(Wenn jemand mit mehr Erfahrung mit Snippets dies in HTML-Eingaben korrigieren möchte, kann er dies gerne bearbeiten. Ich muss ins Bett gehen.)
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 und Erklärung
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;
}