Magrathea 2.0-건물 산맥


50

세계 경제의 큰 붕괴와 함께 맞춤형 행성에 대한 수요도 급감했습니다. Magratheans는 광범위한 고객층으로부터도보다 꾸준한 매출을보아야했습니다. 따라서 그들은 완전한 행성을 구할 수없는 예산이 적은 사람들을 위해 자신 만의 마운틴 체인 (또는 짧은 혼란 산)을 발명했습니다.

산들은 고객의 계획에 따라 (숫자와 점의 일명 문자열) 빌드하고 아스키 기술을 사용하여 전달 (구성 , /, \, ^v).

태스크

STDIN 또는 인수로 입력 (단일 문자열)을 사용하여 STDOUT으로 출력하는 완전한 프로그램을 작성하십시오. 이 퍼즐은 코드 골프이므로 골프를 시도해보십시오.

입력

산 사슬의 기초를 제공하는 점과 숫자의 문자열. 각 줄은 산을 지탱하는 데 필요한 길이만큼 정확하며 각 봉우리는 점 대신 숫자로 표시되어 봉우리의 높이를 나타냅니다.

산출

마운틴 체인의 ASCII 버전.

  • 입력의 각 숫자는 숫자로 ^표시된 높이에서 정확히 하나의 피크 ( )를 나타냅니다 (즉, 9가 가장 높은 높이입니다).
  • 출력에 추가 피크가 없어야합니다 (예 : 입력에 점이있는 위치).
  • 산은 삼각형 모양입니다. 예를 들어 /\문자를 사용하여 경사를 만듭니다.
  • 두 개의 산이 겹치는 패스는 캐릭터를 사용하여 형성됩니다 v.
  • 불필요한 줄 바꿈이나 빈 줄은 없습니다.
  • 후행 공백이있는 패딩 라인은 선택 사항입니다.

제공된 입력이 유효하다고 가정 할 수 있습니다. 즉, 규칙에 따라 항상 솔루션이 존재합니다 (예 : 입력은 13..유효한 구성이 아니며 무시 될 수 있음). 또한, 양쪽에는 산이 잘리지 않아야하는 점이 정확히 있습니다.

첫 번째 줄은 입력을 보여주고 다른 모든 줄은 원하는 출력을 구성합니다. (실제로 산은 여기보다 콘솔에서 훨씬 나아 보입니다.)

1
^

11
^^

1.2.
  ^
^/ \

.2.3..
   ^
 ^/ \
/    \

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

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

1
시와 예술의 조합! 나는 그것을 좋아한다.
devnull

추가 줄 바꿈을 인쇄해도 되나요? 다시 말해서,의 입력 1이다 \n\n\n\n\n\n\n\n^허용?
durron597

@ durron597 출력에는 불필요한 줄 바꿈이 없어야하며 예제를 살펴보십시오.
Howard

후행 공백 문자는 어떻습니까? 모든 줄이 원래 줄과 길이가 같고 공백으로 채워져도 괜찮습니까?
Paul Prestidge

@Chron 예, 괜찮습니다.
Howard

답변:


11

자바 : 272 268 233 232 201 192 개 189 188 178 180 문자

@Sam 덕분에 268자를 233 자로 줄였으며, @manatwork는 1 문자를 더했습니다. 버그 지적을위한 @VadimR.

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)

주석이 달린 제대로 식별되고 다소 골치 아픈 버전 :

// 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);

코드에서 알 수 있듯이, 이것은 각 셀이 입력에서 숫자를 확인하고 자체와 두 이웃을보고 다음 반복이 무엇인지 결정하는 셀룰러 오토 마톤으로 작동합니다. 각 순간 세포가 될 수있다 ^, /, \, v또는 . 테스트 케이스에 제공된 입력은 예상 출력을 생성합니다.

alert상자 를 사용하면 일반적으로 고정 폭 글꼴이 없으므로 상자 를 사용합니다 . alert출력을 더 잘 이해하기 위해 상자에서 다른 곳으로 텍스트를 복사하여 붙여 넣거나 마지막 줄을 alert로 바꿀 수 console.log있지만 코드 골프 alert이므로 짧습니다.

또한 입력에서 아무것도 검증하지 않습니다. 인식 할 수없는 문자를 공백과 동일하게 간주합니다 .(실제로 .인식 할 수없는 문자 임).


1 문자를 줄이려면 오래된 골프 트릭이 있습니다. 빈 문자열을 prompt()매개 변수 로 변수를 초기화합니다 .
manatwork

@manatwork 감사합니다. 끝난.
Victor Stafusa

실례합니다. 아무것도 누락되었지만 FF와 Chromium에서 일관된 결과를 얻습니다. 브라우저를 시작하고 개정 # 14에서 JS 코드를 실행하고 오류 메시지가 나타납니다. 그런 다음 개정 번호 1의 코드를 실행합니다. 정상적으로 실행됩니다. 다시 14의 코드를 실행하고 오류 메시지가 없으면 정상적으로 실행됩니다. 그래서 개정 # 14의 코드는 스스로 실행될 수 없습니까?
user2846289

1
@VadimR 감사합니다. 그것은 오염 된 환경에서 테스트하기위한 부작용이었습니다. 코드가 delete r; delete s; delete q; delete p; delete t; delete i; delete d;오염되지 않도록하기 위해 코드를 접두사로 사용해야했습니다.
Victor Stafusa

q.trim()?q+'\n':''q.trim()&&q+'\n'두 절약 할 수 있습니다 . 또한 i<p.length그냥 될 수 있습니다 p[i].
Nicholas Pipitone

6

루비, 208 201 189

매우 재미있는 도전! 대체 루비 솔루션이 있습니다.

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,' ')

보너스로, 다음은 Victor의 매우 영리한 "셀룰러 오토 마톤"알고리즘을 162 자로 루비로 구현 한 것입니다.

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$*

출력 예 :

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

1
$/줄 바꿈에 사용할 수 있다고 생각합니다 .
Howard

4

C #-588 자-Ray의 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);}}}

출력 예 :

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

아니면 더 긴 하나 ...

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

화려한 퍼즐 ... 그 것처럼 쉽지는 않습니다 ... 사랑했습니다!


2
"복잡한 하나"의 형식이 잘못되었으므로 "3"에 대한 피크가 없습니다.
user2846289

모든 3것이 있습니다. 첫 번째 것에 대해 이야기하고 있다면 그것은 경사면의 일부입니다.
Hein Wessels

4

APL, 65 바이트

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

이 기호는 원시 (평가되지 않음) 입력을 문자 배열로 반환합니다.

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

루비, 390 자

휴, 이건 까다로웠다.

s처리 ^및 처리에 필요한 "다음 문자 건너 뛰기"를 의미 하는 변수 를 사용하여 각 문자에 새 문자열을 추가해야했습니다 \.

이 테스트는 모든 테스트 사례에 대해 지정된 샘플 출력을 정확하게 출력합니다.

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/,' '

변수의 의미에 대한 차트 :

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.

골프를 훨씬많이 할 수 있다고 확신 하지만 지금 가야합니다. 나중에 개선 될 것입니다!


입력에 어려움을 겪고 있으며 .2.2.왜 작동하지 않는지 알 수 없습니다.
Howard

2

자바, 377 (407)

편집 : @Victor는 이것이 완전한 프로그램이어야한다고 지적 했으므로 수십 개의 문자를 추가하여 컴파일 가능하고 실행 가능하게 만들었습니다. 다음과 같이 프로그램을 실행할 때 "구매 주문"을 첫 번째 매개 변수로 전달하십시오.java M ..3.4..6..4.3..

나는 이것이 다른 답변들과 정신적으로 비슷하다고 생각한다. 기본적으로 가능한 모든 높이에 대해 "산 순서"를 반복적으로 가로 지르고 위에서 아래로 산을 만든다. 그렇게하면 피크를 만들지 않으면 위쪽 경사 '/', 아래쪽 경사 '\, 조인트'v '또는 비어있는' '의 네 가지 조건 만 처리하면됩니다. 하향식 빌드에서 현재 위치 "위"에있는 세 개의 공간을 살펴보면 간단하다는 것을 알 수 있습니다.

다른 제출물과 마찬가지로 숫자 이외의 다른 항목은 '.'와 동일하게 취급합니다. 간결성을 위해 입력에.

골프 버전 :

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]);}}}

인간이 읽을 수있는 형태 (골프 형태를 달성하기위한 동등한 변형이없는 형태) :

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);
    }
}

즐겨.

출력 예 :

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

질문 은 완전한 프로그램을 작성하는 것이므로 누락 된 부분을 추가하십시오 class X{public static void main(String[]z){.
Victor Stafusa

바로 나는 그 문장의 다음 부분 인 "또는 논증"으로 오도되어 전체 프로그램 부분을 놓쳤다. 곧 업데이트하겠습니다.
ProgrammerDan

2

Perl 6, 264224216206200194124 바이트

$_=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

as /// 솔루션을 보여준 @JoKing에게 감사합니다. 이것은 Perl 6에서 tr /// 버그를 수정 한 후에 조금 더 골프를 쳤다.

미묘한 내 원래 솔루션 :

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)};}

언 골프 드 :

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
    }
}

산출:

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

1
나는 Perl이 주요 기능을 엄격하게 필요로한다고 생각하지 않는다. 진입 점은 함수 외부의 첫 번째 일 수 있습니다.
Nissa

매개 변수 처리에 main을 사용했습니다. 이제 stdin을 사용합니다. 감사.
donaldh

절차 적 솔루션. 나는 누군가가 정규 표현식과 hyperops로 더 잘할 수 있다고 확신합니다.
donaldh

1
131 바이트를 사용 s///하고 tr///. 마지막 하나 tr대신 사용할 수 있다고 생각 s하지만 백 슬래시를 번역 할 수는 없습니다. 아마 첫 번째 것
Jo King

@JoKing의 멋진 작업 – s /// 및 TR ///을 사용하려고 할 때 주제가 혼란스러워졌습니다. 블록을 피하는 것이 답이라는 것을 알았습니다.
donaldh

1

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/
}

편집 : 실제로 ProgrammerDan의 ..3..4...6...5....1예제 와 함께 작동하는 버그 수정 이지만 프로세스에서 일부 바이트가 해제되었습니다. 그리고 온라인 테스트 : 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 및 댓글 :

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);
        }
    }
}

예:

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

그래도 각 줄 앞에 여분의 공간을 출력한다고 생각합니다.


1

CJam, 128 117 112 106 104 바이트

CJam 은이 도전보다 조금 젊으 므로이 답변은 경쟁하지 않습니다. 이것은 매우 멋진 도전이었다! J와 APL에 대해 아는 작은 것부터 제출 한 내용이 상당히 짧을 것이라고 생각합니다.

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*

다음은 가능한 모든 슬로프, 피크 및 최저점 조합을 포함하는 테스트 사례입니다.

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

생산량

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

여기에서 테스트하십시오.

나중에 코드에 대한 설명을 추가하겠습니다.


1

파이썬, 297 234 218

Jo King 덕분에 -63 바이트 , 람다 대신
-16 바이트r=s.replace

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)

STDIN에서 입력을받습니다. 언 골프, 단순화 :

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
네, s.replace방법을 직접 시도했지만 작동하지 않습니다. 문자열은 변경할 수 없기 때문에 원래 문자열을 대체하고 있습니다
Jo King

0

Powershell, 148145 바이트

좋은 도전입니다!

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

덜 골프 테스트 스크립트 :

$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
}

산출:

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

-l , 100 바이트

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^^"

(언어는 질문보다 새로운 것이지만 어쨌든 APL 제출을 이길 수는 없습니다. 비록 훨씬 짧아지기를 바랍니다.)

명령 줄 인수를 통해 입력을받습니다. 온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.