Zeichenkreuz

31

Ich hatte erwartet, als mein erstes Rätsel in PCG etwas Komplexeres zu veröffentlichen, aber eine bestimmte, ähm ... Hausaufgabenfrage zu Stack Overflow hat mich dazu inspiriert, dies zu veröffentlichen. Sie möchten:

Gib das folgende Muster für ein bestimmtes Wort aus, das eine ungerade Anzahl von Buchstaben enthält:

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


Beachten Sie, dass Buchstaben in dem Muster, das Sie drucken möchten, nur einen Springer voneinander entfernt sind. Jede zweite Spalte ist also leer. - (Danke xnor für den Hinweis.)

Regeln

  1. Die Verwendung von C ++ ist verboten. Da darf ich diese Frage da verlinken.
  2. Sie können stdouteine Zeichenfolge verwenden oder auf beliebige Weise schnell ausgeben (z alert(). B. in JavaScript).
  3. Wie immer gewinnt der kürzeste Code.
sampathsris
quelle
2
Dies ist in den verwandten Beiträgen zum Stapelüberlauf: stackoverflow.com/q/5508110
Level River St
2
@flawr Ich denke es bedeutet ungerade, wie in keiner geraden Zahl.
NinjaBearMonkey
31
Gott, ich bin dumm, ich dachte, es wäre eine Art obskure Abkürzung für Informatiker =)
Fehler
2
@jpjacobs: Bytes, sofern in der Frage nicht ausdrücklich anders angegeben.
Dennis
2
Gesamtes Programm oder nur eine Funktion? (Wirklich klug von mir, zuerst zu antworten und diese Frage später zu stellen ...)
Rodolfo Dias

Antworten:

13

Pyth , 22

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

Prüfung:

$ 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

Erläuterung:

(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
quelle
Kein bisschen Komplement in Pyth?
29.
@xnor Nein, aber es würde nicht helfen. Angenommen, ~war bitweise nicht in Pyth. Dann könnten wir t-lzdzu +lz~d- noch 5 Zeichen wechseln .
isaacg
Vzist ein ordentlicher Trick: Ich wusste nicht, dass es U<string>gab range(len(<string>)).
FryAmTheEggman
Ja, das ist eine nette Funktion. Funktioniert so auch auf Listen, aber nicht unbedingt auf Tupeln. EDIT: Ups, das fehlt in der Dokumentation. Ich werde es hinzufügen. Es tut uns leid.
Isaacg
20

APL ( 37 35 34 27)

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

Es nimmt Eingaben von der Tastatur entgegen, wie folgt:

      ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞
CODE-GOLF
C               F 
  O           L   
    D       O     
      E   G       
        -         
      E   G       
    D       O     
  O           L   
C               F 
Marinus
quelle
7
Alle meine Upvotes gehören zu 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)

Eingang:

"CODE-GOLF"

Ausgabe:

C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F
Falko
quelle
Ich habe nur dasselbe geschrieben. Meine einzige Verbesserung ist i in[j,L+~j].
Xnor
@xnor: Fand einen noch kürzeren Zustand. ;)
Falko
Klug. Sie können es trotzdem tun L+~j.
Xnor
@xnor: Ah, du hast recht. Ich vergesse immer den +~Trick ...
Falko
Schaffst du es for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R), ein Zeichen zu retten? (Ich habe jetzt keinen Zugriff auf Python 2 zum Testen.)
xnor
11

Python 3: 75 Zeichen

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

Für line ibeginnen wir mit einer Liste von Leerzeichen und setzen die Einträge ivon vorne und hinten so, dass sie den Buchstaben der Eingabezeichenfolge entsprechen. Dann drucken wir das Ergebnis.

Python-Strings sind unveränderlich, daher amuss es sich stattdessen um eine Liste von Zeichen handeln. Die Liste amuss innerhalb der Schleife initialisiert werden, sonst werden die Änderungen zwischen den Schleifen übertragen. Wir verwenden print(*a), um jedes Zeichen in der Liste mit Leerzeichen zu drucken, was Python 3 erfordert.

Die Ausgangsleitungen sind symmetrisch, so dass wir imit einer while-Schleife eher abwärts als aufwärts zählen können .

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

Es funktioniert auch für eine gerade Anzahl von Buchstaben.

>>> CODEGOLF
C             F
  O         L  
    D     O    
      E G      
      E G      
    D     O    
  O         L  
C             F
xnor
quelle
Wenn ich VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJdas in Pyth konvertiere, bekomme ich 29 Bytes ... Ich denke, ich muss etwas anderes ausprobieren, um APL zu schlagen. +1 für den Beweis, dass Python 3 Python 2 (manchmal)
übertreffen kann
@Fry Python 3 in der Regel out-Golfs 2 in meiner Erfahrung. Auch wenn sich an keiner anderen Stelle etwas ändert, geben die meisten Herausforderungen einen Input und erwarten einen Output len("raw_input()") + len("print ") > len("input()") + len("print()").
Undergroundmonorail
@undergroundmonorail Nun, das Problem dabei ist, dass input() es auch in Python 2 gilt (es verhält sich einfach etwas anders). Wenn die Eingabe für die Herausforderung also nicht sehr streng ist, gewinnt Python 2 normalerweise.
FryAmTheEggman
Wow, auch mit Python 2 und print" ".join(a)Ihr Code ist kürzer (82) als meiner.
Falko
@FryAmTheEggman Siehe meine Antwort - es ist eine Anpassung der anderen Python-Antwort und viel kürzer als APL. Pyth mag es leider nicht, Indizes zuzuweisen.
Isaacg
8

CJam, 27 25 Bytes

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

Probieren Sie es online aus.

Beispiellauf

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

Als Beispiel in der Antwort weist jede Zeile ein nachgestelltes Leerzeichen auf.

Wie es funktioniert

                             " 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
quelle
1
Tut mir leid, dass dies im Grunde eine großartige Antwort ist! Kommentar, aber ich musste nur sagen, dass es mir nie in den Sinn gekommen wäre, die Box nach Spalten anstatt nach Zeilen aufzubauen.
FryAmTheEggman
4

Java - 168

Eine einfache verschachtelte Schleife, hier ist nichts wirklich Besonderes los.

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

Mit Zeilenumbrüchen:

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
quelle
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}
}
Digitales Trauma
quelle
1
Zu viele t%lBerechnungen. Speichern Sie es bei der ersten Verwendung in einer Variablen ((x=t%l))und reduzieren Sie es dann mit der Variablen auf 94 Zeichen.
Manatwork
Ach ja, hatte ich das getan für x=t%lund y=t/lund es war mehr ... überqueren hat meine Meinung nicht nur zu Verwendung nur x
Digital -
4

Rubin, 64

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

Erläuterung

  • Die Eingabe wird als Argument für ein Lambda verwendet. Es erwartet a String.
  • In einer Schleife, die alle Zeichen des Wortes durchläuft ( ninsgesamt):
    • Erstellen Sie eine Zeichenfolge, die aus nLeerzeichen besteht.
    • Ersetzen Sie das ith und n-ith ( ~i, danke xnor) Leerzeichen durch das ith und n-ith Zeichen der Eingabe.
    • Drucken Sie die Zeile
britishtea
quelle
7
Herzlichen Glückwunsch zum Versenden der 25.000sten Antwort! :) (Eigentlich bin ich mir nicht zu 100% sicher, dies ist die Antwort, die ich aufgrund von Caching erhalten habe. Aber es war die neueste Antwort, als ich zum ersten Mal "25.000 Antworten" in der Site-Statistik gesehen habe.)
Martin Ender
2
Sie können -i-1als Bit-Ergänzung tun ~i.
Xnor
Das ist sehr klug, danke!
britishtea
2
Bei diesem Ansatz scheint es tatsächlich von Vorteil zu sein, stdin anstelle eines Lambda zu verwenden: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(setzt voraus, dass die Eingabe nicht durch eine neue Zeile abgeschlossen wird, z echo -n CODE-GOLF. B. ). Man kann dann zusätzlichen Gebrauch machen .chars, um ein anderes Zeichen zu speichern:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero
4

JavaScript (E6) 101 95 129 136

Bearbeiten Sie den falschen Buchstabenabstand. Fest.
Bearbeiten Einfacher und kürzer mit classic for-Schleifen
. Ausgabe über Popup.

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

Vorherige Version mit .map

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

Test In FireFox / Firebug - Konsole

F('Java-Script')

Ausgabe

J                   t
  a               p  
    v           i    
      a       r      
        -   c        
          S          
        -   c        
      a       r      
    v           i    
  a               p  
J                   t
edc65
quelle
2
Der horizontale Abstand ist nicht ausreichend. Zwischen den einzelnen Spalten sollten Spalten mit Buchstaben stehen.
Isaacg
4

Befunge-93, 68 71

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

Sie können es hier testen . Bei jedem Durchlauf wird ein Eingabedialogfeld angezeigt ~. Geben Sie Ihr Wort zeichenweise ein (es besagt, dass die Eingabe doch "klunky" ist) und schließen Sie mit einem Leerzeichen ab.

Es wird nicht auf der Konsole gedruckt. das wäre doch keine Befunge ohne einen Hauch von Selbstveränderung! Stattdessen ändert es sein eigenes Raster, um die Nachricht anzuzeigen. Nachdem es fertig ist, sieht das Gitter ungefähr so ​​aus:

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

(Beachten Sie das edle Opfer der Zelle bei (0,0), nachdem wir wissen, dass der Zeiger nicht mehr dorthin geht, um ein Datenelement zu speichern.)

Es funktioniert auch mit Eingaben von gerader Länge. Beachten Sie, dass die Eingabegröße auf 21 Zeichen beschränkt ist, wenn Sie Befunge-93 in einem Befunge-93-Interpreter ausführen, da Befunge-93 auf ein Raster von 80 x 25 beschränkt ist. Wenn Sie es als Befunge-98 ausführen, sollte diese Beschränkung aufgehoben werden.

Bearbeiten - Jetzt funktioniert es mehr in Richtung der beabsichtigten Ausgabe, auf Kosten von nur drei Zeichen Länge.

Kasran
quelle
Beachten Sie, dass die Buchstaben durch eine leere Spalte getrennt sind. Buchstaben sind relativ in L-Form.
Sampathsris
Drats! Das hat die Dinge ziemlich kompliziert gemacht. Ich denke, ich kann das retten, aber es erhöht die Endgröße ... na ja.
Kasran
4

Javascript 102 84 85

Bearbeiten: Musste Abstand zu beheben. Nicht mehr so ​​klein.

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
quelle
Dies hat nicht genügend horizontalen Abstand.
Dennis
1
Wow, kürzer als ich und nicht mal mit ES6. +1
Scimonster
Besser, aber der Abstand stimmt immer noch nicht (siehe X). Sofern in der Frage nichts anderes angegeben ist, sollten Sie auch ein Programm oder eine Funktion schreiben. Schnipsel mit fest codierten Variablen werden im Allgemeinen verpönt.
Dennis
1
Und kannst du es nicht schaffen, function(s)weil du nicht wiederkommst?
Zacharý
3

CJam, 38 36 35 34 32 Bytes

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

Teste es hier. Dies liest das Eingangswort von STDIN. Es funktioniert auch für eine gerade Anzahl von Zeichen. Dies gibt eine nachfolgende Spalte mit Leerzeichen aus, aber ich sehe nichts in den Regeln dagegen.

Erläuterung

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

Der Inhalt des Stapels wird am Ende des Programms automatisch ausgedruckt.

Martin Ender
quelle
Meine liebe CJam, Sie wurden gerade von APL geschlagen. ^ _ ^
Vaxquis
@vaxquis Ich war überrascht, dass ich es gleich zweimal geschafft habe. Dieses Problem scheint für APL und Co weitaus besser geeignet zu sein als für stapelbasierte Sprachen.
Martin Ender
2
na ja, zumindest ist es einfacher zu schreiben l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}auf einer Serviette als ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... Glucksen
vaxquis
Nun, jemand anderes hat es geschafft, mich mit CJam zu schlagen, und ich kann mein Programm nicht kürzer machen, also hat CJam mich schließlich geschlagen. (Aber Pyth bekommt die Krone.) (Das heißt, @vaxquis, APL ist weitaus einfacher zu lesen als die meisten anderen hier verwendeten Sprachen, sicher, wenn Sie die ungefähr 60 Zeichen kennen, und sicher im Vergleich zu Pyth oder CJam oder sogar J.)
Marinus
3

C 105

zwei leicht unterschiedliche Arten, es zu tun.

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

Wenn Sie zusätzliche Leerzeichen einfügen möchten, ersetzen Sie diese putchar(durch printf(" %c",5 zusätzliche Zeichen.

Level River St
quelle
3

J - 36 30 Bytes:

Bearbeiten: 6 Zeichen kürzer, Credits gehen an @algorithmshark .

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

z.B:

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

Bonus: Funktioniert auch mit Saiten mit gerader Länge:

   (1j1#"1' '&,({~](*>.*&|.)=)#\) 'CodeGolf'
C             f
  o         l  
    d     o    
      e G      
      e G      
    d     o    
  o         l  
C             f
jpjacobs
quelle
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.

Aufruf:

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

Lesbar:

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

Canvas , 5 Bytes

\\:⇵n

Probieren Sie es hier aus!

Erläuterung:

\      create a diagonal of the input
 \     create an even steeper diagonal of that
  :⇵   reverse a copy of it vertically
    n  overlap the two
dzaima
quelle
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)

Probieren Sie es online!

Zeile 1 liest die Eingabezeichenfolge, teilt sie in Zeichen auf, speichert ihre Länge und erstellt eine Matrix mit dem Wort in der Hauptdiagonale. Die Buchstaben des Wortes werden in einer Identitätsmatrix überlagert (und standardmäßig wiederholt, um der Länge zu entsprechen) und nur die übereinstimmenden Einsen bleiben erhalten, andere werden durch Leerzeichen ersetzt.

Zeile 2 gibt eine Matrix aus, die aus Elementen der Diagonalmatrix oder ihrer horizontal gespiegelten Version besteht, je nachdem, welche größer sind.

−2 + 1 = −1 Byte dank JayCe

−4 Bytes dank Giuseppe

Robert Hacken
quelle
1
Süss! Und nette Erklärung. Sie können 2 Bytes sparen
JayCe
1
Betrachtet man die anderen Antworten und die Frage - Es scheint, dass die Matrix größer sein sollte (zusätzlicher Platz) - die Ausgabe sollte keine quadratische Matrix sein.
JayCe
@ JayCe Danke für die 2 Bytes! Und danke für den Kommentar zur Formatierung, Sie haben wahrscheinlich Recht (obwohl die Regeln diesbezüglich klarer sein könnten). Zum Glück musste beim Drucken nur ein Leerzeichen in den Separator eingefügt werden.
Robert Hacken
89 Bytes unter Verwendungpmax und Inlining einiger weiterer Zuweisungen.
Giuseppe
@ Giuseppe Danke! Leider immer noch nicht genug , um zu schlagen J.Doe ‚s Lösung
Robert Häcken
2

C # ( 214 212)

(Sicherlich schlecht) Golf Version:

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

Ungolfed-Version:

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

Hinweise, Tipps, Tricks oder Bemerkungen sind sehr willkommen, da dies mein erster Versuch bei CodeGolf ist. Ich wollte es einfach mal ausprobieren, obwohl ich weiß, dass meine C # -Byte-Länge die besten Lösungen nicht annähernd verdoppelt;)

Und wie zählt ihr eure Bytes? Ich habe gerade das oben Genannte in ein Quick Watch-Fenster gepostet und habe es getan .Length. Ich könnte ein kleines Programm schreiben, um Bytes für mich zu zählen, aber ich wette, es gibt einen einfacheren Weg, den ich noch nicht kenne.

InvisiblePanda
quelle
Sie können zwei Bytes sparen, indem Sie die Leerzeichen in entfernen for(;i < l;i++).
Beta Decay
Auch ich benutze dies für meine Bytezählung.
Beta Decay
@BetaDecay Ah toll, ich muss die übersehen haben. Und danke für den 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')}

Fügen Sie dies in die Firefox-Konsole ein und führen Sie es aus als 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
quelle
Das habe ich auch gesehen.
Scimonster
2

Mathematica, 149 Bytes

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

Eingabe als Parameter an die Funktion übergeben; Funktion gibt die Ausgabezeichenfolge zurück. Am Ende der Ausgabe befindet sich eine nachgestellte Zeile.

Erläuterung: Wir erstellen eine diagonale Matrix mit der Zeichenfolge und erstellen dann eine Kopie davon, die vertikal gespiegelt ist, indem wir Reverse@#die Zeilen umkehren. Dann haben wir eine dritte Matrix mit den gleichen Dimensionen, die nur 32 enthält (ASCII-Raum). Wir verwenden MapThread, um das elementweise Maximum dieser 3 Matrizen zu nehmen. Schließlich setzen wir Rifflein jede Zeile Appendein Leerzeichen , eine neue Zeile am Ende und Flattendas Ergebnis.

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

Dies könnte nicht als C ++ kompiliert werden, daher hoffe ich, dass ich nicht gegen Regeln verstoßen habe :)

VX
quelle
1. Die Ausgabe ist derzeit falsch. Zwischen den Buchstaben sollte ein Leerzeichen sein. 2. i=0und j=0wird nicht benötigt, da globale Variablen auf Null initialisiert werden. 3. Sie können main(l,v)char**v;anstelle von verwenden main(int l,char**v). 4. Wenn Sie aktualisieren , iwie i+=puts("")können Sie loswerden der äußeren Schleife die geschweiften Klammern bekommen.
Dennis
2

Perl - 90

Es könnte möglich sein, einige weitere Zeichen daraus herauszuholen:

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

89+ 1für -n.

Laufen mit:

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

Ausgabe:

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

T-SQL: 180

Übernahme der Eingabe von der Variablen @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

Dadurch werden einzelne Zeichen vom Anfang bis zum Ende in eine Folge von Leerzeichen eingefügt bzw. dekrementiert.

Testergebnis

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

Ausgänge:

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

JavaScript (Node.js) , 81 Byte

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

EDIT : -1 Danke Joe King. Ich habe nicht gesehen, dass TIO eine vorformatierte Direktpaste für CG enthält.

Probieren Sie es online!


quelle
Übrigens kann der überschüssige Code, um den Code in TIO auszuführen, in die Programmfußzeile geschrieben werden. Dies hilft dabei, die richtige Byteanzahl zu bestimmen und das automatisierte PPCG-Antwortformat reibungsloser zu verwenden. zB Online ausprobieren!
Jo King
-i-1kann sein+~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
quelle
Speichern Sie 11 wertvolle Zeichen mit t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
Sampathsris
Können Sie diese Zeilenumbrüche entfernen?
Zacharý
1

GolfScript 46 ( DEMO )

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

Egal wie lange, es muss immer eine Antwort geben ...

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

Die Ausgabe, mies gemacht, ist:

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

Fügte das import java.util.ScannerInnere des Codes hinzu, weil ich mich nie daran erinnere, ob die Importe für die Byteanzahl zählen ... Verdammt, ich bin echt beschissen.

Rodolfo Dias
quelle
2
Importe zählen. Dies liegt zum Teil an der Import-and-Alias-Syntax von Python: Diese ist from math import floor as fein bisschen betrügerisch
Sie sollten in der Lage sein, eine Reihe von Zeichen zu speichern, indem Sie alle System.out.printAufrufe mit ein paar ternären Operatoren zu einer kombinieren .
DLosc
@ DLosc Könnten Sie mir ein paar Beispiele geben?
Rodolfo Dias
1
Ja, tatsächlich ist die Antwort von Geobits ein perfektes Beispiel - siehe den Inhalt des System.out.printAufrufs am Ende.
DLosc
1
@ RodolfoDias Fühle dich nicht so. Meine ersten Golfspiele in Java waren schrecklich und ich kann meine "ersten Revisionen" immer noch normal abschneiden, wenn ich hart genug aussehe;)
Geobits 31.10.14
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");};}}

Oder als "Main () only":

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
quelle