14 명이 몇 명이나 올라 갔습니까?


13

등산 용어에서 "14er"는 높이가 14,000 피트 이상인 모든 산입니다. 그러나 또 다른 차이점이 있습니다. 피크가 14er로 계산 되려면 300 피트 이상의 "지리적 두드러짐"도 있어야합니다. 이것은 14er에서 다른 14er로 이동하려면 다시 상승하기 전에 적어도 300 피트를 내려야한다는 것을 의미 합니다. 이 예제를 보자. 1 행은 14,000 피트로 계산되며 각 선은 100 피트로 계산됩니다.

  /\__/\  
 /      \ 
/        \

이제이 두 피크는 계산하기에 충분한 고도를 갖지만 두 개의 개별 피크로 계산할 수있을 정도로 높이가 충분히 떨어지지 않습니다. 따라서이 중 하나는 14er로 간주되고 다른 하나는 "부분 피크"입니다. 다음은 두 피크가 두 개의 개별 14er로 계산되는 예입니다.

   /\    /\   
  /  \  /  \  
 /    \/    \ 
/            \

두 14ers 사이의 감소에 부분적으로 피크가있을 수 있습니다. 마지막 산맥의 약간 수정 된 버전은 다음과 같습니다.

   /\      /\   
  /  \/\  /  \  
 /      \/    \ 
/              \

이 산맥은 2 명의 14ers로 계산됩니다.

당신은 산맥을 아스키 아트로 표현하는 프로그램이나 함수를 작성하고 그 범위에있는 14ers의 수를 반환해야합니다. 2D 문자 배열, 줄 바꿈이 포함 된 문자열 또는 다른 구분 기호가있는 문자열 등 가장 편리한 형식으로 입력 할 수 있습니다. 모든 입력에 문자 만 포함되고 /\_각 행의 길이가 동일 하다고 가정 할 수 있습니다 (후행 공백 포함). 또한 산맥이 왼쪽 하단에서 a /또는 a로 시작한다고 가정 할 수 있습니다 _.

산의 마지막 부분이 결론에 없으면 산이 그 후에 만 ​​감소한다고 가정 할 수 있습니다.

  /
 /
/

단일 14er로 계산됩니다.

유효하지 않은 산맥을 다룰 필요는 없습니다.

다음은 샘플 I / O입니다.

         /\___/\_             
        /        \    /\      
       /          \  /  \     
   _/\/            \/    \    
  /                       \   
 /                         \  
/                           \_

2

                  /\    /\
         /\      /  \  /  
  /\    /  \    /    \/   
 /  \  /    \  /          
/    \/      \/           

4

       /\                 
 _/\__/  \                
/         \               

1

      /\                  
     /  \   /\            
    /    \_/  \           
   /           \          
  /             \         
 /               \        
/                 \       

1

              /\          
    /\_/\    /  \_        
   /     \  /     \     /\
  /       \/       \   /  
 /                  \_/   
/                         

3

따라서 출발 선은 14,000 피트로 계산됩니까?
R. Kap

@ R.Kap 예, 출발 선을 말할 때 결론을 의미한다고 가정하면 맞습니다.
Alex A.

1
_같은 줄의 슬래시보다 100 피트가 작은 곳을 언급해야 합니다. 적어도 그것이 마지막 테스트 사례가 제안하는 것입니다.
Martin Ender

3
사양이 얇아 보입니다 ... 우리는 평평한 이탄을 가질 수 / / / _ \ \ \ 있습니까? 또한 입력에서 가장 높은 지점이 항상 피크로 계산되어야하지만 이것이 명시 적으로 지정되지 않았다고 가정합니다. 하나는 더 낮은 피크에서 시작하여 다른 카운트로 끝날 수 있습니다.
feersum

2
항상 지속됩니까? 각 열마다 최대 하나의 비 공백 문자가 있습니까?
Leaky Nun

답변:


2

자바 스크립트 (ES6), 133 바이트

s=>[...s].map((_,i)=>(c=s[i%h*w+i/h|0])=="/"?++a>2&&(p+=!d,d=a=3):c=="\\"&&--a<1&&(d=a=0),w=s.search`
`+1,h=-~s.length/w,a=3,d=p=1)|p

설명

사양이 명확하게 명시되어 있지 않기 때문에 몇 가지 가정이 있습니다.

  • 결론은 14,000 피트 (그리드상의 모든 위치는 피크로 계산하기에 충분히 높음)입니다.
  • 그리드는 첫 번째 피크에서 시작하거나 오름차순으로 시작합니다 (이전 가정에 따라 이미 최소 14,000 피트 높이이므로).
  • 별도의 피크는 300ft 내린 후 300ft 를 오름차순으로 계산됩니다 .

c각 열의 문자 를 반복합니다 (특히 문자를 찾을 때까지 각 열을 반복합니다). 현재 고도는에 저장됩니다 a. 최소 0및 최대로 고정됩니다 3. 다음 피크를 계산하기 위해 이동하는 방향은 d( false= up, true= down)에 저장됩니다 . 경우 a에 도달 3하고 d있다 false, 피크의 수는 p증가되어 d설정된다 true(아래). 일단 a도달 0, d로 설정 돌아 false(최대).

var solution =

s=>
  [...s].map((_,i)=>   // loop
    (c=s[i%h*w+i/h|0]) // c = current character (moves down columns)
    =="/"?             // if c is '/'
      ++a>2&&          // increment a, if a equals 3 and d is true:
        (p+=!d,d=a=3)  // increment p, set d to true, clamp a to 3
    :c=="\\"&&         // if c is '\':
      --a<1&&          // decrement a, if a equals 0:
        (d=a=0),       // set d to false, clamp a to 0
    
    // Initialisation (happens BEFORE the above code)
    w=s.search`\n`+1,  // w = grid width
    h=-~s.length/w,    // h = grid height
    a=3,               // a = current altitude (min = 0, max = 3)
    d=                 // d = required direction (false = up, true = down)
    p=1                // p = number of found peaks
  )|p                  // output the number of peaks

var testCases = [`
/\\
`,`
/\\          
  \\         
   \\    /\\  
    \\  /  \\ 
     \\/    \\
`,`
\\    /
 \\  / 
  \\/  
`,`
            /\\            
         /\\/  \\/\\         
      /\\/        \\/\\      
   /\\/              \\/\\   
/\\/                    \\/\\
`,`
  /\\__/\\
 /      \\
/        \\
`,`
   /\\    /\\   
  /  \\  /  \\  
 /    \\/    \\ 
/            \\
`,`
   /\\      /\\   
  /  \\/\\  /  \\  
 /      \\/    \\ 
/              \\
`,`
         /\\___/\\_             
        /        \\    /\\      
       /          \\  /  \\     
   _/\\/            \\/    \\    
  /                       \\   
 /                         \\  
/                           \\_
`,`
                  /\\    /\\
         /\\      /  \\  /  
  /\\    /  \\    /    \\/   
 /  \\  /    \\  /          
/    \\/      \\/           
`,`
       /\\                 
 _/\\__/  \\                
/         \\               
`,`
      /\\                  
     /  \\   /\\            
    /    \\_/  \\           
   /           \\          
  /             \\         
 /               \\        
/                 \\       
`,`
              /\\          
    /\\_/\\    /  \\_        
   /     \\  /     \\     /\\
  /       \\/       \\   /  
 /                  \\_/   
/                         
`];
result.textContent = testCases.map(c=>c+"\n"+solution(c.slice(1,-1))).join`\n\n`;
<textarea id="input" rows="6" cols="40"></textarea><br /><button onclick="result.textContent=solution(input.value)">Go</button><pre id="result"></pre>


2

C, 174 바이트

a[99],c,p,j,M,m;main(i){for(i=j=1;c=getchar(),~c;i++)c<11?a[i]=j++,i=0:c&4?a[i]=j:0;for(m=j;c=a[i++];c>a[i-2]?M-m>1&&c-m>1?M=c,m=j,p++:M<c?M=m=c:M:m>c?m=c:0);printf("%d",p);}

입력에 후행 줄 바꿈이 필요합니다. 그렇지 않으면 +4 바이트입니다.


1

자바 스크립트 (ES6), 154 바이트

s=>s.split`\n`.map((s,i)=>s.replace(/\S/g,(c,j)=>{e[j]=i+(c!='\\');e[j+1]=i+(c>'/')}),e=[])&&e.map(n=>h-n+d?h-n-d*3?0:(c++,d=-d,h=n):h=n,h=e[0],c=d=1)|c>>1

어디 \n리터럴 개행 문자를 나타냅니다. 언 골프 드 :

function climb(string) {
    var heights = [];
    // Split the array into lines so that we know the offset of each char
    var array = string.split("\n");
    // Calculate the height (actually depth) before and after each char
    for (var i = 0; i < array.length; i++) {
        for (var j = 0; j < string.length; j++) {
            switch (array[i][j]) {
            case '\':
                heights[j] = i;
                heights[j+1] = i + 1;
                break;
            case '_':
                heights[j] = i + 1;
                heights[j+1] = i + 1;
                break;
            case '/':
                heights[j] = i + 1;
                heights[j+1] = i;
                break;
        }
    }
    var count = 1;
    // Start by looking for an upward direction
    var direction = 1;
    var height = heights[0];
    for (var k = 1; k < heights.length; k++) {
        if (heights[i] == height - direction * 3) { // peak or trough
            direction *= -1;
            count++; // we're counting changes of direction = peaks * 2
            height = heights[i];
        } else if (heights[i] == height + direction) {
            // Track the current peak or trough to the tip or base
            height = heights[i];
        }
    }
    return count >> 1;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.