Faites-moi un gâteau de lune!

31

Le festival de la mi-automne a commencé!

Malheureusement, tous mes gâteaux de lune ont été volés - ils deviennent trop chers pour les petits comme moi, et je crains de ne pas pouvoir en manger cette année!

Je me tourne donc vers vous pour obtenir de l'aide. Pourriez-vous m'en faire?

Pour ceux qui ne le savent pas, permettez-moi de vous expliquer à quoi ressemble un gâteau de lune.


Les gâteaux de lune viennent dans de nombreuses tailles différentes!
Je vais donc vous donner mon avis , n , quand j'en veux un.

Voici quelques exemples de la sortie que je souhaite:

Mooncake de taille n = 3:

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

Mooncake de taille n = 6:

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

Autrement dit, un gâteau de lune de taille n est:

  • n lignes hautes
  • 2n - 1 @s de long
  • 2n + 1 caractères de long (@s et crochets)

Et vous feriez mieux de ne pas me jeter vos gâteaux de lune trop minuscules!
Supposons que l'entrée sera toujours n> = 3 .

Les gâteaux de lune contiennent également l' une des décorations suivantes :

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

Lequel, peu importe - tant qu'il est centré verticalement et horizontalement .
Il peut également être écrit verticalement ou horizontalement!

Je veux de la variété!
Si vous allez vraiment me faire deux du même mooncake, la décoration vaut mieux être différente!

C'est-à-dire que plusieurs exécutions de votre programme avec la même entrée exacte ne doivent pas toujours produire la même décoration .

J'ai hâte de manger vos gâteaux de lune, donc plus vite je pourrai les recevoir ( plus votre code sera court ) mieux ce sera!

Bonne chance!


Pour ceux qui s'interrogent sur les décorations:
ce sont les initiales de tous les autres noms du Festival de la mi-automne.
Une liste peut être trouvée dans la page Wikipedia liée en haut de cet article.


Précisions:

Il n'y a pas de règles concernant les espaces de début et de fin .
Ayez autant ou aussi peu que vous le souhaitez!

Les décorations doivent être au centre même de votre gâteau de lune!
Sur les décorations horizontales, cela signifie qu'il doit être sur la ligne médiane de votre gâteau et que le nombre de caractères à gauche et à droite de la chaîne de décoration doit être égal.
Sur les décorations verticales, cela signifie qu'il doit résider dans la colonne du milieu de votre gâteau et que le nombre de caractères au-dessus et en dessous de la décoration doit être égal.

Toutes les décorations ne doivent pas être utilisées!
La seule exigence est qu'il doit y avoir plus d'une possibilité pour une entrée n donnée. Les possibilités n'ont pas non plus besoin d'être égales.

Les fonctions sont acceptables.

Lapin de lune
la source
2
Bonjour, bienvenue sur PPCG! Cela ressemble à un excellent premier post. nous recommandons généralement d'utiliser le bac à sable pour les défis proposés . Là, vous pouvez obtenir des commentaires des autres et perfectionner le défi avec des choses auxquelles vous n'auriez peut-être pas pensé avant de les publier ici. Cela dit, votre défi semble bien pensé. +1 de moi. Une question concernant votre premier exemple cependant, pourquoi est-il lu MAFet non MF? Je n'en vois pas Adans vos options de décoration.
Kevin Cruijssen
1
Merci! Désolé, je n'étais pas au courant du bac à sable. Suis-je capable de laisser juste celui-ci de toute façon? A propos de la décoration - c'était une erreur. J'ai ajouté MAF aux décorations autorisées. Commentaires très appréciés!
Moon Rabbit
1
Il n'y a pas de règles concernant les espaces de début et de fin. Dépend de vous!
Moon Rabbit
3
Hé, je dois taper manuellement tout cela dans ma machine à gâteaux de lune pour obtenir les gâteaux de lune réels!
Moon Rabbit
4
... dans ce cas, il est bon qu'aucune de ces langues artificielles avec des jeux de caractères non ASCII n'ait relevé la tête, car elles sont
pénibles

Réponses:

9

Pyth, 71 65 59 58 octets

1 octet enregistré grâce à @StevenH.

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

Essayez-le en ligne. Suite de tests.

Tant de rembourrage.

PurkkaKoodari
la source
2
C'est fou à quel point cette réponse est différente de celle en dessous dans la même langue ...
Magic Octopus Urn
Vous pouvez enregistrer un octet en remplaçant ?%Q2avec @,(inverser l'ordre des deux choix) ... Q. J'ai (ab) beaucoup utilisé cela pour jouer ma propre réponse Pyth.
Steven H.
@StevenH. Merci, j'oublie toujours l'indexation modulaire.
PurkkaKoodari
7

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

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

Panne

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.

Ma première tentative de code-golf. Cela peut probablement être joué plus.

économisé 4 octets grâce à @ETHProductions

Edit j'ai pris la liberté d'utiliser pour satisfaire:Date.now()%2 new Date%2

plusieurs exécutions de votre programme avec la même entrée exacte ne doivent pas toujours donner la même décoration

cela me permet d'économiser 7 autres octets sur +Math.random()>.5

sauvé encore 4 octets grâce à @Arnauld

Lmis
la source
Bienvenue chez PPCG, et bonne première réponse! Je crois que l' ['MA','HA'][r]+'F'on peut jouer au golf 'MH'[r]+'AF'.
ETHproductions
1
Vous pouvez enregistrer deux octets en remplaçant [' R ',' C '][r]par " ${'RC'[r]} ", en remplaçant chacun "par un backtick.
ETHproductions
1
Et ['MA','HM'][r]+'F'est en fait deux octets de plus que ['MAF','HMF'][r];)
ETHproductions
2
Vous pouvez utiliser à la ' @'[+!s]place de(s?' ':'@')
Arnauld
2
Vous pouvez également utiliser à la new Date%2place de Date.now()%2.
Arnauld
6

Pyth, 99 79 71 68 64 octets

Pyth est très mauvais pour faire des chaînes. Ou peut-être que je suis tout simplement mauvais de m'améliorer en jouant au golf.

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

Peut créer les décorations MAFet HMFhorizontalement, et les décorations MFet CFverticalement.

Essayez-le en ligne!

Steven H.
la source
2
Ahh, c'est bon de voir un certain développement de personnage dans cette histoire.
Moon Rabbit
6

Vim, 118 octets

Prend l'entrée comme tampon (par exemple un fichier avec le nombre n comme contenu).

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

Le voici avec les caractères de contrôle non imprimables au 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]..

Essayez-le en ligne! (Il s'avère que l'interpréteur V fonctionne également très bien pour le code Vim normal.)

Explication

"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
la source
Wow, sympa! Je pense que c'est la première réponse vim non déterministe que j'ai vue! Quelques réflexions: 1) Lorsque vous placez l'entrée dans "arguments" plutôt que "entrée", elle prédéfinit @aà arg1, @bà arg2, etc. mais c'est une fonctionnalité spécifique à V. Techniquement, cela n'a pas d'importance depuis "aDle début, mais je pensais juste le signaler. 2) Vous pourriez retirer un octet si vous le dd@apY@apdd
faisiez
@DJMcMayhem dd@ap ne fonctionne pas vraiment hélas.
Jordan
dd@aPfonctionne, mais nécessite alors un supplémentaire jet un supplémentaire ksur toute la ligne.
Jordan
5

PHP, 342 292 249 185 178 178 176 octets

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;

Appeler avec php -r '<code>' <size>

histoire

Rev 1: version initiale; toutes les tailles (y compris les petits gâteaux), toutes les décorations, toutes les directions possibles

Rév.2: suppression de minuscules gâteaux (-36 octets), restructuration des options de décoration, suppression d'un élément de décoration (-21) et d'un golf à un octet (-1).

Rév. 3: jusqu'à quatre décorations; (-17), uniquement horizontal pour les tailles impaires (-18) plus le golf mineur (-8).

Rév. 4: Merci à Jörg d'avoir joué au golf dans la partie "gâteau de peinture"; il a décollé un incroyable (-31).
Un autre -6 avec mon golf supplémentaire, et -27 pour l'utilisation d'une seule chaîne au lieu d'un tableau de chaînes.

Rév.5: -7 octets principalement grâce à Christallkeks

panne

Cela s'amincit d'heure en heure. :)

// 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
la source
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: Merci beaucoup. J'ai dû prendre une expression similaire pour !$i|$‌​i==$n-1?"@":" "; le ternaire n'accepterait tout simplement pas le vôtre (sur ma machine), bien qu'il soit correct.
Titus du
essayez-le par exemple sur sandbox.onlinephpfunctions.com
Jörg Hülsermann
1
Cela vous permet d'économiser six octets sur la peinture à gâteau: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";En outre, il semble que vous ayez "MAD" pour jouer à vos décos ;-)
Christallkeks
4

Java 7, 399 349 octets

Version mise à jour avec l'aide de @Dodge et @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',' '));}}

Essayez-le ici!

La nouvelle version est beaucoup plus optimisée et s'est débarrassée de la Stringgestion des baies. Comme suggéré, il n'y a maintenant que 4 décorations: 2 pour les entrées paires ( MF, ZJ) et 2 pour les entrées impaires ( MAF, HMF) qui sont combinées en une seule 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
la source
Merci pour la soumission! Permettez-moi de clarifier, car quelques utilisateurs l'ont manqué - toutes les décorations ne doivent pas être incluses. Je suis allé de l'avant et j'ai mis cela en gras dans la section «clarifications». J'espère que cela vous fera économiser quelques octets! Je pense que vous pourriez toujours utiliser la même méthode pour sélectionner les décorations.
Moon Rabbit
4
Haha, en ce qui concerne le golf Java, il pourrait aussi bien inclure toutes les décorations;). +1, toujours, pour quiconque avec les boules de fouetter le putter Java.
Magic Octopus Urn
Pourquoi est "MAF"répété?
Cyoce
@carusocomputing Très vrai. Au cas où, cependant, je pensais que je le mentionnerais. Agréable!
Moon Rabbit
Merci pour vos commentaires :) Certes, Java n'est pas très optimal pour le golf, mais c'est assez amusant de le faire: P. Peut-être pourrais-je utiliser les boucles et l'initialisation de la décoration char[]plus efficacement et jouer au golf plus loin. @Cyoce J'ai dupliqué MAFcar alors j'ai toutes les décorations pour une entrée paire aux indices 0,2,4,6,8et toutes les décorations pour une entrée impaire aux index 1,3,5,7,9. Cela facilite le calcul de l'index aléatoire pour une entrée donnée. Math.random()*5donne un nombre aléatoire de 0-4. *2le propage à 0,2,4,6,8. +n%2ajoute 1pour les entrées impaires à obtenir 1,3,5,7,9.
QBrute
3

Lot, 386 octets

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

Ne sortira que HMF, MAF, MF ou CF selon le cas. Remarque: certaines lignes se terminent par un espace blanc. Variables:

  • n Paramètre d'entrée (lu depuis STDIN)
  • fPréfixes de décoration (le suffixe Fest implicite)
  • oCuriosité de n(utilisé une seule fois, mais les ifinstructions n'acceptent pas d'expressions)
  • lLigne du caractère vertical supérieur, ou 0pour une décoration horizontale
  • uLigne du caractère vertical inférieur, ou 0pour une décoration horizontale
  • h Ligne du décor horizontal (écrasée par un décor vertical)
  • d Indice de décoration en préfixe de décoration (0/1 pour horizontal ou 1/3 pour vertical)
  • cChaîne d' n-3espaces
  • s Chaîne de sortie pour chaque ligne
  • %1Numéro de ligne, mais défini également sur nla première ligne, de sorte que la première et la dernière lignes utilisent @s au lieu d'espaces.
Neil
la source
3

C, 233 octets

Devrait être en mesure de jouer au golf un peu d'ici ...

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

Grand défi, c'était difficile et moche à coder.

Exécutez avec cette fonction principale;

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

Ruby 2.3.1, 449 265 245 233 230 caractères

Il semble qu'il devrait y avoir une réponse rubis, alors voici une réponse rubis. Ce n'est vraiment pas si intelligent, j'espère que quelqu'un d'autre ici sera plus intelligent;)

Version golfée:

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

Astuces de golf:

  • remplacer la déclaration de méthode par une interpolation de chaîne stabby de
  • $ globals n'a pas besoin de # {global}, seulement # $ global
  • === pour les plages est plus court que .covers?

Version lisible

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

Essai

mooncake(3)
mooncake(4)
mooncake(5)
mooncake(6)
Rob
la source
J'ai réimplémenté sans utiliser le tableau, il semble que tout le monde le fasse.
Rob
1

Je m'ennuyais ... voici deux autres versions:

PHP, 193 octets

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

un port de réponse de Lmis

PHP, 191 octets

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

impression du gâteau caractère par caractère en une seule boucle

panne

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
la source
0

Python 3, 318 301 297 285 272 octets

Supprimé 17 octets avec l'aide de DJMcMayhem

Coupé de 4 octets grâce à mbomb007

Coupé encore 12 octets grâce à DJMcMayhem

13 autres octets supprimés grâce à mbomb007

Mon tout premier golf, donc ce n'est pas terrible. J'ai utilisé: aliasing math.ceil as y et str.format as z, formats d'emboîtement, importations sur une seule ligne, lambda et opération au niveau du bit, ainsi que d'autres choses pour que les choses soient telles qu'elles sont.

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

Version non golfée (importations séparées, pas d'alias et pas d'opération au niveau du 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)))

Fait intéressant, l'utilisation de la version non bit à bit de ce produit toujours une sortie correcte, cependant, la sortie est différente:

Non binaire:

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

Au niveau du bit:

(@@@@@@@)
(@ LF  @)
(@     @)
(@@@@@@@)
L. Steer
la source
vous pouvez déplacer les importations hors de la fonction et les changer pour from ... import*taper les importations pour économiser quelques octets
Blue
Bonne réponse, et bienvenue sur le site! Quelques conseils: 1. les fonctions lambda sont plus courtes, et 2. vous pourriez faire import math;y=math.ceilpour retirer deux octets. Cela vous donnerait 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 octets de moins.
DJMcMayhem
@DJMcMayhem Merci beaucoup! J'ai mis à jour ma réponse.
L. Steer
Heureux d'avoir pu aider! Une autre chose que vous pourriez probablement faire est un alias formatpuisque vous l'appelez beaucoup. Le problème est que je ne sais pas exactement comment créer un alias vers une fonction membre (comme str.format), vous devrez donc expérimenter un peu. Je ne suis pas certain que ce serait plus court cependant.
DJMcMayhem
4
Bon travail! Je suis heureux que vous ayez tiré quelque chose de cet exercice :) Cependant, je tiens à préciser que la décoration doit être centrée pour correspondre aux spécifications du défi. Que vous décidiez ou non de modifier votre code pour refléter cela - puis-je vous demander de conserver le code actuel dans votre message également? Un bon effort mérite d'être conservé, même s'il néglige l'une des règles.
Moon Rabbit
0

C # 448 octets

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

Testez-le ici

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
la source