Krzyż postaci

31

Spodziewałem się opublikować coś bardziej złożonego jako moją pierwszą łamigłówkę w PCG, ale szczególne pytanie ... o pracę domową w Stack Overflow zainspirowało mnie do opublikowania tego. Chcą:

wydrukuj następujący wzór dla dowolnego słowa zawierającego nieparzystą liczbę liter:

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


Zwróć uwagę, że litery to ruch rycerza na wzór, który chcesz wydrukować. Tak więc każda inna kolumna jest pusta. - (Dzięki xnor za zwrócenie na to uwagi.)

Zasady

  1. Używanie C ++ jest zabronione. Ponieważ mogę tam powiązać to pytanie.
  2. Możesz użyć stdoutlub w jakikolwiek sposób, aby szybko wygenerować ciąg znaków (np. alert()W JavaScript).
  3. Jak zawsze, najkrótszy kod wygrywa.
sampathsris
źródło
2
Jest to w powiązanych postach na temat przepełnienia stosu: stackoverflow.com/q/5508110
Level River St
2
@flawr Myślę, że to oznacza dziwne, ponieważ nie jest liczbą parzystą.
NinjaBearMonkey
31
Boże, jestem głupia, myślałem, że to rodzaj niejasnego skrótu dla informatyków =)
flawr
2
@jpjacobs: Bajty, chyba że pytanie wyraźnie mówi inaczej.
Dennis
2
Cały program czy tylko funkcja? (naprawdę mądry z mojej strony, że najpierw odpowiem i zadam to pytanie później ...)
Rodolfo Dias,

Odpowiedzi:

13

Pyth , 22 lata

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

Wyjaśnienie:

(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
źródło
Brak dopełnienia w Pyth?
xnor
@ xnor Nie, ale to by nie pomogło. Załóżmy, że ~bitowo nie było w Pyth. Następnie możemy zmienić t-lzdna +lz~d- nadal 5 znaków.
isaacg
Vzto fajna sztuczka: nie wiedziałem, że to U<string>dało range(len(<string>)).
FryAmTheEggman
Tak, to fajna funkcja. Działa w ten sposób również na listach, ale niekoniecznie krotek. EDYCJA: Ups, brakuje jej w dokumentacji. Dodam to. Przepraszam.
isaacg
20

APL ( 37 35 34 27)

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

Pobiera dane z klawiatury, takie jak:

      ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞
CODE-GOLF
C               F 
  O           L   
    D       O     
      E   G       
        -         
      E   G       
    D       O     
  O           L   
C               F 
marinus
źródło
7
Wszystkie moje opinie należą do 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)

Wkład:

"CODE-GOLF"

Wydajność:

C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F
Falko
źródło
Właśnie pisałem to samo. Moja jedyna poprawa to i in[j,L+~j].
xnor
@xnor: Znaleziono jeszcze krótszy warunek. ;)
Falko
Sprytny. Nadal możesz to zrobić L+~j.
xnor
@xnor: Ach, masz rację. Zawsze zapominam o +~sztuczce ...
Falko
Czy potrafisz for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)uratować postać? (Nie mam teraz dostępu do Pythona 2 do testowania.)
xnor
11

Python 3: 75 znaków

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

W przypadku wiersza izaczynamy od listy spacji i ustawiamy wpisy iod przodu i od tyłu, aby były równe literom ciągu wejściowego. Następnie wydrukujemy wynik.

Ciągi w języku Python są niezmienne, więc azamiast tego musi być lista znaków. Lista amusi zostać zainicjowana wewnątrz pętli, inaczej zmiany będą przenoszone między pętlami. Używamy print(*a)do drukowania każdego znaku na liście, oddzielając spacje, co wymaga Python 3.

Linie wyjściowe są symetryczne, więc możemy iodliczać, a nie zwiększać za pomocą pętli while.

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

Działa również na parzystą liczbę liter.

>>> CODEGOLF
C             F
  O         L  
    D     O    
      E G      
      E G      
    D     O    
  O         L  
C             F
xnor
źródło
Konwertując to na Pytha, otrzymuję VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJ29 bajtów ... Chyba będę musiał spróbować czegoś innego, aby pokonać APL. Ponadto +1 za dowód, że Python 3 może
wyprzedzić
@ Fry Python 3 z mojego doświadczenia zwykle gra w golfa 2. Nawet jeśli nic się nie zmieni nigdzie indziej, większość wyzwań daje jeden wkład i oczekuje jednego wyniku, i len("raw_input()") + len("print ") > len("input()") + len("print()").
undergroundmonorail
@undergroundmonorail Problem w tym, że dotyczy input() to również Pythona 2 (po prostu działa nieco inaczej), więc jeśli dane wejściowe do wyzwania nie są dość surowe, python 2 zazwyczaj wygrywa.
FryAmTheEggman
Wow, nawet w Pythonie 2, a print" ".join(a)twój kod jest krótszy (82) niż mój.
Falko
@FryAmTheEggman Zobacz moją odpowiedź - jest to adaptacja drugiej odpowiedzi python i jest znacznie krótsza niż APL. Niestety, Pyth naprawdę nie lubi przypisywać indeksów.
isaacg
8

CJam, 27 25 bajtów

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

Wypróbuj online.

Przykładowy przebieg

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

Jako przykład w odpowiedzi każda linia ma końcowe białe znaki.

Jak to działa

                             " 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
źródło
1
Przepraszam, że jest to w zasadzie „świetna odpowiedź!” komentarz, ale po prostu musiałem powiedzieć, że nigdy nie przyszło mi do głowy, aby budować pudełko według kolumn zamiast rzędów.
FryAmTheEggman
4

Java - 168

Prosta pętla zagnieżdżona, tutaj nie dzieje się nic specjalnego.

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

Z podziałami linii:

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":""));
    }
}
Geobity
źródło
4

Pure Bash, 94 bajty

l=${#1}
for((;t<l*l;t++));{
((x=t%l))||echo
((x-t/l&&x+t/l+1-l))&&printf \ ||printf ${1:x:1}
}
Cyfrowa trauma
źródło
1
Za dużo t%lobliczeń. Zapisz go przy pierwszym użyciu do zmiennej, ((x=t%l))a następnie użyj zmiennej, aby zmniejszyć ją do 94 znaków.
manatwork
Ach tak, zrobiłem to x=t%li y=t/lbyło dłużej ... nie przyszło mi do głowy, żeby użyć tylko x
Digital Trauma
4

Ruby, 64

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

Wyjaśnienie

  • Dane wejściowe są traktowane jako argument dla lambda. Oczekuje String.
  • W pętli, która zapętla wszystkie znaki w słowie ( nłącznie):
    • Utwórz ciąg składający się ze nspacji.
    • Zastąp ith i n-ith ( ~idzięki xnor) spacją ith i n-ith znakiem wejścia.
    • Wydrukuj linię
Britishtea
źródło
7
Gratulujemy opublikowania 25 000 odpowiedzi! :) (Właściwie nie jestem w 100% pewien, to jest ten, ze względu na buforowanie. Ale to była najnowsza odpowiedź, kiedy po raz pierwszy zobaczyłem „25 000 odpowiedzi” w statystykach strony.)
Martin Ender
2
Możesz to zrobić -i-1jako bitowe uzupełnienie ~i.
xnor
To bardzo sprytne, dzięki!
britishtea
2
Przy takim podejściu wydaje się, że korzystne jest użycie stdin zamiast lambda: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(zakłada, że ​​wejście nie jest zakończone znakiem nowej linii, np echo -n CODE-GOLF.). Następnie można dodatkowo wykorzystać, .charsaby uratować inną postać:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero,
4

JavaScript (E6) 101 95 129 136

Edytuj Niewłaściwe odstępy między literami. Naprawiony.
Edytuj Prostsze i krótsze za pomocą klasycznych pętli
Jako funkcja, wyprowadzaj przez wyskakujące okienko.

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

Poprzednia wersja korzystająca z .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'))

Testuj w konsoli FireFox / FireBug

F('Java-Script')

Wydajność

J                   t
  a               p  
    v           i    
      a       r      
        -   c        
          S          
        -   c        
      a       r      
    v           i    
  a               p  
J                   t
edc65
źródło
2
Nie ma wystarczających odstępów w poziomie - między każdą kolumną powinny znajdować się litery ze wszystkimi literami.
isaacg
4

Befunge-93, 68 71

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

Możesz to przetestować tutaj . Przy każdym przejściu pojawi się okno dialogowe wprowadzania danych ~; wprowadzaj słowo po jednym znaku na raz (w końcu oznacza to, że wpis jest „klunky”), kończąc spacją.

Nie będzie drukować na konsoli; w końcu nie byłoby to Befunge bez śladu samodoskonalenia! Zamiast tego zmodyfikuje własną siatkę, aby wyświetlić komunikat. Po zakończeniu siatka będzie wyglądać mniej więcej tak:

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

(Zwróć uwagę na szlachetne poświęcenie komórki w (0,0), gdy wiemy, że wskaźnik już tam nie pójdzie, w celu przechowywania fragmentu danych.)

Działa również z wejściami o równej długości. Zauważ, że ponieważ Befunge-93 jest ograniczony do siatki 80x25, rozmiar wejściowy jest ograniczony do 21 znaków, jeśli uruchomisz go w interpreterie Befunge-93. Uruchamianie go jako Befunge-98 powinno usunąć ten limit.

Edycja - teraz działa bardziej zgodnie z zamierzonym wyjściem, kosztem tylko trzech znaków długości.

Kasran
źródło
Zauważ, że litery są oddzielone pustą kolumną. Litery mają względnie kształt litery L.
sampathsris
Drats! To dość skomplikowało sprawy. Myślę, że mogę to uratować, ale zwiększy to końcowy rozmiar ... no cóż.
Kasran
4

JavaScript 102 84 85

Edycja: musiał naprawić odstępy. Już nie taki mały.

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
źródło
To nie ma wystarczających odstępów w poziomie.
Dennis
1
Wow, krótszy niż mój i nawet nie używa ES6. +1
Scimonster
Lepiej, ale odstępy są nadal nieprawidłowe (spójrz na X). Ponadto, chyba że pytanie mówi inaczej, powinieneś napisać program lub funkcję. Fragmenty ze zmiennymi zakodowanymi na ogół nie są mile widziane.
Dennis
1
I nie możesz tego zrobić, function(s)skoro się nie powtórzysz?
Zacharý
3

CJam, 38 36 35 34 32 bajty

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

Sprawdź to tutaj. Odczytuje słowo wejściowe ze STDIN. Działa również dla parzystej liczby znaków. Spowoduje to wydrukowanie końcowej kolumny spacji, ale nie widzę nic w regułach przeciwko temu.

Wyjaśnienie

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

Zawartość stosu jest drukowana automatycznie na końcu programu.

Martin Ender
źródło
Mój drogi CJamie, właśnie zostałeś pobity przez APL. ^ _ ^
vaxquis
@vaxquis Byłem zaskoczony, że udało mi się go pokonać dwukrotnie. Ten problem wydaje się znacznie bardziej odpowiedni dla APL i co, niż dla języków opartych na stosie.
Martin Ender
2
cóż, przynajmniej łatwiej jest pisać l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}na serwetce niż ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... chichot
vaxquis
Cóż, komuś udało się pokonać mnie za pomocą CJam i nie mogę skrócić mojego programu, więc CJam ostatecznie mnie pokonał. (Ale Pyth dostaje koronę.) (To powiedziawszy, @vaxquis, APL jest znacznie łatwiejszy do odczytania niż większość innych języków używanych tutaj, na pewno, gdy znasz 60 lub więcej znaków, a na pewno w porównaniu do Pyth lub CJam lub nawet J.)
marinus
3

C 105

dwa nieco inne sposoby na zrobienie tego.

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

Jeśli chcesz dodać dodatkowe spacje, należy wymienić putchar(z printf(" %c",za dodatkową 5 znaków.

Level River St
źródło
3

J - 36 30 bajtów:

Edycja: 6 znaków krótszych, kredyty trafiają do @algorithmshark .

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

na przykład:

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

Bonus: działa również z łańcuchami o równej długości:

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

Prolog - 240 bajtów

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

Wezwanie:

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

Czytelny:

:- 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
źródło
3

Płótno , 5 bajtów

\\:⇵n

Wypróbuj tutaj!

Wyjaśnienie:

\      create a diagonal of the input
 \     create an even steeper diagonal of that
  :⇵   reverse a copy of it vertically
    n  overlap the two
dzaima
źródło
3

R , 99 98 93 89 bajtów

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

Wypróbuj online!

Wiersz 1 odczytuje łańcuch wejściowy, dzieli go na znaki, przechowuje jego długość i tworzy matrycę ze słowem na głównej przekątnej - litery tego słowa są nakładane na matrycę tożsamości (i domyślnie powtarzane w celu dopasowania do długości) i tylko te pasujące 1 są zachowywane, inne zastępowane są spacjami.

Linia 2 drukuje matrycę utworzoną z elementów matrycy ukośnej lub jej lustrzanej wersji, w zależności od tego, która wartość jest większa.

-2 + 1 = -1 bajt dzięki JayCe

−4 bajty dzięki Giuseppe

Robert Hacken
źródło
1
Słodkie! I miłe wyjaśnienie. Możesz zaoszczędzić 2 bajty
JayCe,
1
patrząc na inne odpowiedzi i pytanie - Wygląda na to, że matryca powinna być większa (dodatkowa spacja) - wynik nie powinien być matrycą kwadratową ..
JayCe
@JayCe Dzięki za 2 bajty! I dziękuję za komentarz na temat formatowania, prawdopodobnie masz rację (chociaż zasady mogą być bardziej jasne na ten temat). Na szczęście wszystko, czego potrzebowało, to wstawienie spacji do separatora podczas drukowania.
Robert Hacken,
89 bajtów za pomocąpmax i wstawianie kolejnych zadań.
Giuseppe
@Giuseppe Thanks! Niestety, jeszcze nie na tyle, aby pokonać J.Doe „s rozwiązanie
Robert Hacken
2

C # ( 214 212)

(Z pewnością źle) Wersja w golfa:

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

Wersja bez golfa:

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

Wszelkie podpowiedzi, porady, wskazówki i uwagi są bardzo mile widziane, ponieważ jest to moja pierwsza próba CodeGolf. Chciałem tylko spróbować, choć wiem, że mój bajt C # nie zbliży się nawet do podwojenia najlepszych rozwiązań;)

A jak liczycie bajty? Właśnie zamieściłem powyższe w oknie Quick Watch i zrobiłem to .Length. Mógłbym napisać mały program do liczenia bajtów dla mnie, ale założę się, że istnieje łatwiejszy sposób, którego jeszcze nie znam.

InvisiblePanda
źródło
Możesz zapisać dwa bajty, usuwając spacje w for(;i < l;i++).
Beta Decay
Używam tego również do liczenia bajtów.
Beta Decay
@BetaDecay Ach, świetnie, musiałem je przeoczyć. I dzięki za link!
InvisiblePanda
2

JavaScript (ES6) - 185 177 175 170 bajtów

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

Umieść to w konsoli Firefox i uruchom jako 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
źródło
Też to widziałem.
Scimonster,
2

Mathematica, 149 bajtów

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

Dane wejściowe przekazywane jako parametr do funkcji; funkcja zwraca ciąg wyjściowy. Na końcu wyniku znajduje się końcowy znak nowej linii.

Objaśnienie: Tworzymy macierz ukośną ze sznurkiem, a następnie tworzymy jej kopię odwróconą w pionie za pomocą, Reverse@#aby odwrócić rzędy. Następnie mamy trzecią macierz o takich samych wymiarach, zawierającą tylko 32 (przestrzeń ascii). Używamy MapThreaddo wzięcia pod uwagę elementu tych 3 macierzy. Na koniec Rifflespacje w każdym rzędzie, Appendnowa linia na końcu i Flattenwynik.

jcai
źródło
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("");}}

To może nie być skompilowane jako C ++, więc mam nadzieję, że nie naruszyłem zasad :)

VX
źródło
1. Dane wyjściowe są obecnie nieprawidłowe. Pomiędzy literami powinna być spacja. 2. i=0i j=0nie jest potrzebne, ponieważ zmienne globalne są inicjowane na zero. 3. Możesz użyć main(l,v)char**v;zamiast main(int l,char**v). 4. Jeśli zaktualizujesz ijako i+=puts(""), możesz pozbyć się nawiasów klamrowych zewnętrznej pętli.
Dennis
2

Perl - 90

Może być możliwe wyciśnięcie kilku innych postaci z tego:

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

89+ 1dla -n.

Biegnij z:

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

Wydajność:

p           m
  r       a
    o   r
      g
    o   r
  r       a
p           m
hmatt1
źródło
2

T-SQL: 180

Biorąc dane wejściowe ze zmiennej @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

Powoduje to umieszczanie pojedynczych znaków w / zmniejszanie od początku i na końcu w ciągu spacji.

Wynik testu

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
źródło
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' '}

Wyjścia:

PS C:\PowerShell> .\cross.ps1 SWORD
S       D
  W   R
    O
  W   R
S       D
DarkAjax
źródło
2

JavaScript (Node.js) , 81 bajtów

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

EDYCJA : -1 Dzięki Joe King. Nie widziałem, że TIO daje wstępnie sformatowaną bezpośrednią pastę dla CG.

Wypróbuj online!


źródło
btw, nadmiar kodu do wykonania kodu w TIO może przejść w stopce programu. Pomaga to określić prawidłową liczbę bajtów i płynniej korzystać z formatu automatycznej odpowiedzi PPCG. np. Wypróbuj online!
Jo King,
-i-1może być+~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
źródło
Uratuj 11 cennych postaci dzięki t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
sampathsris
Czy możesz usunąć te nowe wiersze?
Zacharý
1

GolfScript 46 ( DEMO )

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

Nie ważne jak długo, zawsze będzie odpowiedź w ...

Java - 289 234 bajty

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

Nie golfowany:

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

Wyjściowo wykonane, jest:

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

Dodałem import java.util.Scannerkod wewnętrzny, ponieważ nigdy nie pamiętam, czy import liczy się do liczby bajtów ... Cholera, naprawdę jestem do niczego.

Rodolfo Dias
źródło
2
Import się liczy. Wynika to częściowo z importowanej i aliasowej składni Pythona: from math import floor as fktóra jest nieco podstępna
Powinieneś być w stanie uratować wiele postaci, łącząc wszystkie System.out.printwywołania w jedno, używając kilku operatorów trójskładnikowych.
DLosc
@DLosc Czy możesz podać mi kilka przykładów?
Rodolfo Dias
1
Tak, tak naprawdę odpowiedź Geobitów jest doskonałym przykładem - zobacz treść System.out.printpołączenia na końcu.
DLosc
1
@RodolfoDias Nie czuj się tak. Kilka moich pierwszych golfów na Jawie było okropnych i nadal mogę normalnie zgolić „pierwsze poprawki”, jeśli spojrzę wystarczająco mocno;)
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");};}}

Lub jako „Tylko główny ()”:

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
źródło