Itu satu gunung yang aneh!

10

Terinspirasi oleh Pajang rantai pegunungan kecil dengan angka ganjil di atasnya! oleh @sygmei .

Mengapa memiliki rantai pegunungan ketika Anda dapat memiliki satu gunung besar?

Buat program yang mengambil nomor input dan mencetak gunung dengan setiap nomor ganjil hingga nomor input.

(Di mana "barat daya" berarti directly below and to the left, dan "tenggara" berarti directly below and to the right)

Setiap angka akan memiliki /barat selatan dari itu, dan \tenggara. Itu dimulai dari 1di atas, dan angka berikutnya akan pergi ke barat daya /atau tenggara dari a \. Nomor berikutnya akan berada di garis paling dekat ke atas dan ke kiri paling mungkin.

Untuk nomor multidigit, hanya digit pertama yang harus berada di tempat yang tepat dengan digit lainnya secara langsung setelahnya, dan hanya digit pertama yang harus \dan /keluar darinya.

Gunung hingga 1 atau 2 hanya:

 1
/ \

Gunung hingga 3 atau 4 hanya:

   1
  / \
 3
/ \

Untuk 25 atau 26:

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

Dua baris terakhir dengan input 121:

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

Dan dua baris terakhir di mana inputnya adalah 1019:

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

Anda dapat berasumsi bahwa input akan lebih besar dari 0 dan kurang dari 10001 (eksklusif).

Trailing space baik-baik saja, dan ruang pemimpin tambahan baik-baik saja selama ada yang sama di semua lini.

Ini adalah , jadi program terpendek dalam byte menang.

Sebuah jawaban yang tidak dikenali untuk ini dapat ditemukan online di sini (Dalam Python pada repl.it) jika Anda memerlukan lebih banyak kasus uji.

Artyer
sumber
Jika inputnya kurang dari 101, mengapa Anda memiliki 121 testcase?
LegionMammal978
@ LegionMammal978 Maksud saya 10001, diperbaiki sekarang. Terima kasih!
Artyer
1
Lebih sulit daripada yang asli, saya akan mencobanya: D
Sygmei

Jawaban:

5

05AB1E , 54 52 47 46 byte

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

Cobalah online!

Penjelasan

                                                # 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

Saya dapat menyimpan 5 byte ÅɹL£D€g__ÏRv"/ \ "yg×N·©úˆy4jJðÛ®>úˆ}¯R»jika saja saya mendorong perbaikan bug untuk j yang saya tulis beberapa minggu yang lalu : /

Emigna
sumber
3

Batch, 335 byte

@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
sumber
@Artyer Saya cukup yakin cmd /Q /C file.batmenghitung 3 byte tambahan, tapi masih lebih baik daripada @echo off. Anda harus memposting itu ke pertanyaan kiat Batch.
Neil
3

Python 2, 160 149 143 byte

Terima kasih TFeld untuk menghemat 11 byte dan Artyer karena telah menghemat 6 byte

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)
tongkat
sumber
Anda dapat melakukan i=len(y)dan for l in y:print' '*i+l;i-=1bukannya for i,l in enumerate(y):print(len(y)-i-1)*' '+luntuk -10 byte
TFeld
Juga saya pikir Anda dapat mengubah \\ ke \ karena merupakan sebelum spasi
TFeld
Anda dapat mengubah 2 baris terakhir menjadi while y:print' '*-~len(y)+y.pop(0). Menghemat 3 byte.
Artyer
1
@Rod Ups ... Saya bermaksud %-4duntuk membenarkannya pada
pukul
1
@Artyer woah, nilai negatif untuk dibenarkan ini baru bagi saya: D, trik bagus
Rod
2

Perl, 134

133 byte +1 untuk -popsi

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

Versi yang diformat (versi golf asli menggunakan "baris baru" yang sebenarnya, bukan \ 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";
Adam
sumber
2

Bash, 425 byte

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 }

Diformat:

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
sumber