Ma và bí ngô


15

Đây là một quả bí ngô ASCII được khắc vào Jack-o-Lantern. Nó không dễ thương sao?

((^v^))

Đây là một con ma ASCII. Nhìn nó thật ma quái làm sao!

\{O.O}/

Rõ ràng, những quả bí ngô phải ở trên mặt đất, với một khoảng trống giữa chúng để chúng không bị thối.

Tuy nhiên, ma thích đứng trên những quả bí ngô, vì vậy chúng thậm chí còn ma quái hơn . Tuy nhiên, họ phải đứng trên hai quả bí ngô, nếu không, trọng lượng ma quái của chúng sẽ nghiền nát quả bí ngô bên dưới chúng. Nhưng, do cách thức hoạt động của ma thuật ma quái của họ , nhiều hồn ma có thể xếp và chia sẻ bí ngô, với điều kiện là những con ma được chia đều trên những quả bí ngô thấp hơn hoặc những con ma thấp hơn. Nói cách khác, tạo thành một hình dạng như một kim tự tháp của con người . Lưu ý rằng ma không thể chồng lên ma trừ khi có một quả bí ngô bên dưới (đó là cách ma thuật hoạt động).

Cho hai số nguyên không âm gp, đại diện cho số lượng gvật chủ và pkhối u, tạo ra sự hình thành bên trái nhỏ gọn nhất có thể, theo các quy tắc xếp chồng kim tự tháp ở trên. Những quả bí ngô và ma còn sót lại (nghĩa là những người không tạo thành kim tự tháp) đi trên mặt đất bên phải.

Để làm rõ, các hình thức này là OK (dòng mới trống được phân tách) và phục vụ như I / O ví dụ:

0p 1g
\{O.O}/

1p 0g
((^v^))

1p 1g
((^v^)) \{O.O}/

2p 1g
    \{O.O}/
((^v^)) ((^v^))

2p 2g
    \{O.O}/
((^v^)) ((^v^)) \{O.O}/

3p 1g
    \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 2g
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

3p 3g
        \{O.O}/
    \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^))

0p 4g
\{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/

3p 0g
((^v^)) ((^v^)) ((^v^))

7p 6g
            \{O.O}/
        \{O.O}/ \{O.O}/
    \{O.O}/ \{O.O}/ \{O.O}/
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^))

Những thành tạo này không ổn

\{O.O}/
((^v^))

    \{O.O}/
((^v^))

((^v^)) ((^v^)) \{O.O}/

    \{O.O}/
    \{O.O}/
((^v^)) ((^v^))

            \{O.O}/
\{O.O}/ ((^v^)) ((^v^))

    ((^v^))
((^v^)) ((^v^))

      \{O.O}/
((^v^)) ((^v^))

Đầu vào

Hai số nguyên không âm trong bất kỳ định dạng thuận tiện . Ít nhất một trong các số sẽ khác không. Bạn có thể lấy các đầu vào theo một trong hai thứ tự (ví dụ, trong các ví dụ tôi có bí ngô trước) - vui lòng chỉ định cách bạn lấy đầu vào trong câu trả lời của mình.

Đầu ra

Một đại diện nghệ thuật ASCII của ma và bí ngô, theo các quy tắc trên. Các dòng mới hàng đầu / dấu hoặc khoảng trắng khác là tùy chọn, miễn là các bóng ma và bí ngô xếp hàng một cách thích hợp.

Quy tắc

  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Sự hình thành chính xác cho 7 quả bí ngô và 6 con ma là gì?
Neil

@Neil Vì các quy tắc yêu cầu đầu ra nhỏ nhất bên trái nhỏ nhất, đó sẽ là một kim tự tháp gồm 6 con ma trên đỉnh 4 quả bí ngô, có thêm 3 quả bí ngô ở bên phải. Tôi sẽ thêm nó làm ví dụ.
admBorkBork

Chà, việc sử dụng máy compact của tôi làm tôi bối rối - Tôi có thể đặt tất cả những con ma trên cùng một hàng, vì vậy nó nhỏ gọn hơn theo chiều dọc!
Neil

Bí ngô sẽ luôn được cung cấp trước khi ma?
Gabriel Benamy

2
Tôi thích rằng những con ma và bí ngô đang tạo nên một kim tự tháp của con người
MayorMonty

Câu trả lời:


5

JavaScript (ES7), 166 164 159 byte

Đã lưu 5 byte nhờ Neil

f=(p,g,j=(g*2)**.5+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

Định dạng và nhận xét

f = (                                    // given:
  p,                                     // - p = number of pumpkins
  g,                                     // - g = number of ghosts
  j = (g * 2) ** .5 + .5 | 0,            // - j = ceil(triangular root of g)
  G = j > p - 1 ? p ? p - 1 : 0 : j,     // - G = max(0, min(p - 1, j))
  P = '\n',                              // - P = padding string (+ line-break)
  i = ~j ?                               // - i =
    g - G * ++G / 2                      //   first iteration: g - G * (G + 1) / 2
  : G,                                   //   next iterations: G
  n = i > 0 ? i > g ? g : i : 0          // - n = max(0, min(i, g)) = number of
) =>                                     //   ghosts to print at this iteration
p | g ?                                  // if there's still something to print:
  f(                                     //   do a recursive call with:
    0,                                   //   - no pumpkin anymore
    g - n,                               //   - the updated number of ghosts
    -1,                                  //   - j = -1 (so that ~j == 0)
    G - 1,                               //   - one less ghost on the pyramid row
    P + '    '                           //   - updated padding string
  ) +                                    //   
  P +                                    //   append padding string
  '((^v^)) '.repeat(p) +                 //   append pumpkins
  '\\{O.O}/ '.repeat(n)                  //   append ghosts
: ''                                     // else: stop

Toán học

Phần khó khăn là tìm ra chiều rộng tối ưu Gcủa kim tự tháp ma.

Số lượng ma gtrong một kim tự tháp như vậy được đưa ra bởi:

g = 1 + 2 + 3 + ... + G = G(G + 1) / 2

Đối ứng lại, chiều rộng của một kim tự tháp chứa gma là gốc thực sự của phương trình bậc hai kết quả:

G² + G - 2g = 0

Δ = 1² - 4(-2g)
Δ = 8g + 1

G = (-1 ± √Δ) / 2

Điều này dẫn đến gốc thực sau đây (còn được gọi là gốc tam giác ):

G = (√(8g + 1) - 1) / 2

Tuy nhiên, chiều rộng của kim tự tháp cũng bị giới hạn bởi số lượng bí ngô: chúng ta không thể có nhiều hơn p-1bóng ma so với pbí ngô. Do đó công thức cuối cùng được sử dụng trong mã:

j = ⌈(√(8g + 1) - 1) / 2⌉
G = max(0, min(p - 1, j))

Phiên bản ES6, 173 171 166 byte

f=(p,g,j=Math.pow(g*2,.5)+.5|0,G=j>p-1?p?p-1:0:j,P=`
`,i=~j?g-G*++G/2:G,n=i>0?i>g?g:i:0)=>p|g?f(0,g-n,-1,G-1,P+'    ')+P+'((^v^)) '.repeat(p)+'\\{O.O}/ '.repeat(n):''

Các trường hợp thử nghiệm (ES6)


1
Tôi nghĩ j=(g+g)**.5+.5|0nên làm việc.
Neil

Giải thích tốt đẹp!
admBorkBork

@Neil Điều này ngắn hơn đáng tin cậy hơn. (Phương thức của tôi có một số giá trị không hợp lệ, bắt đầu từ g = 5051.) Cảm ơn.
Arnauld

3

Perl, 246 byte (dòng mới không phải là một phần của mã và chỉ được cung cấp để dễ đọc)

($c,$d)=<>=~/(\d+)/g;
$p="((^v^)) ";$g="\\{O.O}/ ";
for($f[0]=$c;$d>0;$d--){$f[$b+1]+1<$f[$b]?$f[++$b]++:$f[$b]++;$f[0]+=$d,$d=0 if$b==$c-1;$f[$b]==1?$b=0:1}
$h[0]=($p x$c).$g x($f[0]-$c);$h[$_].=$"x(4*$_).$g x$f[$_]for(1..$#f);
say join$/,reverse@h;

Chấp nhận hai số: bí ngô trước, tiếp theo là ma. Đầu vào mẫu:

5 20

Đầu ra mẫu:

                \{O.O}/ 
            \{O.O}/ \{O.O}/ 
        \{O.O}/ \{O.O}/ \{O.O}/ 
    \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 
((^v^)) ((^v^)) ((^v^)) ((^v^)) ((^v^)) \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ \{O.O}/ 

Ồ, bạn đọc cách diễn đạt của tôi khác một chút so với cách tôi dự định - Ma chỉ có thể xếp chồng lên nhau nếu có một quả bí ngô bên dưới, nếu không chúng cần phải đi đến tập tin duy nhất. Đó là lý do tại sao 0p 4gtrường hợp thử nghiệm có tất cả các bóng ma trong một dòng, thay vì xếp chồng lên nhau.
admBorkBork

@TimmyD Được rồi, tôi đã sửa nó ngay. Tôi sẽ cần phải làm một chút golf để giảm nó mặc dù.
Gabriel Benamy
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.