Magrathea 2.0 - Membangun Pegunungan

50

Dengan kehancuran besar ekonomi universal, permintaan akan planet-planet yang dibuat sesuai pesanan juga jatuh. Orang Magrathean harus menjaga pemasukan yang lebih stabil juga dari kelas pelanggan yang lebih luas. Oleh karena itu, mereka menciptakan rantai gunung milik sendiri (atau malapetaka pendek) untuk orang-orang dengan anggaran lebih kecil yang tidak mampu membeli planet yang lengkap.

Gunung-gunung yang membangun sesuai dengan rencana pelanggan (alias string digit dan titik) dan dikirimkan menggunakan ascii-seni (yang terdiri dari , /, \, ^dan v).

Tugas

Tulis program lengkap yang mengambil input (string tunggal) baik dari STDIN atau sebagai argumen dan output ke STDOUT. Teka-teki ini adalah kode-golf jadi tolong tunjukkan beberapa usaha bermain golf.

Memasukkan

Sederetan titik dan angka menyediakan dasar untuk rantai gunung. Setiap string tepat selama diperlukan untuk mendukung pegunungan dan setiap puncak diberikan oleh digit, bukan titik, yang menunjukkan ketinggian puncak.

Keluaran

Versi rantai gunung ascii.

  • Setiap digit pada input mewakili tepat satu puncak ( ^) tepat pada ketinggian yang ditunjukkan oleh digit (yaitu 9 adalah ketinggian tertinggi).
  • Tidak boleh ada puncak tambahan dalam output (yaitu di tempat-tempat di mana ada titik di input).
  • Pegunungan berbentuk segitiga, yaitu lereng dibuat menggunakan /dan \karakter.
  • Berlalu di mana dua gunung tumpang tindih dibentuk menggunakan karakter v.
  • Tidak ada baris baru atau garis kosong yang berlebihan.
  • Garis padding dengan spasi tambahan adalah opsional.

Anda dapat berasumsi bahwa input yang diberikan valid, artinya selalu ada solusi sesuai dengan aturan (mis. Input 13..tidak akan menghasilkan konfigurasi yang valid dan dapat diabaikan). Terlebih lagi, di setiap sisi ada banyak titik sehingga gunung tidak boleh dipangkas.

Contohnya

Baris pertama menunjukkan input, semua baris lainnya merupakan output yang diinginkan. (Sebenarnya pegunungan terlihat jauh lebih baik di konsol saya daripada di sini.)

1
^

11
^^

1.2.
  ^
^/ \

.2.3..
   ^
 ^/ \
/    \

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

...4...3...3..
   ^
  / \  ^   ^ 
 /   \/ \ / \
/        v   \
Howard
sumber
1
Benar-benar kombinasi antara puisi dan seni! Aku menyukainya.
devnull
Apakah mencetak baris baru tambahan oke? Dengan kata lain, untuk input 1, apakah \n\n\n\n\n\n\n\n^diizinkan?
durron597
@ durron597 Output seharusnya tidak memiliki baris baru yang berlebihan, lihat contoh-contohnya.
Howard
Bagaimana dengan karakter spasi tambahan? Apakah boleh jika semua garis memiliki panjang yang sama dengan string asli, diisi dengan spasi?
Paul Prestidge
@ Chron Ya, tidak apa-apa.
Howard

Jawaban:

11

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

Terima kasih kepada @Sam untuk menguranginya dari 268 menjadi 233 karakter, dan untuk @manatwork untuk 1 karakter lainnya. @VadimR untuk menunjukkan bug.

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)

Versi yang teridentifikasi dengan benar dan agak tidak bercampur dengan komentar:

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

Seperti yang Anda catat dari kode, ini berfungsi sebagai otomat seluler, di mana setiap sel memeriksa nomor dalam input, mencari sendiri dan kedua tetangganya untuk memutuskan apa iterasi berikutnya. Pada setiap saat sel mungkin ^, /, \, vatau . Input yang disediakan dalam kasus uji menghasilkan output yang diharapkan.

Perhatikan bahwa menggunakan alertkotak itu menyebalkan, karena biasanya tidak memiliki font monospace. Anda dapat menyalin & menempelkan teks dari alertkotak ke tempat lain untuk apresiasi yang lebih baik dari output, atau Anda dapat mengganti baris terakhir alertdengan console.log, tetapi karena ini adalah kode-golf, alertlebih pendek.

Selanjutnya, itu tidak memvalidasi apa pun dalam input. Ini hanya menganggap karakter yang tidak dikenal sebagai spasi dengan cara yang sama dengan yang dilakukannya .(sebenarnya .adalah karakter yang tidak dikenal juga).

Victor Stafusa
sumber
Ada trik golf lama untuk mengurangi 1 karakter: menginisialisasi variabel dengan string kosong sebagai prompt()parameter .
manatwork
@manatwork Terima kasih. Selesai.
Victor Stafusa
Maaf, mungkin saya kehilangan sesuatu, tapi saya mendapatkan hasil yang konsisten di FF dan Chromium. Saya meluncurkan browser, menjalankan kode JS dari revisi # 14, dan mendapatkan pesan kesalahan. Lalu saya menjalankan kode dari revisi # 1 - itu berjalan OK. Sekali lagi saya menjalankan kode 14 - dan tidak ada pesan kesalahan, itu berjalan OK. Jadi kode revisi # 14 tidak dapat dijalankan dengan sendirinya?
user2846289
1
@ Sadim Terima kasih, sudah diperbaiki. Itu adalah efek samping untuk mengujinya dengan lingkungan yang terpolusi. Diperlukan untuk mengawali kode dengan delete r; delete s; delete q; delete p; delete t; delete i; delete d;untuk memastikan bahwa itu tidak terpolusi.
Victor Stafusa
q.trim()?q+'\n':''bisa jadi q.trim()&&q+'\n', hemat dua. Juga, i<p.lengthbisa saja p[i].
Nicholas Pipitone
6

Rubi, 208 201 189

Tantangan yang sangat menyenangkan! Inilah solusi Ruby alternatif.

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

Sebagai bonus, berikut ini adalah implementasi Ruby dari algoritma "seluler otomat" Victor yang sangat pintar, dengan karakter 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$*

Contoh output:

....5.....6..6.....
          ^  ^
    ^    / \/ \
   / \  /      \
  /   \/        \
 /               \
/                 \
Paul Prestidge
sumber
1
Saya pikir Anda dapat menggunakan $/untuk baris baru.
Howard
4

C # - 588 karakter - tidak sebagus 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);}}}

Contoh output:

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

Atau yang lebih kompleks lagi ...

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

Teka-teki brilian ... tidak semudah kelihatannya ... menyukainya!

pengguna17567
sumber
2
"Kompleks satu" tidak berbentuk, tidak ada puncak untuk "3".
user2846289
Semua ada 3di sana. Jika Anda berbicara tentang yang pertama, itu bagian dari lereng.
Hein Wessels
4

APL, 65 byte

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

simbol ini mengembalikan input mentah (tidak dievaluasi) sebagai larik karakter.

Memecahkan secara interaktif, dalam sesi 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   \
ngn
sumber
3

Ruby, 390 karakter

Wah, ini rumit.

Saya akhirnya harus menambahkan string baru untuk setiap karakter, menggunakan variabel syang berarti "lewati karakter berikutnya" yang diperlukan untuk memproses ^dan \.

Output ini persis output sampel yang diberikan untuk semua kasus uji.

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

Bagan apa arti variabel:

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.

Saya yakin saya bisa bermain golf lebih banyak, tetapi saya harus pergi sekarang. Harus ditingkatkan nanti!

Gagang pintu
sumber
Saya berjuang dengan input .2.2.dan tidak bisa melihat mengapa itu tidak berhasil.
Howard
2

Jawa, 377 407

Sunting: @ Viktor menunjukkan bahwa ini perlu menjadi program yang lengkap, jadi saya menambahkan beberapa lusin karakter agar dapat dikompilasi dan dijalankan. Cukup lewati "pesanan pembelian" sebagai param pertama ketika menjalankan program, seperti:java M ..3.4..6..4.3..

Saya pikir ini mirip semangat dengan jawaban lain, pada dasarnya hanya melintasi "tatanan gunung" berulang kali untuk setiap ketinggian yang mungkin, dan membangun gunung dari puncak ke bawah. Dengan begitu saya hanya harus berurusan dengan empat kondisi jika tidak membangun puncak - baik kemiringan ke atas '/', kemiringan ke bawah '\, sambungan' v ', atau kosong' '. Saya dapat menemukan yang sederhana dengan melihat tiga ruang yang berpusat "di atas" posisi saya saat ini dalam bangunan top-down saya.

Perhatikan bahwa seperti kiriman lainnya, saya memperlakukan apa pun selain angka yang setara dengan '.' di input, untuk singkatnya.

Versi golf:

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

Bentuk yang dapat dibaca manusia (dan tanpa beberapa transmogrifikasi yang setara untuk mencapai bentuk 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);
    }
}

Nikmati.

Contoh output:

$ java M ..3..4...6...5....1
         ^
        / \  ^
     ^ /   \/ \
  ^ / v        \
 / v            \
/                \^
ProgrammerDan
sumber
Pertanyaannya menyebutkan Menulis program yang lengkap , jadi tolong, tambahkan yang hilang class X{public static void main(String[]z){.
Victor Stafusa
Tepat. Saya salah arah oleh bagian selanjutnya dari kalimat itu - "atau sebagai argumen" dan melewatkan bagian program yang lengkap. Saya akan segera memperbaruinya.
ProgrammerDan
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

Terima kasih kepada @JoKing karena tampil sebagai solusi ///. Ini golf sedikit lebih jauh setelah memperbaiki tr /// bug di Perl 6.

Solusi asli saya dengan subt:

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

Tidak Disatukan:

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

Keluaran:

...4...3...33..4..4....2.3.22.33.5..22...333.222.3..
                                 ^                  
   ^           ^  ^             / \                 
  / \  ^   ^^ / \/ \     ^    ^^   \     ^^^     ^  
 /   \/ \ /  v      \  ^/ \^^/      ^^  /   \^^^/ \ 
/        v           \/               \/           \
donaldh
sumber
1
Saya tidak berpikir Perl benar-benar membutuhkan fungsi utama, titik masuk hanya bisa menjadi hal pertama di luar fungsi.
Nissa
Saya menggunakan utama untuk penanganan parameter. Sekarang menggunakan stdin. Terima kasih.
donaldh
Solusi prosedural. Saya yakin seseorang dapat melakukan lebih baik dengan regex dan hyperops.
donaldh
1
131 byte menggunakan s///dan tr///. Saya pikir yang terakhir dapat digunakan trsebagai pengganti stapi saya tidak bisa memikirkan untuk menerjemahkan backslash. Mungkin yang pertama juga
Jo King
Nice work @JoKing - Saya masuk ke topik berantakan ketika saya mencoba menggunakan s /// dan TR ///. Saya melihat bahwa menghindari balok adalah jawabannya.
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/
}

Sunting: sebenarnya ini adalah perbaikan bug untuk bekerja dengan ..3..4...6...5....1contoh ProgrammerDan , tetapi, dalam prosesnya, beberapa byte tidak aktif. Dan tes online: https://ideone.com/P4XpMU

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

Tidak dikumpulkan dan berkomentar:

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

Contoh:

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

Saya pikir ini menghasilkan ruang ekstra sebelum setiap baris.

Ray Poward
sumber
1

CJam, 128 117 112 106 104 byte

CJam sedikit lebih muda dari tantangan ini sehingga jawaban ini tidak bersaing. Ini adalah tantangan yang sangat bagus! Dari sedikit yang saya tahu tentang J dan APL, saya pikir penyerahan pada mereka akan sangat singkat.

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*

Ini adalah contoh uji, yang menurut saya berisi semua kemungkinan kombinasi lereng, puncak dan palung:

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

yang menghasilkan

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

Uji di sini.

Saya akan menambahkan penjelasan untuk kode nanti.

Martin Ender
sumber
1

Python, 297 234 218

-63 bytes berkat Jo King
-16 bytes dengan r=s.replacebukannya 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)

Mengambil input dari STDIN. Tidak disatukan, disederhanakan:

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`)
Duncan Whyte
sumber
234 byte
Jo King
1
Ya, saya mencoba s.replacemetode ini sendiri, tetapi tidak berhasil. Anda hanya melakukan penggantian pada string asli karena string tidak dapat diubah
Jo King
0

Powershell, 148 145 byte

Ini tantangan yang bagus!

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

Skrip uji yang kurang golf:

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

Keluaran:

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                \    ^/       \/ \
mazzy
sumber
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^^"

(Bahasa lebih baru dari pertanyaan, tetapi mungkin tidak akan mengalahkan pengajuan APL. Meskipun saya berharap itu akan menjadi jauh lebih pendek.)

Mengambil input melalui argumen baris perintah. Cobalah online!

DLosc
sumber