줄을 삼각형으로 접으십시오


22

길이를 4로 나눌 수있는 문자열이 주어지면 아래 그림과 같이 삼각형을 만드십시오.

문자열이 abcdefghijkl인 경우 삼각형은 다음과 같습니다.

   a
  b l
 c   k
defghij

문자열이 iamastringwithalengthdivisiblebyfour인 경우 삼각형은 다음과 같습니다.

         i
        a r
       m   u
      a     o
     s       f
    t         y
   r           b
  i             e
 n               l
gwithalengthdivisib

문자열이 thisrepresentationisnotatriangle인 경우 삼각형은 다음과 같습니다.

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

노트

  • 문자열은에서 a까지 의 문자로만 구성 됩니다 z.
  • 셰이프가 깨지지 않는 한 선행 / 후행 공백과 줄 바꿈이 허용됩니다.
  • 출력으로 문자열 목록이 허용됩니다.

이것은 입니다. 바이트 단위의 최단 답변이 이깁니다. 표준 허점이 적용됩니다.

답변:


7

, 25 22 21 바이트

≔÷Lθ⁴λ↙…θλ→✂θλ±λ↖✂θ±λ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 끈을 세 부분으로 얇게 자르고 적절한 방향으로 인쇄합니다. 편집 : 정수 나누기와 슬라이싱을 사용하여 3 바이트를 절약했습니다. 문자열의 머리 CycleChop대신에 Slice를 사용하여 추가 바이트를 저장했습니다 . 편집 : 차콜은 이제 다각형의 가장자리를 따라 임의의 텍스트 그리기를 지원하여 코드를 12 바이트로 단순화합니다.

GH↙→→↖⊕÷Lθ⁴θ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다.


무엇을합니까 ?
Outgolfer Erik

@EriktheOutgolfer 새 슬라이스 연산자입니다.
Neil

: | 죄송합니다. PolygonHollow를 사용하도록 설정 GH↙→→↖⊕÷Lθ⁴θ했습니다. 다음에 숯을 눌렀을 때 작동합니다
ASCII 전용

6

05AB1E , 23 바이트

ćsIg4÷GćsÁćsŠN·<ú«s}».C

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

설명

ć                        # extract head of input
 s                       # swap the remaining string to top of stack
  Ig4÷G                  # for N in [1...len(input)/4-1] do:
       ć                 # extract head
        sÁ               # swap remaining string to top of stack and rotate right
          ć              # extract head
           sŠ            # reorder stack as tail, head, remaining
             N·<ú        # prepend N-1 spaces to tail
                 «s      # concatenate with head and swap remaining string to top
                   }     # end loop
                    ».C  # join by newlines and center

6

자바 스크립트 (ES6) 119 117 108 105 바이트

s=>(l=s.length/4,S=' ',g=([c,...s],p)=>S.repeat(l)+c+(l--?p+s.pop()+`
`+g(s,p?p+S+S:S):s.join``))(s+S,'')

형식화 및 의견

s => (                            // given the input string s:
  l = s.length / 4,               // l = length of side edge - 1
  S = ' ',                        // S = space (defining S costs 6 bytes but saves 7)
  g = (                           // g = recursive function which takes:
       [c,                        //   - c = next character
           ...s],                 //   - s = array of remaining characters
                  p) =>           //   - p = middle padding string
    S.repeat(l) + c + (           // append left padding + left character
      l-- ?                       // if side edges are not complete:
        p + s.pop() + '\n' +      //   append middle padding + right character + Line Feed
        g(s, p ? p + S + S : S)   //   and do a recursive call with updated middle padding
      :                           // else:
        s.join``                  //   append all remaining characters and stop recursion
    )                             //   (this is the bottom edge)
  )(s + S, '')                    // initial call to g()

테스트 사례


4

C #, 260 바이트

namespace System{using static Console;class P{static void Main(){var d=ReadLine();int e=d.Length/4,x=e,y=0,g=0,i=0;Action<int,int>a=(p,q)=>{SetCursorPosition(p,q);Write(d[g++]);};for(;i<e;i++)a(x--,y++);for(i=0;i<e*2;i++)a(x++,y);for(i=0;i<e;i++)a(x--,y--);}}}

정말 사용하고 싶었습니다 SetCursorPosition.

언 골프 드 :

namespace System {
    using static Console;

    class P {
        static void Main() {
            var d = ReadLine();
            int e = d.Length / 4, x = e, y = 0, g = 0, i = 0;
            Action<int, int> a = (p, q) => { SetCursorPosition(p, q); Write(d[g++]); };
            for (; i < e; i++)
                a(x--, y++);
            for (i = 0; i < e * 2; i++)
                a(x++, y);
            for (i = 0; i < e; i++)
                a(x--, y--);
        }
    }
}

나의 무지를 용서해주십시오. 그러나 당신의 해결책에서 행동의 목적은 무엇입니까? void 함수보다 바이트 수가 적습니까?
confusedandamused

1
@confusedandamused 나는 단일 함수 답변을 작성하는 데 익숙 했으므로 함수를 정상적으로 넣는 것을 고려하지 않았지만 짧아 질 것입니다.
LiefdeWen

3

수학, 164 바이트

(b=Length[c=Characters@#];k=Column[#,Alignment->Center]&;T=Table;k@{#&@@c,k@T[""<>{c[[i+2]],T[" ",2i+1],c[[-i-1]]},{i,0,(a=b/4)-2}],""<>T[c[[i]],{i,a+1,b/2+1+a}]})&


입력

[ "네 개의 길이로 나눌 수있는 iamastring"]


우리는 모두 [[1]]로 대체 될 수 있음을 알고 있습니다 #&@@.
user202729

1
당신은 모두 너무 똑똑한 사탕입니다!
J42161217


당신이하고있는 자신을 발견 할 때 @(...), 단지 할 [...]대신. 그리고 테스트하지는 않았지만 Column이름을 지정하여 (또는 Column[#,Alignment->Center]&피하기 위해 q) 다른 바이트를 저장할 수 있습니다. 그리고 나머지 모든 변수를 외부의 첫 번째 인수에 넣습니다 Column(주변 괄호를 저장합니다).
Martin Ender 2016 년

3

파이썬 3 , 120 바이트

첫번째 골프, 나는 길을 따라 약간의 파이썬을 배울지도 모른다고 생각했다.

a=input()
l=len(a)//4
print(l*" "+a[0])
for i in range(1,l):print((l-i)*" "+a[i]+(2*i-1)*" "+a[4*l-i])
print(a[l:3*l+1])

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

설명:

첫 번째 문자는 len(a)//4공백 다음 에 자체적으로 인쇄 된 다음 i두 번째 문자부터 시작 하여 첫 번째 문자 와 마지막 문자가 2*i - 1공백으로 구분되어 인쇄됩니다 .

마지막으로 나머지 부분 문자열이 인쇄됩니다.


PPCG에 오신 것을 환영합니다! 이 솔루션 에서 배울 수 있습니다 .
Leaky Nun

여기서 가능한 골프는 선언 p=print하고 사용 p하는 세 가지에 print사용하는 것입니다.
FlipTack

또한 문자열 길이는 항상 4로 나눌 //수 있으므로 (바닥 나누기)는로 대체 할 수 있습니다 /.
FlipTack

그런데 온라인으로 연결하기 위해 연결 한 코드는 답변의 코드와 다릅니다.
FlipTack

3

GNU가 나오지 , 178 (158) 132 + 1 = 133 바이트

-r플래그의 경우 +1 바이트

s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm

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

설명

이전 버전 에서는 직관적으로 피할 수 있다고 확신했지만 수학, 특수 사례 및 정리를 처리하는 데 많은 바이트를 사용했습니다. 그 이후로는 대부분 그렇게하였습니다.

입력이 있다고 가정하자 abcdEFGHIJKLMnop. 글자 EFGHIJKLM는 삼각형의 밑면이 될 것이므로 시각 자료로 대문자로 표기했습니다.

먼저 첫 번째 문자를 공백으로 ;시작하고 마지막 문자 앞에 커서 ( )를 삽입하여 입력을 준비합니다 .

s/(.)(.*)(.)/ \1\n\2;\3/

이제 우리는 :

 a
bcdEFGHIJKLMno;p

이제 루프에서 마지막 줄에 몇 가지 작업을 수행 할 것입니다. 1. 이전 줄에서 공백을 복사하고 첫 문자 뒤에 공백을 두 개 더한 다음 삽입합니다. 2. 마지막 문자를 공백 바로 다음으로 이동 한 다음 줄 바꿈을 입력하십시오. 3. 커서를 왼쪽으로 세 문자 이동하십시오.

:
  s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1  \6\n\3;\4\5/m
  t

각 반복의 결과는 다음과 같습니다.

 a
b   p
cdEFGHIJKL;Mno

 a
b   p
c     o
dEFGHI;JKLMn

 a
b   p
c     o
d       n
EF;GHIJKLM

피라미드 모양이 시작되는 것을 볼 수 있습니다. 또한 커서의 용도를 볼 수 있습니다. 각 반복에서 3 문자 왼쪽으로 이동했으며 더 이상 왼쪽 문자가 3 개가 없으면 루프가 끊어지며 이는 "하단"에 도달했을 때 발생합니다 피라미드의.

이제 비슷한 작업을 수행하지만 그 반대의 경우도 마찬가지입니다. 루프에서 커서를 사용하여 줄의 시작 부분에서 이전 줄의 시작 부분으로 공백을 복사하고 그 줄에서 커서를 위로 이동하는 과정에서 1을 더합니다.

:A
  s/(.*\n)( *)(.*);/ \2;\1\2\3/m
  tA

다음은 몇 가지 반복과 최종 결과입니다.

 a
b   p
c     o
 ;d       n
EFGHIJKLM

 a
b   p
  ;c     o
 d       n
EFGHIJKLM

...

    ; a
   b   p
  c     o
 d       n
EFGHIJKLM

추가 문자를 제외한 모든 작업이 완료 ;되었습니다. 첫 번째 줄에는 A 와 여분의 공백이 있고 다음 세 줄에는 피라미드의 "중간"에 두 개의 공백이 있습니다. 간단한 대체물이 제거됩니다.

s/. (.)$/\1/gm

다 했어요!

    a
   b p
  c   o
 d     n
EFGHIJKLM


2

파이썬 2 , 100 97 96 바이트

  • Jacoblaw 가 1 바이트를 절약했습니다 : 정수 나누기가 필요하지 않습니다
a=input()+" "
k=j=len(a)/4
while j:print j*" "+a[0]+(2*(k-j)-1)*" "+a[-1];a=a[1:-1];j-=1
print a

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

설명:

내가 한 똑똑한 일은 끝에 공백이있는 입력을 채우는 것입니다. 첫 번째 문자가 쌍을 이루고 루프로 들어갈 수 있습니다 (후행 공백이 허용되기 때문에)

abcdefghijkl[space]   
To print [0] [-1]            Output=>[spaces]a[another_calculated_spaces(=0 here)][space]
Strip at both ends(a[1:-1])  
bcdefghijkl                
To print [0] [-1]            Output=>[spaces]b[another_calculated_spaces]l
Strip at both ends(a[1:-1])
and so on.

따라야하는 루프 수는와 연관되어 len(word)//4있습니다. 마지막 단계에서 나머지 문자열 전체가 인쇄됩니다 (삼각형의 밑면을 형성 함). 공백은 간단한 패턴을 따릅니다. 첫 번째 공백 세트는 1 씩 감소하고, 두 번째 공백 세트는 2 씩 증가합니다.


1
정수 나누기를하지 않음으로써 바이트를 줄일 수 있습니까? 때문에 a항상 4의 배수가 될 것입니다 //> -/
jacoblaw

감사합니다. [4로 나눌 수없는 길이의 입력] [ tio.run/…
officialaimm

1
파이썬 2에서 나누기는 기본적으로 정수이기 때문입니다. 그것은 파이썬 3에서 가능합니다.
CalculatorFeline

2

C 225 바이트

p(c){putchar(c);}S(n){while(n--)p(' ');}main(int c,char**v){int i= strlen(v[1]),n=i/4,r;char*s=v[1],*e=&s[i-1];S(n);p(*s++);p('\n');for (r=1;r<n;r++){S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n');}e++;while (s!=e)p(*s++);p('\n');}

설명

p(c){putchar(c);}        // p is alias for putchar
S(n){while(n--)p(' ');}  // S prints n spaces
main(int c,char**v){
    int i= strlen(v[1]), // counter
        n=i/4,           // num rows in figure - 1
        r;               // current row 
    char*s=v[1],         // start char
        *e=&s[i-1];      // end char
    S(n);p(*s++);p('\n');// print first row
    for (r=1;r<n;r++){ 
        S(n-r);p(*s++);S(2*r-1);p(*e--);p('\n'); // print middle rows
    }
    e++;while (s!=e)p(*s++);p('\n'); // print last row
}


1

옥타브, 87 바이트

@(s,x=(n=nnz(s))/4)[[' ';flip(diag(s(1:x))')]' [' ';diag(s(n:-1:n-x+2))];s(x+1:n-x+1)];

* Windows 시스템에서 위의 코드는 올바른 결과를 생성하지만 tio에서는 코드를 추가하여 수정했습니다.

설명:

[' ';flip(diag(s(1:x))')]'        %left side
[' ';diag(s(n:-1:n-x+2))]         %right side
s(x+1:n-x+1)                      %bottom side

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





1

레티 나 , 99 바이트

^(.)(?=(....)+)
$#2$*  $1¶$#2$* 
( ( *).)(.*)(.)$
$1 $4¶$2$3
+`(( +).¶ ( *).)(.*)(.)$
$1$2  $5¶$3$4

온라인으로 사용해보십시오! 설명 : 처음 두 단계는 처음 두 행을 생성하지만 그 후에는 특수 대소 문자가 필요하지 않으며 각 후속 행은 자동으로 생성 될 수 있습니다.

thisrepresentationisnotatriangle

        t
       hisrepresentationisnotatriangle

        t
       h e
      isrepresentationisnotatriangl

        t
       h e
      i   l
     srepresentationisnotatriang

...

        t
       h e
      i   l
     s     g
    r       n
   e         a
  p           i
 r             r
esentationisnotat

1

자바 8, 213 바이트

s->{int n=s.length()/4,i;String r=s(n)+s.charAt(0)+"\n";for(i=1;i<n;r+=s(n-i)+s.charAt(i)+s(i*2-1)+s.charAt(n*4-i++)+"\n");return r+s.substring(i,n*2+i+1);}String s(int n){String r="";for(;n-->0;r+=" ");return r;}

설명:

여기에서 시도하십시오.

s->{                           // Method (1) with String parameter and String return-type
  int n=s.length()/4,          //  The length of the input divided by 4
      i;                       //  And an index-integer
  String r=                    //  Result-String which starts as:
           s(n)                //   Trailing spaces
           +s.charAt(0)+"\n";  //   + the first character and a new-line
  for(i=1;i<n;                 //  Loop from `1` to `n`
      r+=                      //   And append the result-String with:
         s(n-i)                //    Trailing spaces
         +s.charAt(i)          //    + the character of the left diagonal line
         +s(i*2-1)             //    + center spaces
         +s.charAt(n*4-i++)    //    + the character of the right diagonal line
         +"\n"                 //    + a new-line
  );                           //  End of loop
  return r                     //  Return the result-String
         +s.substring(i,n*2+i+1);
                               //   + the bottom part of the triangle
}                              // End of method (1)

String s(int n){               // Method (2) with integer parameter and String return-type
  String r="";                 //  Result-String
  for(;n-->0;r+=" ");          //  Append the result-String with `n` spaces
  return r;                    //  Return the result-String
}                              // End of method (2)

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