Triangolazione del testo


39

Scrivi un programma o una funzione che includa una stringa che garantisca contenere solo caratteri ASCII stampabili , tranne lo spazio, e un numero triangolare positivo (1, 3, 6, 10, 15, ...) di lunghezza.

Stampa o restituisci la stessa stringa, ma modellata in un triangolo usando gli spazi. Alcuni esempi mostreranno meglio cosa intendo:

Se l'ingresso è Rallora l'uscita sarà

R

Se l'ingresso è catallora l'uscita sarà

 c
a t

Se l'ingresso è monk3yallora l'uscita sarà

  m
 o n
k 3 y

Se l'ingresso è meanIngfu1allora l'uscita sarà

   m
  e a
 n I n
g f u 1

Se l'ingresso è ^/\/|\/[]\allora l'uscita sarà

   ^
  / \
 / | \
/ [ ] \

Se l'ingresso è

Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?

quindi l'output sarà

              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e d a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?

Fondamentalmente, le nuove linee vengono inserite tra le sottostringhe di lunghezza triangolare, gli spazi vengono aggiunti tra tutti i caratteri e ogni linea è rientrata con spazi per adattarsi alla forma del triangolo.

Sono consentiti opzionalmente una sola nuova riga finale e linee con spazi finali, ma altrimenti l'output dovrebbe corrispondere esattamente a questi esempi. L'ultima riga del triangolo non dovrebbe avere spazi iniziali.

Vince il codice più breve in byte.


Esiste un massimo assoluto della lunghezza della stringa?
geokavel,

@geokavel Dovrebbe funzionare per qualsiasi lunghezza di stringa normalmente gestita dalla tua lingua.
Hobby di Calvin il

11
Ecco un albero di Natale per chiunque non abbia ancora inventato la propria. * / \ / | \ / | O \ / | o | \ / o | o | \ / || o | o \ / o ||| o | \ / o || o ||| \ / || o | || o | \ / | o ||| o || o \
Timmy,

Risposte:


9

Pyth, 22 byte

jua+L\ GjdHfTczsM._UzY

Provalo online: Dimostrazione o Test Suite

Spiegazione:

jua+L\ GjdHfTczsM._UzY   implicit: z = input string
                   Uz    create the list [0, 1, ..., len(z)-1]
                 ._      all prefixes of this list: [[0], [0,1], [0,1,2], ...]
               sM        sum up each sublist: [0, 1, 3, 6, 10, ...]
             cz          split z at these indices
           fT            remove all the unnecessary empty strings
                         this gives us the list of strings of the triangle
 u                   Y   reduce this list, with the initial value G = []
   +L\ G                    prepend a space to each string in G
        jdH                 join the current string with spaces
  a                         and append it to G
j                        print each string on a separate line

12

Python, 81 byte

def f(s,p=''):
 i=-int(len(2*s)**.5)
 if s:f(s[:i],p+' ');print p+' '.join(s[i:])

Una funzione ricorsiva. Va dalla fine di s, tagliando e stampando personaggi. Il numero di caratteri da prendere viene calcolato dalla lunghezza di s. La funzione è impostata per stampare in ordine inverso rispetto alle chiamate ricorsive, che terminano quando sè vuota e quindi risolvono il backup della linea. A ogni livello, il prefisso pha uno spazio aggiuntivo aggiunto.

In Python 3, il if può essere fatto tramite corto circuito, anche se questo non sembra salvare i caratteri:

def f(s,p=''):i=-int(len(2*s)**.5);s and[f(s[:i],p+' '),print(p+' '.join(s[i:]))]

Un'alternativa altrettanto lunga con concatenazione di disuguaglianze:

def f(s,p=''):i=-int(len(2*s)**.5);''<s!=f(s[:i],p+' ')!=print(p+' '.join(s[i:]))

Entrambi printe fritorno None, che è difficile da usare.


1
Questo è abbastanza intelligente. Tagliando la stringa una riga alla volta, si ottiene comunque una stringa di lunghezza triangolare con cui calcolare il numero di spazi iniziali.
xsot,

6

Retina , 108 102 94 87 82 64 63 byte

Grazie a Sp3000 per avermi fatto perseguire il mio approccio originale, che ha portato il conteggio dei byte da 108 a 82.

Grazie di cuore a Kobi che ha trovato una soluzione molto più elegante, che mi ha permesso di salvare altri 19 byte.

S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)
.
$0 
m+`^(?=( *)\S.*\n\1)
<space>

Dove <space>rappresenta un singolo personaggio spaziale (che altrimenti verrebbe rimosso da SE). Ai fini del conteggio, ogni riga va in un file separato e \ndeve essere sostituita con un carattere di avanzamento riga effettivo. Per comodità, è possibile eseguire il codice come da un singolo file con-s flag.

Provalo online.

Spiegazione

Bene ... come al solito non posso dare una completa introduzione ai gruppi di bilanciamento qui. Per un primer vedi la mia risposta Stack Overflow .

S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)

Il primo stadio è un Split stage, che divide l'input in linee di lunghezza crescente. Il_ indica che blocchi vuoti devono essere omessi dalla suddivisione (che interessa solo la fine, perché ci sarà una corrispondenza in ultima posizione). La regex stessa è interamente contenuta in uno sguardo in modo da non corrispondere a nessun personaggio, ma solo a posizioni.

Questa parte si basa sulla soluzione di Kobi con un po 'di golfitude aggiuntivo che mi sono trovato. Si noti che i lookbehind sono abbinati da destra a sinistra in .NET, quindi la seguente spiegazione dovrebbe essere letta da cima a fondo. Ne ho anche inserito un altro \Gnella spiegazione per chiarezza, sebbene ciò non sia necessario per il funzionamento del modello.

(?<=
  ^         # And we ensure that we can reach the beginning of the stack by doing so.
            # The first time this is possible will be exactly when tri(m-1) == tri(n-1),
            # i.e. when m == n. Exactly what we want!
  (?<-1>.)* # Now we keep matching individual characters while popping from group <1>.
  \G        # We've now matched m characters, while pushing i-1 captures for each i
            # between 1 and m, inclusive. That is, group <1> contains tri(m-1) captures.
  (?:       
    (?<=
      \G    # The \G anchor matches at the position of the last match.
      (.)*  # ...push one capture onto group <1> for each character between here
            # here and the last match.
    )       # Then we use a lookahead to...
    .       # In each iteration we match a single character.
  )+        # This group matches all the characters up to the last match (or the beginning
            # of the string). Call that number m.
)           # If the previous match was at position tri(n-1) then we want this match
            # to happen exactly n characters later.

Sto ancora ammirando il lavoro di Kobi qui. Questo è ancora più elegante del regex di test prime. :)

Passiamo alla fase successiva:

.
$0 

Semplice: inserire uno spazio dopo ogni carattere senza avanzamento riga.

m+`^(?=( *)\S.*\n\1)
<space>

Quest'ultima fase fa rientrare correttamente tutte le linee per formare il triangolo. Il mè solo la modalità multi solito fare ^l'inizio di una riga. Questo +dice a Retina di ripetere questo passaggio fino a quando la stringa non smette di cambiare (che, in questo caso significa che la regex non corrisponde più).

^      # Match the beginning of a line.
(?=    # A lookahead which checks if the matched line needs another space.
  ( *) # Capture the indent on the current line.
  \S   # Match a non-space character to ensure we've got the entire indent.
  .*\n # Match the remainder of the line, as well as the linefeed.
  \1   # Check that the next line has at least the same indent as this one.
)

Quindi questo corrisponde all'inizio di qualsiasi riga che non ha un rientro più grande di quello successivo. In tale posizione inseriamo uno spazio. Questo processo termina, una volta che le linee sono disposte in un triangolo pulito, perché quello è il layout minimo in cui ogni linea ha un rientro più grande di quello successivo.



@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Ora con il 100% in più di stupore, per gentile concessione di Kobi.
Martin Ender,

6

Candy , 67 59 57 byte

&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

o:

          &
         8 *
        7 - r
       1 - 2 /
      = y @ 1 i
     & { | . } b
    Y R ( "   " ;
   = ) Z R ( = a &
  { ; } "   " ; ) "
 \ n " ; Y 1 - = y a
1 j

forma lunga:

stackSz
digit8    # Y = (sqrt((numCh - 1) * 8 + 1) - 1) / 2   using pythagorean
mult      # Y = (sqrt(numCh * 8 - 7) - 1) / 2  equivalent but shorter
digit7
sub
root
digit1
sub
digit2
div
popA
YGetsA
label digit1
incrZ
stackSz   # bail if we're out of letters
if
  else
  retSub
endif
stack2
pushY     # print the leading spaces (" " x Y)
range1
while
  " " printChr
  popA
endwhile
pushZ
range1      # output this row of characters (Z of them)
while
  popA
  stack1
  stackSz
  if
    printChr    # bail on unbalanced tree
  endif
  " " printChr
endwhile
"\n" printChr
pushY
digit1
sub
popA
YGetsA
stack1
digit1 jumpSub   # loop using recursion

Sì, mi sono sentito Natale.
Dale Johnson,

5

CJam, 27 26 byte

Grazie a Sp3000 per il salvataggio di 1 byte.

Lq{' @f+_,)@/(S*N+a@\+\s}h

Sorprendentemente vicino a Pyth, vediamo se questo può essere giocato a golf ...

Provalo qui.

Spiegazione

L        e# Push an empty array to build up the lines in.
q        e# Read input.
{        e# While the top of the stack is truthy (non-empty)...
  ' @f+  e#   Prepend a space to each line we already have.
  _,)    e#   Get the number of lines we already have and increment.
  @/     e#   Split the input into chunks of that size.
  (S*    e#   Pull off the first chunk (the next line) and join with spaces.
  N+     e#   Append a linefeed.
  a@\+   e#   Append it to our list of lines.
  \s     e#   Pull up the other chunks of the input and join them back into one string.
}h

Perché non funziona se cambio ' a S???
geokavel,

@geokavel Perché Sè una stringa, non un carattere, quindi fverrà mappata su quella stringa anziché sull'elenco di linee.
Martin Ender,

Questa era la mia ipotesi. Hai qualche idea sulla logica per rendere S una stringa?
geokavel,

@geokavel No, non lo so.
Martin Ender,

5

Rubino, 84 77 73 byte

->v{1.upto(n=v.size**0.5*1.4){|i|puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "}}

77 byte

->v{0.upto(n=(v.size*2)**0.5-1){|i|puts" "*(n-i)+v[i*(i+1)/2,i+1].chars*" "}}

Ridotto qualche byte in più rimuovendo la variabile rcome suggerito da steveverrill.

84 byte

->v{n=(v.size*2)**0.5-1;0.upto(n){|i|puts" "*(n-i)+v[(r=i*(i+1)/2)..r+i].chars*" "}}

Ungolfed:

->v {
  1.upto(n=v.size**0.5*1.4) { |i|
    puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "
  }
}

Primo calcolo del numero triangolare dalla stringa di input

n=v.size**0.5*1.4

ad esempio, la dimensione della stringa di input è 120 e il nostro numero triangolare n, sarà 15.

puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "

Nella riga sopra, stampa gli spazi seguiti da una serie di stringhe che vengono recuperate dalla stringa di input usando il modello seguente

[[0,0],[1,2],[3,5],[6,9]]

Uso:

f=->v{1.upto(n=v.size**0.5*1.4){|i|puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "}}
f["Thisrunofcharactersismeanttohavealengththatcanbeexpressesasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?"]
              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e s a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?

Wow, i nostri approcci sono molto simili, ma sembriamo avere conoscenze golfistiche complementari. Non sapevo uptoche non richiedesse un argomento intero, ( timessicuramente lo è.) Ho incorporato parte della tua sintassi in una revisione della mia risposta. Il consiglio più grande che ho per te è che non hai bisogno di quella variabile r. Basta usare un ,invece di ..e il numero dopo la virgola è il numero totale di elementi da restituire, piuttosto che la fine dell'intervallo.
Level River St

Vero. Grazie per la punta, sto aggiornando subito la mia risposta :)
Vasu Adari,

4

Pyth, 27 byte

Js.IsSGlzWz+*-J=hZdjd<~>zZZ

                               z = input()
                               Z = 0
                               d = ' '
    sSG                        G -> tri(G)
  .I   lz                      Find the (float) input whose output is len(z).
 s                             Convert to int.
J                              Save as J.
         Wz                    while z:
               =hZ             Z += 1
            *-J  Zd            Generate J-Z spaces.
                      ~>zZ     Remove the first Z characters from z.
                     <    Z    Generate those first Z characters.
                   jd          Join on spaces.
           +                   Add the two together and print.

Test Suite

Un approccio interessante: imperativo e usi .I . Probabilmente golfable.


4

C, 138 136 134 byte

Accetta una stringa come input:

j,r,k,a;f(char*s){j=strlen(s);r=k=sqrt(1+8*j)/2;for(;r--;printf("\n")){for(j=r;j--;)printf(" ");for(j=k-r;j--;)printf("%c ",s[a++]);}}

Sembra che tu abbia battuto JavaScript con C di 1 byte finora: D
Mark K Cowan,

@MarkKCowan sì, a quanto pare. Spero di renderlo ancora più piccolo! :)
Sahil Arora,

@SahilArora - È possibile sostituire printf(" ")e printf("\n")con puts(" ")e puts("\n"). Ogni sostituzione ti farà risparmiare 2 byte. :)
enhzflep il

@enhzflep L'ho già provato, ha dato un risultato ambiguo!
Sahil Arora,

Oh. :( Funziona bene qui su win7 con gcc 4.7.1 - Immagino abbia a che fare con il modo in cui l'output di printf viene scaricato su stdout. +1 per battere Javascript.
enhzflep

4

Ruby avvicina 2 rev 1, 76 byte

->s{s=s.chars*' '
0.upto(w=s.size**0.5-1){|i|puts' '*(w-i)+s[i*i+i,i*2+2]}}

Ottimizzato usando le idee di sintassi dalla risposta di Vasu Adari, oltre a qualche colpo di scena.

Approccio rubino 2 rev 0, 93 byte

->s{s=s.chars.to_a.join(' ')
w=(s.size**0.5).to_i
w.times{|i|puts' '*(w-i-1)+s[i*i+i,i*2+2]}}

Approccio completamente diverso. Per prima cosa aggiungiamo spazi tra i caratteri dell'input. Quindi stampiamo le righe riga per riga.

Approccio rubino 1, 94 byte

->s{n=-1;w=((s.size*2)**0.5).to_i
(w*w).times{|i|print i/w+i%w<w-1?'':s[n+=1],-i%w==1?$/:' '}}

questo è finito molto più a lungo del previsto.

w contiene il numero di caratteri stampabili nella riga inferiore o, equivalentemente, il numero di righe.

Ogni riga contiene wcaratteri di spazi bianchi (l'ultimo dei quali è la riga nuova) quindi l'idea è di stampare questi caratteri di spazi bianchi e inserire i caratteri stampabili dove necessario.


3

Minkolang 0,14 , 42 byte

(xid2;$I2*`,)1-[i1+[" "o]lrx" "$ii-1-D$O].

Provalo qui.

Spiegazione

(                Open while loop
 x               Dump top of stack
  i              Loop counter (i)
   d2;           Duplicate and square
      $I2*       Length of input times two
          `,     Push (i^2) <= (length of input)
            )    Close for loop; pop top of stack and exit when it's 0

1-[                              Open for loop that repeats sqrt(len(input))-1 times
   i1+[                          Open for loop that repeats (loop counter + 1) times
       " "o                      Push a space then read in character from input
           ]                     Close for loop
            l                    Push 10 (newline)
             r                   Reverse stack
              x                  Dump top of stack
               " "               Push a space
                  $i             Push the max iterations of for loop
                    i-           Subtract loop counter
                      1-         Subtract 1
                        D        Pop n and duplicate top of stack n times
                         $O      Output whole stack as characters
                           ].    Close for loop and stop.

2
Un conteggio di byte così perfetto! buon lavoro!
TanMath,

1
@TanMath ma 42 non è un numero triangolare!
Paŭlo Ebermann,

3

Python 2, 88 85 byte

s=t=raw_input()
i=1
while s:print' '*int(len(t*2)**.5-i)+' '.join(s[:i]);s=s[i:];i+=1

Grazie xnor per aver salvato 3 byte.


L'accorciamento non sconfonde il calcolo del numero di spazi?
xnor

Oh giusto. Ho rimosso una variabile temporanea prima di inviarla, ma non mi sono reso conto che ha invalidato il codice.
xsot,

Cosa succede se ti piace prima ma salvi un backup S=s=raw_input()?
xnor

Buon consiglio Penso che probabilmente ci sia una strategia globale più breve.
xsot,

Cancellato 88 sembra divertente
pinkfloydx33

3

CJam, 50 byte

q:QQ,1>{,{),:+}%:RQ,#:IR2ew<{~Q<>:LS*L,I+(Se[N}%}&

Provalo qui.

Spiegazione

q:QQ,1>{  e# Only proceed if string length > 1, otherwise just print.
,{),:}%:R e# Generates a list of sums from 0 to k, where k goes from 0 to the length of the string [0,1,3,6,10,15,21,...]
Q,#:I     e# Find the index of the length of the string in the list
R2ew<     e# Make a list that looks like [[0,1],[1,3],[3,6],...,[?,n] ]where n is the length of the string 
{~Q<>:L   e# Use that list to get substrings of the string using the pairs as start and end indices
S*        e# Put spaces between the substrings
L,I+(Se[N e# (Length of the substring + Index of string length in sum array -1) is the length the line should be padded with spaces to. Add a new line at the end.
%}& 

2

JavaScript (ES6), 135 byte

w=>{r='';for(s=j=0;j<w.length;j+=s++);for(i=j=0;w[j+i];j+=++i)r+=Array(s-i-1).join` `+w.slice(j,i+j+1).split``.join` `+'<br>';return r}

De-golf + demo:

function t(w) {
    r = '';
    for (s = j = 0; j < w.length; j += s++);
    for (i = j = 0; w[j + i]; j += ++i) r += Array(s - i - 1).join` ` + w.slice(j, i + j + 1).split``.join` ` + '<br>';
    return r;
}

document.write('<pre>' + t(prompt()));


Qual è l'obiettivo di for (s = j = 0; j < w.length; j += s++);? Inoltre, all'interno di a <pre>, puoi usare \ninvece di <br>. Inoltre, hai dimenticato di dire che è ES6.
Ismael Miguel,

L'obiettivo del primo ciclo è contare la lunghezza dell'ultima riga, in modo da rientrare correttamente in ciascuna riga.
nicael

2

Java, 258 194

golfed:

String f(String a){String r="";int t=(((int)Math.sqrt(8*a.length()+1))-1)/2-1;int i=0,n=0;while(n++<=t){for(int s=-1;s<t-n;++s)r+=" ";for(int j=0;j<n;++j)r+=a.charAt(i++)+" ";r+="\n";}return r;}

Ungolfed:

public class TriangulatingText {

  public static void main(String[] a) {
    // @formatter:off
    String[] testData = new String[] {
      "R",
      "cat",
      "monk3y",
      "meanIngfu1",
      "^/\\/|\\/[]\\",
      "Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?",
    };
    // @formatter:on

    for (String data : testData) {
      System.out.println("f(\"" + data + "\")");
      System.out.println(new TriangulatingText().f(data));
    }
  }

  // Begin golf
  String f(String a) {
    String r = "";
    int t = (((int) Math.sqrt(8 * a.length() + 1)) - 1) / 2 - 1;
    int i = 0, n = 0;
    while (n++ <= t) {
      for (int s = -1; s < t - n; ++s)
        r += " ";
      for (int j = 0; j < n; ++j)
        r += a.charAt(i++) + " ";
      r += "\n";
    }
    return r;
  }
  // End golf
}

Uscita del programma:

f("R")
R 

f("cat")
 c 
a t 

f("monk3y")
  m 
 o n 
k 3 y 

f("meanIngfu1")
   m 
  e a 
 n I n 
g f u 1 

f("^/\/|\/[]\")
   ^ 
  / \ 
 / | \ 
/ [ ] \ 

f("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?")
              T 
             h i 
            s r u 
           n o f c 
          h a r a c 
         t e r s i s 
        m e a n t t o 
       h a v e a l e n 
      g t h t h a t c a 
     n b e e x p r e s s 
    e d a s a t r i a n g 
   u l a r n u m b e r . D 
  i d i t w o r k ? Y o u t 
 e l l m e , I c a n ' t c o 
u n t v e r y w e l l , o k ? 

Probabilmente potresti importare staticamente System.out per salvare alcuni byte.
RAnders00,

import static System.out;è 25 byte ed System.è 7 byte. Viene usato tre volte, e 21 <25 così sarebbe effettivamente aumentare la dimensione di 4 byte. Un buon vantaggio, tuttavia, le importazioni statiche possono risparmiare spazio e non tutti ne sono a conoscenza.

1
Stavo cercando delle vecchie risposte quando ho trovato questo: "scrivere un programma o una funzione " che all'inizio non avevo realizzato. Eliminare le cose di classe ha salvato spazio. L'ho trasformato in una funzione corretta e ho trovato qualche byte in più per radermi.

1

JavaScript (ES6), 106 byte

a=>(y=z=0,(f=p=>p?" ".repeat(--p)+a.split``.slice(y,y+=++z).join` `+`
`+f(p):"")(Math.sqrt(2*a.length)|0))

Utilizza la ricorsione invece di un ciclo for per costruire la stringa.

Per trovare la lunghezza della fila più lunga, utilizzare la formula per il numero triangolare n-esimo T_nè T_n = (n^2 + n)/2. Dato ne risolto per l' T_nutilizzo della formula quadratica, abbiamo:

1/2 * n^2 + 1/2 * n - T_n = 0

a = 1/2, b = 1/2, c = -T_n

-1/2 + sqrt(1/2^2 - 4*1/2*-T_n)   
------------------------------- = sqrt(1/4 + 2*T_n) - 1/2
             2*1/2

Si scopre che dopo la pavimentazione, l'aggiunta di 1/4 all'interno della radice quadrata non cambia il risultato, quindi la formula per la fila più lunga è Math.sqrt(2*a.length)|0.



1

Powershell, 69 byte

($args|% t*y|?{$r+="$_ ";++$p-gt$l}|%{$r;rv r,p;$l++})|%{' '*--$l+$_}

Script di test meno golfato:

$f = {

(
    $args|% t*y|?{  # test predicate for each char in a argument string 
        $r+="$_ "   # add current char to the result string
        ++$p-gt$l   # return predicate value: current char posision is greater then line num
    }|%{            # if predicate is True
        $r          # push the result string to a pipe
        rv r,p      # Remove-Variable r,p. This variables will be undefined after it.
        $l++        # increment line number
    }

)|%{                # new loop after processing all characters and calculating $l
    ' '*--$l+$_     # add spaces to the start of lines
}                   # and push a result to a pipe

}

@(
    ,("R",
    "R ")

    ,("cat",
    " c ",
    "a t ")

    ,("monk3y",
    "  m ",
    " o n ",
    "k 3 y ")

    ,("meanIngfu1",
    "   m ",
    "  e a ",
    " n I n ",
    "g f u 1 ")

    ,("^/\/|\/[]\",
    "   ^ ",
    "  / \ ",
    " / | \ ",
    "/ [ ] \ ")

    ,("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?",
    "              T ",
    "             h i ",
    "            s r u ",
    "           n o f c ",
    "          h a r a c ",
    "         t e r s i s ",
    "        m e a n t t o ",
    "       h a v e a l e n ",
    "      g t h t h a t c a ",
    "     n b e e x p r e s s ",
    "    e d a s a t r i a n g ",
    "   u l a r n u m b e r . D ",
    "  i d i t w o r k ? Y o u t ",
    " e l l m e , I c a n ' t c o ",
    "u n t v e r y w e l l , o k ? ")

    ,("*/\/|\/|o\/|o|\/o|o|\/||o|o\/o|||o|\/o||o|||\/||o|||o|\/|o|||o||o\",
    "          * ",
    "         / \ ",
    "        / | \ ",
    "       / | o \ ",
    "      / | o | \ ",
    "     / o | o | \ ",
    "    / | | o | o \ ",
    "   / o | | | o | \ ",
    "  / o | | o | | | \ ",
    " / | | o | | | o | \ ",
    "/ | o | | | o | | o \ ")

) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    $result
}

Produzione:

True
R
True
 c
a t
True
  m
 o n
k 3 y
True
   m
  e a
 n I n
g f u 1
True
   ^
  / \
 / | \
/ [ ] \
True
              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e d a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
True
          *
         / \
        / | \
       / | o \
      / | o | \
     / o | o | \
    / | | o | o \
   / o | | | o | \
  / o | | o | | | \
 / | | o | | | o | \
/ | o | | | o | | o \

0

C #, 202

string r(string s,List<string> o,int i=1){o=o.Select(p=>" "+p).ToList();o.Add(String.Join(" ",s.Substring(0,i).ToCharArray()));return s.Length==i?String.Join("\n",o):r(s.Substring(i,s.Length-i),o,i+1);}

Non so se questo è legale in code-golf ma, il passaggio di un elenco nella funzione conta? Non riesco a trovare un modo per ricorrere a questo senza un elenco <stringa> dichiarato all'esterno della funzione, quindi l'ho inserito come parametro.

Uso:

 r("1",new List<string>());
 r("123", new List<string>());
 r("123456", new List<string>());
 r("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Icanstcountverywell,ok?",new List<string>());

0

C, 102 byte

i,j;main(n,s){for(n=sqrt(strlen(gets(s))*2);j<n;printf("%*.1s",i>1?2:i*(n-j),i++>j?i=!++j,"\n":s++));}

0

Bash + sed, 87

for((;i<${#1};i+=j));{
a+=(${1:i:++j})
}
printf %${j}s\\n ${a[@]}|sed 's/\S/ &/g;s/.//'

0

R, 142 byte

Abbastanza sicuro di poterlo ottenere di più. Ci sto ancora lavorando. Mi sento come se mi mancasse una facile ricorsione - ma non sono stato in grado di accorciarlo nel modo giusto.

f=function(a){n=nchar(a);l=which(cumsum(1:n)==n);w=strsplit(a,c())[[1]];for(i in 1:l){cat(rep(" ",l-i),sep="");cat(w[1:i],"\n");w=w[-(1:i)]}}

ungolfed

f=function(a){
    n = nchar(a)                 #number of characters
    l= which(cumsum(1:n)==n)     #which triangle number
    w= strsplit(a,c())[[1]]      #Splits string into vector of characters
    for (i in 1:l) {
        cat(rep(" ",l-i),sep="") #preceeding spaces
        cat(w[1:i],"\n")         #Letters
        w=w[-(1:i)]              #Shifts removes letters (simplifies indexing)
    }
}

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.