Vẽ từ xoắn ốc [đóng]


11

Kịch bản

Đưa ra một đầu vào của các chữ cái và dấu cách chữ thường ASCII, vẽ một vòng xoắn các ký tự theo dõi đầu vào ban đầu của các ký tự không bao gồm các khoảng trắng.

Những quy định

1) Các nhân vật sẽ xoắn ốc ngược chiều kim đồng hồ sang trái theo kiểu bên ngoài. Nếu rẽ trái là không thể, sau đó di chuyển thẳng.

Given: abcdefg
Output:
  g
baf   
cde   

Ví dụ theo dõi hình ảnh

2) Các ký tự có thể xoắn ốc thành các ký tự trước miễn là quy tắc số 1 không bị vi phạm. Ngoài ra, nếu nhân vật đó bị xoắn ốc vào, thì nhân vật đó bị lật đổ. Khi một nhân vật được cấp trên, nó sẽ ở trên cấp trên bất kể số lần được sử dụng lại.

Given: apples appeal
Output:
PAs
PLe
ea

Hình ảnh ví dụ thứ hai


1
Vậy nếu từ đó cứ lọt vào vòng xoáy nhưng vi phạm ký tự tiếp theo thì chương trình dừng lại?
Matt

Tôi nghĩ điều khiến cho đây là một thử thách tốt là bạn sẽ phải "tua lại ngăn xếp" để nói và tiếp tục tại một điểm khiến quy tắc số 1 luôn hoạt động.
Tim Reddy

5
Các từ ngữ hiện tại làm cho quy tắc 2 dường như hoàn toàn tùy chọn. Nếu nó là bắt buộc thì tôi nghĩ rằng một bộ kiểm tra toàn diện hơn nhiều là cần thiết.
Peter Taylor

1
Đầu ra nên là gì cho đầu vào abcdefghab?
Peter Taylor

Câu trả lời:


2

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;
}

1
a.split("")tương đương với [...a]; s=>{...;return a;}tương đương với s=>eval("...;a")(và ;là tùy chọn trong phiên bản ít chơi gôn hơn); tất cả các dấu chấm phẩy theo sau là một }tùy chọn
Conor O'Brien

@ ConorO'Brien cảm ơn bạn :)
Stephen

Đầu ra nào bạn nhận được cho trường hợp thử nghiệm apples appeal? Tôi đang nhìn thấy ppa eas aLe, điều này chắc chắn không đúng bởi vì không có ai lbên cạnh p.
Peter Taylor

@PeterTaylor đầu ra là chính xác, theo thứ tự xoắn ốc của trường hợp thử nghiệm đầu tiên, mà tôi dựa trên chương trình của tôi. Trường hợp thử nghiệm thứ hai sử dụng một thứ tự xoắn ốc khác nhau (bắt đầu từ trên cùng). Tôi đã thêm một nhật ký cho mỗi lần lặp của đoạn trích. Nhìn vào đó - nó có thể có ý nghĩa hơn.
Stephen

Theo logic của trường hợp thử nghiệm đầu tiên, đầu ra sẽ là eppa apas lple s.
Peter Taylor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.