Một khối văn bản


17

Lần trước bạn đã tạo một hình vuông của văn bản , nhưng bây giờ, bạn có thể tạo một khối văn bản không?

Các thách thức

Cho một chuỗi, xuất chuỗi dưới dạng khối.

Bạn có thể giả sử chuỗi sẽ luôn có 2 ký tự trở lên và sẽ chỉ có các ký tự ascii có thể in được.

Cách tạo khối văn bản

kỹ năng mspaint khủng khiếp.png

Các trường hợp thử nghiệm

Input:
Test

Output:
   Test
  e  ss
 s  e e
tseT  T
s  e e
e  ss
Test

Input:
Hello, world!

Output:
            Hello, world!
           e           dd
          l           l l
         l           r  r
        o           o   o
       ,           w    w

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

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

Input:
Hi

Output:
 Hi
iHH
Hi

Tham chiếu thực hiện trong Python

text = raw_input("Enter a string: ")

print " " * (len(text) - 1) + text

spaces = len(text) - 2
_spaces = spaces

for i in range(1, len(text) - 2 + 1):
    print " " * spaces + text[i] + " " * _spaces + text[(i + 1) * -1] + " " * (_spaces - spaces) + text[(i + 1) * -1]
    spaces -= 1

print text[::-1] + " " * _spaces + text[0]

spaces = _spaces - 1

for i in range(1, len(text) - 2 + 1):
    print text[(i + 1) * -1] + " " * _spaces + text[i] + " " * spaces + text[i]
    spaces -= 1

print text

Quy tắc

  • Đây là , vì vậy câu trả lời ngắn nhất trong byte thắng! Tiebreaker được nâng cấp nhất.
  • Sơ hở tiêu chuẩn là không được phép.
  • Trailing newline và trailing space được cho phép.

Được dấu không gian cho phép?
Neil

@Neil Vâng. (15 ký tự)
acrolith

Chỉ tò mò, những gì với các nhân vật bổ sung trong tiêu đề thách thức?
admBorkBork

@TimmyD "Một khối văn bản" dài 14 ký tự, tiêu đề cần dài ít nhất 15 ký tự, vì vậy tôi đã thêm một dấu chấm nhỏ. Tôi nghĩ đó là cái này.
acrolith

À, được rồi Nó hiện lên như một vòng tròn lớn hơn nhiều trong IE trên máy tính của tôi, do đó là câu hỏi của tôi.
admBorkBork

Câu trả lời:



4

Con trăn 2, 228 223 221 203 199 195 189

t=input()
x=" "
l=len(t)-1
q=l-1
f=range(q,0,-1)
print x*l+t
for i in f:print x*i+t[l-i]+x*q+t[i]+x*(q-i)+t[i]
print t[::-1]+x*q+t[0]
for i in f:print t[i]+x*q+t[l-i]+x*(i-1)+t[l-i]
print t

Trăn 3, 192 188 182

t=input()
x=" "
l=len(t)-1
q=l-1
p=print
f=range(q,0,-1)
p(x*l+t)
for i in f:p(x*i+t[l-i]+x*q+t[i]+x*(q-i)+t[i])
p(t[::-1]+x*q+t[0])
for i in f:p(t[i]+x*q+t[l-i]+x*(i-1)+t[l-i])
p(t)

Đó là 203 byte. Ngoài ra, bạn có thể lưu 4 byte bằng cách thay thế raw_input()bằng input().
acrolith

Đúng là bạn, cảm ơn!
Joshua de Haan

x*(q)? Bạn sẽ có thể loại bỏ các parens, có?
Mực giá trị

Bạn nói đúng, ngớ ngẩn với tôi;) Sửa nó ngay bây giờ haha
Joshua de Haan

x*(i-1)->x*~-i
mbomb007

3

mã máy x86 (IA-32), 126 byte

Hexdump:

60 8b f9 57 33 c0 f2 ae 5e 2b fe 4f 87 fa 8d 1c
12 8b c3 48 f6 e3 c6 04 07 00 48 c6 04 07 20 75
f9 8b ea 4d 53 8d 04 2a 50 53 8b c5 f6 e3 8d 44
68 01 50 53 2b c2 8b c8 50 4b 53 55 53 03 c5 50
f7 d3 53 50 53 95 f6 e2 6b c0 04 50 43 53 51 6a
01 4a 52 6a 01 50 6a ff 51 b0 0a 6a 0b 8b dc 59
8b 6c cb fc 88 04 2f 03 2c cb 89 6c cb fc 83 f9
0a 75 01 ac e2 ea 4a 79 e0 83 c4 58 61 c3

Cái này hơi dài, vì vậy để giải thích nó trước tiên tôi sẽ cung cấp mã C:

void doit(const char* s, char out[])
{
    int n = strlen(s);
    int w = 2 * n;
    int h = w - 1;
    int m = n - 1;

    memset(out, ' ', h * w);
    out[h * w] = 0;

    int offset1 = n + m;
    int offset2 = w * m + 2 * m + 1; // 2 * n * n - 1
    int offset3 = offset2 - n; // 2 * n * n - n - 1
    int offset4 = 4 * n * m; // 4 * n * n - 4 * n

    int offsets[] = {
        offset3, -1,
        offset4, 1,
        m, 1,
        offset3, 1 - w,
        offset4, -w,
        offset2 - 1, -w,
        offset2 - 1, w - 1,
        m, w - 1,
        offset3, w,
        offset2, w,
        offset1, w,
    };

    do
    {
        char c = *s++;
        for (int i = 0; i < 11; ++i)
        {
            if (i == 9)
                c = '\n';
            int offset = offsets[i * 2];
            assert(offset > 0 && offset < w * h);
            out[offset] = c;
            offsets[i * 2] += offsets[i * 2 + 1];
        }
    } while (--n);
}

Đây nlà độ dài của chuỗi đầu vào.

Kích thước của khu vực đầu ra là 2n(chiều rộng) theo 2n-1(chiều cao). Đầu tiên, nó lấp đầy mọi thứ bằng khoảng trắng (và thêm một byte null kết thúc). Sau đó, nó di chuyển dọc theo 11 đường thẳng trong khu vực đầu ra và điền chúng bằng văn bản:

  • 2 dòng chứa đầy byte cuối dòng (= 10)
  • 9 dòng chứa đầy các byte liên tiếp của chuỗi đầu vào

Mỗi dòng được đại diện bởi hai số, một bắt đầu bù và một sải chân. Tôi nhét cả hai vào mảng offsets, để truy cập "dễ dàng".

Phần thú vị là điền vào mảng. Có rất ít tầm quan trọng đối với thứ tự của các mục trong mảng; Tôi đã cố gắng sắp xếp lại chúng để giảm thiểu số lượng xung đột đăng ký. Ngoài ra, các công thức bậc hai có một số tự do trong việc lựa chọn cách tính toán; Tôi đã cố gắng giảm thiểu số lượng phép trừ (vì việc bổ sung có thể được thực hiện bằng LEAhướng dẫn linh hoạt ).

Nguồn hội:

    pushad;

    ; // Calculate the length of the input string
    mov edi, ecx;
    push edi;
    xor eax, eax;
    repne scasb;
    pop esi; // esi = input string
    sub edi, esi;
    dec edi;

    ; // Calculate the size of the output area
    xchg edi, edx;  // edx = n
                    // edi = output string
    lea ebx, [edx + edx]; // ebx = w
    mov eax, ebx;
    dec eax; // eax = h
    mul bl; // eax = w * h

    ; // Fill the output string with spaces and zero terminate it
    mov byte ptr [edi + eax], 0;
myfill:
    dec eax;
    mov byte ptr [edi + eax], ' ';
    jnz myfill;

    mov ebp, edx;
    dec ebp; // ebp = m

    ; // Fill the array of offsets
    push ebx; // w
    lea eax, [edx + ebp];
    push eax; // offset1
    push ebx; // w
    mov eax, ebp;
    mul bl;
    lea eax, [eax + 2 * ebp + 1];
    push eax; // offset2
    push ebx; // w
    sub eax, edx;
    mov ecx, eax; // ecx = offset3
    push eax; // offset3
    dec ebx;
    push ebx; // w - 1
    push ebp; // m
    push ebx; // w - 1
    add eax, ebp;
    push eax; // offset2 - 1
    not ebx;
    push ebx; // -w
    push eax; // offset2 - 1
    push ebx; // -w
    xchg eax, ebp; // eax = m
    mul dl;
    imul eax, eax, 4;
    push eax; // offset4
    inc ebx;
    push ebx; // 1 - w
    push ecx; // offset3
    push 1;
    dec edx; // edx = n - 1
    push edx;
    push 1;
    push eax;
    push -1;
    push ecx;

    ; // Use the array of offsets to write stuff to output
myout:
    mov al, '\n';
    push 11;
    mov ebx, esp;
    pop ecx;
myloop:
    mov ebp, [ebx + ecx * 8 - 4];
    mov [edi + ebp], al;
    add ebp, [ebx + ecx * 8];
    mov [ebx + ecx * 8 - 4], ebp;
    cmp ecx, 10;
    jne skip_read;
    lodsb;
skip_read:
    loop myloop;
    dec edx;
    jns myout;

    add esp, 11 * 8;

    popad;
    ret;

Tôi đã sử dụng phép nhân byte ở đây, giới hạn độ dài của chuỗi đầu vào là 127. Điều này tránh làm tắc nghẽn thanh ghi edx- sản phẩm được tính axthay thế.

Một trục trặc nhỏ: khi điền vào mảng, độ dài của chuỗi bị giảm đi 1. Vì vậy, tôi đã điều chỉnh điều kiện thoát vòng lặp:

    jns myout

Nó đếm ngược đến -1.


3

Ruby, 148 144 byte

+1 byte từ ncờ. Hiển thị dòng mới thay vì dấu chấm phẩy cho khả năng đọc (cùng chức năng).

S=" "
X=S*s=$_.size-2
puts X+S+I=$_,(r=1..s).map{|i|c=I[~i];S*(s-i+1)+I[i]+X+c+S*~-i+c},I.reverse+X+I[0],r.map{|i|c=I[i];I[~i]+X+c+S*(s-i)+c},I

Chạy như vậy. Đầu vào là một dòng của STDIN, không có dòng mới, vì vậy nó có thể cần phải được dẫn từ tệp.

ruby -ne 'S=" ";X=S*s=$_.size-2;puts X+S+I=$_,(r=1..s).map{|i|c=I[~i];S*(s-i+1)+I[i]+X+c+S*~-i+c},I.reverse+X+I[0],r.map{|i|c=I[i];I[~i]+X+c+S*(s-i)+c},I'

1

Javascript, 225 198 byte

Đã lưu 27 byte nhờ @Neil

f=(s,l=s.length-2,d=' ',r='repeat',t=d[r](l))=>[d+t+s,...a=[...Array(l)].map((_,i)=>d[r](l-i)+s[i+1]+t+(p=s[l-i])+d[r](i)+p),[...s].reverse().join``+t+s[0],...a.map(v=>v.trim()).reverse(),s].join`
`
  • [...] Thay vì .concat
  • [...] + bản đồ thay vì cho vòng lặp
  • chỉ một câu lệnh bằng cách di chuyển các biến làm tham số hàm
  • khởi tạo tốt hơn cho lt

Câu trả lời gốc:

f=s=>{l=s.length,d=' ',r='repeat',a=[],t=d[r](l-2)+s;for(i=1;i++<l-1;)a.push(d[r](l-i)+s[i-1]+d[r](l-2)+(p=s[l-i])+d[r](i-2)+p);console.log(d+[t].concat(a,[...t].reverse().join``+s[0],a.map(v=>v.trim()).reverse(),s).join`
`)}

1
Đẹp, mặc dù có thể chơi được: (s,l=s.length-2,d=' ',r='repeat',t=d[r](l))=>[d+t+s,...a=[...Array(l)].map((_,i)=>d[r](l-i)+s[i+1]+t+(p=s[l-i])+d[r](i)+p),[...s].reverse().join``+t+s[0],...a.map(v=>v.trim()).reverse(),s].join`\n`(sử dụng \nvì bạn không thể đưa dòng mới vào nhận xét).
Neil

0

Java 7, 283 byte

void a(String s){int h=s.length(),n=h*2-1,t=n-h,u=n-1;char[][]c=new char[n][n];for(int i=0;i<h;i++){c[0][t+i]=c[i][t-i]=c[t][t-i]=c[t+i][t]=c[t+i][u-i]=c[t-i][t+i]=c[t-i][u]=c[u][i]=c[u-i][0]=s.charAt(i);}for(int y=0;y<n;y++){System.out.println(new String(c[y]).replace('\0',' '));}}

Hãy thử nó ở đây!

Ung dung:

void a(String s) {
    int length=s.length(),
        n=length*2-1,
        mid=n-length,
        doubleMid=n-1;
    char[][]c=new char[n][n];
    for(int i=0;i<length;i++) {
        c[0][mid+i]= 
        c[i][mid-i]=
        c[mid][mid-i]=
        c[mid+i][mid]=
        c[mid+i][doubleMid-i]=
        c[mid-i][mid+i]=
        c[mid-i][doubleMid]=
        c[doubleMid][i]=
        c[doubleMid-i][0]=s.charAt(i);
    }
    for(int y=0;y<n;y++){
        System.out.println(new String(c[y]).replace('\0',' '));
    }
}
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.