Cruz de caracteres

31

Eu estava esperando publicar algo mais complexo como meu primeiro quebra-cabeça no PCG, mas uma pergunta específica sobre dever de casa no Stack Overflow me inspirou a postar isso. Eles querem:

imprima o seguinte padrão para qualquer palavra que contenha número ímpar de letras:

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


Observe que as letras são separadas por um cavaleiro no padrão que você precisa imprimir. Portanto, todas as outras colunas estão vazias. - (Obrigado xnor por apontar isso.)

Regras

  1. É proibido o uso de C ++. Como posso vincular essa pergunta lá.
  2. Você pode usar stdout, ou qualquer outro meio de gerar uma string rapidamente (por exemplo, alert()em JavaScript).
  3. Como sempre, o código mais curto vence.
sampathsris
fonte
2
Isto está nos posts relacionados ao estouro de pilha: stackoverflow.com/q/5508110
Level River St
2
@ flawr Eu acho que isso significa estranho, pois não é um número par.
NinjaBearMonkey
31
Deus sou estúpido, eu pensei que era uma espécie de computador cientista abreviatura obscura =)
flawr
2
@jpjacobs: bytes, a menos que a pergunta diga explicitamente o contrário.
Dennis
2
Programa inteiro ou apenas uma função? (real inteligente de mim para responder a primeira e fazer esta pergunta mais tarde ...)
Rodolfo Dias

Respostas:

13

Pyth , 22

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

Teste:

$ 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

Explicação:

(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)))))
isaacg
fonte
Nenhum complemento em Pyth?
Xnor
@ xnor Não, mas não ajudaria. Suponha que ~não fosse bit a bit em Pyth. Então poderíamos mudar t-lzdpara +lz~d- ainda 5 caracteres.
Isaacg #
Vzé um truque legal: eu não sabia o que U<string>dava range(len(<string>)).
FryAmTheEggman
Sim, é um bom recurso. Funciona assim também em listas, mas não necessariamente em tuplas. EDIT: Opa, isso está faltando na documentação. Eu vou adicionar. Desculpe.
Isaacg #
20

APL ( 37 35 34 27)

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

É preciso entrada do teclado, assim:

      ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞
CODE-GOLF
C               F 
  O           L   
    D       O     
      E   G       
        -         
      E   G       
    D       O     
  O           L   
C               F 
marinus
fonte
7
Todos os meus votos são da 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)

Entrada:

"CODE-GOLF"

Saída:

C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F
Falko
fonte
Eu estava escrevendo a mesma coisa. Minha única melhoria é i in[j,L+~j].
Xnor 29/10
@xnor: Encontrou uma condição ainda mais curta. ;)
Falko
Inteligente. Você ainda pode fazer isso L+~j.
Xnor
@xnor: Ah, você está certo. Eu sempre esqueço o +~truque ...
Falko
Você pode fazer for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)para salvar um char? (Eu não tenho acesso ao Python 2 agora para testar.) #
228
11

Caracteres Python 3: 75

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

Para a linha i, começamos com uma lista de espaços e configuramos as entradas ida frente e de trás para serem iguais às letras da sequência de entrada. Então, imprimimos o resultado.

Seqüências de caracteres Python são imutáveis, portanto, adeve haver uma lista de caracteres. A lista adeve ser inicializada dentro do loop ou as modificações serão transferidas entre os loops. Usamos print(*a)para imprimir cada caractere da lista, separado por espaço, o que requer Python 3.

As linhas de saída são simétricas, portanto, podemos ter uma icontagem regressiva em vez de aumentar usando um loop while.

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

Também funciona para um número par de letras.

>>> CODEGOLF
C             F
  O         L  
    D     O    
      E G      
      E G      
    D     O    
  O         L  
C             F
xnor
fonte
Convertendo isso para Pyth, recebo VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJ29 bytes ... Acho que vou ter que tentar outra coisa para vencer o APL. Além disso, uma para a prova que o Python 3 pode out-golf Python 2 (às vezes)
FryAmTheEggman
@ Python Python 3 geralmente out-golfs 2 na minha experiência. Mesmo que nada mude em outro lugar, a maioria dos desafios fornece uma entrada e espera uma saída, e len("raw_input()") + len("print ") > len("input()") + len("print()").
Undergroundmonorail
@undergroundmonorail Bem, o problema disso é que input() também é válido no python 2 (ele age de maneira um pouco diferente); portanto, a menos que a entrada para o desafio seja bastante rigorosa, o python 2 geralmente vencerá.
FryAmTheEggman
Uau, mesmo com o Python 2 e print" ".join(a)seu código é mais curto (82) que o meu.
Falko
@FryAmTheEggman Veja minha resposta - é uma adaptação da outra resposta python e é muito mais curta que a APL. Pyth realmente não gosta de atribuir a índices, infelizmente.
Isaacg #
8

CJam, 27 25 bytes

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

Experimente online.

Exemplo de execução

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

Como o exemplo na resposta, cada linha possui espaços em branco à direita.

Como funciona

                             " 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                              ";
Dennis
fonte
1
Lamento que esta seja basicamente uma 'ótima resposta!' comentário, mas eu só tinha que dizer que nunca, jamais , teria ocorrido a mim para construir a caixa por colunas em vez de linhas.
FryAmTheEggman
4

Java - 168

Um loop aninhado simples, não há nada realmente especial acontecendo aqui.

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":""));}}

Com quebras de linha:

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":""));
    }
}
Geobits
fonte
4

Pure Bash, 94 bytes

l=${#1}
for((;t<l*l;t++));{
((x=t%l))||echo
((x-t/l&&x+t/l+1-l))&&printf \ ||printf ${1:x:1}
}
Trauma Digital
fonte
1
Muitos t%lcálculos. Salve-o no primeiro uso em uma variável ((x=t%l))e use a variável para reduzi-lo para 94 caracteres.
manatwork
Ah sim, eu tinha feito isso por x=t%le y=t/le já não era ... não passou pela minha cabeça apenas para uso x somente
Trauma Digital
4

Ruby, 64

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

Explicação

  • A entrada é tomada como argumento para uma lambda. Espera a String.
  • Em um loop que percorre todos os caracteres da palavra ( nno total):
    • Crie uma String composta por nespaços.
    • Substitua o espaço ith e n-ith ( ~i, graças xnor) pelo caráter th ie n-ith da entrada.
    • Imprimir a linha
britishtea
fonte
7
Parabéns por postar a 25.000ª resposta! :) (Na verdade, não tenho 100% de certeza, é esse, devido ao cache. Mas foi a resposta mais recente, quando vi pela primeira vez "25.000 respostas" nas estatísticas do site.)
Martin Ender
2
Você pode fazer -i-1como complemento de bits ~i.
Xnor
Isso é muito inteligente, obrigado!
britishtea
2
Com essa abordagem, parece realmente benéfico usar stdin em vez de um lambda: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(assume que a entrada não é finalizada por uma nova linha, por exemplo echo -n CODE-GOLF). Pode-se fazer uso adicional .charspara salvar outro personagem:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero
4

JavaScript (E6) 101 95 129 136

Editar espaçamento incorreto de letras. Fixo.
Editar Mais simples e mais curto usando o clássico para loops
Como função, faça a saída via pop-up.

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

Versão anterior usando .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'))

Teste no console do FireFox / FireBug

F('Java-Script')

Saída

J                   t
  a               p  
    v           i    
      a       r      
        -   c        
          S          
        -   c        
      a       r      
    v           i    
  a               p  
J                   t
edc65
fonte
2
Isso não tem espaçamento horizontal suficiente - deve haver colunas de todos os espaços entre cada coluna com letras.
Isaacg #
4

Befunge-93, 68 71

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

Você pode testá-lo aqui . Ele aparecerá com uma caixa de diálogo de entrada em cada passagem ~; digite sua palavra, um caractere de cada vez (afinal, a entrada é 'klunky'), terminando com um espaço.

Não será impresso no console; isso não seria o Befunge sem uma pitada de auto-modificação, afinal! Em vez disso, modificará sua própria grade para exibir a mensagem. Depois que terminar, a grade será mais ou menos assim:

 ~: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

(Observe o nobre sacrifício da célula em (0,0), depois que soubermos que o ponteiro não irá mais para lá, com o objetivo de armazenar um dado.)

Também funciona com entradas de comprimento uniforme. Observe que, como o Befunge-93 é limitado a uma grade de 80x25, o tamanho da entrada é limitado a 21 caracteres se você o executar em um intérprete do Befunge-93. Executá-lo como Befunge-98 deve remover esse limite.

Editar - Agora funciona mais ao longo da linha de saída pretendida, às custas de apenas três caracteres.

Kasran
fonte
Observe que as letras são separadas por uma coluna em branco. As letras são relativamente em forma de L.
Sampathsris
Drats! Isso complicou bastante as coisas. Acho que posso salvar isso, mas isso aumentará o tamanho final ... tudo bem.
Kasran 30/10/14
4

Javascript 102 84 85

Edit: teve que corrigir o espaçamento. Não é mais tão pequeno.

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
Rip Leeb
fonte
Isso não possui espaçamento horizontal suficiente.
Dennis
1
Uau, mais curto que o meu e nem mesmo usando o ES6. +1
Scimonster 30/10
Melhor, mas o espaçamento ainda está errado (veja o X). Além disso, a menos que a pergunta diga o contrário, você deve escrever um programa ou uma função. Trechos com variáveis ​​codificadas são geralmente desaprovados.
Dennis
1
E você não pode fazer isso function(s)desde que não recorra?
Zachary
3

CJam, 38 36 35 34 32 bytes

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

Teste aqui. Isso lê a palavra de entrada de STDIN. Também funciona para um número par de caracteres. Isso imprime uma coluna de espaços à direita, mas não vejo nada nas regras contra isso.

Explicação

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

O conteúdo da pilha é impresso automaticamente no final do programa.

Martin Ender
fonte
Meu querido CJam, você acabou de ser derrotado pela APL. ^ _ ^
vaxquis
@vaxquis Fiquei surpreso por ter conseguido vencê-lo duas vezes em primeiro lugar. Esse problema parece muito mais adequado para APL e co do que para idiomas baseados em pilha.
Martin Ender
2
Bem, pelo menos é mais fácil de escrever l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}em um guardanapo de ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... risada
vaxquis
Bem, alguém conseguiu me derrotar usando CJam, e eu não posso diminuir meu programa, então CJam acabou me vencendo. (Mas Pyth obtém a coroa.) (Dito isto, @vaxquis, a APL é muito mais fácil de ler do que a maioria dos outros idiomas usados ​​aqui, certamente depois que você conhecer os 60 caracteres ou mais, e certamente quando comparado a Pyth ou CJam ou )
Marinus 30/10
3

C, 105

duas maneiras ligeiramente diferentes de fazê-lo.

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 você deseja adicionar espaços extras, substitua putchar(com printf(" %c",por um extra de 5 caracteres.

Level River St
fonte
3

J - 36 30 bytes:

Editar: 6 caracteres mais curtos, os créditos vão para @algorithmshark .

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

por exemplo:

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

Bônus: também funciona com cadeias de comprimento par:

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

Prolog - 240 bytes

:-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.

Invocação:

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

Legível:

:- 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).
kay
fonte
3

Tela , 5 bytes

\\:⇵n

Experimente aqui!

Explicação:

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

R , 99 98 93 89 bytes

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

Experimente online!

A linha 1 lê a sequência de entrada, divide-a em caracteres, armazena seu comprimento e cria uma matriz com a palavra na diagonal principal - as letras da palavra são sobrepostas em uma matriz de identidade (e repetidas por padrão para corresponder ao seu comprimento) e apenas as que correspondem 1s são retidos, outros sendo substituídos por espaços.

A linha 2 imprime uma matriz formada por elementos da matriz diagonal ou de sua versão espelhada horizontalmente, o que for maior.

−2 + 1 = -1 byte graças a JayCe

-4 bytes graças a Giuseppe

Robert Hacken
fonte
1
Doce! E agradável explanation.you pode salvar 2 bytes
Jayce
1
olhando para ele outras respostas e à pergunta - Parece que a matriz deve ser maior (espaço extra) - a saída não deve ser uma matriz quadrada ..
Jayce
@ JayCe Obrigado pelos 2 bytes! E obrigado pelo comentário sobre a formatação, você provavelmente está certo (embora as regras possam ser mais claras sobre isso). Felizmente, tudo o que era necessário era colocar um espaço no separador durante a impressão.
Robert Hacken
89 bytes usandopmax e incorporando mais algumas atribuições.
Giuseppe
@Giuseppe Thanks! Infelizmente, ainda não é suficiente para vencer J.Doe 's solução
Robert Hacken
2

C # ( 214 212)

(Certamente mal) Versão Golfed:

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

Versão não destruída:

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

Quaisquer dicas, dicas, truques ou observações são muito bem-vindas, pois esta é minha primeira tentativa no CodeGolf. Eu só queria experimentá-lo, mesmo sabendo que meu comprimento de byte em C # nem chegará nem perto do dobro das melhores soluções;)

E como vocês contam seus bytes? Acabei de publicar o que foi dito acima em uma janela do Quick Watch e o fiz .Length. Eu poderia escrever um pequeno programa para contar bytes para mim, mas aposto que há uma maneira mais fácil que ainda não conheço.

InvisiblePanda
fonte
Você pode salvar dois bytes removendo os espaços em for(;i < l;i++).
Beta Decay
Além disso, eu uso isso para minha contagem de bytes.
Beta Decay
@BetaDecay Ah, ótimo, eu devo ter esquecido aqueles. E obrigado pelo link!
InvisiblePanda
2

JavaScript (ES6) - 185 177 175 170 bytes

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')}

Coloque isso no console do Firefox e execute como 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
Scimonster
fonte
Eu também vi esse.
Scimonster
2

Mathematica, 149 bytes

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

Entrada passada como parâmetro para a função; A função retorna a sequência de saída. Há uma nova linha no final da saída.

Explicação: Criamos uma matriz diagonal com a sequência e, em seguida, criamos uma cópia dela invertida verticalmente usando Reverse@#para reverter as linhas. Então temos uma terceira matriz das mesmas dimensões, contendo apenas 32 (espaço ascii). Usamos MapThreado máximo de três matrizes por elemento. Por fim, Riffleespaçamos em cada linha, Appenduma nova linha no final e Flatteno resultado.

jcai
fonte
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("");}}

Isso pode não ser compilado como C ++, portanto, espero não ter violado as regras :)

VX
fonte
1. A saída está incorreta no momento. Deve haver um espaço entre as letras. 2. i=0e j=0não é necessário, pois as variáveis ​​globais são inicializadas em zero. 3. Você pode usar em main(l,v)char**v;vez de main(int l,char**v). 4. Se você atualizar icomo i+=puts(""), poderá se livrar dos colchetes do loop externo.
Dennis
2

Perl - 90

Pode ser possível extrair mais alguns caracteres disso:

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

89+ 1para-n .

Correr com:

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

Saída:

p           m
  r       a
    o   r
      g
    o   r
  r       a
p           m
hmatt1
fonte
2

T-SQL: 180

Tomando a entrada da variável @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

Isso reúne caracteres únicos / decrescentes desde o início e o fim em uma sequência de espaços.

Resultado do teste

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 
MickyT
fonte
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' '}

Saídas:

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

JavaScript (Node.js) , 81 bytes

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

EDIT : -1 Obrigado Joe King. Eu não vi o TIO fornece pasta direta pré-formatada para CG.

Experimente online!


fonte
Aliás, o código em excesso para executar o código no TIO pode ir no rodapé do programa. Isso ajuda a determinar a contagem correta de bytes e a usar o formato de resposta PPCG automatizado de maneira mais suave. Por exemplo, experimente online!
Jo rei
-i-1pode ser+~i
Jo King
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);
}
bacchusbeale
fonte
Salve 11 caracteres preciosos com t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
Sampathsris
Você pode remover essas novas linhas?
Zachary
1

GolfScript 46 ( DEMO )

:w,:l,{l,{.[.l(\-]2$?)!w@[=32]=}%\;''+' '*}%n*
Cristian Lupascu
fonte
1

Não importa quanto tempo, sempre tem que haver uma resposta em ...

Java - 289 234 bytes

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

A saída, mal feita, é:

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

Adicionado o import java.util.Scannerinterior do código, porque eu nunca me lembro se as importações contam para a contagem de bytes ... Porra, eu realmente sou péssima nisso.

Rodolfo Dias
fonte
2
As importações contam. Isto é em parte por causa da sintaxe do Python importação e de apelido: from math import floor as fque é um pouco cheaty
Você poderá salvar vários caracteres combinando todas as System.out.printchamadas em uma, usando alguns operadores ternários.
DLosc 30/10/14
@DLosc Você poderia me dar alguns exemplos?
Rodolfo Dias
1
Sim, na verdade a resposta dos Geobits é um exemplo perfeito - veja o conteúdo da System.out.printchamada no final.
DLosc
1
@RodolfoDias Não se sinta assim. Meus primeiros campos de golfe em Java foram terrível , e ainda posso normalmente raspar um pedaço decente de meus "primeiras revisões" se eu olhar duro o suficiente;)
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");};}}

Ou, como "Somente Main ()":

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");};}
RobIII
fonte