¡Hazme un pastel de luna!


31

¡El festival de mediados de otoño ha comenzado!

Desafortunadamente, todos mis pasteles de luna fueron robados: se están volviendo demasiado caros para gente pequeña como yo, ¡y me temo que no podré comer ninguno este año!

Así que te pido ayuda. ¿Podrías hacerme un poco?

Para aquellos que no lo saben, déjenme educarlos sobre cómo se ve un pastel de luna.


¡Los pasteles de luna vienen en muchos tamaños diferentes!
Así que te voy a dar mi entrada , n , cuando quiera una.

Aquí hay algunos ejemplos de salida que quiero:

Pastel de luna de tamaño n = 3:

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

Pastel de luna de tamaño n = 6:

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

Es decir, un pastel de luna de tamaño n es:

  • norte líneas altas
  • 2n - 1 @s de largo
  • 2n + 1 caracteres de largo (@s y corchetes)

¡Y será mejor que no me arrojes tus pasteles de luna de práctica demasiado pequeños!
Suponga que la entrada siempre será n> = 3 .

Los pasteles de luna también contienen una de las siguientes decoraciones :

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

Cuál, no importa, siempre y cuando esté centrado vertical y horizontalmente .
¡También se puede escribir vertical u horizontalmente!

¡Quiero variedad!
Si realmente me vas a hacer dos del mismo pastel de luna, ¡será mejor que la decoración sea diferente!

Es decir, múltiples ejecuciones de su programa con exactamente la misma entrada no siempre deben producir la misma decoración .

No puedo esperar para comer tus pasteles de luna, así que cuanto antes pueda recibirlos ( más corto será tu código ) ¡mejor!

¡Buena suerte!


Para aquellos que se preguntan sobre las decoraciones:
son las iniciales de todos los nombres alternativos para el Festival del Medio Otoño.
Se puede encontrar una lista en la página de Wikipedia vinculada en la parte superior de esta publicación.


Aclaraciones:

No hay reglas sobre los espacios en blanco iniciales y finales .
¡Ten tanto o tan poco como quieras!

¡Las decoraciones deben estar en el centro de tu pastel de luna!
En decoraciones horizontales, esto significa que debe estar en la línea media de su pastel, y el número de caracteres a la izquierda y derecha de la cadena de decoración debe ser igual.
En decoraciones verticales, esto significa que debe residir en la columna central de su pastel, y el número de caracteres por encima y por debajo de la decoración debe ser igual.

¡No se deben usar todas las decoraciones!
El único requisito es que debe haber más de una posibilidad para cualquier entrada n . Las posibilidades tampoco necesitan ser uniformes.

Las funciones son aceptables.


2
Hola, bienvenido a PPCG! Esto parece una gran primera publicación. por lo general, recomendamos usar Sandbox para los desafíos propuestos . Allí puede obtener comentarios de otros y perfeccionar el desafío con cosas en las que quizás no haya pensado antes de publicarlo aquí. Dicho esto, su desafío se ve bien pensado. +1 de mi parte Sin embargo, una pregunta con respecto a su primer ejemplo, ¿por qué se lee MAFy no MF? No veo una Aen tus opciones de decoración.
Kevin Cruijssen

1
¡Gracias! Lo siento, no estaba al tanto de la caja de arena. ¿Puedo dejar solo este de todos modos? Sobre la decoración, eso fue un error. Agregué MAF a las decoraciones permitidas. Comentarios muy apreciados!
Moon Rabbit

1
No hay reglas con respecto a los espacios iniciales y finales. ¡Depende de usted!
Moon Rabbit

3
¡Oye, necesito escribir manualmente todo esto en mi máquina de pastel de luna para obtener los pasteles de luna reales!
Moon Rabbit

44
... en cuyo caso es bueno que ninguno de esos lenguajes artificiales con juegos de caracteres que no sean ASCII hayan criado, porque es
difícil

Respuestas:


9

Pyth, 71 65 59 58 bytes

Guardado 1 byte gracias a @StevenH.

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

Pruébalo en línea. Banco de pruebas.

Tanto relleno.


2
Es increíble lo diferente que es esta respuesta de la que está debajo en el mismo idioma ...
Magic Octopus Urn

Puede guardar un byte sustituyendo ?%Q2con @,(invertir el orden de las dos opciones) ... Q. Yo (ab) usé mucho eso en el golf, mi propia respuesta de Pyth.
Steven H.

@StevenH. Gracias, siempre me olvido de la indexación 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()

Descompostura

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.

Mi primer intento de golf de código. Esto probablemente se puede jugar más al golf.

ahorrado 4 bytes gracias a @ETHProductions

Editar Me tomé la libertad de usar para satisfacer:Date.now()%2 new Date%2

múltiples ejecuciones de su programa con exactamente la misma entrada no siempre deben producir la misma decoración

esto me permite guardar otros 7 bytes +Math.random()>.5

ahorró otros 4 bytes gracias a @Arnauld


¡Bienvenido a PPCG, y una excelente primera respuesta! Creo que ['MA','HA'][r]+'F'se puede jugar golf 'MH'[r]+'AF'.
ETHproductions

1
Puede guardar dos bytes reemplazándolos [' R ',' C '][r]con " ${'RC'[r]} ", reemplazando cada uno "con un backtick.
ETHproductions

1
Y en ['MA','HM'][r]+'F'realidad es dos bytes más largo que ['MAF','HMF'][r];)
ETHproductions

2
Puede usar en ' @'[+!s]lugar de(s?' ':'@')
Arnauld

2
Además, puede usar en new Date%2lugar de Date.now()%2.
Arnauld

6

Pyth, 99 79 71 68 64 bytes

Pyth es muy malo haciendo cuerdas. O tal vez solo soy malo mejorando en jugar golf.

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

Puede crear las decoraciones MAFy HMFhorizontalmente, y las decoraciones MFy CFverticalmente.

Pruébalo en línea!


2
Ahh, es bueno ver un poco de desarrollo de personajes en esta historia.
Moon Rabbit

6

Vim, 118 bytes

Toma la entrada como un búfer (por ejemplo, un archivo con el número n como contenido).

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

Aquí está con los caracteres de control no imprimibles en formato 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]..

Pruébalo en línea! (Como resultado, el intérprete de V también funciona bien para el código Vim normal).

Explicación

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

¡Vaya! Bien! ¡Creo que esta es la primera respuesta vim no determinista que he visto! Un par de pensamientos: 1) Cuando coloca la entrada en "argumentos" en lugar de "entrada", se predefine @aa arg1, @ba arg2, etc. pero esta es una característica específica de V. Esto técnicamente no importa, ya que lo has hecho "aDal principio, pero pensé en señalarlo. 2) Podrías quitar un byte si lo dd@apY@apdd
hicieras en

@DJMcMayhem dd@ap no funciona del todo .
Jordania

dd@aPfunciona, pero luego requiere un adicional jy otro adicional ken la línea.
Jordania

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;

Llamar con php -r '<code>' <size>

historia

Rev 1: versión inicial; todos los tamaños (incluidos pasteles pequeños), todas las decoraciones, todas las direcciones posibles

Rev. 2: se eliminaron los pasteles pequeños (-36 bytes), las opciones de decoración reestructuradas, se eliminó un elemento de decoración (-21) y un solo byte de golf (-1).

Rev. 3: Hasta cuatro decoraciones; (-17), solo horizontal para tamaños impares (-18) más golf menor (-8).

Rev. 4: Gracias a Jörg por jugar golf en la parte del "pastel de pintura"; se quitó un asombroso (-31).
Otro -6 con mi golf adicional, y -27 por usar una sola cadena en lugar de una serie de cadenas.

Rev. 5: -7 bytes principalmente gracias a Christallkeks

Descompostura

Esto se está volviendo más delgado por horas. :)

// 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: Muchas gracias. Tenía que tomar una expresión similar para !$i|$‌​i==$n-1?"@":" "; el ternario simplemente no aceptaría el suyo (en mi máquina), aunque es correcto.
Titus


1
Esto le ahorra seis bytes en la pintura del pastel: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";Además, parece que tiene "MAD" jugando golf a sus decos ;-)
Christallkeks

4

Java 7, 399 349 bytes

Versión actualizada con ayuda de @Dodge y @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',' '));}}

Pruébalo aquí!

La nueva versión está mucho más optimizada y eliminó el Stringmanejo de la matriz. Además, como se sugiere, ahora solo hay 4 decoraciones: 2 para entradas pares ( MF, ZJ) y 2 para entradas impares ( MAF, HMF) que se combinan en una sola String.

Sin golf:

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

Gracias por la presentación! Permítanme aclarar, ya que algunos usuarios se lo han perdido, no todas las decoraciones deben incluirse. He seguido adelante y en negrita esto en la sección de 'aclaraciones'. ¡Espero que eso te ahorre algunos bytes! Creo que aún podría usar el mismo método para seleccionar decoraciones.
Moon Rabbit

44
Jaja, en lo que respecta al golf Java, también podría incluir todas las decoraciones;). +1, siempre, para cualquiera con las bolas para sacar el putter de Java.
Magic Octopus Urn

¿Por qué se "MAF"repite?
Cyoce

@carusocomputing Muy cierto. Sin embargo, por si acaso, pensé en mencionarlo. ¡Agradable!
Moon Rabbit

Gracias por sus comentarios :) Es cierto, Java no es muy óptimo para el golf, pero es bastante divertido hacerlo: P. Tal vez podría usar los bucles y la inicialización de la decoración de manera char[]más eficiente y seguir jugando a otras cosas. @Cyoce Dupliqué MAFporque entonces tengo todas las decoraciones para una entrada par en los índices 0,2,4,6,8y todas las decoraciones para una entrada impar en los índices 1,3,5,7,9. Eso facilita el cálculo del índice aleatorio para una entrada dada. Math.random()*5da un número aleatorio de 0-4. *2lo extiende a 0,2,4,6,8. +n%2agrega 1entradas impares para obtener 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%

Solo emitirá HMF, MAF, MF o CF según corresponda. Nota: ciertas líneas terminan en espacios en blanco. Variables:

  • n Parámetro de entrada (leído desde STDIN)
  • fPrefijos de decoración (el sufijo Festá implícito)
  • o Rareza de n (solo se usa una vez, pero las ifdeclaraciones no aceptan expresiones)
  • lFila del carácter vertical superior, o 0para una decoración horizontal.
  • u Fila del carácter vertical inferior, o 0 para una decoración horizontal.
  • h Fila de la decoración horizontal (se sobrescribe con una decoración vertical)
  • d Índice de decoración en prefijo de decoración (0/1 para horizontal o 1/3 para vertical)
  • cCadena de n-3espacios
  • s Cadena de salida para cada fila
  • %1Número de fila, pero configurado también npara la primera fila, de modo que tanto la primera como la última fila usen @s en lugar de espacios.

3

C, 233 bytes

Debería poder jugar golf un poco desde aquí ...

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

Gran desafío, esto fue difícil y feo de codificar.

Corre con esta función principal;

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

2

Ruby 2.3.1, 449 265 245 233 230 caracteres

Parece que debería haber una respuesta rubí, así que aquí hay una respuesta rubí. Realmente no es tan inteligente, espero que alguien más aquí sea más inteligente;)

Versión de 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

Trucos de golf:

  • reemplace la declaración del método con una interpolación de cadena stabby
  • $ globals no necesita # {global}, solo # $ global
  • === para rangos es más corto que .covers?

Versión legible

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

Pruebas

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

Reimplementé sin usar la matriz, parece que todos lo están haciendo.
Rob

1

Estaba aburrido ... aquí hay dos versiones más:

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

la respuesta de un puerto 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)]?:" ":"@":")
":"(";

imprimir el pastel carácter por carácter en un solo bucle

Descompostura

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 bytes

Eliminó 17 bytes con la ayuda de DJMcMayhem

Eliminado 4 bytes gracias a mbomb007

Eliminó otros 12 bytes gracias a DJMcMayhem

Eliminó otros 13 bytes gracias a mbomb007

Mi primer golf, así que no es tan bueno. Utilicé: aliasing math.ceil como y y str.format como z, formatos de anidación, importación de una sola línea, lambda y operación bit a bit, además de algunas otras cosas para obtener esto como es.

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ón sin golf (importaciones separadas, sin alias y sin operación 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, el uso de la versión no bit a bit de esto todavía produce una salida correcta, sin embargo, la salida es diferente:

No bit a bit:

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

Bitwise:

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

puede mover las importaciones fuera de la función y cambiarlas para from ... import*escribir importaciones para guardar algunos bytes
Azul

Buena respuesta, y bienvenido al sitio! Un par de consejos: 1. las funciones lambda son más cortas y 2. podría hacer import math;y=math.ceilpara quitar dos bytes. Esto le daría 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 menos.
DJMcMayhem

@DJMcMayhem ¡Muchas gracias! Actualicé mi respuesta.
L. Steer

Me alegro de poder ayudar! Otra cosa que probablemente podrías hacer es un alias, formatya que lo llamas mucho. El problema es que no sé exactamente cómo crear un alias para una función miembro (como str.format), por lo que tendría que experimentar un poco. Sin embargo, no estoy seguro de que sea más corto.
DJMcMayhem

44
¡Buen trabajo! Me alegra que haya sacado algo de este ejercicio :) Sin embargo, me gustaría aclarar que la decoración debe estar centrada para ajustarse a las especificaciones del desafío. Ya sea que decida o no cambiar su código para reflejar esto, ¿puedo pedirle que también mantenga el código actual en su publicación? Vale la pena mantener un buen esfuerzo, incluso si descuida una de las reglas.
Moon Rabbit

0

C # 448 bytes

Golfizado:

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

Pruébalo aquí

Sin 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 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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.