Ho fatto una nave spaziale maw!


39

Introduzione:

Ispirato da questo commento di @MagicOctopusUrn su @Emigna risposta 05AB1E s' per il mio ' E 'stato solo un bug ' sfida :

8F9ÝÀNð×ý}».∊Ho fatto una nave spaziale maw! Ed ero entusiasta di suggerire una modifica a 12 byte. - Magic Octopus Urn, 17 luglio 17 alle 20:10

Che è un programma 05AB1E (legacy) che risulta in questo:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

Provalo online.

Sfida:

Input: una stringa non vuota

Output: dall'esterno verso l'interno, aggiungi uno spazio in più tra ogni carattere ogni riga, simile a quanto fatto nell'output sopra, uguale a length - 1. Quindi per un input 1234567890l'output sarebbe effettivamente questo invece:

1234567890
1 2 3 4 5 6 7 8 9 0
1  2  3  4  5  6  7  8  9  0
1   2   3   4   5   6   7   8   9   0
1    2    3    4    5    6    7    8    9    0
1     2     3     4     5     6     7     8     9     0
1      2      3      4      5      6      7      8      9      0
1       2       3       4       5       6       7       8       9       0
1        2        3        4        5        6        7        8        9        0
1         2         3         4         5         6         7         8         9         0
1        2        3        4        5        6        7        8        9        0 
1       2       3       4       5       6       7       8       9       0
1      2      3      4      5      6      7      8      9      0
1     2     3     4     5     6     7     8     9     0
1    2    3    4    5    6    7    8    9    0
1   2   3   4   5   6   7   8   9   0
1  2  3  4  5  6  7  8  9  0
1 2 3 4 5 6 7 8 9 0
1234567890

Perché? La lunghezza di 1234567890è 10. Quindi iniziamo emettendo 10 linee: la prima linea senza spazi; secondo con un delimitatore di spazio; terzo con due; ecc. E poi (senza avere la linea mediana con length - 1spazi duplicati), torniamo all'input iniziale mentre scendiamo.

Regole della sfida:

  • L'immissione è garantita come non vuota (una lunghezza >= 1). (Per gli input a carattere singolo abbiamo semplicemente emesso quel carattere.)
  • È consentita qualsiasi quantità di spazi finali / iniziali / nuove righe, purché l'output stesso (ovunque sullo schermo) sia corretto. (Anche le righe vuote tra le righe di output non sono consentite.)
  • L'input conterrà solo caratteri ASCII stampabili esclusi gli spazi bianchi (intervallo di punti di codice [33, 126])
  • L'I / O è flessibile. L'input può essere preso come parametro STDIN, argomento o funzione. Può essere un elenco / matrice / flusso di caratteri anziché stringa. L'output può anche essere un elenco / matrice / flusso di caratteri anziché stringhe; può essere stampato su STDOUT; restituito come stringa delimitata da nuova riga; eccetera.

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Per la tua risposta valgono regole standard , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite .
  • Se possibile, aggiungi un link con un test per il tuo codice.
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

Casi test:

Input: @
Output:
@

Input: test
Output:
test
t e s t
t  e  s  t
t   e   s   t
t  e  s  t
t e s t
test

Input: ?!
Output:
?!
? !
?!

Input: Spaceship
Output:
Spaceship
S p a c e s h i p
S  p  a  c  e  s  h  i  p
S   p   a   c   e   s   h   i   p
S    p    a    c    e    s    h    i    p
S     p     a     c     e     s     h     i     p
S      p      a      c      e      s      h      i      p
S       p       a       c       e       s       h       i       p
S        p        a        c        e        s        h        i        p
S       p       a       c       e       s       h       i       p
S      p      a      c      e      s      h      i      p
S     p     a     c     e     s     h     i     p
S    p    a    c    e    s    h    i    p
S   p   a   c   e   s   h   i   p
S  p  a  c  e  s  h  i  p
S p a c e s h i p
Spaceship

Input: 05AB1E
Output:
05AB1E
0 5 A B 1 E
0  5  A  B  1  E
0   5   A   B   1   E
0    5    A    B    1    E
0     5     A     B     1     E
0    5    A    B    1    E
0   5   A   B   1   E
0  5  A  B  1  E
0 5 A B 1 E
05AB1E

Input: )}/\
Output:
)}/\
) } / \
)  }  /  \
)   }   /   \
)  }  /  \
) } / \
)}/\

1
Diventa tutto nervoso !!! SPAZIO !!!
WallyWest,

1
Sapevo di aver riconosciuto quell'output. Adoro che questa idea sia ancora attiva.
Carcigenicate,

2
A proposito, riconosci vagamente uno schema in una domanda, ಠ_ಠpoi ti rendi conto che è perché l'hai realizzato accidentalmente un anno fa ಠ⌣ಠ.
Magic Octopus Urn,

1
@MagicOctopusUrn Grazie per l'ispirazione. ; D
Kevin Cruijssen,

3
@KevinCruijssen grazie per aver mantenuto la citazione sciocca ahah!
Magic Octopus Urn,

Risposte:


11

Japt , 8 6 byte

Accetta l'input come una matrice di caratteri, genera una matrice di stringhe.

£qYçÃê

Provalo


Spiegazione

£          :Map each element at (0-based) index Y
 q         :  Join input with
  Yç       :   Space repeated Y times
    Ã      :End Map
     ê     :Palindromise

Originale, 8 byte

L'I / O è una stringa. Usa la -Rbandiera. Include spazi finali su ogni riga.

¬£múYÄÃê

Provalo

Spiegazione

             :Implicit input of string U
¬            :Split
 £           :Map each character at 0-based index Y
  m          :  Map original U
   ú         :    Right pad with spaces to length ...
    YÄ       :     Y+1
      Ã      :End map
       ê     :Palindromise
             :Implicitly join with newlines

S.ç()FTW ancora una volta :-)
ETHproductions

1
Domanda seria: sarebbe possibile cercare in modo iterativo in tutte le soluzioni lunghe da 1 a 6 byte un puzzle come questo?
filip

2
@filip No: ci sono più di 256 ** 6 = 281474976710656 (almeno ingenui) combinazioni. È come indovinare una password.
Kirill Bulygin,

3
@KirillBulygin, ci sono oltre 37 trilioni (37.764.717.485.592) possibili modi di combinare i caratteri disponibili in Japt in una stringa tra 1 e 6 caratteri. Se includi tutti gli altri caratteri da 1 byte che possono essere utilizzati in letterali di stringa o stringhe compresse, tale numero aumenta a oltre 276 trilioni (276.024.445.697.280). Quindi, no, scrivere un bot per generare tutti questi quindi filtrare i programmi Japt validi quindi trovare quello (se presente) che funziona per la sfida in questione probabilmente non sarebbe fattibile. Inoltre, dov'è il divertimento nel lasciare che un robot faccia il golf per te ?!
Shaggy

6
@Shaggy: "dov'è il divertimento nel lasciare che un robot faccia il golf per te ?!" E se rendessi il bot davvero, davvero corto?
Pensando in modo strano il

11

R , 105 99 85 84 79 byte

-6 grazie a @Kevin Cruissen e @Giuseppe

-14 dal passaggio a un metodo basato su regex

-1 grazie a @Giuseppe

-5 grazie a @digEmALl

function(w,n=nchar(w)-1)write(trimws(Map(gsub,"",strrep(" ",n-abs(n:-n)),w)),1)

Provalo online!


Puoi giocare a golf a 1 byte rimuovendo lo spazio in in(r<-.
Kevin Cruijssen,

1
e lo usi solo suna volta in modo da poterlo usare writedirettamente come argomento ; portandoti giù a 99 byte
Giuseppe

1
dovrebbe essere un 1piuttosto che un ""in write? Sto scavando il tuo uso di Map!
Giuseppe,


1
Ero convinto di poterlo battere con l' collapseargomento, pastema non sta succedendo ...
JDL


6

Carbone , 10 byte

Eθ⪫θ× κ‖O↓

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

Eθ          Map over characters of input string
  ⪫θ        Join characters of input string using
    ×       a literal space repeated 
      κ     current index number of times
            Implicitly print each result on its own line
       ‖O↓  Reflect vertically with overlap

Carbone non riflette le cose come [a ]- o è che un altro comando separato?
Magic Octopus Urn,

@MagicOctopusUrn Ci sono comandi separati se vuoi trasformare il riflesso. Vedere ad esempio codegolf.stackexchange.com/a/127164 .
Neil,

Pensavo di averlo visto riflettere prima, ma non ne ero sicuro. ! Neat
Magic Octopus Urn,


6

Python 2 , 72 70 68 66 65 byte

-2 byte grazie a Kevin Cruijssen
-3 byte grazie agli ovs

w=input();c=s=-1
while c:print(' '*~c).join(w);s*=w[:c]>'';c+=s|1

Provalo online!


c==len(w)-1può essere giocato a golf di 1 byte con c+2>len(w). EDIT: nella tua nuova versione da 70 byte, 0<cpuò essere c.
Kevin Cruijssen,

6

05AB1E , 10 9 byte

1 byte salvato grazie a Adnan

εINð×ý}û»

Provalo online!

Spiegazione

ε            # apply to each in input
 I           # push the input
  Nð×        # push <index> spaces
     ý       # merge the input on the spaces
      }      # end loop
       û     # palendromize
        »    # join on newlines

Puoi rilasciare il S. L'input è flessibile, quindi è consentito inserire come elenco.
Kevin Cruijssen,

1
@KevinCruijssen: la tua prima versione è di 9 byte in eredità, come si »può omettere.
Emigna,

1
Il tuo funziona effettivamente nell'eredità in 9 byte anche se rimuovi »e cambi il ciclo vin una mappa ε.
Kevin Cruijssen,

1
Ha pubblicato la risposta . E attualmente Japt ci sta battendo con 6 byte, temo. O intendevi il più corto in 05AB1E (riscrittura elisir) e 05AB1E (eredità Python)? :)
Kevin Cruijssen il

2
Funziona εINð×ý}û»anche?
Adnan,

5

Rubino , 54 49 byte

->a{(-(z=a.size-1)..z).map{|i|a*(?\s*(z-i.abs))}}

Provalo online!

Prende l'input come una matrice di caratteri, genera una matrice di stringhe.


4

Japt , 9 8 byte

-1 byte da @Shaggy

ÊƬqXîÃê

ÊƬqXîÃê        Full program, implicity input U
ÊÆ              Rage from 0 to U length and map
  ¬             split U at ""
   qXîà     join U using " " times range current value
        ê       horizontal mirror

Provalo online!


Dang; sembra che tu mi abbia distrutto di nuovo! Fammi sapere se vuoi che io elimini il mio.
Shaggy

1
@Shaggy no, mantieni la tua risposta, stai usando l'array come input mentre io uso una stringa, quindi sono un po 'diversi xD
Luis felipe De jesus Munoz

1
SpX-> per un risparmio di 1 byte.
Shaggy

4

PowerShell , 66 54 byte

-12 byte grazie a mazzy

0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}

Provalo online!

Riceve input tramite splatting, che su TIO si manifesta come argomenti della riga di comando separati per ciascun carattere.

Innanzitutto impostiamo $a=$argscome argomento di input. Quindi impostiamo $xuguale al .countdi quella matrice -1. Abbiamo quindi bisogno di scorrere le lettere per costruire l'astronave. Questo viene fatto costruendo un intervallo da 0a $x, quindi di $xnuovo a 0, quindi usandoGet-Unique per estrarre solo l'intervallo appropriato.

Ogni iterazione, prendiamo i nostri argomenti di input e -joinloro insieme al numero corrispondente di spazi. Ognuna di queste stringhe viene lasciata sulla pipeline e un implicito Write-Outputci dà nuove righe gratis al completamento del programma.


Prova questo:0..($x=($a=$args).count-1)+$x..0|gu|%{$a-join(' '*$_)}
mazzy

1
@mazzy Cosa ... come Get-Uniquefunziona così sulla gamma? Questo è pazzesco! Grazie!
AdmBorkBork,

4

05AB1E (legacy) , 9 byte

εINúíJ}û»

Immettere come elenco di caratteri.

Provalo online o verifica tutti i casi di test .

Spiegazione:

ε     }    # Map each character in the input to:
 I         #  Take the input
  Nú       #  Prepend each with the 0-indexed amount of spaces
           #   i.e. ["t","e","s","t"] & 3 → ["   t","   e","   s","   t"]
    í      #  Reverse each item
           #   i.e. ["   t","   e","   s","   t"] → ["t   ","e   ","s   ","t   "]
     J     #  Join them together to a single string
           #   i.e. ["t   ","e   ","s   ","t   "] → "t   e   s   t   "
       û»  # Palindromize the list, and join by newlines
           #  i.e. ["test","t e s t ","t  e  s  t  ","t   e   s   t   "]
           #   → "test\nt e s t \nt  e  s  t  \nt   e   s   t   \nt  e  s  t  \nt e s t \ntest"

1
Oooooo, anche questo non è valida perché specchio cambia l'orientamento / a \ quando il mirroring, lo stesso con [, ]e (, ). Potrebbe voler aggiungere anche questi casi per catturare carbone. (Spostato gli altri commenti sulla risposta di Emigna, perché era la risposta che avevo originariamente commentato)
Magic Octopus Urn

@MagicOctopusUrn Grazie per avermelo fatto notare. Risolto il problema utilizzando û»invece di .∊.
Kevin Cruijssen,

4

Haskell , 60 59 byte

(init<>reverse).(scanl(?)<*>tail)
a?_=do u<-a;u:[' '|' '<u]

Provalo online!

Spiegazione

Per una stringa (ad es. "abc") Applichiamo prima

scanl (?) <*> tail

che è lo stesso di

\str -> scanl (?) str (tail str)

Questo si applica ripetutamente (?)(accoda uno spazio a ciascun carattere nell'intervallo [33 ..] ) strfino a quando ci sono tante stringhe comestr sono i caratteri:["abc","a b c ", "a b c "]

Ora dobbiamo solo concatenare il risultato (meno l'ultimo elemento) con la sua controparte invertita:

init<>reverse

4

MATL , 25 22 13 byte

zZv"Gtz@he!1e

Provalo online!

Grazie a Luis Mendo per aver suggerito un golf da 5 byte, che mi ha ispirato a radere altri 4 byte!

Spiegazione, con input di esempio 'abc':

         # Implicit input, 'abc'
z        # find number of nonzero elements (length of string)
         # stack: [3]
Zv       # symmetric range
         # stack: [[1 2 3 2 1]]
"        # begin for loop, iterating over [1 2 3 2 1] as the loop indices
G        # push input
         # stack: ['abc']
tz       # dup and push length
         # stack: ['abc', 3]
@        # push loop index, i (for example, 2)
         # stack: ['abc', 3, 2]
h        # horizontally concatenate
         # stack: ['abc', [3, 2]]
e!       # reshape to matrix of 3 rows and i columns, padding with spaces, and transpose
         # stack: [['abc';'   ';'   ']]
1e       # reshape to matrix of 1 row, leaving last value on stack
         # stack: ['a  b  c  ']
         # implicit end of for loop
         # implicit end of program, display stack contents

3

Gelatina , 9 byte

jⱮLḶ⁶ẋƲŒḄ

Provalo online!

Restituisce un elenco di righe; output preimpostato su TIO.


Un po 'diversa 9: ,€⁶$LСŒḄ. Altri, più simili, 9: J’⁶ẋŒḄɓjⱮe J’⁶ẋŒḄjⱮ@(stavo cercando più brevi ma ancora nessuna gioia)
Jonathan Allan

@JonathanAllan Sono abbastanza sicuro che sia ottimale, non credo che ci sia un modo più breve di scrivere LḶ⁶ẋo ŒḄ. Tuttavia, se riesci a trovare un salvataggio, eseguimi il ping. :-)
Erik the Outgolfer

Pensandoci un po ', il mio ,€⁶$LСŒḄpotrebbe non essere valido poiché ha un annidamento pazzo, quindi potrebbe essere necessario unY programma completo.
Jonathan Allan

@JonathanAllan Sì, certo che no. ['I', 'f', [[' '], 't', 'h', [['i']], 's'], ' ', 'i', ['s', ' '], 'a', [[' ', 's', 't'], 'r', ['i', 'n', 'g'], ' '], 'w', ['e', ' ', 'a', 'r', 'e'], ' ', 'd', 'o', ['o'], 'm', [[[[['e']]]]], [[[['d']]]], '!']Almeno ho superato il 05AB1E ...
Erik the Outgolfer il

Ho detto che ho superato il 05AB1E, eh? Bah, non più. : /
Erik the Outgolfer,

3

Pyth , 12 byte

Solo la mia presentazione obbligatoria di Pyth. Sono abbastanza orgoglioso di questo, quindi una spiegazione probabilmente arriverà presto.

+P_=jRQ*L;_U

Provalo qui!

+P_=jRQ_.e*d

Provalo qui!


3

Stax , 10 byte

Ç·9ƒù▌╘Ä┘e

Esegui ed esegui il debug

Output con spazi vuoti finali su ogni riga.

Spiegazione:

%R|pmx{]n(m Full program, unpacked, implicit input
%           Length of input
 R          1-based range
  |p        Palindromize
    m       Map:
     x{   m   Map over characters of input:
       ]        Character -> string
        n(      Right-pad to length given by outer map value
              Implicit flatten and output


3

K (oK) , 25 24 byte

Soluzione:

,/'(1+a,1_|a:!#x)$\:+,x:

Provalo online!

Spiegazione:

Porta della mia soluzione K4 :

,/'(1+a,1_|a:!#x)$\:+,x: / the solution
                      x: / save input as x
                     ,   / enlist
                    +    / flip
                 $\:     / pad ($) right by each-left (\:)
   (            )        / do this together
              #x         / count length of input,           e.g. 3
             !           / range 0..length,                 e.g. 0 1 2
           a:            / save as a
          |              / reverse it,                      e.g. 2 1 0
        1_               / drop first,                      e.g. 1 0
      a,                 / join to a,                       e.g. 0 1 2 1 0
    1+                   / add 1,                           e.g. 1 2 3 2 1
,/'                      / flatten (,/) each (')

Gli appunti:

  • -1 byte grazie a ngn

1
,:'-> +,
ngn,

2

Pascal (FPC) , 143 135 byte

var s:string;i,j,l:word;begin read(s);l:=length(s);repeat i:=i+1;for j:=1to l do write(s[j],'':l-abs(l-i)-1);writeln until i=l*2-1 end.

Provalo online!

Probabilmente vincerò solo contro Lenguage ...


2

PHP, 88 89 byte

for(;++$i<2*$e=count($a=str_split($argn));)echo join(str_pad("",~-$e-abs($i-$e)),$a),"\n";

richiede PHP 5 o successivo per str_split. Esegui come pipe -nRo provalo online .


Temo che il tuo link di prova online fornisca un output errato. Nel tuo output tutte le righe hanno anche spazi iniziali, anziché solo tra caratteri (o facoltativamente finali). Il primo carattere dovrebbe trovarsi tutti nella stessa colonna nell'output.
Kevin Cruijssen,

1
@KevinCruijssen Non ha guardato l'output abbastanza vicino. Fisso. (Anche se imo la mia uscita precedente sembrava più un razzo) ;-)
Tito

Mi è sembrato la testa di una freccia. : D Ma +1 ora che è stato risolto.
Kevin Cruijssen,

Se si inserisce una nuova riga effettiva anziché \ n, si salva un byte :)
Martijn

@Martijn In realtà ho contato solo un byte per esso ... ho dimenticato di sostituirlo quando ho incollato il codice qui.
Tito,

2

K4 , 23 byte

Soluzione:

,/'(1+a,1_|a:!#x)$\:$x:

Esempio:

q)k),/'(1+a,1_|a:!#x)$\:$x:"Spaceship"
"Spaceship"
"S p a c e s h i p "
"S  p  a  c  e  s  h  i  p  "
"S   p   a   c   e   s   h   i   p   "
"S    p    a    c    e    s    h    i    p    "
"S     p     a     c     e     s     h     i     p     "
"S      p      a      c      e      s      h      i      p      "
"S       p       a       c       e       s       h       i       p       "
"S        p        a        c        e        s        h        i        p        "
"S       p       a       c       e       s       h       i       p       "
"S      p      a      c      e      s      h      i      p      "
"S     p     a     c     e     s     h     i     p     "
"S    p    a    c    e    s    h    i    p    "
"S   p   a   c   e   s   h   i   p   "
"S  p  a  c  e  s  h  i  p  "
"S p a c e s h i p "
"Spaceship"

Spiegazione:

Ha uno spazio bianco finale su ogni riga.

,/'(1+a,1_|a:!#x)$\:$x: / the solution
                     x: / save input as x,                 e.g. "abc"
                    $   / string,                          e.g. (,"a";,"b";,"c")
                 $\:    / pad ($) right by each-left (\:)
   (            )       / do this together
              #x        / count length of input,           e.g. 3
             !          / range 0..length,                 e.g. 0 1 2
           a:           / save as a
          |             / reverse it,                      e.g. 2 1 0
        1_              / drop first,                      e.g. 1 0
      a,                / join to a,                       e.g. 0 1 2 1 0
    1+                  / add 1,                           e.g. 1 2 3 2 1
,/'                     / flatten each

2

C #, 113 105 98 byte

s=>{for(int l=s.Length,i=-l;++i<l;)WriteLine(Join("",s.Select(c=>$"{c}".PadRight(i<0?l+i:l-i))));}

Provalo online!


Ciao. Attualmente la tua risposta è uno snippet anziché una funzione o un programma completo. Questo può essere risolto a buon mercato aggiungendo s=>{prima e }dopo per renderlo una funzione lambda. Inoltre, una cosa da golf è rimuovere le staffe attorno al for-loop. Provalo online.
Kevin Cruijssen,

@KevinCruijssen Grazie! Ho dimenticato di sistemarlo prima di pubblicare ...
RobIII,

2

Scala , 82 byte

for(i<-(0 to a.size)union(-a.size to 0))println(a.map(_+" "*Math.abs(i)).mkString)

Provalo online

Scala ha molte scorciatoie che mi stanno aiutando qui ed è abbastanza leggibile! Prova Scala


Ciao, benvenuto in PPCG! Sebbene sia una bella risposta, temo che due cose siano leggermente errate. La linea con il maggior numero di spazi dovrebbe essere emessa una sola volta nel mezzo anziché due volte. E attualmente si stampa da 0a lengthquantità di spazi, anziché 0a length-1quantità di spazi. Non conosco troppo bene Scala, ma sembra che tu possa risolvere entrambi i problemi con +4 byte (86 byte in totale) in questo modo: for(i<-(0 to a.size-1)union(-a.size+2 to 0))println(a.map(_+" "*Math.abs(i)).mkString)Ancora benvenuto, e goditi il ​​tuo soggiorno! :)
Kevin Cruijssen,

2

Oracle SQL, 115 byte

Non è una lingua da golf ma ...

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))FROM t CONNECT BY LEVEL<2*LENGTH(v)

Supponendo che il valore sia nella colonna vdella tabella t:

SQL Fiddle

Oracle 11g R2 Schema Setup :

CREATE TABLE t ( v ) AS
  SELECT 'test' FROM DUAL;

Query 1 :

SELECT TRIM(REGEXP_REPLACE(v,'(.)',LPAD('\1',1+LENGTH(v)-ABS(LEVEL-LENGTH(v)))))
FROM   t
CONNECT BY LEVEL<2*LENGTH(v)

risultati :

(SQLFiddle stampa i valori allineati a destra nella colonna per qualche motivo ... non ci sono spazi iniziali)

| TRIM(REGEXP_REPLACE(V,'(.)',LPAD('\1',1+LENGTH(V)-ABS(LEVEL-LENGTH(V))))) |
|---------------------------------------------------------------------------|
|                                                                      test |
|                                                                   t e s t |
|                                                                t  e  s  t |
|                                                             t   e   s   t |
|                                                                t  e  s  t |
|                                                                   t e s t |
|                                                                      test |

I risultati del tuo SQL Fiddle sembrano avere solo spazi tra i caratteri? Vedi questo screenshot . Presumo che ciò sia dovuto a SQL Fiddle e funziona localmente? A proposito, non sei sicuro che SQL utilizzi le regole regex standard, ma puoi (.)giocarci .usando \0invece di \1come potresti ad esempio in Java? EDIT: Non importa, questo è per $0, non \0.. ( esempio Java di ciò che intendevo dire ).
Kevin Cruijssen,

1
@KevinCruijssen Fai clic sulla freccia giù accanto al pulsante "Esegui SQL" e modifica l'output in "Output in testo normale" o "Output markdown" e vedrai gli spazi.
MT0

Grazie. Sembra davvero buono in quel caso!
Kevin Cruijssen,

2

8086 codice macchina, 56 53 byte

00000000  bf 35 01 57 ba 01 00 52  be 82 00 b3 ff ac 59 51  |.5.W...R......YQ|
00000010  aa 3c 0d 74 07 b0 20 e2  f7 43 eb f1 b0 0a aa 59  |.<.t.. ..C.....Y|
00000020  00 d1 e3 08 38 cb d6 08  c2 51 eb dc c6 05 24 5a  |....8....Q....$Z|
00000030  b4 09 cd 21 c3                                    |...!.|
00000035

Montato da:

org 0x100
use16
        mov di, buffer
        push di
        mov dx, 1
        push dx
nextl:  mov si, 0x82
        mov bl, -1
nextc:  lodsb
        pop cx
        push cx
stor:   stosb
        cmp al, 0x0d
        je cr
        mov al, ' '
        loop stor
        inc bx
        jmp nextc
cr:     mov al, 0x0a
        stosb
        pop cx
        add cl, dl
        jcxz done
        cmp bl, cl
        salc
        or dl, al
        push cx
        jmp nextl
done:   mov [di], byte '$'
        pop dx
        mov ah, 0x09
        int 0x21
        ret
buffer:

Caso di prova:

screenshot


Ciao. Suppongo che non sia stato compilato online per il codice macchina 8086, ma potresti forse aggiungere uno screenshot dell'output per uno dei casi di test? Quindi posso verificare se tutto è corretto. :)
Kevin Cruijssen,

Fatto. Anche rasato un altro byte :)
user5434231

Grazie per lo screenshot! Sfortunatamente c'è un piccolo errore nell'output. La linea di mezzo ora ha una lengthquantità di spazi e ci sono 9 linee in totale, ma la linea di mezzo dovrebbe avere una length-1quantità di spazi e dovrebbero esserci invece un totale di 7 linee (per la parola di 4 lettere 'test' ') ..: (Spero che non sia troppo costoso in termini di byte da correggere?
Kevin Cruijssen,

1
Oh capisco. Ora è stato risolto, l'ho persino ridotto di un altro byte.
user5434231

2

Haskell, 64 60 59 byte

(""#)
a#s|l<-(:a)=<<s,w<-' ':a=l:[x|w<(' '<$s),x<-w#s++[l]]

Provalo online!

a#s                         -- take a string of spaces 'a' and the input string 's'
 |l<-(:a)=<<s               -- let 'l' be the current line, i.e. the spaces in 'a'
                            -- appended to each char in 's'
  w<-' ':a                  -- let 'w' be 'a' with an additional space   
 =l                         -- return that 'l'
   :[   |w<(' '<$s)   ]     -- and, if 'w' is shorter than 's',
     x  ,x<-w#s++[l]        -- followed by a recursive call with 'w' 
                            -- and by another copy of 'l'

(""#)                       -- start with an empty 'a'

2

Bash , 115 , 109 , 105 , 100 , 97 , 96 , 92 , 91 , 90 byte

-5 e -3 grazie a Kevin Cruissen

read s;for((c=f=1;f;c-=2*(f>=${#s}),f+=c))
{ printf '%-'${f}'.c' `grep -o .<<<"$s"`
echo
}

Provalo online!


Nota che, poiché il \è un char fuga conchiglia, il banco di prova )}/\deve essere introdotto con un extra \in questo modo: )}/\\.


Ciao. È possibile aggiungere un collegamento TIO con casi di test? Inoltre, non conosco molto bene Bash, ma è possibile rimuovere gli spazi dopo ine printfcome in Python?
Kevin Cruijssen,

1
@KevinCruijssen, grazie, vedi risposta rivista. Sono nuovo di TIO-link , tuttavia, e non sono sicuro di come utilizzare più casi di test, poiché questo bashcodice immette solo una stringa ( ovvero solo una riga). Tutti i casi di test funzionano comunque, anche se )}/\ devono essere citati singolarmente in questo modo <<< ')}/\' read s; ...etc. . Gli spazi dopo ine printfsono necessari.
agc,

Grazie. E un singolo test case per TIO va bene. È principalmente per verificare se tutto funziona come previsto, il che sembra davvero il caso. +1 da me. :)
Kevin Cruijssen,

1
Nella tua nuova versione puoi giocare a golf con altri 5 byte in questo modo . Gli spazi dopo fore dopossono essere rimossi. f=1può essere modificato in c=f=1. E f=f+cpuò essere f+=c.
Kevin Cruijssen,

1
Oh, un'altra piccola cosa da giocare a golf. Non ero sicuro che fosse possibile in Bash, ma a quanto pare (un motivo in più per cui un TIO-link è utile;)), sta cambiando f!=0in fnel for-loop. Proprio come in JavaScript e Python, 0è falso e ogni altro numero intero positivo / negativo è apparentemente vero in Bash.
Kevin Cruijssen,

2

Perl 6 , 43 byte

{(0....comb-1...0)>>.&{join ' 'x$^a,.comb}}

Provalo online!

Restituisce un elenco di righe.

Spiegazione:

 {                                         }  # Anonymous code block
  (0....comb-1...0) # A list from
   0                  # 0
    ...               # to
       .comb-1        # the length of the input string -1
              ...     # back to
                 0    # 0
                   >>.&{                  }  # Map each number to
                        join        ,.comb   # Join the list of characters
                             ' 'x$^a         # With the number of spaces

2

C (gcc) , 131 129 111 byte

i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Provalo online!

-20 byte grazie a ceilingcat !

#import<string.h>
i;x;f(k,j)char*k,*j;{x=strlen(k)-1;for(i=0;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Provalo online!

Oppure, se la lunghezza può essere accettata come parametro:

C (gcc), 105 102 byte

-1 byte grazie a ceilingcat!

i;x;f(k,x,j)char*k,*j;{for(i=!x--;i<x-~x;i+=puts(""))for(j=k;*j;)printf("%c%*s",*j++,i<x?i:2*x-i,"");}

Provalo online!


@ceilingcat eh!
Conor O'Brien,

1
Nel tuo golf lungo 102 byte, penso che il globale xsia oscurato e quindi dichiarato in modo ridondante.
Jonathan Frech,

2

PHP, 148 146 143 141 byte

function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Puoi provarlo in questo modo:

<?php
error_reporting(0);

$s = 1234567890;
function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Produzione

1234567890
1 2 3 4 5 6 7 8 9 0 
1  2  3  4  5  6  7  8  9  0  
1   2   3   4   5   6   7   8   9   0   
1    2    3    4    5    6    7    8    9    0    
1     2     3     4     5     6     7     8     9     0     
1      2      3      4      5      6      7      8      9      0      
1       2       3       4       5       6       7       8       9       0       
1        2        3        4        5        6        7        8        9        0        
1         2         3         4         5         6         7         8         9         0         
1        2        3        4        5        6        7        8        9        0        
1       2       3       4       5       6       7       8       9       0       
1      2      3      4      5      6      7      8      9      0      
1     2     3     4     5     6     7     8     9     0     
1    2    3    4    5    6    7    8    9    0    
1   2   3   4   5   6   7   8   9   0   
1  2  3  4  5  6  7  8  9  0  
1 2 3 4 5 6 7 8 9 0 
1234567890

sandbox

Versione estesa

 function s($s){
    //loop upwards 0-10
    for(;$i<strlen($s);++$i) f($i,$s);
     //decrement so it's odd, from 9 loop downwards to 0
    for(--$i;--$i>=0;)f($i,$s);
 }
 //2nd function to save space
 function f($i,$s){
     //chunk it, split 1 char, insert $i number of spaces
     echo chunk_split($s,1,str_repeat(' ',$i))."
";}

Tentativo 2, 92 byte

dopo aver visto la risposta di @Titus ho ridotto il mio a questo:

for(;++$i<2*$e=strlen($s=$argn);)echo chunk_split($s,1,str_repeat(' ',~-$e-abs($i-$e)))."
";

Stavo cercando di pensare a un modo per usare 1 loop, invece di 2 ... Che ci crediate o no, non uso quasi mai il for loop nel codice "reale". Era il~ no bit a bit, che mi mancava ...

È ancora un po 'più lungo 92 quindi non mi sento così male. Ma lo inserirò comunque come secondo tentativo.

$argn è l'input dalla riga di comando

Esegui come pipe con -nR o provalo online.

sandbox


Mi sembra che la tua prima versione sarebbe più corta di 4 byte se utilizzassi una funzione denominata finvece di assegnarne una anonima $f- function f(salva 2 byte sopra $f=function(e salvi un altro byte ogni volta che chiami f(...)invece di $f(...). In alternativa, è possibile acquisire il $s, risparmiando 2 byte - ($i)use($s)è 4 byte più lungo di ($i,$s), ma si risparmiano 3 byte per ogni chiamata $f($i)invece di $f($s,$i); nelle lingue con acquisizione automatica, come JS, questo è più spesso un risparmio praticabile, perché non si paga la penalità della usedichiarazione.
IMSoP

Apprezzo molto l'aiuto, sono abbastanza nuovo nel code golf e non lo faccio molto, ma ci si annoia sulle normali pagine SO. Ho pensato di utilizzare usema mi sembra più lungo, per fare questo senso $iè dinamico, dovrebbe essere passato per riferimento. Quindi deve essere use(&$i)e $ideve essere definito prima di passarlo facendo riferimento a $f. Il che significa impostarlo nella funzione genitore o prima di ogni altro. Per la funzione potrebbe essere function s($s,$i)e basta sapere che deve essere chiamato con, s($s,0) ma sembra brutto, e questo è in giro11 bytes, use(&$i),$i
ArtisticPhoenix

Potremmo usare $sperò e cambiare il \nin un ritorno di linea reale. Questo lo porta a 143 2 dalla fine della linea e 1 dall'uso
ArtisticPhoenix

Sì, non avevo nemmeno preso in considerazione l'idea di utilizzare $ i perché $ s ha percepito la cattura "naturale", ma vale sempre la pena calcolare il risparmio netto. Tuttavia, puoi comunque salvare 2 byte dichiarando semplicemente una funzione denominata fanziché una chiusura: function s($s){for(;$i<strlen($s);++$i)f($i,$s);for(--$i;--$i>=0;)f($i,$s);}function f($i,$s){echo chunk_split($s,1,str_repeat(' ',$i))." ";}funzioni extra come questa sono consentite in base a questo meta post: codegolf.meta.stackexchange.com/questions/7614/…
IMSoP

Aggiornato, salvato un paio
ArtisticPhoenix
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.