Incrocio del personaggio


31

Mi aspettavo di pubblicare qualcosa di più complesso come il mio primo puzzle in PCG, ma una particolare domanda a casa su Stack Overflow mi ha ispirato a pubblicare questo. Loro vogliono:

stampa il seguente schema per ogni parola che contiene un numero dispari di lettere:

P           M
  R       A   
    O   R    
      G       
    O   R      
  R       A   
P           M 


Si noti che le lettere sono una mossa del cavaliere a parte nel modello che è necessario stampare. Quindi, ogni altra colonna è vuota. - (Grazie xnor per averlo segnalato.)

Regole

  1. L'uso del C ++ è proibito. Come posso collegare questa domanda lì.
  2. È possibile utilizzare stdouto qualsiasi mezzo per emettere rapidamente una stringa (ad es. alert()In JavaScript).
  3. Come sempre, vince il codice più corto.

2
Questo è nei post correlati sullo overflow dello stack: stackoverflow.com/q/5508110
Level River St

2
@flawr Penso che significhi strano, come in nessun numero pari.
NinjaBearMonkey,

31
Dio sono stupido, pensavo fosse una specie di oscura informatica abbreviazione =)
flawr,

2
@jpjacobs: byte, a meno che la domanda non specifichi diversamente.
Dennis,

2
Intero programma o solo una funzione? (davvero intelligente da parte mia rispondere prima e fare questa domanda in seguito ...)
Rodolfo Dias,

Risposte:


13

Pyth , 22

Vzjdm?@zd}N,dt-lzd\ Uz

Test:

$ pyth -c 'Vzjdm?@zd}N,dt-lzd\ Uz' <<< "CODE-GOLF"
C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F

Spiegazione:

(Implicit)                  z = input()
(Implicit)                  d = ' '
Vz                          for N in range(len(z)):
  jd                            print(d.join(
    m                               map(lambda d:
     ?@zd                                        z[d] if
         }N                                      N in
           ,dt-lzd                                    (d,len(z)-d-1) else
      \                                          " ",
     Uz                                          range(len(z)))))

Nessun complemento di bit in Pyth?
xnor

@xnor No, ma non sarebbe d'aiuto. Supponiamo che ~bitwise non fosse in Pyth. Quindi potremmo passare t-lzda +lz~d- ancora 5 caratteri.
isaacg,

Vzè un trucco accurato: non sapevo che mi U<string>dava range(len(<string>)).
FryAmTheEggman,

Sì, è una bella caratteristica. Funziona così anche sugli elenchi, ma non necessariamente le tuple. EDIT: Oops, che manca nella documentazione. Lo aggiungerò. Scusate.
isaacg,

20

APL ( 37 35 34 27)

↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞

Prende input dalla tastiera, in questo modo:

      ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞
CODE-GOLF
C               F 
  O           L   
    D       O     
      E   G       
        -         
      E   G       
    D       O     
  O           L   
C               F 

7
Tutti i miei voti appartengono ad APL.
Nit

13

Python 2 - 94 90 89 88

s=input()
L=len(s)
R=range(L)
for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)

Ingresso:

"CODE-GOLF"

Produzione:

C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F

Stavo solo scrivendo la stessa cosa. Il mio unico miglioramento è i in[j,L+~j].
xnor

@xnor: ho trovato una condizione ancora più breve. ;)
Falko,

Intelligente. Puoi ancora fare L+~jcomunque.
xnor

@xnor: Ah, hai ragione. Dimentico sempre il +~trucco ...
Falko,

Puoi fare for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)per salvare un personaggio? (Non ho accesso a Python 2 ora per il test.)
xnor

11

Python 3: 75 caratteri

s=input()
i=n=len(s)
while i:i-=1;a=[" "]*n;a[i]=s[i];a[~i]=s[~i];print(*a)

Per la linea i, iniziamo con un elenco di spazi e impostiamo le voci idalla parte anteriore e posteriore in modo che siano uguali alle lettere della stringa di input. Quindi, stampiamo il risultato.

Le stringhe di Python sono immutabili, quindi adeve essere un elenco di caratteri. L'elenco adeve essere inizializzato all'interno del loop o le modifiche verranno trasferite tra i loop. Usiamo print(*a)per stampare ogni personaggio nell'elenco, spazio separato, che richiede Python 3.

Le linee di uscita sono simmetriche, quindi possiamo icontare alla rovescia anziché verso l'alto usando un ciclo while.

>>> CODE-GOLF
C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F

Funziona anche con un numero pari di lettere.

>>> CODEGOLF
C             F
  O         L  
    D     O    
      E G      
      E G      
    D     O    
  O         L  
C             F

Convertendo questo in Pyth, ottengo VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJ29 byte ... Immagino che dovrò provare qualcos'altro per battere APL. Inoltre, +1 per la prova che Python 3 può
battere in

@fry Python 3 di solito supera i golf 2 nella mia esperienza. Anche se nulla cambia altrove, la maggior parte delle sfide fornisce un input e prevede un output, e len("raw_input()") + len("print ") > len("input()") + len("print()").
undergroundmonorail

@undergroundmonorail Bene, il problema è che input() è valido anche in Python 2 (agisce in modo leggermente diverso), quindi a meno che l'input per la sfida non sia abbastanza rigoroso, Python 2 di solito vincerà.
FryAmTheEggman,

Caspita, anche con Python 2 e il print" ".join(a)tuo codice è più breve (82) del mio.
Falko,

@FryAmTheEggman Vedi la mia risposta: è un adattamento dell'altra risposta di Python ed è molto più breve di APL. Purtroppo a Pyth non piace molto assegnare agli indici.
isaacg,

8

CJam, 27 25 byte

l_,S*:Sf{W):W2$tW~@tS}zN*

Provalo online.

Esempio di esecuzione

$ cjam <(echo 'l_,S*:Sf{W):W2$tW~@tS}zN*') <<< CROSS; echo
C       S 
  R   S   
    O     
  R   S   
C       S 

Come nell'esempio nella risposta, ogni riga ha uno spazio bianco finale.

Come funziona

                             " N := '\n'; R := []; S = ' '; W := -1 ";
l                            " Q := input()                         ";
 _,S*:S                      " S := len(Q) * S                      ";
       f{            }       " for each C in Q:                     ";
                             "   T := S                             ";
         W):W                "   W += 1                             ";
             2$t             "   T[W] := C                          ";
                W~@t         "   T[~W] := C                         ";
                             "   R += [T]                           ";
                    S        "   R += [S]                           ";
                      z      " R := zip(R)                          ";
                       N*    " R := N.join(R)                       ";
                             " print R                              ";

1
Mi dispiace che questa sia fondamentalmente una "grande risposta!" commento, ma ho dovuto dire che non è mai, mai , sarebbe venuto in mente di costruire la casella da colonne invece che per righe.
FryAmTheEggman,

4

Java - 168

Un semplice ciclo nidificato, non c'è niente di veramente speciale qui.

class C{public static void main(String[]a){int b=-1,c=a[0].length()-1,d;for(;b++<c;)for(d=-1;d++<c;)System.out.print((b==d|b==c-d?a[0].charAt(d):" ")+(c==d?"\n":""));}}

Con interruzioni di riga:

class C{
    public static void main(String[]a){
        int b=-1,c=a[0].length()-1,d;
        for(;b++<c;)
            for(d=-1;d++<c;)
                System.out.print(
                    (b==d|b==c-d?a[0].charAt(d):" ")+
                    (c==d?"\n":""));
    }
}

4

Pure Bash, 94 byte

l=${#1}
for((;t<l*l;t++));{
((x=t%l))||echo
((x-t/l&&x+t/l+1-l))&&printf \ ||printf ${1:x:1}
}

1
Troppi t%lcalcoli. Salvalo al primo utilizzo in una variabile, ((x=t%l))quindi usa la variabile per ridurla a 94 caratteri.
arte

Ah sì, l'ho fatto per x=t%led y=t/led è stato più a lungo ... non mi è passato per la testa solo per usare solo x
Digital Trauma,

4

Ruby, 64 anni

f=->w{x=w.size
x.times{|i|y=" "*x
y[i],y[~i]=w[i],w[~i]
puts y}}

Spiegazione

  • L'input viene preso come argomento per un lambda. Si aspetta a String.
  • In un ciclo che scorre attraverso ogni carattere della parola ( nin totale):
    • Crea una stringa composta da nspazi.
    • Sostituisci lo spazio ith e n-ith ( ~i, grazie xnor) con il carattere ith e n-ith dell'input.
    • Stampa la linea

7
Congratulazioni per aver pubblicato la 25.000a risposta! :) (In realtà, non sono sicuro al 100%, questo è quello, a causa della memorizzazione nella cache. Ma era l'ultima risposta, quando ho visto per la prima volta "25.000 risposte" nelle statistiche del sito.)
Martin Ender,

2
Puoi fare -i-1come complemento di bit ~i.
xnor

È molto intelligente, grazie!
britishtea,

2
Con questo approccio, in realtà sembra essere utile usare stdin invece di un lambda: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(presuppone che l'input non sia terminato da una nuova riga, ad es echo -n CODE-GOLF.). Si può quindi fare un ulteriore uso di .charsper salvare un altro personaggio:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero,

4

JavaScript (E6) 101 95 129 136

Modifica la spaziatura tra le lettere errata. Fisso.
Modifica più semplice e più breve usando il classico per i loop
Come funzione, output tramite popup.

F=a=>{
  for(l=a.length+1,i=s=o='';++i<l;s='\n')
    for(j=0;++j<l;)
      o+=s+((s=' ')+a)[j==i|i+j==l&&j]
  alert(o)
}

Versione precedente utilizzando .map

F=a=>alert([...a].map((c,p)=>
  --q<p
  ?B(q)+a[q]+B(p-q-1)+c 
  :B(p)+c+(p-q?B(q-p-1)+a[q]:'')
,B=n=>' '.repeat(n),q=a.length).join('\n'))

Test nella console FireFox / FireBug

F('Java-Script')

Produzione

J                   t
  a               p  
    v           i    
      a       r      
        -   c        
          S          
        -   c        
      a       r      
    v           i    
  a               p  
J                   t

2
Questo non ha una spaziatura orizzontale sufficiente - ci dovrebbero essere colonne di tutti gli spazi tra ogni colonna con lettere.
isaacg,

4

Befunge-93, 68 71

:~:84*-!#@#v_\:2*\4+p1+
::+\4+g:!| >$1+0:>p1-::
00+4\*2:\<>0p#:- ^#2g

Puoi provarlo qui . Verrà visualizzata una finestra di dialogo di input su ogni passaggio ~; inserisci la tua parola un carattere alla volta (significa che l'input è 'klunky' dopo tutto), che termina con uno spazio.

Non verrà stampato sulla console; questo non sarebbe Befunge senza un accenno di auto-modifica, dopo tutto! Invece modificherà la propria griglia per visualizzare il messaggio. Al termine, la griglia avrà un aspetto simile al seguente:

 ~:84*-!#@#v_\:2*\4+p1+
::+\4+g:!| >$1+0:>p1-::
00+4\*2:\<>0p#:- ^#2g

c               f      
  o           l        
    d       o          
      e   g            
        -              
      e   g            
    d       o          
  o           l        
c               f

(Nota il nobile sacrificio della cella in (0,0), dopo che sappiamo che il puntatore non ci andrà più, allo scopo di memorizzare un dato.)

Funziona anche con input di lunghezza pari. Si noti che, poiché Befunge-93 è limitato a una griglia 80x25, la dimensione di input è limitata a 21 caratteri se lo si esegue in un interprete Befunge-93. Eseguendolo come Befunge-98 dovrebbe rimuovere questo limite.

Modifica : ora funziona più lungo le linee dell'output previsto, a scapito di soli tre caratteri di lunghezza.


Si noti che le lettere sono separate da una colonna vuota. Le lettere sono relativamente a forma di L.
sampathsris,

Drats! Ciò ha complicato le cose piuttosto significativamente. Penso di poterlo salvare, ma si aggiungerà alla dimensione finale ... vabbè.
Kasran,

4

Javascript 102 84 85

Modifica: ho dovuto correggere la spaziatura. Non più così piccolo.

function p(s){for(i in s){o='';for(n in s)o+=(n==i?s[n]:n==s.length-1-i?s[n]:' ')+' ';console.log(o)}}

p('Thanks-Dennis')

T                       s
  h                   i
    a               n
      n           n
        k       e
          s   D
            -
          s   D
        k       e
      n           n
    a               n
  h                   i
T                       s

Questo non ha una spaziatura orizzontale sufficiente.
Dennis,

1
Wow, più corto del mio e nemmeno usando ES6. +1
Scimonster,

Meglio, ma la spaziatura è ancora sbagliata (guarda la X). Inoltre, a meno che la domanda non indichi diversamente, è necessario scrivere un programma o una funzione. Gli snippet con variabili hardcoded sono generalmente disapprovati.
Dennis,

1
E non puoi farcela function(s)dal momento che non fai ricorso?
Zacharý,

3

CJam, 38 36 35 34 32 byte

l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}

Provalo qui. Questo legge la parola di input da STDIN. Funziona anche con un numero pari di personaggi. Questo stampa una colonna finale di spazi, ma non vedo nulla nelle regole contro questo.

Spiegazione

l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}
l:I                              "Read input and store it in I.";
   ,                             "Get string length.";
    ,_                           "Turn into range and duplicate.";
      f{                       } "Map block onto first range, with second range on the stack.";
        f{                   }   "Map block onto second range, with first iterator in stack.
                                  Each invocation of this block will start with grid coordinates
                                  y and x on the stack (x on top).";
          _2$=                   "Duplicate x, duplicate y, check for equality.";
              @2$+               "Pull up y, duplucate x, add,";
                  I,(=           "Check if that's one less than the string length.";
                      |          "Bitwise or between conditions.";
                       \         "Swap condition and x.";
                        I=       "Take x'th character from the string.";
                          S?     "Push a space and select character depending on condition.";
                            S    "Push another space.";
                              N  "Push a line feed.";

Il contenuto della pila viene stampato automaticamente alla fine del programma.


Mio caro CJam, sei appena stato battuto da APL. ^ _ ^
vaxquis,

@vaxquis Sono stato sorpreso di essere riuscito a batterlo due volte in primo luogo. Questo problema sembra molto più adatto ad APL e co che ai linguaggi basati su stack.
Martin Ender,

2
beh, almeno è più facile scrivere l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}su un tovagliolo che ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... ridacchiare
vaxquis il

Bene, qualcun altro è riuscito a battermi usando CJam, e non posso rendere il mio programma più breve, quindi CJam alla fine mi ha battuto. (Ma Pyth ottiene la corona.) (Detto questo, @vaxquis, APL è molto più facile da leggere rispetto alla maggior parte delle altre lingue utilizzate qui, sicuramente una volta che conosci i 60 caratteri o giù di lì, e certamente rispetto a Pyth o CJam o anche J.)
marinus,

3

C, 105

due modi leggermente diversi di farlo.

c,i,j;main(int l,char**v){for(l=strlen(v[1]);j-l;)putchar((c=v[1][i++])?i-1-j&&l-i-j?32:c:(i=0,j++,10));}

i,j;main(int l,char**v){for(l=strlen(v[1]);j-l;i++)putchar((l-i)?i-j&&l-i-j-1?32:v[1][i]:(i=-1,j++,10));}

Se vuoi aggiungere spazi extra, sostituiscili putchar(con printf(" %c",altri 5 caratteri.


3

J - 36 30 byte:

Modifica: 6 caratteri più brevi, i crediti vanno a @algorithmshark .

(1j1#"1' '&,({~](*>.*&|.)=)#\)

per esempio:

   (1j1#"1' '&,({~](*>.*&|.)=)#\) 'Code-Golf'
C               f
  o           l  
    d       o    
      e   G      
        -        
      e   G      
    d       o    
  o           l  
C               f

Bonus: funziona anche con stringhe di lunghezza pari:

   (1j1#"1' '&,({~](*>.*&|.)=)#\) 'CodeGolf'
C             f
  o         l  
    d     o    
      e G      
      e G      
    d     o    
  o         l  
C             f

3

Prolog - 240 byte

:-initialization m.
+[]. +[H|T]:-(H=' ';!),+T.
+[H|T]+I+X:-0=:=I,X=H;+T+(I-1)+X.
+L+I+C+S:-L=:=I;S=[D|E],+C+I+B,+C+(L-I-1)+B,+B+2*I+D,+L+(I+1)+C+E,+B,writef('%s\n',[B]).
-X:-get_char(C),(C='\n',X=[];X=[C|Y],-Y).
m:- -X,length(X,L),+L+0+_+X.

Invocazione:

$ echo "Code-Golf" | swipl -qf c.pl
C               f
  o           l
    d       o
      e   G
        -
      e   G
    d       o
  o           l
C               f

Leggibile:

:- initialization(main).

vars_to_spaces([]).
vars_to_spaces([' '|T]) :- vars_to_spaces(T).
vars_to_spaces([_|T]) :- vars_to_spaces(T).

get_index([Head|_], Index, Result) :-
    0 =:= Index,
    Result = Head.
get_index([_|Tail], Index, Result) :-
    get_index(Tail, Index-1, Result).

print_loop(Length, Index, Board, String) :-
    Length =:= Index;
    String = [FirstChar|RestString],
    get_index(Board, Index, Line),
    get_index(Board, Length-Index-1, Line),
    get_index(Line, 2*Index, FirstChar),
    print_loop(Length, Index+1, Board, RestString),
    vars_to_spaces(Line),
    writef('%s\n', [Line]).

get_line(Line) :-
    get_char(C),
    (   C = '\n', Line = [];
        Line = [C|More], get_line(More)).

main :-
    get_line(String),
    length(String, Length),
    print_loop(Length, 0, _, String).

3

Tela , 5 byte

\\:⇵n

Provalo qui!

Spiegazione:

\      create a diagonal of the input
 \     create an even steeper diagonal of that
  :⇵   reverse a copy of it vertically
    n  overlap the two

3

R , 99 98 93 89 byte

m=ifelse(diag(l<-length(w<-el(strsplit(scan(,''),'')))),w,' ')
write(pmax(m,m[,l:1]),1,l)

Provalo online!

La riga 1 legge la stringa di input, la divide in caratteri, ne memorizza la lunghezza e crea una matrice con la parola sulla sua diagonale principale - le lettere della parola sono sovrapposte a una matrice di identità (e ripetute per impostazione predefinita per abbinarne la lunghezza) e solo quelle corrispondenti 1 vengono mantenuti, altri vengono sostituiti da spazi.

La linea 2 stampa una matrice formata da elementi della matrice diagonale o della sua versione specchiata orizzontalmente, a seconda di quale sia maggiore.

−2 + 1 = −1 byte grazie a JayCe

−4 byte grazie a Giuseppe


1
Dolce! E bella spiegazione. Puoi salvare 2 byte
JayCe

1
guardando le altre risposte e la domanda - Sembra che la matrice dovrebbe essere più grande (spazio extra) - L'output non dovrebbe essere una matrice quadrata ..
JayCe

@JayCe Grazie per i 2 byte! E grazie per il commento sulla formattazione, probabilmente hai ragione (anche se le regole potrebbero essere più chiare su questo). Fortunatamente tutto ciò di cui aveva bisogno era mettere uno spazio nel separatore durante la stampa.
Robert Hacken,

89 byte usandopmax e integrando alcuni altri compiti.
Giuseppe,

@Giuseppe Grazie! Purtroppo, non è ancora abbastanza per battere la soluzione di J.Doe
Robert Hacken,

2

C # ( 214 212)

(Certamente male) Versione golfizzata:

using System;class A{static void Main(){char[]a,w=Console.ReadLine().ToCharArray();int l=w.Length,i=0;for(;i<l;i++){a=new string(' ',2*l-1).ToCharArray();a[2*i]=w[i];a[2*l-2*i-2]=w[l-i-1];Console.WriteLine(a);}}}

Versione non golfata:

using System;

class A
{
  static void Main()
  {
    char[] a, w = Console.ReadLine().ToCharArray();
    int l = w.Length, i = 0;
    for (; i < l; i++)
    {
      a = new string(' ', 2 * l - 1).ToCharArray();
      a[2 * i] = w[i];
      a[2 * l - 2 * i - 2] = w[l - i - 1];
      Console.WriteLine(a);
    }
  }
}

Eventuali suggerimenti, suggerimenti, trucchi o osservazioni sono i benvenuti, poiché questo è il mio primo tentativo di CodeGolf. Volevo solo provarlo, anche se so che la lunghezza del mio byte C # non si avvicina nemmeno al doppio delle migliori soluzioni;)

E voi ragazzi come conteggiate i vostri byte? Ho appena pubblicato quanto sopra in una finestra di Quick Watch e l'ho fatto .Length. Potrei scrivere un piccolo programma per contare byte per me, ma scommetto che c'è un modo più semplice che non conosco ancora.


È possibile salvare due byte rimuovendo gli spazi in for(;i < l;i++).
Decadimento beta

Inoltre, io uso questo per il mio conteggio di byte.
Decadimento beta

@BetaDecay Ah bene, devo aver trascurato quelli. E grazie per il link!
Invisible

2

JavaScript (ES6) - 185 177 175 170 byte

f=n=>{return s='  ',r='repeat',n=[...n],l=n.length,j=l/2-.5,[...h=n.slice(0,j).map((c,i)=>s[r](i)+c+s[r](l-2-(i*2))+' '+n[l-i-1]),s[r](j)+n[j],...h.reverse()].join('\n')}

Inseriscilo nella console di Firefox ed eseguilo come f('PROGRAM'):

P           M
  R       A
    O   R
      G
    O   R
  R       A
P           M

f("CODE-GOLF"):

C               F
  O           L
    D       O
      E   G
        -
      E   G
    D       O
  O           L
C               F


Ho visto anche quello.
Scimonster,

2

Mathematica, 149 byte

FromCharacterCode@Flatten[Append[Riffle[#,32],10]&/@MapThread[Max,{#,Reverse@#,ConstantArray[32,Dimensions@#]},2]&@DiagonalMatrix@ToCharacterCode@#]&

Input passato come parametro alla funzione; La funzione restituisce la stringa di output. C'è una nuova riga finale alla fine dell'output.

Spiegazione: Creiamo una matrice diagonale con la stringa, quindi ne creiamo una copia capovolta verticalmente usando Reverse@#per invertire le righe. Quindi abbiamo una terza matrice delle stesse dimensioni contenente solo 32 (spazio ASCII). Usiamo MapThreadper prendere il massimo dal punto di vista degli elementi di queste 3 matrici. Infine, Rifflespaziamo in ogni riga, Appenduna nuova riga alla fine e Flattenil risultato.


2

C , 119

i,j;main(int l,char**v){l=strlen(v[1]);for(i=0;i<l;i++){for(j=0;j<l;j++)putchar((i-j)*(j-l+i+1)?32:v[1][j]);puts("");}}

Questo potrebbe non essere compilato come C ++, quindi spero di non aver violato le regole :)


1. L'output è attualmente errato. Dovrebbe esserci uno spazio tra le lettere. 2. i=0e j=0non è necessario, poiché le variabili globali sono inizializzate a zero. 3. È possibile utilizzare main(l,v)char**v;invece di main(int l,char**v). 4. Se si aggiorna icome i+=puts(""), è possibile eliminare le parentesi graffe del loop esterno.
Dennis,

2

Perl - 90

Potrebbe essere possibile spremere altri personaggi da questo:

($j=$i++%8)==7?++$k&&print"\n":print$j+1==$k||7-$j==$k?"$_ ":"  "for split//,($_ x y///c)

89+ 1per -n.

Corri con:

echo "program" | perl -nE'($j=$i++%8)==7?++$k&&print"\n":print$j+1==$k||7-$j==$k?"$_ ":"  "for split//,($_ x y///c)'

Produzione:

p           m
  r       a
    o   r
      g
    o   r
  r       a
p           m

2

T-SQL: 180

Prendendo l'input dalla variabile @i

DECLARE @s VARCHAR(MAX)=REPLICATE('  ',LEN(@i)),@ INT=1a:PRINT STUFF(STUFF(@s,@*2-1,1,SUBSTRING(@i,@,1)),LEN(@i)*2-(@*2)+1,1,SUBSTRING(@i,LEN(@i)-@+1,1))SET @+=1IF @<=LEN(@i)GOTO A

Questo inserisce / decrementa singoli caratteri dall'inizio e alla fine in una serie di spazi.

Risultato del test

DECLARE @i VARCHAR(MAX)='Super Large'
DECLARE @s VARCHAR(MAX)=REPLICATE('  ',LEN(@i)),@ INT=1a:PRINT STUFF(STUFF(@s,@*2-1,1,SUBSTRING(@i,@,1)),LEN(@i)*2-(@*2)+1,1,SUBSTRING(@i,LEN(@i)-@+1,1))SET @+=1IF @<=LEN(@i)GOTO A
S                   e 
  u               g   
    p           r     
      e       a       
        r   L         

        r   L         
      e       a       
    p           r     
  u               g   
S                   e 

2

PowerShell 118 102 97

($x=[char[]]"$args")|%{$i++;$y=[char[]]" "*$x.Count;$y[$i-1]=$x[$i-1];$y[-$i]=$x[-$i];$y-join' '}

Uscite:

PS C:\PowerShell> .\cross.ps1 SWORD
S       D
  W   R
    O
  W   R
S       D


2

JavaScript (Node.js) , 81 byte

f=s=>[...s].map((_,i,a)=>a.map((c,j)=>j==i|j==s.length+~i?c:' ').join` `).join`
`

EDIT : -1 Grazie Joe King. Non ho visto che il TIO offre pasta diretta preformattata per CG.

Provalo online!


tra l'altro, il codice in eccesso per eseguire il codice in TIO può andare nel piè di pagina del programma. Ciò consente di determinare il conteggio di byte corretto e utilizzare il formato di risposta PPCG automatizzato in modo più fluido. es. provalo online!
Jo King,

-i-1può essere+~i
Jo King il

1

C # 208

static void Main()
{
string s=Console.ReadLine(),t="";
int n=s.Length;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)t+=s[i];
else if(i==n-j-1)t+=s[n-i-1];
t+=" ";
}
t+="\n";
}
Console.WriteLine(t);
}

Salva 11 personaggi preziosi con t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
sampathsris,

Puoi rimuovere quelle nuove righe?
Zacharý,


1

Non importa per quanto tempo, ci deve sempre essere una risposta in ...

Java - 289 234 byte

public static void main(String[]a){int l=a.length-1,i=0,j;for(;i<=l;i++){for(j=0;j<=l;j++){if(j==i)System.out.print(a[i]);else if(i==l-j)System.out.print(a[j]);else System.out.print(" ");System.out.print(" ");}System.out.println();}}}

Ungolfed:

    class A {

    public static void main(String[] a) {
        int l = a.length - 1, i = 0, j;
        for (; i <= l; i++) {
            for (j=0; j <= l;j++) {
                if (j == i)
                    System.out.print(a[i]);
                else if (i == l-j)
                    System.out.print(a[j]);
                else
                    System.out.print(" ");
                System.out.print(" ");
                }            
            System.out.println();
        }
    }
}

L'output, fatto male, è:

P           M 
  R       A   
    O   R     
      G       
    O   R     
  R       A   
P           M 

Aggiunto l' import java.util.Scannerinterno del codice perché non ricordo mai se le importazioni contano ai fini del conteggio dei byte ... Accidenti, faccio davvero schifo.


2
Le importazioni contano. Ciò è in parte dovuto alla sintassi import-and-alias di Python: from math import floor as fche è un po 'economica

Dovresti essere in grado di salvare un sacco di personaggi combinando tutte le System.out.printchiamate in una, usando un paio di operatori ternari.
DLosc,

@DLosc Potresti darmi qualche esempio?
Rodolfo Dias,

1
Sì, in realtà la risposta di Geobits è un esempio perfetto: vedi il contenuto della System.out.printchiamata alla fine.
DLosc,

1
@RodolfoDias Non la pensi così. I miei primi campi da golf a Java sono stati terribili , e normalmente riesco ancora a radere una buona dose dalle mie "prime revisioni" se guardo abbastanza duro;)
Geobits

1

C # (192/170)

using System;class P{static void Main(){var s=Console.ReadLine();int x,y,l=s.Length;for(x=0;x<l;x++){for(y=0;y<l;y++)Console.Write(x==y||l-x==y+1?s.Substring(x,1):" ");Console.Write("\n");};}}

Oppure, come "Solo principale ()":

static void Main(){var s=Console.ReadLine();int x,y,l=s.Length;for(x=0;x<l;x++){for(y=0;y<l;y++)Console.Write(x==y||l-x==y+1?s.Substring(x,1):" ");Console.Write("\n");};}
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.