Крест персонажа


31

Я ожидал опубликовать что-то более сложное в качестве моей первой загадки в PCG, но конкретный, домашний вопрос о переполнении стека вдохновил меня опубликовать это. Они хотят:

напечатать следующий шаблон для любого данного слова, которое содержит нечетное количество букв:

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


Обратите внимание, что буквы - это ход рыцаря в узоре, который нужно напечатать. Итак, все остальные столбцы пусты. - (Спасибо xnor за то, что указал на это.)

правила

  1. Использование C ++ запрещено. Как я могу связать этот вопрос там.
  2. Вы можете использовать stdoutили любые способы быстрого вывода строки (например, alert()в JavaScript).
  3. Как всегда, выигрывает самый короткий код.

2
Это в соответствующих сообщениях о переполнении стека: stackoverflow.com/q/5508110
Level River St

2
@flawr Я думаю, что это означает нечетное, а не четное число.
NinjaBearMonkey

31
Боже, я тупой, я думал, что это было своего рода неясное сокращение ученого =)
flawr

2
@jpjacobs: байты, если в вопросе не указано иное.
Деннис

2
Вся программа или просто функция? (очень умно с моей стороны ответить первым, а потом задать этот вопрос ...)
Родольфо Диас

Ответы:


13

Пиф , 22

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

Тест:

$ 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

Объяснение:

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

Никакого дополнения в Pyth?
xnor

@xnor Нет, но это не поможет. Предположим, что он ~был не в Pyth. Тогда мы могли бы изменить , t-lzdчтобы +lz~d- еще 5 символов.
Исаак

Vzэто хитрый трюк: я не знал, что U<string>дал range(len(<string>)).
FryAmTheEggman

Да, это хорошая особенность. Так же работает в списках, но не обязательно в кортежах. РЕДАКТИРОВАТЬ: Ой, это отсутствует в документации. Я добавлю это. Сожалею.
Исаак

20

APL ( 37 35 34 27)

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

Он принимает ввод с клавиатуры, вот так:

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

7
Все мои голоса принадлежат APL.
Нит,

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)

Входные данные:

"CODE-GOLF"

Выход:

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

Я просто писал то же самое. Мое единственное улучшение i in[j,L+~j].
xnor

@xnor: нашел еще более короткое условие. ;)
Фалько

Умная. Вы все еще можете сделать, L+~jхотя.
xnor

@xnor: Ах, ты прав. Я всегда забываю +~трюк ...
Фалько,

Можете ли вы сделать, for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)чтобы сохранить символ? (У меня сейчас нет доступа к Python 2 для тестирования.)
xnor

11

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)

Для строки iмы начинаем со списка пробелов и устанавливаем записи iспереди и сзади равными буквам входной строки. Затем мы печатаем результат.

Строки Python являются неизменяемыми, поэтому aвместо них должен быть список символов. Список aдолжен быть инициализирован внутри цикла, иначе изменения будут перенесены между циклами. Мы используем print(*a)для печати каждого символа в списке через пробел, для чего требуется Python 3.

Выходные линии симметричны, поэтому мы можем использовать iобратный отсчет, а не увеличение, используя цикл while.

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

Это также работает для четного числа букв.

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

Преобразовав это в Pyth, я получаю VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJ29 байтов ... Я думаю, мне придется попробовать что-то еще, чтобы побить APL. Кроме того, +1 за доказательство того, что Python 3 может
превзойти

@ Fry Python 3 обычно превосходит по гольфу 2 в моем опыте. Даже если нигде ничего не меняется, большинство задач дают один вход и ожидают один выход, и len("raw_input()") + len("print ") > len("input()") + len("print()").
подземный

@undergroundmonorail Ну, проблема в том, что input() это также справедливо для Python 2 (он действует несколько иначе), поэтому, если входные данные для задания не очень строгие, Python 2 обычно побеждает.
FryAmTheEggman

Ничего себе, даже с Python 2 и print" ".join(a)ваш код короче (82), чем мой.
Фалько

@FryAmTheEggman Посмотрите мой ответ - это адаптация другого ответа Python, и он намного короче, чем APL. К сожалению, Pyth не любит присваивать индексы.
Исаак

8

CJam, 27 25 байтов

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

Попробуйте онлайн.

Пример запуска

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

Как пример в ответе, каждая строка имеет пробел в конце.

Как это работает

                             " 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
Извините, что это в основном «отличный ответ!» комментарий, но я просто должен был сказать , что он никогда, никогда , произошел бы мне построить коробку по столбцам , а не по строкам.
FryAmTheEggman

4

Ява - 168

Простой вложенный цикл, здесь нет ничего особенного.

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

С переносами строк:

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

Чистый Баш, 94 байта

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
Слишком много t%lрасчетов. Сохраните его при первом использовании в переменной, ((x=t%l))затем используйте переменную, чтобы уменьшить ее до 94 символов.
manatwork

Ах, да, я сделал это для, x=t%lи y=t/lэто было дольше ... не приходило мне в голову просто использовать только х
Digital Trauma

4

Руби, 64

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

объяснение

  • Ввод принимается в качестве аргумента лямбда-выражения. ОжидаетсяString .
  • В цикле, который повторяет каждый символ в слове ( nвсего):
    • Создайте строку, состоящую из nпробелов.
    • Замените ith и n-ith ( ~iспасибо xnor) пробел на ith и n-ith символ ввода.
    • Распечатать строку

7
Поздравляем с размещением 25 000-го ответа! :) (На самом деле, я не уверен на 100%, это один из-за кеширования. Но это был последний ответ, когда я впервые увидел «25 000 ответов» в статистике сайта.)
Мартин Эндер,

2
Вы можете сделать -i-1как дополнение бит ~i.
xnor

Это очень умно, спасибо!
Британцы

2
При таком подходе на самом деле кажется полезным использовать stdin вместо лямбды: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(предполагается, что ввод не завершается символом новой строки, например echo -n CODE-GOLF). Затем можно дополнительно использовать .charsдля сохранения другого персонажа:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero

4

JavaScript (E6) 101 95 129 136

Изменить неверный интервал букв. Исправлена.
Редактируйте проще и короче, используя классические циклы for.
Как функция, выводите через всплывающее окно.

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

Предыдущая версия с использованием .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'))

Тест в консоли FireFox / FireBug

F('Java-Script')

Выход

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

2
Это не имеет достаточного расстояния по горизонтали - должны быть столбцы всех пробелов между столбцами с буквами.
Исаак

4

Befunge-93, 68 71

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

Вы можете проверить это здесь . При каждом проходе будет отображаться диалоговое окно ввода~ ; введите ваше слово по одному символу за раз (в конце концов, он говорит, что ввод «klunky»), заканчивая пробелом.

Это не будет печатать на консоль; это не было бы Befunge без намека на само-модификацию, в конце концов! Вместо этого он изменит свою сетку для отображения сообщения. После этого сетка будет выглядеть примерно так:

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

(Обратите внимание на благородную жертву ячейки в (0,0), после того, как мы знаем, что указатель больше не пойдет туда, чтобы сохранить часть данных.)

Он также работает с входами четной длины. Обратите внимание, что, поскольку Befunge-93 ограничен сеткой 80x25, размер ввода ограничен 21 символом, если вы запускаете его в интерпретаторе Befunge-93. Запуск его как Befunge-98 должен снять этот предел.

Редактировать - теперь он работает более точно в соответствии с предполагаемым выводом, за счет длины всего трех символов.


Обратите внимание, что буквы разделены пустым столбцом. Письма относительно в форме L.
Сампатрисрис

Drats! Это усложняет вещи довольно значительно. Я думаю, что смогу спасти это, но это добавит к конечному размеру ... о хорошо.
Касран

4

Javascript 102 84 85

Изменить: пришлось исправить расстояние. Уже не такой маленький.

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

Этого не хватает по горизонтали.
Деннис

1
Вау, короче моего и даже не использую ES6. +1
Scimonster

Лучше, но интервал все еще неправильный (посмотрите на X). Кроме того, если вопрос не говорит иначе, вы должны написать программу или функцию. Фрагменты с жестко закодированными переменными обычно не одобряются.
Деннис

1
И вы не можете сделать это, function(s)так как вы не повторяете?
Захари

3

CJam, 38 36 35 34 32 байта

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

Проверьте это здесь.Это читает входное слово из STDIN. Это также работает для четного числа символов. Это печатает в конце столбец пробелов, но я не вижу ничего в правилах против этого.

объяснение

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

Содержимое стека печатается автоматически в конце программы.


Мой дорогой CJam, ты только что был побит APL. ^ _ ^
vaxquis

@vaxquis Я был удивлен, что смог победить дважды. Эта проблема кажется гораздо более подходящей для APL и co, чем для стековых языков.
Мартин Эндер

2
ну, по крайней мере, легче написать l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}на салфетке , чем ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... смешком
vaxquis

Ну, кто-то еще смог победить меня с помощью CJam, и я не могу сделать свою программу короче, поэтому CJam все-таки победил меня. (Но Pyth получает корону.) (Тем не менее, @vaxquis, APL гораздо легче читать, чем большинство других языков, используемых здесь, конечно, если вы знаете 60 символов или около того, и, конечно, по сравнению с Pyth или CJam или даже Ж.)
марин

3

С 105

два немного разных способа сделать это.

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

Если вы хотите добавить дополнительные пробелы, замените putchar(с в printf(" %c",течение дополнительных 5 символов.


3

J - 36 30 байт:

Изменить: 6 символов короче, кредиты идут на @algorithmshark .

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

например:

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

Бонус: работает и со строками четной длины:

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

3

Пролог - 240 байт

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

Призвание:

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

Удобочитаемый:

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

R , 99 98 93 89 байт

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

Попробуйте онлайн!

Строка 1 читает входную строку, разбивает ее на символы, сохраняет ее длину и создает матрицу со словом на его главной диагонали - буквы слова накладываются на единичную матрицу (и по умолчанию повторяются, чтобы соответствовать ее длине), и только те, которые соответствуют 1 сохраняются, другие заменяются пробелами.

В строке 2 печатается матрица, образованная элементами диагональной матрицы или ее горизонтально-зеркальной версии, в зависимости от того, что больше.

-2 + 1 = -1 байт благодаря JayCe

−4 байта благодаря Джузеппе


1
Милая! И хорошее объяснение. Вы можете сэкономить 2 байта
JayCe

1
глядя на другие ответы и вопрос - кажется, что матрица должна быть больше (лишний пробел) - результат не должен быть квадратной матрицей ..
JayCe

@JayCe Спасибо за 2 байта! И спасибо за комментарий о форматировании, вы, вероятно, правы (хотя правила могут быть более ясными по этому поводу). К счастью, все, что нужно, это поместить пространство в разделитель во время печати.
Роберт Хакен

89 байтов, используяpmax и вставляя еще несколько назначений.
Джузеппе

@ Giuseppe Спасибо! К сожалению, до сих пор не достаточно , чтобы бить j.doe «s решение
Роберт Хакен,

2

C # ( 214 212)

(Конечно, плохо) Гольф версия:

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

Безголовая версия:

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

Любые намеки, советы, хитрости или замечания приветствуются, так как это моя первая попытка CodeGolf. Я просто хотел попробовать, хотя я знаю, что длина моего байта в C # даже близко не удвоит лучшие решения;)

А как вы, ребята, считаете свои байты? Я только что опубликовал вышеупомянутое в окне Quick Watch и сделал .Length. Я мог бы написать небольшую программу для подсчета байтов для себя, но держу пари, что есть более простой способ, которого я пока не знаю.


Вы можете сохранить два байта, удалив пробелы в for(;i < l;i++).
бета-распад

Кроме того, я использую это для подсчета байтов.
бета-распад

@ BetaDecay Ах, отлично, я, должно быть, упустил из виду. И спасибо за ссылку!
InvisiblePanda

2

JavaScript (ES6) - 185 177 175 170 байт

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

Поместите это в консоль Firefox и запустите как 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

2

Mathematica, 149 байтов

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

Ввод передан в качестве параметра функции; Функция возвращает строку вывода. В конце вывода есть завершающий символ новой строки.

Объяснение: Мы создаем диагональную матрицу со строкой, затем создаем ее копию, перевернутую по вертикали, с помощью Reverse@#реверса строк. Тогда у нас есть третья матрица тех же размеров, содержащая только 32 (пространство ASCII). Мы используем, MapThreadчтобы взять поэлементный максимум этих 3 матриц. Наконец, мы Riffleпомещаем пробелы в каждую строку, Appendновую строку в конце и Flattenрезультат.


2

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

Это не может быть скомпилировано как C ++, поэтому я надеюсь, что я не нарушил правила :)


1. Вывод в настоящее время неверен. Между буквами должен быть пробел. 2. i=0и j=0не требуется, поскольку глобальные переменные инициализируются нулем. 3. Вы можете использоватьmain(l,v)char**v; вместо main(int l,char**v). 4. Если вы обновите iкак i+=puts(""), вы можете избавиться от фигурных скобок внешнего цикла.
Деннис

2

Perl - 90

Из этого можно выжать еще несколько символов:

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

89+ 1за -n.

Бежать с:

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

Выход:

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

2

T-SQL: 180

Принимая входные данные из переменной @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

Это заполняет отдельные символы в / уменьшая от начала и до конца в строку пробелов.

Результат испытаний

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

Выходы:

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


2

JavaScript (Node.js) , 81 байт

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

РЕДАКТИРОВАТЬ : -1 Спасибо Джо Кинг. Я не видел, что TIO дает предварительно отформатированную прямую вставку для компьютерной графики.

Попробуйте онлайн!


Кстати, лишний код для выполнения кода в TIO может идти в нижнем колонтитуле программы. Это помогает определить правильное количество байтов и более плавно использовать автоматический формат ответа PPCG. Например, попробуйте онлайн!
Джо Кинг

-i-1 может быть +~i
Джо Кинг

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

Сохранить 11 драгоценных персонажей с t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
Сампатрисрис

Вы можете удалить эти новые строки?
Захари


1

Независимо от того, как долго, всегда должен быть ответ в ...

Ява - 289 234 байта

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

Вывод, сделанный паршиво, таков:

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

Добавил import java.util.Scannerвнутри код, потому что я никогда не помню, будет ли импорт считаться с байтовым счетом ... Черт, я действительно сосу это.


2
Импорт засчитывается. Отчасти это связано с синтаксисом импорта и псевдонима в Python: from math import floor as fон немного обманчив

Вы должны быть в состоянии сохранить группу символов, объединив все System.out.printвызовы в один, используя несколько троичных операторов.
DLosc

@DLosc Не могли бы вы привести несколько примеров?
Родольфо Диас

1
Да, на самом деле ответ Geobits является прекрасным примером - посмотрите содержание System.out.printзвонка в конце.
DLosc

1
@RodolfoDias Не думаю, что так. Мои первые несколько гольфов на Яве были ужасны , и я все еще могу нормально сбрить приличный кусок с моих «первых ревизий», если я посмотрю достаточно усердно;)
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");};}}

Или как «Только 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");};}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.