मुझे विंडो मैनेजर बनाओ!


14

मुझे कोड ब्लोट से नफरत है!

इसलिए मैंने अपने विंडोज 7 सिस्टम को एक गोल्फ संस्करण द्वारा बदलने का फैसला किया है। हालांकि, मुझे पता है कि यह आसान नहीं है, इसलिए पहले एक प्रोटोटाइप का निर्माण करें। यह उपयोगकर्ता से खिड़कियों की एक सूची लेगा और उन्हें मानक आउटपुट पर एक छद्म ग्राफिक प्रदर्शन का उपयोग करके दिखाएगा।

उदाहरण के लिए: उपयोगकर्ता इनपुट:

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

कोड Golf® विंडो प्रबंधक ™ आउटपुट:

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

इनपुट:

  • मानक इनपुट से लिया गया (या, यदि आपके सिस्टम में कोई stdinभी नहीं है , तो कोई भी विधि जो इनपुट की कई लाइनें प्रदान कर सकती है)
  • प्रत्येक पंक्ति में 4 नंबर होते हैं, जो अल्पविराम द्वारा सीमांकित होता है - एक विंडो के निर्देशांक
  • पहले दो नंबर: ऊपरी-बाएं कोने; पिछले दो नंबर: निचले-दाएं कोने
  • x,yसंकेतन का उपयोग करना

आउटपुट:

  • इसे मानक आउटपुट में लिखें (या, यदि आपके सिस्टम में कोई stdoutभी चीज नहीं है , तो कुछ भी जो मोनोसेप्ड टेक्स्ट प्रदर्शित करता है)
  • खिड़की की सीमाओं को खींचने के लिए कोड पृष्ठ 437 से एकल बॉक्स-ड्राइंग पात्रों का उपयोग करें
  • इनपुट में बाद में निर्दिष्ट विंडोज उन निर्दिष्टों को अस्पष्ट करता है
  • बृहदान्त्र चरित्र के साथ खिड़कियां भरें: :
  • लीडिंग और ट्रेलिंग स्पेस ठीक हैं, जब तक कि वे खिड़कियों के संरेखण को नहीं तोड़ते हैं

टिप्पणियाँ:

  • अधिकतम रिज़ॉल्यूशन मैं समर्थन करना चाहता हूं: 76 (क्षैतिज) 57 (ऊर्ध्वाधर) द्वारा
  • खराब इनपुट का समर्थन करने की आवश्यकता नहीं है
  • खिड़कियों की अधिकतम संख्या: 255 (यदि आपको सीमा की आवश्यकता है)
  • मेरा विंडोज 7 cmdशेल डिफ़ॉल्ट रूप से कोडपेज 437 अक्षर प्रदर्शित करता है; अगर किसी के पास यह करने का कोई तरीका है कि लिनक्स पर (उपयोग xtermया जो भी हो), तो कृपया यहाँ उसका वर्णन करें

संदर्भ के लिए, वर्ण कोड हैं:

┌da   ─c4   ┬c2   ┐bf

│b3   :3a   │b3   │b3

├c3   ─c4   ┼c5   ┤b4

└c0   ─c4   ┴c1   ┘d9

कुल: 12 विभिन्न वर्ण।


ध्यान दें कि आप इस पेज पर सुंदर विंडो प्रदर्शित कर सकते हैं यदि आप ब्राउज़र एड्रेस बार में निम्न कोड पेस्ट करते हैं:javascript:$('pre').css('line-height','1em')
माइकल एम।

जवाबों:


3

पायथन, 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"...और यह यूनिकोड में बजाय प्रिंट जाएगा! फ़ाइल को ठीक से सहेजना मुश्किल हो सकता है क्योंकि कोड पृष्ठ 437 अक्षर बच नहीं रहे हैं (पहले 'कोडिंग' टिप्पणी लाइन की आवश्यकता है)।

यह दृष्टिकोण समवर्ती रूप से बिट-बुद्धिमान ऑपरेटरों का उपयोग करके एक मानचित्र बनाने के लिए है। टिप्पणियों के साथ कम गोल्फ वाला संस्करण:

#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

जावास्क्रिप्ट ईएस 6 (एफएफ .0 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'); ओपी के उदाहरण को सही ढंग से आउटपुट करता है।

विंडोज़ के किनारों को बिटवाइज ऑपरेटरों (अप = 8, बॉटम = 4, लेफ्ट = 2, राइट = 1) का उपयोग करके बनाया गया है।


कोई भी परीक्षण नहीं किया गया है, लेकिन 548 अक्षरों में, सरणी के बजाय स्ट्रिंग शाब्दिक के साथ ठीक काम करता है। (केवल फ़ायरफ़ॉक्स में परीक्षण किया गया।)
मैनेटवर्क

आप ECMAScript 6 का उपयोग करके पात्रों में से एक गुच्छा बचा सकते हैं: function w(s){...}हो जाता है w=(s)=>{...}(और आपके सभी अन्य समारोह शाब्दिक के लिए बुद्धिमान की तरह)। और वर्ण लुकअप तालिका को संभवतः समान वर्णों के साथ स्ट्रिंग द्वारा प्रतिस्थापित किया जा सकता है।
मार्टिन एंडर

बाद में आज, फ़ायरफ़ॉक्स 31.0 जारी होने के बाद, आप Array.fill()"डेस्कटॉप" को इनिशियलाइज़ करने के लिए उपयोग कर पाएंगे ।
मैनटवर्क

@manatwork, मैंने एफएफ अरोरा के साथ कोशिश की [].fill([].fill(0,0,76),0,57), बहुत बुरा यह काम नहीं करता है। क्या मैं इससे छोटा लिख ​​सकता हूँ new Array(57).fill(new Array(76).fill(0))?
माइकल एम।

newऑपरेटरों को छोड़ने की कोशिश करें Array(57).fill(Array(76).fill(0)):।
मैनटवर्क

0

पायथन, 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')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.