Karakter çapraz


31

PCG'deki ilk bulmacamdan daha karmaşık bir şey göndermeyi bekliyordum, ancak Stack Overflow ile ilgili özel bir ev ödevi sorusu bunu göndermem için bana ilham verdi. Onlar ister:

Tek harf sayısını içeren herhangi bir kelime için aşağıdaki deseni yazdırın :

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


Harflerin bir şövalyenin, basmanız gereken düzende birbirinden ayrıldığına dikkat edin. Yani, diğer her sütun boştur. - ( Bunu işaret ettiğiniz için teşekkür ederiz .)

kurallar

  1. C ++ kullanımı yasaktır. Bu soruyu oraya bağlayabildiğim için.
  2. stdoutBir dizgeyi hızlı bir şekilde basmak için herhangi bir yol kullanabilirsiniz (örneğin alert(), JavaScript'te).
  3. Her zaman olduğu gibi, en kısa kod kazanır.

2
Bu, yığın taşması ile ilgili mesajlarda yer almaktadır: stackoverflow.com/q/5508110
Level River St

2
@flawr Çift sayıdaki gibi tuhaf demek istiyorum.
NinjaBearMonkey 29:14

31
Tanrım ben aptalım, bir tür karanlık bilgisayar bilim adamının kısaltması olduğunu düşündüm =)
kusur

2
@jpjacobs: Soru açıkça aksi belirtilmediği sürece bayt.
Dennis,

2
Tüm program mı yoksa sadece bir işlev mi? (ilk önce cevap vermem ve bu soruyu daha sonra cevaplamam konusunda gerçekten zekiyim ...)
Rodolfo Dias

Yanıtlar:


13

Pyth , 22

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

Ölçek:

$ 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

Açıklama:

(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'ta bit tamamlayıcısı yok mu?
xnor

@xnor Hayır, ama faydası olmaz. Farz edelim ki ~Pyth’te bitsel değildi. Sonra değişebilir t-lzdiçin +lz~dhala 5 karakter -.
isaacg

Vzgüzel bir numara: Ben bilmiyordum U<string>verdi range(len(<string>)).
FryAmTheEggman

Evet, güzel bir özellik. Listelerde de bu şekilde çalışır, ancak mutlaka katılmaz. EDIT: Hata! Belgelerde bu eksik. Ekleyeceğim. Üzgünüm.
isaacg

20

APL ( 37 35 34 27)

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

Klavyeden girdi alır, şöyle yapar:

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

7
Tüm oylarım APL'ye ait.
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)

Giriş:

"CODE-GOLF"

Çıktı:

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

Ben de aynı şeyi yazıyordum. Bir gelişme var i in[j,L+~j].
xnor

@xnor: Daha da kısa bir durum buldu. ;)
Falko

Zeki. Yine de yapabilirsin L+~j.
xnor

@ xnor: Ah, haklısın. Her zaman +~hileyi unuturum ...
Falko

for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)Bir karakter kaydetmek için yapabilir misin ? (Test etmek için şimdi Python 2'ye erişemiyorum.)
xnor

11

Python 3: 75 karakter

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

Satır iiçin bir boşluk listesiyle başlıyoruz ve girişleri iönden ve arkadan giriş dizesinin harflerine eşit olacak şekilde ayarlıyoruz . Sonra sonucu yazdırırız.

Python dizeleri değişmezdir, bu nedenle akarakterlerin bir listesi olmalıdır. Liste a, döngü içinde başlatılmalıdır, aksi takdirde değişiklikler döngüler arasında gerçekleşir. print(*a)Listedeki her karakteri Python 3 gerektiren boşlukla ayrılmış olarak yazdırmak için kullanıyoruz .

Çıkış çizgileri simetriktir, bu yüzden iwhile döngüsünü kullanmak yerine geri sayım yapabiliriz .

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

Aynı zamanda eşit sayıda harf için çalışır.

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

Bunu Pyth'e çeviriyorum, VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJhangisini 29 bayt alırım ... Sanırım APL'yi yenmek için başka bir şey denemek zorunda kalacağım. Ayrıca, Python 3'ün Python 2'yi dışarıda bırakabileceğinin kanıtı için +1 (bazen)
FryAmTheEggman

Fry Python 3 genellikle tecrübelerime göre 2 golf dışarı. Başka hiçbir yerde bir şey değişmese bile, çoğu zorluk bir girdi verir ve bir çıktı bekler len("raw_input()") + len("print ") > len("input()") + len("print()").
undergroundmonorail

@ undergroundmonorail Eh, bununla ilgili sorun şu ki input() python 2'de de geçerlidir (sadece biraz daha farklı davranır), bu yüzden mücadelenin girişi oldukça katı değilse, python 2 genellikle kazanacaktır.
FryAmTheEggman

Vay, Python 2 ile bile ve print" ".join(a)kodun benimkinden daha kısa (82).
Falko

@FryAmTheEggman Cevabımı gör - diğer python cevabının bir uyarlaması ve APL'den çok daha kısa. Pyth, maalesef indekslere atanmayı gerçekten sevmiyor.
isaacg

8

CJam, 27 25 bayt

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

Çevrimiçi deneyin.

Örnek çalışma

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

Cevaptaki örnekte, her satırın sonunda boşluk var.

Nasıl çalışır

                             " 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
Üzgünüz, bu temelde 'harika bir cevap!' yorum, ama sadece o asla söylemek zorunda hiç , sütunlarla yerine satır kutuyu inşa etmek aklıma olurdu.
FryAmTheEggman

4

Java - 168

Basit bir iç içe döngü, burada gerçekten çok özel bir şey yok.

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

Satır sonları ile:

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

Saf Bash, 94 bayt

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
Çok fazla t%lhesaplama var. İlk kullanımda bir değişkene kaydedin, ((x=t%l))daha sonra 94 karaktere indirmek için değişkeni kullanın.
Manatwork

Ah evet, ben bu yapmıştı x=t%lve y=t/lve kullanımı sadece x sadece zihnimi geçmedim ... uzundu
Dijital Travma

4

Ruby, 64

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

açıklama

  • Giriş bir lambda argümanı olarak alınır. Bir bekliyor String.
  • Döngülerden oluşan bir döngüde, kelimedeki her karakterden ( ntoplam olarak):
    • nBoşluklardan oluşan bir Dize oluşturun .
    • Değiştir ith ve n-iinci ( ~iile, teşekkür XNOR) alan ith ve n-igirdi inci karakter.
    • Satırı yazdır

7
25.000'inci cevabı gönderdiğiniz için tebrikler! :) (Aslında ben değilim% 100 emin, bu durum, önbelleğe almaya biridir Ama son cevap, Site istatistikleri İlk testere "25.000 cevaplar" oldu..)
Martin Ender

2
-i-1Bit tamamlayıcısı olarak yapabilirsiniz ~i.
xnor

Bu çok zekice, teşekkürler!
britishtea

2
Bu yaklaşımla, aslında bir lambda yerine stdin kullanmak faydalı görünmektedir: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(girişin, örneğin yeni bir satırla sonlandırılmadığını varsayar echo -n CODE-GOLF). Bir kişi daha sonra .charsbaşka bir karakterden tasarruf etmek için ek bir x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
fayda sağlayabilir

4

JavaScript (E6) 101 95 129 136

Düzenleme Yanlış harf aralığı. Sabit.
Düzenleme Döngüler için klasik kullanarak daha basit ve daha kısa
. İşlev olarak, açılır pencereden çıktı alın.

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 kullanarak önceki sürüm

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 konsolunda test edin

F('Java-Script')

Çıktı

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

2
Bu yeterli yatay boşluğa sahip değil - her bir sütun arasındaki tüm boşlukların harfli olması gerekir.
isaacg

4

Befunge-93, 68 71

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

Burada test edebilirsiniz . Her seferinde bir giriş iletişim kutusu ile gelecek ~; kelimenizi her seferinde bir karakter girin (girişin 'klunky' olduğunu söyler), bir boşlukla biter.

Konsola yazdırmaz; sonuçta bu, kendini değiştirmenin bir ipucu olmadan Befunge olmaz! Bunun yerine mesajı görüntülemek için kendi ızgarasını değiştirir. Tamamlandıktan sonra, ızgara şöyle görünecek:

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

(Hücrenin soylu fedakarlığını (0,0) not edin, işaretçinin bir veri parçasını saklamak amacıyla artık oraya gitmeyeceğini biliyoruz.)

Aynı zamanda eşit uzunluktaki girişlerle çalışır. Befunge-93'ün 80x25 ızgarayla sınırlı olduğundan, bir Befunge-93 yorumlayıcısında çalıştırırsanız giriş boyutunun 21 karakterle sınırlı olduğunu unutmayın. Befunge-98 olarak çalıştırmak bu limiti kaldırmalıdır.

Düzenleme - Şimdi, yalnızca üç karakter uzunluğunda olmak üzere, amaçlanan çıktının çizgileri boyunca daha fazla çalışır.


Harflerin boş bir sütunla ayrıldığını unutmayın. Harfler nispeten L şeklindedir.
sampathsris

Drats! Bu oldukça önemli şeyler karmaşık. Sanırım bunu kurtarabilirim, ama bitiş boyutuna ekleyeceğim ... oh iyi.
Kasran

4

Javascript 102 84 85

Düzenleme: Boşluğu düzeltmek zorunda kaldı. Artık o kadar küçük değil.

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

Bu yeterli yatay boşluk içermiyor.
Dennis,

1
Vay, benimkinden daha kısa ve ES6 kullanmıyor bile. +1
Scimonster

Daha iyi, ancak boşluk hala yanlış (X'e bakın). Ayrıca, soru aksi belirtilmediği sürece, bir program veya işlev yazmalısınız. Kodlanmış değişkenleri olan snippet'ler genellikle kaşlarını çattı.
Dennis,

1
Ve function(s)tekrarlamadığın için başaramaz mısın?
Zacharý

3

CJam, 38 36 35 34 32 bayt

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

Burada test et. Bu giriş kelimesini STDIN'den okur. Aynı zamanda eşit sayıda karakter için çalışır. Bu, takip eden bir boşluk sütunu yazdırır ancak buna karşı kurallarda hiçbir şey göremiyorum.

açıklama

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

Yığının içeriği programın sonunda otomatik olarak yazdırılır.


Sevgili CJam, daha yeni APL tarafından yenildin. ^ _ ^
vaxquis

@vaxquis Ben ilk başta iki kez yenmek başardı şaşırdım. Bu sorun APL ve co için yığın tabanlı dillerden çok daha uygun görünüyor.
Martin Ender

2
iyi, en azından l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}peçeteye yazmak daha kolay ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... kıkırdama
vaxquis

Başka biri CJam'ı kullanarak beni yenmeyi başardı ve programımı daha kısa tutamam, bu yüzden CJam sonunda beni dövdü. (Ama Pyth tacını alır.) (Yani, @vaxquis, APL 60 ya da öylesine karakterleri biliyoruz ve kesinlikle bir kez, burada kullanılan diğer diller çoğundan daha okumak çok daha kolay kesinlikle Pyth veya CJam ya kıyasla hatta J.)
marinus

3

C, 105

Bunu yapmanın iki farklı yolu.

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

Eğer fazladan boşluk eklemek istiyorsanız, yerini putchar(ile printf(" %c",fazladan 5 karakterler için.


3

J - 36 30 bayt:

Düzenleme: 6 karakter daha kısa, kredi @algorithmshark gidin .

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

Örneğin:

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

Bonus: eşit uzunluktaki dizelerle de çalışır:

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

3

Prolog - 240 bayt

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

çağırma:

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

Okunabilir:

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

Tuval , 5 bayt

\\:⇵n

Burada dene!

Açıklama:

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

3

R , 99 98 93 89 bayt

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

Çevrimiçi deneyin!

Satır 1, giriş dizesini okur, karakterlere ayırır, uzunluğunu saklar ve ana köşesinde kelimesiyle bir matris oluşturur - kelimenin harfleri bir kimlik matrisinde üst üste getirilir (ve uzunluğuyla eşleşmesi için varsayılan olarak tekrarlanır) ve yalnızca eşleşenler 1'ler tutulur, diğerleri ise boşluklarla değiştirilir.

Satır 2, hangisi daha büyükse, çapraz matrisin elemanları veya yatay olarak yansıtılmış versiyonunun oluşturduğu bir matrisi yazdırır.

JayCe sayesinde −2 + 1 = −1 bayt

Giuseppe sayesinde −4 bayt


1
Tatlı! Ve güzel bir açıklama. 2 bayttan tasarruf
JayCe

1
o diğer yanıtlar ve söz bakarak - matris daha büyük (ekstra boşluk) olması gerektiği gibi görünüyor - çıkış kare matris olmamalı ..
Jayce

@JayCe 2 bayt için teşekkürler! Ve biçimlendirme hakkındaki yorumunuz için teşekkürler, muhtemelen haklısınız (kurallar bu konuda daha açık olsa da). Neyse ki tek gereken baskı yaparken ayırıcıya bir boşluk koymaktı.
Robert Hacken

89 byte,pmax biraz daha fazla atama kullanarak ve satır içi.
Giuseppe

@Giuseppe Teşekkürler! Ne yazık ki, hala yeterli değil dövmek J.Doe 'ın çözüm
Robert Hacken

2

C # ( 214 212)

(Kesinlikle kötü) Golfed sürümü:

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

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

Herhangi bir ipucu, ipucu, püf noktası ya da açıklama çok açıktır, çünkü bu CodeGolf'teki ilk girişimim. Sadece denemek istedim, C # byte uzunluğumun en iyi çözümleri iki katına bile yaklaştırmayacağını bile bildiğim halde;)

Peki baytlarınızı nasıl sayarsınız? Yukarıdakileri bir Hızlı İzleme penceresine gönderdim ve yaptım .Length. Benim için bayt saymak için küçük bir program yazabilirim, ancak bahse girerim bilmiyorum daha kolay bir yol var.


Boşlukları kaldırarak iki bayttan tasarruf edebilirsiniz for(;i < l;i++).
Beta Decay

Ayrıca kullandığım bu benim bayt sayımı için.
Beta Ayı

@ BetaDecay Ah harika, onları göz ardı etmiş olmalıyım. Ve bağlantı için teşekkürler!
GörünmezPanda

2

JavaScript (ES6) - 185 177 175 170 bayt

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

Bunu Firefox konsoluna koyun ve aşağıdaki gibi çalıştırın 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


Onu da gördüm.
Scimonster

2

Mathematica, 149 bayt

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

Girdi, işleve parametre olarak geçti; işlevi çıktı dizesini döndürür. Çıktının sonunda takip eden bir yeni satır var.

Açıklama: Dize ile çapraz bir matris yarattık, sonra Reverse@#satırları tersine çevirerek dikey olarak çevrilmiş bir kopyasını oluşturduk . Daha sonra sadece 32 (ascii boşluk) içeren aynı boyutlarda üçüncü bir matrisimiz var. MapThreadBu 3 matrisin element-max değerini almak için kullanıyoruz . Sonunda, Riffleher satıra, Appendsonunda yeni bir satıra ve Flattensonucuna yer veriyoruz .


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

Bu C ++ olarak derlenmemiş olabilir, bu yüzden umarım kuralları ihlal etmedim :)


1. Çıkış şu anda yanlıştır. Harfler arasında boşluk bırakılmalıdır. 2. i=0ve j=0küresel değişkenler sıfır başlangıç beri, gerekli değildir. 3. main(l,v)char**v;yerine kullanabilirsiniz main(int l,char**v). Eğer güncellerseniz 4. iolarak i+=puts(""), sen dış döngüsünün süslü parantez kurtulabilirsiniz.
Dennis,

2

Perl - 90

Bundan daha fazla karakter sıkmak mümkün olabilir:

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

89+ 1için -n.

Çalıştır:

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

Çıktı:

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

2

T-SQL: 180

@İ değişkeninden girdi almak

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

Bu, başlangıçtaki ve sondaki tek karakterleri bir boşluk dizisine doldurur.

Test sonucu

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

Çıktılar:

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


2

JavaScript (Node.js) , 81 bayt

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

EDIT : -1 Teşekkürler Joe King. TIO'nun CG için önceden biçimlendirilmiş doğrudan macun verdiğini görmedim.

Çevrimiçi deneyin!


btw, TIO’daki kodu çalıştırmak için kullanılan fazla kod program alt bilgisine girebilir. Bu, doğru bayt sayısının belirlenmesine ve otomatik PPCG cevap formatının daha sorunsuz kullanılmasına yardımcı olur. Örneğin , çevrimiçi deneyin!
Jo King

-i-1olabilir+~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);
}

İle 11 değerli karakter kaydedin t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
sampathsris

Bu yeni satırları kaldırabilir misin?
Zacharý


1

Ne kadar uzun olursa olsun, her zaman bir cevap olmalı ...

Java - 289 234 bayt

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

Berbat bir şekilde yapılan çıktı:

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

import java.util.ScannerKodun içine eklenmiş çünkü ithalatın bayt sayısına göre sayılıp sayılmadığını asla hatırlamıyorum .


2
İthalat sayılır. Bu kısmen Python'un içe ve dışa aktarma sözdizimi nedeniyle: from math import floor as fki biraz hile

Birkaç System.out.printçağrıyı tek bir operatörle birleştirerek tüm çağrıları bir araya getirerek birkaç karakter kaydedebilmelisiniz .
DLosc

@DLosc Bana birkaç örnek verebilir misiniz?
Rodolfo Dias

1
Evet, aslında Geobits'in cevabı mükemmel bir örnek - System.out.printen sonunda görüşmenin içeriğine bakınız .
DLosc

1
@RodolfoDias Böyle hissetme. Java Benim ilk birkaç çoraplar vardı korkunç ve sert yeterince bakarsan ben hala normalde benim "ilk revizyonlar" kapalı insana yakışır bir yığın tıraş edebilirsiniz;)
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");};}}

Veya "Yalnızca ()" olarak:

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");};}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.