Draw Spiral Words [ditutup]

11

Skenario

Diberikan input ASCII huruf kecil dan spasi, gambar spiral karakter yang melacak input asli karakter tanpa spasi.

Aturan

1) Karakter akan berputar berlawanan arah jarum jam ke kiri secara lahiriah. Jika belok kiri tidak memungkinkan, maka gerakkan lurus.

Given: abcdefg
Output:
  g
baf   
cde   

Penelusuran gambar contoh pertama

2) Karakter dapat berubah menjadi karakter sebelumnya selama aturan # 1 tidak dilanggar. Juga, jika karakter itu berputar ke dalam, maka karakter itu ditulis dengan huruf besar. Setelah karakter ditulis dalam huruf besar, itu akan tetap menjadi huruf besar terlepas dari berapa kali itu digunakan kembali.

Given: apples appeal
Output:
PAs
PLe
ea

Contoh gambar tracing kedua

Tim Reddy
sumber
1
Jadi, jika kata terus spiral tetapi melanggar karakter selanjutnya maka program berhenti?
Matt
Saya pikir apa yang membuat ini tantangan yang bagus adalah Anda harus "memutar balik tumpukan" agar dapat berbicara dan melanjutkan pada titik yang membuat aturan # 1 selalu berfungsi.
Tim Reddy
5
Kata-kata saat ini membuat aturan 2 tampak sepenuhnya opsional. Jika harus wajib maka saya pikir test suite yang jauh lebih komprehensif diperlukan.
Peter Taylor
1
Apa yang seharusnya menjadi input untuk input abcdefghab?
Peter Taylor

Jawaban:

2

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;
}
Stephen
sumber
1
a.split("")setara dengan [...a]; s=>{...;return a;}setara dengan s=>eval("...;a")(dan ;opsional dalam versi yang kurang golf); semua titik koma diikuti oleh }adalah opsional
Conor O'Brien
@ ConorO'Brien terima kasih :)
Stephen
Output apa yang Anda dapatkan untuk test case apples appeal? Saya melihat ppa eas aLe, yang pasti tidak benar karena tidak ada di lsebelah ps.
Peter Taylor
@PeterTaylor hasilnya benar, sesuai dengan urutan spiral dari test case pertama, yang menjadi dasar program saya. Kasing uji kedua menggunakan urutan spiral yang berbeda (dimulai dari atas). Saya menambahkan log untuk setiap iterasi cuplikan. Lihat itu - mungkin lebih masuk akal.
Stephen
Dengan logika kasus uji pertama hasilnya akan eppa apas lple s.
Peter Taylor