레몬은 문자열을 제한


34

비어 있지 않은 한 줄 문자열을받는 프로그램이나 함수를 작성하십시오. 공백을 제외하고 인쇄 가능한 ASCII 만 포함한다고 가정 할 수 있습니다 .

문자열의 접두사로 만든 레몬이나 라임과 비슷한 ASCII 아트 마름모꼴 모양을 인쇄하거나 반환하십시오.

입력 문자열이 n 자라고 가정하십시오 . 그리고, 이러한 형상의 구성 2N - 1 연결됨 ASCII 아트 열 각각 이루어진 2N - 1 개 라인. (1)로부터 계산은 K 번째 열은 온도 (K) = 분 (K, 2 N - K) 와이드 문자 및 포함 F (K) 제의 사본 F (k)를 입력 문자를 하나의 빈으로 상하 중앙 사본을 분리하는 줄.

예를 들어 입력이 Lemon인 경우 출력은 다음과 같아야합니다.

          Lemon
      Lemo     Lemo
   Lem    Lemon    Lem
 Le   Lemo     Lemo   Le
L  Lem    Lemon    Lem  L
 Le   Lemo     Lemo   Le
   Lem    Lemon    Lem
      Lemo     Lemo
          Lemon

입력이 lime출력 이면 다음과 같아야합니다.

      lime
   lim    lim
 li   lime   li
l  lim    lim  l
 li   lime   li
   lim    lim
      lime

다른 입력에 대해서도 동일한 패턴을 따릅니다.

a

a

Be

 Be
B  B
 Be

/\

 /\
/  /
 /\

cat

   cat
 ca   ca
c  cat  c
 ca   ca
   cat

|||

   |||
 ||   ||
|  |||  |
 ||   ||
   |||

.__.

      .__.
   .__    .__
 ._   .__.   ._
.  .__    .__  . 
 ._   .__.   ._
   .__    .__
      .__.

$tring

               $tring
          $trin      $trin
      $tri     $tring     $tri
   $tr    $trin      $trin    $tr
 $t   $tri     $tring     $tri   $t
$  $tr    $trin      $trin    $tr  $
 $t   $tri     $tring     $tri   $t
   $tr    $trin      $trin    $tr
      $tri     $tring     $tri
          $trin      $trin
               $tring

출력의 행에는 후행 공백이있을 수 있으며 선택적 후행 줄 바꿈이 하나있을 수 있습니다.

바이트 단위의 가장 짧은 코드가 이깁니다.


13
접두사 만 사용한다는 것에 놀랐습니다. 왼쪽에 접두사를, 오른쪽에 접미사를 기대하고있었습니다!
Neil

1
(실제로 코딩 POV에서 나는 접미사를 선호하지만 케이크를 가지고 먹을 수는 없습니다.)
Neil

2
"를 정의 레몬 또는 라임과 비슷한 모양 "
피터 테일러에게

6
@PeterTaylor 예제에 표시된 모양. 출력을 유추 할 수없는 입력 문자열이 있습니까?
Calvin 's Hobbies

6
나는 아무것도 유추 할 필요가 없다. 질문에는 명세 가 있어야한다 .
피터 테일러

답변:


11

MATLAB, 140 136 128 124 바이트

기본적으로 먼저 중간 섹션으로 시작한 다음 단축 / 수정 버전을 단계별로 추가 / 추가합니다.

a=input('');v=ones(nnz(a)*2-1,1)*a;v(2:2:end,:)=0;b=v;for k=a;v=v(2:end,1:end-1);v(end+1,:)=0;b=[v,b,v,''];end;b(~flip(b))=0

@LuisMendo 8 바이트 감사합니다!

예를 들면 MATLAB다음과 같습니다.

               MATLAB               
          MATLA      MATLA          
      MATL     MATLAB     MATL      
   MAT    MATLA      MATLA    MAT   
 MA   MATL     MATLAB     MATL   MA 
M  MAT    MATLA      MATLA    MAT  M
 MA   MATL     MATLAB     MATL   MA 
   MAT    MATLA      MATLA    MAT   
      MATL     MATLAB     MATL      
          MATLA      MATLA          
               MATLAB                    

오, 멋진 생각이야! 불행하게도 내 이전 버전이 없습니다 flip: /
flawr

R2015b에서 124 바이트 코드를 테스트했으며 작동하는지 확인했습니다.
Luis Mendo

U O 그쪽 N의 k 개의 Y!
flawr

7

파이썬 2, 121110 바이트

s=input()
n=len(s)
r=range(1,n)+range(n,0,-1)
for y in r:print''.join(s[:(x+y-n&(x+y>n))*x]or' '*x for x in r)

사용하는 경우에는 116 바이트 raw_input. 이 프로그램은 기본적으로 중심으로부터의 L1- 노름 / 맨해튼 거리와 입력 길이의 패리티와 비교 한이 거리의 패리티를 기준으로 마스크를 수행합니다.

(-9 바이트에 @Lynn에게 감사하고 2 더 길을 포장합니다)


눈에 띄는 것은 첫 두 줄을 l = len (input ())으로 압축 할 수 있다는 것입니다.
Frank

@Frank s는 긴 줄의 끝에서 사용되므로 불행히도 불가능합니다
Sp3000

파이썬 2는 약간 다른 선택을 사용하여 112 또는 116 바이트 를 얻을 수 있습니다 R.
Lynn

아, 나는 그것을 잡지 않았다. 미안.
Frank

@Lynn 오, 그 선택 또는 R코드를 훨씬 깔끔하게 만듭니다!
Sp3000


6

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

s=>{x=' '.repeat(l=s.length);for(n=r='';n++<l;r=r?t+`
${r}
`+t:t)for(i=l,t='';i;t=t?w+t+w:w)w=(i<n|n+i&1?x:s).slice(0,i--);return r}

테스트

var solution =

s=>{
  x=' '.repeat(l=s.length);
  for(n=r='';n++<l;r=r?t+`\n${r}\n`+t:t)
    for(i=l,t='';i;t=t?w+t+w:w)
      w=(i<n|n+i&1?x:s).slice(0,i--);
  return r
}

result.textContent = solution('Lemon');
<input type="text" id="input" value="Lemon" oninput="result.textContent=solution(this.value)" /><pre id="result"></pre>




2

자바 스크립트, 187178 바이트

비트 접근법. 기능 m에서 시작하여 마스크를 정의하는 2 ** length예를 들어, 00100바이너리 및 정의 m(n) = m(n-1) << 1 | m(n-1) >> 1전반기. 흥미롭게도 후반은로 정의 될 수 있습니다 m(n) = m(n-1) << 1 & m(n-1) >> 1. (이 프로그램은 대신 m(n) = m(2 * length - 1)하반기 를 정의 하도록 선택하지만 ) 여기에서이 마스크를 사용하여 단어 또는 공백을 표시할지 여부를 확인할 수 있습니다 2 ** column & m(row). 물론 JavaScript에서는 작성 2 ** something하는 것이 더 짧 습니다 1 << something...

참고 : 피곤한 상태로 작성되었습니다. 수 있습니다 거의 반드시 실수를 가지고있다.

s=>{m=n=>n?n>l?m(2*l-n):(p=m(n-1))>>1|p<<1:1<<l
for(r=0;r/2<=(l=s.length-1);r++){for(i=1,o="";i/2-1<l;i++)o+=(1<<i-1&m(r)?s:" ".repeat(i)).slice(0,i>l?2*l+2-i:i)
console.log(o)}}

2

하스켈, 109 바이트

f s|n<-length s,r<-[1..n]++[n-1,n-2..1]=unlines[do x<-r;min(" ~"!!mod((x+y+n)*min(n-x-y)0)2)<$>take x s|y<-r]

2

Brachylog , 46 바이트

{a₀⟨{;Ṣ}j₎l⟩}ᶠL&l;Ṣj₍ẹa₁ᶠ;Lz{czzcᵐ}ᵐ⟨kc↔⟩zcᵐ~ṇ

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

끔찍한 바이트 수와 아마도 더 나쁜 접근법 (Brachylog는 ASCII 아트를 위해 정확하게 설계된 것은 아닙니다)이지만 어쨌든 게시하기에 충분한 시간을 낭비했습니다.

              L    The variable L
{           }ᶠ     is a list containing every possible
 a₀                prefix of
                   the input
    {;Ṣ}           paired with a space
        j          and concatenated with itself
   ⟨     ₎l⟩       a number of times equal to its length.
          ᶠ    A list containing every possible
        a₁     suffix of
   Ṣ           a space
    j          concatenated with itself
  ;  ₍         a number of times equal to
 l             the length of
&              the input
      ẹ        then split back up into its elements
               is an important list which doesn't actually get a name.
                         That list
;Lz                      zipped with L
   {     }ᵐ              with each pair being
    c                    concatenated,
     z                   zipped with cycling,
      z                  zipped back,
        ᵐ                and subjected to each of its elements being
       c                 concatenated itself,
           ⟨kc↔⟩         then palindromized
                z        and zipped yet again
                 cᵐ      with every line concatenated once more
                   ~ṇ    and finally joined on newlines
                         is the output.

이것의 유일한 영리한 부분은 a₁가장 먼저 가장 먼저 수직 공백을 a₀생성하고 가장 작은 단어 접두어 를 생성하고 접두어 zz의 너비와 일치하는 공간 블록으로 단일 공백을 확장하는 것입니다.


1

TSQL, 259 바이트

골프 :

DECLARE @ VARCHAR(30)='TSQL'

,@o VARCHAR(max),@i INT=0,@j INT,@t VARCHAR(max)SET @j=LEN(@)z:WHILE @i<LEN(@)SELECT @o=x+ISNULL(@o+x,''),@i+=1FROM(SELECT LEFT(IIF((@j-@i)%2=1,@,SPACE(99)),LEN(@)-@i)x)z SELECT @j-=1,@t=@o+ISNULL(CHAR(10)+@t+CHAR(10)+@o,''),@o=null,@i=0IF @j>0GOTO z PRINT @t

언 골프 드 :

DECLARE @ VARCHAR(30)='TSQL'

,@o VARCHAR(max),@i INT=0,@j INT,@t VARCHAR(max)SET @j=LEN(@)
z:
WHILE @i<LEN(@)
  SELECT @o=x+ISNULL(@o+x,''),@i+=1
  FROM(SELECT LEFT(IIF((@j-@i)%2=1,@,SPACE(99)),LEN(@)-@i)x)z
SELECT @j-=1,@t=@o+ISNULL(CHAR(10)+@t+CHAR(10)+@o,''),@o=null,@i=0
IF @j>0 GOTO z

PRINT @t

깡깡이


0

C, 167 바이트

이 프로그램은 입력 텍스트가 프로그램에 첫 번째 매개 변수로서 (명령 행 또는 다른 방법으로) 전달 될 것으로 예상하고 출력을 stdout에 기록합니다.

int i,j,k,l,v;main(h,s)char**s;{h=strlen(s[1]);l=h*2;for(;++i<l;puts(""))for(j=0;++j<l,v=j<h?j:l-j;)for(k=0;k++<v;putchar((i+j+h%2)%2&&v>h-(i<h?i:l-i)?s[1][k-1]:32));}

이것은 합리적인 도전처럼 보였기 때문에 코드 골프에서 처음 시도한 것이므로, 내가 한 일 때문에 아마 골프를 할 수 있었던 것보다 더 많이 골프를 칠 수 있습니다.

설명

/* Static variables
   i - "Row" number
   j - "Column" number
   k - String character counter
   l - Double length of the input string
   v - Inverted column distance from center */
int i,j,k,l,v;

/* Main parameters
   h - (argc) Input string length
   s - argv */
main(h, s)
char**s;
{
  /* Assign the input string length and double length */

  h = strlen(s[1]);
  l = h * 2;

  /* Display content */

    /* Loop over rows l - 1 times and put a newline after each */
  for (; ++i < l; puts(""))
      /* Loop over columns l - 1 times and set the inverted column
         distance each time */
    for (j = 0; ++j < l, v = ((j < h) ? j : l - j);)
        /* Loop over characters up to the inverted column distance from the
           center (this generates the pattern of output lengths needed) */
      for (k = 0; k++ < v;)
        putchar(
            /* Check for if the current row + column (with an offset based on
               the input parity) parity is even or odd, creating the needed
               checkerboard pattern */
          (i + j + h % 2) % 2 &&
            /* If the inverted column distance from the center is more than the
               row distance from the center, then the cell is inside the
               circular shape */
          v > (h - ((i < h) ? i : l - i)) ?
              /* Display the requested character (minus one for 0 based) */
            s[1][k-1] :
            32 /* Otherwise display a space (ASCII 32) */
        );
}

입력 범위 내 (n < m) ? n : (m * 2) - n에서 중심 위치로부터 반전 된 거리를 얻기 위해 프로그램에서 의 사용을 적어도 두 번 주의하는 것이 중요 합니다 . 더 짧은 방법이 있다면 알고리즘이이 프로그램의 작동 방식에 중요하기 때문에 좀 더 쉽게 골라 낼 수 있습니다.mm * 2n


0

C, 137 바이트

x,y,w;main(l,v)char**v;{for(y=l=strlen(v[1]);-l<--y;putchar(10))for(x=l;-l<--x;printf("%*.*s",w,w,x+y+l&1&&w>abs(y)?v[1]:""))w=l-abs(x);}

고장:

현재 요소가 공백인지 입력 단어인지를 결정하는 마스크 기능을 사용하여 2n-1 x 2n-1 그리드의 모든 요소를 ​​그립니다 (마스크는 다이아몬드 모양과 바둑판 패턴을 확인합니다).

x,y,w;
main(l,v)char**v;{
    for(y=l=strlen(v[1]);-l<--y;/*...*/)    // row loop (count down to save bytes)
        for(x=l;-l<--x;/*...*/)             // column loop
            w=l-abs(x);                     // calculate current word's width
            printf("%*.*s",                 // print...
                w,w,                        // ...with min & max width...
                x+y+l&1&&w>abs(y)           // Check mask:
                    ?v[1]                   //  ...word
                    :"")                    //  ...or blank space
        putchar(10)                         // Newline
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.