Zigzag bao giờ khuếch đại


24

Viết chương trình hoặc hàm lấy số nguyên dương N và xuất ra số N đầu tiên của mẫu hình zigzag khuếch đại này, chỉ sử dụng các dòng cần thiết:

                                         26
                                       25  27                                      .
         10                          24      28                                  .
        9  11                      23          29                              .
 2     8     12                  22              30                          44
1 3   7        13              21                  31                      43
   4 6           14          20                      32                  42
    5              15      19                          33              41
                     16  18                              34          40
                       17                                  35      39
                                                             36  38
                                                               37

Vì vậy, nếu N là 1đầu ra là

1

Nếu N là 2, đầu ra là

 2
1

Nếu N là 3đầu ra là

 2
1 3

Nếu N là 4đầu ra là

 2
1 3
   4

Nếu N là 10đầu ra là

         10
        9
 2     8
1 3   7
   4 6
    5

Nếu N là 19đầu ra là

         10
        9  11
 2     8     12
1 3   7        13
   4 6           14
    5              15      19
                     16  18
                       17

vân vân

Ghi chú

  • Mỗi đỉnh hoặc máng của zigzag đạt đến điểm của nó cách xa đường thẳng hơn một điểm 1so với đỉnh hoặc máng trước đó.

  • N không giới hạn 44. Các zigzag phát triển trong cùng một mô hình và N lớn hơn nên được hỗ trợ.

  • Các số có nhiều chữ số chỉ nên "chạm" vào các góc của chúng, như được mô tả. Hãy chắc chắn rằng điều này hoạt động khi N là 100và ở trên.

  • Không được có dòng trống (hoặc chỉ khoảng trắng) trong đầu ra ngoại trừ một dòng mới theo dõi tùy chọn.

  • Bất kỳ dòng có thể có bất kỳ số lượng không gian dấu.

Chấm điểm

Mã ngắn nhất tính bằng byte thắng. Tiebreaker là câu trả lời trước đó.


N tối đa có thể là bao nhiêu?
Julie Pelletier

@JuliePelletier Về lý thuyết thì không có, nhưng bạn có thể cho rằng nó sẽ nhỏ hơn 2 ^ 16.
Sở thích của Calvin

Việc sử dụng các ký tự điều khiển được phép hay chúng ta bị giới hạn ở các không gian chữ số và nguồn cấp dữ liệu?
Dennis

2
@Dennis Hãy nói không. Chỉ cần chữ số / dấu cách / dòng mới.
Sở thích của Calvin

1
Ai đó nên gửi nó cho OEIS theo định dạng đó như một trò đùa.
DanTheMan

Câu trả lời:


10

Thạch , 41 37 29 byte

RDµḌ’½Ċ-*_\x©L€Ṣ.ị®ạ€⁶ẋj"FZj⁷

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

Làm thế nào nó hoạt động

RDµḌ’½Ċ-*_\x©L€Ṣ.ị®ạ€⁶ẋj"FZj⁷  Main link. Argument: n (integer)

R                              Range; yield [1, ..., n].
 D                             Decimal; yield A =: [[1], ..., [1, 0], ...].
  µ                            Begin a new, monadic chain. Argument: A
   Ḍ                           Undecimal; convert back to falt range.
    ’                          Decrement to yield [0, ..., n-1].
     ½Ċ                        Take the square root and round up (ceil).
       -*                      Elevate -1 to each rounded square root.
         _\                    Cumulatively reduce by subtraction.
                               This yields [1, 2, 1, 0, -1, 0, ...], i.e., the
                               vertical positions of the digits in A.
             L€                Compute the length of each list in A.
           x                   Repeat the nth position l times, where l is the
                               nth length.
            ©                  Copy the result to the register.
               Ṣ               Sort.
                .ị             At-index 0.5; yield the last and first element,
                               which correspond to the highest and lowest position.
                  ạ€®          Take the absolute difference of each position in the
                               register and the extrema.
                               This yields the number of spaces above and below
                               the integers in r as a list of pairs.
                     ⁶ẋ        Replace each difference with that many spaces.
                         F     Flatten the list A.
                       j"      Join the nth pair of strings of spacing, separating
                               by the nth digit in flat A.
                          Z    Zip/transpose the result.
                           j⁷  Join, separating by linefeeds.

2
Tại sao không tạo một chức năng trong ngôn ngữ của bạn (Jelly) có thể làm điều đó trong một vài ký tự trong khi bạn đang ở đó?
Julie Pelletier

19
@JuliePelletier Nghệ thuật viết một ngôn ngữ chơi golf tốt là sắp ra một bộ hướng dẫn (và ngữ nghĩa cú pháp / ngôn ngữ) cho phép bạn viết các giải pháp ngắn cho càng nhiều nhiệm vụ khác nhau càng tốt, không phải là có thể giải quyết một vấn đề rất cụ thể và thách thức trong một byte đơn. Một ngôn ngữ chơi golf tốt có xu hướng thực sự rất mạnh mẽ và biểu cảm, trái ngược với việc chỉ là một bộ sưu tập tích hợp vô dụng cho bất cứ thứ gì ngoại trừ chức năng cụ thể mà họ tính toán.
Martin Ender

@JuliePelletier Và nó cũng sẽ đi ngược lại các quy tắc của PPCG SE
Bálint

8

PHP, 211 177 164 163 byte

Dự đoán các đỉnh với $nvà tăng mảng động theo một trong hai hướng, sử dụng ($x, $y)con trỏ đầu ra.

Các số được căn chỉnh str_pad()và đầu ra cuối cùng là implode()mảng của chuỗi đó ( $g).

for($x=0,$d=-1,$h=$n=2,$y=$a=1;$a<=$argv[1];$y+=$d){$g[$y]=str_pad($g[$y],$x).$a;$x+=strlen($a);if($a++==$n){$h+=2;$n+=$h-1;$d*=-1;}}ksort($g);echo implode(~õ,$g);

Kiểm tra nó trực tuyến!

Cập nhật: đã xóa 34 byte bằng cách loại bỏ mảng_pad () không cần thiết. Update2: theo lời khuyên của @ insertusernamehere để rút ngắn thêm một chút. Update3: đã làm theo lời khuyên của @ Lynn để lưu thêm một byte với ~ õ, trong đó áp dụng việc sử dụng bộ ký tự LATIN-1. (không có sẵn trong trình giả lập PHP trực tuyến nên không bao gồm ở đó)


Chỉ là một câu hỏi về mã này .. Bạn không phải khởi tạo mảng $ g trước khi bạn truy cập một phần tử cụ thể? Ý tôi là, cho nó một chiều dài hoặc chèn các hàng? Tôi không có nhiều kinh nghiệm với PHP, vì vậy nó trông có vẻ kỳ lạ đối với tôi ... Cảm ơn.
Cá hồi Yotam

Không. Một khi bạn xác định $arr = [];, bạn có thể tham khảo $arr[anything]. Một số trường hợp sẽ xuất thông báo nhưng những trường hợp bị bỏ qua ở đây. Lưu ý rằng đọc những thứ như thế này có lẽ sẽ không giúp bạn học ngôn ngữ nhiều. Nhận xét của bạn khiến tôi nhận ra tôi có thể làm cho nó ngắn hơn mặc dù ban đầu tôi nghĩ rằng tôi cần phải đệm mảng của mình nhưng tôi thì không. :)
Julie Pelletier

Haha vui mừng vì đã giúp;) Chỉ cần nhận ra rằng trong PHP một mảng và một từ điển được khởi tạo trong cùng một cách và hoàn toàn giống nhau khi nhìn vào cú pháp (Tại sao, PHP ?!)
Yotam Salmon

Một số cải tiến nhỏ - 164 byte : for($x=0,$d=-1,$h=$n=2,$y=$a=1;$a<=$argv[1];$y+=$d){$g[$y]=str_pad($g[$y],$x).$a;$x+=strlen($a);if($a++==$n){$h+=2;$n+=$h-1;$d*=-1;}}ksort($g);echo implode("⏎",$g);(Thay thế bằng một dòng mới thực sự.)
insertusernamehere

Tôi tin rằng nếu bạn thiết lập quyền mã hóa của mình (Latin-1, không phải UTF-8), là một thay thế hai byte cho "⏎".
Lynn

8

Pyth, 60 53 52 46 42 39 38 36 34 32 31 byte

39: Bây giờ nó ngang bằng với phiên bản sửa lỗi của Jelly và tôi đã vượt qua phiên bản cạnh tranh của Dennis!

38: Tôi đã chơi golf ngoài Dennis!

36: Tôi đã chơi Dennis một lần nữa!

34: Thậm chí thấp hơn phiên bản sửa lỗi của anh ấy!

31: 32 -> 31 nhờ Dennis.

J1K.u+N=J_WsI@Y2JtQZjsM.t.e ++ *] * dl`hkabhSK`hk *] * dl`hkabeSKKd 
J1K.u+N=J_WsI@Y2JtQZjsM.t.eX *] * dl`hkhaeSKhSKabhSKhkKd 
J1K.u + N=J_WsI@Y2JtQZ=-RhSKKjsM.t.eX *] * dl`hkheSKbhkKd 
J1K.u+N=J_WsI@Y2JtQQj-#dsMC.eX * 
* dhhhhhh + Qbhkm = + Z = J_WsI @ td2J 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jhd 
J1j- # dsMCmX *] *; l`hdyQ + Q = + Z = J_WsI @ td2Jh 
J1j - # dsMCmX *] *; l`hdyQ + Q = + Z = @ _ BJsI @ td2h 
j- # dsMCmX *] *; l`hdyQ + Q = + Zsty% s @ td2 2h 
j- # dsMCmX *]; `hdyQ + Q = + Z @ _B1.E @ d2h 
JQj- # dsMCmX *] *; l`hdyQ = + J @ _B1.E @ d2h 
JyQj- # dsMCmX *] *; l`hdJ = + Q @ E @ d2h 
j- # DSMCmX *] *; l`hdyQ = + Q @ _B1.E @ d2h
j- # dsMCmX *] *; l`hdyQ=+Qucci_1.E@d2h

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

Làm thế nào nó hoạt động

j-#dsMCmX*]*;l`hdyQ=+Q^_1.E@d2h      input: Q
j-#dsMCmX*]*;l`hdyQ=+Q^_1.E@d2hdQ    implicit filling arguments

       m                        Q    for each number d from 0 to Q-1:
                           @d2           yield the square root of d.
                         .E              yield its ceiling.
                      ^_1                raise -1 to that power. this
                                         yields the desired direction.
                   =+Q                   increment Q by this amount.

               hd                        yield d+1.
              `                          yield its string representation.
             l                           yield its length.
           *;                            repeat " " for that number of times
          ]                              yield a list containing the string above.
         *       yQ                      repeat the list for Q*2 times.
                                         the Q has changed, but Q*2 is
                                         an overshoot that is high
                                         enough, so we don't have to
                                         worry about it.

        X                                in that list, replace the
                                         element with index being the
                                         number generated above
                              hd         with d+1.

      C                              transpose the resulting array.
    sM                               flatten each element.
 -#d                                 remove lines containing only spaces.
                                     (filter on truthiness of set difference with space)
j                                    join by newlines.

2
" 39: ngang hàng với Jelly "; " 38: Tôi đã chơi golf ngoài Dennis! " Trong vài giờ bạn đã làm, nhưng có vẻ như @Dennis không muốn bị đánh khi chơi golf mã: Jelly 37 byte ;)
Kevin Cruijssen

1
@KevinCruijssen Xong.
Rò rỉ Nun

Tốt đẹp! xD M̶a̶y̶b̶e̶ Tôi có một trí tưởng tượng hoang dã, nhưng bây giờ tôi tưởng tượng bạn đã nhìn và thất vọng hàng giờ cho đến khi cuối cùng bạn tìm thấy giải pháp ngắn hơn này, và bây giờ @Dennis sẽ tình cờ thức dậy và rút ngắn mã của mình một lần nữa. (Jk, tôi hy vọng bạn ở dưới Dennis!)
Kevin Cruijssen

@KevinCruijssen Tada! Bây giờ nó thấp hơn phiên bản sửa lỗi.
Rò rỉ Nun

5

MATLAB, 148 byte

n=input('');k=fix(n^.5);m=0;w=1;d=-1;for l=1:n;s=num2str(l);m(k+1,w:w+nnz(s)-1)=s;w=w+nnz(s);k=k+d;d=d*(-1)^(l^.5==fix(l^.5));end;[m(any(m,2),:),'']

Lưu ý rằng các khoảng trắng bị thiếu trong Octave, vì MATLAB in ký tự được lập chỉ mục 0dưới dạng khoảng trắng , trong khi quãng tám không bỏ sót ký tự đó.

Giải trình:

n=input('');
k=fix(n^.5);                    %caculate starting height
m=0;w=1;d=-1;                   %initialize counters and output matrix
for l=1:n;
    s=num2str(l);
    m(k+1,w:w+nnz(s)-1)=s;      %insert current index as a string
    w=w+nnz(s);                 %current horizontal position
    k=k+d;                      %current vertical position
    d=d*(-1)^(l^.5==fix(l^.5)); %if we reached a square number, change direction
end
[m(any(m,2),:),'']              %delete all zero rows

3

Haskell, 144 142 byte

g n|k<-take n$scanl(+)0$[1..]>>= \x->(-1)^x<$[2..2*x]=unlines[[1..n]>>= \x->show x#(k!!(x-1)==y)|y<-[minimum k..maximum k]]
s#g|g=s|1<2=' '<$s

Ví dụ sử dụng:

*Main> putStr $ g 19
         10                  
        9  11                
 2     8     12              
1 3   7        13            
   4 6           14          
    5              15      19
                     16  18  
                       17    

Làm thế nào nó hoạt động:

s#g|g=s|1<2=' '<$s              -- # is a helper function that expects a string s
                                -- and a boolean g. It returns s if g is True, else
                                -- as many spaces as there a characters in s 

k<-take n$                      -- bind k to the first n elements of
 [1..]>>= \x->(-1)^x<$[2..2*x]  -- 2*x-1 copies of (-1)^x for each x in [1,2,3,...]
                                -- i.e. [-1, 1,1,1, -1,-1,-1,-1,-1, 1,1,1,1,1,1,1..]
 scanl(+)0                      -- build partial sums, starting with 0
                                -- i.e. [0,-1,0,1,2,1,0,-1,-2,-3,-2,-1...]
                                -- -> k is the list of y coordinates for the
                                --    numbers 1,2,3,...

 [  |y<-[minimum k..maximum k]] -- for all y coordinates in k 
      \x->show x#(k!!(x-1)==y)  -- map the # function
  [1..n]>>=                     -- over [1..n] (the x coordinates)
                                -- where # is called with
                                --  s -> a string representation of x 
                                --  g -> True if k at index x equals the current y
unlines                         -- join with newlines

Chỉnh sửa: Cảm ơn @Lynn vì hai byte!


2

JavaScript (ES6), 213 byte

with(Math)n=>(a=[...Array(n)].map((_,i)=>n-=1+sqrt(--i)&1||-1).map((e,_,a)=>e-min(...a))).map((e,i)=>r[e][i]=++i,r=[...Array(1+max(...a))].map(_=>a.map((_,i)=>` `.repeat(1+log10(++i)))))&&r.map(a=>a.join``).join`\n`

Trường hợp \nđại diện cho một nhân vật dòng chữ mới. Giải trình:

with(Math)                          Bring functions into scope
 n=>                                Accepts one parameter
  (a=                               Intermediate result variable
   [...Array(n)].map(               For each number 0..n-1
    (_,i)=>n-=                      Accumulate index for each number
     1+sqrt(--i)&1||-1              Calculate the direction
    ).map((e,_,a)=>e-min(...a))     Scale the smallest index to zero
  ).map((e,i)=>r[e][i]=++i,         Overwrite the padding with 1..n
   r=[...Array(1+max(...a))].map(   Calculate number of lines
    _=>a.map((_,i)=>                For each number 1..n
     ` `.repeat(1+log10(++i)))))    Calculate the padding needed
  &&r.map(a=>a.join``).join`\n`     Join everything together

Để rút ngắn pow(-1,ceil(sqrt(i)))tôi viết lại vì nó sqrt(i-1)&1||-1không hoạt động i=0để sửa lỗi tôi thêm 1 nhưng sau đó lật dấu hiệu của kết quả, đó là lý do tại sao tôi kết thúc n-=.


heyyy bạn có một huy hiệu vàng! công việc tốt! và thánh hút thuốc bạn gần như có nhiều đại diện như tôi. giữ nó đi
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Đó chỉ là "huy hiệu" Fanatic. Rõ ràng tôi rất gần nhận được huy hiệu thẻ golf vàng mã!
Neil

đôi thánh hút thuốc. Tôi cần di chuyển XD
Conor O'Brien

1

Python 2, 137 byte

l={}
i=x=y=n=v=0
exec"v+=1;l[y]=l.get(y,'').ljust(x)+`v`;x+=len(`v`);i=-~i%-~n;y+=n%4-1;n+=2>>i*2;"*input()
for k in sorted(l):print l[k]

Xem đầu ra trên ideone .


Hừm ... Nó không tiếp tục và tiếp tục và tiếp tục.
Zizouz212

@ Zizouz212 Nó cũng vậy, ideone chỉ có một đầu ra cố định với và tự động ngắt các dòng quá dài.
flawr
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.