Làm cho tôi một chiếc bánh trung thu!


31

Các lễ hội trung thu đã bắt đầu!

Thật không may, tất cả bánh trung thu của tôi đã bị đánh cắp - chúng trở nên quá đắt đối với những người dân nhỏ như tôi và tôi sợ rằng mình sẽ không thể ăn bất cứ thứ gì trong năm nay!

Vì vậy, tôi chuyển sang bạn để được giúp đỡ. Bạn có thể làm cho tôi một số?

Đối với những người không biết, hãy để tôi giáo dục bạn về một chiếc bánh trung thu trông như thế nào.


Bánh trung thu có nhiều kích cỡ khác nhau!
Vì vậy, tôi sẽ cung cấp cho bạn đầu vào của tôi , n , khi tôi muốn.

Dưới đây là một số ví dụ về đầu ra tôi muốn:

Bánh trung thu có kích thước n = 3:

    (@@@@@)  
    (@MAF@) 
    (@@@@@) 

Bánh trung thu có kích thước n = 6:

    (@@@@@@@@@@@) 
    (@         @)
    (@    M    @) 
    (@    F    @)
    (@         @)
    (@@@@@@@@@@@) 

Điều đó có nghĩa là, một chiếc bánh trung thu có kích thước n là:

  • n dòng cao
  • 2n - 1 @s dài
  • Dài 2n + 1 ký tự (@ và ngoặc)

Và tốt hơn hết là đừng ném cho tôi những chiếc bánh trung thu quá nhỏ của bạn!
Giả sử đầu vào sẽ luôn là n> = 3 .

Bánh trung thu cũng chứa một trong những đồ trang trí sau :

  • MF
  • MAF
  • HMF
  • JCJ
  • TTT
  • ZJ
  • LF
  • RF
  • CF

Cái nào cũng không thành vấn đề - miễn là nó được căn giữa theo chiều dọc và chiều ngang .
Nó có thể được viết theo chiều dọc hoặc chiều ngang quá!

Tôi muốn đa dạng!
Nếu bạn thực sự sẽ làm cho tôi hai chiếc bánh trung thu giống nhau, trang trí tốt hơn sẽ khác!

Đó là, nhiều lần thực hiện chương trình của bạn với cùng một đầu vào không phải luôn luôn mang lại cùng một trang trí .

Tôi không thể chờ đợi để ăn bánh trung thu của bạn, vì vậy tôi càng sớm nhận được chúng ( mã của bạn càng ngắn ) thì càng tốt!

Chúc may mắn!


Đối với những người thắc mắc về các đồ trang trí:
Chúng là tên viết tắt của tất cả các tên thay thế cho Tết Trung thu.
Một danh sách có thể được tìm thấy trong trang Wikipedia được liên kết ở đầu bài này.


Làm rõ:

Không có quy tắc liên quan đến khoảng trắng hàng đầu và dấu .
Có nhiều hay ít tùy thích!

Các trang trí phải ở trung tâm của bánh trung thu của bạn!
Trên trang trí ngang, điều này có nghĩa là nó phải nằm trên đường giữa của bánh của bạn và số lượng ký tự ở bên trái và bên phải của chuỗi trang trí phải bằng nhau.
Trên trang trí dọc, điều này có nghĩa là nó phải nằm ở cột giữa của bánh của bạn và số lượng ký tự bên trên và bên dưới trang trí phải bằng nhau.

Không phải tất cả các trang trí phải được sử dụng!
Yêu cầu duy nhất là phải có nhiều hơn một khả năng cho bất kỳ đầu vào n nào . Các khả năng cũng không cần phải đồng đều.

Chức năng được chấp nhận.


2
Xin chào, chào mừng đến với PPCG! Đây trông giống như một bài viết đầu tiên tuyệt vời. thông thường chúng tôi khuyên bạn nên sử dụng Sandbox cho các thử thách được đề xuất . Ở đó bạn có thể nhận phản hồi từ người khác và hoàn thiện thử thách với những điều bạn có thể chưa nghĩ đến, trước khi đăng nó ở đây. Điều đó đang được nói, thách thức của bạn có vẻ chu đáo. +1 từ tôi. Một câu hỏi liên quan đến ví dụ đầu tiên của bạn, tại sao nó lại đọc MAFvà không MF? Tôi không thấy một Atrong các tùy chọn trang trí của bạn.
Kevin Cruijssen

1
Cảm ơn! Xin lỗi, tôi không biết về hộp cát. Tôi có thể để lại cái này không? Về trang trí - đó là một sai lầm. Tôi đã thêm MAF vào các trang trí được phép. Phản hồi rất nhiều đánh giá cao!
Thỏ mặt trăng

1
Không có quy tắc liên quan đến không gian hàng đầu và dấu. Tùy bạn
Thỏ mặt trăng

3
Này, tôi cần phải tự nhập tất cả cái này vào máy làm bánh trung thu của mình để có được những chiếc bánh trung thu thực sự!
Thỏ mặt trăng

4
... trong trường hợp đó, thật tốt khi không có ngôn ngữ nào trong số các ngôn ngữ không phải là ASCII đó đã ngẩng cao đầu, bởi vì chúng là một nỗi đau để gõ :)
GreenAsJade

Câu trả lời:


9

Bình thường, 71 65 59 58 byte

Đã lưu 1 byte nhờ @StevenH.

jjRc"(@@)"2++J*KtytQ\@m.[Kd;.[ttQ@,,O"MC"\F]Oc"MAFHMF"3QkJ

Hãy thử trực tuyến. Bộ thử nghiệm.

Quá nhiều đệm.


2
Câu trả lời này khác nhau như thế nào so với câu trả lời bên dưới nó trong cùng một ngôn ngữ ...
Bạch tuộc ma thuật Urn

Bạn có thể tiết kiệm một byte bằng cách thay thế ?%Q2với @,(đảo ngược thứ tự của hai lựa chọn) ... Q. Tôi (ab) đã sử dụng nó rất nhiều trong việc đánh golf câu trả lời Pyth của riêng tôi.
Steven H.

@StevenH. Cảm ơn, tôi luôn quên về lập chỉ mục mô-đun.
PurkkaKoodari

7

JavaScript ES6, 206 196 192 188 187 180 176 169 165 156 byte

g=(n,r=new Date%2,a=(s,x,b=' @'[+!s].repeat(n-3+!x))=>`(@${b+(s||'@')+b}@)
`,l=a` `.repeat(n/2-2+n%2))=>a()+l+(n%2?a(r?'MAF':'HMF',1):a('RC'[r])+a`F`)+l+a()

Phá vỡ

r=new Date%2                           // Sometimes 0, sometimes 1

// Function to create lines of the cake of the form `(@@@@@@@@@)` or `(@  ${s}  @)`
a=(s,x,b=' @'[+!s].repeat(n-3+!x))=>`(@${b+(s||'@')+b}@)
`

// Cake parts
a()                                    // Top of the cake.
l=a` `.repeat(n/2-2+n%2)               // Undecorated inner part.
a(r?'MAF':'HMF',1)                     // Decoration for uneven sized cakes.
a('RC'[r])+a`F`                        // Decoration for even sized cakes.
l                                      // Undecorated inner part.
a()                                    // Bottom part.

Nỗ lực đầu tiên của tôi tại code-golf. Điều này có thể có thể được chơi golf nhiều hơn.

đã lưu 4 byte nhờ @ETH Productstions

Chỉnh sửa Tôi đã tự do sử dụng để đáp ứng:Date.now()%2 new Date%2

nhiều lần thực hiện chương trình của bạn với cùng một đầu vào không phải luôn luôn mang lại cùng một trang trí

điều này cho phép tôi lưu 7 byte khác +Math.random()>.5

đã lưu thêm 4 byte nhờ @Arnauld


Chào mừng bạn đến với PPCG, và câu trả lời đầu tiên tuyệt vời! Tôi tin rằng ['MA','HA'][r]+'F'có thể được chơi golf 'MH'[r]+'AF'.
Sản phẩm ETH

1
Bạn có thể lưu hai byte bằng cách thay thế [' R ',' C '][r]bằng " ${'RC'[r]} ", thay thế từng byte bằng "một backtick.
Sản phẩm ETH

1
['MA','HM'][r]+'F'thực tế là hai byte dài hơn ['MAF','HMF'][r];)
ETHproductions

2
Bạn có thể sử dụng ' @'[+!s]thay vì(s?' ':'@')
Arnauld

2
Ngoài ra, bạn có thể sử dụng new Date%2thay vì Date.now()%2.
Arnauld

6

Bình thường, 99 79 71 68 64 byte

Pyth rất tệ trong việc tạo ra các chuỗi. Hoặc có lẽ tôi chỉ trở nên tệ hơn khi chơi golf.

jmj.[-yQ3@,k@,@,O"MC"\FgydQOc"MAFHMF"3Q>2ahydQ@" @"sIcdtQc2"(@@)

Có thể tạo các đồ trang trí MAFHMFtheo chiều ngang, và các đồ trang trí MFCF theo chiều dọc.

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


2
Ahh, thật tốt khi thấy một số phát triển nhân vật trong câu chuyện này.
Thỏ mặt trăng

6

Vim, 118 byte

Lấy đầu vào làm bộ đệm (ví dụ: tệp có số n là nội dung của nó).

"aDi()<Esc>@ai@<Esc>.xY@apddll<C-v>G$k3hr @=@a/2-1
j@=@a-2-@a%2
l:let r=abs(reltime()[1])%2
@=@a%2?r?"RJCJ":"3rT":"rFkr"."ML"[r]
<Esc>

Đây là với các ký tự điều khiển không thể in ở định dạng xxd:

0000000: 2261 4469 2829 1b40 6169 401b 2e78 5940  "aDi().@ai@..xY@
0000010: 6170 6464 6c6c 1647 246b 3368 7220 403d  apddll.G$k3hr @=
0000020: 4061 2f32 2d31 0a6a 403d 4061 2d32 2d40  @a/2-1.j@=@a-2-@
0000030: 6125 320a 6c3a 6c65 7420 723d 6162 7328  a%2.l:let r=abs(
0000040: 7265 6c74 696d 6528 295b 315d 2925 320a  reltime()[1])%2.
0000050: 403d 4061 2532 3f72 3f22 524a 434a 223a  @=@a%2?r?"RJCJ":
0000060: 2233 7254 223a 2272 466b 7222 2e22 4d4c  "3rT":"rFkr"."ML
0000070: 225b 725d 0a1b                           "[r]..

Hãy thử trực tuyến!(Hóa ra, trình thông dịch V cũng hoạt động tốt đối với mã Vim bình thường.)

Giải trình

"aD                   " Delete the number and store it in @a
i()<Esc>              " Insert empty parentheses
@ai@<Esc>.x           " Insert @a '@' characters between the parentheses twice; delete 1
Y@apdd                " Copy the line and paste it @a times; delete 1
ll<C-v>G$k3hr<Space>  " Replace the inner area with spaces
@=@a/2-1<CR>j         " Go down @a/2-1 lines
@=@a-2-@a%2<CR>l      " Go right @a-2-@a%2 columns
:let r=reltime()[1]%2<CR>  " Get a random 1 or 0 based on the time (this may be OS-dependent)
@=@a%2?
   r?"RJCJ":"3rT"     " For odd @a, replace the next 3 characters with "JCJ" or "TTT"
  :"rFkr"."ML"[r]     " For even @a, replace this character with "F" and the above with "M" or "L"
<CR><Esc>

Ồ, thật tuyệt! Tôi nghĩ rằng đây là câu trả lời vim không xác định đầu tiên tôi đã thấy! Một vài suy nghĩ: 1) Khi bạn đặt đầu vào vào "đối số" thay vì "đầu vào", nó sẽ xác định trước @aarg1, @barg2, v.v. nhưng đây là một tính năng cụ thể của V. Điều này không quan trọng về mặt kỹ thuật vì bạn có "aDngay từ đầu, nhưng tôi chỉ nghĩ tôi sẽ chỉ ra điều đó. 2) Bạn có thể tắt một byte nếu bạn đã làm dd@apthay vìY@apdd
DJMcMayhem


dd@aPhoạt động, nhưng sau đó yêu cầu bổ sung jvà bổ sung kxuống dòng.
Jordan

5

PHP, 342 292 249 185 178 176 byte

for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)<1])."@)
";$p=F.[M,AM,R,MH][rand()&2|$d=$n&1];$f=$n*($n+$d)-2;for($i=2+$d;$i--;$f+=$d?:2*$n+2)$o[$f]=$p[$i];echo$o;

Gọi với php -r '<code>' <size>

lịch sử

Rev 1: phiên bản ban đầu; tất cả các kích cỡ (bao gồm cả bánh nhỏ), tất cả các trang trí, tất cả các hướng có thể

Rev. 2: loại bỏ những chiếc bánh nhỏ xíu (-36 byte), tùy chọn trang trí được cơ cấu lại, loại bỏ một vật phẩm trang trí (-21) và một golf đơn byte (-1).

Rev 3: Xuống đến bốn trang trí; (-17), chỉ nằm ngang đối với kích thước lẻ (-18) cộng với chơi gôn nhỏ (-8).

Rev 4: Cảm ơn Jörg vì đã chơi golf phần "bánh sơn"; anh ấy cởi ra một cách tuyệt vời (-31).
Một -6 khác với việc chơi golf bổ sung của tôi và -27 để sử dụng một chuỗi thay vì một chuỗi các chuỗi.

Rev 5: -7 byte chủ yếu là nhờ Christallkeks

phá vỡ

Điều này đang trở nên mỏng hơn theo giờ. :)

// paint cake
for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)<1])."@)\n";

// add deco
$p=F.[M,AM,R,MH][rand()&2|$d=$n&1];
$f=$n*($n+$d)-2;
for($i=2+$d;$i--;$f+=$d?:2*$n+2)$o[$f]=$p[$i];

// output
echo$o;

1
for($i=0;$i<$n=$argv[1];$i++){$o[]=str_pad("(@",2*$n-1,!$i|$i==$n-1?"@":" ")."@)";}
Jörg Hülsermann

@ JörgHülsermann: Rất cám ơn. Tôi đã phải có một biểu hiện tương tự cho !$i|$‌​i==$n-1?"@":" "; ternary sẽ không chấp nhận của bạn (trên máy của tôi), mặc dù điều đó là chính xác.
Tít


1
Điều này giúp bạn tiết kiệm sáu byte trên sơn bánh: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";Ngoài ra, có vẻ như bạn đã "MAD" chơi golf theo cách giải quyết của mình ;-)
Christallkeks

4

Java 7, 399 349 byte

Phiên bản cập nhật với sự giúp đỡ từ @Dodge và @Kevin Cruijssen:

void m(int n){int i=2,r=n%2,x=2*n,u=r+2,y=r*4+(int)(Math.random()*2)*u,z=y+u;String t="MFZJMAFHMF".substring(y,z);char[][]c=new char[n][x+1];while(i<x-1)c[0][i]=c[n-1][i++]=64;for(i=0;i<u;)c[(n-1)/2+(1-r)*i][r*(i-1)+n]=t.charAt(i++);for(i=0;i<n;){c[i][0]=40;c[i][1]=c[i][x-1]=64;c[i][x]=41;System.out.println(new String(c[i++]).replace('\0',' '));}}

void m(int n){String[]s={"MF","MAF","ZJ","HMF","LF","JCJ","RF","TTT","CF","MAF"};char[]d=s[((int)(Math.random()*5))*2+(n%2)].toCharArray(),c[]=new char[n][2*n+1];int i=2;while(i<2*n-1)c[0][i]=c[n-1][i++]='@';i=0;while(i<d.length)c[(n-1)/2+(1-(n%2))*i][(n%2)*(-1+i)+n]=d[i++];i=0;while(i<n){c[i][0]='(';c[i][1]=c[i][2*n-1]='@';c[i][2*n]=')';System.out.println(new String(c[i++]).replace('\0',' '));}}

Hãy thử nó ở đây!

Phiên bản mới được tối ưu hóa hơn nhiều và loại bỏ việc Stringxử lý mảng. Cũng như đề xuất, hiện tại chỉ có 4 trang trí: 2 cho đầu vào chẵn ( MF, ZJ) và 2 cho đầu vào lẻ ​​( MAF, HMF) được kết hợp thành một String.

Ung dung:

void m(int n){
    int i=2,
    r=n%2,
    x=2*n,
    u=r+2, // length of the decoration string
    y=r*4+(int)(Math.random()*2)*u, // random starting index of string (0, 2, 4, 7)
    z=y+u; // exclusive end index of string (2, 4, 7, 10)
    String t="MFZJMAFHMF".substring(y,z);
    char[][]c=new char[n][x+1];
    while(i < x-1) {
        c[0][i]=c[n-1][i++]=64; // '@'
    }
    for(i=0; i<u;) {
        c[(n-1)/2+(1-r)*i][r*(i-1)+n]=t.charAt(i++); // Depending on even/odd, fills the center column/row respectively with the decoration
    }
    for(i=0; i<n;) {
        c[i][0]=40; // '('
        c[i][1]=c[i][x-1]=64; // '@'
        c[i][x]=41; // ')'
        System.out.println(new String(c[i++]).replace('\0',' ')); // Print all
    }
}

Cảm ơn đã gửi! Hãy để tôi làm rõ, vì một vài người dùng đã bỏ lỡ nó - không phải tất cả các trang trí phải được bao gồm. Tôi đã đi trước và nhấn mạnh điều này trong phần 'làm rõ'. Hy vọng rằng sẽ giúp bạn tiết kiệm một vài byte! Tôi tin rằng bạn vẫn có thể sử dụng cùng một phương pháp để chọn đồ trang trí.
Thỏ mặt trăng

4
Haha, theo như chơi golf Java, anh ta cũng có thể bao gồm tất cả các đồ trang trí;). +1, luôn luôn, cho bất kỳ ai có quả bóng để đánh bại trình đặt Java.
Bạch tuộc ma thuật Urn

Tại sao được "MAF"lặp lại?
Cyoce

@carusocomputing Rất đúng. Tuy nhiên, chỉ trong trường hợp, tôi nghĩ tôi sẽ đề cập đến nó. Tốt đẹp!
Thỏ mặt trăng

Cảm ơn phản hồi của bạn :) Đúng, Java không tối ưu cho việc chơi gôn, nhưng thật thú vị khi làm điều đó: P. Có lẽ tôi có thể sử dụng các vòng lặp và khởi tạo trang trí char[]hiệu quả hơn và chơi những thứ khác hơn nữa. @Cyoce Tôi đã nhân đôi MAFvì sau đó tôi có tất cả các trang trí cho một đầu vào chẵn tại các chỉ số 0,2,4,6,8và tất cả các trang trí cho một đầu vào lẻ ​​tại các chỉ số 1,3,5,7,9. Điều đó giúp dễ dàng tính toán chỉ số ngẫu nhiên cho một đầu vào nhất định. Math.random()*5đưa ra một số ngẫu nhiên từ 0-4. *2lây lan nó đến 0,2,4,6,8. +n%2thêm 1cho đầu vào lẻ ​​để có được 1,3,5,7,9.
QBrute

3

Mẻ, 386 byte

@echo off
set/pn=
set f=HMAC
set/ao=n%%2,u=n/2,l=h=u+1,d=%random%%%2*2+1
if %o%==1 set/al=u=0,d/=2
set c=
for /l %%i in (4,1,%n%) do call set c= %%c%%
call:l %n%
for /l %%i in (2,1,%n%) do call:l %%i
exit/b
:l
set s=   
if %1==%h% call set s=%%f:~%d%,2%%F
if %1==%u% call set s= %%f:~%d%,1%% 
if %1==%l% set s= F 
set s=(@%c%%s%%c%@)
if %1==%n% set s=%s: =@%
echo %s%

Sẽ chỉ xuất ra HMF, MAF, MF hoặc CF khi thích hợp. Lưu ý: một số dòng nhất định kết thúc trong khoảng trắng. Biến:

  • n Tham số đầu vào (đọc từ STDIN)
  • fTiền tố trang trí (hậu tố Fđược ngụ ý)
  • oSự lạ lùng của n(chỉ được sử dụng một lần, nhưng các ifcâu lệnh không chấp nhận biểu thức)
  • lHàng của ký tự dọc trên hoặc 0để trang trí theo chiều ngang
  • uHàng của ký tự dọc thấp hơn hoặc 0để trang trí theo chiều ngang
  • h Hàng trang trí theo chiều ngang (được ghi đè bằng trang trí dọc)
  • d Chỉ số trang trí trong tiền tố trang trí (0/1 cho chiều ngang hoặc 1/3 cho chiều dọc)
  • cChuỗi n-3không gian
  • s Chuỗi đầu ra cho mỗi hàng
  • %1Số hàng, nhưng cũng được đặt thành nhàng đầu tiên, sao cho cả hàng đầu tiên và hàng cuối cùng sử dụng @s thay vì khoảng trắng.

3

C, 233 byte

Có thể đánh gôn này xuống một chút từ đây ...

A="HMFMAFCF";i,j,k,t;f(n){t=time();char*S=n&1?t&1?A:A+3:t&1?A+1:A+6;for(;i<n;i++,puts(")"))for(j=0,k=2*n-1,putchar(40);j<k;putchar(0==i*j|i==n-1|j==k-1?64:n&1&i==n/2&j>n-3&j<n+1?*S++:n&1?32:(i==n/2-1|i==n/2)&j>n-2&j<n?*S++:32),j++);}

Thử thách lớn, đây là điều khó khăn và xấu xí để viết mã.

Chạy với func chính này;

main(c,v)char**v;
{
    f(atoi(v[1]));
}

2

Ruby 2.3.1, 449 265 245 233 230 ký tự

Có vẻ như nên có một câu trả lời ruby, vì vậy đây là một câu trả lời ruby. Điều đó thực sự không thông minh, hy vọng người khác ở đây sẽ thông minh hơn;)

Phiên bản chơi gôn:

def m(n)
d,s=n.odd?? [[%w{MAF HMF}.sample],n/2]:[%w{RF LF}.sample.chars,(n-2)/2]
r=->f{l=f.size;q=($i-l)/2;($c=' '*$i)[q...l+q]=f;puts "(@#$c@)"}
$i=2*n-1;a='@'*$i
r[a]
(1..n-2).map{|x|(s...s+d.size)===x ?r[d[x-s]]:r['']}
r[a]
end

Thủ thuật đánh gôn:

  • thay thế khai báo phương thức bằng phép nội suy chuỗi stabby của
  • $ globalals không cần # {global}, chỉ # $ global
  • === cho phạm vi ngắn hơn .covers?

Phiên bản dễ đọc

def row(inner_width, fillchar='')
  padding = ( inner_width - fillchar.size) / 2
  (center =(' ' * inner_width))[padding...fillchar.size+padding]=fillchar
  puts "(@"+center+"@)"
end

def mooncake(n)
  decoration = n.odd?? [%w{ MAF HMF JCJ TTT }.sample] : %w{ ZJ LF RF CF }.sample.chars
  start_row = n.odd?? (n/2) : (n - 2) / 2
  inner_width = 2 * n - 1
  row(inner_width,'@'*inner_width)
  (1...(n-1)).each do |row|
    if (start_row ... start_row + decoration.size).include? row 
      row(inner_width,decoration[row - start_row])      
    else
      row(inner_width)      
    end
  end
  row(inner_width,'@'*inner_width)
end

Kiểm tra

mooncake(3)
mooncake(4)
mooncake(5)
mooncake(6)

Tôi đã thực hiện lại bằng cách sử dụng mảng, có vẻ như mọi người đang làm điều đó.
Cướp

1

Tôi đã chán ... đây là hai phiên bản nữa:

PHP, 193 byte

function p($s){global$n;return"(@".str_pad($s,2*$n-3,$s?" ":"@",2)."@)
";}$p=[M,MA,R,HM][rand()&2|1&$n=$argv[1]];echo p(""),$e=str_repeat(p(" "),($n+$n%2)/2-2),$n&1?p($p.F):p($p).p(F),$e,p("");

một câu trả lời của Lmis ván

PHP, 191 byte

for($p=[M,MA,R,HM][rand()&2|1&$n=$argv[1]].F;$i<$n*$w=2*$n+1;$i++)echo($x=$i%$w)?$w-1-$x?($y=$i/$w|0)%($n-1)&&1-$x&&$w-2-$x?$p[$n&1?$n>>1!=$y?9:$x-$n+1:($n-$x?9:$y-$n/2+1)]?:" ":"@":")
":"(";

in nhân vật bánh theo nhân vật trong một vòng lặp duy nhất

phá vỡ

for(
    $p=[M,MA,R,HM][rand()&2|1&$n=$argv[1]].F;   // pick decoration
    $i<$n*$w=2*$n+1;$i++)       // loop $i from 0 to $n*width-1:
echo                                // print ...
    $w-1-($x=$i%$w)                 // 1. not last column
        ?$x                         // 2. not first column
            ?
                ($y=$i/$w|0)%($n-1) // 3. not first or last line
                && 1-$x%($w-3)      // and not second or (width-2)th column
                ?$p[$n&1
                    ?$n>>1!=$y?3:1+$x-$n
                    :($n-$x?3:1+$y-$n/2)
                ]   ?               // 4. decoration character
                    :" "            // 4. else: blank
                :"@"                // 3. else: "@"
            :"("                    // 2. else: "("
        :")\n"                      // 1. else: ")"+newline
    ;

0

Python 3, 318 301 297 285 272 byte

Loại bỏ 17 byte với sự trợ giúp của DJMcMayhem

Đã tắt 4 byte nhờ mbomb007

Đã loại bỏ 12 byte khác nhờ DJMcMayhem

Đã loại bỏ 13 byte khác nhờ mbomb007

Golf đầu tiên của tôi từng có, vì vậy nó không tuyệt lắm. Tôi đã sử dụng: aliasing math.ceil as y và str.format as z, các định dạng lồng nhau, nhập dòng đơn, lambda và hoạt động bitwise cộng với một số thứ khác để có được điều này giống như vậy.

def f(n):import random,math;y=math.ceil;z=str.format;i=y(2*n-5>>1);j=y(n-3>>1);return z("{a}{}{a}",z("{d}(@{}{b}F{c}@)\n{e}"," "*i,b=random.sample(["L","R"],1)[0],c=" "*(2*n-5-i),d=z("(@{}@)\n"," "*(2*n-3))*j,e=z("(@{}@)\n"," "*(2*n-3))*(n-3-j)),a=z("({})\n","@"*(2*n-1)))

Phiên bản Ungolfed (nhập riêng biệt, không có bí danh và không hoạt động theo bitwise):

def f(n):
    import random;
    import math;
    return "{a}{}{a}".format(
        "{d}(@{}{b}F{c}@)\n{e}".format(
            " "*(math.ceil((2*n-5)/2)),
            b=random.sample(["L","R"],1)[0],
            c=" "*((2*n)-(5+math.ceil((2*n-5)/2))),
            d="(@{}@)\n".format(" "*(2*n-3))*math.ceil((n-3)/2),
            e="(@{}@)\n".format(" "*(2*n-3))*(n-(3+(math.ceil((n-3)/2))))),
        a="({})\n".format("@"*(2*n-1)))

Điều thú vị là, sử dụng phiên bản không theo bit của điều này vẫn tạo ra đầu ra chính xác, tuy nhiên, đầu ra thì khác:

Không theo bit:

(@@@@@@@)
(@     @)
(@  LF @)
(@@@@@@@)

Bitwise:

(@@@@@@@)
(@ LF  @)
(@     @)
(@@@@@@@)

bạn có thể di chuyển các mục nhập ra khỏi hàm và thay đổi chúng để from ... import*nhập các mục nhập để lưu một số byte
Blue

Câu trả lời tốt đẹp, và chào mừng đến với trang web! Một vài lời khuyên: 1. Các hàm lambda ngắn hơn và 2. bạn có thể làm gì import math;y=math.ceilđể tắt hai byte. Điều này sẽ cung cấp cho bạn import random;import math;y=math.ceil;lambda n:"{a}{}{a}".format("{d}(@{}{b}F{c}@)\n{e}".format(" "*(y((2*n-5)/2)),b=random.sample(["L","R"],1)[0],c=" "*((2*n)-(5+y((2*n-5)/2))),d="(@{}@)\n".format(" "*(2*n-3))*y((n-3)/2),e="(@{}@)\n".format(" "*(2*n-3))*(n-(3+(y((n-3)/2))))),a="({})\n".format("@"*(2*n-1)))ngắn hơn 13 byte.
DJMcMayhem

@DJMcMayhem Cảm ơn rất nhiều! Tôi cập nhật câu trả lời của tôi.
Chỉ đạo

Rất vui vì tôi có thể giúp! Một điều khác bạn có thể có thể làm là bí danh formatvì bạn gọi nó là rất nhiều. Vấn đề là, tôi không biết chính xác làm thế nào để bí danh cho một chức năng thành viên (nhưstr.format ) để bạn phải thử nghiệm một chút. Tôi không tích cực, nó sẽ ngắn hơn mặc dù.
DJMcMayhem

4
Công việc tốt đẹp! Tôi rất vui vì bạn đã có một cái gì đó từ bài tập này :) Tuy nhiên, tôi muốn làm rõ rằng trang trí phải được đặt ở giữa để phù hợp với các thông số kỹ thuật thách thức. Cho dù bạn có quyết định thay đổi mã của mình để phản ánh điều này hay không - tôi có thể yêu cầu bạn giữ mã hiện tại trong bài viết của mình không? Nỗ lực tốt đáng để giữ, ngay cả khi nó bỏ bê một trong những quy tắc.
Thỏ mặt trăng

0

C # 448 byte

Chơi gôn

var v=n%2==0;int l=n+n-3,h=n-2,e=v?0:1,c=e+2;var c2=v?"MFZJLFRFCF":"MAFHMFJCJTTT";var r=new Random().Next(3+e);var f=new String(c2.Skip(c*r).Take(c).ToArray());var mc="";for (var i=0;i < h;i++) {var x="";if (!v && i==((h / 2))) { x=f;} else if (v && ((i==h / 2) || (i==(h/2)-1))) { x +=f[i%2==1?0:1];} var es=x.PadLeft((l/2)+1+e,' ').PadRight(l,' ');mc +="(@"+es+"@)\n";}var b="("+"".PadLeft(l+2, '@')+")";mc=b+"\n"+mc+ b; Console.WriteLine(mc);

Kiểm tra nó ở đây

Ung dung:

        var v = n % 2 == 0;
        int l = n + n - 3, h = n - 2, e = v ? 0 : 1, c = e + 2;
        var c2 = v ? "MFZJLFRFCF" : "MAFHMFJCJTTT";
        var r = new Random().Next(3 + e);
        var f = new String(c2.Skip(c * r).Take(c).ToArray());
        var mc = "";
        for (var i = 0; i < h; i++)
        {
            var x = "";
            if (!v && i == ((h / 2)))
            {
                x = f;
            }
            else if (v && ((i == h / 2) || (i == (h / 2) - 1)))
            {
                x += f[i % 2 == 1 ? 0 : 1];
            }
            var emptySpace = x.PadLeft((l / 2) + 1 + e, ' ').PadRight(l, ' ');
            mc += "(@" + emptySpace + "@)\n";
        }
        var b = "(" + "".PadLeft(l + 2, '@') + ")";
        mc = b + "\n" + mc + b;
        Console.WriteLine(mc);
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.