Magrathea 2.0 - Berge bauen


50

Mit dem großen Zusammenbruch der Weltwirtschaft sank auch die Nachfrage nach maßgeschneiderten Planeten. Die Magratheaner mussten sich auch um stabilere Einnahmen von einer breiteren Klasse von Kunden kümmern. Aus diesem Grund haben sie die eigene Bergkette (oder kurz Chaos-O-Berge) für Menschen mit geringerem Budget erfunden, die sich keinen vollständigen Planeten leisten konnten.

Die Berge sind bauen nach Kundenwunsch Plan (auch bekannt als Strings von Ziffern und Punkten) und lieferte mit ascii-art (bestehend aus , /, \, ^und v).

Aufgabe

Schreiben Sie ein vollständiges Programm, das Eingaben (einzelne Zeichenfolge) entweder von STDIN oder als Argument empfängt und an STDOUT ausgibt. Bei diesem Puzzle handelt es sich um ein Code-Golfspiel. Zeigen Sie daher bitte einige Golfversuche.

Eingang

Eine Reihe von Punkten und Ziffern, die die Grundlage für die Bergkette bilden. Jede Saite ist genau so lang wie nötig, um die Berge zu stützen. Jeder Gipfel wird durch eine Ziffer anstelle eines Punkts angegeben, der die Höhe des Gipfels angibt.

Ausgabe

Eine ASCII-Version der Bergkette.

  • Jede Ziffer in der Eingabe repräsentiert genau einen Peak ( ^) in genau der Höhe, die von der Ziffer angegeben wird (dh 9 ist die höchste Höhe).
  • Es dürfen keine zusätzlichen Peaks in der Ausgabe vorhanden sein (dh an Stellen, an denen sich ein Punkt in der Eingabe befindet).
  • Berge haben eine dreieckige Form, dh Hänge werden mit /und \Zeichen erstellt.
  • Pässe, bei denen sich zwei Berge überlappen, werden anhand des Zeichens geformt v.
  • Keine überflüssigen Zeilenumbrüche oder Leerzeilen.
  • Das Auffüllen von Zeilen mit nachgestellten Leerzeichen ist optional.

Sie können davon ausgehen, dass die angegebene Eingabe gültig ist, dh es gibt immer eine Lösung gemäß den Regeln (z. B. würde eine Eingabe von 13..nicht zu einer gültigen Konfiguration führen und möglicherweise ignoriert). Außerdem gibt es auf jeder Seite genau so viele Punkte, dass die Berge nicht beschnitten werden dürfen.

Beispiele

Die erste Zeile zeigt den Eingang, alle anderen Zeilen bilden den gewünschten Ausgang. (Eigentlich sehen die Berge in meiner Konsole viel besser aus als hier.)

1
^

11
^^

1.2.
  ^
^/ \

.2.3..
   ^
 ^/ \
/    \

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

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

1
Was für eine Kombination aus Poesie und Kunst! Ich liebe es.
Devnull

Ist das Drucken zusätzlicher Zeilenumbrüche in Ordnung? Mit anderen Worten, für eine Eingabe von 1, ist \n\n\n\n\n\n\n\n^erlaubt?
Durron597

@durron597 Die Ausgabe sollte keine überflüssigen Zeilenumbrüche enthalten, siehe Beispiele.
Howard

Was ist mit nachgestellten Leerzeichen? Ist es in Ordnung, wenn alle Zeilen dieselbe Länge wie die ursprüngliche Zeichenfolge haben und mit Leerzeichen aufgefüllt sind?
Paul Prestidge

@Chron Ja, das ist in Ordnung.
Howard

Antworten:


11

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

Vielen Dank an @Sam für die Reduzierung von 268 auf 233 Zeichen und an @manatwork für ein weiteres Zeichen. @VadimR für den Hinweis auf einen Fehler.

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)

Richtig identifizierte und etwas ungolfierte Version mit Kommentaren:

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

Wie Sie vielleicht aus dem Code entnehmen können, funktioniert dies als zellularer Automat, bei dem jede Zelle nach einer Zahl in der Eingabe sucht, zu sich selbst und zu ihren beiden Nachbarn schaut, um zu entscheiden, was die nächste Iteration sein wird. In jedem Augenblick kann eine Zelle sein , ^, /, \, voder . Die in den Testfällen bereitgestellte Eingabe erzeugt die erwartete Ausgabe.

Beachten Sie, dass die Verwendung der alertBox zum Kotzen ist, da sie normalerweise keine monospaced Schriftart hat. Sie können den Text aus dem alertFeld kopieren und an einer anderen Stelle einfügen, um die Ausgabe besser beurteilen zu können, oder Sie ersetzen die letzte Zeile alertdurch console.log. Da dies jedoch Codegolf ist, alertist sie kürzer.

Außerdem überprüft es nichts in der Eingabe. Nicht erkannte Zeichen werden genauso wie Leerzeichen betrachtet .(tatsächlich .ist dies auch ein nicht erkanntes Zeichen).


Es gibt einen alten Golf-Trick, um 1 Zeichen zu reduzieren: Variablen mit leerem String als prompt()Parameter initialisieren .
Manatwork

@manatwork Danke. Getan.
Victor Stafusa

Entschuldigen Sie, vielleicht fehlt mir etwas, aber ich erhalte sowohl bei FF als auch bei Chrom konsistente Ergebnisse. Ich starte einen Browser, führe JS-Code ab Version 14 aus und erhalte eine Fehlermeldung. Dann führe ich Code aus Revision 1 aus - er läuft in Ordnung. Ich führe wieder den Code von 14 aus - und keine Fehlermeldung, es läuft OK. Der Code von Revision 14 kann also nicht alleine ausgeführt werden?
user2846289

1
@VadimR Danke, behoben. Dies war ein Nebeneffekt beim Testen in einer verschmutzten Umgebung. delete r; delete s; delete q; delete p; delete t; delete i; delete d;Muss dem Code ein Präfix voranstellen, um sicherzustellen, dass er nicht verunreinigt wurde.
Victor Stafusa

q.trim()?q+'\n':''könnte sein q.trim()&&q+'\n', sparen zwei. Könnte i<p.lengthauch nur sein p[i].
Nicholas Pipitone

6

Rubin, 208 201 189

Sehr lustige Herausforderung! Hier ist eine alternative Ruby-Lösung.

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

Als Bonus gibt es hier eine Ruby-Implementierung von Victors sehr cleverem "Cellular Automon" -Algorithmus mit 162 Zeichen:

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

Beispielausgabe:

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

1
Ich denke, Sie können $/für Newline verwenden.
Howard

4

588 Zeichen - aber nicht so gut wie Rays 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);}}}

Beispielausgabe:

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

Oder eine längere komplexere ...

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

Geniales Puzzle ... nicht so einfach wie es scheint ... es hat uns sehr gut gefallen!


2
"Komplex eins" ist schlecht geformt, es gibt keine Spitze für "3".
user2846289

Alle 3s sind da. Wenn Sie über den ersten sprechen, ist es ein Teil des Abhangs.
Hein Wessels

4

APL, 65 Bytes

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

Dieses Symbol gibt rohe (nicht ausgewertete) Eingaben als Zeichenarray zurück.

Interaktives Lösen in einer APL-Sitzung:

      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 Zeichen

Puh, das hier war schwierig.

Am Ende musste ich für jedes Zeichen eine neue Zeichenfolge anhängen, wobei eine Variable verwendet wurde s, die "nächstes Zeichen überspringen" bedeutete ^und für die Verarbeitung benötigt wurde \.

Diese Ausgabe entspricht genau der angegebenen Beispielausgabe für alle Testfälle.

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

Diagramm der Bedeutung der Variablen:

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.

Ich bin sicher, ich könnte noch viel mehr Golf spielen , aber ich muss jetzt gehen. Wird später verbessert!


Ich kämpfe mit der Eingabe .2.2.und kann nicht sehen, warum es nicht funktioniert.
Howard

2

Java, 377 407

Edit: @ Victor wies darauf hin, dass dies ein vollständiges Programm sein musste, also habe ich ein paar Dutzend Zeichen hinzugefügt, um es kompilierbar und lauffähig zu machen. Übergeben Sie einfach die "Bestellung" als ersten Parameter, wenn Sie das Programm ausführen:java M ..3.4..6..4.3..

Ich denke, dies ähnelt im Geiste anderen Antworten, durchquert einfach wiederholt die "Gebirgsordnung" für jede mögliche Höhe und baut die Berge von oben nach unten. Auf diese Weise muss ich mich nur mit vier Bedingungen auseinandersetzen, wenn ich keine Spitze errichte - entweder eine Steigung '/', eine Abwärtssteigung '\, eine Verbindung' v 'oder eine Leerstelle' '. Ich kann das einfach herausfinden, indem ich die drei Felder betrachte, die "über" meiner aktuellen Position in meinem Top-Down-Gebäude zentriert sind.

Beachten Sie, dass ich wie bei anderen Einsendungen alles andere als eine Zahl als äquivalent zu "." in der Eingabe der Kürze halber.

Golf Version:

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

Vom Menschen lesbare Form (und ohne einige der entsprechenden Transmogrifikationen, um die Golfform zu erreichen):

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

Genießen.

Beispielausgabe:

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

Die Frage erwähnt Schreiben Sie ein vollständiges Programm , also fügen Sie bitte das fehlende hinzu class X{public static void main(String[]z){.
Victor Stafusa

Direkt am. Ich wurde durch den nächsten Abschnitt dieses Satzes - "oder als Argument" - fehlgeleitet und habe den gesamten Programmteil verpasst. Ich werde es in Kürze aktualisieren.
ProgrammerDan

2

Perl 6, 264 224 216 206 200 194 124 Bytes

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

Vielen Dank an @JoKing für die Anzeige als /// Lösung. Dies ist etwas weiter fortgeschritten, nachdem der Fehler in Perl 6 behoben wurde.

Meine ursprüngliche Lösung mit 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
    }
}

Ausgabe:

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

1
Ich glaube nicht, dass Perl unbedingt eine Hauptfunktion benötigt, der Einstiegspunkt kann nur das Erste außerhalb einer Funktion sein.
Nissa

Ich habe main für die Parameterbehandlung verwendet. Jetzt mit stdin. Vielen Dank.
donaldh

Eine prozedurale Lösung. Ich bin mir sicher, dass jemand mit Regexen und Hyperops besser umgehen kann.
donaldh

1
131 Bytes mit s///und tr///. Ich denke, dass Letzteres transtelle von verwendet werden kann, saber ich kann es nicht ganz herausfinden, um Backslashes zu übersetzen. Vielleicht auch der erste
Jo King

Gute Arbeit @JoKing - Ich geriet in ein Thema-Chaos, als ich versuchte, s /// und TR /// zu verwenden. Ich sehe, dass das Vermeiden von Blöcken die Antwort ist.
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/
}

Bearbeiten: Eigentlich ist es ein Bugfix, mit ProgrammerDans ..3..4...6...5....1Beispiel zu arbeiten, aber dabei waren einige Bytes deaktiviert. Und Online-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 und kommentiert:

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

Beispiel:

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

Ich denke, es gibt jedoch vor jeder Zeile ein zusätzliches Leerzeichen aus.


1

CJam, 128 117 112 106 104 Bytes

CJam ist etwas jünger als diese Herausforderung, sodass diese Antwort nicht konkurriert. Dies war jedoch eine sehr schöne Herausforderung! Nach dem geringen Wissen über J und APL denke ich, dass eine Einsendung in diesen Fällen beeindruckend kurz wäre.

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*

Hier ist ein Testfall, der meiner Meinung nach alle möglichen Kombinationen von Steigungen, Gipfeln und Tälern enthält:

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

was ergibt

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

Teste es hier.

Ich werde später eine Erklärung für den Code hinzufügen.


1

Python, 297 234 218

-63 Bytes dank Jo King
-16 Bytes mit r=s.replaceanstelle von 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)

Übernimmt die Eingabe von STDIN. Ungolfed, vereinfacht:

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
Ja, ich habe die s.replaceMethode selbst ausprobiert , aber sie funktioniert nicht. Sie ersetzen nur die ursprüngliche Saite, da die Saiten unveränderlich sind
Jo King

0

Powershell, 148 145 Bytes

Es ist eine schöne Herausforderung!

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

Weniger Golf-Testskript:

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

Ausgabe:

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 Bytes

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

(Die Sprache ist neuer als die Frage, aber wahrscheinlich wird sie die APL-Einreichung trotzdem nicht übertreffen. Obwohl ich hoffe, dass sie viel kürzer wird.)

Übernimmt die Eingabe über das Befehlszeilenargument. Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.