Zrób mi ciasto księżycowe!

31

Rozpoczął się środkowy jesienny festiwal !

Niestety, wszystkie moje ciastka księżycowe zostały skradzione - stają się zbyt drogie dla małych ludzi, takich jak ja, i obawiam się, że nie będę w stanie zjeść tego roku!

Zwracam się więc do ciebie o pomoc. Czy byłbyś w stanie zrobić mi trochę?

Dla tych, którzy nie są świadomi, pozwólcie, że nauczę cię, jak wygląda ciastko księżycowe.


Mooncakes są w wielu różnych rozmiarach!
Więc dam wam moje wejście , n , kiedy chcesz.

Oto kilka przykładów danych wyjściowych, które chcę:

Ciasto księżycowe o rozmiarze n = 3:

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

Mooncake o rozmiarze n = 6:

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

To znaczy, że księżycowy rozmiar n to:

  • n linii wysoko
  • 2n - 1 @ s długości
  • Długość 2n + 1 znaków (@s i nawiasy kwadratowe)

I lepiej nie wrzucaj mi swoich zbyt małych ćwiczeń księżycowych ciastek!
Załóżmy, że dane wejściowe zawsze będą n> = 3 .

Mooncakes zawierają również jedną z następujących dekoracji :

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

Który z nich nie ma znaczenia - o ile jest wyśrodkowany pionowo i poziomo .
Można go również pisać pionowo lub poziomo!

Chcę różnorodności!
Jeśli naprawdę zamierzasz zrobić ze mnie dwa takie same ciasteczka księżycowe, dekoracja powinna być inna!

Oznacza to, że wielokrotne wykonywanie programu z dokładnie tym samym wejściem nie zawsze musi dawać tę samą dekorację .

Nie mogę się doczekać, aby zjeść ciasteczka księżycowe, więc im szybciej je otrzymam (im krótszy kod ), tym lepiej!

Powodzenia!


Dla tych, którzy zastanawiają się nad dekoracjami:
są to inicjały wszystkich alternatywnych nazw na Święto Środka Jesieni.
Listę można znaleźć na stronie Wikipedii, do której link znajduje się na początku tego postu.


Wyjaśnienia:

Nie ma żadnych zasad dotyczących początkowych i końcowych białych znaków .
Miej tyle, ile chcesz!

Dekoracje muszą znajdować się w samym środku twojego ciasteczka księżycowego!
W przypadku poziomych dekoracji oznacza to, że musi znajdować się na środkowej linii ciasta, a liczba znaków po lewej i prawej stronie łańcucha dekoracji musi być równa.
W przypadku dekoracji pionowych oznacza to, że musi znajdować się w środkowej kolumnie ciasta, a liczba znaków powyżej i poniżej dekoracji musi być równa.

Nie wszystkie dekoracje muszą być użyte!
Jedynym wymaganiem jest to, że musi istnieć więcej niż jedna możliwość dla dowolnego wejścia n . Możliwości również nie muszą być równe.

Funkcje są dopuszczalne.

Księżycowy Królik
źródło
2
Cześć, witamy w PPCG! To wygląda na świetny pierwszy post. zwykle zalecamy korzystanie z piaskownicy do proponowanych wyzwań . Tam możesz uzyskać informacje zwrotne od innych i udoskonalić wyzwanie, zanim pomyślisz o tym tutaj. Biorąc to pod uwagę, Twoje wyzwanie wygląda na przemyślane. +1 ode mnie Jedno pytanie dotyczące twojego pierwszego przykładu, dlaczego to czyta, MAFa nie MF? Nie widzę Aw twoich opcjach dekoracji.
Kevin Cruijssen
1
Dzięki! Przepraszam, nie wiedziałem o piaskownicy. Czy w ogóle mogę zostawić ten jeden? O dekoracji - to był błąd. Dodałem MAF do dozwolonych dekoracji. Informacje zwrotne bardzo mile widziane!
Moon Rabbit
1
Nie ma żadnych zasad dotyczących spacji początkowych i końcowych. Zależy od Ciebie!
Moon Rabbit
3
Hej, muszę ręcznie wpisać to wszystko do mojej maszyny do ciastek księżycowych, aby uzyskać rzeczywiste ciastka księżycowe!
Moon Rabbit
4
... w którym to przypadku dobrze, że żaden z wymyślonych języków z zestawami znaków spoza ASCII nie podniósł głowy, ponieważ
pisanie ich jest trudne

Odpowiedzi:

9

Pyth, 71 65 59 58 bajtów

Zapisano 1 bajt dzięki @StevenH.

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

Wypróbuj online. Zestaw testowy.

Tyle paddingu.

PurkkaKoodari
źródło
2
To szalone, jak różna jest ta odpowiedź od tej poniżej w tym samym języku ...
Magic Octopus Urn
Można zapisać jeden bajt zastępując ?%Q2z @,(odwrotna kolejność dwóch opcji) ... Q. (Ab) użyłem tego bardzo często podczas gry w golfa z moją własną odpowiedzią na Pythona.
Steven H.
@StevenH. Dzięki, zawsze zapominam o modułowym indeksowaniu.
PurkkaKoodari,
7

JavaScript ES6, 206 196 192 188 187 180 176 169 165 156 bajtów

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

Awaria

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.

Moja pierwsza próba golfa kodowego. To może być bardziej golfa.

zapisano 4 bajty dzięki @ETHProductions

Edytuj Zezwoliłem na używanie w celu spełnienia:Date.now()%2 new Date%2

wielokrotne wykonywanie programu przy użyciu dokładnie tego samego wejścia nie zawsze musi dawać tę samą dekorację

pozwala mi to zaoszczędzić kolejne 7 bajtów +Math.random()>.5

zapisał kolejne 4 bajty dzięki @Arnauld

Lmis
źródło
Witamy w PPCG i świetna pierwsza odpowiedź! Wierzę, że ['MA','HA'][r]+'F'można grać w golfa 'MH'[r]+'AF'.
ETHproductions
1
Można zapisać dwa bajty, zastępując [' R ',' C '][r]z " ${'RC'[r]} "zastępując każdy "z grawis.
ETHprodukcje
1
I ['MA','HM'][r]+'F'tak naprawdę jest o dwa bajty dłuższy niż ['MAF','HMF'][r];)
ETHprodukcje
2
Można użyć ' @'[+!s]zamiast(s?' ':'@')
Arnauld
2
Możesz także użyć new Date%2zamiast Date.now()%2.
Arnauld
6

Pyth, 99 79 71 68 64 bajtów

Pyth jest bardzo zły w tworzeniu ciągów. A może jestem po prostu zły coraz lepiej je golfa.

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

Może tworzyć dekoracje MAFi HMFpoziomo, a także dekoracje MFi CFpionowo.

Wypróbuj online!

Steven H.
źródło
2
Ahh, dobrze widzieć rozwój postaci w tej historii.
Moon Rabbit
6

Vim, 118 bajtów

Pobiera dane wejściowe jako bufor (np. Plik z liczbą n jako zawartością).

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

Oto z niedrukowalnymi znakami kontrolnymi w formacie 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]..

Wypróbuj online! (Jak się okazuje, interpreter V działa również dobrze dla normalnego kodu Vima.)

Wyjaśnienie

"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>
Jordania
źródło
O, nieźle! Myślę, że to pierwsza niedeterministyczna odpowiedź vima, jaką widziałem! Kilka przemyśleń: 1) Kiedy umieścisz dane wejściowe w „argumentach”, a nie „danych wejściowych”, predefiniuje @ato arg1, @barg2 itd., Ale jest to cecha specyficzna dla V. To technicznie nie ma znaczenia, ponieważ masz "aDna początku, ale pomyślałem, że zwrócę na to uwagę. 2) Możesz zrobić jeden bajt, jeśli dd@apY@apdd
zrobiłbyś
@DJMcMayhem dd@ap nie działa niestety.
Jordan
dd@aPdziała, ale wymaga dodatkowej ji dodatkowej klinii.
Jordan
5

PHP, 342 292 249 185 178 176 bajtów

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;

Zadzwoń z php -r '<code>' <size>

historia

Rev 1: wersja początkowa; wszystkie rozmiary (w tym małe ciasta), wszystkie dekoracje, wszystkie możliwe kierunki

Wersja 2: usunięto małe ciasta (-36 bajtów), zrestrukturyzowano opcje dekoracji, usunięto jeden przedmiot dekoracji (-21) i jednobajtowy golf (-1).

Rev. 3: Do czterech dekoracji; (-17), tylko poziomy dla nieparzystych rozmiarów (-18) plus drobne gry w golfa (-8).

Rev. 4: Podziękowania dla Jörga za grę w golfa w części „ciasto z farbą”; zdjął niesamowitą (-31).
Kolejne -6 z moim dodatkowym golfem i -27 za użycie pojedynczego łańcucha zamiast szeregu łańcuchów.

Obj. 5: -7 bajtów głównie dzięki Christallkeksowi

awaria

Z każdą godziną robi się coraz szczuplejsza. :)

// 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;
Tytus
źródł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: Wielkie dzięki. Musiałem przyjąć podobne wyrażenie !$i|$‌​i==$n-1?"@":" "; trójka po prostu nie zaakceptuje twojej (na mojej maszynie), chociaż jest poprawna.
Tytus
spróbuj na przykład na sandbox.onlinephpfunctions.com
Jörg Hülsermann
1
Pozwala to zaoszczędzić sześć bajtów na farbie do ciasta: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";Wygląda na to, że „MAD” gra w deco ;-)
Christallkeks,
4

Java 7, 399 349 bajtów

Zaktualizowana wersja z pomocą @Dodge i @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',' '));}}

Wypróbuj tutaj!

Nowa wersja jest znacznie bardziej zoptymalizowana i pozbyła się Stringobsługi tablicy. Również zgodnie z sugestią są teraz tylko 4 dekoracje: 2 dla parzystych danych wejściowych ( MF, ZJ) i 2 dla nieparzystych danych wejściowych ( MAF, HMF), które są połączone w jeden String.

Nie golfowany:

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
źródło
Dzięki za przesłanie! Pozwól, że wyjaśnię, ponieważ kilku użytkownikom tęskniło - nie wszystkie ozdoby muszą być uwzględnione. Posunąłem się naprzód i pogrubiłem to w części „wyjaśnienia”. Mam nadzieję, że pozwoli ci to zaoszczędzić kilka bajtów! Wierzę, że nadal będziesz mógł użyć tej samej metody do wybierania dekoracji.
Moon Rabbit
4
Haha, jeśli chodzi o golfa Java, równie dobrze może zawierać wszystkie ozdoby;). +1, zawsze, dla każdego, kto ma jaja, by wykurzyć miotacz Jawy.
Magic Octopus Urn
Dlaczego się "MAF"powtarza?
Cyoce
@carusocomputing Bardzo prawda. Na wszelki wypadek pomyślałem, że o tym wspomnę. Miły!
Moon Rabbit
Dziękujemy za opinię :) To prawda, że ​​Java nie jest zbyt optymalna do gry w golfa, ale fajnie jest to robić: P. Może mógłbym char[]bardziej efektywnie wykorzystać pętle i zainicjować dekorację i dalej grać w golfa. @Cyoce zduplikowałem, MAFponieważ wtedy mam wszystkie dekoracje dla parzystego wejścia w indeksach 0,2,4,6,8i wszystkie dekoracje dla nieparzystego wejścia w indeksach 1,3,5,7,9. Ułatwia to obliczenie indeksu losowego dla danych wejściowych. Math.random()*5daje losową liczbę od 0-4. *2rozprzestrzenia to na 0,2,4,6,8. +n%2dodaje, 1aby uzyskać nieparzyste dane wejściowe 1,3,5,7,9.
QBrute
3

Partia, 386 bajtów

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

Wysyła tylko odpowiednio HMF, MAF, MF lub CF. Uwaga: niektóre linie kończą się spacją. Zmienne:

  • n Parametr wejściowy (odczytany ze STDIN)
  • fPrefiksy dekoracji ( Fimplikowany jest przyrostek )
  • oDziwność n(używana tylko raz, ale ifinstrukcje nie akceptują wyrażeń)
  • lRząd górnego pionowego znaku lub 0do poziomej dekoracji
  • uRząd o niższym pionowym znaku lub 0do poziomej dekoracji
  • h Rząd poziomej dekoracji (zostaje zastąpiony dekoracją pionową)
  • d Indeks dekoracji w prefiksie dekoracji (0/1 dla poziomej lub 1/3 dla pionowej)
  • cCiąg n-3spacji
  • s Łańcuch wyjściowy dla każdego wiersza
  • %1Numer wiersza, ale ustawiony również nna pierwszy wiersz, tak aby zarówno pierwszy, jak i ostatni wiersz używały @s zamiast spacji.
Neil
źródło
3

C, 233 bajtów

Powinien być w stanie zagrać trochę w golfa stąd ...

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

Wielkie wyzwanie, kodowanie było trudne i brzydkie.

Uruchom z tym głównym func;

main(c,v)char**v;
{
    f(atoi(v[1]));
}
cleblanc
źródło
2

Ruby 2.3.1, 449 265 245 233 230 znaków

Wydaje się, że powinna być odpowiedź rubinowa, więc oto odpowiedź rubinowa. To naprawdę nie jest takie mądre, mam nadzieję, że ktoś tutaj będzie mądrzejszy;)

Wersja golfowa:

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

Sztuczki golfowe:

  • zamień deklarację metody na stabilną interpolację ciągu znaków wynoszącą
  • $ globals nie potrzebuje # {globalny}, tylko # $ globalny
  • === dla zakresów jest krótszy niż .covers?

Wersja do odczytu

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

Testowanie

mooncake(3)
mooncake(4)
mooncake(5)
mooncake(6)
Obrabować
źródło
Reimplementowałem bez użycia tablicy, wygląda na to, że wszyscy to robią.
Rob
1

Nudziłem się ... oto dwie kolejne wersje:

PHP, 193 bajtów

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 odpowiedzi Lmis

PHP, 191 bajtów

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

drukowanie ciasta znak po znaku w jednej pętli

awaria

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
    ;
Tytus
źródło
0

Python 3, 318 301 297 285 272 bajtów

Zrzucono 17 bajtów za pomocą DJMcMayhem

Powalono 4 bajty dzięki mbomb007

Powalił kolejne 12 bajtów dzięki DJMcMayhem

Powalił kolejne 13 bajtów dzięki mbomb007

Mój pierwszy golf w historii, więc nie jest tak wspaniale. Użyłem: aliasingu matematyki.ceil jako y i str.format jako z, formatów zagnieżdżania, importu jednowierszowego, lambda i operacji bitowej plus kilka innych rzeczy, aby uzyskać to tak, jak jest.

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

Wersja bez golfa (oddzielne importy, brak aliasów i brak operacji bitowej):

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

Co ciekawe, użycie niebitowej wersji tego nadal zapewnia poprawne wyjście, jednak wyjście jest inne:

Nie bitowe:

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

Bitowe:

(@@@@@@@)
(@ LF  @)
(@     @)
(@@@@@@@)
L. Steer
źródło
możesz przenieść import z funkcji i zmienić go na from ... import*import typu, aby zaoszczędzić trochę bajtów
Blue
Ładna odpowiedź i witamy na stronie! Kilka wskazówek: 1. funkcje lambda są krótsze i 2. możesz zrobić, import math;y=math.ceilaby zdjąć dwa bajty. To daje ci 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 bajtów mniej.
DJMcMayhem
@DJMcMayhem Wielkie dzięki! Zaktualizowałem swoją odpowiedź.
L. Steer,
Cieszę się, że mogłem pomóc! Inną rzeczą, którą prawdopodobnie możesz zrobić, to pseudonim, formatponieważ często go nazywasz. Problem polega na tym, że nie wiem dokładnie, jak aliasować do funkcji członka (jak str.format), więc trzeba by trochę poeksperymentować. Nie jestem pewien, czy byłoby to krótsze.
DJMcMayhem
4
Dobra robota! Cieszę się, że wyciągnąłeś coś z tego ćwiczenia :) Chciałbym jednak wyjaśnić, że dekoracja musi być wyśrodkowana, aby pasowała do specyfikacji wyzwania. Niezależnie od tego, czy zdecydujesz się zmienić kod, aby to odzwierciedlić - czy mogę poprosić o zachowanie obecnego kodu również w swoim poście? Dobry wysiłek, który warto zachować, nawet jeśli lekceważy jedną z zasad.
Moon Rabbit
0

C # 448 bajtów

Gra w golfa:

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

Sprawdź to tutaj

Nie golfowany:

        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
źródło