Kare Kelimeler Yapma


38

Meydan okuma

Göreviniz herhangi bir dize girişini alan ve girişi kare biçiminde çıkaran bir program oluşturmaktır. Boş dizeler boş bir dizge döndürmelidir.

Örnekler

Giriş verilen:

golf

Programınızın çıktısı alınmalı:

golf
o  l
l  o
flog

Giriş:

123

Çıktı:

123
2 2
321

Giriş:

a

Çıktı:

a

Giriş:

Hello, world!

Çıktı (ile w arasındaki boşluğa dikkat edin - boşluk sadece yeni bir satır değil):

Hello, world!
e           d
l           l
l           r
o           o
,           w

w           ,
o           o
r           l
l           l
d           e
!dlrow ,olleH

puanlama

Bu , yani her dilde en kısa cevap kazanır.


@DJMcMayhem Evet, özür dilerim, bunu eklemeyi unutmuştum.
SpookyGengar

2
Endişeye gerek yok, sadece çift kontrol. Güzel ilk meydan okuma BTW! Siteye Hoşgeldiniz :)
DJMcMayhem

@SpookyGengar Bir harfli giriş için bir sınama durumu ekler misiniz?
musicman523

@ musicman523 Zaten bir tane yok mu? Sadece 'a' harfini içeren üçüncü örnek.
SpookyGengar

1
@SpookyGengar benim kötü, görünüşe göre kör oldum
musicman523

Yanıtlar:


17

Kömür , 7 5 bayt

θ‖O↙↘

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Düzenleme: @CarlosAlejo sayesinde 2 bayt kaydedildi. Açıklama:

θ       Print the input string, making the top row
 ‖O     Reflect with overlap...
   ↙    ... down and left, to create the left side
    ↘   ... down and right, to create the bottom and right sides

(Yansıt komutu için birden çok yön aynı anda değil arka arkaya çalışır.)


Vay, isa, hala Charcoal'ın en havalı esolang fikri olduğunu düşünüyorum.
Magic Octopus Urn,

1
Henüz girmiş dize yazdırmak ve downleftwards ve downrightwards yansıtmak eğer iki bayt kaydedebilirsiniz: θ‖B↙↘. Çevrimiçi deneyin!
Charlie,

Şimdi düşünüyorum da, belki karakterleri çevirmekten kaçınmak ReflectOverlapyerine kullanmalıydım ReflectButterfly. :-)
Charlie,

1
Bu, ezoterik bir dilde golflenmiş bir cevabın popüler genel amaçlı dillerin tüm sürümleri eski sürümlerine göre okunması ve anlaşılması daha kolay olduğu nadir durumlardan biridir.
Caleb,

Buradaki cevabınız da 4 bayt için çalışıyor.
Oliver

10

Matl , 20 16 11 bayt

otYTO6Lt&(c

MATL online olarak deneyin !

EDIT: Kod 20.2.1 sürümünde çalışır ve bu da mücadeleden önce gelir. Bağlantı bu sürümü kullanır. (20.2.2'de kod daha kısa olacaktır, ancak zorunluluktan sonra gelecektir).

açıklama

o     % Implicitly input a string. Convert chars to ASCII codes
t     % Duplicate
YT    % 2-input Toeplitz matrix
O     % Push 0
6L    % Push predefined literal [2, -1+1j]. When used as an index, this is
      % interpreted as 2:end-1 (indexing is 1-based)
t     % Duplicate
&(    % 4-input assignment indexing. This writes 0 at the square formed by
      % rows 2:end-1 and columns 2:end-1 
c     % Convert to char. Char 0 is shown as space. Implicitly display

Çok etkileyici! :) Her çıktının altındaki boş satırı kaldırmak mümkün mü, yoksa işlevsellik için gerekli mi?
SpookyGengar

2
@SpookyGengar Sondaki tek bir yeni satıra izin vermek çok yaygın bir istekdir.
Jonathan Allan,

@SpookyGengar Teşekkürler! MATL her zaman sonunda yeni bir satır görüntüler. Jonathan'ın dediği gibi, buna genellikle izin verilir
Luis Mendo,

1
@LuisMendo Her gün yeni bir şey öğreniyorsunuz. :) Gönderim için teşekkürler - kesinlikle şimdiye kadarki en iyi!
SpookyGengar

6

Jöle ,  29 22  17 bayt

Kömür olacak + d yenmek Bu puanı ...

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY

Karakter listelerini alıp geri veren monadik bir bağlantı; ya da sonucu basan tam bir program.

Çevrimiçi deneyin!

Nasıl?

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY - Link: list of characters, w     e.g. "whole"
 ⁶                - literal space character              ' '
J                 - range(length(w))                     [1,2,3,4,5]
  ẋ               - repeat                               [" ","  ","   ","    ","     "]
         Ṛ        - reverse w                            "elohw"
        "         - zip with:
       ¦          -   sparse application of:
   a              -     and (vectorises)
    0,1           -     to indexes: [0,1] (last and 1st) ["e","ll","o o","h  h","w   w"]
            $     - last two links as a monad:
          Ṛ       -   reverse                            ["w   w","h  h","o o","ll","e"]
           ;      -   concatenate                        ["w   w","h  h","o o","ll","e","e","ll","o o","h  h","w   w"]
             Ṗ    - pop (remove last entry)              ["w   w","h  h","o o","ll","e","e","ll","o o","h  h"]
              ŒḌ  - reconstruct matrix from diagonals    ["whole","h   l","o   o","l   h","elohw"]
                Y - join with newlines                   "whole\nh   l\no   o\nl   h\nelohw"
                  - if running as a full program implicit print

Çok havalı! Şimdiye kadar en kısa çözüm, ancak tek karakterli girdilerle ve '123' sayılarından oluşan dizelerle çalışmaz.
SpookyGengar

Ah, tek karakterli kenar durumunu ele almam gerekecek, evet. Rakam karakterli dizelerle çalışır, program girişi gerçekten 'Hello'"Spooky's" "123", vb. Gibi alıntılanmalıdır (Python girişi yorumlamak için kullanılır).
Jonathan Allan,

@SpookyGengar - 1 karakterlik durum için düzeltildi.
Jonathan Allan,

Güzel uzunluk azaltma!
Luis Mendo,

2
Kömür konusunda haklısın.
Neil,

3

C, 109 bayt

i,j;f(char*s){for(i=j=printf("%s\n",s)-2;1[++s];)printf("%c%*c\n",*s,i,s[j-=2]);for(;*s*~i--;)putchar(*s--);}

Çevrimiçi deneyin!

Dikkate değer hileler:

  • Baytları boşa harcamak yerine strlen, ilk satırın eşzamanlı olarak yazdırılması sırasında dize uzunluğunu alırız:

    i=j=printf("%s\n",s)-2

    Bu çalışır, çünkü printfyazılan bayt sayısını döndürür.

  • Orta çizgiler için, dize üzerinde döngü yapmamız, ancak hem ilk hem de son karakteri hariç tutmamız gerekir. Bu durum ile elde edilir

    1[++s]

    (ki daha kısadır (++s)[1]nedeniyle ilk karakteri atlar, hangi) ++'nin varlık durumda ve mevcut karakteri geçmiş karakter olduğunda durdurarak sonuncusu atlar '\0'(yerine durdurma de '\0' ).

  • İlk döngünün gövdesinde,

    printf("%c%*c\n",*s,i,s[j-=2])

    O zaman şimdiki karakteri "aynalı" uygun düzgün yazdırmak (ile takip karakter j, negatif gitmek negatif bir sayı ile bir dizeye endeksleme garip durum sonuçta yok,) bir uzunluğa doldurulması inerede (boşluklu iolduğu uygun bir şekilde strlen(s) - 1).

  • Son satırdaki ters baskı oldukça basittir; tek numara, döngü bedeninin yinelemelerini *s*~i--almanın en kısa yoludur i+2(buna bağlı değildir i; her işey için kullanılır). Korkak *s*bir kısmı da döngü halinde çalışmaz hale getiriyor *solduğu '\0'uzunluk-1 girişi olur ki,.


3

Oktav, 40 bayt

@(s,t=toeplitz(s),u=t(x=2:end-1,x)=32)t;

Çevrimiçi deneyin!

Bu benim cevabım ama @ Louis MATL cevabından sonra yayınlanmıştır


2
Çok güzel cevap. Btw: kodunuzu GNU Octave geliştirme şube 4.3.1 (b481a9baeb61) çöktü ve şimdi test paketinin bir parçasıdır :-) hg.savannah.gnu.org/hgweb/octave/rev/c94e9509461b
Andy

1
@Andy Teşekkürler ve codegolf hoş geldiniz! Octave projesinin geliştirilmesine yardımcı olabilirse sevindim!
rahnema1

3

Haskell , 84 78 bayt

f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]
r=reverse

Çevrimiçi deneyin! Kullanımı: f "test". Satır listesini döndürür.

Düzenleme: -6 bayt dianne sayesinde!


1
Desen korumasını bir koruma olarak kullanarak ve eş anlamlılarını tanımlayarak birkaç bayttan tasarruf edebilirsiniz reverse; r=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]78 bayttır.
dianne,



2

05AB1E , 17 16 15 19 bayt

ÂDÂø¦¨Dgú€Ás)˜»Igi¨

Çevrimiçi deneyin!

açıklama

Örnek input = golf

ÂDÂ                  # bifurcate, duplicate, bifurcate
                     # STACK: 'golf', 'flog', 'flog', 'golf'
   ø                 # zip the top 2 items
                     # STACK: 'golf', 'flog', ['fg', 'lo', 'ol', 'gf']
    ¦¨               # remove the first and last element
                     # STACK: 'golf', 'flog', ['lo', 'ol']
      Dg             # get the length of the list
                     # STACK: 'golf', 'flog', ['lo', 'ol'], 2
        ú            # prepend that many spaces to each element
                     # STACK: 'golf', 'flog', ['  lo', '  ol']
         €Á          # rotate each right
                     # STACK: 'golf', 'flog', ['o  l', 'l  o']
           s         # swap the top 2 items
                     # STACK: 'golf', ['o  l', 'l  o'], 'flog'
            )˜       # wrap in a flattened list
                     # STACK: ['golf', 'o  l', 'l  o', 'flog']
              »      # join on newline
               Igi¨  # if input is length 1, remove last char

1 harfli giriş için düzeltme oldukça pahalıydı.
Şimdi farklı bir yaklaşımın daha iyi olabileceğini düşünüyorum.



1

Mathematica, 128 bayt

(c=Column;g=Length[x=Characters@#]-1;If[g==0,#,c@{#,c@Table[""<>{x[[i]],""<>Table[" ",g-1],x[[-i]]},{i,2,g}],StringReverse@#}])&

1

C, 96 bayt

i,l;f(char*s){for(i=l=puts(s)-2;--i;)printf("%c%*c\n",s[l-i],l,s[i]);for(;l+1;)putchar(s[l--]);}

Bonus sürümü (122 bayt):

x,y,i,l;f(char*s){for(i=l=puts(s)-1;++i<l*-~l;putchar(x==l?10:x%~-l*(y%~-l)?32:s[(x*y?l+l-2-x-y:x+y)%l]))x=i%-~l,y=i/-~l;}

1

Swift 3 , 215 199 bayt

let s=readLine()!,c=s.characters,r:[Character]=c.reversed(),b=c.count
print(s)
if b>1{for i in 0..<b-2{print("\(r.reversed()[i+1])\(String.init(repeating:" ",count:b-2))\(r[i+1])")};print(String(r))}

Çevrimiçi deneyin


1

Python 3, 88 bayt

w=input();p=print;l=len(w)-2
[p(w[n+1]+' '*l+w[l-n])for n in range(l)]
l+1and p(w[::-1])

1
PPCG'ye Hoşgeldiniz!
Martin Ender,

Siteye de Hoşgeldiniz! Bir bayt kurtarmak l+1 andiçin yeniden yazılabileceğine inanıyorum l+1and.
Buğday Sihirbazı,

@WheatWizard düzenlendi - teşekkürler!
Levi

0orPython'un ayrıştırılamadığı durumlar dışında işe yarayacak , çünkü 0obir sekizlik önek.
Buğday Sihirbazı,

Bunu çalıştırdığımda, üst satırdaki gibi görünmüyor ... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/…
Coty Johnathan Saxman

1

JavaScript (ES8), 108 112 bayt

let f = 

s=>(n=s.length)<2?s:(r=[...s].reverse()).slice(1,-1).reduce((a,v,i)=>a+`
`+s[i+1].padEnd(n-1)+v,s)+`
`+r.join``

o.innerHTML = f("hello folks!")
<pre id="o"></pre>

Az golphed

s=>
   (n=s.length) < 2 ?    // record and check length
   s :                   // s has 0 or 1 char, else
   (r=[...s].reverse())  // reverse characters,
   .slice(1,-1)          // exclude 1st and last
   .reduce((a,v,i)=>     // append inner lines
      a +'\n' +s[i+1].padEnd(n-1) + v
    ,s)                  // to first line
    + '\n' +r.join("")   // append characters reversed

Çok sayıda baytı kurtardığı için Justin Mariner'a teşekkürler, bu sayede hepsi meydan okumaya uyması için gereken sıfır veya tek karakter kontrolünü ekleyerek alıştı. Anladın mı?


İkinci satırı yaparak `+s[i+1].padEnd(s.length-1)+v,s)+`ve kullanarak 7 bayt kaydedebilirsiniz r.join``.
Justin Mariner,

Şablon hazırlıkları hakkında String.prototype.padStartve etiketlenen ipuçları için @JustinMariner'a teşekkür ederiz . Uzunluk kontrolünün minimumda tutulmasına yardım etmek için ihtiyacım vardı :-)
traktor53

Boşluğunuz şimdi çok kısa bir karakter; Bunu düzeltebilir (n=s.length-1)?(r=<...>+r.join``:sve kullanarak ve birkaç kullanarak daha fazla tasarruf edebilirsiniz padEnd(n). Uzunluğu ise 1, length-1olduğu 0(yanlış).
Justin Mariner,

@JustinMariner aralığı sabit, ancak uzunluk testini sürdürdüm - anladığım kadarıyla, hem sıfır uzunluktaki dizeler hem de bir karakterdeki dizeler, satırbaşları veya dizenin tekrarı olmadan kendilerini döndürürler.
traktor53

1
padEndES2017'dir.
Neil,

1

PHP , 118 bayt

echo $s=$argv[1];$l=strlen($r=strrev($s))-1;for($i=$l-1;$l&&$i;)echo "\n".str_pad($r[$i],$l).$s[$i].(--$i?"":"\n$r");

Çevrimiçi deneyin!

echo $s = $argv[1];
$l = strlen($r = strrev($s)) - 1;

for ($i = $l - 1; $l && $i;)
    echo "\n" . str_pad($r[$i], $l) . $s[$i] . (--$i ? "" : "\n$r");

1

APL , 58 bayt

{(' ',⍵)[x+(x←∘.{((c-1)=⍺⌈⍵)∨0=⍺⌊⍵}⍨r)×o⌊⌽⊖o←∘.⌈⍨r←⍳c←≢⍵]}

İle ⎕IO←0.

Çevrimiçi deneyin!

Nasıl?

c←≢⍵ - dizenin uzunluğu

r←⍳ - Aralık

o←∘.⌈⍨ - minimum ürün

123
223
333

o⌊⌽⊖- kendisi ile minimalize 180 çıktı o

123  ⌊  333  =  123
223  ⌊  322  =  222
333  ⌊  321  =  321

× - ile çarp

x←∘....⍨r - aralığın dış ürünü

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ - matrisin çerçevesi

111  ×  123  =  123
101  ×  222  =  202
111  ×  321  =  321

x+ - çerçeveyi ekle

111  +  123  =  234
101  +  202  =  303
111  +  321  =  432

(' ',⍵)[...] - boşlukla birleştirilmiş dizeden dizine göre alma


Can ⍉⊖⍉⊖olmak ⌽⊖?
Zacharý,

@ Zacharý thanks
Uriel

0

JavaScript (ES2017), 87 bayt

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

ES6 sürümü: 93 bayt

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i]+' '.repeat(l-1)+c:z.join``:s).join`
`

Daha az golf oynadı

s => (
  l = s.length-1,
  [...s].reverse().map( // scan string backwards
     (c, i, z) => 
     i != 0 // check if top row
     ? l-i != 0 // check if bottom row
       ? s[i].padEnd(l) + c // any middle row
       : z.join`` // bottom row: string reversed
     :s // top row: original string
  ).join`\n`
)

F=
s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='Hello, world!' oninput='update()'>
<pre id=O></pre>


padEndES2017'dir.
Neil,

@Neil teşekkür ederim başlığımı değiştireceğim
edc65

ES6 sürümünüzde bir baytı kullanarak kaydedebilirsiniz l+~i, bu, 1'i iki kez çıkarmak zorunda kalmaz , bunun yerine 2 kez bir kere çıkarabilirsiniz.
Neil,

@Neil olmalıl-~-i
edc65

Düşündüm s=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` ama s=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` aynı zamanda çalışıyor.
Neil,

0

Java, 191 bayt

(s)->{PrintStream o=System.out;int l=s.lenght();o.println(s);for(int i=0;i<l;i++){o.printf("%"+"s%"+(l-1)+"s%n",s.charAt(i),s.charAt(l-1-i));for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}}};

(s)sadece olabilir s. İçinde tek çizgiler bulunan ilmekler kıvrık parantezlerini çıkarabilir. Herhangi bir bayt kurtarırsa, yazdırma yerine geri dönebilirsiniz. Her int iiki döngüde de kullanırsınız , farklı kapsamlarda olup olmadıklarını ancak belirtmeye değer olup olmadığını söyleyemem. Benzer değişkenleri birlikte başlatmak, genellikle baytları kurtarır. for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}-> for(int i=0;i<l;){o.print(s.charAt(l-1-i++));}. Takip eden yarı kolona ihtiyacınız yok.
TheLethalCoder,

İşaret ettiğiniz için teşekkür ederiz;) (Golf ile çok aşina değil). Daha sonra optimize edecek!
Serverfrog

0

C # (.NET Core) , 179 161 bayt

TheLethalCoder sayesinde -18 bayt

using System.Linq;
s=>{int l=s.Length-1,i=1;var d=s.Reverse().ToArray();while(i<l)s+="\n"+s[i]+new string(' ',l-1)+d[i++];if(l>1)s+="\n"+new string(d);return s;};

Çevrimiçi deneyin!

Kurallardan emin değilim, bunun byte sayımı için gerekli olup olmadığı:

using System.Linq;

Birisi lütfen beni bu konuda düzeltin.

Ungolfed:

s =>
{
    int l = s.Length - 1, i = 1;
    var d = s.Reverse().ToArray();
    while (i < l)
        s += "\n" + s[i] + new string(' ', l - 1) + d[i++];
    if (l > 1)
        s += "\n" + new string(d);
    return s;
};

Merhaba ve PPCG'ye hoş geldiniz! Linq kullanıyorsanız using, bayt sayınıza dahil etmelisiniz . Linq kullandığınız gibi ToCharArray()olabilir ToArray(), Reverse()ancak daha önce gerçekten ihtiyacınız var mı? Kullandığınız olduğundan Stringtam olarak nitelemek için size ya ihtiyacı veya dahil kullanarak, ancak, bu kolayca da bunu değiştirerek düzeltilebilir string. ifBöyle bir üçlü olarak daha kısa olabilir s+=l>1?if code:"";. Döngüden çıkarabilir i++ve art arda gönderebilirsiniz d[i++].
TheLethalCoder,

Benzer iile başlat . Ve bunun olabileceğini düşünüyorum! lint l=s.Length-1,i=1;
TheLethalCoder

@TheLethalCoder teşekkür ederim! Önerilerinizi koda ekledim. Birkaç not: Bu dizginin aslında IE numaralandırılabilir olduğunu unuttum; String yerine string, hala mücadele ettiğim bir Java tortusuydu, ternary aslında şaşırtıcı derecede uzundu; ve değişikliklerinizi yaptıktan sonra (; expr;) süre ile (expr) arasında değiştim, çünkü daha güzel görünüyor ve aynı bayt sayısı. Tekrar teşekkürler.
Grzegorz Puławski,

Telaşa gerek yok! Üçlüler bazen vardır ama genellikle daha kısa çıkarlar, bu yüzden onları denemeye her zaman değer.
TheLethalCoder

0

Retina , 106 bayt

..+
$&¶$&
O$^`.(?=.*$)

\G.
$&$%'¶
r`.\G
¶$%`$&
+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2
T`p` `(?<=.¶.).*(?=.¶.)
G`.

Çevrimiçi deneyin! Açıklama:

..+
$&¶$&

En az iki karakter varsa, girişi çoğaltın.

O$^`.(?=.*$)

Kopyayı ters çevirin.

\G.
$&$%'¶
r`.\G
¶$%`$&

Dizeleri üçgenlere dönüştürün. Üstteki üçgen giriş ile başlar ve her seferinde ilk karakteri kaldırırken, alttaki üçgen ters girişin ilk harfiyle başlar ve her seferinde bir karakter ekler.

+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2

Son karakterin /köşegen oluşturması için üst üste binerek üçgenleri birleştirin .

T`p` `(?<=.¶.).*(?=.¶.)

Her iki taraftan da en az bir karakter uzaktalarsa, tüm karakterleri boşluklarla değiştirin.

G`.

Kalan boş satırları silin.


0

Python 3, 85 bayt

En üstteki satır için girişi kullanma :)

a=input()
b=len(a)
for i in range(b-2):print(a[1+i]+" "*(b-2)+a[-2-i])
print(a[::-1])

Bunun doğru bir cevap verdiğinden emin misin?
Koishore Roy,

0

Lua , 104 bayt

print(s);for a=2,#s-1 do print(s:sub(a,a)..(" "):rep(#s-2)..s:sub(#s-a+1,#s-a+1)) end;print(s:reverse())

Çevrimiçi deneyin!


ama sen sadece bir pkere kullandın ...
Leaky Nun

Doğru ... bunu değiştirecek.

0

Python 3, 106 bayt

İşlevsel bir versiyon ...

w=input();p=print;l=len(w)-2
def f(k):p(w[k]+' '*l+w[-k-1]);l-k>0and f(k+1)
l<0 or f(1)or l<1or p(w[::-1])


0

Mathematica, 138 91 bayt

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&

Aşağıdakileri Wolfram Cloud Sandbox'a aşağıdakileri yapıştırarak ve "hücreyi değerlendir" seçeneğini tıklayarak veya Shift + Enter veya Numpad Enter tuşlarına basarak çevrimiçi deneyebilirsiniz :

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
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.