Membuat Kata-Kata Kuadrat


38

Tantangan

Tugas Anda adalah membuat program yang mengambil input string apa pun, dan mengeluarkan input dalam format kuadrat. String kosong harus mengembalikan string kosong.

Contohnya

Diberikan input:

golf

Program Anda harus menampilkan:

golf
o  l
l  o
flog

Memasukkan:

123

Keluaran:

123
2 2
321

Memasukkan:

a

Keluaran:

a

Memasukkan:

Hello, world!

Output (perhatikan ruang antara, dan w - gap bukan hanya baris baru):

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

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

Mencetak gol

Ini adalah , jadi jawaban tersingkat di setiap bahasa menang.


@DJMcMayhem Ya, permintaan maaf saya lupa menambahkannya.
SpookyGengar

2
Jangan khawatir, cukup periksa ulang. Bagus tantangan pertama BTW! Selamat datang di situs :)
DJMcMayhem

@SpookyGengar Apakah Anda akan menambahkan test case untuk input satu huruf?
musicman523

@ musicman523 tidakkah saya sudah memilikinya? Contoh ketiga hanya melibatkan huruf 'a'.
SpookyGengar

1
@SpookyGengar salahku, aku buta rupanya
musicman523

Jawaban:


17

Arang , 7 5 byte

θ‖O↙↘

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 2 byte berkat @CarlosAlejo. Penjelasan:

θ       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

(Beberapa arah ke perintah Reflect dijalankan secara berurutan daripada secara bersamaan.)


Wow, ya Tuhan, saya masih berpikir Charcoal adalah ide esolang paling keren.
Magic Gurita Guci

1
Anda dapat menyimpan dua byte jika Anda hanya mencetak string input dan mencerminkan downleftwards dan downrightwards: θ‖B↙↘. Cobalah online!
Charlie

Sekarang saya memikirkannya, mungkin saya seharusnya menggunakan ReflectOverlapalih-alih ReflectButterflymenghindari membalik karakter. :-)
Charlie

1
Ini adalah salah satu kasus yang jarang terjadi di mana jawaban golf dalam bahasa esoterik lebih mudah dibaca dan dipahami daripada versi lengkap dari bahasa tujuan umum populer yang tidak disatukan.
Caleb

Jawaban Anda di sini juga berfungsi untuk 4 byte.
Oliver

10

MATL , 20 16 11 byte

otYTO6Lt&(c

Cobalah di MATL online!

EDIT: Kode berfungsi pada rilis 20.2.1, yang ada sebelum tantangan. Tautan menggunakan rilis itu. (Dalam 20.2.2 kodenya akan lebih pendek, tetapi ini mengungguli tantangan).

Penjelasan

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

Sangat mengesankan! :) Apakah mungkin untuk menghapus baris kosong di bagian bawah setiap output, atau apakah itu diperlukan untuk fungsionalitas?
SpookyGengar

2
@SpookyGengar Ini adalah permintaan yang sangat umum untuk mengizinkan satu baris baru.
Jonathan Allan

@SpookyGengar Terima kasih! MATL selalu menampilkan baris baru. Seperti yang dikatakan Jonathan, itu biasanya diizinkan
Luis Mendo

1
@LuisMendo Anda mempelajari sesuatu yang baru setiap hari. :) Terima kasih atas kirimannya - pasti yang terbaik sejauh ini!
SpookyGengar

6

Jelly ,  29 22  17 byte

Charcoal akan mengalahkan + d skor ini ...

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

Tautan monadik yang mengambil dan mengembalikan daftar karakter; atau program lengkap mencetak hasilnya.

Cobalah online!

Bagaimana?

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

Sangat keren! Sejauh ini solusi terpendek, tetapi tidak bekerja dengan input karakter tunggal, dan string yang terdiri dari angka yaitu '123'.
SpookyGengar

Ah saya harus menangani kasus tepi karakter tunggal, ya. Ini berfungsi dengan string digit-karakter, input program benar-benar harus dikutip, seperti 'Hello', "Spooky" "123",, dll. (Python digunakan untuk menginterpretasikan input).
Jonathan Allan

@SpookyGengar - memperbaikinya untuk case 1-karakter.
Jonathan Allan

Pengurangan panjang yang bagus!
Luis Mendo

2
Anda benar tentang Arang.
Neil

3

C, 109 byte

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

Cobalah online!

Trik yang patut diperhatikan:

  • Alih-alih menghabiskan byte strlen, kita cukup mengambil panjang string sekaligus mencetak baris pertama:

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

    Ini berfungsi karena printfmengembalikan jumlah byte yang ditulis.

  • Untuk garis tengah, kita perlu mengulang string tetapi mengecualikan karakter pertama dan terakhir. Ini dicapai dengan kondisi

    1[++s]

    (yang lebih pendek dari (++s)[1]), yang melompati karakter pertama karena ++ada dalam kondisi dan melompati yang terakhir dengan berhenti ketika karakter melewati karakter saat ini '\0'(daripada berhenti di '\0' ).

  • Dalam tubuh loop pertama,

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

    kita mencetak karakter saat ini, kemudian karakter "cermin" yang sesuai (melacak j, yang masuk ke negatif, menghasilkan situasi aneh pengindeksan ke dalam string dengan angka negatif) berlapis panjang idengan spasi (di mana iada dengan nyaman strlen(s) - 1).

  • Pencetakan terbalik pada baris terakhir cukup mudah; satu-satunya trik adalah *s*~i--, yang merupakan cara terpendek untuk mendapatkan i+2iterasi dari loop body (yang tidak bergantung pada i; semua idigunakan adalah untuk menghitung). Bagian funky *s*memastikan loop tidak berjalan jika *sada '\0', yang terjadi pada input panjang-1.


3

Oktaf, 40 byte

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

Cobalah online!

Ini adalah jawaban saya tetapi diposting setelah @Luis MATL menjawab


2
Jawaban yang sangat bagus Btw: kode Anda menabrak cabang pengembangan GNU Octave 4.3.1 (b481a9baeb61) dan sekarang menjadi bagian dari rangkaian uji :-) hg.savannah.gnu.org/hgweb/octave/rev/c94e9509461b
Andy

1
@Andy Terima kasih dan selamat datang di codegolf! Saya senang jika itu dapat membantu meningkatkan proyek Oktaf!
rahnema1

3

Haskell , 84 78 byte

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

Cobalah online! Penggunaan: f "test". Mengembalikan daftar garis.

Sunting: -6 bytes berkat dianne!


1
Anda dapat menyimpan beberapa byte dengan menggunakan pelindung pola sebagai pelindung dan mendefinisikan sinonim untuk reverse; r=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]adalah 78 byte
dianne



2

05AB1E , 17 16 15 19 byte

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

Cobalah online!

Penjelasan

Contoh dengan 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

Perbaikan untuk input 1 huruf cukup mahal.
Saya merasa pendekatan yang berbeda mungkin lebih baik sekarang.



1

Mathematica, 128 byte

(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 byte

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

Versi bonus (122 byte):

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 byte

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

Cobalah online


1

Python 3, 88 byte

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
Selamat datang di PPCG!
Martin Ender

Selamat datang di situs ini juga! Saya percaya itu l+1 andbisa ditulis ulang l+1anduntuk menghemat satu byte.
Wheat Wizard

@Watwizard diedit - terima kasih! Saya terkejut bahwa itu berhasil ...
Lewi

Ini akan berfungsi kecuali untuk kasus 0or, di mana python gagal mengurai karena 0omerupakan awalan oktal.
Wheat Wizard

Ketika saya menjalankan ini, sepertinya tidak mencetak baris paling atas ... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/…
Coty Johnathan Saxman

1

JavaScript (ES8), 108 112 byte

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>

Kurang 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

Terima kasih kepada Justin Mariner karena telah menghemat banyak byte, yang kemudian digunakan untuk menambahkan nol atau cek karakter tunggal yang diperlukan untuk mematuhi tantangan. Anda mendapatkan itu :-(


Anda dapat menyimpan 7 byte dengan membuat baris kedua `+s[i+1].padEnd(s.length-1)+v,s)+`dan menggunakan r.join``.
Justin Mariner

Terima kasih @JustinMariner untuk tips tentang String.prototype.padStartdan menandai literal templat. Saya membutuhkan itu untuk membantu menjaga penambahan panjang cek ke minimum :-)
traktor53

Jarak Anda satu karakter terlalu pendek sekarang; Anda dapat memperbaikinya dan menyimpan lebih banyak pasangan dengan melakukan (n=s.length-1)?(r=<...>+r.join``:sdan menggunakan padEnd(n). Jika panjangnya 1, length-1is 0(false).
Justin Mariner

@JustinMariner spacing sudah diperbaiki, tetapi saya telah melakukan tes panjang - seperti yang saya mengerti, baik string panjang nol dan string dari satu karakter mengembalikan diri mereka sendiri tanpa carriage return atau pengulangan string.
traktor53

1
padEndadalah ES2017.
Neil

1

PHP , 118 byte

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

Cobalah online!

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 byte

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

Dengan ⎕IO←0.

Cobalah online!

Bagaimana?

c←≢⍵ - panjang tali

r←⍳ - jarak

o←∘.⌈⍨ - produk luar dengan minimum

123
223
333

o⌊⌽⊖- meminimalkan dengan sendirinya berbalik 180 o

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

× - kalikan dengan

x←∘....⍨r - produk luar kisaran dengan

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ - bingkai matriks

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

x+ - tambahkan bingkai

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

(' ',⍵)[...] - dapatkan dengan indeks dari string yang disatukan ke luar angkasa


Bisa ⍉⊖⍉⊖menjadi ⌽⊖?
Zacharý

@ Zacharý terima kasih
Uriel

0

JavaScript (ES2017), 87 byte

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

Versi ES6: 93 byte

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

Kurang golf

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>


padEndadalah ES2017.
Neil

@Neil terima kasih, saya akan mengubah pos saya
edc65

Anda dapat menyimpan byte pada versi ES6 Anda dengan menggunakan l+~i, ini menghindari harus mengurangi 1 dua kali sebagai gantinya Anda bisa mengurangi 2 sekali.
Neil

l-~-i
@Neil

Saya sedang memikirkan s=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` tetapi s=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` juga bekerja.
Neil

0

Java, 191 byte

(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)bisa adil s. Loop dengan garis tunggal di dalamnya dapat melepas kawat keritingnya. Anda bisa kembali daripada mencetak jika itu akan menghemat byte. Anda menggunakan int idi kedua loop, saya tidak tahu apakah mereka berada di lingkup yang berbeda tetapi layak ditunjukkan. Menginisialisasi variabel suka bersama biasanya menyimpan byte. 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++));}. Anda tidak perlu trailing semi colon.
TheLethalCoder

Terima kasih telah menunjukkan;) (tidak terlalu terbiasa dengan Golf). Akan Optimalkan nanti!
Serverfrog

0

C # (.NET Core) , 179 161 byte

-18 byte terima kasih kepada TheLethalCoder

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

Cobalah online!

Saya tidak yakin tentang aturan, apakah ini diperlukan untuk menghitung byte atau tidak:

using System.Linq;

Seseorang tolong perbaiki saya tentang ini.

Tidak Disatukan:

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

Halo dan selamat datang di PPCG! Anda menggunakan Linq sehingga Anda harus memasukkan usingjumlah byte Anda. Karena Anda menggunakan Linq ToCharArray()bisa saja ToArray(), apakah Anda benar-benar membutuhkannya sebelumnya Reverse()? Karena Anda menggunakan, StringAnda harus memenuhi syarat sepenuhnya atau memasukkan penggunaan, namun, ini dapat dengan mudah diperbaiki dengan mengubahnya juga string. The ifmungkin lebih pendek sebagai terner seperti s+=l>1?if code:"";. Anda dapat menghapus i++dari loop dan mempostingnya di d[i++].
TheLethalCoder

Inisialisasi idengan lsuka int l=s.Length-1,i=1;. Dan saya pikir itu mungkin saja!
TheLethalCoder

@TheLethalCoder terima kasih! Saya menambahkan saran Anda ke kode. Beberapa catatan: Saya benar-benar lupa bahwa string sebenarnya memiliki IEnumerable; String bukannya string adalah residu Java yang masih saya lawan, ternary sebenarnya persis sama mengejutkannya; dan setelah perubahan Anda, saya mengubah untuk (; expr;) ke while (expr) karena terlihat lebih bagus dan merupakan jumlah byte yang sama. Terima kasih lagi.
Grzegorz Puławski

Jangan khawatir! Terkemuka kadang-kadang tetapi biasanya keluar lebih pendek sehingga selalu layak untuk dicoba.
TheLethalCoder

0

Retina , 106 byte

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

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

Cobalah online! Penjelasan:

..+
$&¶$&

Jika setidaknya ada dua karakter, duplikat input.

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

Membalik duplikat.

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

Ubah string menjadi segitiga. Segitiga atas dimulai dengan input dan menghapus karakter pertama setiap kali, sedangkan segitiga bawah dimulai dengan huruf pertama dari input terbalik dan menambahkan karakter setiap kali.

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

Gabungkan segitiga bersama-sama, tumpang tindih sehingga karakter terakhir membentuk /diagonal.

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

Ubah semua karakter menjadi spasi, jika setidaknya ada satu karakter dari ujung di setiap sisi.

G`.

Hapus semua baris kosong yang tersisa.


0

Python 3, 85 byte

Menggunakan input untuk baris paling atas :)

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

Apakah Anda yakin ini memberikan jawaban yang benar?
Koishore Roy

0

Lua , 104 byte

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

Cobalah online!


tetapi Anda hanya menggunakan psekali ...
Leaky Nun

Benar ... akan mengubahnya.

0

Python 3, 106 byte

Versi fungsional ...

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 byte

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

Anda dapat mencobanya secara online dengan menempelkan yang berikut di Wolfram Cloud Sandbox dan mengklik "evaluasi sel" atau menekan Shift + Enter atau Numpad Enter:

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.