Lemon-Limify a String

34

Tulis program atau fungsi yang menggunakan string baris tunggal kosong. Anda dapat menganggapnya hanya berisi ASCII yang dapat dicetak tanpa ruang.

Cetak atau kembalikan bentuk permen ASCII art yang mirip dengan lemon atau jeruk nipis yang dibuat dari awalan tali.

Misalkan string input panjangnya n huruf. Kemudian, bentuk seperti itu terdiri dari 2n - 1 kolom seni ASCII yang dijahit bersama, masing-masing terdiri dari 2n - 1 garis. Menghitung dari 1, kolom k -th adalah f (k) = min (k, 2n - k) lebar karakter, dan berisi f (k) salinan karakter input f (k) pertama, berpusat secara vertikal, dengan single blank garis yang memisahkan salinan.

Misalnya, jika inputnya adalah Lemon, outputnya harus:

          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

Jika inputnya adalah limeoutput harus:

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

Dan pola yang sama diikuti untuk input lain:

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

Baris dalam output mungkin memiliki spasi tambahan dan mungkin ada satu baris tambahan opsional.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
13
Saya terkejut bahwa Anda hanya menggunakan awalan - Saya mengharapkan awalan di sebelah kiri dan sufiks di sebelah kanan!
Neil
1
(Sebenarnya dari POV pengkodean saya lebih suka sufiks sepanjang tetapi Anda tidak dapat memiliki kue dan memakannya.)
Neil
2
Definisikan " bentuk yang mirip dengan lemon atau jeruk nipis "
Peter Taylor
6
@PeterTaylor Bentuknya ditunjukkan oleh contoh. Apakah benar-benar ada string input yang tidak dapat Anda simpulkan outputnya?
Hobi Calvin
6
Saya tidak perlu menyimpulkan apa pun: pertanyaannya harus memiliki spesifikasi .
Peter Taylor

Jawaban:

11

Matlab, 140 136 128 124 byte

Pada dasarnya pertama dimulai dengan bagian tengah, dan kemudian menambahkan / menambahkan versi singkat / modifikasi langkah demi langkah.

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

Terima kasih untuk 8 byte @LuisMendo!

Misalnya untuk MATLABkita dapatkan:

               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                    
cacat
sumber
Oh, ide keren! Sayangnya versi lama saya tidak memiliki flip: /
flawr
Saya menguji kode 124-byte Anda pada R2015b dan saya mengonfirmasi itu berfungsi
Luis Mendo
Tha n k y o u!
flawr
7

Python 2, 121 110 byte

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 byte jika menggunakan raw_input. Program ini pada dasarnya melakukan masking berdasarkan L1-norm / Manhattan jarak dari pusat, serta paritas jarak ini dibandingkan dengan paritas panjang input.

(Terima kasih kepada @Lynn untuk -9 byte dan membuka jalan untuk 2 lagi)

Sp3000
sumber
Satu hal yang muncul adalah Anda dapat memadatkan dua baris pertama menjadi l = len (input ()), bukan?
Frank
@ Frank sdigunakan pada akhir garis panjang, jadi sayangnya itu tidak mungkin
Sp3000
Python 2 bisa mendapatkan 112 atau 116 byte menggunakan pilihan yang sedikit berbeda untuk R.
Lynn
Ah, saya tidak menangkap yang itu, maaf.
Frank
@ Lynn Oh wow, pilihan itu atau Rmembuat kode lebih rapi!
Sp3000
6

MATL , 44 byte

Saya mengambil beberapa inspirasi dari jawaban @ flawr (walaupun algoritmenya tidak sama)

GtnEq:!g*2Mo*XKG"K1YS3LZ)OX@:Y(PO5MY(XKwyhhc

Input adalah string dengan tanda kutip tunggal.

Cobalah online!

Luis Mendo
sumber
6

JavaScript (ES6), 132 byte

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}

Uji

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>

pengguna81655
sumber
5

Jeli, 32 26 byte

³L_+«0ị“~ ”«³ḣ
JµṖ;Ṛç@þ`j⁷

Cobalah online!

EDIT: Dennis menyimpan 6 byte. Terima kasih!

Lynn
sumber
2

JavaScript, 187 178 byte

Pendekatan bitwise. Fungsi mmendefinisikan topeng dengan mulai dari 2 ** length, misalnya 00100dalam biner, dan mendefinisikan m(n) = m(n-1) << 1 | m(n-1) >> 1untuk paruh pertama. Menariknya, babak kedua dapat didefinisikan sebagai m(n) = m(n-1) << 1 & m(n-1) >> 1. (meskipun program sebaliknya memilih untuk menentukan m(n) = m(2 * length - 1)untuk paruh kedua) Dari sini topeng ini dapat digunakan untuk menentukan apakah kata atau ruang akan muncul dengan memeriksa 2 ** column & m(row). Tentu saja dalam JavaScript lebih pendek untuk menulis 2 ** somethingdengan 1 << something...

catatan: ditulis saat lelah. Mungkin Hampir pasti memiliki kesalahan.

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)}}
Jrich
sumber
2

Haskell, 109 byte

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]
dianne
sumber
2

Brachylog , 46 byte

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

Cobalah online!

Hitungan byte yang mengerikan dan mungkin pendekatan yang lebih buruk (belum lagi Brachylog tidak dirancang dengan tepat untuk seni ASCII), tapi saya membuang banyak waktu untuk mempostingnya.

              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.

Hampir satu-satunya bagian pintar dari semua ini adalah penggunaan a₁untuk menghasilkan spasi vertikal terbesar-pertama sementara a₀menghasilkan kata awalan terkecil-pertama, dan zzuntuk memperluas ruang tunggal menjadi blok ruang yang cocok dengan lebar awalan.

String yang tidak terkait
sumber
1

TSQL, 259 byte

Golf:

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

Tidak Disatukan:

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

Biola

t-clausen.dk
sumber
0

C, 167 byte

Program ini mengharapkan teks input untuk diteruskan sebagai parameter pertama ke program (melalui baris perintah atau yang lain) dan akan menulis output ke 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));}

Ini adalah upaya pertama saya di golf kode di sini karena sepertinya tantangan yang masuk akal, jadi mungkin bisa bermain golf lebih dari yang saya bisa hanya karena bagaimana saya melakukannya.

Penjelasan

/* 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) */
        );
}

Cukup signifikan untuk mencatat penggunaan (n < m) ? n : (m * 2) - ndalam program setidaknya dua kali untuk mendapatkan jarak terbalik dari posisi tengah mpada rentang m * 2dengan input n. Jika ada cara yang lebih pendek untuk melakukan itu maka itu bisa diturunkan lebih mudah karena algoritma itu penting untuk cara kerja program ini.

Lemon Drop
sumber
0

C, 137 byte

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

Kerusakan:

Ini menarik setiap elemen dari grid 2n-1 x 2n-1, dengan fungsi topeng yang memutuskan apakah elemen saat ini harus berupa ruang kosong atau kata input (topeng memeriksa bentuk berlian dan pola kotak-kotak).

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