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


31

Я сподівався опублікувати щось складніше, як мою першу головоломку в PCG, але особливе, е-е ... домашнє запитання щодо Stack Overflow надихнуло мене на це. Вони хочуть:

надрукувати наступний зразок для будь-якого слова, що містить непарну кількість літер:

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
Боже, я дурний, я думав, що це якась незрозуміла комп'ютерна абревіатура абревіатура =)
недолік

2
@jpjacobs: Байти, якщо в питанні прямо не сказано інше.
Денніс

2
Ціла програма або просто функція? (реально розумно мені відповісти спочатку і поставити це питання пізніше ...)
Rodolfo Dias

Відповіді:


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 символів.
isaacg

Vzце акуратний трюк: я не знав, що це U<string>дає range(len(<string>)).
FryAmTheEggman

Так, це приємна особливість. Це також працює у списках, але не кортежі обов'язково. EDIT: На жаль, цього немає в документації. Я додам його. Вибачте.
isaacg

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

Пітон 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

Пітон 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відраховувати, а не вгору, використовуючи цикл час.

>>> 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 може вийти з гольфу на Python 2 (іноді)
FryAmTheEggman

@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 не любить присвоювати індекси.
isaacg

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 символів.
манатство

Ага так, я це робив за, x=t%lі y=t/lце було довше ... не передумав просто використовувати лише x
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-тисячної відповіді! :) (Насправді я не впевнений на 100%, це саме той, завдяки кешуванню. Але це була остання відповідь, коли я вперше побачив "25000 відповідей" у статистиці сайту.)
Мартін Ендер

2
Ви можете зробити -i-1як доповнення біт ~i.
xnor

Це дуже розумно, дякую!
britishtea

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}
Вентеро

4

JavaScript (E6) 101 95 129 136

Редагувати Неправильний інтервал між літерами. Виправлено.
Відредагуйте простіші та коротші, використовуючи класичні для циклів.
Як функцію, виведіть через спливаюче вікно

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
Тут недостатньо горизонтального проміжку - між кожним стовпцем з літерами повинні бути стовпці всіх пробілів.
isaacg

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 форми.
sampathsris

Плями! Це досить складні речі. Я думаю, що я можу це врятувати, але це додасть кінцевий розмір ... ну добре.
Касран

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)оскільки ти не повторюєшся?
Zacharý

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 або навіть Дж.)
marinus

3

C, 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

Prolog - 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 рішення
Роберт Hacken

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 # навіть не наблизиться до подвоєння найкращих рішень;)

А як ви, хлопці, рахуєте свої байти? Я щойно виклав вище у вікно швидкого перегляду і зробив .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

Математика, 149 байт

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

Вхід передається як параметр функції; функція повертає вихідний рядок. В кінці виводу є кінцевий новий рядок.

Пояснення: Створюємо діагональну матрицю з рядком, потім створюємо її копію вертикально перевернутою, використовуючи Reverse@#для зворотного перегляду рядків. Тоді ми маємо третю матрицю таких самих розмірів, що містить лише 32 (простір ассії). Ми використовуємо 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`
`

EDIT : -1 Дякую Джо Кінгу. Я не бачив, щоб TIO дає попередньо відформатовану пряму пасту для CG.

Спробуйте в Інтернеті!


btw, надлишок коду для виконання коду в 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]:"";.
sampathsris

Чи можете ви видалити ці нові рядки?
Zacharý


1

Незважаючи на те, як довго, відповідь завжди повинна бути ...

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

Безголовки:

    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
Так, насправді відповідь Геобітса є ідеальним прикладом - дивіться вміст System.out.printдзвінка наприкінці.
DLosc

1
@RodolfoDias Не відчуваю це так. Мої перші кілька гольфів на Яві були жахливими , і я все ще можу нормально поголити пристойний шматок моїх "перших ревізій", якщо я виглядаю досить важко;)
Геобіц

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

Або як лише "Основний ()":

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.