ทำให้ฉันเป็นขนมไหว้พระจันทร์!


31

เทศกาลกลางฤดูใบไม้ร่วงได้เริ่มขึ้น!

น่าเสียดายที่ขนมไหว้พระจันทร์ทั้งหมดของฉันถูกขโมย - พวกเขามีราคาแพงเกินไปสำหรับชาวบ้านเล็ก ๆ เช่นตัวฉันเองและฉันกลัวว่าฉันจะไม่สามารถกินได้ในปีนี้!

ดังนั้นฉันหันไปขอความช่วยเหลือจากคุณ คุณจะทำให้ฉันบ้างไหม

สำหรับผู้ที่ไม่รู้ให้ฉันสอนคุณเกี่ยวกับลักษณะของขนมไหว้พระจันทร์


ขนมไหว้พระจันทร์มีหลายขนาด!
ดังนั้นฉันจะให้คุณป้อนของฉัน, n , เมื่อฉันต้องการหนึ่ง

นี่คือตัวอย่างของผลลัพธ์ที่ฉันต้องการ:

ขนมไหว้พระจันทร์ของ size n = 3:

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

ขนมไหว้พระจันทร์ของ size n = 6:

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

กล่าวคือขนมไหว้พระจันทร์ขนาดnคือ:

  • ไม่มีเส้นสูง
  • 2n - 1 @ ความยาว
  • ความยาว 2n + 1ตัวอักษร (@s และวงเล็บ)

และคุณควรอย่าโยนขนมไหว้พระจันทร์เล็ก ๆ ของคุณให้ฉันด้วย!
สมมติการป้อนข้อมูลจะเป็น n> = 3

ขนมไหว้พระจันทร์ประกอบด้วยหนึ่งในเครื่องประดับดังต่อไปนี้ :

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

ซึ่งหนึ่งก็ไม่ได้เรื่อง - ตราบใดที่มันเป็นในแนวตั้งและแนวนอนแน่นิ่ง
มันสามารถเขียนได้ทั้งแนวตั้งและแนวนอนด้วย!

ฉันต้องการความหลากหลาย!
หากคุณจะทำให้ฉันเป็นขนมไหว้พระจันทร์สองชิ้นที่เหมือนกันจริงๆการตกแต่งที่ดีกว่าจะแตกต่างกัน!

นั่นคือการประมวลผลหลายอย่างในโปรแกรมของคุณด้วยอินพุตเดียวกันที่แน่นอนต้องไม่ทำให้เกิดการตกแต่งเหมือนกันเสมอไป

ฉันอดใจรอไม่ไหวที่จะกินขนมไหว้พระจันทร์ของคุณดังนั้นยิ่งฉันได้รับเร็วเท่าไหร่ ( ยิ่งรหัสของคุณสั้นลง ) ก็ยิ่งดี!

โชคดี!


สำหรับผู้ที่สงสัยเกี่ยวกับการตกแต่ง:
พวกเขาเป็นชื่อย่อของชื่อทางเลือกทั้งหมดสำหรับเทศกาลกลางฤดูใบไม้ร่วง
รายการสามารถพบได้ในหน้า Wikipedia เชื่อมโยงที่ด้านบนของโพสต์นี้


ชี้แจง:

มีกฎระเบียบที่เกี่ยวกับการชั้นนำและต่อท้ายช่องว่างไม่มี
มีมากหรือน้อยตามที่คุณต้องการ!

การตกแต่งจะต้องอยู่ในใจกลางของขนมไหว้พระจันทร์ของคุณ!
ในการตกแต่งแนวนอนหมายความว่าต้องอยู่บนเส้นกลางของเค้กของคุณและจำนวนอักขระทางด้านซ้ายและขวาของสตริงการตกแต่งจะต้องเท่ากัน
ในการตกแต่งแนวตั้งหมายความว่าต้องอยู่ในคอลัมน์กลางของเค้กของคุณและจำนวนตัวอักษรด้านบนและด้านล่างของการตกแต่งจะต้องเท่ากัน

จะต้องไม่ใช้ของประดับตกแต่งทั้งหมด!
ข้อกำหนดเพียงอย่างเดียวคือการที่จะต้องมีมากกว่าหนึ่งความเป็นไปได้สำหรับการใด ๆ การป้อนข้อมูลให้n ความเป็นไปได้ยังไม่จำเป็นต้องเป็นแม้กระทั่ง

ฟังก์ชั่นเป็นที่ยอมรับ


2
สวัสดียินดีต้อนรับสู่ PPCG! ดูเหมือนว่าโพสต์แรกที่ยอดเยี่ยม เรามักจะแนะนำให้ใช้Sandbox สำหรับความท้าทายที่นำเสนอ คุณสามารถรับข้อเสนอแนะจากผู้อื่นและทำสิ่งที่ท้าทายให้สมบูรณ์แบบกับสิ่งที่คุณอาจไม่เคยคิดมาก่อนโพสต์ไว้ที่นี่ ความท้าทายของคุณดูดีมาก +1 จากฉัน หนึ่งคำถามเกี่ยวกับตัวอย่างแรกของคุณ แต่ทำไมมันอ่านMAFและไม่ได้MF? ฉันไม่เห็นAตัวเลือกการตกแต่งของคุณ
Kevin Cruijssen

1
ขอบคุณ! ขออภัยฉันไม่ทราบกล่องทราย ฉันสามารถทิ้งอันนี้ไว้ได้ไหม? เกี่ยวกับการตกแต่ง - นั่นเป็นความผิดพลาด ฉันเพิ่ม MAF เข้ากับของตกแต่งที่ได้รับอนุญาต ข้อเสนอแนะชื่นชมมาก!
Moon Rabbit

1
ไม่มีกฎเกี่ยวกับช่องว่างนำหน้าและต่อท้าย แล้วแต่คุณ!
Moon Rabbit

3
เฮ้ฉันต้องพิมพ์ทั้งหมดนี้ลงในเครื่องทำขนมไหว้พระจันทร์ของฉันเพื่อรับขนมไหว้พระจันทร์จริงๆ!
Moon Rabbit

4
... ซึ่งในกรณีนี้มันดีที่ไม่มีภาษาที่ประดิษฐ์ด้วยชุดอักขระที่ไม่ใช่ ASCII ได้เลี้ยงหัวของพวกเขาเพราะพวกมันเจ็บปวดที่จะพิมพ์ :)
GreenAsJade

คำตอบ:


9

Pyth, 71 65 59 58 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @StevenH

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

ลองออนไลน์ ชุดทดสอบ

ช่องว่างภายในมาก


2
มันแตกต่างกันอย่างไรคำตอบนี้แตกต่างจากคำตอบในภาษาเดียวกัน ...
Magic Octopus Urn

คุณสามารถบันทึกหนึ่งไบต์โดยการแทนที่?%Q2ด้วย@,(กลับคำสั่งของทั้งสองตัวเลือก) Q... ฉัน (ab) ใช้มันมากในการตีกอล์ฟของ Pyth ตอบเอง
Steven H.

@StevenH ขอบคุณฉันลืมเกี่ยวกับการทำดัชนีแบบแยกส่วนเสมอ
PurkkaKoodari

7

JavaScript ES6, 206 196 192 188 187 180 176 169 165 156 ไบต์

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()

ทำให้พังถล่ม

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.

ความพยายามครั้งแรกของฉันที่การตีกอล์ฟ นี่อาจเป็นเรื่องของกอล์ฟมากกว่า

บันทึก 4 ไบต์ด้วย @ETHProductions

แก้ไข ฉันใช้เสรีภาพในการใช้เพื่อตอบสนอง:Date.now()%2 new Date%2

การเรียกใช้งานโปรแกรมหลายครั้งของคุณด้วยอินพุตเดียวกันที่แน่นอนต้องไม่ทำให้เกิดการตกแต่งเหมือนกันเสมอไป

สิ่งนี้ทำให้ฉันสามารถบันทึกอีก 7 ไบต์ +Math.random()>.5

บันทึกอีก 4 ไบต์ด้วย @Arnauld


ยินดีต้อนรับสู่ PPCG และคำตอบแรกที่ยอดเยี่ยม! ฉันเชื่อว่า['MA','HA'][r]+'F'สามารถเล่นกอล์ฟ'MH'[r]+'AF'ได้
ETHproductions

1
คุณสามารถบันทึกสองไบต์โดยแทนที่[' R ',' C '][r]ด้วย" ${'RC'[r]} "แทนที่แต่ละรายการ"ด้วย backtick
ETHproductions

1
และ['MA','HM'][r]+'F'มีความยาวมากกว่าสองไบต์จริง ๆ['MAF','HMF'][r])
ETHproductions

2
คุณสามารถใช้' @'[+!s]แทน(s?' ':'@')
Arnauld

2
นอกจากนี้คุณยังสามารถใช้แทนnew Date%2 Date.now()%2
Arnauld

6

Pyth, 99 79 71 68 64 ไบต์

Pyth นั้นแย่มากๆ หรือบางทีฉันแค่แย่ลงที่จะเล่นกอล์ฟให้เก่งขึ้น

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

สามารถสร้างการตกแต่งMAFและHMFแนวนอนและการตกแต่งMFและCFแนวตั้ง

ลองออนไลน์!


2
อ่าดีที่เห็นการพัฒนาตัวละครในเรื่องนี้
Moon Rabbit

6

เป็นกลุ่ม 118 ไบต์

รับอินพุตเป็นบัฟเฟอร์ (เช่นไฟล์ที่มีหมายเลข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>

นี่คือด้วยอักขระควบคุม unprintable ในรูปแบบ 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]..

ลองออนไลน์!(ปรากฏว่าตัวแปล V ทำงานได้ดีสำหรับรหัส Vim ปกติเช่นกัน)

คำอธิบาย

"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>

ว้าวดี! ฉันคิดว่านี่เป็นคำตอบกลุ่มแรกที่ไม่ได้กำหนดฉันได้เห็น! ความคิดสองสามข้อ: 1) เมื่อคุณใส่อินพุตใน "อาร์กิวเมนต์" แทนที่จะเป็น "อินพุต" มันจะกำหนด predefines @aเป็น arg1, @bto arg2 เป็นต้น แต่นี่เป็นคุณลักษณะเฉพาะของ V เทคนิคนี้ไม่สำคัญเพราะคุณมี"aDตั้งแต่แรก แต่ฉันแค่คิดว่าฉันจะชี้ให้เห็น 2) คุณสามารถใช้หนึ่งไบต์ถ้าคุณทำdd@apแทนY@apdd
DJMcMayhem

@DJMcMayhem dd@ap ไม่ค่อยทำงานอนิจจา
จอร์แดน

dd@aPใช้งานได้ แต่ต้องเพิ่มjและเพิ่มอีกkหนึ่งบรรทัด
จอร์แดน

5

PHP, 342 292 249 185 178 176 ไบต์

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;

โทรไปด้วย php -r '<code>' <size>

ประวัติศาสตร์

Rev 1: รุ่นเริ่มต้น; ทุกขนาด (รวมถึงเค้กเล็ก ๆ ) ของตกแต่งทุกอย่างทุกทิศทาง

Rev. 2: ลบเค้กจิ๋ว (-36 bytes), ตัวเลือกการตกแต่งที่ปรับโครงสร้างใหม่, ลบรายการตกแต่งหนึ่งรายการ (-21) และหนึ่งไบต์กอล์ฟ (-1)

Rev. 3: เครื่องประดับลงไปสี่ชิ้น (-17), แนวนอนเท่านั้นสำหรับขนาดคี่ (-18) และการเล่นกอล์ฟเล็ก (-8)

Rev. 4: ขอบคุณJörgสำหรับการลงเล่นส่วน "เพ้นท์เค้ก"; เขาถอดที่น่าอัศจรรย์ (-31)
อีก -6 กับการเล่นกอล์ฟเพิ่มเติมของฉันและ -27 สำหรับการใช้สายเดียวแทนที่จะเป็นชุดของสตริง

Rev. 5: -7 ไบต์ส่วนใหญ่ต้องขอบคุณ Christallkeks

ทำให้พังถล่ม

นี่คือการได้รับ slimmer ชั่วโมง :)

// 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örgHülsermann

@ JörgHülsermann: ขอบคุณมาก ฉันได้ใช้การแสดงออกที่คล้ายกันสำหรับ!$i|$‌​i==$n-1?"@":" "; ไตรภาคีจะไม่ยอมรับของคุณ (ในเครื่องของฉัน) แม้ว่ามันจะถูกต้อง
ติตัส

ลองตัวอย่างเช่นในsandbox.onlinephpfunctions.com
JörgHülsermann

1
นี้ช่วยให้คุณประหยัดหกไบต์บนสีเค้ก: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";นอกจากนี้ก็ดูเหมือนว่าคุณมี "MAD" การเล่นกอล์ฟของคุณ DECOS ;-)
Christallkeks

4

Java 7 399 349 ไบต์

อัปเดตเวอร์ชันแล้วด้วยความช่วยเหลือจาก @Dodge และ @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',' '));}}

ลองที่นี่!

เวอร์ชันใหม่นั้นได้รับการปรับแต่งให้เหมาะสมมากขึ้นและกำจัดการStringจัดการอาเรย์ ตามที่แนะนำมีเพียง 4 การตกแต่งในขณะนี้: 2 สำหรับการป้อนข้อมูลคู่ ( MF, ZJ) และ 2 สำหรับการป้อนข้อมูลคี่ ( MAF, HMF) ซึ่งรวมกันเป็นหนึ่งเดียวStringซึ่งจะรวมกันเป็นหนึ่งเดียว

Ungolfed:

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
    }
}

ขอบคุณสำหรับการส่ง! ให้ฉันอธิบายเนื่องจากมีผู้ใช้ไม่กี่คนที่พลาด - ต้องไม่รวมการตกแต่งทั้งหมด ฉันได้ทำสิ่งนี้อย่างกล้าหาญในส่วน 'การชี้แจง' หวังว่าจะช่วยให้คุณประหยัดได้ไม่กี่ไบต์! ฉันเชื่อว่าคุณจะยังคงสามารถใช้วิธีการเดียวกันเพื่อเลือกการตกแต่ง
Moon Rabbit

4
ฮ่าฮ่าตราบใดที่ Java golfing ดำเนินไปเขาอาจรวมการตกแต่งทั้งหมดไว้ด้วย) +1 เสมอสำหรับทุกคนที่มีลูกบอลเพื่อตี Java-putter
Magic Octopus Urn

"MAF"ทำซ้ำทำไม?
Cyoce

@carusocomputing จริงมาก แต่ในกรณีที่ฉันคิดว่าฉันจะพูดถึงมัน ดี!
Moon Rabbit

ขอบคุณสำหรับคำติชมของคุณ :) จริง ๆ แล้ว Java ไม่เหมาะสำหรับการเล่นกอล์ฟมากนัก บางทีฉันอาจใช้ลูปและเริ่มต้นการตกแต่งได้char[]อย่างมีประสิทธิภาพมากขึ้นและเล่นกอล์ฟสิ่งอื่น ๆ เพิ่มเติม @Cyoce ผมซ้ำMAFแล้วเพราะฉันมีเครื่องประดับสำหรับใส่แม้ที่ดัชนีและตกแต่งทั้งหมดสำหรับการป้อนข้อมูลแปลกที่ดัชนี0,2,4,6,8 1,3,5,7,9ซึ่งทำให้ง่ายต่อการคำนวณดัชนีแบบสุ่มสำหรับอินพุตที่กำหนด จะช่วยให้จำนวนสุ่มจากMath.random()*5 แพร่กระจายไปยัง เพิ่มปัจจัยการผลิตที่แปลกที่จะได้รับ 0-4*20,2,4,6,8+n%211,3,5,7,9
QBrute

3

รุ่นที่ 386 ไบต์

@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%

จะส่งออกเฉพาะ HMF, MAF, MF หรือ CF ตามความเหมาะสม หมายเหตุ: บางบรรทัดลงท้ายด้วย white space ตัวแปร:

  • n พารามิเตอร์อินพุต (อ่านจาก STDIN)
  • fคำนำหน้าการตกแต่ง (ต่อท้ายFเป็นนัย)
  • oความแปลกของn(ใช้เพียงครั้งเดียว แต่ifข้อความไม่ยอมรับนิพจน์)
  • lแถวของอักขระแนวตั้งบนหรือ0สำหรับการตกแต่งแนวนอน
  • uแถวของอักขระแนวตั้งด้านล่างหรือ0สำหรับการตกแต่งแนวนอน
  • h แถวของการตกแต่งแนวนอน (ถูกเขียนทับโดยการตกแต่งแนวตั้ง)
  • d ดัชนีการตกแต่งในคำนำหน้าการตกแต่ง (0/1 สำหรับแนวนอนหรือ 1/3 สำหรับแนวตั้ง)
  • cสตริงของn-3ช่องว่าง
  • s สตริงเอาต์พุตสำหรับแต่ละแถว
  • %1หมายเลขแถว แต่ถูกตั้งค่าnเป็นแถวแรกเช่นกันดังนั้นทั้งแถวแรกและแถวสุดท้ายจึงใช้@s แทนการเว้นวรรค

3

C, 233 ไบต์

น่าจะลงสนามได้จากที่นี่ ...

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++);}

ความท้าทายที่ยิ่งใหญ่นี่เป็นเรื่องยากและน่าเกลียดสำหรับรหัส

ทำงานกับ func หลักนี้

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

2

Ruby 2.3.1, 449 265 245 233 230 ตัวอักษร

ดูเหมือนว่าควรจะมีคำตอบทับทิมดังนั้นนี่คือคำตอบทับทิม มันไม่ฉลาดจริงๆหวังว่าคนอื่นที่นี่จะฉลาดกว่านี้)

รุ่น Golfed:

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

เทคนิคการตีลูกกอล์ฟ:

  • แทนที่การประกาศเมธอดด้วยการแก้ไขสตริงของ stabby
  • $ globals ไม่จำเป็นต้องมี # {global} เพียง # $ global
  • === สำหรับช่วงนั้นสั้นกว่า. covers หรือไม่

เวอร์ชันที่อ่านได้

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

การทดสอบ

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

ฉันปรับใช้ w / o ใหม่โดยใช้อาร์เรย์ดูเหมือนว่าทุกคนกำลังทำเช่นนั้น
Rob

1

ฉันเบื่อ ... ที่นี่มีอีกสองเวอร์ชัน:

PHP, 193 ไบต์

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("");

พอร์ตของคำตอบ Lmis´

PHP, 191 ไบต์

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)]?:" ":"@":")
":"(";

การพิมพ์ตัวอักษรเค้กโดยตัวละครในวงเดียว

ทำให้พังถล่ม

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 ไบต์

เคาะออก 17 ไบต์ด้วยความช่วยเหลือของ DJMcMayhem

เคาะออก 4 ไบต์ด้วย mbomb007

เคาะออกไปอีก 12 ไบต์ด้วย DJMcMayhem

เคาะออกอีก 13 ไบต์ด้วย mbomb007

สนามกอล์ฟครั้งแรกของฉันดังนั้นมันจึงไม่ใช่สิ่งที่ยอดเยี่ยม ฉันใช้: aliasing math.ceil เป็น y และ str.format เป็น z, รูปแบบการซ้อน, การอิมพอร์ตบรรทัดเดี่ยว, แลมบ์ดา, และการดำเนินการระดับบิตรวมทั้งสิ่งอื่น ๆ เพื่อให้ได้สิ่งนี้เช่นนี้

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)))

เวอร์ชันที่ไม่ถูกปรับแต่ง (แยกการนำเข้าไม่มีนามแฝงและไม่มีการดำเนินการระดับบิต):

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)))

สิ่งที่น่าสนใจคือการใช้เวอร์ชั่นที่ไม่ใช่บิตนี้ยังคงสร้างเอาต์พุตที่ถูกต้องอย่างไรก็ตามเอาต์พุตนั้นแตกต่างกัน:

Non-Bitwise:

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

ค่าที่เหมาะสม:

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

คุณสามารถย้ายการนำเข้าออกจากฟังก์ชันและเปลี่ยนเป็น from ... import*พิมพ์การนำเข้าเพื่อบันทึกไบต์
น้ำเงิน

คำตอบที่ดีและยินดีต้อนรับสู่เว็บไซต์! เคล็ดลับสองสามข้อ: 1. ฟังก์ชั่นแลมบ์ดาจะสั้นลงและ 2 คุณสามารถimport math;y=math.ceilถอดสองไบต์ออกได้ สิ่งนี้จะทำให้คุณ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)))สั้นลง 13 ไบต์
DJMcMayhem

@DJMcMayhem ขอบคุณมาก! ฉันปรับปรุงคำตอบของฉัน
L. Steer

ดีใจที่ฉันสามารถช่วย! อีกสิ่งหนึ่งที่คุณอาจทำได้คือนามแฝงformatเนื่องจากคุณเรียกมันมาก ปัญหาคือฉันไม่ทราบวิธีการนามแฝงของฟังก์ชั่นสมาชิก (เช่นstr.format) ดังนั้นคุณต้องทดลองเล็กน้อย ฉันไม่แน่ใจว่ามันจะสั้นกว่านี้
DJMcMayhem

4
เยี่ยมมาก! ฉันดีใจที่คุณได้รับบางสิ่งบางอย่างจากแบบฝึกหัดนี้ :) อย่างไรก็ตามฉันต้องการชี้แจงว่าการตกแต่งจะต้องอยู่ตรงกลางเพื่อให้ตรงกับข้อกำหนดของความท้าทาย ไม่ว่าคุณจะตัดสินใจเปลี่ยนรหัสของคุณเพื่อสะท้อนสิ่งนี้หรือไม่ฉันขอให้คุณเก็บรหัสปัจจุบันในโพสต์ของคุณด้วยหรือไม่ ความพยายามที่ดีควรค่าแก่การรักษาแม้ว่าจะละเลยกฎข้อใดข้อหนึ่ง
Moon Rabbit

0

C # 448 ไบต์

แข็งแรงเล่นกอล์ฟ:

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);

ทดสอบที่นี่

Ungolfed:

        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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.