Mach mir einen Mondkuchen!


31

Das Mittherbstfest hat begonnen!

Leider wurden alle meine Mondkuchen gestohlen - sie werden für kleine Leute wie mich zu teuer, und ich fürchte, ich werde in diesem Jahr keine mehr essen können!

Also bitte ich Sie um Hilfe. Könntest du mir welche machen?

Lassen Sie sich von mir erklären, wie ein Mondkuchen aussieht.


Mooncakes gibt es in vielen verschiedenen Größen!
So bin ich Ihnen mein Gonna geben Eingang , n , wenn ich einen will.

Hier sind einige Beispiele für die Ausgabe, die ich möchte:

Mondkuchen der Größe n = 3:

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

Mondkuchen der Größe n = 6:

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

Das heißt, ein Mondkuchen der Größe n ist:

  • n Zeilen hoch
  • 2n - 1 @s lang
  • 2n + 1 Zeichen lang (@s und Klammern)

Und du wirfst mir besser nicht deine zu winzigen Übungsmondkuchen!
Angenommen, die Eingabe ist immer n> = 3 .

Mooncakes enthalten auch eine der folgenden Dekorationen :

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

Welches, spielt keine Rolle - solange es vertikal und horizontal zentriert ist .
Es kann auch vertikal oder horizontal geschrieben werden!

Ich will Abwechslung!
Wenn du mich wirklich zu zwei gleichen Mooncakes machen willst, ist die Dekoration besser anders!

Das heißt, mehrere Ausführungen Ihres Programms mit genau der gleichen Eingabe müssen nicht immer die gleiche Dekoration ergeben .

Ich kann es kaum erwarten, deine Mondkuchen zu essen. Je früher ich sie bekomme (je kürzer dein Code ) , desto besser!

Viel Glück!


Für diejenigen, die sich über die Dekoration wundern:
Sie sind die Initialen aller alternativen Namen für das Mid-Autumn Festival.
Eine Liste finden Sie auf der Wikipedia-Seite, die oben in diesem Beitrag verlinkt ist.


Klarstellungen:

Es gibt keine Regeln für führende und nachfolgende Leerzeichen .
Haben Sie so viel oder so wenig, wie Sie möchten!

Die Dekorationen müssen in der Mitte Ihres Mondkuchens sein!
Bei horizontalen Dekorationen bedeutet dies, dass sie sich in der mittleren Zeile Ihres Kuchens befinden müssen und die Anzahl der Zeichen links und rechts von der Dekorationszeichenfolge gleich sein muss.
Bei vertikalen Dekorationen muss sich diese in der mittleren Spalte Ihres Kuchens befinden und die Anzahl der Zeichen über und unter der Dekoration muss gleich sein.

Es müssen nicht alle Dekorationen verwendet werden!
Die einzige Voraussetzung ist, dass es für eine bestimmte Eingabe n mehr als eine Möglichkeit geben muss. Die Möglichkeiten müssen auch nicht gerade sein.

Funktionen sind akzeptabel.


2
Hallo, willkommen bei PPCG! Das sieht nach einem großartigen ersten Beitrag aus. In der Regel empfehlen wir, die Sandbox für vorgeschlagene Herausforderungen zu verwenden . Dort können Sie Feedback von anderen erhalten und die Herausforderung mit Dingen perfektionieren, an die Sie möglicherweise nicht gedacht haben, bevor Sie sie hier veröffentlichen. Trotzdem sieht Ihre Herausforderung gut durchdacht aus. +1 von mir. Eine Frage zu Ihrem ersten Beispiel: Warum liest es MAFund nicht MF? Ich sehe keine Ain Ihren Dekorationsoptionen.
Kevin Cruijssen

1
Vielen Dank! Der Sandkasten war mir leider nicht bekannt. Kann ich trotzdem nur diesen einen stehen lassen? Über die Dekoration - das war ein Fehler. Ich habe MAF zu den erlaubten Dekorationen hinzugefügt. Feedback sehr geschätzt!
Moon Rabbit

1
Es gibt keine Regeln für führende und nachfolgende Leerzeichen. Wie du willst!
Moon Rabbit

3
Hey, ich muss das alles manuell in meine Mooncake-Maschine eingeben, um die tatsächlichen Mooncakes zu erhalten!
Moon Rabbit

4
... in diesem Fall ist es gut, dass keine dieser erfundenen Sprachen mit Nicht-ASCII-Zeichensätzen ihren Kopf erhoben hat, weil sie ein
Tippfehler

Antworten:


9

Pyth, 71 65 59 58 Bytes

1 Byte dank @StevenH gespeichert.

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

Probieren Sie es online aus. Testsuite.

So viel Polsterung.


2
Es ist verrückt, wie unterschiedlich diese Antwort von der Antwort darunter in derselben Sprache ist ...
Magic Octopus Urn

Sie können ein Byte speichern durch Ersetzen ?%Q2mit @,(die Reihenfolge der zwei Möglichkeiten rückwärts) ... Q. Ich (ab) habe das oft genutzt, um meine eigene Pyth-Antwort herunterzuspielen.
Steven H.

@StevenH. Danke, ich vergesse immer die modulare Indizierung.
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()

Nervenzusammenbruch

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.

Mein erster Versuch, Code-Golf zu spielen. Damit kann wohl mehr golfen werden.

4 Bytes gespart dank @ETHProductions

Bearbeiten Ich habe die Freiheit der Verwendung zu erfüllen:Date.now()%2 new Date%2

Mehrere Ausführungen Ihres Programms mit genau der gleichen Eingabe müssen nicht immer die gleiche Dekoration ergeben

Dadurch kann ich weitere 7 Bytes speichern +Math.random()>.5

hat dank @Arnauld weitere 4 Bytes gespart


Willkommen bei PPCG und tolle erste Antwort! Ich glaube, man ['MA','HA'][r]+'F'kann Golf spielen 'MH'[r]+'AF'.
ETHproductions

1
Sie können zwei Bytes speichern durch den Austausch [' R ',' C '][r]mit " ${'RC'[r]} "jedem Ersatz "mit einem Graviszeichen.
ETHproductions

1
Und ['MA','HM'][r]+'F'ist eigentlich zwei Bytes länger als ['MAF','HMF'][r];)
ETHproductions

2
Sie können ' @'[+!s]anstelle von(s?' ':'@')
Arnauld

2
Sie können auch new Date%2anstelle von verwenden Date.now()%2.
Arnauld

6

Pyth, 99 79 71 68 64 Bytes

Pyth ist sehr schlecht darin , Streicher zu machen. Oder vielleicht bin ich nur schlecht darin , sie besser zu spielen.

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

Kann die Dekorationen MAFund HMFhorizontal und die Dekorationen MFund CFvertikal erstellen .

Probieren Sie es online!


2
Ahh, es tut gut, eine Charakterentwicklung in dieser Geschichte zu sehen.
Moon Rabbit

6

Vim, 118 Bytes

Übernimmt die Eingabe als Puffer (zB eine Datei mit der Nummer n als Inhalt).

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

Hier ist es mit den nicht druckbaren Steuerzeichen im xxd-Format:

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]..

Probieren Sie es online! (Wie sich herausstellt, funktioniert der V-Interpreter auch für normalen Vim-Code einwandfrei.)

Erläuterung

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

Wow nett! Ich denke, dies ist die erste nicht deterministische Vim-Antwort, die ich gesehen habe! Ein paar Gedanken: 1) Wenn Sie die Eingabe in "Argumente" anstatt in "Eingabe" @aeingeben, ist sie vordefiniert für arg1, @barg2 usw., dies ist jedoch eine V-spezifische Funktion. Das ist technisch nicht wichtig, da Sie es "aDam Anfang haben, aber ich dachte nur, ich würde darauf hinweisen. 2) Sie könnten ein Byte dd@apY@apdd
auslassen

@DJMcMayhem dd@ap funktioniert leider nicht ganz .
Jordanien

dd@aPfunktioniert, erfordert dann aber eine zusätzliche jund eine zusätzliche kauf der ganzen Linie.
Jordanien

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;

Mit anrufen php -r '<code>' <size>

Geschichte

Rev 1: Erstausgabe; Alle Größen (einschließlich winziger Kuchen), alle Dekorationen, alle möglichen Richtungen

Rev. 2: Entfernte winzige Kuchen (-36 Bytes), restrukturierte Dekorationsoptionen, entfernte einen Dekorationsgegenstand (-21) und ein Einzelbyte-Golf (-1).

Rev. 3: Bis zu vier Dekorationen; (-17), nur horizontal für ungerade Größen (-18) plus leichtes Golfen (-8).

Rev. 4: Danke an Jörg für das Golfen im "Paint Cake" Teil; Er hat einen unglaublichen (-31) abgelegt.
Ein weiteres -6 mit meinem zusätzlichen Golfspiel und -27 für die Verwendung einer einzelnen Saite anstelle einer Reihe von Saiten.

Rev. 5: -7 Bytes vor allem dank Christallkeks

Nervenzusammenbruch

Dies wird von Stunde zu Stunde schlanker. :)

// 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: Vielen Dank. Ich musste einen ähnlichen Ausdruck nehmen für !$i|$‌​i==$n-1?"@":" "; Die Ternäre würde Ihre (auf meinem Computer) einfach nicht akzeptieren, obwohl dies korrekt ist.
Titus

versuchen Sie es zum Beispiel auf sandbox.onlinephpfunctions.com
Jörg

1
Das spart dir sechs Bytes bei der Kuchenbemalung: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";Es sieht auch so aus, als hättest du "MAD" beim Golfen ;-)
Christallkeks

4

Java 7, 399 349 Bytes

Aktualisierte Version mit Hilfe von @Dodge und @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',' '));}}

Probieren Sie es hier aus!

Die neue Version ist viel optimierter und hat das StringArray-Handling überflüssig gemacht. Auch wie vorgeschlagen, gibt es jetzt nur 4 Dekorationen: 2 für gerade Eingänge ( MF, ZJ) und 2 für ungerade Eingänge ( MAF, HMF), die zu einer einzigen kombiniert werden 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
    }
}

Vielen Dank für die Einreichung! Lassen Sie mich klarstellen, wie einige Benutzer es verpasst haben - nicht alle Dekorationen müssen enthalten sein. Ich habe dies im Abschnitt "Erläuterungen" hervorgehoben. Hoffentlich sparen Sie dadurch ein paar Bytes! Ich glaube, dass Sie immer noch die gleiche Methode verwenden können, um Dekorationen auszuwählen.
Moon Rabbit

4
Haha, was Java-Golfen angeht, könnte er genauso gut alle Dekorationen einschließen;). +1, immer, wenn jemand mit den Bällen den Java-Putter auspeitscht.
Magic Octopus Urn

Warum wird "MAF"wiederholt?
Cyoce

@carusocomputing Sehr wahr. Nur für den Fall, dachte ich, ich würde es erwähnen. Nett!
Moon Rabbit

Vielen Dank für Ihr Feedback :) Ja, Java ist nicht besonders gut zum Golfen geeignet, aber es macht Spaß: P. Vielleicht könnte ich die Schleifen und die Initialisierung der Dekoration char[]effizienter nutzen und andere Dinge weiter Golf spielen. @Cyoce Ich habe dupliziert, MAFweil ich dann alle Dekorationen für eine gerade Eingabe bei Indizes 0,2,4,6,8und alle Dekorationen für eine ungerade Eingabe bei Indizes habe 1,3,5,7,9. Dadurch ist es einfacher, den Zufallsindex für eine bestimmte Eingabe zu berechnen. Math.random()*5gibt eine Zufallszahl aus 0-4. *2verbreitet es zu 0,2,4,6,8. +n%2fügt 1für ungerade Eingänge zu bekommen 1,3,5,7,9.
QBrute

3

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

Gibt nur HMF, MAF, MF oder CF entsprechend aus. Hinweis: Bestimmte Zeilen enden in Leerzeichen. Variablen:

  • n Eingabeparameter (aus STDIN gelesen)
  • fDekorationspräfixe (Suffix Fist impliziert)
  • oSeltsamkeit von n(nur einmal verwendet, aber ifAnweisungen akzeptieren keine Ausdrücke)
  • lZeile des oberen vertikalen Zeichens oder 0für eine horizontale Dekoration
  • uZeile des unteren vertikalen Zeichens oder 0für eine horizontale Dekoration
  • h Zeile der horizontalen Dekoration (wird durch eine vertikale Dekoration überschrieben)
  • d Dekorationsindex im Dekorationspräfix (0/1 für horizontal oder 1/3 für vertikal)
  • cZeichenfolge von n-3Leerzeichen
  • s Ausgabezeichenfolge für jede Zeile
  • %1nZeilennummer , aber auch für die erste Zeile festgelegt, sodass sowohl die erste als auch die letzte Zeile @s anstelle von Leerzeichen verwenden.

3

C 233 Bytes

Sollte in der Lage sein, dies ein bisschen von hier aus zu golfen ...

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

Große Herausforderung, das war schwierig und hässlich zu programmieren.

Führen Sie mit dieser Hauptfunktion aus.

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

2

Ruby 2.3.1, 449 265 245 233 230 Zeichen

Scheint, als sollte es eine rubinrote Antwort geben, also hier eine rubinrote Antwort. Es ist wirklich nicht so schlau, hoffentlich wird jemand anderes hier schlauer sein;)

Golf Version:

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

Golftricks:

  • Ersetzen Sie die Methodendeklaration durch eine Stabby-String-Interpolation von
  • $ globals benötigt nicht # {global}, nur # $ global
  • === für Bereiche ist kürzer als .covers?

Lesbare Version

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

Testen

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

Ich habe es ohne Verwendung des Arrays reimplementiert, anscheinend macht das jeder.
Rob

1

Mir war langweilig ... hier sind zwei weitere Versionen:

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

ein Hafen von Lmis 'Antwort

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

druckt den Kuchen zeichenweise in einer einzigen Schleife

Nervenzusammenbruch

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

17 Bytes mit Hilfe von DJMcMayhem abgeschlagen

4 Bytes dank mbomb007 abgeschlagen

Weitere 12 Bytes dank DJMcMayhem abgeschlagen

Weitere 13 Bytes dank mbomb007 abgeschlagen

Mein allererstes Golfspiel, es ist also nicht so toll. Ich benutzte: Aliasing von math.ceil als y und str.format als z, Verschachtelungsformate, Import einzelner Zeilen, Lambda und bitweise Operationen sowie einige andere Dinge, um das so zu machen, wie es ist.

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

Ungolfed-Version (getrennte Importe, keine Aliase und keine bitweise Operation):

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

Interessanterweise erzeugt die Verwendung der nicht-bitweisen Version davon immer noch eine korrekte Ausgabe, jedoch ist die Ausgabe anders:

Nicht bitweise:

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

Bitweise:

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

Sie können die Importe aus der Funktion verschieben und sie in from ... import*Typ-Importe ändern , um einige Bytes zu sparen
Blau

Schöne Antwort und willkommen auf der Seite! Ein paar Tipps: 1. Lambda-Funktionen sind kürzer und 2. Sie könnten import math;y=math.ceilzwei Bytes entfernen. Dies würde Ihnen geben, 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)))die 13 Bytes kürzer ist.
DJMcMayhem

@DJMcMayhem Vielen Dank! Ich habe meine Antwort aktualisiert.
L. Steer

Froh, dass ich helfen konnte! Eine andere Sache, die Sie wahrscheinlich tun könnten, ist ein Pseudonym, formatda Sie es häufig nennen. Das Problem ist, dass ich nicht genau weiß, wie man einen Alias ​​für eine Mitgliedsfunktion (wie str.format) erstellt, sodass Sie ein wenig experimentieren müssen. Ich bin mir nicht sicher, ob es kürzer wäre.
DJMcMayhem

4
Gute Arbeit! Ich bin froh, dass Sie etwas aus dieser Übung mitgenommen haben :) Ich möchte jedoch klarstellen, dass die Dekoration zentriert sein muss, damit sie den Herausforderungsspezifikationen entspricht. Ob Sie sich dazu entschließen, Ihren Code zu ändern oder nicht - kann ich Sie bitten, den aktuellen Code auch in Ihrem Beitrag beizubehalten? Gute Mühen, die es wert sind, eingehalten zu werden, auch wenn sie eine der Regeln missachten.
Moon Rabbit

0

C # 448 Bytes

Golf gespielt:

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 es hier

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.