Magrathea 2.0 - Xây dựng núi


50

Với sự sụp đổ lớn của nền kinh tế phổ quát, nhu cầu về các hành tinh được chế tạo đã giảm mạnh. Người Magratheans phải chăm sóc doanh thu ổn định hơn từ một nhóm khách hàng rộng lớn hơn. Do đó, họ đã phát minh ra chuỗi núi của riêng bạn (hoặc núi tàn phá ngắn) cho những người có ngân sách nhỏ hơn không đủ khả năng chi trả cho một hành tinh hoàn chỉnh.

Các ngọn núi được xây dựng theo kế hoạch của khách hàng (hay còn gọi là chuỗi các chữ số và dấu chấm) và chuyển giao sử dụng ascii-nghệ thuật (bao gồm , /, \, ^v).

Bài tập, nhiệm vụ

Viết một chương trình hoàn chỉnh lấy đầu vào (chuỗi đơn) từ STDIN hoặc làm đối số và xuất thành STDOUT. Câu đố này là một môn đánh gôn, vì vậy hãy thể hiện một số nỗ lực trong việc chơi gôn.

Đầu vào

Một chuỗi các dấu chấm và chữ số cung cấp cơ sở cho chuỗi núi. Mỗi chuỗi chính xác miễn là cần thiết để hỗ trợ các ngọn núi và mỗi đỉnh được cho bởi một chữ số thay vì dấu chấm, biểu thị chiều cao của đỉnh.

Đầu ra

Một phiên bản ascii của chuỗi núi.

  • Mỗi chữ số trong đầu vào biểu thị chính xác một đỉnh ( ^) ở độ cao chính xác được chỉ định bởi chữ số (tức là 9 là chiều cao cao nhất).
  • Không được có các đỉnh bổ sung trong đầu ra (nghĩa là tại các vị trí có dấu chấm trong đầu vào).
  • Núi có hình dạng tam giác, tức là sườn được tạo bằng cách sử dụng /\ký tự.
  • Đèo nơi hai ngọn núi chồng lên nhau được tạo hình bằng cách sử dụng nhân vật v.
  • Không có dòng mới thừa cũng không có dòng trống.
  • Dòng đệm với không gian dấu là tùy chọn.

Bạn có thể cho rằng đầu vào được cung cấp là hợp lệ, tức là luôn tồn tại một giải pháp theo quy tắc (ví dụ: đầu vào 13..sẽ không dẫn đến cấu hình hợp lệ và có thể bị bỏ qua). Hơn nữa, ở mỗi bên có chính xác là nhiều chấm sao cho các ngọn núi không được cắt.

Ví dụ

Dòng đầu tiên hiển thị đầu vào, tất cả các dòng khác tạo thành đầu ra mong muốn. (Trên thực tế, những ngọn núi trông đẹp hơn trong bảng điều khiển của tôi so với ở đây.)

1
^

11
^^

1.2.
  ^
^/ \

.2.3..
   ^
 ^/ \
/    \

.2..3..
    ^
 ^ / \
/ v   \

...4...3...3..
   ^
  / \  ^   ^ 
 /   \/ \ / \
/        v   \

1
Thật là một sự kết hợp giữa thơ và nghệ thuật! Tôi thích nó.
devnull

In thêm các dòng mới có ổn không? Nói cách khác, cho một đầu vào của 1, được \n\n\n\n\n\n\n\n^phép?
durron597

@ durron597 Đầu ra không nên có dòng mới thừa, hãy xem các ví dụ.
Howard

Những gì về nhân vật không gian dấu? Có ổn không nếu tất cả các dòng có cùng độ dài với chuỗi gốc, được đệm bằng khoảng trắng?
Paul Prestidge

@Chron Vâng, điều đó ổn.
Howard

Câu trả lời:


11

Javascript: 272 268 233 232 201 192 189 188 178 180 ký tự

Cảm ơn @Sam vì đã giảm từ 268 xuống còn 233 ký tự và @manatwork cho 1 char khác. @VadimR vì đã chỉ ra một lỗi.

p=prompt(r=t='');s=' ';for(d=10;d--;r=s+q+s,t+=q.trim()?q+'\n':'')for(q='',i=0;i<p.length;)q+=' \\/v^'[p[i++]==d?4:(/\^|\\/.test(r[i-1])+2*/\^|\//.test(r[i+1]))*(r[i]==s)];alert(t)

Phiên bản được xác định đúng và hơi vô căn cứ với các bình luận:

// The output initialization is just a golfing trick suggested by @manatwork.
input = prompt(state = output = '');
space = ' ';

// Repeat for each line, from the top (the highest peak, highest digit) to the floor (digit 1). Start at 10 to avoid a bug.
for (digit = 10; digit--;

      // Update the state of our automaton, at the end of the iteration.
      // Add a space after and before to simplify the future pattern recognization.
      state = space + line + space,

      // Add the line to the output if it is not an empty line, at the end of the iteration.
      output += line.trim() ? q + '\n' : '')
{ // This curly brace was added for readability, it is not in the golfed source.

  // Analyze each character in the current state to produce a new state, like a cellular automaton.
  for (line = '', i = 0; i < input.length;)
  { // This curly brace was added for readability, it is not in the golfed source.
    line +=

        // If the input is the current digit number, evaluate to 4 and put a peak in this character.
        // Otherwise evaluate this expression with those rules:
        // 1 means that the hill is higher only at right in the previous iteration, we do climb it to the right in this one.
        // 2 means that the hill is higher only at left in the previous iteration, we do climb it to the left in this one.
        // 3 means that the hill is higher at both sides in the previous iteration, we are in a v-shaped valley.
        // 0 means nothing to do here. If the middle is not a space, it will be multiplied by 0 and become 0.
        ' \\/v^'[input[i++] == digit ? 4 : (/\^|\\/.test(state[i - 1]) + 2 * /\^|\//.test(state[i + 1])) * (r[i] == space)];
    } // This curly brace was added for readability, it is not in the golfed source.
} // This curly brace was added for readability, it is not in the golfed source.

// Give the final output.
alert(output);

Như bạn có thể lưu ý từ mã, điều này hoạt động như một máy tự động di động, trong đó mỗi ô kiểm tra một số trong đầu vào, nhìn vào chính nó và hai hàng xóm của nó để quyết định lần lặp tiếp theo sẽ là gì. Tại mỗi thời điểm một tế bào có thể là một ^, /, \, vhoặc . Đầu vào được cung cấp trong các trường hợp thử nghiệm tạo ra đầu ra dự kiến.

Lưu ý rằng việc sử dụng alerthộp hút, vì thông thường nó không có phông chữ đơn cách. Bạn có thể sao chép và dán văn bản từ alerthộp sang nơi khác để đánh giá tốt hơn về đầu ra hoặc bạn có thể thay thế dòng cuối cùng alertbằng cách console.log, nhưng vì đây là mã golf, alertngắn hơn.

Hơn nữa, nó không xác nhận bất cứ điều gì trong đầu vào. Nó chỉ đơn giản coi các ký tự không được nhận dạng là khoảng trắng giống như cách thực hiện .(trên thực tế .cũng là một ký tự không được nhận dạng).


Có một mẹo chơi gôn cũ để giảm 1 ký tự: khởi tạo các biến với chuỗi rỗng dưới dạng prompt()tham số .
manatwork

@manatwork Cảm ơn bạn. Làm xong.
Victor Stafusa

Xin lỗi, có thể tôi đang thiếu thứ gì đó, nhưng tôi đang nhận được kết quả nhất quán ở cả FF và Chromium. Tôi khởi chạy trình duyệt, chạy mã JS từ phiên bản # 14 và nhận được thông báo lỗi. Sau đó, tôi chạy mã từ phiên bản số 1 - nó chạy OK. Một lần nữa tôi chạy mã 14 - và không có thông báo lỗi, nó chạy OK. Vì vậy, bản sửa đổi của mã số 14 không thể tự chạy?
dùng2846289

1
@VadimR Cảm ơn, đã sửa. Đó là một tác dụng phụ để thử nghiệm nó với một môi trường bị ô nhiễm. Cần tiền tố mã delete r; delete s; delete q; delete p; delete t; delete i; delete d;để đảm bảo rằng nó không bị ô nhiễm.
Victor Stafusa

q.trim()?q+'\n':''có thể q.trim()&&q+'\n', tiết kiệm hai. Ngoài ra, i<p.lengthchỉ có thể là p[i].
Nicholas Pipitone

6

Hồng ngọc 208 201 189

Thử thách rất thú vị! Đây là một giải pháp Ruby thay thế.

gets.size.times{|x|0.upto(h=$_[x].to_i-1){|d|r=$*[h-d]||=' '*~/$/
[x+d,x-d].map{|o|r[o]=r[o]>?!??v:o<x ??/:?\\if r[o]<?w}
d<1?r[x]=?^:r[x-d+1,w=2*d-1]=?w*w}}
puts$*.reverse.*($/).tr(?w,' ')

Như một phần thưởng, đây là một triển khai Ruby của thuật toán "máy tự động di động" rất thông minh của Victor, với 162 ký tự:

s=gets
9.downto(1){|h|$0=(-1..s.size).map{|x|$_=$0[x,3]
s[x]=="#{h}"??^:~/  [\^\/]/??/:~/[\^\\]  /??\\:~/[\^\\] [\^\/]/??v:' '}*''
$*<<$0[1..-2]if$0=~/\S/}
puts$*

Ví dụ đầu ra:

....5.....6..6.....
          ^  ^
    ^    / \/ \
   / \  /      \
  /   \/        \
 /               \
/                 \

1
Tôi nghĩ bạn có thể sử dụng $/cho dòng mới.
Howard

4

C # - 588 ký tự - mặc dù không tốt bằng Ray của 321!

class P{static void Main(string[] a){char[,] w=new char[a[0].Length+1,10];int x=0;foreach(char c in a[0]){if(c!='.'){int h=int.Parse(c+"");if(w[x,h]=='\0')w[x,h]='^';int s=1;for(int l=h-1;l>0;l--){for(int m=x-s;m<=x+s;m++){if(w[m,l]!='\0'){if(w[m,l]=='^')w[m,l]='/';if(w[m,l]=='\\')w[m,l]='v';}else{if(m==x-s)w[m,l]='/';else if(m==x+s)w[m,l]='\\';else w[m,l]='\0';}bool t=false;for(int f=9;f>0;f--){if(t)w[m,f]='\0';if(w[m,f]!='\0')t=true;}}s++;}}x++;}for(int k=9;k>0;k--){string u="";for(int j=0;j<w.GetLength(0);j++){u+=w[j,k];}if(u.Replace("\0","")!="")System.Console.WriteLine(u);}}}

Ví dụ đầu ra:

F:\>mountains ".2..3..4..."
       ^
    ^ / \
 ^ / v   \
/ v       \

Hoặc phức tạp hơn nữa ...

F:\>mountains ".2..3..6.....5...3......1..3..4....2."
       ^
      / \    ^
     /   \  / \               ^
    /     \/   \ ^         ^ / \
 ^ /            v \       / v   \  ^
/ v                \    ^/       \/ \

Câu đố thú vị ... không dễ như có vẻ ... yêu nó!


2
"Phức tạp một" không được định hình đúng, không có đỉnh cho "3".
dùng2846289

Tất cả các 3s đều ở đó. Nếu bạn đang nói về cái đầu tiên, thì đó là một phần của độ dốc.
Hein Wessels

4

APL, 65 byte

⍉⌽↑⌽¨h↑¨'^/v\'[1+(~×a)×2+×2+/2-/0,0,⍨h←¯1+⊃⌈/a-↓|∘.-⍨⍳⍴a←11|⎕d⍳⍞]

biểu tượng này trả về đầu vào thô (không được đánh giá) dưới dạng một mảng ký tự.

Giải quyết tương tác, trong phiên APL:

      s←'...4...3...3..' ⍝ let's use s instead of ⍞
      ⎕d ⍝ the digits
0123456789
      ⎕d⍳s ⍝ the indices of s in ⎕d or 11-s if not found
11 11 11 5 11 11 11 4 11 11 11 4 11 11
      11|⎕d⍳s ⍝ modulo 11, so '.' is 0 instead of 11
0 0 0 5 0 0 0 4 0 0 0 4 0 0
      a←11|⎕d⍳s ⍝ remember it, we'll need it later
      ⍴a ⍝ length of a
14
      ⍳⍴a
1 2 3 4 5 6 7 8 9 10 11 12 13 14
      ⍝ ∘.-    subtraction table
      ⍝ ∘.-⍨A  same as: A ∘.- A
      ⍝ |      absolute value
      |∘.-⍨⍳⍴a
 0  1  2  3 4 5 6 7 8 9 10 11 12 13
 1  0  1  2 3 4 5 6 7 8  9 10 11 12
 2  1  0  1 2 3 4 5 6 7  8  9 10 11
 ...
13 12 11 10 9 8 7 6 5 4  3  2  1  0
      ⍝ ↓      split the above matrix into rows
      ⍝ a-     elements of "a" minus corresponding rows
      ⍝ ⊃⌈/    max them together
      ⊃⌈/a-↓|∘.-⍨⍳⍴a
2 3 4 5 4 3 3 4 3 2 3 4 3 2
      ⍝ This describes the desired landscape,
      ⍝ except that it's a little too high.
      ⍝ Add -1 to correct it:
      ¯1+⊃⌈/a-↓|∘.-⍨⍳⍴a
1 2 3 4 3 2 2 3 2 1 2 3 2 1
      ⍝ Perfect!  Call it "h":
      h←¯1+⊃⌈/a-↓|∘.-⍨⍳⍴a
      0,⍨h ⍝ append a 0 (same as h,0)
1 2 3 4 3 2 2 3 2 1 2 3 2 1 0
      0,0,⍨h ⍝ also prepend a 0
0 1 2 3 4 3 2 2 3 2 1 2 3 2 1 0
      2-/0,0,⍨h ⍝ differences of pairs of consecutive elements
¯1 ¯1 ¯1 ¯1 1 1 0 ¯1 1 1 ¯1 ¯1 1 1 1
      ⍝ this gives us slopes between elements
      2+/2-/0,0,⍨h ⍝ sum pairs: left slope + right slope
¯2 ¯2 ¯2 0 2 1 ¯1 0 2 0 ¯2 0 2 2
      ×2+/2-/0,0,⍨h ⍝ signum of that
¯1 ¯1 ¯1 0 1 1 ¯1 0 1 0 ¯1 0 1 1
      2+×2+/2-/0,0,⍨h ⍝ add 2 to make them suitable for indexing
1 1 1 2 3 3 1 2 3 2 1 2 3 3
      ⍝ Almost ready.  If at this point we replace
      ⍝ 1:/ 2:v 3:\, only the peaks will require fixing.
      ~×a ⍝ not signum of a
1 1 1 0 1 1 1 0 1 1 1 0 1 1
      (~×a)×2+×2+/2-/0,0,⍨h ⍝ replace peaks with 0-s
1 1 1 0 3 3 1 0 3 2 1 0 3 3
      ⍝ Now replace 0:^ 1:/ 2:v 3:\
      ⍝ We can do this by indexing a string with the vector above
      ⍝ (and adding 1 because of stupid 1-based indexing)
      '^/v\'[1+(~×a)×2+×2+/2-/0,0,⍨h]
///^\\/^\v/^\\
      ⍝ Looks like our mountain, only needs to be raised according to h
      r←'^/v\'[1+(~×a)×2+×2+/2-/0,0,⍨h] ⍝ name it for convenience
      h¨↑r ⍝ extend r[i] with spaces to make it h[i] long
 /  /   /    ^     \    \   /   ^    \   v  /   ^    \   \
      ↑⌽¨h¨↑r ⍝ reverse each and mix into a single matrix
/
 /
  /
   ^
  \
 \
 /
  ^
 \
v
 /
  ^
 \
\
      ⍉⌽↑⌽¨h¨↑r ⍝ reverse and transpose to the correct orientation
   ^
  / \  ^   ^
 /   \/ \ / \
/        v   \

3

Ruby, 390 ký tự

Whew, cái này là khó khăn.

Cuối cùng tôi đã phải nối thêm một chuỗi mới cho mỗi ký tự, sử dụng một biến scó nghĩa là "bỏ qua ký tự tiếp theo" cần thiết để xử lý ^\.

Đầu ra này chính xác là đầu ra mẫu đã cho cho tất cả các trường hợp thử nghiệm.

m=[gets.chomp]
a=m[0].scan(/\d/).max.to_i
m[0].gsub!(/./){|n|n==?. ? ' ':a-n.to_i}
s=nil
until a==0
o=''
m[-1].chars{|c|o+=case c
when ?0;?^
when ' ';t=s;s=nil;t ? '':' '
when /\d/;(c.to_i-1).to_s
when ?^;s=1;o.slice! -1;"/ \\"
when ?/;t=s;s=nil;t ? "#{o.slice! -1;' '}":o.slice!(-1)=='\\' ? 'v ':"/ "
when ?\\;s=1;' \\'
when ?v;' '
end}
m.push o
a-=1
end
puts (m[1..-1]*"\n").gsub /\d/,' '

Biểu đồ về ý nghĩa của các biến:

m | The mountain array.
a | The highest height of a mountain. Used for counting when to stop.
s | Whether or not to skip the next character. 1 for yes, nil for no.
o | Temp string that will be appended to mountain.
t | Temp variable to hold the old value of s.

Tôi chắc chắn rằng tôi có thể đánh nó xuống nhiều hơn nữa, nhưng tôi phải đi ngay bây giờ. Sẽ được cải thiện sau!


Tôi đang vật lộn với đầu vào .2.2.và không thể hiểu tại sao nó không hoạt động.
Howard

2

Java, 377 407

Chỉnh sửa: @Victor chỉ ra rằng đây cần phải là một chương trình hoàn chỉnh, vì vậy tôi đã thêm vài chục ký tự để làm cho nó có thể biên dịch và chạy được. Chỉ cần vượt qua "đơn đặt hàng" là thông số đầu tiên khi thực hiện chương trình, như vậy:java M ..3.4..6..4.3..

Tôi nghĩ rằng điều này tương tự về mặt tinh thần với các câu trả lời khác, về cơ bản chỉ cần vượt qua "trật tự núi" liên tục cho mọi độ cao có thể, và xây dựng các ngọn núi từ ngọn xuống. Theo cách đó, tôi chỉ phải đối phó với bốn điều kiện nếu không xây dựng một đỉnh - hoặc là dốc lên '/', xuống dốc '\, khớp' v 'hoặc trống' '. Tôi có thể khám phá sự đơn giản đó bằng cách nhìn vào ba không gian ở giữa "phía trên" vị trí hiện tại của tôi trong bản dựng từ trên xuống.

Lưu ý rằng giống như các bài nộp khác, tôi coi mọi thứ khác hơn là một số tương đương với '.' trong đầu vào, cho ngắn gọn.

Phiên bản chơi gôn:

class M{public static void main(String[]m){char[]n=m[0].toCharArray();int e=n.length,h=9,x=-1,p;char[][]o=new char[11][e];char l,r,u;boolean a,b,c;for(;h>=0;h--){for(p=0;p<e;p++){if(n[p]-49==h){o[h][p]=94;if(x==-1)x=h;}else{l=(p>0)?o[h+1][p-1]:0;r=(p<e-1)?o[h+1][p+1]:0;u=o[h+1][p];a=l>91&&l<99;b=r==94||r==47;c=u<33;o[h][p]=(char)((a&&b)?'v':(c&&b)?47:(c&&a)?92:32);}}if(x>=h)System.out.println(o[h]);}}}

Dạng người có thể đọc được (và không có một số biến đổi tương đương để đạt được dạng golf):

class Magrathea2 {
    public static void main(String[] mountain) {
        String out = "";
        char[][] output = new char[11][mountain[0].length()];
        int height = 9; int maxheight = -1;
        int position = 0;
        char left,right,up;
        char[] mount = mountain[0].toCharArray();
        for (; height >= 0; height--) {
            for (position=0; position < mount.length; position++) {
                if (mount[position]-49 == height) {
                    output[height][position] = '^';
                    if (maxheight==-1) {
                        maxheight=height;
                    }
                } else { // deal with non-numbers as '.'
                    left=(position>0)?output[height+1][position-1]:0;
                    right=(position<mount.length-1)?output[height+1][position+1]:0;
                    up=output[height+1][position];
                    if ((left=='^'||left=='\\')&&(right=='^'||right=='/')) {
                        output[height][position]='v';
                    } else if ((up==' '||up==0)&&(right=='/'||right=='^')) {
                        output[height][position]='/';
                    } else if ((up==' '||up==0)&&(left=='\\'||left=='^')) {
                        output[height][position]='\\';
                    } else {
                        output[height][position]=' ';
                    }
                }
            }
            if (maxheight >= height) {
                out+=new String(output[height]);
                if (height > 0) {
                    out+="\n";
                }
            }
        }
        System.out.println(out);
    }
}

Thưởng thức.

Ví dụ đầu ra:

$ java M ..3..4...6...5....1
         ^
        / \  ^
     ^ /   \/ \
  ^ / v        \
 / v            \
/                \^

Câu hỏi đề cập Viết một chương trình hoàn chỉnh , vì vậy xin vui lòng, thêm phần còn thiếu class X{public static void main(String[]z){.
Victor Stafusa

Ngay trên. Tôi đã bị đánh giá sai bởi phần tiếp theo của câu đó - "hoặc là đối số" và đã bỏ lỡ phần chương trình hoàn chỉnh. Tôi sẽ cập nhật ngay.
Lập trình viên

2

Perl 6, 264 224 216 206 200 194 124 byte

$_=get;my$a=10;((s:g/$a/^/;s:g/\s\.\s/ v /;s:g'\.\s'/ ';s:g/\s\./ \\/;$!=say TR/.1..9/ /;tr'^\\/v' ')if .match(--$a)|$!)xx 9

Cảm ơn @JoKing đã hiển thị dưới dạng /// giải pháp. Điều này được đánh gôn thêm một chút sau khi sửa lỗi tr /// trong Perl 6.

Giải pháp ban đầu của tôi với trạm biến áp:

my$t=get;for 9...1 {if $t.match($_)|$! {$t=$t.subst($_,'^',:g).subst(' . ',' v ',:g).subst('. ','/ ',:g).subst(' .',' \\',:g);$!=say $t.subst(/<[\.\d]>/,' ',:g);$t.=subst(/<[^\\/v]>/,' ',:g)};}

Ung dung:

my $t=slurp;
my $s;
for 9...1 {
    if $t.match($_)||$s {                    # match number or latched
        $t=$t.subst($_,'^',:g)               # peaks
        .subst(' . ',' v ',:g)               # troughs
        .subst('. ','/ ',:g)                 # up slope
        .subst(' .',' \\',:g);               # down slope
        $s=say $t.subst(/<[\.\d]>/,' ',:g);  # clean, display, latch
        $t=$t.subst(/<[^\\/v]>/,' ',:g)      # wipe for next line
    }
}

Đầu ra:

...4...3...33..4..4....2.3.22.33.5..22...333.222.3..
                                 ^                  
   ^           ^  ^             / \                 
  / \  ^   ^^ / \/ \     ^    ^^   \     ^^^     ^  
 /   \/ \ /  v      \  ^/ \^^/      ^^  /   \^^^/ \ 
/        v           \/               \/           \

1
Tôi không nghĩ Perl hoàn toàn cần một chức năng chính, điểm vào chỉ có thể là điều đầu tiên bên ngoài chức năng.
Nissa

Tôi đã sử dụng chính để xử lý tham số. Bây giờ sử dụng stdin. Cảm ơn.
donaldh

Một giải pháp thủ tục. Tôi chắc rằng ai đó có thể làm tốt hơn với regexes và hyperops.
donaldh

1
131 byte sử dụng s///tr///. Tôi nghĩ rằng cái cuối cùng có thể sử dụng trthay vì snhưng tôi không thể tìm ra cách dịch dấu gạch chéo ngược. Có lẽ người đầu tiên cũng vậy
Jo King

Công việc tuyệt vời @JoKing - Tôi đã gặp rắc rối về chủ đề khi tôi cố gắng sử dụng s /// và TR ///. Tôi thấy rằng tránh các khối là câu trả lời.
donaldh

1

Perl, 254 218 212

$s=<>;sub f{9-$i-$_[0]?$":pop}for$i(0..8){$h=1;$_=$s;s!(\.*)(\d?)!$D=($w=length$1)+$h-($2||1);join'',(map{($x=$_-int$D/2)<0?f--$h,'\\':$x?f++$h,'/':$D%2?f--$h,v:f$h,'/'}0..$w-1),$2?f$h=$2,'^':''!ge;print if/\S/}
$s=<>;
sub f{9-$i-$_[0]?$":pop}
for$i(0..8){
    $h=1;
    $_=$s;
    s!(\.*)(\d?)!
        $D=($w=length$1)+$h-($2||1);
        join'',(map{
            ($x=$_-int$D/2)<0
                ?f--$h,'\\'
                :$x
                    ?f++$h,'/'
                    :$D%2
                        ?f--$h,v
                        :f$h,'/'
        }0..$w-1),$2
            ?f$h=$2,'^'
            :''
    !ge;
    print if/\S/
}

Chỉnh sửa: thực sự đó là một sửa lỗi để làm việc với ..3..4...6...5....1ví dụ của Lập trình viên , nhưng, trong quá trình này, một số byte đã bị tắt. Và kiểm tra trực tuyến: https://ideone.com/P4XpMU


1

C # - 321 319

using System.Linq;class P{static void Main(string[]p){int h=p[0].Max()-48,i=h,j,n=p[0].Length;char[]A=new char[n+2],B=A;for(;i-->0;){for(j=0;j++<n;){var r=(A[j+1]==47|A[j+1]==94);B[j]=(char)(p[0][j-1]==i+49?94:i+1<h?A[j]==0?(A[j-1]>90&A[j-1]<95)?r?118:92:r?47:0:0:0);}A=(char[])B.Clone();System.Console.WriteLine(B);}}}

Ungolfed và bình luận:

using System.Linq;

class P
{
    static void Main(string[] p)
    {
        int h = p[0].Max() - 48,    // Getting the height. Codes for 0 to 9 are 48 to 57, so subtract 48 and hope no one will input anything but dots and numbers.
            i = h,
            j,                      // Declaring some iterators here, saves a few chars in loops.
            n = p[0].Length;
        char[] A = new char[n+2],   // Creating an array of char with 2 extra members so as not to check for "index out of bounds" exceptions
               B = A;               // B is referencing the same array as A at this point. A is previous row, B is the next one.
        for (;i-->0;)               // Looping from top to the bottom of the mountain
        {
            for (j = 0; j++ < n;)   // Looping from left to right.
            {
                var r = (A[j + 1] == 47 | A[j + 1] == 94);  // This bool is used twice, so it saves a few characters to make it a variable

                // Here's the logic
                B[j] = (char)(p[0][j - 1] == i + 49 ? 94    // If at this position in the string we have a number, output "^"
                                           : i + 1 < h ?    // And if not, check if we're on the top of the mountain
                                             A[j] == 0 ?    // If we're not at the top, check if the symbol above is a space (0, actually)
                                            (A[j - 1] > 90 & A[j - 1] < 95) ?   // If there's nothing above, we check to see what's to the left ( ^ or \ )
                                             r ?            // And then what's to the right ( ^ or / )
                                             118            // If there are appropriate symbols in both locations, print "v"
                                           : 92             // If there's only a symbol to the left, print "\"
                                           : r              // Otherwise check if there's a symbol to the right, but not to the left
                                           ? 47             // And if there is, print "/"
                                           : 0 : 0 : 0);    // Print nothing if there aren't any symbols above, to the left and to the right,
                                                            // or there's a "^" right above, or we're at the top of the mountain
            }
            A=(char[])B.Clone();    // Clone arrays to iterate over the next line
            System.Console.WriteLine(B);
        }
    }
}

Thí dụ:

C:\>program .2..3..4...
        ^
     ^ / \
  ^ / v   \
 / v       \

Tôi nghĩ rằng nó xuất ra một không gian thêm trước mỗi dòng, mặc dù.


1

CJam, 128 117 112 106 104 byte

CJam trẻ hơn một chút so với thử thách này nên câu trả lời này không cạnh tranh. Đây là một thử thách rất hay! Từ những gì tôi biết về J và APL, tôi nghĩ rằng một bài nộp trong đó sẽ ngắn một cách ấn tượng.

WlW++"."Waer{_{~U(e>:U}%\W%}2*;W%]z{$W=}%_$W=S*\:L,2-,\f{\_)L=(~"^/ ^^/ \v ^ \\"S/2/@L>3<_$0=f-{=}/t}zN*

Đây là một trường hợp thử nghiệm, mà tôi nghĩ có chứa tất cả các kết hợp có thể có của độ dốc, đỉnh và đáy:

...4...3...33..4..4....2.3.22.33.5..22...333.222.3..

mang lại

                                 ^                  
   ^           ^  ^             / \                 
  / \  ^   ^^ / \/ \     ^    ^/   \     ^^^     ^  
 /   \/ \ /  v      \  ^/ \^^/      \^  /   \^^^/ \ 
/        v           \/               \/           \

Kiểm tra nó ở đây.

Tôi sẽ thêm một lời giải thích cho mã sau.


1

Con trăn 297 234 218

-63 byte nhờ Jo King
-16 byte r=s.replacethay vì lambda

s=input()
r=s.replace
q=0
j=''.join
for i in range(9):
 if`9-i`in s or q:q=s=r(`9-i`,'^');s=r(' . ',' v ');s=r('. ','/ ');s=r(' .',' \\');print j([x,' '][x in'0123456789.']for x in s);s=j([x,' '][x in'/\^v']for x in s)

Lấy đầu vào từ STDIN. Ung dung, đơn giản hóa:

s=input() # Take input
r=lambda y,z: s.replace(y,z) # Function for quick s.replace(a, b)
j=lambda x: ''.join(x)
q=0 # Acts like boolean
for i in range(9): # Count to 9
 if `9-i`in s or q: # When digit has been found or found previously (no newlines at start)
  q=s=r(`9-i`,'^') # Digit to ^, set q to non-zero value for always executing from now on
  s=r(' . ',' v ') # ' . ' to ' v '
  s=r('. ','/ ') # '. ' to '/ '
  s=r(' .',' k') # ' .' to 'k'. K is a placeholder, since \\ takes two chars and `[...]`[2::5] fails
  print j([x,' '][x in'0123456789.']for x in s) # Print without '0123456789.'
  s=j([x,' '][x in'/\^v']for x in s) # Wipe (delete '/^\v`)


1
Vâng, tôi đã thử s.replacephương pháp này, nhưng nó không hoạt động. Bạn chỉ đang thực hiện thay thế trên chuỗi ban đầu vì các chuỗi là bất biến
Jo King

0

Powershell, 148 145 byte

Đó là một thử thách thú vị!

param($s)9..1|?{($p+=$s-match$_)}|%{"$_,^; \. , v ;\. ,/ ; \., \;\^|\\|/|v, "-split';'|%{$x=$s-replace'\.|\d',' '
$s=$s-replace($_-split',')}
$x}

Kịch bản kiểm tra ít chơi gôn hơn:

$f = {

param($s)
9..1|?{($p+=$s-match$_)}|%{      # loop digits form 9 downto 1, execute to the end as soon as a suitable digit met
    $s=$s-replace$_,'^'          # replace current digit with '^'
    $s=$s-replace' \. ',' v '    # replace ' . '  with ' v '
    $s=$s-replace'\. ','/ '      # replace '. ' with '/ '
    $s=$s-replace' \.',' \'      # replace ' .' with ' \'
       $s-replace'\.|\d',' '     # replace all dots and digits with ' ' and push to output. Don't store this replacement
    $s=$s-replace'\^|\\|/|v',' ' # prepeare to the next step: replace ^ \ / and v to space
}

    # Example:
    #     $s="...4...3...3.."
    # 4 : $s="...^...3...3.." output: "   ^          "
    # 4 : $s="... ...3...3.."
    # 3 : $s="../ \..^...^.." output: "  / \  ^   ^  "
    # 3 : $s="..   .. ... .."
    # 2 : $s="./   \/ \./ \." output: " /   \/ \ / \ "
    # 2 : $s=".        .   ."
    # 1 : $s="/        v   \" output: "/        v   \"
    # 1 : $s="              "

}

@(
    ,("1",
      "^")

    ,("11",
      "^^")

    ,("1.2.",
    "  ^ ",
    "^/ \")

    ,(".2.3..",
      "   ^  ",
      " ^/ \ ",
      "/    \")

    ,(".2..3..",
      "    ^  ",
      " ^ / \ ",
      "/ v   \")

    ,("...4...3...3..",
      "   ^          ",
      "  / \  ^   ^  ",
      " /   \/ \ / \ ",
      "/        v   \")

    ,("...4...3...33..4..4....2.3.22.3..5...22...333.222.3..",
      "                                 ^                   ",
      "   ^           ^  ^             / \                  ",
      "  / \  ^   ^^ / \/ \     ^    ^/   \      ^^^     ^  ",
      " /   \/ \ /  v      \  ^/ \^^/      \^^  /   \^^^/ \ ",
      "/        v           \/                \/           \")

    ,(".2..3..6.....5...3......1..3..4....2.",
      "       ^                             ",
      "      / \    ^                       ",
      "     /   \  / \               ^      ",
      "    ^     \/   \ ^         ^ / \     ",
      " ^ /            v \       / v   \  ^ ",
      "/ v                \    ^/       \/ \")
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    $s
    $result
}

Đầu ra:

True
1
^
True
11
^^
True
1.2.
  ^
^/ \
True
.2.3..
   ^
 ^/ \
/    \
True
.2..3..
    ^
 ^ / \
/ v   \
True
...4...3...3..
   ^
  / \  ^   ^
 /   \/ \ / \
/        v   \
True
...4...3...33..4..4....2.3.22.3..5...22...333.222.3..
                                 ^
   ^           ^  ^             / \
  / \  ^   ^^ / \/ \     ^    ^/   \      ^^^     ^
 /   \/ \ /  v      \  ^/ \^^/      \^^  /   \^^^/ \
/        v           \/                \/           \
True
.2..3..6.....5...3......1..3..4....2.
       ^
      / \    ^
     /   \  / \               ^
    ^     \/   \ ^         ^ / \
 ^ /            v \       / v   \  ^
/ v                \    ^/       \/ \

0

Pip -l , 100 byte

Y#aZGMXaFi,#aIh:+a@i{(yi--h):4j:0Wh-j&++(yi-++jh-j)(yi+jh-j):2}RV Z(J*y)R`.(?=.*[^0])`0R,6;^" /\v^^"

(Ngôn ngữ mới hơn câu hỏi, nhưng có lẽ sẽ không vượt qua được trình APL. Mặc dù tôi hy vọng nó sẽ ngắn hơn nhiều.)

Đưa đầu vào thông qua đối số dòng lệnh. Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.