ทำให้ฉันเป็นผู้จัดการหน้าต่าง!


14

ฉันเกลียดรหัสขยายตัว!

ดังนั้นฉันจึงตัดสินใจแทนที่ระบบ Windows 7 ของฉันเป็นเวอร์ชั่น golfed อย่างไรก็ตามฉันรู้ว่ามันไม่ง่ายดังนั้นเรามาสร้างต้นแบบก่อน จะใช้รายการหน้าต่างจากผู้ใช้และแสดงโดยใช้จอแสดงผลแบบกราฟิกเทียมบนเอาต์พุตมาตรฐาน

ตัวอย่างเช่น: อินพุตของผู้ใช้:

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

เอาต์พุต Code Golf® Window Manager ™:

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

การป้อนข้อมูล:

  • นำมาจากอินพุตมาตรฐาน (หรือหากระบบของคุณไม่มีstdinวิธีใด ๆ ที่สามารถให้อินพุตหลายบรรทัด)
  • แต่ละบรรทัดมี 4 หมายเลขคั่นด้วยเครื่องหมายจุลภาค - พิกัดของหน้าต่าง
  • ตัวเลขสองตัวแรก: มุมบนซ้าย; ตัวเลขสองตัวสุดท้าย: มุมล่างขวา
  • ใช้x,yสัญลักษณ์

เอาท์พุท:

  • เขียนลงในเอาต์พุตมาตรฐาน (หรือหากระบบของคุณไม่มีstdoutสิ่งใดที่แสดงข้อความที่มีช่องว่าง)
  • ใช้อักขระการวาดภาพกล่องเดียวจากรหัสหน้า 437สำหรับขอบเขตการวาดหน้าต่าง
  • Windows ถูกระบุในภายหลังในอินพุตไม่ชัดเจนที่ระบุไว้ก่อนหน้า
  • เติมหน้าต่างด้วยอักขระโคลอน: :
  • ช่องว่างนำหน้าและต่อท้ายนั้นใช้ได้ตราบใดที่ไม่แบ่งแนวหน้าต่าง

หมายเหตุ:

  • ความละเอียดสูงสุดที่ฉันต้องการรองรับ: 76 (แนวนอน) โดย 57 (แนวตั้ง)
  • ไม่จำเป็นต้องรองรับอินพุตที่ไม่ดี
  • จำนวนหน้าต่างสูงสุด: 255 (ถ้าคุณต้องการขีด จำกัด )
  • My Windows 7 cmdshell แสดง codepage 437 ตัวอักษรโดยค่าเริ่มต้น หากใครมีวิธีที่จะทำเช่นนั้นบน linux (ใช้xtermหรืออะไรก็ตาม) โปรดอธิบายที่นี่

สำหรับการอ้างอิงรหัสตัวอักษรคือ:

┌da   ─c4   ┬c2   ┐bf

│b3   :3a   │b3   │b3

├c3   ─c4   ┼c5   ┤b4

└c0   ─c4   ┴c1   ┘d9

ทั้งหมด: 12 ตัวอักษรที่แตกต่างกัน


โปรดทราบว่าคุณสามารถแสดงหน้าต่างสวย ๆ ในหน้านี้หากคุณวางรหัสต่อไปนี้ลงในแถบที่อยู่ของเบราว์เซอร์:javascript:$('pre').css('line-height','1em')
Michael M.

ฉันได้รับการแสดงผลที่ถูกต้องใน gnome-terminal โดยทำตามคำแนะนำในstackoverflow.com/questions/5509829/…
brm

คำตอบ:


3

Python 397 ตัวอักษร

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

เปลี่ยนC="...เป็นC=u"...และจะพิมพ์เป็น unicode แทน! อาจเป็นการยากที่จะทำให้ไฟล์บันทึกอย่างถูกต้องเนื่องจากรหัสหน้า 437 ตัวอักษรไม่ได้รับการยกเว้น (จำเป็นต้องมีบรรทัดความคิดเห็น 'การเข้ารหัส' บรรทัดแรก)

วิธีการคือการสร้างแผนที่แบบค่อยเป็นค่อยไปโดยใช้ตัวดำเนินการ bit-wise เวอร์ชัน golfed หักที่มีความคิดเห็น:

#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), 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'))}

ไม่มี 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'); แสดงผลตัวอย่างของ OP ได้อย่างถูกต้อง

ขอบของหน้าต่างถูกสร้างโดยใช้ตัวดำเนินการระดับบิต (ขึ้น = 8, ด้านล่าง = 4, ซ้าย = 2, ขวา = 1)


ไม่มีการทดสอบอย่างละเอียด แต่ดูเหมือนว่าจะทำงานได้ดีกับตัวอักษรสตริงแทนที่จะเป็นอาร์เรย์ใน 548 ตัวอักษร (ทดสอบเฉพาะใน Firefox)
ทำงาน

คุณสามารถบันทึกอักขระจำนวนมากได้โดยใช้ ECMAScript 6: function w(s){...}กลายเป็นw=(s)=>{...}(และชาญฉลาดสำหรับตัวอักษรฟังก์ชันอื่น ๆ ทั้งหมดของคุณ) และตารางการค้นหาตัวละครอาจถูกแทนที่ด้วยสตริงด้วยอักขระเดียวกัน
Martin Ender

ภายหลังวันนี้หลังจาก Firefox 31.0 จะเปิดตัวคุณจะสามารถใช้งานArray.fill()เพื่อเริ่มต้นเป็น "เดสก์ท็อป"
จัดการ

@ การจัดการฉันลองกับ FF Aurora [].fill([].fill(0,0,76),0,57)ไม่ดีเกินไปมันไม่ทำงาน ฉันเขียนสั้นกว่านี้ได้new Array(57).fill(new Array(76).fill(0))ไหม
Michael M.

พยายามที่จะข้ามไป newArray(57).fill(Array(76).fill(0))ผู้ประกอบการ:
จัดการ

0

Python 672 ตัวอักษร

เวอร์ชันที่อ่านได้น้อยกว่า:

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

เริ่มจากรุ่นด้านล่าง:

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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.