Làm cho tôi một người quản lý cửa sổ!


14

Tôi ghét sự phình to mã!

Vì vậy, tôi đã quyết định thay thế hệ thống Windows 7 của mình bằng một phiên bản golf. Tuy nhiên, tôi biết rằng nó không dễ dàng, vì vậy trước tiên hãy xây dựng một nguyên mẫu. Nó sẽ lấy một danh sách các cửa sổ từ người dùng và hiển thị chúng bằng màn hình giả đồ họa trên đầu ra tiêu chuẩn.

Ví dụ: đầu vào của người dùng:

0,0,15,10
15,10,20,15
10,13,15,15
9,1,16,3
17,5,20,7
11,2,17,4
15,4,19,6
13,3,18,5

Đầu ra Code Golf® Window Manager ™:

───────────────
│ :::::::: ─────┴┐
::::::::: ────┴┐
:::::::: ─┤: ┌───┴┐
│ :::::::::: ─┤ ::::
│ :::::::::::: └─┬──┘├┐
│ :::::::::::::: ├─┬─┘│
│ :::::::::::::: │ └──┘
│ :::::::::::::: │
│ :::::::::::::: │
──────────────┼────┐
               │ ::::
               │ ::::
          ┌────┤ ::::
          │ :::: │ ::::
          └────┴────┘

Đầu vào:

  • Lấy từ đầu vào tiêu chuẩn (hoặc, nếu hệ thống của bạn không có stdin, bất kỳ phương pháp nào có thể cung cấp một số dòng đầu vào)
  • Mỗi dòng chứa 4 số, được phân cách bằng dấu phẩy - tọa độ của một cửa sổ
  • Hai số đầu tiên: góc trên bên trái; hai số cuối: góc dưới bên phải
  • Sử dụng x,yký hiệu

Đầu ra:

  • Viết nó vào đầu ra tiêu chuẩn (hoặc, nếu hệ thống của bạn không có stdout, bất cứ thứ gì hiển thị văn bản đơn cách)
  • Sử dụng các ký tự vẽ hộp đơn từ Mã trang 437 để vẽ ranh giới cửa sổ
  • Windows được chỉ định sau trong đầu vào che khuất những cái được chỉ định trước đó
  • Điền vào các cửa sổ với ký tự dấu hai chấm: :
  • Không gian hàng đầu và dấu vết đều ổn, miễn là chúng không phá vỡ sự liên kết của các cửa sổ

Ghi chú:

  • Độ phân giải tối đa tôi muốn hỗ trợ: 76 (ngang) bằng 57 (dọc)
  • Không cần hỗ trợ đầu vào xấu
  • Số lượng cửa sổ tối đa: 255 (nếu bạn cần giới hạn)
  • Trình cmdbao Windows 7 của tôi hiển thị codepage 437 ký tự theo mặc định; Nếu bất cứ ai có cách để làm điều đó trên linux (sử dụng xtermhoặc bất cứ điều gì), vui lòng mô tả nó ở đây

Để tham khảo, mã ký tự là:

┌da   ─c4   ┬c2   ┐bf

│b3   :3a   │b3   │b3

├c3   ─c4   ┼c5   ┤b4

└c0   ─c4   ┴c1   ┘d9

Tổng cộng: 12 nhân vật khác nhau.


Lưu ý rằng bạn có thể hiển thị các cửa sổ đẹp trên trang này nếu bạn dán đoạn mã sau vào thanh địa chỉ trình duyệt:javascript:$('pre').css('line-height','1em')
Michael M.

Tôi đã có màn hình chính xác trong thiết bị đầu cuối gnome bằng cách làm theo các hướng dẫn trên stackoverflow.com/questions/5509829/ Lời
brm

Câu trả lời:


3

Con trăn, 397 ký tự

#coding:437
import os
J=range
M=[[0]*76 for _ in J(57)]
for A,C,B,D in[map(int,q.split(','))for q in os.read(0,9999).split('\n')]:
 for x in J(A+1,B):
    for y in J(C+1,D):M[C][A]|=5;M[C][B]|=6;M[D][A]|=9;M[D][B]|=10;M[C][x]|=3;M[D][x]|=3;M[y][A]|=12;M[y][B]|=12;M[y][x]=16;M[y][x-1]&=~1;M[y][x+1]&=~2;M[y-1][x]&=~4;M[y+1][x]&=~8
C=" rl─d┌┐┬u└┘┴│├┤┼:"
for l in M:print''.join((C+C[1:])[m]for m in l)

Thay đổi C="...thành C=u"...và nó sẽ in bằng unicode thay thế! Có thể rất khó để có được tệp lưu đúng vì mã trang 437 ký tự không được thoát (dòng nhận xét 'mã hóa' đầu tiên là bắt buộc).

Cách tiếp cận là tăng dần bản đồ bằng các toán tử bit-khôn ngoan. Phiên bản ít chơi gôn hơn với các bình luận:

#coding:437
import os
J=range
# set up the field
# Each element is a bitfield. Flags are:
# 16 - inside a window?
# 8  - up
# 4  - down
# 2  - left
# 1  - right
M=[[0]*76 for _ in J(57)]
# for each window...
for A,C,B,D in[map(int,q.split(','))for q in os.read(0,9999).split('\n')]:
    # add the directions for the corners
    M[C][A]|=5;M[C][B]|=6;M[D][A]|=9;M[D][B]|=10
    # add the top and bottom edges
    for y in J(C+1,D):M[y][A]|=12;M[y][B]|=12
    # add the left and right edges
    for x in J(A+1,B):M[C][x]|=3;M[D][x]|=3 
    # deal with the middle
    for x in J(A+1,B):
       for y in J(C+1,D):
           # Clear the current spot by setting to inside a window
           M[y][x]=16
           # Remove the right direction from the left spot, top from the bottom, etc
           M[y][x-1]&=~1;M[y][x+1]&=~2;M[y-1][x]&=~4;M[y+1][x]&=~8
 # print it out
 C=u" rl─d┌┐┬u└┘┴│├┤┼:"
 for l in M:print''.join((C+C[1:])[m]for m in l)

6

JavaScript ES6 (FF ≥ 31.0), ký tự 404

w=s=>{a=[];for(i=0;i<57;)a[i++]=Array(76).fill(0);s.split('\n').map(e=>{r=e.split(',');a[x=r[1]][w=r[0]]|=5;a[x][y=r[2]]|=6;a[z=r[3]][w]|=9;a[z][y]|=10;for(i=x;++i<z;)a[i][w]|=12,a[i][w]&=14,a[i][y]|=12,a[i][y]&=13;for(i=w;++i<y;)a[x][i]|=3,a[x][i]&=11,a[z][i]|=3,a[z][i]&=7;for(i=x;++i<z;)for(j=w;++j<y;)a[i][j]=16});console.log(a.map(e=>e.map(t=>t==16?':':' xx─x┌┐┬x└┘┴│├┤┼'[t&15]).join('')).join('\n'))}

Không có ES6:

function w(s){a=[];for(i=0;i<57;i++){a[i]=[];for(j=0;j<76;j++)a[i][j]=0}s.split('\n').forEach(function(e){r=e.split(',');a[r[1]][r[0]]|=5;a[r[1]][r[2]]|=6;a[r[3]][r[0]]|=9;a[r[3]][r[2]]|=10;for(i=r[1];++i<r[3];)a[i][r[0]]|=12,a[i][r[0]]&=14,a[i][r[2]]|=12,a[i][r[2]]&=13;for(i=r[0];++i<r[2];)a[r[1]][i]|=3,a[r[1]][i]&=11,a[r[3]][i]|=3,a[r[3]][i]&=7;for(i=r[1];++i<r[3];)for(j=r[0];++j<r[2];)a[i][j]=16});console.log(a.map(function(e){return e.map(function(t){return t==16?':':' xx─x┌┐┬x└┘┴│├┤┼'[t&15]}).join('')}).join('\n'))}

w('0,0,15,10\n15,10,20,15\n10,13,15,15\n9,1,16,3\n17,5,20,7\n11,2,17,4\n15,4,19,6\n13,3,18,5'); đưa ra chính xác ví dụ của OP.

Các cạnh của cửa sổ được xây dựng bằng các toán tử bitwise (Up = 8, bottom = 4, Left = 2, Right = 1).


Không được kiểm tra toàn diện, nhưng dường như hoạt động tốt với chuỗi ký tự thay vì mảng, trong 548 ký tự. (Chỉ được thử nghiệm trong Firefox.)
manatwork

Bạn có thể lưu một loạt các ký tự bằng cách sử dụng ECMAScript 6: function w(s){...}trở thành w=(s)=>{...}(và giống như khôn ngoan cho tất cả các hàm chữ khác của bạn). Và bảng tra cứu ký tự có thể được thay thế bằng một chuỗi có cùng ký tự.
Martin Ender

Sau ngày hôm nay, sau khi Firefox 31.0 được phát hành, bạn sẽ có thể sử dụng Array.fill()để khởi tạo lên máy tính để bàn.
manatwork

@manatwork, tôi đã thử với FF Aurora [].fill([].fill(0,0,76),0,57), thật tệ là nó không hoạt động. Tôi có thể viết ngắn hơn new Array(57).fill(new Array(76).fill(0))không?
Michael M.

Cố gắng bỏ qua các newtoán tử : Array(57).fill(Array(76).fill(0)).
manatwork

0

Python, 672 ký tự

Phiên bản ít đọc hơn:

import sys
r=range
M=[0,0,0,191,0,196,218,194,0,217,179,180,192,193,195,197]
Z=[map(int,l.split(",")) for l in sys.stdin.readlines()]
S=[[[0]*5 for x in r(77) ] for y in r(58)]
for i in r(len(Z)):
 A,C,B,D=Z[i]
 for a,b,c in [(C,A,2),(C,A,3),(D,A,1),(D,A,2),(C,B,3),(C,B,4),(D,B,1),(D,B,4)]:S[a][b][c]=1
 for x in r(A+1,B):
  for a,b in [(C,2),(C,3),(C,4),(D,1),(D,2),(D,4)]:S[a][x][b]=(b+1)&1
 for y in r(C+1,D):
  for a,b in [(A,1),(A,2),(A,3),(B,1),(B,3),(B,4)]:S[y][a][b]=b&1
 for x in r(A+1,B):
  for y in r(C+1,D):S[y][x]=[i+1]+[0]*4
O=sys.stdout.write
for l in S:
 for k in l:
  c=' ';x=M[k[1]*8|k[2]*4|k[3]*2|k[4]]
  if k[0]:c=':'
  if x:c=chr(x) 
  O(c)
 O('\n')

Bắt đầu từ phiên bản dưới đây:

import sys

coords = [ tuple(map(int,l.strip().split(","))) for l in sys.stdin.readlines() ]

screen = [ [ [-1, [False,False,False,False]] for x in range(0, 77) ] for y in range(0, 58) ]

def mergeBorders(screen, w):
    x0,y0,x1,y1 = w
    screen[y0][x0][1][1] = True
    screen[y0][x0][1][2] = True
    screen[y1][x0][1][0] = True
    screen[y1][x0][1][1] = True
    screen[y0][x1][1][2] = True
    screen[y0][x1][1][3] = True
    screen[y1][x1][1][0] = True
    screen[y1][x1][1][3] = True

    for x in range(x0+1,x1):
        screen[y0][x][1][1] = True
        screen[y0][x][1][2] = False
        screen[y0][x][1][3] = True
        screen[y1][x][1][0] = False
        screen[y1][x][1][1] = True
        screen[y1][x][1][3] = True

    for y in range(y0+1,y1):
        screen[y][x0][1][0] = True
        screen[y][x0][1][1] = False
        screen[y][x0][1][2] = True
        screen[y][x1][1][0] = True
        screen[y][x1][1][2] = True
        screen[y][x1][1][3] = False

def paintInside(screen, w, wId):
    x0,y0,x1,y1 = w
    for x in range(x0+1,x1):
        for y in range(y0+1,y1):
            screen[y][x][0] = wId 
            screen[y][x][1] = [False, False, False, False]

for wId in range(len(coords)):
    w = coords[wId]
    mergeBorders(screen, w)
    paintInside(screen, w, wId)

borderMap = { (False, True, True, False): 0xda,
              (False, True, False, True): 0xc4,
              (False, True, True, True):  0xc2,
              (False, False, True, True): 0xbf,
              (True, False, True, False): 0xb3,
              (True, True, True, False):  0xc3,
              (True, True, True, True):   0xc5,
              (True, False, True, True):  0xb4,
              (True, True, False, False): 0xc0,
              (True, True, False, True):  0xc1,
              (True, False, False, True): 0xd9 }

def borderChar(c):
    return chr(borderMap[(c[0],c[1],c[2],c[3])])


for screenLine in screen:
    for contents in screenLine:
        c = ' '
        if True in contents[1]:
            c = borderChar(contents[1])
        elif contents[0] >= 0:
            c = ':'
        sys.stdout.write(c)
    sys.stdout.write('\n')
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.