Лимон-узагальнюйте струну


34

Напишіть програму або функцію, яка містить непорожній однорядковий рядок. Ви можете припустити, що він містить лише друкований ASCII, виключаючи пробіл.

Роздрукуйте або поверніть ASCII художню пастилку, схожу на лимон або лайм, зроблені з префіксів рядка.

Припустимо, вхідний рядок має n літер. Потім така форма складається з 2n - 1 стовпців мистецтва ASCII, зшитих між собою, кожен складається з 2n - 1 рядків. Відлічуючи від 1, k -й стовпчик має f (k) = min (k, 2n - 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
Я був здивований, що ви використовували лише префікси - я очікував префікси зліва та суфікси праворуч!
Ніл

1
(Насправді з кодування POV, я б віддав перевагу суфіксам у всьому, але ви не можете мати торт і їсти його.)
Ніл,

2
Визначте " форму, схожу на лимон чи лайм "
Пітер Тейлор

6
@PeterTaylor Форма, показана на прикладах. Чи чесно є рядок введення, для якого ви не можете зробити висновок?
Захоплення Кальвіна

6
Мені нічого не слід було робити висновок: у питанні має бути специфікація .
Пітер Тейлор

Відповіді:


11

Матлаб, 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

Дякуємо за 8 байт @LuisMendo!

Наприклад, 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

Я перевірив ваш 124-байтний код на R2015b і підтверджую, що він працює
Луїс Мендо

Tha п к у про ц!
flawr

7

Python 2, 121 110 байт

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-нормі / відстані Манхеттена від центру, а також на паритеті цієї відстані порівняно з паритетом вхідної довжини.

(Дякуємо @Lynn за -9 байтів і прокладаємо дорогу ще 2)


Одне, що вискакує, це те, що ви могли б компактні перші два рядки до l = len (input ()), ні?
Френк

@Frank sвикористовується в кінці довгого рядка, тому, на жаль, це неможливо
Sp3000

Python 2 може отримати 112 або 116 байт, використовуючи дещо інший вибір для R.
Лінн

Ах, я цього не зловив, вибачте.
Френк

@Lynn О, вау, цей вибір чи Rробить код набагато акуратніше!
Sp3000


6

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

JavaScript, 187 178 байт

Бітовий підхід. Функція 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

Haskell, 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

Брахілог , 46 байт

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

Спробуйте в Інтернеті!

Жахливий кількість байтів і, мабуть, гірший підхід (не кажучи вже про Брахілог не зовсім розроблений для мистецтва 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програми в принаймні двічі для отримання перевернутої відстані від центральної позиції mна діапазоні m * 2з входом n. Якщо є коротший спосіб зробити це, то його можна було би пробити внизу легше, оскільки цей алгоритм важливий для роботи цієї програми.


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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.