JavaScript, 225 221 212 byte
-9 byte nhờ Conor O'Brien
Xin lưu ý rằng các trường hợp văn bản của bạn xung đột với nhau. Trường hợp thử nghiệm đầu tiên của bạn bắt đầu ở giữa xoắn ốc. Trường hợp thử nghiệm thứ hai của bạn bắt đầu ở giữa trên cùng của xoắn ốc. Tôi đã đi với trường hợp thử nghiệm đầu tiên của bạn, bởi vì đó là trường hợp đầu tiên tôi nhìn thấy. Bạn đã không chỉnh sửa câu hỏi của bạn trong hơn một năm, rất xin lỗi vì sự giả định này.
Trường hợp thử nghiệm đầu tiên:
9<-8<-7
| |
2<-1 6
| |
3->4->5
Trường hợp thử nghiệm thứ hai:
2<-1<-6
| |
3->4->5
| |
7->8->9
Không có thêm quảng cáo, đây là mã golf. Tôi chắc chắn 100% rằng nếu cộng đồng sứt mẻ thì điều này có thể bị cắt giảm đáng kể. Điều này trả về một mảng nhiều dòng.
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")
Đoạn mã giới thiệu (in một chuỗi nhiều dòng đến bàn điều khiển). Vui lòng lưu ý sự khác nhau trong trường hợp thử nghiệm số 2 của tôi và trường hợp thử nghiệm số 2 của OP (xem bên trên nếu bạn chưa có):
(nếu ai đó có nhiều kinh nghiệm hơn với đoạn trích muốn sửa lỗi này thành đầu vào HTML, vui lòng chỉnh sửa phần này, tôi cần đi ngủ).
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);
}
Ung dung và giải thích
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;
}