Bana ay keki yap!


31

Sonbahar Ortası Festivali başladı!

Maalesef bütün ay keklerim çalındı ​​- benim gibi küçük insanlar için çok pahalı oluyorlar ve korkarım ki bu yıl hiçbir şey yiyemem!

Bu yüzden yardım için sana dönüyorum. Bana biraz yapabilir misin?

Farkında olmayanlar için, sizi bir ay keki neye benzediği konusunda eğitmeme izin verin.


Mooncakes birçok farklı boyutta geliyor!
Değilim ben Yani sana vereceğim girişi , n ı bir istediğinizde,.

İşte çıktının bazı örnekleri istediğim :

N = 3 boyutundaki Mooncake:

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

N = 6 boyutundaki Mooncake:

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

Yani, n büyüklüğünde bir aykırı :

  • n satırları yüksek
  • 2n - 1 1s uzunluğunda
  • 2n + 1 karakter uzunluğunda (s ve parantez)

Ve beni çok küçük pratik ay keklerini atmasan iyi edersin!
Varsayalım girişi her zaman n> = 3 olur .

Mooncakes ayrıca aşağıdaki süslemelerden birini içerir :

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

Hangisi, önemli değil - dikey ve yatay olarak ortalandığı sürece .
Dikey veya yatay olarak da yazılabilir!

Ben çeşitlilik istiyorum!
Beni gerçekten aynı aykekinden yapacaksanız, dekorasyon daha iyi olabilir!

Yani, programın aynı girişle çoklu olarak yürütülmesi her zaman aynı dekorasyonu vermemelidir .

Ay keklerini yemek için sabırsızlanıyorum, bu yüzden onları ne kadar erken alabilirim ( kodunuz ne kadar kısa olursa) o kadar iyi!

İyi şanslar!


Süslemeleri merak edenler için:
Sonbahar Ortası Festivali için alternatif isimlerin baş harfleri.
Bu yayının en üst kısmında yer alan Wikipedia sayfasında bir liste bulunabilir.


Açıklamalar:

Önde gelen ve sondaki boşlukla ilgili hiçbir kural yoktur .
İstediğiniz kadar ya da çok az var!

Süslemeler, ay kekinin tam merkezinde olmalı!
Yatay dekorasyonlarda bu, pastanızın orta çizgisinde olması gerektiği ve dekorasyon dizisinin solunda ve sağında bulunan karakter sayısı eşit olması gerektiği anlamına gelir.
Dikey süslemeler için bu, pastanızın orta sütununda yer alması gerektiği ve süslemenin üstündeki ve altındaki karakter sayısının eşit olması gerektiği anlamına gelir.

Tüm süslemeler kullanılmamalıdır!
Tek şart n verilen herhangi bir giriş için birden fazla olasılık olması gerektiğidir. Olasılıkların da eşit olması gerekmez.

İşlevler kabul edilebilir.


2
Merhaba, PPCG'ye hoş geldiniz! Bu harika bir ilk yazıya benziyor. genellikle önerilen zorluklar için Sandbox kullanmanızı öneririz . Orada başkalarından geri bildirim alabilir ve buraya göndermeden önce düşünmemiş olabileceğiniz şeylerle olan mücadeleyi mükemmelleştirebilirsiniz. Olduğu söyleniyor, meydan okuma iyi düşünülmüş görünüyor. Benden +1. İlk örneğinizle ilgili bir soru olsa da, neden okuyor MAFve vermiyor MF? ADekorasyon seçeneklerinde bir şey görmüyorum .
Kevin Cruijssen

1
Teşekkürler! Üzgünüm, kum havuzunun farkında değildim. Yine de sadece bunu bırakabilir miyim? Dekorasyon hakkında - bu bir hataydı. İzin verilen dekorasyonlara MAF ekledim. Geribildirim çok takdir!
Ay Tavşan

1
Öncü ve sondaki boşluklarla ilgili kural yoktur. Sana bağlı!
Ay Tavşanı

3
Hey, gerçek ay keklerini elde etmek için bütün bunları ay pastası makineme elle yazmam gerekiyor!
Ay Tavşanı,

4
... oldukları :) yazmak için bir ağrı olduğu için ASCII olmayan karakter setleri ile bu yapmacık dillerin hiçbiri, onların yüzünü göstermişti ki durum 's iyi de
GreenAsJade

Yanıtlar:


9

Pyth, 71 65 59 58 bayt

@StevenH sayesinde 1 bayt kaydedildi.

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

Çevrimiçi deneyin. Test odası.

Çok fazla dolgu maddesi.


2
Bu cevap aynı dilde altındaki birinden ... den ne kadar farklı olduğunu deli
Sihirli Ahtapot Urn

Sen değiştirerek bir bayt kaydedebilirsiniz ?%Q2ile @,... (iki seçenek sırasını tersine çevirmek) Q. Ben (ab) bunu kendi Pyth cevabımı aşağılarken golf oynarken çok kullandım.
Steven H.

@StevenH. Teşekkürler, modüler indekslemeyi hep unutuyorum.
PurkkaKoodari 20:16

7

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

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

Yıkmak

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.

İlk kod-golf denemem. Bu muhtemelen daha çok golf oynayabilir.

@ETHProductions sayesinde 4 byte kurtarıldı

Düzenleme Tatmin etmek için kullanma özgürlüğünü kullandım :Date.now()%2 new Date%2

Programın aynı girişle birden fazla çalışması her zaman aynı dekorasyonu vermemelidir

bu, 7 bayttan daha fazla tasarruf etmeme izin veriyor +Math.random()>.5

@Arnauld sayesinde 4 bayt daha kaydedildi


PPCG'ye hoş geldiniz ve ilk büyük cevap! Ben ['MA','HA'][r]+'F'golf oynayabileceğine inanıyorum 'MH'[r]+'AF'.
ETHProductions

1
Sen değiştirerek iki bayt kaydedebilirsiniz [' R ',' C '][r]ile " ${'RC'[r]} "her yerine "bir backtick ile.
ETHproductions

1
Ve ['MA','HM'][r]+'F'aslında iki bayt daha uzun ['MAF','HMF'][r];)
ETHproductions

2
Bunun ' @'[+!s]yerine kullanabilirsiniz(s?' ':'@')
Arnauld

2
Ayrıca new Date%2yerine kullanabilirsiniz Date.now()%2.
Arnauld,

6

Pyth, 99 79 71 68 64 bayt

Pyth dizeleri oluştururken çok kötü . Ya da belki ben sadece onları golf oynarken daha iyi olmakta kötüyüm .

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

Süslemeleri MAFve HMFyatay olarak, süslemeler MFve CFdikey olarak oluşturabilir.

Çevrimiçi deneyin!


2
Ahh, bu hikayede karakter gelişimi görmek güzel.
Ay Tavşanı,

6

Vim, 118 bayt

Girdiyi arabellek olarak alır (örneğin , içeriğini n sayısı olan bir dosya ).

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

İşte xxd formatında yazdırılamayan kontrol karakterleriyle:

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

Çevrimiçi deneyin! (Görünüşe göre, V yorumlayıcısı da normal Vim kodu için gayet iyi çalışıyor.)

açıklama

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

Vay güzel! Sanırım bu gördüğüm ilk deterministik olmayan vim cevabı! Birkaç düşünce: 1) Girdiyi "girdi" yerine "değişkenlere" koyduğunuzda, @aarg1, @barg2'ye vb. Bu "aD, başlangıçta sahip olduğunuzdan beri teknik olarak önemli değil , ama sadece işaret edeceğimi düşündüm. 2) Eğer yaptıysam kapalı bir bayt alabilir dd@apyerineY@apdd
DJMcMayhem

@DJMcMayhem dd@ap pek işe yaramadı .
Jordan,

dd@aPçalışır, ancak daha sonra satır aşağı bir ek jve bir ek gerektirir k.
Jordan,

5

PHP, 342 292 249 185 178 176 bayt

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;

İle ara php -r '<code>' <size>

Tarihçe

Rev 1: ilk versiyon; her boyutta (küçük kekler dahil), tüm süslemeler, olası tüm yönler

Rev. 2: minik kekler (-36 bytes) kaldırıldı, yeniden yapılandırılmış dekorasyon seçenekleri, bir dekorasyon öğesi (-21) ve bir tek bayt golf (-1) çıkarıldı.

Rev. 3: Dört dekorasyona kadar; (-17), sadece tuhaf ölçüler için yatay (-18) artı küçük golf (-8)

Rev. 4: Jörg'e "boya pastası" kısmını aşağı attığı için teşekkürler; o inanılmaz bir çıkardı (-31).
Başka golf oynamaya devam eden -6 ve bir dizi dizi yerine tek bir string kullanmak için -27.

Rev. 5: -7 byte çoğunlukla Christallkeks sayesinde

Yıkmak

Bu saat başı zayıflıyor. :)

// 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 15:16

@ JörgHülsermann: Çok teşekkürler. Benzer bir ifadeyi almak zorunda kaldım !$i|$‌​i==$n-1?"@":" "; Üçlü haklı olsa da, (benim makinemde) sizinkileri kabul etmeyecektir.
Titus,


1
Bu size kek boyasında altı bayt kazandırır: for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n"; Ayrıca, dekorlarınızı "MAD" takmış gibi görünüyorsunuz ;-)
Christallkeks

4

Java 7, 399 349 bayt

@Dodge ve @Kevin Cruijssen'in yardımı ile güncellenmiş versiyon:

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',' '));}}

Burada dene!

Yeni sürüm çok daha optimize edilmiş ve Stringdizi kullanımından kurtuldu . Ayrıca önerildiği gibi, şimdi yalnızca 4 dekorasyon var: çift ​​girişler için 2 ( MF, ZJ) ve tek girişler için 2 MAF,HMF tek bir birleştirilir)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
    }
}

Gönderdiğiniz için teşekkürler! Birkaç kullanıcının kaçırdığı için açıklığa kavuşturmama izin verin - tüm süslemeler dahil edilmemelidir. Devam ettim ve bunu “açıklamalar” bölümünde kalın. Umarım bu size birkaç byte kazandıracak! Dekorasyonu seçmek için aynı yöntemi kullanabileceğini düşünüyorum.
Ay Tavşan

4
Haha, Java golf oynamaya gidince, bütün süslemeleri de içerebilir;). +1, daima, topları olan herkesin Java saldırganını kırbaçlaması için.
Magic Octopus Urn

Neden "MAF"tekrar edilir?
Cyoce

@ carusocomputing Çok doğru. Tam da olsa, söyleyeceğimi düşündüm. Güzel!
Ay Tavşanı,

Geri bildiriminiz için teşekkür ederiz :) Doğru, Java, golf oynamak için çok uygun değil, ancak bunu yapmak oldukça eğlenceli: P. Belki döngüleri ve dekorasyonun ilk açılışını char[]daha verimli kullanabilir ve diğer şeyleri daha fazla golf oynayabilirim . @Cyoce Kopyaladım MAFçünkü indekslerde eşit bir giriş için 0,2,4,6,8tüm süslemeleri ve indekslerde tek bir giriş için tüm süslemeleri kullandım 1,3,5,7,9. Bu, belirli bir giriş için rastgele endeksi hesaplamayı kolaylaştırır. Math.random()*5dan rastgele bir sayı verir 0-4. *2onu yayılır 0,2,4,6,8. almak için tek girişleri +n%2ekler . 11,3,5,7,9
QBrute 16:16

3

Toplu iş, 386 bayt

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

Yalnızca uygun şekilde HMF, MAF, MF veya CF çıktılar. Not: Bazı satırlar beyaz boşlukta bitiyor. Değişkenler:

  • n Giriş parametresi (STDIN'den okunur)
  • fDekorasyon önekleri (sonek Fbelirtildi)
  • oTuhaflığı n(yalnızca bir kez kullanılır, ancak ififadeler ifadeleri kabul etmez)
  • lÜst dikey karakterin veya 0yatay bir dekorasyon için satır
  • uAlt dikey karakterin veya 0yatay bir dekorasyon için satır
  • h Yatay dekorasyon satır (dikey dekorasyon tarafından üzerine yazılır)
  • d Dekorasyon öneki dekorasyon indeksi (yatay için 0/1 veya dikey için 1/3)
  • cString n-3boşluk
  • s Her satır için çıktı dizesi
  • %1Satır numarası, ancak nilk satır için de ayarlanmış , böylece hem ilk hem de son satır @boşluk yerine s kullanır.

3

C, 233 Bayt

Buradan biraz golf oynayabilmeli ...

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

Büyük zorluk, kodlanması zor ve çirkindi.

Bu ana func ile çalıştırın;

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

2

Ruby 2.3.1, 449 265 245 233 230 karakter

Yakut bir cevabı olmalı gibi görünüyor, bu yüzden burada bir yakut cevabı. Gerçekten o kadar akıllıca değil, umarım buradaki bir başkası daha akıllı olacaktır;)

Golf versiyonu:

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

Golf püf noktaları:

  • bir yöntem dizgisi enterpolasyonu ile yöntem bildirimini değiştirin
  • $ globals # {global} 'a ihtiyaç duymaz, sadece # $ global
  • === aralıklar için .covers'tan daha kısa mı?

Okunabilir sürüm

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

Test yapmak

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

Diziyi kullanarak w / o yeniden uygulandı, herkes bunu yapıyor gibi görünüyor.
Rob,

1

Sıkıldım ... işte iki versiyon daha:

PHP, 193 bayt

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

bir liman Lmis'in cevabının

PHP, 191 bayt

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

pasta karakterini tek bir döngüde karakter karakter yazdırma

Yıkmak

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 bayt

DJMcMayhem'in yardımıyla 17 byte çaldı

Mbomb007 sayesinde 4 byte indirildi

DJMcMayhem sayesinde 12 byte daha indirildi

Mbomb007 sayesinde 13 byte daha indirildi

Benim ilk golf'üm, bu yüzden o kadar büyük değil. Kullandım: aliasing math.ceil, y ve str.format, z, iç içe biçimler, tek satır içe aktarma, lambda ve bitsel işlem artı bunun gibi başka şeyler.

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 sürümü (ayrılmış ithalat, takma ad yok ve bitsel işlem yok):

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

İlginçtir ki, bunun bitsel olmayan sürümünü kullanmak hala doğru çıktılar üretir, ancak çıktı farklıdır:

Sigara Bit:

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

bitsel:

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

içe aktarmaları işlevden çıkarabilir ve from ... import*bazı baytları kaydetmek üzere içe
Blue

Güzel cevap ve siteye hoş geldiniz! Birkaç ipucu: 1. lambda fonksiyonları daha kısa ve 2. import math;y=math.ceiliki byte çıkarmak için yapabileceğiniz bir şey var . Bu size 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 byte daha kısa olanı verir .
DJMcMayhem

@DJMcMayhem Çok teşekkürler! Cevabımı güncelledim.
L. Steer,

Yardımcı olduğuma sevindim! Muhtemelen yapabileceğiniz bir diğer şey, formatçok fazla şey söylediğinizden beri takma addır. Sorun şu ki, bir üye işlevine (nasıl str.format) takma adını tam olarak bilmiyorum, bu yüzden biraz denemeniz gerekir. Olumlu değil ama daha kısa olurdu.
DJMcMayhem

4
İyi iş! Bu alıştırmadan bir şeyler çıkarmanıza sevindim :) Ancak, dekorasyonun zorlu şartnamelere uyacak şekilde ortalanması gerektiğini açıklığa kavuşturmak isterim. Bunu yansıtmak için kodunuzu değiştirmeye karar verip vermeyeceğinize karar verin - şu anki kodu da gönderiminizde saklamanızı isteyebilir miyim? Kurallardan birini ihmal etse bile, tutmaya değer iyi bir çaba.
Ay Tavşanı,

0

C # 448 bayt

golfed:

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

Burada test et

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.