Magrathea 2.0 - Construire des montagnes

50

Avec le grand krach de l'économie universelle, la demande de planètes sur mesure a également plongé. Les Magrathiens ont également dû gérer des revenus plus stables provenant d’une catégorie plus large de clients. Par conséquent, ils ont inventé la chaîne de montagne à faire soi-même (ou petits ravages) pour les personnes disposant d'un petit budget et ne pouvant se permettre une planète complète.

Les montagnes sont construites selon le plan du client (aka chaînes de chiffres et de points) et livrés en utilisant ascii-art (composé de , /, \, ^et v).

Tâche

Ecrivez un programme complet qui prend en entrée (chaîne unique) soit à partir de STDIN, soit sous forme d'argument et sort à STDOUT. Ce casse-tête est un code-golf, alors veuillez montrer votre tentative de jouer au golf.

Contribution

Une chaîne de points et de chiffres constituant la base de la chaîne de montagnes. Chaque chaîne est exactement aussi longue que nécessaire pour supporter les montagnes et chaque pic est donné par un chiffre au lieu d'un point, indiquant la hauteur du pic.

Sortie

Une version ascii de la chaîne de montagne.

  • Chaque chiffre de l’entrée représente exactement un pic ( ^) à la hauteur indiquée par le chiffre (c’est-à-dire que 9 correspond à la hauteur la plus élevée).
  • Il ne doit pas y avoir de pics supplémentaires dans la sortie (c'est-à-dire aux endroits où il y a un point dans l'entrée).
  • Montagnes sont de forme triangulaire, à savoir les pentes sont créés en utilisant /et \caractères.
  • Les passes où deux montagnes se chevauchent sont façonnées à l'aide du personnage v.
  • Pas de nouvelles lignes superflues ni de lignes vierges.
  • Les lignes de remplissage avec des espaces de fin sont facultatives.

Vous pouvez supposer que l'entrée fournie est valide, c'est-à-dire qu'il existe toujours une solution conforme aux règles (par exemple, une entrée de 13..ne donnerait pas lieu à une configuration valide et pourrait être ignorée). De plus, il y a exactement autant de points sur chaque côté que les montagnes ne doivent pas être recadrées.

Exemples

La première ligne montre l'entrée, toutes les autres lignes constituent la sortie souhaitée. (En fait, les montagnes ont l'air beaucoup mieux dans ma console qu'ici.)

1
^

11
^^

1.2.
  ^
^/ \

.2.3..
   ^
 ^/ \
/    \

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

...4...3...3..
   ^
  / \  ^   ^ 
 /   \/ \ / \
/        v   \
Howard
la source
1
Quelle combinaison de poésie et d'art! J'aime cela.
devnull
L'impression de nouvelles lignes supplémentaires est-elle correcte? En d'autres termes, pour une entrée de 1, est \n\n\n\n\n\n\n\n^autorisé?
durron597
@ durron597 La sortie ne devrait pas avoir de nouvelles lignes superflues, regardez les exemples.
Howard
Qu'en est-il des caractères d'espace de fuite? Est-ce correct si toutes les lignes ont la même longueur que la chaîne d'origine, complétée d'espaces?
Paul Prestidge
@Chron Oui, c'est bon.
Howard

Réponses:

11

Javascript: 272 268 233 232 201 192 189 189 188 178 180 caractères

Merci à @Sam pour l’avoir réduit de 268 à 233 caractères et à @manatwork pour un autre caractère. @VadimR pour avoir signalé un bogue.

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)

Version correctement identifiée et un peu non-lisée avec commentaires:

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

Comme vous pouvez le constater d'après le code, cela fonctionne comme un automate cellulaire, où chaque cellule vérifie la présence d'un nombre dans l'entrée, regarde elle-même et ses deux voisins pour décider de la prochaine itération. A chaque instant une cellule peut être ^, /, \, vou . L'entrée fournie dans les cas de test produit la sortie attendue.

Notez que l’utilisation de la alertboîte est nulle, car elle n’a normalement pas de police à espacement fixe. Vous pouvez copier-coller le texte de la alertboîte vers un autre emplacement pour une meilleure appréciation de la sortie, ou vous pouvez remplacer la dernière ligne alertpar console.log, mais puisque c'est du code-golf, alertc'est plus court.

De plus, cela ne valide rien dans l'entrée. Il considère simplement les caractères non reconnus comme des espaces de la même manière que lui .(en fait, il .s'agit également d'un caractère non reconnu).

Victor Stafusa
la source
Il existe une vieille astuce de golf pour réduire 1 caractère: initialiser les variables avec une chaîne vide en tant que prompt()paramètre .
manatwork
@manatwork Merci. Terminé.
Victor Stafusa
Excusez-moi, il me manque peut-être quelque chose, mais j'obtiens des résultats cohérents en FF et en Chromium. Je lance un navigateur, lance le code JS à partir de la révision 14 et reçois un message d'erreur. Ensuite, je lance le code de la révision n ° 1 - il fonctionne correctement. Encore une fois, je lance le code de 14 - et aucun message d'erreur, il fonctionne correctement. Le code de la révision 14 ne peut donc pas être exécuté par lui-même?
user2846289
1
@VadimR Merci, corrigé. C'était un effet secondaire de le tester dans un environnement corrigé. Nécessaire de préfixer le code avec delete r; delete s; delete q; delete p; delete t; delete i; delete d;pour s'assurer qu'il n'était pas corrigé.
Victor Stafusa
q.trim()?q+'\n':''pourrait être q.trim()&&q+'\n', sauver deux. Aussi, i<p.lengthpourrait juste être p[i].
Nicholas Pipitone
6

Rubis, 208 201 189

Défi très amusant! Voici une solution alternative Ruby.

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

En bonus, voici une implémentation Ruby du très intelligent algorithme "d'automate cellulaire" de Victor, à 162 caractères:

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

Exemple de sortie:

....5.....6..6.....
          ^  ^
    ^    / \/ \
   / \  /      \
  /   \/        \
 /               \
/                 \
Paul Prestidge
la source
1
Je pense que vous pouvez utiliser $/pour newline.
Howard
4

C # - 588 caractères - pas aussi bon que 321 de Ray!

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

Exemple de sortie:

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

Ou un plus long, plus complexe ...

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

Brillant puzzle ... pas aussi facile qu'il y paraît ... a adoré!

utilisateur17567
la source
2
"Complex one" est mal formé, il n'y a pas de pic pour "3".
user2846289
Tous les 3s sont là. Si vous parlez du premier, cela fait partie de la pente.
Hein Wessels
4

APL, 65 octets

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

Ce symbole renvoie une entrée brute (non évaluée) sous forme de tableau de caractères.

Résolution interactive, dans une session 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
la source
3

Ruby, 390 personnages

Ouf, celui-ci était délicat.

J'ai fini par devoir ajouter une nouvelle chaîne pour chaque caractère, en utilisant une variable squi signifiait "ignorer le prochain caractère", ce qui était nécessaire pour le traitement ^et \.

Cette sortie correspond exactement à la sortie d'échantillon donnée pour tous les cas de test.

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

Tableau de la signification des variables:

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.

Je suis sûr que je pourrais jouer au golf beaucoup plus, mais je dois y aller maintenant. Doit être amélioré plus tard!

Poignée de porte
la source
Je me bats avec l'entrée .2.2.et je ne vois pas pourquoi cela ne fonctionne pas.
Howard
2

Java, 377 407

Edit: @Victor a souligné que ce programme devait être complet. J'ai donc ajouté quelques dizaines de caractères pour le rendre compilable et exécutable. Il suffit de passer le "bon de commande" en tant que premier paramètre lors de l'exécution du programme, comme suit:java M ..3.4..6..4.3..

Je pense que cela ressemble dans l’esprit à d’autres réponses: fondamentalement, il parcourt «l’ordre des montagnes» à plusieurs reprises pour toutes les hauteurs possibles et construit les montagnes du haut vers le bas. De cette façon, je n'ai à gérer que quatre conditions, si ce n'est de construire un sommet - soit une pente ascendante '/', une pente descendante '\, un joint' v 'ou un espace vide' '. Je peux découvrir cela très simplement en regardant les trois espaces centrés "au-dessus" de ma position actuelle dans ma construction descendante.

Notez que, comme d’autres soumissions, je considère que rien n’est équivalent à «.». dans l'entrée, par souci de concision.

Version golfée:

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

Forme lisible par l'homme (et sans certaines des transmogrifications équivalentes pour atteindre la forme de 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);
    }
}

Prendre plaisir.

Exemple de sortie:

$ java M ..3..4...6...5....1
         ^
        / \  ^
     ^ /   \/ \
  ^ / v        \
 / v            \
/                \^
ProgrammeurDan
la source
La question mentionne Écrire un programme complet , alors s'il vous plaît, ajoutez les éléments manquants class X{public static void main(String[]z){.
Victor Stafusa
Droit sur. J'ai été mal dirigé par la section suivante de cette phrase - "ou comme argument" et j'ai manqué la partie complète du programme. Je vais le mettre à jour sous peu.
ProgrammerDan
2

Perl 6, 264 224 216 206 200 200 194 124 octets

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

Merci à @JoKing pour son affichage en tant que /// solution. Ceci est joué un peu plus loin après avoir corrigé le bug tr /// dans Perl 6.

Ma solution originale avec 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
    }
}

Sortie:

...4...3...33..4..4....2.3.22.33.5..22...333.222.3..
                                 ^                  
   ^           ^  ^             / \                 
  / \  ^   ^^ / \/ \     ^    ^^   \     ^^^     ^  
 /   \/ \ /  v      \  ^/ \^^/      ^^  /   \^^^/ \ 
/        v           \/               \/           \
Donaldh
la source
1
Je ne pense pas que Perl ait strictement besoin d'une fonction principale, le point d'entrée peut simplement être la première chose à l'extérieur d'une fonction.
Nissa
J'ai utilisé main pour la gestion des paramètres. Maintenant, utilisez stdin. Merci.
donaldh
Une solution procédurale. Je suis sûr que quelqu'un peut faire mieux avec les regex et les hyperops.
donaldh
1
131 octets utilisant s///et tr///. Je pense que le dernier peut être utilisé à la trplace de, smais je ne peux pas comprendre la traduction des barres obliques inverses. Peut-être le premier aussi
Jo King
Beau travail @JoKing - Je me suis retrouvé dans un désordre sujet quand j'ai essayé d'utiliser s /// et TR ///. Je vois qu'éviter les blocages est la solution.
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/
}

Edit: en réalité, corriger l' ..3..4...6...5....1exemple avec ProgrammerDan est une correction de bogue , mais dans le processus, certains octets étaient désactivés. Et test en ligne: https://ideone.com/P4XpMU

utilisateur2846289
la source
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 et commenté:

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

Exemple:

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

Je pense qu'il génère un espace supplémentaire avant chaque ligne, cependant.

Ray Poward
la source
1

CJam, 128 117 112 106 104 octets

CJam est un peu plus jeune que ce défi, donc cette réponse n’est pas concurrentielle. C'était un très beau défi cependant! D'après le peu que je sais sur J et APL, je pense qu'une soumission dans ces cas serait très courte.

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*

Voici un cas de test qui, à mon avis, contient toutes les combinaisons possibles de pentes, de sommets et de creux:

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

qui donne

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

Testez-le ici.

Je vais ajouter une explication pour le code plus tard.

Martin Ender
la source
1

Python, 297 234 218

-63 octets grâce à Jo King
-16 octets au r=s.replacelieu de 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)

Prend l'entrée de STDIN. Ungolfed, simplifié:

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
la source
234 octets
Jo King
1
Oui, j'ai essayé la s.replaceméthode moi-même, mais ça ne marche pas. Vous effectuez simplement des remplacements sur la chaîne d'origine car les chaînes sont immuables
Jo King
0

Powershell, 148 145 octets

C'est un beau challenge!

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

Script de test moins joué:

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

Sortie:

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
la source
0

Pip -l , 100 octets

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

(La formulation est plus récente que la question, mais ne va probablement pas battre la soumission APL de toute façon. Bien que j'espère qu'elle sera beaucoup plus courte.)

Prend une entrée via un argument de ligne de commande. Essayez-le en ligne!

DLosc
la source