Bir dize limon-limify


34

Boş olmayan tek satırlı bir dize alan bir program veya işlev yazın. Yalnızca alan hariç , yazdırılabilir ASCII içerdiğini varsayabilirsiniz .

İpin ön eklerinden yapılan limon veya kirece benzer bir ASCII sanat pastil şekli yazdırın veya iade edin.

Giriş dizesinin n harf uzunluğunda olduğunu varsayalım . Daha sonra, bu tür bir şekil oluşur 2n - 1 birbirine dikilmiş ASCII sanatı sütun, her biri aşağıdakilerden oluşan 2n - 1 satır. 1'den sayıldığında , k sütunu f (k) = min (k, 2n - k) karakter genişliğindedir ve ilk f (k) 'nin f (k) kopyalarını içerir. girişin karakterinin dikey olarak ortalanmış, tek boşlukla içeren kopyaları ayıran çizgiler.

Örneğin, giriş ise Lemon, çıkış şöyle olmalıdır:

          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

Giriş ise lime, çıktı şöyle olmalıdır:

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

Aynı giriş diğer girdiler için de takip edilir:

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

Çıktıdaki satırlar sondaki boşluklara sahip olabilir ve isteğe bağlı bir sondaki yeni satır olabilir.

Bayt cinsinden en kısa kod kazanır.


13
Sadece önek kullandığına şaşırdım - soldaki önekleri ve sağdaki sonekleri bekliyordum!
Neil

1
(Aslında kodlayan bir POV'dan baştan beri ekleri tercih ederdim ama
Neil

2
"Define limon veya kireç benzeri şekil "
Peter Taylor

6
@PeterTaylor Örneklerin gösterdiği şekil. Gerçekten çıktısını elde edemediğiniz bir giriş dizesi var mı?
Calvin'in Hobileri

6
Hiçbir şey çıkarmamalıydım: soru bir spesifikasyona sahip olmalı .
Peter Taylor

Yanıtlar:


11

Matlab, 140 136 128 124 bayt

Temel olarak ilk önce orta bölümle başlar ve daha sonra kısaltılmış / değiştirilmiş sürümleri adım adım hazırlar / ekler.

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 byte @LuisMendo için teşekkürler!

Örneğin MATLABbiz almak için:

               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                    

Oh, harika fikir! Maalesef eski flip
sürümümde

124 baytlık kodunuzu R2015b'de test ettim ve çalışmasını onaylıyorum
Luis Mendo

Ö n c Tha n k y!
flawr

7

Python 2, 121 110 bayt

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)

Kullanıyorsanız 116 bayt raw_input. Program esasen merkeze L1-norm / Manhattan mesafesine ve giriş mesafesinin paritesine kıyasla bu mesafenin paritesine dayanan bir maske yapar.

(-9 baytlık @Lynn'e teşekkürler ve 2 daha yol açtığı için)


Ortaya çıkan tek şey, ilk iki satırı l = len (input ()) ile sıkıştırmanız olabilir, değil mi?
Frank

@Frank suzun çizginin sonunda kullanılır, bu yüzden ne yazık ki bu mümkün değil
Sp3000

Python 2, için biraz farklı bir seçenek kullanarak 112 veya 116 bayt alabilir R.
Lynn,

Ah, onu anlamadım, üzgünüm.
Frank

@Lynn Oh vay, bu seçim ya Rda kodu çok daha temiz yapar!
Sp3000,


6

JavaScript (ES6), 132 bayt

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}

Ölçek

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 bayt

Bitsel bir yaklaşım. Fonksiyon mmaskeyi 2 ** length, örneğin 00100ikili olarak başlayarak m(n) = m(n-1) << 1 | m(n-1) >> 1ve ilk yarı için tanımlayarak tanımlar . İlginç şekilde, ikinci yarı olarak tanımlanabilir m(n) = m(n-1) << 1 & m(n-1) >> 1. (Program bunun yerine m(n) = m(2 * length - 1)ikinci yarı için tanımlamayı seçse de ) Buradan, bu maskeler bir kelimenin veya boşluğun kontrol edilerek görünüp görünmeyeceğini belirlemek için kullanılabilir 2 ** column & m(row). JavaScript Tabii ki yazma için daha kısa 2 ** somethingolan 1 << something...

not: yorgunken yazılmış. Mayıs Neredeyse kesinlikle hatalar olabilir.

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 bayt

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 bayt

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

Çevrimiçi deneyin!

Korkunç bayt sayısı ve muhtemelen daha kötü bir yaklaşım (Brachylog'un ASCII sanatı için tam olarak tasarlanmadığından bahsetmiyorum bile), ama yine de yayınlamak için yeterince zaman harcadım.

              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.

Bunların herhangi birinin en zekice olan kısmı, en küçük olanı en küçük olanı oluştururken a₁ilk önce en büyük olan dikey boşlukları a₀üretmek ve zztek boşlukları öneklerin genişlikleriyle eşleşen boşluk bloklarına genişletmek için kullanılmasıdır.


1

TSQL, 259 bayt

golfed:

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

Ungolfed:

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

Keman


0

C, 167 bayt

Bu program, giriş metninin programa ilk parametre olarak geçirilmesini bekler (komut satırı yoluyla veya bununla birlikte) ve çıktıyı stdout'a yazar.

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

Bu benim ilk kod girişimi, burada mantıklı bir zorluk gibi göründüğü için, bu yüzden muhtemelen nasıl yaptığımdan daha fazla golf oynayabilir.

açıklama

/* 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) - nTers çevrilmiş mesafeyi , girişin bulunduğu mbir aralıktaki bir merkez konumundan almak için programda kullanımın en az iki kez kullanıldığını belirtmek yeterince önemlidir . Bunu yapmanın daha kısa bir yolu varsa, o zaman bu algoritma bu programın çalışması için önemli olduğundan, daha kolay golf oynayabilir.m * 2n


0

C, 137 bayt

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

Yıkmak:

Bu, 2n-1 x 2n-1 ızgarasının her elemanını çizer, maske, mevcut elemanın boşluk mu yoksa giriş kelimesi mi olacağına karar verir (maske bir elmas şekli ve dama tahtası deseni kontrol eder).

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.