Detonare una stringa


34

Data qualsiasi stringa, stampala sotto forma di un triangolo in cui il testo scorre su e giù lungo ciascuna diagonale. Ad esempio, un input di "Hello World"dovrebbe produrre:

                    d
                  l  
                r   d
              o   l  
            W   r   d
              o   l  
        o   W   r   d
      l       o   l  
    l   o   W   r   d
  e   l       o   l  
H   l   o   W   r   d
  e   l       o   l  
    l   o   W   r   d
      l       o   l  
        o   W   r   d
              o   l  
            W   r   d
              o   l  
                r   d
                  l  
                    d

Lo spazio tra ogni carattere di una riga deve essere almeno 1, al fine di mantenere il formato corretto.


1
Possiamo supporre che la stringa non sia vuota?
Mr. Xcoder,

@ Mr.Xcoder Sì, puoi
machiavelli

1
Lo spazio tra ogni carattere di una riga deve essere almeno 1 : significa che H l o W r dè una riga centrale valida? Chiedere perché nel tuo esempio ogni riga ha 3 spazi tra ogni personaggio.
Emigna,

1
@Emigna Ho frainteso la tua domanda, le mie scuse. Sì, il tuo esempio sarebbe valido.
machiavelli,

1
Sono consentiti spazi iniziali o finali?
Luis Mendo,

Risposte:


19

Carbone , 10 7 byte

↗ELθ✂θιUE¹

Provalo online! Provalo online! I collegamenti sono alla versione dettagliata del codice. Spiegazione:

    ↗       Print up and to the right
     ELθ✂θι All suffixes of the input, as a list down and to the right
    UE¹     Insert blank columns

La prima volta che devo usare il UEcomando.


Sapevo che il carbone sarebbe stata una delle prime risposte qui .. Ero quasi tentato di iniziare me stesso, ma sono inesperto con esso per finire una soluzione in tempo, e sarebbe comunque uscito a giocare a golf ..;)
Kevin Cruijssen,

6
@Emigna ... ma questa era la mia grande possibilità di usare UE...
Neil

6
@EriktheOutgolfer ... ma questa era la mia grande possibilità di usare UE..
Neil

1
@Neil Sono -3 byte! -3 per un bel sacrificio! Chi non vuole un bel -3?
Erik the Outgolfer

4
@EriktheOutgolfer Quello che dovresti dire è: "Non puoi lasciare che 05AB1E ti picchi, vero?"
Neil,

12

05AB1E , 10 8 7 byte

Grazie a Emigna per aver salvato 2 byte!

ðâƶ.cðζ

Utilizza la codifica 05AB1E . Provalo online!


Secondo questa linea Lo spazio tra ogni personaggio di una riga deve essere almeno 1 che puoi rimuovere ¶«. (verificato anche la validità con OP)
Emigna

@Emigna Grazie! :)
Adnan,

Potrebbe voler aggiornare il link Tio :)
Mr. Xcoder

@ Mr.Xcoder ninja'd
Adnan,

1
Uso intelligente di âin ðâinvece di Sð«!
Erik the Outgolfer


8

C, 86 78 73 70 caratteri

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Provalo online!

Spiegazione

Implementazione ingenua: due cicli, riempimento dall'alto verso il basso, da sinistra a destra (99 byte):

for(int j=1;j<n*2;j++){for(int i=0;i<n;i++)printf("%c ",(i+j)%2&&i+1>=abs(j-n)?s[i]:' ');puts("");}

Qui, put () stampa solo \ n sull'output. Uniamo le dichiarazioni delle variabili e combiniamo j ++ con qualcosa (94 byte):

for(int i,j=0;++j<n*2;){for(i=0;i<n;i++)printf("%c ",(i+j)%2&&i>=abs(j-n)?s[i]:' ');puts("");}

Buono. La variabile j ha un intervallo 0 ... 2n; lascia che sia all'interno di -n ... n, questo semplifica la matematica. Nota che l'espressione booleana a destra di && ha sempre il valore 0 o 1. Ciò significa che possiamo sostituire && con &. 91 byte:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)printf("%c ",~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

E ora ci siamo resi conto che stavamo stampando uno spazio extra. E sì, non abbiamo bisogno di printf () per stampare solo un singolo simbolo. 86 byte:

for(int i,j=-n;++j<n;){for(i=0;i<n;i++)putchar(~(i+j)%2&i>=abs(j)?s[i]:' ');puts("");}

Anche meglio. Notare che la condizione i * i> = j * j è uguale a i> = abs (j), ma più breve. Spostiamo put () in per l'espressione dell'incremento del ciclo. E indovina cosa? In realtà, non abbiamo bisogno delle parentesi graffe intorno a i + j. 78 byte:

for(int i,j=-n;++j<n;puts(""))for(i=0;i<n;i++)putchar(i*i>=j*j&~i+j?s[i]:' '); 

Sapevi che putchar () restituisce il personaggio che ha stampato? Usiamo XOR per testare i numeri per l'equivalenza. Sostituiamo lo spazio con il suo codice ASCII, 32. Ricorda che il codice carattere di fine riga è 13. E infine: sapevi che GCC / Clang supporta https://en.wikipedia.org/wiki/Elvis_operator ? 73 byte:

for(int i,j=-n;++j<n;)for(i=0;putchar(i*i>=j*j&~i+j?s[i]?:13:32)^13;i++);

Infine, indovina un po '? Non abbiamo bisogno di due per i loop. Possiamo sostituire brutti ~ i + j con solo ij. 70 byte:

for(int i=1,j=1-n;i=putchar(j*j<i*i&i-j?s[i-1]?:13:32)^13?i+1:++j<n;);

Lavori futuri: cambiare la direzione del loop? Questo potrebbe salvare alcuni byte, se fatto correttamente.


5

SOGL V0.12 , 13 10 9 byte

ēI*@∑}¹╚H

Questo utilizza una funzione che ho appena aggiunto , ma è stata documentata qualche tempo fa.

Provalo qui!
In quel collegamento ,viene aggiunto perché ciò prevede l'input nello stack e {aggiunto perché altrimenti ,verrebbe eseguito ogni volta nel ciclo

implicitly start loop over POP
ē            increase the variable E, on first push which will be 0
 I           increase by 1
  *          multiply the current character that many times
   @∑        join with spaces
     }     end loop
      ¹    wrap everything on stack in an array
       ╚   center vertically
        H  rotate counter-clockwise


3

Gaia , 16 byte

$:ċ⟪×$§×⟫†€|$¦tụ

Provalo online!

Spiegazione

$                 Split into list of chars
 :ċ               Push [1 .. len(input)]
   ⟪×$§×⟫†        Apply this block to corresponding elements of the two lists:
    ×              Repetition
     $             Split into chars
      §×           Join with spaces
          €|      Centre align the rows
            $¦    Split each line into chars
              t   Transpose
               ụ  Join each row with spaces, then join the rows together with newlines




3

Java, 292 byte (scusa)

public class D{
public static void main(String[]r){
String s=r[0];int L=s.length(),n=L*2-1,x=L-1,d=-1,i,j;boolean a=false,o=L%2==1;
for(i=0;i<n;i++){
for(j=0;j<L;j++)System.out.print(j<x||a&&j%2==(o?0:1)||!a&&j%2==(o?1:0)?' ':s.charAt(j));
System.out.println();
x+=d;if(x<0){x=0;d=1;}a=!a;}}}

1
È possibile rimuovere le nuove righe, altrimenti, sembra piuttosto golfato!
Zacharý,

1
Puoi giocare a golf di più: 1 boolean a=1<0,o=L%2>0;.. 2. Se non è necessario i, utilizzare questo ciclo: for(i=0;i++<n;). 3. Puoi sbarazzarti di o: j%2<L%2allora j%2>L%2. 4. Usare dcome flip richiede così tanti personaggi: basta farlo j<(x<0?-x:x). 5. Hai molte più variabili del necessario. 6. Non hai bisogno di un programma completo: basta un lambda o un metodo. - Se vuoi un esempio Java golfato, controlla la mia risposta .
Olivier Grégoire,


3

Java (OpenJDK 8) , 116 byte

s->{for(int l=s.length(),i=-l;++i<l;)System.out.printf("%"+l+"s%n",s.substring(i<0?-i:i).replaceAll("(.).","$1 "));}

Provalo online!

Spiegazione

s->{                                // Consumer<String> lambda
 for(int l=s.length(),i=-l;++i<l;)  // For each length between l and 1 and back to l, 
  System.out.printf("%"+l+"s%n",    // Print with align to right
    s.substring(i<0?-i:i)           // skip the first |i| characters
     .replaceAll("(.).","$1 ")      // replace every even-positioned character with a space.
   );
}


3

Haskell , 140 137 byte

(m#n)s=(\(i,x)->' ':(last$"  ":[x:" "|rem i 2==m&&i>n]))=<<zip[0..]s
g s=((++)=<<reverse.tail)$id=<<[[(0#n)s,(1#n)s]|n<-[-1,1..length s]]

Provalo online!

Salvato 3 byte grazie a Challenger5

Non penso sia ottimale ...

fproduce una delle righe ( m= 0 o 1 è il modulo del numero di riga, nè il numero della riga)

g intercala le linee "dispari" e "pari" e aggiunge al risultato uno specchio di se stesso.


È possibile salvare i byte definendo funa funzione infisso (come in (m#n)s=...) anziché una funzione prefisso.
Esolanging Fruit,



2

Mathematica 105 byte

(c=Characters@#;l=Length@c;StringRiffle@Table[If[Abs[j-l]<i&&EvenQ[j+i],c[[i]]," "],{j,1,2l+1},{i,1,l}])&

Forse potrei radere via un altro byte o due, ma il conteggio dei caratteri sovraccarico di gestire le stringhe in Mathematica rende semplici sfide come questa non competitiva.


2

J, 54 byte

[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]

Provalo online! (nota che l'output su TIO ha una nuova riga e tre spazi, ma ciò non deriva dalla chiamata di funzione - probabilmente è proprio quello che fa automaticamente l'interprete J).

Penso che l'idea generale di risolverlo sia giusta, ma ci sono piccole cose che probabilmente sto facendo in modo subottimale che si stanno aggiungendo al bytecount.

Varianti precedenti

55 byte

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]

56 byte

<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]

Spiegazione

Questo sarà suddiviso in alcune funzioni. Inoltre, non ero così approfondito con le ultime parti della spiegazione, quindi fatemi sapere se volete una spiegazione migliore per una determinata parte e posso modificarla in.

dup   =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad   =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
  • dup duplica ogni carattere quante volte il suo indice (più uno) nella stringa
  • space inserisce spazi tra ogni personaggio
  • pad riempie i personaggi con la giusta quantità di spazi
  • trans traspone la matrice risultante

Chiamata di esempio:

   trans pad space dup 'abc'
  c
 b 
a c
 b 
  c

Dup

>:@i.@# <@#"0 ]
>:@i.@#         Indices of each character plus one
      #          Length of the string
   i.            Range [0,length)
>:               Add one
        <@#"0 ] Duplicate each character as many times as it index (plus one)
           "0   For each
          #   ]  Copy the character
>:@i.@#           as many times as it index
        <        Box the result

I risultati vengono inscatolati per impedire a J di riempire le estremità con spazi (poiché sono di lunghezza irregolare).

Chiamata di esempio:

   dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘

Spazio

(,' '&,)/&.>
         &.>  For each boxed element
(,' '&,)/      Insert spaces between each

Chiamata di esempio:

   space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘

tampone

|.@i.@# (>@],~' '#~[)"_1 ]
        (>@],~' '#~[)      Pad the right arg with spaces given by the left arg
|.@i.@#                    Indices in reverse order
   i. #                     Range [0,length)
|.                          Reverse

Fondamentalmente, riempi il primo elemento con lunghezza - 1 spazi, il secondo con lunghezza - 2, ecc. Rimuove anche il pugilato.

Chiamata di esempio:

   pad space dup 'abc'
  a  
 b b 
c c c

Trasporre

Questa è solo la funzione integrata |:che prende la trasposizione di una matrice.


1
Ho usato un approccio simile, ma ho evitato la boxe. 45 byte: |:@(-@i.@-@#|."0 1((,@,.~' '#~#)@$"0~1+i.@#)). potrebbe sicuramente essere ulteriormente giocato a golf. questa parte -@i.@-@#è un po 'di frutta bassa, molto probabilmente
Giona

@Jonah Non riesco a decifrare rapidamente come funziona la tua risposta, quindi la lascerò a te per pubblicarla se lo desideri, poiché mi piacerebbe includere una spiegazione della mia risposta. Immagino che J per me in questo momento sia un linguaggio di sola scrittura.
Cole

utile per decifrare rapidamente:, f=. <some tacit expression>quindi 5!:2 <'f'fornisce una visualizzazione in scatola e 5!:4 <'f'una visualizzazione ad albero. nel mio caso, prova a eseguire prima $"0~1+i.@#con qualche stringa, poi esegui tutto a destra di |."0 1, quindi capisci che |."0 1e tutto a sinistra, salva la trasposizione finale, sta solo facendo le rotazioni necessarie.
Giona il

1
oh non mi aspettavo che aggiornassi la tua risposta. era più un "ehi, potresti trovare questo interessante". avrei potuto pubblicarlo, ma sentivo che gli approcci di alto livello erano abbastanza simili e non ne valeva la pena.
Giona il

2
Ho appena ricordato le complesse argomentazioni di #aiuti qui, 26 byte con|:@((-#)|."_1(1j1##)"0)~#\
miglia

1

JavaScript (ECMAScript 6), 161 byte

(s,n=console.log)=>s.split("").map((q,i,a,p)=>n(p=" ".repeat(q=a.length-++i)+a.map((v,j)=>j>=q&&j%2==q%2?a[j]+' ':'').join(''))||p).reverse().map((v,i)=>i&&n(v))

Provalo online!


1

Perl 5 , 86 + 2 (-F) = 88 byte

Ho usato i suggerimenti di @ Dom e alcune mie modifiche personali per ridurre il conteggio dei byte.

for$k(0..$#F){$i=1;$a[$#F+$k]=$a[$#F-$k]=[map$i++<$k|($i+$k)%2?$":$_,@F]}say"@$_"for@a

Provalo online!


Mi dispiace, felice di aver ricevuto la tua risposta! Ho avuto un po 'di gioco quando stavo cercando di sistemare il mio e non riuscivo a trovare una soluzione, il tuo era un approccio migliore! È possibile eliminare un paio di byte usando -aFper inserire tutte le lettere @Fe un paio di piccole modifiche ( -Fconta come 3 poiché ha bisogno di uno spazio dopo): Provalo online!
Dom Hastings,

1
Perché -F conta come 3? Non dovrebbe essere 2 al massimo? Non è la differenza tra perl -e'code...'e perl -eF 'code...'. Inoltre -anon è necessario quando si utilizza -F, quindi è possibile tagliare il byte.
Xcali,

Esatto. Quindi -Faccetta un argomento, ma non vogliamo passarne uno ( -Fci consente di controllare su cosa si -adivide, nessun argomento, dividere ogni carattere da solo) quindi è la differenza tra perl -ae '...'e perl -aF -e '...'. Per impostazione predefinita si -adivide su /\s+/. Spero che questo aiuti a chiarire!
Dom Hastings,

Inoltre, buon uso di $#F! Dimenticalo sempre!
Dom Hastings,

0

q / kdb +, 55 byte

Soluzione:

-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x};

Esempio:

q)-1(+){{1_a,((2*y)#" ",z),a:x#" "}'[(|)c;1+c:(!)(#)x]x}"Hello World";
          d
         l
        r d
       o l
      W r d
       o l
    o W r d
   l   o l
  l o W r d
 e l   o l
H l o W r d
 e l   o l
  l o W r d
   l   o l
    o W r d
       o l
      W r d
       o l
        r d
         l
          d

Spiegazione:

FARE. la versione ungolf è di 66 byte:

-1 flip{{1_a,((2*y)#" ",z),a:x#" "}'[reverse c;1+c:til count x]x};

Bonus:

Per ottenere lo stesso output dell'esempio (74 byte):

q)-1(+){1_'raze{(a,((2*y)#" ",z),a:x#" ";(2*y+x)#" ")}'[(|)c;1+c:(!)(#)x]x}"Hello World";
                    d
                  l
                r   d
              o   l
            W   r   d
              o   l
        o   W   r   d
      l       o   l
    l   o   W   r   d
  e   l       o   l
H   l   o   W   r   d
  e   l       o   l
    l   o   W   r   d
      l       o   l
        o   W   r   d
              o   l
            W   r   d
              o   l
                r   d
                  l
                    d
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.