Magrathea 2.0 - Bina Dağları


50

Evrensel ekonominin büyük çöküşüyle ​​birlikte, özel yapım gezegenlere olan talep de azaldı. Magratheans, daha geniş bir müşteri sınıfından da daha istikrarlı gelirler elde etmek zorunda kaldı. Bu nedenle, tam bir gezegene sahip olamayan daha küçük bütçeli insanlar için kendi dağ zincirinizi (ya da kısa tahribatsız dağları) yarattılar.

Dağlar müşterinin planına göre (basamak ve noktaların aka dizeleri) inşa ve ascii-art kullanarak teslim (oluşan , /, \, ^ve v).

Görev

Girdiyi (tekli dize) STDIN'den veya argüman olarak alan ve STDOUT'a çıktısını alan eksiksiz bir program yazın. Bu bulmaca bir kod golf yani, golf oynamak için biraz girişim gösteriniz.

Giriş

Dağ zincirinin temelini oluşturan bir dizi nokta ve rakam. Her dize, dağları desteklemek için tam olarak gerektiği kadar uzundur ve her tepe noktası, tepe noktasının yüksekliğini belirten bir nokta yerine bir rakamla verilir.

Çıktı

Dağ zincirinin bir ascii versiyonu.

  • Girişteki her hane tam ^olarak hane tarafından belirtilen yükseklikte (yani 9 en yüksek yüksekliktir) tam olarak bir tepe noktası ( ) temsil eder .
  • Çıktıda ilave tepe noktaları olmamalıdır (örn. Girişte nokta bulunan yerlerde).
  • Dağlar üçgen şeklindedir, yani eğimler /ve \karakterler kullanılarak oluşturulmuştur .
  • İki dağın üst üste geldiği yer, karakter kullanılarak şekillendirilir v.
  • Gereksiz yeni satırlar veya boş satırlar yok.
  • Sondaki boşluklara sahip doldurma hatları isteğe bağlıdır.

Sağlanan girişin geçerli olduğunu varsayabilir, yani kurallara göre her zaman bir çözüm vardır (örneğin bir giriş 13..geçerli bir konfigürasyona neden olmaz ve göz ardı edilebilir). Dahası, her iki tarafta da tam olarak dağların kesilmemesi gereken noktalar vardır.

Örnekler

İlk satır girişi gösterir, diğer tüm satırlar istenen çıkışı oluşturur. (Aslında dağlar konsolumda buradan çok daha iyi görünüyor.)

1
^

11
^^

1.2.
  ^
^/ \

.2.3..
   ^
 ^/ \
/    \

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

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

1
Şiir ve sanatın birleşimi! Onu seviyorum.
devnull

Ekstra yeni satırlar yazdırmak uygun mu? Başka bir deyişle, bir giriş 1için \n\n\n\n\n\n\n\n^izin verilir?
durron597

@ durron597 Çıktının gereksiz yeni satırları olmamalı, örneklere bir göz atmalı.
Howard

Peki ya boşluk karakterleri? Tüm satırların, boşluklarla doldurulmuş orijinal dizeyle aynı uzunlukta olması uygun mudur?
Paul Prestidge

@ Chron Evet, tamam.
Howard

Yanıtlar:


11

Javascript: 272 268 233 232 201 192 189 188 178 180 karakter

268'den 233 karaktere düşürdüğünüz için @ Sam'e ve 1 karakter için @ manatwork'e teşekkür ederiz. @VadimR bir hatayı işaret ettiği için.

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)

Yorumlarla doğru bir şekilde tanımlanmış ve biraz unungolfed versiyonu:

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

Koddan not edebileceğiniz gibi, bu, her hücrenin girdideki bir sayıyı kontrol ettiği, bir sonraki yinelemenin ne olacağına karar vermek için kendisine ve iki komşusuna bakacağı hücresel bir otomat işlevi görür. Her hangi bir zamanda bir hücre, bir olabilir ^, /, \, vya da . Test durumlarında sağlanan girdi beklenen çıktıyı üretir.

alertNormalde monospaced bir fontu olmadığından , kutuyu kullanmanın berbat olduğuna dikkat edin . Sen kopyala-yapıştır ait metin olabilir alertkutuya başka bir yere çıktı daha iyi takdir veya son satırı değiştirebilir alerttarafından console.logancak bu kod golf olduğundan, alertkısadır.

Ayrıca, girdideki hiçbir şeyi doğrulamaz. Tanınmayan karakterleri, boşluklarla aynı şekilde görür .(aslında .tanınmayan bir karakterdir).


1 karakteri azaltmak için eski bir golf oyunu var: değişkenleri boş dize ile prompt()'s parametresi olarak başlat .
Manatwork

@manatwork Teşekkürler. Bitti.
Victor Stafusa,

Affedersiniz, belki bir şeyleri özlüyorum, ancak hem FF hem de Chromium'da tutarlı sonuçlar alıyorum. Bir tarayıcı başlattım, 14 numaralı revizyondan JS kodunu çalıştırdım ve hata mesajı alıyorum. Sonra kod # 1'den kod çalıştırıyorum - Tamam çalışıyor. Yine 14 kodunu çalıştırın - ve hiçbir hata mesajı yok, Tamam çalışıyor. Yani revizyon # 14'ün kodu kendi başına çalıştırılamaz mı?
user2846289

1
@VadimR Teşekkürler, düzeltildi. Bu, kirli bir ortamda test etmek için bir yan etki oldu. Yasaklanmadığından delete r; delete s; delete q; delete p; delete t; delete i; delete d;emin olmak için kodun önekiyle yapılması gerekiyordu.
Victor Stafusa

q.trim()?q+'\n':''q.trim()&&q+'\n'iki tasarruf olabilir . Ayrıca, i<p.lengthsadece olabilir p[i].
Nicholas Pipitone

6

Yakut, 208 201 189

Çok eğlenceli bir meydan okuma! İşte alternatif bir Ruby çözümü.

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

Bonus olarak, işte Victor'un çok zeki "hücresel otomat" algoritmasının Ruby karakterinin 162 karakterde uygulanması:

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

Örnek çıktı:

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

1
$/Newline için kullanabileceğini düşünüyorum .
Howard,

4

588 karakter - Ray'in 321'i kadar iyi değil!

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

Örnek çıktı:

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

Veya daha uzun, daha karmaşık bir ...

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

Parlak bulmaca ... göründüğü kadar kolay değil ... onu sevdi!


2
"Karmaşık bir" kötü oluşmuş, "3" için zirve yok.
user2846289

Hepsi 3orada. İlki hakkında konuşuyorsanız, yokuşun bir parçası.
Hein Wessels

4

APL, 65 bayt

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

bu sembol ham (değerlendirilmemiştir) girişi karakter dizisi olarak döndürür.

APL oturumunda etkileşimli olarak çözme:

      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 karakter

Vay, bu çok zordu.

Ben bir değişken kullanarak, her karakter için yeni bir dizeye eklemek zorunda sona erdi sişlem için gerekli olduğunu "Sonraki karakteri atla" anlamına geliyordu ^ve \.

Bu çıktı tüm test durumları için tam olarak verilen örnek çıktı.

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

Değişkenlerin ne anlama geldiğinin şeması:

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.

Eminim daha çok golf oynayabilirim ama şimdi gitmem gerekiyor. Daha sonra geliştirilecek!


Girdiyle mücadele ediyorum .2.2.ve neden işe yaramadığını göremiyorum.
Howard,

2

Java, 377 407

Düzenleme: @Victor bunun eksiksiz bir program olması gerektiğine dikkat çekti, bu yüzden derlenebilir ve çalıştırılabilir hale getirmek için birkaç düzine karakter ekledim. Programı çalıştırırken ilk param olarak "satınalma siparişini" geçmeniz yeterlidir:java M ..3.4..6..4.3..

Bunun ruhsal olarak diğer cevaplara benzer olduğunu düşünüyorum, temel olarak her olası yükseklik için tekrar tekrar "dağ düzenini" geçiyor ve dağları tepeden aşağı yapıyor. Bu şekilde, yalnızca bir tepe yapmıyorsanız dört koşulla başa çıkmam gerekiyor - ya yukarı eğim '/', aşağı eğim '\, eklem' v 'ya da boş' '. Bu basitliği, yukarıdan aşağıya binadaki mevcut konumumun "üstünde" ortalanmış üç boşluğa bakarak keşfedebilirim.

Diğer gönderiler gibi, ben de sayıdan başka bir şeye '.' Girişte, kısalık için.

Golf versiyonu:

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

İnsan tarafından okunabilir form (ve golf formuna ulaşmak için eşdeğer transmogrifikasyonlardan bazıları olmadan):

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

Keyfini çıkarın.

Örnek çıktı:

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

Soru, eksiksiz bir program yazın , lütfen eksik olanı ekleyin class X{public static void main(String[]z){.
Victor Stafusa

Kesinlikle doğru. Bu cümlenin bir sonraki bölümünde yanlış yönlendirildim - "veya argüman olarak" ve programın tamamını kaçırdım. Kısa süre içinde güncelleyeceğim.
ProgramcıDan

2

Perl 6, 264 224 216 206 200 194 124 bayt

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

/// çözüm olarak gösterdiği için @JoKing'e teşekkürler. Perl 6'daki tr /// hatayı düzelttikten sonra bu biraz daha golf oynar.

Subst ile özgün çözümüm:

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

Ungolfed:

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

Çıktı:

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

1
Perl'nin kesinlikle bir ana işleve ihtiyacı olduğunu sanmıyorum, giriş noktası bir işlevin dışındaki ilk şey olabilir.
Nissa,

Parametre kullanımı için main kullandım. Şimdi stdin kullanıyor. Teşekkürler.
donaldh

Prosedürel bir çözüm. Eminim regex ve suaygırları ile daha iyisini yapabilirsiniz.
donaldh

1
131 bayt kullanılarak s///ve tr///. Bunun tryerine sonuncunun kullanabileceğini düşünüyorum , sancak ters eğik çizgileri çevirmeyi tam olarak çözemiyorum. Belki ilki de
Jo King

Güzel iş @JoKing - s /// ve TR /// kullanmaya çalıştığımda bir konu karışıklığına girdim. Bloklardan kaçınmanın cevabı olduğunu görüyorum.
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/
}

Düzenleme: aslında ProgrammerDan'ın ..3..4...6...5....1örneği ile çalışmak için bir hata düzeltme , ancak bu işlem sırasında bazı bayt kapalı. Ve çevrimiçi test: 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 ve yorumladı:

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

Örnek:

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

Yine de her satırdan önce fazladan bir boşluk çıkardığını düşünüyorum.


1

CJam, 128 117 112 106 104 bayt

CJam bu mücadeleden biraz daha genç, bu yüzden bu cevap rekabet etmiyor. Bu olsa çok güzel bir mücadele oldu! J ve APL hakkında tanıdığım küçüklerden, bunlara bir gönderimin kısa sürede etkileneceğini düşünüyorum.

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*

İşte olası tüm yamaç, tepe ve oluk kombinasyonlarını içeren bir test durumu:

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

hangi verim

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

Burada test et.

Kod için daha sonra bir açıklama ekleyeceğim.


1

Python, 297 234 218

Jo King sayesinde -63 bayt- lambda yerine
-16 baytr=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'den girdi alır. Ungolfed, basitleştirilmiş:

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
Evet, s.replaceyöntemi kendim denedim ama işe yaramadı. Dizeler değişmez olduğu için orijinal dizginin yerine geçiyorsunuz
Jo King

0

Powershell, 148 145 bayt

Güzel bir meydan okuma!

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

Daha az golf oynadığı test senaryosu:

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

Çıktı:

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 bayt

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

(Dil sorudan daha yeni, ancak muhtemelen yine de APL gönderimini geçmeyecek. Umarım daha da kısalır.)

Komut satırı argümanı ile girdi alır. Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.