JavaScript, 225 221 212 byte
-9 byte berkat Conor O'Brien
Harap perhatikan bahwa kasus teks Anda saling bertentangan. Kasing uji pertama Anda dimulai di tengah spiral. Kasing uji kedua Anda dimulai di tengah atas spiral. Saya pergi dengan test case pertama Anda, karena itu yang pertama saya lihat. Anda belum mengedit pertanyaan Anda lebih dari setahun, maaf atas anggapannya.
Kasus Tes pertama:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Kasus Uji Kedua:
2<-1<-6
| |
3->4->5
| |
7->8->9
Tanpa kata perpisahan lebih lanjut, ini kode golfnya. Saya 100% yakin bahwa jika komunitas chip ini, ini dapat dipotong secara signifikan. Ini mengembalikan array multiline.
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")
Cuplikan prettification (mencetak string multiline ke konsol). Harap perhatikan perbedaan dalam uji kasus saya # 2 dan uji kasus OP # 2 (lihat di atas jika Anda belum melakukannya):
(jika seseorang yang lebih berpengalaman dengan snippet ingin memperbaikinya menjadi input HTML, silakan mengedit ini, saya harus tidur).
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);
}
Tidak Disatukan dan Penjelasan
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;
}