ฉันปีนขึ้นไปได้เท่าไหร่


13

ในคำศัพท์การปีนเขา "14er" เป็นภูเขาใด ๆ ที่มีระดับความสูง 14,000 ฟุตขึ้นไป อย่างไรก็ตามมีความแตกต่างอื่น สำหรับจุดสูงสุดที่จะนับเป็น 14er ก็จะต้องมี "ความโดดเด่นทางภูมิศาสตร์" 300 หรือมากกว่าฟุต ซึ่งหมายความว่าหากต้องการย้ายจากที่หนึ่งไปอีกที่หนึ่ง 14er คุณต้องลงมาอย่างน้อย 300 ฟุตก่อนจะลุกขึ้นอีกครั้ง นำตัวอย่างนี้ บรรทัดที่ 1 นับเป็น 14,000 ฟุตและแต่ละบรรทัดนับเป็น 100 ฟุต

  /\__/\  
 /      \ 
/        \

ตอนนี้ยอดเขาทั้งสองนี้มีระดับความสูงพอที่จะนับได้ แต่ไม่มีระดับความสูงที่ลดลงระหว่างพวกเขาที่จะนับเป็นยอดเขาสองแยก ดังนั้นหนึ่งในจำนวนเหล่านี้นับเป็น 14er และอีกอันหนึ่งเป็นเพียง "ยอดบางส่วน" นี่คือตัวอย่างที่ยอดเขาทั้งสองนับเป็น 14er แยกกัน:

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

นอกจากนี้ยังสามารถมีจุดสูงสุดบางส่วนในการลดลงระหว่างสอง 14ERS นี่เป็นรุ่นที่ปรับเปลี่ยนเล็กน้อยของเทือกเขาสุดท้าย:

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

เทือกเขานี้ยังนับเป็นสอง 14ers

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ใช้การแทน ASCII-art ของทิวเขาและกลับไปที่จำนวน 14ers ที่อยู่ในช่วง คุณสามารถป้อนข้อมูลในรูปแบบใดก็ได้ที่สะดวกที่สุดสำหรับคุณไม่ว่าจะเป็นอาเรย์แบบสองมิติสตริงที่มีการขึ้นบรรทัดใหม่หรือสตริงที่มีตัวคั่นอื่น คุณสามารถสมมติว่าอินพุตทั้งหมดจะประกอบด้วยอักขระ/\_เท่านั้นและความยาวของแต่ละบรรทัดจะเท่ากัน (รวมถึงช่องว่างต่อท้าย) นอกจากนี้คุณยังสามารถสรุปได้ว่าเทือกเขาเริ่มต้นที่มุมล่างซ้ายกับทั้งหรือ/_

หากส่วนสุดท้ายของภูเขาไม่ได้อยู่ในบรรทัดล่างคุณสามารถสรุปได้ว่าภูเขาจะลดลงหลังจากนั้นเท่านั้นเช่น

  /
 /
/

นับเป็น 14er เดียว

คุณไม่ต้องจัดการกับเทือกเขาที่ไม่ถูกต้อง

นี่คือตัวอย่าง I / O บางส่วน:

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

2

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

4

       /\                 
 _/\__/  \                
/         \               

1

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

1

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

3

ดังนั้นเส้นเริ่มต้นนับเป็น 14,000 ฟุต?
R. Kap

@ R.Kap ใช่ฉันเชื่อว่าถูกต้องสมมติว่าคุณหมายถึงบรรทัดล่างเมื่อคุณพูดบรรทัดเริ่มต้น
Alex A.

1
ฉันคิดว่าคุณควรพูดถึงบางแห่งที่มี_ค่าต่ำกว่าเครื่องหมายทับบนเส้นเดียวกัน 100 ฟุต อย่างน้อยนั่นคือสิ่งที่กรณีทดสอบสุดท้ายของคุณแนะนำ
Martin Ender

3
ข้อมูลจำเพาะดูเหมือนบาง ... เรามีพีทแบนได้/ / / _ \ \ \ ไหม? นอกจากนี้ฉันคิดว่าจุดสูงสุดในอินพุตควรนับเป็นจุดสูงสุดเสมอ แต่ไม่ได้ระบุอย่างชัดเจน อาจเริ่มที่จุดสูงสุดต่ำกว่าและจบด้วยจำนวนที่แตกต่างกัน
feersum

2
มันจะเป็นอย่างต่อเนื่องหรือไม่ มันจะมีอักขระไม่เกินหนึ่งตัวสำหรับแต่ละคอลัมน์หรือไม่
Leun Nun

คำตอบ:


2

JavaScript (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= ขึ้น, true= ลง) หาก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

JavaScript (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แสดงถึงอักขระบรรทัดใหม่ตามตัวอักษร Ungolfed:

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.