나를 월병으로 만들어 줘!


31

중순 가을 축제가 시작되었다!

불행히도, 내 모든 월병은 도난당했습니다. 저와 같은 작은 사람들에게는 너무 비싸기 때문에 올해 먹을 수 없을 것 같습니다.

그래서 도움을 청합니다. 날 좀 만들어 줄래?

모르는 사람들을 위해 문 케익이 어떻게 생겼는지 알려 드리겠습니다.


Mooncakes는 다양한 크기로 제공됩니다!
그래서 나는 당신에게 내 줄거야 입력 , N 내가 일을 할 때.

다음은 내가 원하는 출력의 예입니다 .

크기 n = 3 :의 월병

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

크기 n = 6 인 월병

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

즉, 크기 n 의 월병 은 다음과 같습니다.

  • n 줄 높이
  • 2n-1 @s 길이
  • 2n + 1 자 (@ 및 괄호)

그리고 당신은 나에게 너무 작은 연습 월병을 버리지 않는 것이 좋습니다!
입력이 항상 n> = 3이라고 가정하십시오 .

Mooncakes 에는 다음 장식 중 하나가 포함되어 있습니다 .

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

수직 및 수평 중심에있는 한 중요하지 않습니다 .
세로 또는 가로로도 쓸 수 있습니다!

나는 다양성을 원한다!
만약 당신이 나에게 같은 월병 두 개를 만들려고한다면, 장식은 다른 것이 더 좋습니다!

즉, 정확히 동일한 입력으로 프로그램을 여러 번 실행하면 항상 같은 장식이되지 않아야합니다 .

나는 당신의 월병을 먹기를 기다릴 수 없으므로 빨리받을 수 있습니다 ( 코드가 짧을수록 ) 더 좋습니다!

행운을 빕니다!


장식에 대해 궁금해하는 사람들을 위해 :
그들은 중추절의 모든 대체 이름의 이니셜입니다.
이 게시물의 상단에 링크 된 Wikipedia 페이지에서 목록을 찾을 수 있습니다.


설명 :

선행 및 후행 공백에 관한 규칙은 없습니다 .
당신이 원하는만큼 또는 적게 가지고!

장식은 월병의 중심에 있어야합니다!
수평 장식에서는 케이크 중간 선에 있어야하며 장식 문자열의 왼쪽과 오른쪽에있는 문자 수가 같아야합니다.
수직 장식에서는 케이크의 중간 열에 있어야하며 장식 위아래의 문자 수가 같아야합니다.

모든 장식을 사용해야하는 것은 아닙니다!
주어진 요구 사항 n에 대해 둘 이상의 가능성이 있어야한다는 것이 유일한 요구 사항입니다. 가능성도 고르지 않아도됩니다.

기능이 허용됩니다.


2
안녕하세요, PPCG에 오신 것을 환영합니다! 이것은 훌륭한 첫 번째 게시물처럼 보입니다. 일반적으로 제안 된 문제에 대해서는 샌드 박스 를 사용하는 것이 좋습니다 . 여기에서 다른 사람들로부터 피드백을 받고, 여기에 게시하기 전에 생각하지 않은 것들로 도전을 완수 할 수 있습니다. 말하자면, 당신의 도전은 잘 생각해 보입니다. 나에게서 +1 하지만 첫 번째 예에 대한 질문 하나, 왜 읽을 않습니다 MAF하지 MF? 나는 A당신의 장식 옵션에 보이지 않습니다 .
Kevin Cruijssen

1
감사! 죄송합니다. 샌드 박스를 인식하지 못했습니다. 어쨌든 이것 하나만 남겨 둘 수 있습니까? 장식에 대해-그것은 실수였습니다. 허용 된 장식에 MAF를 추가했습니다. 매우 감사합니다!
Moon Rabbit

1
선행 및 후행 공백에 관한 규칙은 없습니다. 당신에게 달려 있습니다!
Moon Rabbit

3
이봐, 나는 실제 월병을 얻기 위해이 모든 것을 내 월병 기계에 수동으로 입력해야한다!
Moon Rabbit

4
... 그들이이 :) 입력 할 고통 때문에 비 ASCII 문자 세트와 그 인위적인 언어의 것도, 자신의 머리를 양육하지 않은 경우 그것의 좋은에서
GreenAsJade

답변:


9

Pyth, 71 65 59 58 바이트

@StevenH 덕분에 1 바이트가 절약되었습니다.

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

온라인으로 사용해보십시오. 테스트 스위트.

너무 많은 패딩.


2
이 답변이 아래의 답변과 다른 언어로 얼마나 다른지 알 수 있습니다 ...
Magic Octopus Urn

당신은 대체하여 하나의 바이트를 저장할 수 있습니다 ?%Q2@,(두 가지 선택의 순서를 반대로) Q. 나는 (나) Pyth가 골프를 치는 데 많은 도움을 주었다.
Steven H.

@StevenH. 고마워, 나는 항상 모듈 식 인덱싱에 대해 잊어 버린다.
PurkkaKoodari

7

자바 스크립트 ES6, 206 196 192 188 187 180 176 169 165 156 바이트

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

고장

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.

코드 골프에 대한 나의 첫 번째 시도. 이것은 아마도 더 골프를 칠 수 있습니다.

@ETHProductions 덕분에 4 바이트 절약

편집 나는 만족시키기 위해 사용의 자유를 가져 갔다 .Date.now()%2 new Date%2

정확히 동일한 입력으로 프로그램을 여러 번 실행하면 항상 동일한 장식을 생성해서는 안됩니다.

이것은 7 바이트를 더 절약 할 수있게 해줍니다. +Math.random()>.5

@Arnauld 덕분에 다른 4 바이트를 절약했습니다.


PPCG에 오신 것을 환영합니다. 나는 ['MA','HA'][r]+'F'골프를 칠 수 있다고 생각 합니다 'MH'[r]+'AF'.
ETHproductions

1
당신은 대체하여 2 바이트를 저장할 수 [' R ',' C '][r]" ${'RC'[r]} "각을 교체 "역 따옴표와 함께.
ETHproductions

1
그리고 ['MA','HM'][r]+'F'두 이상 바이트 실제로 ['MAF','HMF'][r])
ETHproductions

2
' @'[+!s]대신 사용할 수 있습니다(s?' ':'@')
Arnauld

2
또한 new Date%2대신에 사용할 수 있습니다 Date.now()%2.
Arnauld

6

Pyth, 99 79 71 68 64 바이트

Pyth는 현을 만드는 데 매우 나쁘다 . 아니면 골프를 잘하는 것이 나빠질 수도 있습니다.

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

장식 MAFHMF가로, 장식 MFCF세로를 만들 수 있습니다 .

온라인으로 사용해보십시오!


2
아,이 이야기에서 어떤 캐릭터 개발을 보게되어 반갑습니다.
Moon Rabbit

6

Vim, 118 바이트

입력을 버퍼로 사용합니다 (예 : 내용 이 숫자 n 인 파일 ).

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

다음은 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]..

온라인으로 사용해보십시오! (V 인터프리터는 일반 Vim 코드에서도 잘 작동합니다.)

설명

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

좋은 와우! 이것이 내가 본 첫 번째 비 결정적 vim 답변이라고 생각합니다! 몇 가지 생각 : 1) 입력을 "입력"이 아닌 "인수"에 넣을 때 @aarg1, @barg2 등으로 미리 정의 되지만 V 관련 기능입니다. 이것은 "aD처음부터 기술적으로 중요하지 않지만 , 나는 그것을 지적 할 것이라고 생각했습니다. 2) dd@ap대신에 1 바이트를 제거 할 수 있습니다.Y@apdd
DJMcMayhem


dd@aP작동하지만 추가 j및 추가 k다운 라인이 필요합니다.
Jordan

5

PHP, 342 292 249 185 178 176 바이트

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;

와 전화 php -r '<code>' <size>

역사

개정 1 : 초기 버전; 모든 크기 (작은 케이크 포함), 모든 장식, 가능한 모든 방향

개정 2 : 작은 케이크 제거 (-36 바이트), 재구성 된 장식 옵션, 하나의 장식 항목 (-21) 및 단일 바이트 골프 (-1) 제거.

Rev. 3 : 장식물을 4 개까지 줄였습니다. 홀수 크기 (-18)와 마이너 골프 (-8)의 경우 가로 만

개정판 4 : "페인트 케이크"부분을 골라 낸 Jörg에게 감사합니다. 그는 놀랐습니다 (-31).
추가 골프를 치는 또 다른 -6, 문자열 배열 대신 단일 문자열을 사용하는 경우 -27

개정 5 : Christallkeks 덕분에 -7 바이트

고장

시간이 갈수록 점점 작아지고 있습니다. :)

// 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 : 감사합니다. 나는 비슷한 표현을해야했다 !$i|$‌​i==$n-1?"@":" ". 삼항은 정확하지만 (내 컴퓨터에서) 당신을 받아들이지 않을 것입니다.
Titus

에, 예를 들어 그것을 시도 sandbox.onlinephpfunctions.com
요 르그 Hülsermann에게

1
이렇게하면 케이크 페인트에 6 바이트가 절약됩니다. for(;$i<$n=$argv[1];)$o.=str_pad("(@",2*$n-1," @"[$i++%($n-1)==0])."@)\n";또한 데코를 "골프 (MAD)"한 것으로 보입니다. ;-)
Christallkeks

4

자바 7, 399 349 바이트

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

여기 사용해보십시오!

새 버전은 훨씬 더 최적화되었으며 String배열 처리를 제거했습니다 . 또한 제안 된 바와 같이, 현재 4 개의 장식 만 있습니다 : 2 개의 짝수 입력 ( MF, ZJ) 및 2 개의 홀수 입력 ( MAF, HMF)은 단일으로 결합됩니다 String.

언 골프 드 :

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

제출해 주셔서 감사합니다! 일부 사용자가 놓쳤으므로 모든 장식을 포함해야하는 것은 아닙니다. 나는 '설명'섹션에서 이것을 굵게 표시했습니다. 바라건대 몇 바이트를 절약 할 수 있습니다! 나는 당신이 여전히 같은 방법을 사용하여 장식을 선택할 수 있다고 생각합니다.
Moon Rabbit

4
하하, 자바 골프가가는 한, 그는 모든 장식물을 포함 할 수도있다;). 공을 가진 사람이 Java 퍼터를 꺼내려면 항상 +1하십시오.
Magic Octopus Urn

"MAF"반복 되는가?
Cyoce

@carusocomputing 매우 사실입니다. 그래도, 내가 언급하겠다고 생각했습니다. 좋은!
Moon Rabbit

귀하의 의견에 감사드립니다 :) 사실, Java는 골프에 매우 적합하지는 않지만 매우 재미 있습니다. : P. 어쩌면 나는 장식의 루프와 초기화를 char[]보다 효율적으로 사용하고 다른 것들을 더 골프화 할 수 있습니다 . @Cyoce 나는 MAF인덱스 0,2,4,6,8에 짝수 입력을위한 모든 장식과 인덱스 에 홀수 입력을위한 모든 장식을 가지고 있기 때문에 복제 했다 1,3,5,7,9. 따라서 주어진 입력에 대한 랜덤 인덱스를 더 쉽게 계산할 수 있습니다. Math.random()*5에서 임의의 숫자를 제공합니다 0-4. *2에 퍼집니다 0,2,4,6,8. 홀수 입력을 얻기 위해 +n%2추가합니다 . 11,3,5,7,9
QBrute

3

배치, 386 바이트

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

HMF, MAF, MF 또는 CF 만 적절하게 출력합니다. 참고 : 특정 줄은 공백으로 끝납니다. 변수:

  • n 입력 매개 변수 (STDIN에서 읽음)
  • f장식 접두사 (접미사 F가 암시 됨)
  • oOddness of n(한 번만 사용되지만 if명령문은 표현식을 허용하지 않습니다)
  • l상단 세로 문자 또는 0가로 장식용 행
  • u더 낮은 세로 문자 또는 0가로 장식의 행
  • h 가로 장식의 행 (수직 장식으로 덮어 쓰기)
  • d 장식 접두사의 장식 색인 (수평은 0/1, 수직은 1/3)
  • cn-3공백 문자열
  • s 각 행의 출력 문자열
  • %1행 번호이지만 n첫 번째 행에도 설정되어 첫 번째 행과 마지막 행 @이 공백 대신 s를 사용 합니다.

3

C, 233 바이트

여기에서 조금 아래로 골프를 칠 수 있어야합니다 ...

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

큰 도전은 어렵고 코드 작성이 어렵다는 것입니다.

이 주요 기능으로 실행하십시오.

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

2

루비 2.3.1, 449 265 245 233 230 자

루비 답변이 있어야하는 것처럼 보이므로 여기에 루비 답변이 있습니다. 정말 영리하지 않습니다. 바라건대 다른 누군가가 더 영리 할 것입니다.)

골프 버전 :

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

골프 트릭 :

  • 메서드 선언을 stabby 문자열 보간으로 바꿉니다.
  • $ globals는 # {global}이 필요하지 않으며 # $ global 만 필요합니다.
  • === 범위가 .covers보다 짧습니까?

읽을 수있는 버전

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

테스팅

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

나는 배열을 사용하지 않고 다시 구현했는데 모두가 그렇게하는 것처럼 보입니다.
Rob

1

지루했습니다 ... 여기에 두 가지 버전이 더 있습니다.

PHP, 193 바이트

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

Lmis의 답변 의 항구

PHP, 191 바이트

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

단일 루프에서 케이크 문자를 문자별로 인쇄

고장

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

파이썬 3, 318 301 297 285 272 바이트

DJMcMayhem의 도움으로 17 바이트 노크

mbomb007로 인해 4 바이트가 중단되었습니다.

DJMcMayhem 덕분에 또 다른 12 바이트 중단

mbomb007 덕분에 13 바이트를 더 떨어 뜨 렸습니다.

내 첫 골프, 그래서 그렇게 위대한되지 않습니다. 나는 math.ceil을 y로, str.format을 z로 앨리어싱하고, 중첩 형식, 단일 행 가져 오기, 람다 및 비트 연산과 같은 다른 것들을 사용했습니다.

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 버전 (별도의 가져 오기, 별명 및 비트 단위 작업 없음) :

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

흥미롭게도 비트가 아닌 버전을 사용하면 여전히 올바른 출력이 생성되지만 출력이 다릅니다.

비 비트 방식 :

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

비트 단위 :

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

가져 오기를 함수 밖으로 옮기고 가져 오기를 from ... import*입력하여 일부 바이트를 절약 할 수 있습니다.
Blue

좋은 답변, 사이트에 오신 것을 환영합니다! 몇 가지 팁 : 1. 람다 함수가 더 짧고, 2. import math;y=math.ceil2 바이트를 제거 할 수 있습니다. 이것은 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 바이트 더 짧은 것을 줄 것 입니다.
DJMcMayhem

@DJMcMayhem 감사합니다! 답변을 업데이트했습니다.
L. Steer

기꺼이 도와 드리겠습니다! 아마 당신이 할 수있는 또 다른 일은 format그것을 많이 부르기 때문에 별칭 입니다. 문제는 멤버 함수에 별칭을 지정하는 방법을 정확히 모른다 str.format는 것입니다. 그래서 약간의 실험을해야합니다. 나는 그것이 더 짧을 것이라고 긍정적이지 않다.
DJMcMayhem

4
잘 하셨어요! 나는 당신이이 운동에서 무언가를 얻게되어 기쁘다 :) 그러나 나는 장식이 도전 사양에 맞도록 중심에 있어야한다는 것을 분명히하고 싶다. 이것을 반영하여 코드를 변경하기로 결정했는지 여부-게시물에 현재 코드를 유지하도록 요청할 수 있습니까? 규칙 중 하나를 무시하더라도 좋은 가치가 있습니다.
Moon Rabbit

0

C # 448 바이트

골프 :

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

여기에서 테스트

언 골프 드 :

        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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.