JavaScript, 225 221 212 bayt
Conor O'Brien sayesinde -9 bayt
Lütfen metin durumlarınızın birbiriyle çakıştığını unutmayın. İlk test durumunuz spiralin ortasında başlar. İkinci test durumunuz spiralin üst ortasında başlar. İlk test durumunuzla gittim, çünkü ilk gördüğüm durum buydu. Sorunuzu bir yıldan uzun bir süredir düzenlemediniz, varsayım için çok üzgünüm.
İlk Test Durumu:
9<-8<-7
| |
2<-1 6
| |
3->4->5
İkinci Test Durumu:
2<-1<-6
| |
3->4->5
| |
7->8->9
Başka bir şey olmadan, burada golf kodu. Ben topluluk cips eğer bu önemli ölçüde kesilebilir% 100 eminim. Bu, çok satırlı bir dizi döndürür.
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")
Öncelik snippet'i (çok satırlı bir dizeyi konsola yazdırır). Lütfen test durumum # 2 ve OP'nin test durumum # 2'deki farklı notlara dikkat edin (henüz yapmadıysanız yukarıya bakın):
(snippet'lerle daha fazla deneyimi olan biri bunu HTML girişine düzeltmek istiyorsa, bunu düzenlemek için çekinmeyin, yatağa gitmem gerekiyor).
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);
}
Açıklanmamış ve Açıklama
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;
}