Magrathea 2.0 - อาคารภูเขา


50

ด้วยความผิดพลาดครั้งใหญ่ของเศรษฐกิจสากลทำให้ความต้องการดาวเคราะห์ที่ทำขึ้นเองลดลง ชาว Magratheans ต้องดูแลรายรับที่มั่นคงยิ่งขึ้นจากกลุ่มลูกค้าที่กว้างขึ้น ดังนั้นพวกเขาจึงคิดค้นห่วงโซ่ภูเขาที่มีของคุณเอง (หรือความเสียหายสั้น ๆ ในภูเขา) สำหรับผู้ที่มีงบประมาณน้อยกว่าซึ่งไม่สามารถมีดาวเคราะห์ที่สมบูรณ์ได้

ภูเขาที่มีการสร้างเป็นไปตามแผนของลูกค้า (aka สตริงตัวเลขและจุด) และส่งโดยใช้ ASCII ศิลปะ (ประกอบด้วย, /, \, ^และ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 ใช่แล้วไม่เป็นไร
โฮเวิร์ด

คำตอบ:


11

Javascript: 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()พารามิเตอร์ของ
จัดการ

@ การจัดการขอบคุณ เสร็จสิ้น
Victor Stafusa

ขออภัยฉันอาจจะพลาดบางอย่าง แต่ได้ผลลัพธ์ที่สอดคล้องกันทั้งใน FF และ Chromium ฉันเปิดเบราว์เซอร์เรียกใช้รหัส JS จากรุ่นที่ 14 และได้รับข้อความแสดงข้อผิดพลาด จากนั้นฉันก็รันโค้ดจากการแก้ไข # 1 - มันก็โอเค ฉันเรียกใช้รหัส 14 อีกครั้ง - และไม่มีข้อความแสดงข้อผิดพลาดมันทำงาน OK ดังนั้นรหัส # 14 ของการแก้ไขไม่สามารถเรียกใช้ด้วยตัวเอง?
2846289

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]
นิโคลัส 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,' ')

เป็นโบนัสนี่คือการใช้ทับทิมของอัลกอริทึม "เซลลูลาร์อัตโนมัติ" ที่ฉลาดมากของวิกเตอร์ที่ 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 ตัวอักษร - ไม่ดีเท่าเรย์ 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

Ruby, 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.และไม่สามารถดูได้ว่าทำไมมันไม่ทำงาน
โฮเวิร์ด

2

Java, 377 407

แก้ไข: @Victor ชี้ให้เห็นว่านี่เป็นโปรแกรมที่สมบูรณ์ดังนั้นฉันจึงเพิ่มอักขระสองสามโหลเพื่อให้คอมไพล์ได้และรันได้ เพียงผ่าน "ใบสั่งซื้อ" เป็นพารามิเตอร์แรกเมื่อดำเนินการโปรแกรมเช่น:java M ..3.4..6..4.3..

ฉันคิดว่าสิ่งนี้มีความคล้ายคลึงกับจิตวิญญาณของคำตอบอื่น ๆ โดยทั่วไปเพียงเดินข้าม "ระเบียบภูเขา" ซ้ำ ๆ สำหรับทุกความสูงเท่าที่เป็นไปได้และสร้างภูเขาจากยอดเขาลง ด้วยวิธีนี้ฉันจะต้องจัดการกับสี่เงื่อนไขหากไม่สร้างจุดสูงสุด - ทั้งความชันขึ้น '/', ความชันต่ำ '\, รอยต่อ' v 'หรือว่างเปล่า' ' ฉันสามารถค้นพบความเรียบง่ายนั้นได้โดยดูที่ช่องว่างทั้งสามที่อยู่กึ่งกลาง "เหนือ" ตำแหน่งปัจจุบันของฉันในโครงสร้างจากบนลงล่าง

โปรดทราบว่าเช่นเดียวกับการส่งอื่น ๆ ฉันปฏิบัติต่อสิ่งอื่นที่ไม่ใช่ตัวเลขเทียบเท่ากับ '.' ในอินพุตเพื่อความกระชับ

รุ่น Golfed:

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, 264 224 216 206 200 194 124 ไบต์

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

ขอบคุณ @JoKing ที่แสดงเป็นโซลูชัน /// นี่คือ golfed อีกเล็กน้อยหลังจากแก้ไขข้อผิดพลาด tr /// ใน Perl 6

โซลูชันดั้งเดิมของฉันพร้อม subst:

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

เอาท์พุท:

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

1
ฉันไม่คิดว่า Perl ต้องการฟังก์ชั่นหลักอย่างเคร่งครัดจุดเริ่มต้นอาจเป็นสิ่งแรกนอกฟังก์ชั่น
Nissa

ฉันใช้หลักสำหรับการจัดการพารามิเตอร์ ตอนนี้ใช้ stdin ขอบคุณ
donaldh

วิธีการแก้ปัญหาขั้นตอน ฉันแน่ใจว่าบางคนสามารถทำได้ดีกว่าด้วย regexes และ Hyperops
donaldh

1
131 ไบต์ใช้และs/// tr///ฉันคิดว่าอันสุดท้ายสามารถใช้trแทนได้sแต่ฉันไม่สามารถคิดได้ว่าจะแปลแบ็กสแลช อาจจะเป็นคนแรกเช่นกัน
Jo King

การทำงานที่ดี @JoKing - ฉันสับสนเมื่อฉันพยายามใช้ s /// และ TR /// ฉันเห็นว่าการหลีกเลี่ยงบล็อกคือคำตอบ
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/
}

แก้ไข:จริง ๆ แล้วมันเป็นข้อผิดพลาดในการทำงานกับ..3..4...6...5....1ตัวอย่างของ ProgrammerDan แต่ในกระบวนการบางไบต์ถูกปิด และทดสอบออนไลน์: 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

-63 ไบต์ขอบคุณ Jo King
-16 ไบต์ด้วยr=s.replaceแทนที่จะเป็น 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)

รับอินพุตจาก STDIN Ungolfed, simplified:

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วิธีการด้วยตัวเอง แต่มันไม่ทำงาน คุณกำลังดำเนินการแทนที่สตริงเดิมเนื่องจากสตริงนั้นไม่เปลี่ยนรูป
โจคิง

0

Powershell, 148 145 ไบต์

มันเป็นความท้าทายที่ดี!

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

สคริปต์ทดสอบ golfed น้อย:

$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

Pip -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.