Animare trovando il mezzo


10

Dato una stringa non vuota, continua a rimuovere il primo e l'ultimo carattere fino a raggiungere uno o due caratteri.

Ad esempio, se la stringa fosse abcde, il tuo programma dovrebbe stampare:

abcde
 bcd
  c

Tuttavia, se lo fosse abcdef, dovrebbe fermarsi a due caratteri:

abcdef
 bcde
  cd

Le nuove righe finali e gli spazi finali alla fine di ogni riga sono facoltativi. Puoi averne quanti ne vuoi o nessuno.

Casi test

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

Ricorda che questo è , quindi vince il codice con il minor numero di byte.


L'output può essere un elenco di stringhe invece di stampare le stringhe?
Greg Martin,

@GregMartin Sì.
Oliver Ni,

1
Dobbiamo avere gli spazi iniziali su ogni linea?
ETHproductions

@ETHproductions Sì.
Oliver Ni,

9
@Oliver Queste sono informazioni importanti, dovresti includerle nel testo
Luis Mendo,

Risposte:


11

V , 10 byte

ò^llYpr $x

Provalo online!

Spiegazione:

ò^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

6

Python, 45 byte

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

Emette in modo ricorsivo la stringa, più una nuova riga, più gli spazi iniziali per la riga successiva, oltre al risultato ricorsivo per la stringa accorciata con uno spazio aggiuntivo nel prefisso.

Se fosse consentita una nuova riga iniziale, potremmo salvare un byte:

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

Confronta con un programma (49 byte in Python 2):

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

6

ES6 (Javascript), 47, 48, 43 byte

EDIT: Sostituito operatore ternario con &&, stringa di imbottitura prefissata con la nuova riga. Grazie @Neil per un eccellente consiglio!

EDIT: incluso il nome della funzione per l'invocazione ricorsiva, cancellato di un byte usando una nuova riga letterale

golfed

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

Test

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
Noto che @xnor inizia con puguale a una nuova riga e uno spazio; forse potrebbe aiutare anche te.
Neil,

1
Oh, e puoi anche usare al s&&posto di s?...:''.
Neil,

4

Python 2, 50 byte

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

Semplice funzione ricorsiva che accorcia la stringa finché non scompare.

Chiama come f ('stringa')

Produzione

string
 trin
  ri

4

Perl, 31 byte

30 byte di codice + -pflag.

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

Per eseguirlo:

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

Spiegazioni : The \Se .$corrispondono al primo e ultimo carattere, (.+)al centro e ( *)agli spazi finali che vengono aggiunti ogni volta che rimuoviamo un carattere dall'inizio. Quindi la regex rimuove un carattere dall'inizio, uno dalla fine e aggiunge uno spazio iniziale ogni volta.


4

Brainfuck , 67 byte

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

Questo dovrebbe funzionare su tutti i gusti di brainfuck.

Provalo online!

Codice non golfato:

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

Dovrebbero esserci ancora alcuni byte da tagliare qui; Ho iniziato a usare Brainfuck solo di recente, quindi il mio movimento del puntatore è probabilmente molto inefficiente.


2

MATL , 9 byte

tg!*YRPRc

Questo produce spazi finali e newline.

Provalo online!

Spiegazione

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

Lotto, 92 byte

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

Accetta input su STDIN.


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

Ungolfed:

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

Uso:

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

2

05AB1E , 8 byte

Codice:

ÐvNú,¦¨D

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online!



2

Haskell, 47 43 byte

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

Provalo su Ideone . L'output è un elenco di stringhe consentite nei commenti della sfida. Per stampare, esegui (putStr.unlines.f)invece di solo f.

Modifica: salvato 4 byte dopo aver notato che è consentito lo spazio bianco finale.

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

2

Perl 6 , 42 byte

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

Allargato:

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 sed 24 byte

Include +2 per -rn

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

Stampa, sostituisce il primo carattere non spaziale con uno spazio ed elimina l'ultimo carattere fino a quando non cambia nulla.



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

Suppone che input ssia a std::stringe restituisca il testo animato.

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

Uso:

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

0

Vim - 14 battiture

qqYp^r $x@qq@q


Spiegazione:

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 uccide automaticamente la macro una volta esauriti i personaggi


0

Snap! - 16 blocchi

Snap!

L'output è autocentrante. L'attesa è per gli umani.


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

Utilizzo: salva in un file e chiama dal 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             

0

Mathematica, 71 byte

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

animato-finding-the-middle

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.