JavaScript, 225 221 212 ไบต์
-9 ไบต์ขอบคุณ Conor O'Brien
โปรดทราบว่ากรณีข้อความของคุณขัดแย้งกัน กรณีทดสอบแรกของคุณเริ่มต้นที่ตรงกลางของเกลียว กรณีทดสอบที่สองของคุณเริ่มต้นที่ตรงกลางด้านบนของเกลียว ฉันไปกับกรณีทดสอบครั้งแรกของคุณเพราะเป็นกรณีแรกที่ฉันเห็น คุณยังไม่ได้แก้ไขคำถามของคุณในหนึ่งปีดังนั้นจึงขออภัยในข้อสันนิษฐาน
กรณีทดสอบครั้งแรก:
9<-8<-7
| |
2<-1 6
| |
3->4->5
กรณีทดสอบที่สอง:
2<-1<-6
| |
3->4->5
| |
7->8->9
โดยไม่ต้องลาก่อนเพิ่มเติมนี่คือรหัส golfed ฉันมั่นใจ 100% ว่าถ้าชุมชนชิปมันอาจจะถูกตัดอย่างมีนัยสำคัญ ส่งคืนอาร์เรย์หลายบรรทัด
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")
Prettification snippet (พิมพ์สตริงหลายบรรทัดไปยังคอนโซล) โปรดทราบความแตกต่างในกรณีทดสอบของฉัน # 2 และกรณีทดสอบของ OP # 2 (ดูด้านบนหากคุณยังไม่มี):
(ถ้าคนที่มีประสบการณ์มากกว่ากับตัวอย่างต้องการแก้ไขสิ่งนี้ในการป้อนข้อมูล HTML อย่าลังเลที่จะแก้ไขสิ่งนี้ฉันต้องเข้านอน)
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);
}
Ungolfed และคำอธิบาย
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;
}