Faça-me um bolo da lua!

31

O festival do meio do outono começou!

Infelizmente, todos os meus bolos da lua foram roubados - estão ficando muito caros para pessoas pequenas como eu, e temo não poder comer nenhum este ano!

Então, viro-te para pedir ajuda Você seria capaz de me fazer um pouco?

Para aqueles que não sabem, deixe-me ensinar a você como é um bolo da lua.


Mooncakes vêm em muitos tamanhos diferentes!
Então, eu vou te dar minha opinião , n , quando eu quiser.

Aqui estão alguns exemplos da saída que eu quero:

Bolo da lua de tamanho n = 3:

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

Bolo da lua de tamanho n = 6:

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

Ou seja, um bolo da lua do tamanho n é:

  • n linhas altas
  • 2n - 1 @s de comprimento
  • 2n + 1 caracteres (@s e colchetes)

E é melhor você não me jogar seus bolos da lua muito pequenos!
Suponha que a entrada sempre será n> = 3 .

Mooncakes também contêm uma das seguintes decorações :

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

Qual deles, não importa - desde que esteja centralizado vertical e horizontalmente .
Também pode ser escrito na vertical ou na horizontal!

Eu quero variedade!
Se você realmente vai me fazer dois do mesmo bolo da lua, é melhor a decoração ser diferente!

Ou seja, várias execuções do seu programa com a mesma entrada exata nem sempre devem produzir a mesma decoração .

Mal posso esperar para comer seus bolos da lua, então quanto mais cedo eu puder recebê-los ( quanto menor o seu código ), melhor!

Boa sorte!


Para aqueles que se perguntam sobre as decorações:
são as iniciais de todos os nomes alternativos para o Festival do Meio Outono.
Uma lista pode ser encontrada na página da Wikipedia vinculada no topo deste post.


Esclarecimentos:

Não há regras em relação aos espaços em branco iniciais e finais .
Tenha o quanto quiser!

As decorações devem estar no centro do seu bolo da lua!
Nas decorações horizontais, isso significa que ele deve estar na linha do meio do bolo e o número de caracteres à esquerda e à direita da sequência de decoração deve ser igual.
Nas decorações verticais, isso significa que ele deve residir na coluna do meio do bolo e o número de caracteres acima e abaixo da decoração deve ser igual.

Nem todas as decorações devem ser usadas!
O único requisito é que deve haver mais de uma possibilidade para qualquer entrada n . As possibilidades também não precisam ser iguais.

Funções são aceitáveis.

Coelho da lua
fonte
2
Olá, seja bem-vindo ao PPCG! Parece um ótimo primeiro post. geralmente recomendamos usar o Sandbox para os desafios propostos . Lá, você pode obter feedback de outras pessoas e aperfeiçoar o desafio com coisas em que talvez não tenha pensado antes de publicá-lo aqui. Dito isto, seu desafio parece bem pensado. +1 de mim. Uma pergunta sobre o seu primeiro exemplo, por que ele lê MAFe não MF? Não vejo um Aem suas opções de decoração.
Kevin Cruijssen 15/09/16
1
Obrigado! Desculpe, eu não estava ciente da caixa de areia. Posso deixar apenas este aqui de qualquer maneira? Sobre a decoração - isso foi um erro. Adicionei o MAF às decorações permitidas. Feedback muito apreciado!
Moon Rabbit
1
Não há regras sobre espaços à esquerda e à direita. Você decide!
Moon Rabbit
3
Ei, eu preciso digitar manualmente tudo isso na minha máquina de bolos da lua para obter os bolos da lua reais!
Moon Rabbit
4
... no caso, é bom que nenhuma dessas línguas inventadas com conjuntos de caracteres não-ASCII elevaram sua cabeça, porque eles são uma dor de digitar :) que
GreenAsJade

Respostas:

9

Pitão, 71 65 59 58 bytes

Guardou 1 byte graças a @StevenH.

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

Experimente online. Suíte de teste.

Muito preenchimento.

PurkkaKoodari
fonte
2
É nozes quão diferente esta resposta é a partir do que está abaixo dela na mesma língua ...
Magia Octopus Urna
Você pode salvar um byte, substituindo ?%Q2com @,(inverter a ordem das duas opções) ... Q. Eu (ab) usei muito isso no golfe, minha própria resposta de Pyth.
Steven H.
@StevenH. Obrigado, sempre esqueço a indexação modular.
PurkkaKoodari
7

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

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

Demolir

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.

Minha primeira tentativa no código-golfe. Provavelmente isso pode ser jogado mais.

salvou 4 bytes graças a @ETHProductions

Editar Tomei a liberdade de usar para satisfazer:Date.now()%2 new Date%2

várias execuções do seu programa com a mesma entrada exata nem sempre devem produzir a mesma decoração

isso me permite salvar outros 7 bytes em +Math.random()>.5

salvou outros 4 bytes graças a @Arnauld

Lmis
fonte
Bem-vindo ao PPCG, e ótima primeira resposta! Eu acredito que ['MA','HA'][r]+'F'pode ser jogado para 'MH'[r]+'AF'.
ETHproductions
1
Você pode salvar dois bytes substituindo [' R ',' C '][r]por " ${'RC'[r]} ", substituindo cada "um por um backtick.
ETHproductions
1
E ['MA','HM'][r]+'F'é na verdade dois bytes mais do que ['MAF','HMF'][r];)
ETHproductions
2
Você pode usar em ' @'[+!s]vez de(s?' ':'@')
Arnauld 15/09
2
Além disso, você pode usar em new Date%2vez de Date.now()%2.
Arnauld
6

Pitão, 99 79 71 68 64 bytes

Pyth é muito ruim em criar strings. Ou talvez eu só estou mal ficando melhor em golfe-los.

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

Pode criar as decorações MAFe HMFhorizontalmente, e as decorações MFe CFverticalmente.

Experimente online!

Steven H.
fonte
2
Ahh, é bom ver algum desenvolvimento do personagem nesta história.
Moon Rabbit
6

Vim, 118 bytes

Recebe a entrada como um buffer (por exemplo, um arquivo com o número n como seu conteúdo).

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

Aqui está com os caracteres de controle não imprimíveis no formato 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]..

Experimente online! (Como se vê, o intérprete V também funciona bem para o código Vim normal.)

Explicação

"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>
Jordânia
fonte
Uau, legal! Eu acho que esta é a primeira resposta não determinística do vim que eu já vi! Algumas reflexões: 1) Quando você coloca a entrada em "argumentos" em vez de em "entrada", ela predefine @aarg1, @barg2, etc., mas esse é um recurso específico de V. Tecnicamente, isso não importa desde que você "aDo fez, mas pensei em apontar isso. 2) Você poderia tirar um byte de folga se o fizesse em dd@apvez deY@apdd
DJMcMayhem
@DJMcMayhem dd@ap não funciona muito bem .
Jordânia
dd@aPfunciona, mas requer um adicional je um adicional kabaixo da linha.
Jordânia
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;

Ligue com php -r '<code>' <size>

história

Rev 1: versão inicial; todos os tamanhos (incluindo pequenos bolos), todas as decorações, todas as direções possíveis

Rev. 2: removeu pequenos bolos (-36 bytes), opções de decoração reestruturadas, removeu um item de decoração (-21) e um único byte de golfe (-1).

Rev. 3: até quatro decorações; (-17), somente na horizontal para tamanhos ímpares (-18) mais golfe menor (-8).

Rev. 4: Obrigado a Jörg por jogar golfe na parte do "bolo de pintura"; ele tirou uma incrível (-31).
Outro -6 com o meu golfe adicional e -27 por usar uma única corda em vez de uma série de cordas.

Rev. 5: -7 bytes, principalmente graças a Christallkeks

demolir

Isso está diminuindo a cada hora. :)

// 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
fonte
1
for($i=0;$i<$n=$argv[1];$i++){$o[]=str_pad("(@",2*$n-1,!$i|$i==$n-1?"@":" ")."@)";}
Jörg Hülsermann 15/09/16
@ JörgHülsermann: Muito obrigado. Eu tive que usar uma expressão semelhante para !$i|$‌​i==$n-1?"@":" "; o ternário simplesmente não aceitaria o seu (na minha máquina), embora esteja correto.
Titus
tente, por exemplo, em sandbox.onlinephpfunctions.com
Jörg Hülsermann 15/16
1
Isto poupa-lhe seis bytes na pintura bolo: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";Além disso, parece que você tem "MAD" golfe seus decos ;-)
Christallkeks
4

Java 7, 399 349 bytes

Versão atualizada com a ajuda de @Dodge e @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',' '));}}

Experimente aqui!

A nova versão é muito mais otimizada e se livrou do Stringmanuseio da matriz. Também como sugerido, agora existem apenas 4 decorações: 2 para entradas pares ( MF, ZJ) e 2 para entradas ímpares ( MAF, HMF) que são combinadas em uma única 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
    }
}
QBrute
fonte
Obrigado pela submissão! Deixe-me esclarecer, pois alguns usuários não entenderam - nem todas as decorações devem ser incluídas. Fui em frente e coloquei isso em negrito na seção "esclarecimentos". Espero que você economize alguns bytes! Eu acredito que você ainda seria capaz de usar o mesmo método para selecionar decorações.
Moon Rabbit
4
Haha, no que diz respeito ao golfe em Java, ele pode incluir todas as decorações;). 1, sempre, para qualquer pessoa com coragem de sacar o Java-putter.
Urna Mágica de Polvo
Por que é "MAF"repetido?
precisa saber é o seguinte
@carusocomputing Muito verdadeiro. Apenas por precaução, pensei em mencionar. Agradável!
Moon Rabbit
Obrigado pelo seu feedback :) É verdade que Java não é ótimo para jogar golfe, mas é bem divertido: P. Talvez eu pudesse usar os loops e a inicialização da decoração com char[]mais eficiência e jogar outras coisas ainda mais. @ Cyoce duplicou, MAFporque então eu tenho todas as decorações para uma entrada par em índices 0,2,4,6,8e todas as decorações para uma entrada ímpar em índices 1,3,5,7,9. Isso facilita o cálculo do índice aleatório para uma determinada entrada. Math.random()*5dá um número aleatório de 0-4. *2espalha para 0,2,4,6,8. +n%2adiciona 1entradas ímpares para obter 1,3,5,7,9.
QBrute
3

Lote, 386 bytes

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

Produzirá apenas HMF, MAF, MF ou CF, conforme apropriado. Nota: certas linhas terminam em espaço em branco. Variáveis:

  • n Parâmetro de entrada (lido em STDIN)
  • fPrefixos de decoração (o sufixo Festá implícito)
  • oEstranha de n(usada apenas uma vez, mas as ifinstruções não aceitam expressões)
  • lLinha do caractere vertical superior ou 0para uma decoração horizontal
  • uLinha do caractere vertical inferior ou 0para uma decoração horizontal
  • h Linha da decoração horizontal (substituída por uma decoração vertical)
  • d Índice de decoração no prefixo da decoração (0/1 na horizontal ou 1/3 na vertical)
  • cCadeia de n-3espaços
  • s Cadeia de saída para cada linha
  • %1Número da linha, mas definido como npara a primeira linha também, para que a primeira e a última linha usem @s em vez de espaços.
Neil
fonte
3

C, 233 bytes

Deve ser capaz de jogar isso um pouco daqui ...

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

Grande desafio, foi difícil e feio de codificar.

Execute com esta função principal;

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

Ruby 2.3.1, 449 265 245 233 230 caracteres

Parece que deve haver uma resposta em rubi, então aqui está uma resposta em rubi. Realmente não é tão inteligente, espero que alguém aqui seja mais inteligente;)

Versão 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

Truques de golfe:

  • substitua a declaração do método por uma interpolação de string stabby de
  • $ globals não precisa de # {global}, apenas # $ global
  • === para intervalos é menor que .covers?

Versão legível

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

Teste

mooncake(3)
mooncake(4)
mooncake(5)
mooncake(6)
Roubar
fonte
Eu reimplementado sem usar a matriz, parece que todo mundo está fazendo isso.
Rob Rob
1

Eu estava entediado ... aqui estão mais duas versões:

PHP, 193 bytes

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

um porto de resposta de Lmis

PHP, 191 bytes

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

imprimindo o caractere do bolo por caractere em um único loop

demolir

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
fonte
0

Python 3, 318 301 297 285 272 bytes

Derrubou 17 bytes com a ajuda de DJMcMayhem

Bata 4 bytes graças a mbomb007

Derrubei outros 12 bytes graças a DJMcMayhem

Derrubei outros 13 bytes graças a mbomb007

Meu primeiro golfe, então não é tão bom assim. Eu usei: aliasing math.ceil como ye str.format como z, formatos de aninhamento, importações de linha única, lambda e operação bit a bit, além de outras coisas para obter isso como está.

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

Versão não destruída (importações separadas, sem aliases e sem operação bit a bit):

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

Curiosamente, o uso da versão não bit a bit ainda produz saída correta, no entanto, a saída é diferente:

Não bit a bit:

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

Bit a bit:

(@@@@@@@)
(@ LF  @)
(@     @)
(@@@@@@@)
L. Steer
fonte
você pode mover as importações fora da função e alterá-las para from ... import*digitar as importações para salvar alguns bytes
Azul
Boa resposta e bem-vindo ao site! Algumas dicas: 1. As funções lambda são mais curtas e 2. Você pode fazer import math;y=math.ceilpara remover dois bytes. Isso forneceria 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 bytes mais curtos.
DJMcMayhem
@DJMcMayhem Muito obrigado! Eu atualizei minha resposta.
L. Steer
Ainda bem que pude ajudar! Uma outra coisa que você provavelmente poderia fazer é um apelido, formatjá que você chama muito disso. O problema é que eu não sei exatamente como criar um alias para uma função de membro (como str.format), então você teria que experimentar um pouco. Não tenho certeza de que seria mais curto.
DJMcMayhem
4
Bom trabalho! Fico feliz que você tenha tirado algo deste exercício :) No entanto, gostaria de esclarecer que a decoração deve estar centrada para atender às especificações do desafio. Se você decide ou não alterar seu código para refletir isso - posso pedir que você também mantenha o código atual em sua postagem? Vale a pena manter um bom esforço, mesmo que negligencie uma das regras.
Moon Rabbit
0

Bytes em C # 448

Golfe:

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

Teste aqui

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