Đó là một ngọn núi kỳ lạ!


10

Lấy cảm hứng từ Hiển thị một chuỗi các ngọn núi nhỏ với một số lẻ trên đỉnh của nó! bởi @sygmei .

Tại sao có một chuỗi núi khi bạn có thể có một khối lớn?

Tạo một chương trình lấy số đầu vào và in một ngọn núi với mỗi số lẻ cho đến số đầu vào.

(Trong đó "tây nam" có nghĩa là directly below and to the leftvà "đông nam" có nghĩa là directly below and to the right)

Mỗi số sẽ có một /phía tây nam của nó, và một \phía đông nam. Nó bắt đầu từ 1trên đỉnh, và số tiếp theo sẽ đi về phía tây nam của a /hoặc đông nam của a \. Số tiếp theo sẽ đi trong dòng gần đầu và bên trái nhất có thể.

Đối với một số có nhiều chữ số, chỉ cần chữ số 1 phải ở đúng vị trí với các chữ số khác ngay sau đó, và chỉ chữ số đầu tiên phải có \/đi ra từ nó.

Ngọn núi lên tới 1 hoặc 2 chỉ là:

 1
/ \

Một ngọn núi lên đến 3 hoặc 4 chỉ là:

   1
  / \
 3
/ \

Trong 25 hoặc 26:

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

Hai dòng cuối cùng có đầu vào là 121:

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

Và hai dòng cuối cùng có đầu vào là 1019:

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

Bạn có thể giả định rằng đầu vào sẽ lớn hơn 0 và nhỏ hơn 10001 (độc quyền).

Không gian lưu trữ là OK, và không gian hàng đầu bổ sung là ổn miễn là có giống nhau trên tất cả các dòng.

Đây là , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.

Một câu trả lời không đúng cho vấn đề này có thể được tìm thấy trực tuyến tại đây (Trong Python trên repl.it) nếu bạn cần thêm các trường hợp thử nghiệm.


Nếu đầu vào nhỏ hơn 101, thì tại sao bạn có 121 testcase?
LegionMammal978

@ LegionMammal978 Ý tôi là 10001, đã sửa bây giờ. Cảm ơn bạn!
Artyer

1
Khó hơn bản gốc, tôi sẽ thử: D
Sygmei

Câu trả lời:


5

05AB1E , 54 52 47 46 byte

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

Hãy thử trực tuyến!

Giải trình

                                                # 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

Tôi có thể đã lưu 5 byte ÅɹL£D€g__ÏRv"/ \ "yg×N·©úˆy4jJðÛ®>úˆ}¯R»nếu chỉ tôi đã sửa lỗi đó cho j tôi đã viết vài tuần trước : /


3

Mẻ, 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

@Artyer Tôi khá chắc chắn cmd /Q /C file.batđếm thêm 3 byte, nhưng nó vẫn tốt hơn @echo off. Bạn nên đăng nó vào câu hỏi mẹo hàng loạt.
Neil

3

Python 2, 160 149 143 byte

Cảm ơn TFeld đã lưu 11 byte và Artyer vì đã lưu 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)

Bạn có thể làm i=len(y)for l in y:print' '*i+l;i-=1thay vì for i,l in enumerate(y):print(len(y)-i-1)*' '+lcho -10 byte
TFeld

Ngoài ra tôi nghĩ rằng bạn có thể thay đổi \\ để \ vì nó là trước một không gian
TFeld

Bạn có thể thay đổi 2 dòng cuối cùng thành while y:print' '*-~len(y)+y.pop(0). Nó tiết kiệm 3 byte.
Artyer

1
@Rod Rất tiếc ... Tôi có nghĩa là %-4dđể lại chứng minh cho nó bằng 4.
Artyer

1
@Artyer woah, giá trị tiêu cực này để chứng minh trái là mới đối với tôi: D, mẹo hay
Rod

2

Perl, 134

133 byte + 1 cho -ptùy chọn

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

Phiên bản được định dạng (phiên bản golf gốc sử dụng "dòng mới" thực sự thay vì \ 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";

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 }

Định dạng:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.