Kotak teks

13

Program Anda mendapatkan teks sebagai input, setidaknya 8 karakter, dan selalu terdiri dari jumlah genap. (tidak perlu mengevaluasi kebenaran input).

Tujuan Anda adalah untuk menampilkan teks itu sebagai persegi panjang. Misalnya, diberikan HelloWorldsebagai input, tampilan

Hell
d  o
lroW

Aturan:

  • Teks berputar searah jarum jam (posisi awal sesuka Anda)
  • Ini akan membentuk persegi panjang tertutup, lebar sisi 1 karakter.
  • Persegi panjang harus mencakup sebagian besar area di dalam. (hanya untuk mengesampingkan jawaban sepele dari menampilkan teks dalam dua baris)
  • Tidak ada karakter lain yang dicetak selain teks itu sendiri dan ruang bantalan yang diperlukan dan umpan baris.

Sebagai kode-golf, kode terpendek menang.

Pemenang dipilih tidak lebih cepat dari 10 hari setelah jawaban pertama yang valid.

vsz
sumber

Jawaban:

5

GolfScript, 56 53 40 38 karakter

1/..,4/):l<n@l>{)" "l*2>@(n@.,l-}do-1%

Anda dapat menguji skrip secara online .

Howard
sumber
7

Biner PostScript 50, 113 ASCII

Ini menggunakan output grafis. Hexdump program menggunakan token biner:

$ hexdump -C textRect_binary.ps 
00000000  74 5b 30 20 39 5b 74 92  62 34 92 36 92 38 92 10  |t[0 9[t.b4.6.8..|
00000010  32 92 19 5d 7b 92 2c 7b  32 92 19 7d 92 83 92 3e  |2..]{.,{2..}...>|
00000020  92 6e 7d 92 49 5d 39 20  39 92 6b 91 c7 39 92 8e  |.n}.I]9 9.k..9..|
00000030  92 c3                                             |..|
00000032

Unduh untuk mencobanya . Menggunakan Ghostscript, teks yang akan di-render dapat dikirimkan ke program sebagai berikut:

gs -st=helloworld textRect_binary.ps 

Output grafis terlihat seperti ini:

hasil yang diberikan

Kode yang sama menggunakan token ASCII terlihat seperti ini:

t[0 9[t length
4 div dup
ceiling
2 copy]{cvi{2 copy}repeat
exch neg}forall]9 9 moveto/Courier 9 selectfont
xyshow

Strategi ini digunakan xyshowuntuk menentukan di mana kita bergerak setelah menunjukkan setiap karakter sebelum menunjukkan karakter berikutnya. Kita mulai di sudut kiri bawah, bergerak searah jarum jam, yaitu pertama ke atas, lalu ke kanan, lalu ke bawah lalu ke kiri. Kami selalu memindahkan 9 unit, jadi pertama-tama kami memiliki gerakan relatif 0 9, lalu 9 0, lalu 0 -9, kemudian -9 0. Kita bisa mendapatkan dari sepasang angka-angka ini ke yang berikutnya dengan urutan exch neg.

Kita perlu membangun array untuk xyshowyang menyimpan pasangan angka ini, satu pasangan untuk setiap karakter. Ini berarti, jika kita memiliki helloworldstring sebagai contoh, yang memiliki 10 karakter, kita ingin naik dua kali, lalu ke kanan tiga kali, lalu ke bawah dua kali dan ke kiri tiga kali. Kami mendapatkan nilai-nilai ini (dua dan tiga) dengan membagi panjang string dengan 8, sekali membulatkan ke lantai, satu ke langit-langit.

Jadi, kami menyalin 0 9dua kali, lalu beralih ke koordinat x / y relatif menggunakan exch neg, salin tiga kali dan seterusnya.

Kode yang dikomentari ini menunjukkan apa yang terjadi pada stack:

t[0 9                % t [ 0 9
[t length            % t [ 0 9 [ length
4 div dup            % t [ 0 9 [ length/4 length/4
ceiling              % t [ 0 9 [ length/4=height width
2 copy]              % t [ 0 9 [height width height width]
{%forall             % t [ 0 9 ... x y height_or_width
  cvi                % t [ 0 9 ... x y height_or_width_integer
  {2 copy}           % t [ 0 9 ... x y height_or_width_integer {2 copy}
  repeat             % t [ 0 9 ... x y .. x y
  exch neg           % t [ 0 9 ... x y .. y -x
}forall]             % t [0 9 ... -9 0]
9 9 moveto/Courier 9 selectfont
xyshow
Thomas W.
sumber
+1 bajeezus suci. Saya benar-benar kurang dalam pengetahuan saya tentang level-2 dan seterusnya.
luser droog
Maksudmu xyshow? Senang memperkenalkan Anda dengan yang satu ini - beberapa waktu lalu Anda memperkenalkan saya kshow, yang saya tidak benar-benar sadari ;-).
Thomas W.
@luserdroog: BTW: Saya cukup bangga bahwa entri GolfScript saat ini memiliki karakter lebih dari 10% lebih banyak daripada entri biner saya, tetapi saya merasa bahwa versi ASCII saya adalah satu karakter dari undian dengan Ruby (sebenarnya, bahkan tiga, karena kode Ruby dapat di-golf lebih lanjut). Apakah Anda punya ide untuk pengoptimalan lebih lanjut?
Thomas W.
@ Thomas. Sekarang entri GolfScript saya 24% lebih pendek dari biner Anda ;-) Dan saya masih berpikir masih ada kesempatan untuk mempersingkat lebih jauh dengan satu atau dua karakter.
Howard
@ Howard: Argh !!! Adakah yang bisa mengalahkan GolfScript?
Thomas W.
7

Ruby 112 100

Saya baru di Ruby dan ini adalah kode golf pertama saya. Saya memanfaatkan implementasi perl memowe dan mencoba membuat versi Ruby dari itu. Ini adalah 112 karakter 100 dan menganggap Anda menetapkan string ke x. Looking forward untuk melihat orang lain.

l=x.size
puts x[0..w=l/2-h=l/4]
1.upto(h-1){|i|puts x[-i]+' '*(w-1)+x[w+i]}
puts x[w+h..l-h].reverse

Diedit untuk mengimplementasikan saran. Saya pikir ini 100 karakter sekarang. Terima kasih teman-teman!

jzig
sumber
Bagus! Anda dapat menyimpan dua karakter di baris ke-5 (menghapus spasi).
Thomas W.
Saya suka itu. Terima kasih. Terlihat bagus bahwa string Ruby dapat diakses seperti array, saya harus membuatnya sendiri. :)
memowe
Anda dapat mengganti x.lengthdengan x.size(Menghemat 2 karakter)
knut
1
Dan 8 lagi menggunakan puts x[0..w=l/2-h=l/4].
Howard
5

Perl (124 118 109 + 3 = 112)

Ini sebelumnya sangat mudah. Hitung semua opsi baris perintah masing-masing 1 karakter.

-nlE
$w=(@s=split//)/2-($h=int@s/4);say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]

Contoh:

$ perl -nlE '$w=(@s=split//)/2-($h=int@s/4);say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h]'
abcdefghijklmnopqrstuvwxyz
abcdefgh
z      i
y      j
x      k
w      l
v      m
utsrqpon
memowe
sumber
Ini dapat dipadatkan: (1) (@s-$h*2)/2 == @s/2-$h(2) $wdapat direpresentasikan sebagai $w=(@s=split//)/2-($h=int@s/4);, sehingga menghemat dua titik koma
am
Diperbarui kodenya.
memowe
Hal menarik selanjutnya: (1) spasi adalah nilai default dari array interpolasi var $"–save 1 char. (2) $w+$h == @s/2–save 1 char. (3) Jika $wlebih kecil satu, kita dapat menyederhanakan $"x($w-1). Untuk ini, $_harus ditingkatkan 1. Menghemat seperti 3 karakter. (4) Titik koma terakhir adalah überflüssig, save 1 char. Ini mengarah ke fragmen kode say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h](dengan beberapa +untuk bersenang-senang, jadi tidak ada ruang tersisa).
Amon
Golfifikasi luar biasa, @amon, maukah Anda mengeditnya di postingan saya? Dengan begitu dunia dapat melihat siapa yang melakukannya. :)
memowe
5

Brainfuck - 194 187

+>,[>+[>+<-],]
>-->++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>[-]>[<<+<<+>>>>-]<<<<
[[<]>+[>]<-]<[<]>-
[>.[-]<[>+<-]>-]>[>]
++++++++++.<.[-]
>[>+++>>+<<<-]>++>--[<.>-]<<<<[<]>.[-]>[>]>>>>.
<<<<<[.<]
captncraig
sumber
Usaha yang bagus, tetapi tidak berhasil. Intinya adalah ke arah yang salah, bertentangan dengan aturan 1, dan hanya memiliki ketinggian tetap, bertentangan dengan aturan 3.
vsz
Tidak yakin mengapa saya membalik baris terakhir. Saya benar-benar mengingatnya dengan cara yang benar ketika saya menulisnya. Perbaikan sebenarnya menyimpan 7 perintah. Saya melakukan copot pada hal ketinggian tetap, tapi itu bukan kasus 2 baris sepele yang Anda bicarakan. Mungkin saya akan membuatnya lebih baik di masa depan.
captncraig
4

Mathematica 156 199 344

Sunting : Ini adalah penulisan ulang utama dari kode sebelumnya. Ini pada dasarnya bekerja sama, tetapi sekarang mengambil input dengan panjang <120 karakter dan secara otomatis ukuran persegi.

Itu masih bisa dip Golf sedikit tetapi tidak akan turun ke ukuran versi sebelumnya, dan buggier.

f@s_ := ({a, t, w, q} = {Automatic, Text, Quotient[StringLength@s, 2],
 Quotient[StringLength[s], 4] + 1};z = StringSplit[StringInsert[s <> ConstantArray[" ", 0],
 "*", {q, 2 q, 3 q}], "*"];
Graphics[{t[z[[1]], {0, q}],t[z[[2]], {q, 0}, a, {0, -1}],t[z[[3]], {0, -q}, a, {-1, 0}],
t[z[[4]], {-q, 0}, a, {0, 1}]},ImageSize -> 500,BaseStyle -> {FontFamily -> "Courier", 21},
PlotRange -> 34,ImagePadding -> 22])

Contohnya

f["Hello Code Golf World!"]
f["January, February, March,April, May, June, July"]
f["This text is normal, this goes downwards,this is upside-down, and this is upwards"]

pic1

pic2

pic3

DavidC
sumber
Hei, serangkaian string? Itu benar-benar membengkokkan aturan, bukan?
Thomas W.
@ Thomas. Komentar dalam jawaban menunjukkan itu bukan solusi akhir.
kojiro
Ah, begitu! Bertanya-tanya apakah saya harus mengambil tantangan dan mencoba sesuatu yang serupa di PostScript ...
Thomas W.
Saya suka tampilannya sekarang!
Thomas W.
@ Thomas W. Terima kasih. Mendapatkan format agar terlihat benar untuk berbagai panjang string membutuhkan banyak byte.
DavidC
2

Perl + Regexes: 104 (101 + 3)

(menghitung kode + sakelar)

Ini adalah solusi menggunakan Regex yang bagus, dan sedikit Perl:

perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'

Ini hanya akan beroperasi dengan benar pada satu jalur input.

Terinspirasi oleh memowe, tetapi pada dasarnya tanpa array.

amon
sumber
Maaf untuk pertanyaan bodoh: Bagaimana saya bisa mencoba ini? Saya menempelkan kode Anda ke baris perintah, lalu ketik sesuatu, tekan enter dan sesuatu keluar. Tapi itu bukan sebuah kotak. Apa yang saya lakukan salah?
Thomas W.
@ Thomas. Tampaknya bekerja untuk saya, untuk sejumlah karakter yang sewenang-wenang. Kode di atas dijamin untuk bekerja di bawah bash dan perl versi 5.12+. Input diterima melalui STDIN, dan hanya baris pertama yang diproses dengan benar. Saya tidak tahu bagaimana cara mengutip kode dengan benar untuk cmd.exe.
Amon
1
Ah, mungkin itu kesalahanku. Saya mungkin menggunakan string yang panjangnya aneh. Ini bekerja:echo thisworksgreat | perl -plE'$w=($l=length)/2-($h=int$l/4);s/..{$w}\K.*/"\n".reverse$&/e;$"x=--$w;s/.\K(.*)(.)$/$"$2\n$1/while--$h'
Thomas W.
2

PostScript (106)

Ini terinspirasi oleh solusi Mathematica dude .

0{= =
4 add dup
t length mod 4
lt{-90 rotate}if}0[0 3 -3 0 9 9]concat
0 moveto/Courier 5 selectfont
t kshow

Dengan Ghostscript panggil seperti ini

gs -st=hello! boxtext.ps

Ini menghasilkan output seperti.

Hello_Code_Golf_World!

Januari Februari Maret April Mei Juni Juli

Ini digunakan kshowuntuk menunjukkan mesin terbang satu per satu. Setelah cukup mesin terbang untuk satu sisi telah ditunjukkan, semuanya diputar oleh -90 derajat sebelum melanjutkan dengan mesin terbang yang tersisa.

Untuk mengetahui kapan cukup mesin terbang telah ditampilkan di samping, kami menambah penghitung dengan 4 setiap kali mesin terbang ditampilkan. Jika nilai counter modulo panjang string kurang dari 4, maka kita tahu kita harus memutar:

char  counter  mod 6  compared to 4
 h       4       4          =
 e       8       2          <   => rotate
 l      12       0          <   => rotate
 l      16       4          =
 o      20       2          <   => rotate
 !      24       0          <   => rotate

masukkan deskripsi gambar di sini

Kode sumber yang dikomentari dan dicabut:

0                      % n
{%kshow                % n char1 char2
  = =                  % n
  4 add dup            % n' n'
  t length mod         % n' (n' mod t_length)
  4 lt                 % n' bool
  {-90 rotate}if       % n'
}                      % n kshowProc
% First 0 for moveto. We add it here to take 
% advantage of the surrounding self delimiting tokens.
0                      % n kshowProc 0
% We change the graphics state so that the drawn
% text is at a nice size and not off screen.
[0 3 -3 0 9 9]concat   % n kshowProc 0
0                      % n kshowProc 0 0
moveto                 % n kshowProc
/Courier 5 selectfont  % n kshowProc
t                      % n kshowProc text
kshow                  % n
Thomas W.
sumber
1

Python 2.x: 137

Saya baru mengenal kode golf dan cukup yakin ini dapat ditingkatkan ...

def s(t):c=len(t);w=1+c/4;h=(c-w-w)/2;u=w+h;n='\n';print t[:w]+n+n.join(map(((w-2)*' ').join,zip(t[:w+u-1:-1],t[w:u])))+n+t[w+u-1:u-1:-1]

Kode pengujian visual:

from itertools import chain
from string import letters
for i in range(8,101,2):
    t = ''.join(chain(letters))[:i]
    print '%d: %s' % (i, t)
    s(t)
    print '-----'

Sesuatu yang menarik: Solusi ini tergantung pada matematika bilangan bulat. Jika Anda hanya melakukan perhitungan secara simbolis, Anda akan menemukannya h=(c-w-w)/2 => h=w-2, tetapi jika Anda mengganti hasilnya, setiap hasil lainnya akan kehilangan dua karakter kiri bawah.

kojiro
sumber
1

K, 84

{-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}

.

k){-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}"HelloWorld"
Hell
d  o
lroW

k){-1'(*r;((|r 3),\:(w-2)#" "),'r 1;|(r:(0,+\(w;h;w;h:_(l-2*w:-_-(1+(l:#x)%4))%2))_x)2);}"Hellooooooooooooooo Worlddddd!"
Hellooooo
!       o
d       o
d       o
d       o
d       o
d       o
lroW oooo
tmartin
sumber
1

Scala (135)

Cuplikan berikut ini mengasumsikan yang xberisi string ke format, dan harus disisipkan dalam scala REPL:

val (h,w)=((x.size+3)/4,println(_:Any));val s=x.grouped(h)toSeq;w(s(0));for((l,r)<-s(1)zip(s(3)reverse))w(r+" "*(h-2)+l);w(s(2)reverse)

Jika Anda belum menginstal scala, Anda dapat dengan cepat memeriksanya menggunakan juru bahasa Scala online ini: http://www.simplyscala.com/ . Cukup tempel evaluasi akhiran teks berikut:

val x="HelloWorld"
val (h,w)=((x.size+3)/4,println(_:Any));val s=x.grouped(h)toSeq;w(s(0));for((l,r)<-s(1)zip(s(3)reverse))w(r+" "*(h-2)+l);w(s(2)reverse)
Régis Jean-Gilles
sumber
1

Python 3 (120)

s=input()
n=len(s)
h=n//4
q=(n+2)//4-1
p=print
p(s[:q+2])
for i in range(1,h):p(s[n-i]+' '*q+s[q+1+i])
p(s[n-h:q+h:-1])

Uji

memasukkan:

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

keluaran:

abcdefghijklmn
z            o
y            p
x            q
w            r
v            s
u            t
t            u
s            v
r            w
q            x
p            y
o            z
nmlkjihgfedcba
sinar
sumber
0

PHP (149)

Teks yang akan dicetak harus dalam variabel bernama $x.

@$s=substr;echo$s($x,-$w=($l=strlen($x)/2)-$h=$i=$l-2>>1).'
';while($i--)echo$x[$l+$i].str_repeat(' ',$w-2).$x[$h-$i-1].'
';echo$s(strrev($x),$l,$w);
Jonathan
sumber
0

Python2.7 (99)

t=''.join(raw_input().split())
u=len(t)/2-1
print t[:u]+"\n"+t[-1]+" "*(u-2)+t[u]+"\n"+t[-2:u:-1]

Sunting: Tampaknya melanggar aturan mencakup area maksimum di dalam.

sidi
sumber
0

JAVA - 320

public class A{
public static void main(String[] a){
String s=a[0];
int l=s.length(),h=l/2,f=h-1,i=0;       
for(i=0;i<f;i++)
System.out.print(s.charAt(i));
System.out.print("\n"+s.charAt(l-1));
for(i=0;i<f-2;i++)
System.out.print(" ");
System.out.println(s.charAt(h-1));
for(i=l-2;i>h-1;i--)
System.out.print(s.charAt(i));}}

Catatan : - Input diambil dari baris perintah

Input: - HelloWorld

Output: -

Hell
d  o
lroW

Input: - abcdefghijklmnopqrstuvwxyz

Output: -

abcdefghijkl
z          m
yxwvutsrqpon
Vivekanand SV
sumber
Silakan baca aturan lebih hati-hati, terutama no. 3.
vsz