Animate menemukan bagian tengah

10

Diberikan string yang tidak kosong, terus hapus karakter pertama dan terakhir hingga Anda mendapatkan satu atau dua karakter.

Misalnya, jika stringnya adalah abcde, program Anda harus mencetak:

abcde
 bcd
  c

Namun, jika ya abcdef, itu harus berhenti di dua karakter:

abcdef
 bcde
  cd

Mengejar baris baru dan spasi tambahan di akhir setiap baris adalah opsional. Anda dapat memiliki sebanyak yang Anda inginkan atau tidak sama sekali.

Uji kasus

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

Ingat ini adalah , jadi kode dengan jumlah byte terkecil menang.

Oliver Ni
sumber
Bisakah output menjadi daftar string, alih-alih mencetak string?
Greg Martin
@GregMartin Ya.
Oliver Ni
1
Apakah kita perlu memiliki ruang utama di setiap baris?
ETHproduk
@ EHProduk Ya.
Oliver Ni
9
@Liver Itu informasi penting, Anda harus memasukkannya ke dalam teks
Luis Mendo

Jawaban:

11

V , 10 byte

ò^llYpr $x

Cobalah online!

Penjelasan:

ò^ll         " While there are at least two non-whitespace characters on the current line
    Y        " Yank this line
     p       " Paste it below
      r      " Replace the first character with a space
        $    " Move to the end of the line
         x   " Delete a character
James
sumber
6

Python, 45 byte

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

Keluaran string secara rekursif, ditambah baris baru, ditambah spasi terkemuka untuk baris berikutnya, ditambah hasil rekursif untuk string yang diperpendek dengan ruang ekstra di awalan.

Jika baris baru terkemuka dibolehkan, kami dapat menyimpan satu byte:

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

Bandingkan dengan program (49 byte dalam Python 2):

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

ES6 (Javascript), 47, 48, 43 byte

EDIT: Operator ternary yang diganti dengan &&, string padding yang diawali dengan baris baru. Terima kasih @Neil untuk saran yang luar biasa!

EDIT: termasuk nama fungsi untuk doa rekursif, dilucuti satu byte dengan menggunakan baris baru literal

Golf

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

Uji

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
zeppelin
sumber
1
Saya perhatikan bahwa @xnor dimulai dengan psama dengan baris baru dan spasi; mungkin itu bisa membantu Anda juga.
Neil
1
Oh, dan Anda juga dapat menggunakan s&&bukan s?...:''.
Neil
4

Python 2, 50 byte

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

Fungsi rekursif sederhana yang terus memperpendek string hingga hilang.

Sebut sebagai f ('string')

Keluaran

string
 trin
  ri
ElPedro
sumber
4

Perl, 31 byte

30 byte kode + -pbendera.

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

Untuk menjalankannya:

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

Penjelasan : The \Sdan .$sesuai dengan karakter pertama dan terakhir, (.+)tengah dan ( *)ke ruang trailing yang ditambahkan setiap kali kita menghapus satu karakter dari awal. Jadi regex menghapus satu karakter dari awal, satu dari akhir, dan menambahkan satu spasi pertama setiap kali.

Dada
sumber
4

Brainfuck , 67 byte

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

Ini harus bekerja pada semua rasa brainfuck.

Cobalah online!

Kode tidak dikunci:

# 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
    >[.>]
<]

Masih harus ada beberapa byte untuk memotong di sini; Saya baru saja mulai menggunakan brainfuck, jadi pergerakan pointer saya mungkin sangat tidak efisien.

Aedan Smith
sumber
2

MATL , 9 byte

tg!*YRPRc

Ini menghasilkan spasi tambahan dan baris baru.

Cobalah online!

Penjelasan

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
Luis Mendo
sumber
2

Batch, 92 byte

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

Mengambil input pada STDIN.

Neil
sumber
2

C, 73 byte

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

Tidak Disatukan:

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

Pemakaian:

main(){
  char a[] = "abcde";
  f(a);
}
Karl Napf
sumber
2

05AB1E , 8 byte

Kode:

ÐvNú,¦¨D

Penjelasan:

Ð          # 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

Menggunakan pengkodean CP-1252 . Cobalah online!

Adnan
sumber
2

Haskell, 47 43 byte

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

Cobalah di Ideone . Output adalah daftar string yang diizinkan dalam komentar tantangan. Untuk mencetak, jalankan dengan (putStr.unlines.f)alih - alih adilf .

Sunting: Disimpan 4 byte setelah memperhatikan bahwa trailing spasi dibolehkan.

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

Perl 6 , 42 byte

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

Diperluas:

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
}
Brad Gilbert b2gills
sumber
1

GNU sed 24 Bytes

Termasuk +2 untuk -rn

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

Mencetak, mengganti karakter non-spasi pertama dengan spasi, dan menghapus karakter terakhir hingga tidak ada yang berubah.

Riley
sumber
0

C ++ 14, 117 byte

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

Mengasumsikan input s adalah std::stringdan mengembalikan teks animasi.

Tidak Disatukan:

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

Pemakaian:

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

Vim - 14 penekanan tombol

qqYp^r $x@qq@q


Penjelasan:

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 secara otomatis membunuh makro begitu kita kehabisan karakter

BlackCap
sumber
0

Jepret! - 16 blok

Jepret!

Output bersifat egois. 'Tunggu' itu untuk manusia.

wyldstallyns
sumber
0

PHP, 91 byte

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

Penggunaan: simpan dalam file dan panggilan dari browser:

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             
Mario
sumber
0

Mathematica, 71 byte

Table[#~StringTake~{i,-i},{i,Ceiling[StringLength@#/2]}]~Column~Center&

bernyawa-menemukan-tengah

ngenisis
sumber