Esa es una montaña extraña!

10

¡Inspirado en Mostrar una cadena de pequeñas montañas con un número impar en la parte superior! por @sygmei .

¿Por qué tener una cadena de montañas cuando puedes tener una masiva?

Haga un programa que tome un número de entrada e imprima una montaña con cada número impar hasta el número de entrada.

(Donde "sudoeste" significa directly below and to the left, y "sudeste" significa directly below and to the right)

Cada número tendrá un /sudoeste y un \sudeste. Comienza 1en la parte superior, y el siguiente número irá al suroeste de a /o al sureste de a \. El siguiente número irá en la línea más cercana a la parte superior y a la izquierda más posible.

Para un número de varios dígitos, solo el primer dígito debe estar en el lugar correcto con los otros dígitos directamente después, y solo el primer dígito debe tener \y /salir de él.

La montaña hasta 1 o 2 es solo:

 1
/ \

Una montaña de hasta 3 o 4 es solo:

   1
  / \
 3
/ \

Para 25 o 26:

         1
        / \
       3   5
      / \ / \
     7   9   11
    / \ / \ / \
   13  15  17  19
  / \ / \ / \ / \
 21  23  25
/ \ / \ / \

Las últimas dos líneas donde la entrada es 121:

 111 113 115 117 119 121
/ \ / \ / \ / \ / \ / \

Y las dos últimas líneas donde la entrada es 1019:

 993 995 997 999 1001100310051007100910111013101510171019
/ \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \

Puede suponer que la entrada será mayor que 0 y menor que 10001 (exclusivo).

Los espacios finales están bien, y los espacios iniciales adicionales están bien siempre que haya lo mismo en todas las líneas.

Este es el , por lo que gana el programa más corto en bytes.

Puede encontrar una respuesta no escrita a esto en línea aquí (en Python en repl.it) si necesita más casos de prueba.

Artyer
fuente
Si la entrada es menor que 101, ¿por qué tiene un caso de prueba 121?
LegionMammal978
@ LegionMammal978 Quise decir 10001, arreglado ahora. ¡Gracias!
Artyer
1
Más duro que el original, lo intentaré: D
Sygmei

Respuestas:

5

05AB1E , 54 52 47 46 bytes

ÅɹL£D€g__ÏRv"/ \ "yg×N·©úˆyvy4yg-ð×}J®>úˆ}¯R»

Pruébalo en línea!

Explicación

                                                # implicit input n
ÅÉ                                              # push a list of uneven numbers up to input
  ¹L£                                           # divide into sublists of length 1,2,3...n
     D€g__Ï                                     # remove empty sublists
           R                                    # reverse list
            v                                   # for each sublist
             "/ \ "                             # push the string "/ \ "
                   yg×                          # repeat it len(sublist) times
                      N·©ú                      # prepend (sublist index)*2 spaces
                          ˆ                     # add to global list
                           yv                   # for each number in sublist
                             y4yg-ð×            # prepend spaces until length is 4
                                    }           # end inner loop
                                     J          # join to string
                                      ®>ú       # prepend (sublist index)*2+1 spaces
                                         ˆ      # add to global list
                                          }     # end outer loop
                                           ¯    # push global list
                                            R   # reverse it
                                             »  # join rows by space and columns by newline
                                                # implicitly print

Podría haber ahorrado 5 bytes ÅɹL£D€g__ÏRv"/ \ "yg×N·©úˆy4jJðÛ®>úˆ}¯R»si hubiera empujado esa corrección de errores para j que escribí hace varias semanas : /

Emigna
fuente
3

Lote, 335 bytes

@echo off
set i=
set/ac=w=0
:l
set i=  %i%
set/aw+=2,c+=w
if %c% lss %1 goto l
set s=
set t=
set/ac=w=1
for /l %%a in (1,2,%1) do call:c %%a
echo  %s%
echo%t%
exit/b
:c
if not %c%==0 goto g
echo%i%%s%
set i=%i:~2%
echo%i%%t%
set s=
set t=
set/aw+=1,c=w
:g
set n=%1   (three trailing spaces)
set s=%s%%n:~0,4%
set t=%t% / \
set/ac-=1
Neil
fuente
@Artyer Estoy bastante seguro de que cmd /Q /C file.batcuenta con 3 bytes adicionales, pero aún así es mejor que @echo off. Debe publicar eso en la pregunta de consejos de Batch.
Neil
3

Python 2, 160 149 143 bytes

Gracias TFeld por guardar 11 bytes y Artyer por guardar 6 bytes

x=range(1,input()+1,2);y=[];i=1
while x:y+=[''.join('%-4d'%j for j in x[:i]),'/ \ '*len(x[:i])];x=x[i:];i+=1
while y:print' '*~-len(y)+y.pop(0)
varilla
fuente
Puede hacerlo i=len(y)y en for l in y:print' '*i+l;i-=1lugar de for i,l in enumerate(y):print(len(y)-i-1)*' '+lpor -10 bytes
TFeld el
También creo que se puede cambiar \\ de \ puesto que está delante de un espacio
TFeld
Puede cambiar las últimas 2 líneas a while y:print' '*-~len(y)+y.pop(0). Ahorra 3 bytes.
Artyer
1
@ Rod Oops ... quise %-4ddejarlo justificar por 4.
Artyer
1
@Artyer woah, este valor negativo para justificar a la izquierda es nuevo para mí: D, buen truco
Rod
2

Perl, 134

133 bytes + 1 para la -popción

 $l="/ \\ ";$t=" ";while($c++<$_) {$t.=sprintf'%-4d',$c++;$v.=$l;if ($i++>=$j){$t=~s/^/  /gm;$t.="
  $v
 ";$i=$v="";$j++}}$_="$t
$v";

Versión formateada (la versión original de golf utiliza "nuevas líneas" reales en lugar de \ n)

$l="/ \\ ";
$t=" ";
while($c++<$_) {
   $t.=sprintf'%-4d',$c++;
   $v.=$l;
   if ($i++>=$j){
      $t=~s/^/  /gm;
      $t.="\n  $v\n ";
      $i=$v="";
      $j++
   }
}
$_="$t\n$v";
Adán
fuente
2

Bash, 425 bytes

f() { k=0; o=""; l=1; for (( c=1; c<=$1; c++ )); do o="$o$c "; let c++ k++; if [ $l -eq $k ]; then o=$o"\n"; k=0; let l++; fi; done; s=$[$(echo -e $o | wc -l)*2-1]; p() { for c in $(seq $1); do echo -n " "; done }; IFS=$'\n'; for n in $(echo -e $o); do unset IFS; p $s; let s--; for w in $n; do echo -n "$w"; p $[4-${#w}]; done; echo; p $s; for c in $(seq $(echo $n|wc -w)); do echo -n "/ \ "; done; echo; let s-- j++; done }

Formateado:

l=1
k=0
o=""
for (( c=1; c<=$1; c++ ))
do
        o="$o$c "
        let c++ k++
        if [ $l -eq $k ]
        then
                o=$o"\n"
                k=0
                let l++
        fi
done
s=$[$(echo -e $o | wc -l)*2-1]
p() {
        for c in $(seq $1)
        do
                echo -n " "
        done
}
IFS=$'\n'
for n in $(echo -e $o)
do
        unset IFS
        p $s
        let s--
        for w in $n
        do
                echo -n "$w"
                p $[4-${#w}]
        done
        echo
        p $s
        for c in $(seq $(echo $n|wc -w))
                do echo -n "/ \ "
        done
        echo
        let s-- j++
done
Evan Chen
fuente