예쁜 상자를 출력


17

다음 상자를 정확하게 출력해야합니다.

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................

상자의 높이와 너비는 50이고 공백은 두 개입니다.

문자열을 출력하거나 리턴하며 입력을받지 않는 함수 또는 프로그램을 작성해야합니다.

가장 적은 바이트가 이깁니다!


4
가장 안쪽 +상자의 상단과 하단에 1 개의 레이어 만있는 이유는 무엇입니까? 알고리즘 기반의 대답은 다소 길어질 것입니다. 가장 안쪽의 두 레이어가 정확히 정사각형이 아니기 때문입니다.
ETHproductions

@Pavel OK. Close-vote retracted :)
Digital Trauma

4
완전한 프로그램에 대한 제한이 필요한 이유는 무엇입니까?
Rɪᴋᴇʀ

1
@Pavel 왜? 도전에 전혀 아무것도 추가하지 않습니다.
Rɪᴋᴇʀ

1
@Pavel ..... 아니오. 그래, 일부는 그것을 가지고 있지만 KG 도전에 대한 요구 사항 / 표준은 아닙니다.
Rɪᴋᴇʀ

답변:


10

파이크, 20 17 바이트

k25V". + "ohe@A.X

여기 사용해보십시오!

k                 - out = ""
 25V              - repeat 25 times:
          oh      -     (o++)+1
            e     -    ^//2
    ". + "   @    -   " + ."[^] (wraps around)
              A.X -  out = surround(out, ^)

서라운드 기능은 다음 과 같이 질문을 위해 만들어졌습니다 !


14

J , 25 바이트

echo'. + '{~4|>./~2#|i:12

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

설명

echo'. + '{~4|>./~2#|i:12
                     i:12  Range from -12 to 12.
                    |      Take absolute values,
                  2#       duplicate every element,
                /~         compute "multiplication table"
              >.           using maximum,
            4|             take mod 4 of every element,
    '. + '{~               index into this string,
echo                       print char matrix for everyone to see.

반향을 피할 수 있다고 생각합니다.
코너 오브라이언

@ ConorO'Brien 아, 출력 규칙이 변경되었습니다. ... 음, 그러나 제거 echo하면 함수조차도 아니며 값 일뿐입니다. J에는 어쨌든 제로 인수 함수가 없습니다.
Zgarb

나는 그것이 J의 repl 본성에 따라 허용된다고 생각합니다. 어쨌든 상수 함수는 인수가 0 인 것으로 간주 될 수 있습니다.
코너 오브라이언

11

C, 115 바이트

#define M(x,y)x<(y)?x:y
f(i){for(i=2549;i;i--)putchar(i%51?". + "[(M(i%51-1,M(50-i%51,M(i/51,49-i/51))))/2%4]:10);}

문자열을 STDOUT에 인쇄 하는 함수 f(로 호출 f();)를 정의합니다 .


9

C, 535 478 477 바이트

이제는 많은 골프입니다 :-/

i;main(j){for(;++i<51;puts(""))for(j=0;++j<51;)putchar(i<3|i>48?46:j<3|j>48?46:i>4&i<47&j>4&j<47?i<7|(i>44&i<47)|(j>2&j<7)|(j>44&j<47)?43:j>8&j<43&((i>8&i<11)|(i>40&i<43))?46:i>9&i<41&((j>8&j<11)|(j>40&j<43))?46:i>13&i<37&((j>12&j<15)|(j>36&j<39))?43:((i>12&i<15)|(i>36&i<39))&j>12&j<39?43:i>17&i<33&((j>16&j<19)|(j>32&j<35))?46:((i>16&i<19)|(i>32&i<35))&j>16&j<35?46:i>21&i<29&((j>20&j<23)|(j>28&j<31))?43:((i>20&i<23)|(i>28&i<31))&j>20&j<31?43:i>24&i<27&j>24&j<27?46:32:32);}

출력은 다음과 같습니다.

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................

2
젠장 당신의 헌신에 감탄합니다.
Rɪᴋᴇʀ

제한을 변경했으며 문자열을 반환하는 함수가 이제 허용됩니다.
Pavel

방금 루프를 다시 작성하여 몇 바이트를 골프로 for(;i++<51;칠 수 있다는 것을 깨달았습니다. 이제는 어느 곳에서나 떨어져 있습니다 :-/
cleblanc

@cleblanc++i
dkudriavtsev 님의

MFW 나는 이것을 이해하려고 노력했다 : i.imgur.com/TLV9gJ4.png +1
Magic Octopus Urn

6

하스켈, 72 바이트

q=(\n->[n,n]).abs=<<[-12..12]
unlines[[". + "!!mod(max x y)4|y<-q]|x<-q]

Haskell 의 @Zgarb 솔루션 . 코어 주위에 레이어를 추가하여 상자를 만들려고했지만 ["..",".."]9 바이트 (81 바이트) 더 길었습니다.

e!b=e:e:b++[e,e];s#c=(c!)<$>(c<$s!!0)!s
unlines$foldl(#)["..",".."]" + . + . + ."

5

스택 된 비경쟁, 35 바이트

여기 사용해보십시오!

ε'.'3$' + .'2*tostr*+$surroundfold

언 골프 드 :

'' '.  ++  ..  ++  ..  ++  ..' $surround fold

아주 간단합니다. surround엔티티를 채우기 엔티티로 둘러싼 함수입니다. 예를 들어 (0) 1 surround입니다 ((1 1 1) (1 0 1) (1 1 1)). $surround되고 surround함수로서 계산되지. fold초기 값을 취한 다음 접을 다음 함수입니다. 이 경우 surround되어 fold초기에 빈 문자열을 둘러싸 에드 ''(당량. ε문자열의 각 문자를).

'.'3$' + .'2*tostr*+

이것은 먼저 문자열을 만들고 $' + .', 숫자를 곱하면 각 문자를 반복합니다. 이것은 우리를 나뭇잎 ++ ... 그런 다음 문자열로 캐스트됩니다. 그런 다음이 문자열을 세 번 반복하고 마지막에을 추가 .하여 원하는 문자열을 제공합니다.


39 바이트에 대한 다른 접근 방식 :

' .'3$' + .'2*tostr*+toarr$surround#\out

#\삽입이며 문자열의 초기 문자를 시작 값으로 사용합니다. 또한 배열에서만 작동합니다.


이 비경쟁은 어떻습니까? 몇 시간 전만해도 도전이 시작되었습니다.
Pavel

@Pavel 저는 항상이 일을하고 있습니다
Conor O'Brien

4

자바 스크립트 (ES6), 117 바이트

f=(n=12,c=`. + `[n%4],t=c.repeat(n*4+2))=>n?t+`
${t}
${f(n-1).replace(/^|$/gm,c+c)}
${t}
`+t:`..
..`
console.log(f())

비 재귀 솔루션에는 128 바이트가 필요했습니다.

console.log([...Array(100)].map((_,i,a)=>a.map((_,j)=>`. + `[j=j>50?j-50:51-j,(i>j?i:j)%8>>1],i=i>50?i-50:51-i).join``).join`\n`)

어디 \n리터럴 개행 문자를 나타냅니다.


4

C, 97 바이트

i,x,y;main(){for(;i<2550;putchar(++i%51?". + "[(x*x<y*y?y:x)&3]:10))x=i%51/2-12,y=i/102-12;}

3

젤리 , 18 바이트

12ŒRAx2»þ`ị“ + .”Y

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

Zgarb의 J 답변과 동일한 접근 방식 12ŒRA은 is abs([-12 … 12]), x2모든 요소를 ​​두 번 반복하고 »þ`최대 값 테이블을 작성하고 ị“ + .”주기적으로 문자열로 색인화하며 줄 Y바꿈으로 조인합니다.


3

05AB1E , 39 35 33 바이트

•â3fM~•3B…012… .+‡.pvyD¤sg25s-׫«})«»

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

•â3fM~•3B                               # Push 1100220011002200110022001
         …012… .+‡                      # Push ..  ++  ..  ++  ..  ++  .
                  .p                    # All prefixes of the above string.
                    vy            }     # For each prefix.
                      D¤sg25s-×         # Repeat the last letter until length is 25.
                               «Â«      # Concat, bifurcate, concat.
                                   )«» # Wrap to array, bifurcate, concat, print.

Emigna가 저를 2 바이트 저장한다고 설명했기 때문에 이제 더 멋진 33 바이트 버전 :

". + "DøJ3×'.«.pvy¤25yg-׫«})«»

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


1
". + "DøJ3×'.«.pvy¤25yg-׫«})«»33 바이트
Emigna

… .+•â3fM~•3BSè.pvy¤25yg-׫«})«»"쿨러 버전"에서 34 바이트
Emigna

Cool은 단어 haha의 올바른 선택이 아닙니다. 아마도 "게토가 적다"고 생각하십니까?
Magic Octopus Urn

prefix 명령을 사용하는 것을 좋아합니다. 훌륭한!
Emigna

1
@Emigna 접두사가 접두사를 만들어 삼각형을 바꾸고 회전하면 원래 접두사와 결합하여 바이트를 줄일 수 있습니다. 그것이 내가 얻을 수 없었던 주요 계획이었습니다.
Magic Octopus Urn

2

MATL , 21 바이트

'. + '[]25:"TTYaQ]2/)

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

'. + '    % Push this string
[]        % Push empty array. This will be used as "seed"
25:"      % Do the following 25 times
  TTYa    %   Extend the array with a frame of zeros
  Q       %   Add 1 to each entry
]         % End
2/        % Divide by 2
)         % Index modularly into the string. Non-integer indices are rounded
          % Implicitly display

2

루비, 77 바이트

-623.upto(676){|i|print i%26>0?". + "[[(i%26-13).abs,(i/52).abs].max%4]*2:$/}

인덱스 표현식을 [i%26-13,i/52].map(&:abs).max%4(바이트 절약)으로 바꿀 수 있다고 생각합니다.
Conor O'Brien



1

하스켈, 385 바이트

    b 0 = ["..", ".."]
b n = f:f:s:s:m (b (n - 1)) ++s:s:f:f:[]
    where f = replicate (8*n+2) $ d
          s = l++replicate ((8*n)-6) ' ' ++r
          m (x:xs) = map (\x -> l ++ x ++ r ) $ t
          l = d:d:' ':' ':[]
          r = reverse l
          t = b (n - 1)
          d :: Char
          d | n `mod` 2 == 0 = '.'
            | n `mod` 2 == 1 = '+'
main = mapM_ putStrLn $ b 6

코드 골프의 첫 번째 라운드는 ... 다른 사람들이이를 해결하는 방법을 기대합니다.

산출:

..................................................
..................................................
..                                              ..
..                                              ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++      ++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..  ++++++++++  ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..              ..  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++  ..................  ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++                      ++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..  ++++++++++++++++++++++++++  ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..                              ..  ++  ..
..  ++  ..................................  ++  ..
..  ++  ..................................  ++  ..
..  ++                                      ++  ..
..  ++                                      ++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..  ++++++++++++++++++++++++++++++++++++++++++  ..
..                                              ..
..                                              ..
..................................................
..................................................

3
1) 불필요한 공백이 많이 있습니다. 2) 모든 함수 정의를 where한 줄에 넣고 ;분리에 사용 합니다. 3) f:f:[]f:[f] and d : '': '': []`입니다 d:" ". 4) m매개 변수를 사용하지만 사용하지 않습니다. 인라인 mt . 5) 새로운 함수를 정의 #대체 replicate: c#x=c<$[1..8*n+x]와 같이 호출 d#2하고 ' '#(-6). 6) mod 2 == 0로 대체 할 수있다 even, 또는 테스트 및 사용 플립 odd과 골퍼의를 otherwise: 1<2. ...
nimi

2
... 전체적으로 : b n=f:f:s:s:map(\x->l++x++r)(b$n-1)++s:s:f:[f]where f=d#2;s=l++' '#(-6)++r;l=d:d:" ";r=reverse l;d|odd n='+'|1<2='.';c#x=c<$[1..8*n+x].
nimi


1

배쉬, 191 바이트

echo H4sIAGUcgFgAA73VOw7AIAyD4b2n6F6J+x+v6k5CnPy1F6ZPAvNaS80li4/cUvrkKWdGapOak3O5DDmVS5G8XI5k5ZIkLpclUbk02ZfLk125f5B4JIljLY59cZwxx31x3H3HO5aFIo7/pZIpqWZClHSJmg55AeBhTxb2CQAA|base64 -d|gunzip

아마도 작아 질 수는 있지만 알고리즘 시도보다 작습니다.


1

C #, 203 바이트

완전하고 읽기 쉬운 프로그램 :

using System;
public class P
{
    public static void Main(string[] a)
    {
        Func<string> f = () =>
        {
            var z = 25;
            var t = "";
            Func<int, string> c = (q) => q % 4 == 0 ? ".." : (q % 4 != 2 ? "  " : "++");
            for (var y = 0; y < z; y++)
            {
                var l = "";
                for (var x = 0; x < z; x++)
                        l += ((y > z / 2) ? (x >= y | x < z - y) : (x < y | x >= z - y)) ? c(x):c(y);
                l += "\n";
                t += l + l;
            }
            return t;
        };

        Console.Write(f());
        Console.ReadKey();
    }
}

골프 기능 :

()=>{var z=25;var t="";Func<int,string>c=(q)=>q%4==0?"..":(q%4!=2?"  ":"++");for(var y=0;y<z;y++){var l="";for(var x=0;x<z;x++)l+=((y>z/2)?(x>=y|x<z-y):(x<y|x>=z-y))?c(x):c(y);l+="\n";t+=l+l;}return t;};

1

05AB1E , 33 바이트

14G" . +"NL¤¸13N-.׫€D¨Â«èD})¨Â«»

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

설명

14G                               # for N in [1 ... 13]
   " . +"                         # push this string
         NL                       # push range [1 ... N]
           ¤¸13N-.×               # push a list of 13-N repetitions 
                                  # of the last element of the above range
                   «              # concatenate the two ranges
                    €D            # duplicate each element
                      ¨           # remove the last element
                       «         # concatenate a reversed copy to the list
                         è        # use the elements of the list to index into the string
                          D       # duplicate the resulting string
                           }      # end loop
                            )     # wrap the strings in a list
                             ¨    # remove the last element
                              «  # concatenate a reversed copy
                                » # join the list on newlines

올 설명?
Pavel

@Pavel : 물론입니다! :)
Emigna

1

PowerShell , 171151 바이트

($x=(1..12|%{' . +'[$_%4]}|%{($a+=$_+$_)})+"$a."|%{$c=if(++$i%2){('+','.')[($b=!$b)]}else{' '};$_.PadRight(25,$c)}|%{,($_+-join$_[25..0])*2});$x[23..0]

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

호응. 나는 더 짧은 방법이 있다고 확신하지만 (다른 답변의 길이가 주어지면 확신합니다), 이것은 약간의 트릭을 보여줍니다.

설명:

1..12|%{' . +'[$_%4]}필요한 올바른 패턴으로 문자열 배열 (한 문자 길이)을 생성합니다. 온라인으로 사용해보십시오!

그런 다음 |%{($a+=$_+$_)})+"$a."배열을 가져 와서 이전 행을 기준으로 옆으로 확장합니다. 온라인으로 사용해보십시오!

그런 다음 해당 문자열이 루프로 전송됩니다 |%{$c=if(++$i%2){('+','.')[($b=!$b)]}else{' '};$_.PadRight(25,$c)}. 반복 할 때마다 올바른 문자 (더하기, 점 또는 공백)를 선택한 다음 .PadRight함수를 사용 하여 적절한 수의 문자를 채 웁니다. 온라인으로 사용해보십시오!

이제 우상단의 기초가되었습니다. 우리는 각 문자열을 뒤집고 |%{,($_+-join$_[($z=25..0)])*2}함께 묶어야 블록의 상단을 얻을 수 있습니다. 이것은 -join명령과 색인화 를 통해 이루어집니다25..0 . 또한 문자열을 배열로 캡슐화하고 ,(...)두 배로 만들어 *2전체를 얻습니다. 온라인으로 사용해보십시오!

그것은 모두 $xparens에 저장되고 캡슐화되어 파이프 라인에 문자열을 배치합니다. 마지막으로, 우리는 $x(중복 된 가운데 행을 잘라 내고, 그렇지 않으면 ..가운데에 4 개가 있어야 합니다) 파이프 라인에 남겨 둡니다. 암시 적으로 Write-Output문자열 사이에 줄 바꿈이 적용되므로 무료로 얻을 수 있습니다.

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