JavaScript, 225 221 212 octets
-9 octets grâce à Conor O'Brien
Veuillez noter que vos cas de texte sont en conflit les uns avec les autres. Votre premier cas de test commence au milieu de la spirale. Votre deuxième test élémentaire commence au milieu supérieur de la spirale. Je suis allé avec votre premier cas de test, car c'était le premier que j'ai vu. Vous n'avez pas modifié votre question depuis plus d'un an, alors désolé pour la présomption.
Premier cas de test:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Deuxième cas de test:
2<-1<-6
| |
3->4->5
| |
7->8->9
Sans plus tarder, voici le code du golf. Je suis sûr à 100% que si la communauté réussit, cela pourrait être considérablement réduit. Cela renvoie un tableau multiligne.
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")
Extrait de simplification (imprime une chaîne multiligne sur la console). Veuillez noter les différents dans mon cas de test # 2 et le cas de test OP # 2 (voir ci-dessus si vous ne l'avez pas déjà fait):
(si quelqu'un ayant plus d'expérience avec les extraits de code souhaite corriger cela en entrée HTML, n'hésitez pas à le modifier, je dois me coucher).
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);
}
Non golfé et explication
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;
}