Buatkan aku kue bulan!

31

The festival pertengahan musim gugur telah dimulai!

Sayangnya, semua kue bulan saya dicuri - harganya terlalu mahal untuk orang-orang kecil seperti saya, dan saya khawatir saya tidak akan bisa makan tahun ini!

Jadi saya meminta bantuan Anda. Apakah Anda bisa membuatkan saya beberapa?

Bagi mereka yang tidak sadar, izinkan saya mendidik Anda tentang seperti apa kue bulan.


Kue bulan datang dalam berbagai ukuran!
Jadi saya akan memberi Anda masukan saya , n , ketika saya menginginkannya.

Berikut adalah beberapa contoh output yang saya inginkan:

Kue bulan ukuran n = 3:

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

Kue bulan ukuran n = 6:

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

Artinya, kue bulan ukuran n adalah:

  • n garis tinggi
  • Panjang 2n - 1 @s
  • Panjang 2n + 1 karakter (@s dan kurung)

Dan Anda lebih baik tidak melemparkan saya kue bulan latihan terlalu kecil Anda!
Asumsikan input akan selalu n> = 3 .

Kue bulan juga mengandung salah satu dekorasi berikut :

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

Yang mana, itu tidak masalah - selama itu berpusat secara vertikal dan horizontal .
Itu dapat ditulis secara vertikal atau horizontal juga!

Saya ingin variasi!
Jika Anda benar-benar akan membuat saya dua kue bulan yang sama, sebaiknya dekorasi berbeda!

Yaitu, beberapa eksekusi program Anda dengan input yang sama persis tidak selalu menghasilkan dekorasi yang sama .

Saya tidak sabar untuk memakan kue bulan Anda, jadi semakin cepat saya dapat menerimanya ( semakin pendek kode Anda ) semakin baik!

Semoga berhasil!


Bagi mereka yang bertanya-tanya tentang dekorasi:
Mereka adalah inisial dari semua nama alternatif untuk Festival Pertengahan Musim Gugur.
Daftar dapat ditemukan di halaman Wikipedia tertaut di bagian atas posting ini.


Klarifikasi:

Tidak ada aturan tentang memimpin dan mengikuti spasi .
Miliki sebanyak atau sesedikit yang Anda suka!

Dekorasi harus di tengah-tengah kue bulan Anda!
Pada dekorasi horisontal, ini berarti harus di garis tengah kue Anda, dan jumlah karakter di kiri dan kanan string dekorasi harus sama.
Pada dekorasi vertikal, ini berarti ia harus berada di kolom tengah kue Anda, dan jumlah karakter di atas dan di bawah dekorasi harus sama.

Tidak semua dekorasi harus digunakan!
Satu-satunya persyaratan adalah bahwa harus ada lebih dari satu kemungkinan untuk setiap input yang diberikan n . Kemungkinannya juga tidak perlu genap.

Fungsi dapat diterima.

Kelinci Bulan
sumber
2
Hai, selamat datang di PPCG! Ini terlihat seperti pos pertama yang bagus. biasanya kami merekomendasikan untuk menggunakan Kotak Pasir untuk tantangan yang diajukan . Di sana Anda dapat memperoleh umpan balik dari orang lain, dan menyempurnakan tantangan dengan hal-hal yang mungkin belum Anda pikirkan, sebelum mempostingnya di sini. Yang sedang berkata, tantangan Anda terlihat dipikirkan dengan matang. +1 dari saya. Namun, ada satu pertanyaan mengenai contoh pertama Anda, mengapa ia membaca MAFdan tidak MF? Saya tidak melihat Aopsi dekorasi Anda.
Kevin Cruijssen
1
Terima kasih! Maaf, saya tidak mengetahui kotak pasir. Apakah saya bisa meninggalkan yang ini saja? Tentang dekorasi - itu kesalahan. Saya menambahkan MAF ke dekorasi yang diizinkan. Umpan balik sangat dihargai!
Bulan Kelinci
1
Tidak ada aturan mengenai ruang depan dan belakang. Terserah kamu!
Kelinci Bulan
3
Hei, saya harus mengetikkan semua ini secara manual ke mesin kue bulan saya untuk mendapatkan kue bulan yang sebenarnya!
Moon Rabbit
4
... dalam hal ini ada baiknya bahwa tidak ada bahasa yang dibuat dengan set karakter non-ASCII yang mendukung mereka, karena mereka
sulit diketik

Jawaban:

9

Pyth, 71 65 59 58 byte

Disimpan 1 byte berkat @StevenH.

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

Cobalah online. Suite uji.

Padding begitu banyak.

PurkkaKoodari
sumber
2
Ini gila betapa berbedanya jawaban ini dari yang di bawahnya dalam bahasa yang sama ...
Magic Octopus Mm
Anda dapat menyimpan satu byte dengan mengganti ?%Q2dengan @,(membalik urutan dua pilihan) ... Q. Saya (ab) banyak menggunakan golf untuk menjawab Pyth saya sendiri.
Steven H.
@ SevenH. Terima kasih, saya selalu lupa tentang pengindeksan modular.
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()

Kerusakan

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.

Upaya pertama saya di kode-golf. Ini mungkin bisa lebih banyak golf.

disimpan 4 byte berkat @ETHProductions

Sunting Saya menggunakan kebebasan untuk memuaskan:Date.now()%2 new Date%2

beberapa eksekusi program Anda dengan input yang sama persis tidak selalu menghasilkan dekorasi yang sama

ini memungkinkan saya untuk menyimpan 7 byte lebih +Math.random()>.5

menyimpan 4 byte lagi berkat @Arnauld

Lmis
sumber
Selamat datang di PPCG, dan jawaban pertama yang bagus! Saya percaya ['MA','HA'][r]+'F'bisa bermain golf 'MH'[r]+'AF'.
ETHproduksi
1
Anda dapat menyimpan dua byte dengan mengganti [' R ',' C '][r]dengan " ${'RC'[r]} ", menggantikan masing-masing "dengan backtick a.
ETHproduksi
1
Dan ['MA','HM'][r]+'F'sebenarnya dua byte lebih lama dari ['MAF','HMF'][r];)
ETHproduksi
2
Anda dapat menggunakan ' @'[+!s]sebagai gantinya(s?' ':'@')
Arnauld
2
Selain itu, Anda dapat menggunakannya new Date%2sebagai gantinya Date.now()%2.
Arnauld
6

Pyth, 99 79 71 68 64 byte

Pyth sangat buruk, baik-baik saja dalam membuat string. Atau mungkin aku semakin buruk dalam bermain golf.

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

Dapat membuat dekorasi MAFdan HMFhorizontal, dan dekorasi MFdan CFvertikal.

Cobalah online!

Steven H.
sumber
2
Ahh, senang melihat perkembangan karakter dalam cerita ini.
Kelinci Bulan
6

Vim, 118 byte

Mengambil input sebagai buffer (mis. File dengan nomor n sebagai isinya).

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

Ini dia dengan karakter kontrol yang tidak patut dicetak dalam format xxd:

0000000: 2261 4469 2829 1b40 6169 401b 2e78 5940  "aDi().@[email protected]@
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]..

Cobalah online! (Ternyata, penerjemah V berfungsi dengan baik untuk kode Vim normal juga.)

Penjelasan

"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>
Jordan
sumber
Wow bagus! Saya pikir ini adalah jawaban vim non-deterministik pertama yang pernah saya lihat! Beberapa pemikiran: 1) Ketika Anda memasukkan input ke dalam "argumen" dan bukannya "input", input @ake standar1 ke arg1, @bke arg2, dll. Tetapi ini adalah fitur khusus V. Secara teknis ini tidak masalah sejak Anda memilikinya "aDdi awal, tetapi saya pikir saya akan menunjukkannya. 2) Anda bisa mengambil satu byte off jika Anda melakukan dd@apbukannyaY@apdd
DJMcMayhem
@DJMcMayhem dd@ap tidak bekerja dengan baik .
Jordan
dd@aPberfungsi, tetapi kemudian membutuhkan tambahan jdan tambahan kdi telepon.
Jordan
5

PHP, 342 292 249 185 178 176 bytes

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;

Telepon dengan php -r '<code>' <size>

sejarah

Rev 1: versi awal; semua ukuran (termasuk kue kecil), semua dekorasi, semua kemungkinan arah

Wahyu 2: kue kecil yang dihapus (-36 bytes), opsi dekorasi yang direstrukturisasi, menghapus satu item dekorasi (-21) dan satu byte golf (-1).

Wahyu 3: Down to empat dekorasi; (-17), hanya horisontal untuk ukuran aneh (-18) plus golf kecil (-8).

Rev. 4: Terima kasih kepada Jörg karena bermain golf di bagian "kue cat"; ia melepas yang luar biasa (-31).
Lain -6 dengan golf tambahan saya, dan -27 untuk menggunakan string tunggal bukan array string.

Wahyu 5: -7 byte sebagian besar berkat Christallkeks

kerusakan

Ini semakin langsing dari jam ke jam. :)

// 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;
Titus
sumber
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: Banyak terima kasih. Saya harus mengambil ungkapan yang sama untuk !$i|$‌​i==$n-1?"@":" "; ternary tidak mau menerima milik Anda (di komputer saya), meskipun sudah benar.
Titus
coba misalnya pada sandbox.onlinephpfunctions.com
Jörg Hülsermann
1
Ini menghemat enam byte pada cat kue: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n"; Juga, sepertinya Anda mendapat "MAD" bermain golf deco Anda ;-)
Christallkeks
4

Java 7, 399 349 byte

Versi yang diperbarui dengan bantuan dari @Dodge dan @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',' '));}}

Coba di sini!

Versi baru ini jauh lebih dioptimalkan dan menyingkirkan Stringpenanganan array. Juga seperti yang disarankan, hanya ada 4 dekorasi sekarang: 2 untuk input genap ( MF, ZJ) dan 2 untuk input ganjil ( MAF, HMF) yang digabungkan menjadi satu String.

Tidak Disatukan:

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
    }
}
QBrute
sumber
Terima kasih atas kirimannya! Izinkan saya mengklarifikasi, karena beberapa pengguna telah melewatkannya - tidak semua dekorasi harus disertakan. Saya telah maju dan menebalkan ini di bagian 'klarifikasi'. Semoga itu akan menghemat beberapa byte! Saya yakin Anda masih bisa menggunakan metode yang sama untuk memilih dekorasi.
Kelinci Bulan
4
Haha, sejauh bermain golf di Jawa, ia mungkin juga memasukkan semua dekorasi;). +1, selalu, bagi siapa pun yang memiliki nyali untuk mencabut Java-putter.
Magic Octopus Mm
Mengapa "MAF"diulang?
Cyoce
@cococuting Benar sekali. Untuk berjaga-jaga, saya pikir saya akan menyebutkannya. Bagus!
Kelinci Bulan
Terima kasih atas tanggapan Anda :) Benar, Java tidak terlalu optimal untuk bermain golf, tetapi menyenangkan melakukannya: P. Mungkin saya bisa menggunakan loop dan inisialisasi dekorasi char[]lebih efisien dan golf hal-hal lain lebih lanjut. @Cyoce Saya menggandakan MAFkarena saya memiliki semua dekorasi untuk input genap pada indeks 0,2,4,6,8dan semua dekorasi untuk input ganjil pada indeks 1,3,5,7,9. Itu membuatnya lebih mudah untuk menghitung indeks acak untuk input yang diberikan. Math.random()*5memberikan nomor acak dari 0-4. *2menyebar ke 0,2,4,6,8. +n%2menambahkan 1untuk mendapatkan input aneh 1,3,5,7,9.
QBrute
3

Batch, 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%

Hanya akan menghasilkan HMF, MAF, MF atau CF yang sesuai. Catatan: garis-garis tertentu berakhir di ruang putih. Variabel:

  • n Parameter input (baca dari STDIN)
  • fAwalan dekorasi (akhiran Ftersirat)
  • oKeanehan n(hanya digunakan satu kali, tetapi ifpernyataan tidak menerima ekspresi)
  • lDeretan karakter vertikal atas, atau 0untuk dekorasi horizontal
  • uDeretan karakter vertikal bawah, atau 0untuk dekorasi horisontal
  • h Deretan dekorasi horisontal (akan ditimpa oleh dekorasi vertikal)
  • d Indeks dekorasi dalam awalan dekorasi (0/1 untuk horizontal atau 1/3 untuk vertikal)
  • cUntaian n-3ruang
  • s Output string untuk setiap baris
  • %1Nomor baris, tetapi atur juga nuntuk baris pertama, sehingga baris pertama dan terakhir menggunakan @s bukan spasi.
Neil
sumber
3

C, 233 Bytes

Harus bisa bermain golf ini sedikit dari sini ...

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

Tantangan besar, ini sulit dan jelek untuk dikodekan.

Jalankan dengan fungsi utama ini;

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

Ruby 2.3.1, 449 265 245 233 230 karakter

Sepertinya harus ada jawaban ruby, jadi inilah jawaban ruby. Ini benar-benar tidak sepintar itu, Semoga orang lain di sini akan lebih pintar;)

Versi golf:

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

Trik golf:

  • ganti deklarasi metode dengan interpolasi string yang stabil dari
  • $ global tidak perlu # {global}, hanya # $ global
  • === untuk rentang lebih pendek dari .cover?

Versi yang mudah dibaca

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

Pengujian

mooncake(3)
mooncake(4)
mooncake(5)
mooncake(6)
rampok
sumber
Saya mengimplementasikan ulang w / o menggunakan array, sepertinya semua orang melakukan itu.
Rob
1

Saya bosan ... berikut dua versi lagi:

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

port jawaban Lmis

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

mencetak karakter kue demi karakter dalam satu putaran tunggal

kerusakan

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
    ;
Titus
sumber
0

Python 3, 318 301 297 285 272 byte

Merobohkan 17 byte dengan bantuan DJMcMayhem

Merobohkan 4 byte berkat mbomb007

Menurunkan 12 byte lagi berkat DJMcMayhem

Menjatuhkan 13 byte lagi berkat mbomb007

Golf pertama saya, jadi tidak terlalu bagus. Saya menggunakan: aliasing math.ceil as y dan str.format as z, format bersarang, impor baris tunggal, lambda, dan operasi bitwise ditambah beberapa hal lain untuk mendapatkan seperti ini.

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

Versi tidak dikunci (impor terpisah, tidak ada alias, dan tidak ada operasi 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)))

Menariknya, menggunakan versi non-bitwise ini masih menghasilkan output yang benar, namun outputnya berbeda:

Non-Bitwise:

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

Bitwise:

(@@@@@@@)
(@ LF  @)
(@     @)
(@@@@@@@)
L. Steer
sumber
Anda dapat memindahkan impor dari fungsi dan mengubahnya untuk from ... import*mengetik impor untuk menghemat beberapa byte
Biru
Jawaban yang bagus, dan selamat datang di situs! Beberapa tips: 1. fungsi lambda lebih pendek, dan 2. bisa Anda lakukan import math;y=math.ceiluntuk melepas dua byte. Ini akan memberi Anda 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 byte lebih pendek.
DJMcMayhem
@DJMcMayhem Terima kasih banyak! Saya memperbarui jawaban saya.
L. Steer
Senang bisa membantu! Satu hal lain yang mungkin bisa Anda lakukan adalah alias formatkarena Anda sering menyebutnya. Masalahnya adalah, saya tidak tahu persis bagaimana cara alias ke fungsi anggota (seperti str.format) sehingga Anda harus sedikit bereksperimen. Saya tidak yakin itu akan lebih pendek.
DJMcMayhem
4
Kerja bagus! Saya senang Anda mendapatkan sesuatu dari latihan ini :) Namun, saya ingin mengklarifikasi bahwa dekorasi harus dipusatkan agar sesuai dengan spesifikasi tantangan. Apakah Anda memutuskan untuk mengubah kode Anda untuk mencerminkan hal ini - dapatkah saya meminta Anda menyimpan kode saat ini juga di pos Anda? Upaya yang baik layak dipertahankan, meskipun itu mengabaikan salah satu aturan.
Bulan Kelinci
0

C # 448 byte

Golf:

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

Uji di sini

Tidak Disatukan:

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