ภาพเคลื่อนไหวหาจุดกึ่งกลาง


10

กำหนดสตริงที่ไม่ว่างให้ลบอักขระตัวแรกและตัวสุดท้ายออกจนกว่าคุณจะได้อักขระหนึ่งหรือสองตัว

ตัวอย่างเช่นถ้าเป็นสตริงabcdeโปรแกรมของคุณควรพิมพ์:

abcde
 bcd
  c

อย่างไรก็ตามหากเป็นabcdefเช่นนั้นควรหยุดที่อักขระสองตัว:

abcdef
 bcde
  cd

การขึ้นบรรทัดใหม่และการเว้นวรรคต่อท้ายที่ส่วนท้ายของแต่ละบรรทัดเป็นทางเลือก คุณสามารถมีได้มากเท่าที่คุณต้องการหรือไม่

กรณีทดสอบ

ABCDEFGHIJKLMNOPQRSTUVWXYZ -> ABCDEFGHIJKLMNOPQRSTUVWXYZ
                               BCDEFGHIJKLMNOPQRSTUVWXY 
                                CDEFGHIJKLMNOPQRSTUVWX  
                                 DEFGHIJKLMNOPQRSTUVW   
                                  EFGHIJKLMNOPQRSTUV    
                                   FGHIJKLMNOPQRSTU     
                                    GHIJKLMNOPQRST      
                                     HIJKLMNOPQRS       
                                      IJKLMNOPQR        
                                       JKLMNOPQ         
                                        KLMNOP          
                                         LMNO           
                                          MN            

ABCDEFGHIJKLMNOPQRSTUVWXYZ! -> ABCDEFGHIJKLMNOPQRSTUVWXYZ!
                                BCDEFGHIJKLMNOPQRSTUVWXYZ 
                                 CDEFGHIJKLMNOPQRSTUVWXY  
                                  DEFGHIJKLMNOPQRSTUVWX   
                                   EFGHIJKLMNOPQRSTUVW    
                                    FGHIJKLMNOPQRSTUV     
                                     GHIJKLMNOPQRSTU      
                                      HIJKLMNOPQRST       
                                       IJKLMNOPQRS        
                                        JKLMNOPQR         
                                         KLMNOPQ          
                                          LMNOP           
                                           MNO            
                                            N             

A -> A

AB -> AB

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


เอาต์พุตสามารถเป็นรายการสตริงได้แทนที่จะพิมพ์สตริงหรือไม่?
Greg Martin

@GregMartin ใช่
Oliver Ni

1
เราจำเป็นต้องมีช่องว่างนำในแต่ละบรรทัดหรือไม่?
ETHproductions

@ETHproductions ใช่
Oliver Ni

9
@Oliver นั่นเป็นข้อมูลสำคัญคุณควรรวมไว้ในข้อความ
Luis Mendo

คำตอบ:



6

Python ขนาด 45 ไบต์

f=lambda s,p='\n ':s and s+p+f(s[1:-1],p+' ')

ส่งออกสตริงซ้ำรวมกับการขึ้นบรรทัดใหม่บวกช่องว่างนำสำหรับบรรทัดถัดไปบวกผลซ้ำสำหรับสตริงที่สั้นลงที่มีพื้นที่พิเศษในคำนำหน้า

หากอนุญาตให้ขึ้นบรรทัดใหม่เราสามารถบันทึกไบต์ได้:

f=lambda s,p='\n':s and p+s+f(s[1:-1],p+' ')

เปรียบเทียบกับโปรแกรม (49 bytes ใน Python 2):

s=input();p=''
while s:print p+s;s=s[1:-1];p+=' '

6

ES6 (Javascript) 47, 48, 43 ไบต์

แก้ไข: แทนที่ผู้ประกอบการที่ประกอบไปด้วย &&, padding string นำหน้าด้วยบรรทัดใหม่ ขอบคุณ @Neil สำหรับคำแนะนำที่ยอดเยี่ยม!

แก้ไข: รวมชื่อฟังก์ชั่นสำหรับการเรียกซ้ำซ้ำถอดออกหนึ่งไบต์โดยใช้บรรทัดใหม่ตามตัวอักษร

แข็งแรงเล่นกอล์ฟ

R=(s,p=`
 `)=>s&&s+p+R(s.slice(1,-1),p+' ')

ทดสอบ

R=(s,p=`
 `)=>s&&s+p+R(s.slice(1,-1),p+' ')

console.log(R("ABCDEFGHIJKLMNOPQRSTUVWXYZ"))

ABCDEFGHIJKLMNOPQRSTUVWXYZ
 BCDEFGHIJKLMNOPQRSTUVWXY
  CDEFGHIJKLMNOPQRSTUVWX
   DEFGHIJKLMNOPQRSTUVW
    EFGHIJKLMNOPQRSTUV
     FGHIJKLMNOPQRSTU
      GHIJKLMNOPQRST
       HIJKLMNOPQRS
        IJKLMNOPQR
         JKLMNOPQ
          KLMNOP
           LMNO
            MN

console.log(R("ABCDEFGHIJKLMNOPQRSTUVWXYZ!"))

ABCDEFGHIJKLMNOPQRSTUVWXYZ!
 BCDEFGHIJKLMNOPQRSTUVWXYZ
  CDEFGHIJKLMNOPQRSTUVWXY
   DEFGHIJKLMNOPQRSTUVWX
    EFGHIJKLMNOPQRSTUVW
     FGHIJKLMNOPQRSTUV
      GHIJKLMNOPQRSTU
       HIJKLMNOPQRST
        IJKLMNOPQRS
         JKLMNOPQR
          KLMNOPQ
           LMNOP
            MNO
             N

1
ฉันสังเกตเห็นว่า @xnor เริ่มต้นด้วยpการขึ้นบรรทัดใหม่และเว้นวรรค อาจช่วยคุณได้เช่นกัน
Neil

1
Oh, และคุณยังสามารถใช้แทนs&& s?...:''
Neil

4

Python 2, 50 ไบต์

def f(i,j=0):
 print' '*j+i
 if i:f(i[1:-1],j+1)

ฟังก์ชั่นวนซ้ำง่าย ๆ ที่ทำให้สตริงสั้นลงจนกว่าจะหายไป

โทรเป็น f ('สตริง')

เอาท์พุต

string
 trin
  ri

4

Perl, 31 ไบต์

30 ไบต์ของรหัสเมือง + -pธง

s/( *)\S(.+).$/$& 
 $1$2/&&redo

วิธีเรียกใช้:

perl -pE 's/( *)\S(.+).$/$&
 $1$2/&&redo' <<< "abcdef"

คำอธิบาย : \Sและ.$สอดคล้องกับตัวอักษรตัวแรกและตัวสุดท้ายตัว(.+)ตรงกลางและ( *)ช่องว่างต่อท้ายที่เพิ่มเข้ามาทุกครั้งที่เราลบตัวละครตัวหนึ่งออกจากจุดเริ่มต้น ดังนั้น regex จะลบอักขระหนึ่งตัวจากจุดเริ่มต้นหนึ่งตัวจากจุดสิ้นสุดและเพิ่มหนึ่งช่องว่างในแต่ละครั้ง


4

Brainfuck , 67 ไบต์

>>,[.>,]<[>++++++++++.<[-]<[<]>[-]++++++++[-<++++>]<[<]>[.>]>[.>]<]

สิ่งนี้ควรใช้กับรสชาติของสมองทั้งหมด

ลองออนไลน์!

รหัสไม่ได้รับการตอบกลับ:

# Print and read input_string into memory
>>,[.>,]<
while input_string is not empty [
    # Print newline
    >+++++ +++++.<
    # Remove last character
    [-]
    # GOTO start of input_string
    <[<]>
    # Remove first character
    [-]
    # Add space to space_buffer
    +++++ +++[-<++++>]
    # GOTO start of space_buffer
    <[<]>
    # Print space_buffer
    [.>]
    # Print input_string
    >[.>]
<]

ควรจะมีบางไบต์ตัดออกที่นี่; ฉันเพิ่งเริ่มใช้ brainfuck เมื่อเร็ว ๆ นี้ดังนั้นการเคลื่อนไหวของตัวชี้ของฉันอาจไม่มีประสิทธิภาพมาก


2

MATL , 9 ไบต์

tg!*YRPRc

สิ่งนี้สร้างช่องว่างต่อท้ายและการขึ้นบรรทัดใหม่

ลองออนไลน์!

คำอธิบาย

t      % Input string implicitly. Duplicate
g!     % Convert to logical and transpose: gives a column vector of ones
*      % Multiply with broadcast. This gives a square matrix with the string's
       % ASCII codes on each row
YR     % Lower triangular part: make elements above the diagonal 0
P      % Flip vertically
R      % Upper triangular part: make elements below the diagonal 0
c      % Convert to char. Implicitly display, with char 0 shown as space

2

แบตช์, 92 ไบต์

@set/ps=
@set t=
:g
@echo %t%%s%
@set t= %t%
@set s=%s:~1,-1%
@if not "%s%"=="" goto g

ใช้อินพุตบน STDIN


2

C, 73 ไบต์

f(char*s){char*b=s,*e=s+strlen(s)-1;while(e-b>-1)puts(s),*b++=32,*e--=0;}

Ungolfed:

f(char*s) {
  char *b=s,
       *e=s+strlen(s)-1;
  while (e-b>-1)
    puts(s),
    *b++=32,
    *e--=0;
}

การใช้งาน:

main(){
  char a[] = "abcde";
  f(a);
}

2

05AB1E , 8 ไบต์

รหัส:

ÐvNú,¦¨D

คำอธิบาย:

Ð          # Triplicate the input
 v         # Length times do...
  Nú,      # Prepend N spaces and print with a newline
     ¦¨    # Remove the first and the last character
       D   # Duplicate that string

ใช้การเข้ารหัสCP-1252 ลองออนไลน์!



2

Haskell, 47 43 ไบต์

f s@(a:b:c)=s:map(' ':)(f.init$b:c)
f s=[s]

ลองบน Ideone เอาท์พุทเป็นรายการของสตริงที่ได้รับอนุญาตในความคิดเห็นของความท้าทาย หากต้องการพิมพ์วิ่งกับแทนเพียง(putStr.unlines.f)f

แก้ไข: บันทึกแล้ว 4 ไบต์หลังจากพบว่าอนุญาตให้ใช้ช่องว่างต่อท้ายได้

Prelude> (putStr.unlines.f)"codegolf"
codegolf
 odegol
  dego
   eg
               --(trailing whitespace)

2

Perl 6 , 42 ไบต์

for get,{S/\w(.*)./ $0/}.../\s..?$/ {.put}

ขยาย:

for

  # generate the sequence
  get,       # get a line from the input

  {          # bare block lambda with implicit parameter 「$_」
             # used to produce the rest of the sequence

    S/       # replace
      \w     # a word character ( to be removed )
      (      # set 「$0」
        .*   # any number of any characters
      )
      .      # any character ( to be removed )
    / $0/    # append a space

  }

  ...        # repeat that until

  /          # match
    \s       # whitespace
    .        # any character
    .?       # optional any character
    $        # end of string
  /

{
  .put       # print $_ with trailing newline
}

1

GNU ทำงาน 24 ไบต์

รวมถึง +2 สำหรับ -rn

:
p
s/[^ ](.+)./ \1/
t

พิมพ์แทนที่อักขระที่ไม่ใช่ช่องว่างแรกด้วยช่องว่างและลบอักขระสุดท้ายจนกระทั่งไม่มีอะไรเปลี่ยนแปลง



0

C ++ 14, 117 ไบต์

auto f(auto s){decltype(s)r;auto b=s.begin();auto e=s.rbegin();while(e.base()-b>0)r+=s+"\n",*b++=32,*e++=0;return r;}

ถือว่าอินพุตsเป็นstd::stringและส่งคืนข้อความภาพเคลื่อนไหว

Ungolfed:

auto f(auto s){
  decltype(s)r;
  auto b=s.begin();
  auto e=s.rbegin();
  while(e.base()-b>0){
    r+=s+"\n";
    *b++=32;
    *e++=0;
  }
  return r;
}

การใช้งาน:

main(){
  std::string a{"abcdef"};
  std::cout << f(a);
  std::string b{"abcde"};
  std::cout << f(b);
}

0

Vim - 14 การกดแป้น

qqYp^r $x@qq@q


คำอธิบาย:

qq  -- record a macro named 'q'
Y   -- Copy current line
p   -- Paste it
^r  -- Replace the first non-space character on the new line with a space
$x  -- Delete the last character on the line
@q  -- Recursively call the 'q' macro
q   -- Stop recording the 'q' macro
@q  -- Run the 'q' macro

Vim จะฆ่ามาโครโดยอัตโนมัติเมื่อตัวละครของเราหมด



0

PHP, 91 ไบต์

<?for(;$i<.5*$l=strlen($s=$_GET[s]);$i++)echo str_pad(substr($s,$i,$l-$i*2),$l," ",2)."\n";

การใช้งาน: บันทึกในไฟล์และโทรจากเบราว์เซอร์:

http://localhost/codegolf/string-middle.php?s=ABCDEFGHIJKLMNOPQRSTUVWXYZ

Raw output:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
 BCDEFGHIJKLMNOPQRSTUVWXY 
  CDEFGHIJKLMNOPQRSTUVWX  
   DEFGHIJKLMNOPQRSTUVW   
    EFGHIJKLMNOPQRSTUV    
     FGHIJKLMNOPQRSTU     
      GHIJKLMNOPQRST      
       HIJKLMNOPQRS       
        IJKLMNOPQR        
         JKLMNOPQ         
          KLMNOP          
           LMNO           
            MN            


http://localhost/codegolf/string-middle.php?s=1ABCDEFGHIJKLMNOPQRSTUVWXYZ

Raw output:
1ABCDEFGHIJKLMNOPQRSTUVWXYZ
 ABCDEFGHIJKLMNOPQRSTUVWXY 
  BCDEFGHIJKLMNOPQRSTUVWX  
   CDEFGHIJKLMNOPQRSTUVW   
    DEFGHIJKLMNOPQRSTUV    
     EFGHIJKLMNOPQRSTU     
      FGHIJKLMNOPQRST      
       GHIJKLMNOPQRS       
        HIJKLMNOPQR        
         IJKLMNOPQ         
          JKLMNOP          
           KLMNO           
            LMN            
             M             

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