Hình chữ nhật của văn bản


13

Chương trình của bạn nhận được một văn bản làm đầu vào, dài ít nhất 8 ký tự và luôn bao gồm số lượng ký tự chẵn. (không cần đánh giá tính đúng đắn của đầu vào).

Mục tiêu của bạn là hiển thị văn bản đó dưới dạng hình chữ nhật. Ví dụ, được đưa ra HelloWorldlàm đầu vào, hiển thị

Hell
d  o
lroW

Quy tắc:

  • Văn bản đi xung quanh theo chiều kim đồng hồ (vị trí bắt đầu như bạn muốn)
  • Nó sẽ tạo thành một hình chữ nhật khép kín, rộng 1 ký tự.
  • Hình chữ nhật sẽ phải bao gồm hầu hết các khu vực bên trong. (chỉ để loại trừ câu trả lời tầm thường của việc hiển thị văn bản trong hai dòng)
  • Không có ký tự nào khác được in ngoài chính văn bản và khoảng trắng đệm cần thiết và nguồn cấp dữ liệu.

Như golf-code, mã ngắn nhất sẽ thắng.

Người chiến thắng được chọn không sớm hơn 10 ngày sau câu trả lời hợp lệ đầu tiên.

Câu trả lời:


5

GolfScript, 56 53 40 38 ký tự

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

Bạn có thể kiểm tra kịch bản trực tuyến .


7

Nhị phân PostScript 50, 113 ASCII

Điều này sử dụng đầu ra đồ họa. Hexdump của chương trình sử dụng mã thông báo nhị phân:

$ 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

Tải về để dùng thử . Sử dụng Ghostscript, văn bản được hiển thị có thể được chuyển đến chương trình như sau:

gs -st=helloworld textRect_binary.ps 

Đầu ra đồ họa trông như thế này:

kết xuất đầu ra

Mã tương tự sử dụng mã thông báo ASCII trông như thế này:

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

Chiến lược là sử dụng xyshowđể xác định nơi chúng ta di chuyển sau khi hiển thị từng nhân vật trước khi hiển thị nhân vật tiếp theo. Chúng ta đang bắt đầu ở góc dưới bên trái, di chuyển theo chiều kim đồng hồ, tức là đầu tiên lên, sau đó phải, sau đó xuống bên trái. Chúng tôi luôn di chuyển 9 đơn vị, vì vậy trước tiên chúng tôi có một chuyển động tương đối 0 9, sau đó 9 0, sau đó 0 -9, sau đó -9 0. Chúng ta có thể nhận được từ một cặp số này đến số tiếp theo với chuỗi exch neg.

Chúng ta cần xây dựng một mảng để xyshowchứa các cặp số này, một cặp cho mỗi ký tự. Điều này có nghĩa, nếu chúng ta có helloworldchuỗi ví dụ, có 10 ký tự, chúng ta muốn tăng hai lần, sau đó ba lần phải, sau đó xuống hai lần và ba lần trái. Chúng ta có được các giá trị này (hai và ba) bằng cách chia độ dài chuỗi cho 8, một lần làm tròn xuống sàn, một lần lên trần.

Vì vậy, chúng tôi sao chép 0 9hai lần, sau đó chuyển sang tọa độ x / y tương đối bằng cách sử dụng exch neg, sao chép ba lần đó, v.v.

Mã nhận xét này cho thấy những gì xảy ra trên ngăn xếp:

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

+1 bajeezus thánh. Tôi thực sự thiếu kiến ​​thức từ cấp 2 trở lên.
kẻ lừa đảo người lái xe

Ý bạn là xyshowsao? Rất vui được giới thiệu với bạn về điều này - một thời gian trước bạn đã giới thiệu cho tôi kshow, điều mà tôi không thực sự biết đến ;-).
Thomas W.

Tài khoản bởi vì mã Ruby có thể được đánh gôn hơn nữa). Bạn có bất cứ ý tưởng để tối ưu hóa hơn nữa?
Thomas W.

@ThomasW. Bây giờ mục nhập GolfScript của tôi ngắn hơn 24% so với nhị phân của bạn ;-) Và tôi vẫn nghĩ rằng vẫn còn cơ hội để rút ngắn nó hơn nữa bằng một hoặc hai ký tự.
Howard

@Howard: Argh !!! Bất cứ ai cũng có thể đánh bại GolfScript?
Thomas W.

7

Ruby 112 100

Tôi mới biết về Ruby và đây là môn đánh gôn đầu tiên của tôi. Tôi đã dựa trên việc thực hiện perl của memowe và cố gắng tạo ra một phiên bản Ruby của nó. Đây là 112 100 ký tự và giả sử bạn gán một chuỗi cho x. Mong được gặp người khác.

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

Chỉnh sửa để thực hiện các đề xuất. Tôi nghĩ bây giờ là 100 ký tự. Cảm ơn các bạn!


Đẹp! Bạn có thể lưu hai ký tự trong dòng thứ 5 (loại bỏ khoảng trắng).
Thomas W.

Tôi thích nó. Cảm ơn. Có vẻ tốt là các chuỗi Ruby có thể được truy cập như một mảng, tôi phải tự xây dựng một chuỗi. :)
memowe

Bạn có thể thay thế x.lengthbằng x.size(Lưu 2 ký tự)
knut

1
Và thêm 8 sử dụng puts x[0..w=l/2-h=l/4].
Howard

5

Perl (124 118 109 + 3 = 112)

Điều này trước đây là khá đơn giản. Đếm tất cả các tùy chọn dòng lệnh là 1 ký tự mỗi.

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

Thí dụ:

$ 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

Điều này có thể được nén: (1) (@s-$h*2)/2 == @s/2-$h(2) $wcó thể được biểu diễn dưới dạng $w=(@s=split//)/2-($h=int@s/4);, do đó lưu hai dấu chấm phẩy
amon

Cập nhật mã.
memowe

Công cụ thú vị khác: (1) không gian là giá trị mặc định của phép nội suy mảng var $"siêusaves 1 char. (2) $w+$h == @s/2Khuynh hướng 1 char. (3) Nếu $wnhỏ hơn một, chúng ta có thể đơn giản hóa $"x($w-1). Đối với điều này, $_phải được tăng thêm 1. Lưu như 3 ký tự. (4) Dấu chấm phẩy cuối cùng là überflüssig, tiết kiệm 1 char. Điều này dẫn đến đoạn mã say@s[0..$w--];say$s[1-$_].$"x$w.$s[$w+$_]for+2..$h;say+reverse@s[@s/2..@s-$h](với một số ít +cho vui, do đó không còn một khoảng trống nào).
amon

Chơi golf tuyệt vời, @amon, bạn sẽ chỉnh sửa nó trong bài viết của tôi chứ? Bằng cách đó, thế giới có thể thấy ai đã làm điều đó. :)
memowe

5

Brainfuck - 194 187

+>,[>+[>+<-],]
>-->++<[->-[>+>>]>[+[-<+>]>+>>]<<<<<]>[-]>[-]>[<<+<<+>>>>-]<<<<
[[<]>+[>]<-]<[<]>-
[>.[-]<[>+<-]>-]>[>]
++++++++++.<.[-]
>[>+++>>+<<<-]>++>--[<.>-]<<<<[<]>.[-]>[>]>>>>.
<<<<<[.<]

Cố gắng tốt, nhưng nó không hoạt động. Điểm mấu chốt là sai hướng, trái với quy tắc 1 và nó chỉ có chiều cao cố định, trái với quy tắc 3.
vsz

Không chắc chắn tại sao tôi lật hàng cuối cùng. Tôi hoàn toàn có nó trong tâm trí đúng cách khi tôi viết nó. Việc sửa chữa thực sự lưu 7 lệnh. Tôi đã xử lý các vấn đề về chiều cao cố định, nhưng nó không phải là trường hợp 2 dòng tầm thường mà bạn đã nói. Có lẽ tôi sẽ làm cho nó tốt hơn trong tương lai.
captncraig

4

Toán học 156 199 344

Chỉnh sửa : Đây là một bản viết lại chính của mã trước đó. Nó hoạt động về cơ bản giống nhau, nhưng bây giờ lấy đầu vào là một chuỗi có độ dài <120 ký tự và tự động kích thước hình vuông.

Nó vẫn có thể được chơi gôn một chút nhưng sẽ không giảm kích thước của các phiên bản trước đó và 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])

Ví dụ

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


Này, một chuỗi các chuỗi? Đó thực sự là bẻ cong các quy tắc, phải không?
Thomas W.

@ThomasW. Các ý kiến ​​trong câu trả lời cho thấy nó không phải là một giải pháp cuối cùng.
kojiro

Ah tôi thấy! Tự hỏi liệu tôi có nên thực hiện thử thách và thử điều gì đó tương tự trong PostScript không ...
Thomas W.

Tôi thích nó trông như thế nào bây giờ!
Thomas W.

@Thomas W. Cảm ơn. Để định dạng trông phù hợp với nhiều độ dài chuỗi tốn rất nhiều byte.
DavidC

2

Perl + Regexes: 104 (101 + 3)

(đếm mã + công tắc)

Đây là một giải pháp sử dụng Regexes đẹp và một chút 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'

Điều này sẽ chỉ hoạt động chính xác trên một dòng đầu vào.

Lấy cảm hứng từ memowe, nhưng về cơ bản không có mảng nào.


Xin lỗi cho câu hỏi ngớ ngẩn: Làm thế nào tôi có thể thử nó? Tôi đang dán mã của bạn vào dòng lệnh, sau đó nhập một cái gì đó, nhấn enter và một cái gì đó đi ra. Nhưng nó không phải là một cái hộp. Tôi đang làm gì sai?
Thomas W.

@ThomasW. Nó dường như làm việc cho tôi, cho một số chars tùy ý. Đoạn mã trên được đảm bảo hoạt động theo bash và perl phiên bản 5.12+. Đầu vào được chấp nhận thông qua STDIN và chỉ dòng đầu tiên được xử lý chính xác. Tôi không biết cách trích dẫn mã chính xác cho cmd.exe.
amon

1
Ah, có lẽ là sai lầm của tôi. Tôi có thể sử dụng một chuỗi có độ dài lẻ. Điều này hoạt động: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)

Điều này được lấy cảm hứng từ giải pháp Mathicala của anh chàng .

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

Với Ghostscript gọi như thế này

gs -st=hello! boxtext.ps

Nó tạo ra sản lượng như thế nào.

Xin chào_Code_Golf_World!

Tháng một tháng hai tháng Ba Tháng Tư Tháng Năm Tháng Sáu Tháng Bảy

Nó sử dụng kshowđể hiển thị glyphs từng cái một. Sau khi đủ glyphs cho một bên đã được hiển thị, mọi thứ được xoay -90 độ trước khi tiếp tục với glyphs còn lại.

Để biết khi nào đủ glyphs được hiển thị ở bên cạnh, chúng tôi tăng một bộ đếm lên 4 mỗi lần glyph được hiển thị. Nếu giá trị bộ đếm modulo, độ dài chuỗi nhỏ hơn 4, thì chúng ta biết rằng chúng ta phải xoay:

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

nhập mô tả hình ảnh ở đây

Mã nguồn được bình luận và không được đánh gôn:

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

1

Python 2.x: 137

Tôi mới chơi golf và khá chắc chắn rằng điều này có thể được cải thiện

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]

Mã kiểm tra trực quan:

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

Một cái gì đó quan tâm: Giải pháp này phụ thuộc vào toán học số nguyên. Nếu bạn chỉ làm toán một cách tượng trưng, ​​bạn sẽ thấy điều đó h=(c-w-w)/2 => h=w-2, nhưng nếu bạn thay thế kết quả đó thì mọi kết quả khác sẽ thiếu hai ký tự bên trái.


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

1

Scala (135)

Đoạn mã sau giả định xcó chứa chuỗi cần định dạng và nên được dán trong 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)

Nếu bạn chưa cài đặt scala, bạn có thể nhanh chóng kiểm tra bằng trình thông dịch Scala trực tuyến này: http://www.simplyscala.com/ . Chỉ cần dán đoạn văn bản sau đây nhấn đánh giá:

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)

1

Con trăn 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])

Kiểm tra

đầu vào:

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

đầu ra:

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

0

PHP (149)

Văn bản cần in phải ở trong một biến có tên $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);

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]

Chỉnh sửa: Nó dường như vi phạm quy tắc bao gồm diện tích tối đa bên trong.


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

Lưu ý: - Đầu vào được lấy từ dòng lệnh

Đầu vào: - HelloWorld

Đầu ra: -

Hell
d  o
lroW

Đầu vào: - abcdefghijklmnopqrstuvwxyz

Đầu ra: -

abcdefghijkl
z          m
yxwvutsrqpon

Xin vui lòng đọc các quy tắc cẩn thận hơn, đặc biệt là nr. 3.
vsz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.