JavaScript, 225 221 212 bajtów
-9 bajtów dzięki Conorowi O'Brienowi
Pamiętaj, że Twoje przypadki tekstowe są ze sobą sprzeczne. Twój pierwszy przypadek testowy zaczyna się na środku spirali. Drugi przypadek testowy rozpoczyna się w górnej środkowej części spirali. Poszedłem z twoim pierwszym przypadkiem testowym, ponieważ był to pierwszy, który widziałem. Nie edytowałeś swojego pytania od ponad roku, przepraszam za domniemanie.
Pierwszy przypadek testowy:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Drugi przypadek testowy:
2<-1<-6
| |
3->4->5
| |
7->8->9
Bez dalszego adiuu, oto kod do gry w golfa. Jestem w 100% pewien, że jeśli społeczność to zepsuje, można to znacznie zmniejszyć. Zwraca tablicę multilinii.
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")
Fragment wstępnego oczyszczania (drukuje ciąg konsoli wielowierszowej na konsoli). Proszę zwrócić uwagę na inne w moim przypadku testowym nr 2 i przypadku testowym OP nr 2 (patrz wyżej, jeśli jeszcze tego nie zrobiłeś):
(jeśli ktoś z większym doświadczeniem z fragmentami chce to naprawić w danych HTML, możesz go edytować, muszę iść spać).
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);
}
Niegolfowane i wyjaśnienie
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;
}