วาดคำเกลียว [ปิด]


11

สถานการณ์

กำหนดอินพุตของตัวอักษรและช่องว่าง ASCII ให้วาดเกลียวของอักขระที่ติดตามอินพุตต้นฉบับของอักขระที่ไม่รวมช่องว่าง

กฎระเบียบ

1) ตัวละครต้องหมุนทวนเข็มนาฬิกาไปทางซ้ายในลักษณะภายนอก หากไม่สามารถเลี้ยวซ้ายให้ย้ายไปทางตรง

Given: abcdefg
Output:
  g
baf   
cde   

ตัวอย่างการติดตามรูปภาพก่อน

2) อักขระสามารถหมุนวนเป็นอักขระก่อนหน้าได้ตราบใดที่กฎ # 1 ไม่ถูกละเมิด ยิ่งไปกว่านั้นถ้าตัวละครตัวนั้นหมุนวนไปแล้วตัวละครนั้นก็จะเป็นตัวพิมพ์ใหญ่ เมื่อตัวละครตัวใหญ่มันจะยังคงตัวพิมพ์ใหญ่โดยไม่คำนึงถึงจำนวนครั้งที่มันถูกนำมาใช้ใหม่

Given: apples appeal
Output:
PAs
PLe
ea

ตัวอย่างการติดตามรูปภาพที่สอง


1
ดังนั้นหากคำที่เก็บไว้ในเกลียว แต่ละเมิดตัวละครต่อไปแล้วโปรแกรมจะหยุด?
แมตต์

ฉันคิดว่าสิ่งที่ทำให้สิ่งนี้เป็นความท้าทายที่ดีคือคุณจะต้อง "กรอย้อนกลับ" เพื่อพูดและดำเนินการต่อในจุดที่ทำให้กฎ # 1 ทำงานได้เสมอ
Tim Reddy

5
การใช้ถ้อยคำปัจจุบันทำให้กฎ 2 ดูเหมือนเป็นทางเลือกโดยสิ้นเชิง ถ้าเป็นภาคบังคับฉันก็คิดว่าจำเป็นต้องมีชุดทดสอบที่ครอบคลุมมากขึ้น
Peter Taylor

1
เอาต์พุตควรเป็นอินพุตabcdefghabใด
Peter Taylor

คำตอบ:


2

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

1
a.split("")เทียบเท่ากับ[...a]; s=>{...;return a;}เทียบเท่ากับs=>eval("...;a")(และ;เป็นตัวเลือกในเวอร์ชัน golfed น้อยกว่า); เครื่องหมายอัฒภาคทั้งหมดตามด้วยเป็น}ตัวเลือก
Conor O'Brien

@ ConorO'Brien ขอบคุณ :)
Stephen

สิ่งใดที่คุณส่งออกได้รับกรณีทดสอบapples appeal? ฉันเห็นppa eas aLeซึ่งแน่นอนไม่ถูกต้องเพราะไม่มีlติดกับps
Peter Taylor

@PeterTaylor ผลลัพธ์ถูกต้องตามลำดับการหมุนวนของกรณีทดสอบครั้งแรกซึ่งฉันใช้โปรแกรมเป็นพื้นฐาน กรณีทดสอบที่สองใช้ลำดับการหมุนวนที่แตกต่างกัน (เริ่มที่ด้านบน) ฉันเพิ่มบันทึกสำหรับตัวอย่างซ้ำแต่ละครั้ง ดูที่ - มันอาจทำให้รู้สึกมากขึ้น
Stephen

eppa apas lple sโดยตรรกะของกรณีการทดสอบครั้งแรกการส่งออกจะเป็น
Peter Taylor
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.