เลมอน - จำกัด สตริง


34

เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในสายอักขระบรรทัดเดียวแบบไม่มีเงื่อนไข คุณอาจคิดว่ามันมีเพียงASCII ที่พิมพ์ได้ซึ่งไม่รวมช่องว่าง

พิมพ์หรือส่งคืนรูปร่างรูปทรงคล้ายยาอม ASCII คล้ายกับมะนาวหรือมะนาวที่ทำจากส่วนนำหน้าของสตริง

สมมติว่าสตริงอินพุตมีความยาวnตัวอักษร จากนั้นรูปร่างดังกล่าวประกอบด้วย2n - 1คอลัมน์ของ ASCII art ที่เย็บเข้าด้วยกันโดยแต่ละอันประกอบด้วย2n - 1บรรทัด นับจาก 1, kคอลัมน์ -th เป็นf (k) = นาที (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
ฉันประหลาดใจที่คุณใช้เพียงคำนำหน้า - ฉันคาดหวังว่าคำนำหน้าทางด้านซ้ายและคำต่อท้ายด้านขวา!
Neil

1
(อันที่จริงจาก POV การเข้ารหัสฉันจะต้องต่อท้ายตลอด แต่คุณไม่สามารถมีเค้กของคุณและกินมัน.)
Neil

2
กำหนด " รูปร่างคล้ายมะนาวหรือมะนาว "
Peter Taylor

6
@PeterTaylor รูปร่างที่แสดงโดยตัวอย่าง มีสตริงอินพุตที่คุณไม่สามารถสรุปเอาท์พุทได้ใช่ไหม
งานอดิเรกของ Calvin

6
ฉันไม่ควรสรุปอะไรเลย: คำถามควรมีสเป
Peter Taylor

คำตอบ:


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

ขอบคุณสำหรับ 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 แล้วและฉันยืนยันว่ามันใช้งานได้
Luis Mendo

ท่า n k Y o U!
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-norm / Manhattan จากศูนย์กลางเช่นเดียวกับความเท่าเทียมกันของระยะทางนี้เมื่อเทียบกับความเท่าเทียมกันของความยาวอินพุต

(ขอบคุณ @Lynn ที่ -9 ไบต์และปูทางไปอีก 2 อัน)


สิ่งหนึ่งที่โผล่ออกมาคือคุณสามารถกระชับสองบรรทัดแรกเป็น l = len (input ()), ไม่?
แฟรงค์

@ Frank sถูกใช้ที่ส่วนท้ายของบรรทัดยาวดังนั้นน่าเสียดายที่ไม่สามารถทำได้
Sp3000

งูหลาม 2 จะได้รับ112 หรือ 116 ไบต์Rใช้เป็นทางเลือกที่แตกต่างกันเล็กน้อยสำหรับ
ลินน์

อาฉันไม่ได้จับคนนั้นขอโทษ
แฟรงค์

@ ลินน์โอ้ว้าวตัวเลือกนั้นหรือ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ที่น่าสนใจในช่วงครึ่งหลังสามารถกำหนดเป็น (แม้ว่าโปรแกรมแทน opts เพื่อกำหนด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

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

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

ซอ


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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.