나선형 단어 그리기 [닫기]


11

시나리오

ASCII 소문자와 공백을 입력하면 공백을 제외한 문자의 원래 입력을 추적하는 나선 문자를 그립니다.

규칙

1) 문자는 바깥쪽으로 반 시계 방향으로 왼쪽으로 나선 모양이어야합니다. 좌회전이 불가능한 경우에는 직진하십시오.

Given: abcdefg
Output:
  g
baf   
cde   

이미지 추적 첫 번째 예

2) 규칙 # 1을 위반하지 않는 한 문자는 이전 문자로 나선형이 될 수 있습니다. 또한 해당 문자가 나선형이면 해당 문자가 대문자입니다. 문자를 대문자로 바꾸면 재사용 횟수와 상관없이 대문자로 유지됩니다.

Given: apples appeal
Output:
PAs
PLe
ea

이미지 추적 두 번째 예


1
단어가 나선을 유지하지만 다음 문자를 위반하면 프로그램이 중지됩니까?
Matt

이것이 좋은 과제는 규칙 # 1이 항상 작동하도록하는 시점에서 말을하고 다시 시작하기 위해 "스택을 되감기"해야한다고 생각합니다.
Tim Reddy

5
현재의 문구는 규칙 2를 완전히 선택적으로 보이게합니다. 강제적이어야한다면 훨씬 더 포괄적 인 테스트 스위트가 필요하다고 생각합니다.
피터 테일러

1
출력은 무엇을 입력 abcdefghab해야합니까?
피터 테일러

답변:


2

자바 스크립트, 225 (221) 212 바이트

Conor O'Brien 덕분에 -9 바이트

텍스트 사례가 서로 충돌합니다. 첫 번째 테스트 사례는 나선형 중간에서 시작합니다. 두 번째 테스트 사례는 나선형의 상단 가운데에서 시작됩니다. 내가 처음 본 것이기 때문에 첫 테스트 케이스와 함께 갔다. 1 년 이상 질문을 수정하지 않았으므로 추정에 대해 죄송합니다.

첫 번째 테스트 사례 :

9<-8<-7
|     |
2<-1  6
|     |
3->4->5

두 번째 테스트 사례 :

2<-1<-6
|     |
3->4->5
|     |
7->8->9

추가 정보가 없으면 골프 코드가 있습니다. 커뮤니티가 칩을 쌓으면 크게 줄어들 수 있다고 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")

미리보기 스 니펫 (여러 줄 문자열을 콘솔에 인쇄) 테스트 사례 # 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);
}

언 골프 및 설명

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옆에 p의.
피터 테일러

@ PeterTaylor 내 프로그램을 기반으로 한 첫 번째 테스트 사례의 나선형 순서에 따라 출력이 정확합니다. 두 번째 테스트 사례는 다른 나선형 순서를 사용합니다 (위에서 시작). 스 니펫의 각 반복에 대한 로그를 추가했습니다. 저것 좀보세요-좀 더 이해가 되겠네요.
Stephen

첫 번째 테스트 사례의 논리에 따라 출력은 다음과 같습니다 eppa apas lple s.
피터 테일러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.