샌드 파일 정수


18

도전

n입력 으로 양의 정수가 제공 됩니다. 출력은 아래에 지정된 규칙에 따라 만들어진 피라미드 형 샌드 파일이어야합니다.

  • 각 정수는 모래가 원뿔 모양으로 떨어지는 것처럼 같은 초기 시작점에서 아래로 내려갑니다.
  • 샌드 파일에 부딪쳤을 때 바로 아래 숫자보다 큰 숫자는 가능한 경우 오른쪽으로 떨어집니다.
  • 샌드 파일을 칠 때 바로 아래 숫자보다 적은 숫자는 가능하면 왼쪽으로 떨어집니다.
  • 샌드 파일을 칠 때 바로 아래 숫자와 같은 숫자가 그대로 유지됩니다.
  • 숫자가 각각 왼쪽 / 오른쪽으로 이동하면 왼쪽 / 오른쪽으로 떨어질 수 있습니다. 즉, 방향에 따라 좌우 아래에 이미 숫자가있는 경우 현재 떨어지는 숫자는 이동하지 않습니다.
  • 다음 위치로 이동할 수 없거나 바닥에 닿을 때까지 숫자가 계속해서 샌드 파일을 넘어 뜨립니다.

노트

초기 비교 점검은 처음 접한 정수에만 적용되며, 각 연속 발생이 샌드 파일을 넘어 질 때마다 발생하지 않습니다.

후행 공백은 괜찮지 만 후행 줄 바꿈은 그렇지 않습니다.

샌드 파일의 구조를 보존해야하는 경우를 제외하고 선행 공간이나 줄 바꿈이 없습니다.

완전한 프로그램이나 기능을 작성할 수 있습니다.

입력에 일부 조합 만 포함되어 있다고 가정 할 수 있습니다 [0-9].

이것은 이며 가장 짧은 바이트 단위의 코드 는 3 월 Ides에 의해 승자로 표시됩니다.

1

1


12345

35
124


54321

 13
245


555444333222111

    2
    2
    2
  135
 1345
13445


111222333444555

4
4
4
135
1235
12235


7313623030872935273465247457435345345350

    3
    3
    3
    3
    34
    355
    3644
   239475
  201277445
020373685575

555444333222111세 번째 4가 첫 번째로 남는 실수 4입니까?
andlrc

@ dev-null 숫자는 가능한 한 계속 '회전'합니다. 기억할 수있는 한, 크거나 작거나 같음 확인은 첫 번째 만남에만 적용됩니다.
CzarMatt

답변:


4

자바 스크립트 (ES6) 260 208 바이트

s=>[...s].map(c=>a[g(n,(c>(l=a[n].slice(-1)))-(c<l))]+=c,n=s.length,a=Array(n+n).fill(''),g=(i,d)=>a[i].length>a[i+d].length?g(i+d,d):n)&&[...a[n]].map((_,i)=>a.map(c=>c?c[i]||' ':c).join``).reverse().join`\n`

편집 : 첫 번째 문자가 특별한 경우가 아니라는 것을 인식하여 25 바이트를 절약했습니다. 문자 배열 대신 문자열 배열을 사용하여 15 바이트를 절약했습니다. 리터럴 \n(표시되지 않음) 사용을 포함하여 기타 수정 사항으로 12 바이트를 저장했습니다 . 전체 20 % 더 짧아집니다! 제거하고 싶었지만 reverse비용을로 대체 map하여 절약 할 수있는 것보다 더 많은 비용이 듭니다 replace.

언 골프 드 :

function sandpile(str) {
    var arr = new Array(str.length * 2); // max width of sandpile is approx. 2√n but this is close enough
    for (i = 0; i < arr.length; i++) arr[i] = '';
    for (i = 0; i < str.length; i++) {
        var digit = str[i];
        var pos = str.length; // start dropping here
        if (digit < str[pos][str[pos].length - 1]) {
            while (str[pos - 1].length < str[pos].length) pos--;
        } else if (digit > str[pos][str[pos].length - 1]) {
            while (str[pos + 1].length < str[pos].length) pos++;
        }
        str[pos] += digit; // drop the digit
    }
    var len = arr[str.length].length; // final height
    // remove the unused columns, and then pad the columns with spaces for the transpose
    for (i = 0; i < arr.length; ) {
        if (!arr[i]) arr.splice(i, 1);
        else arr[i++] += ' '.repeat(len);
    }
    ans = '';
    for (i = len; i-- > 0; ) {
        for (j = 0; j < arr.length; j++) ans += arr[j][i];
        ans += '\n';
    }
    return ans;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.