language agnostic - कोड गोल्फ़: आस्की कला बक्से पहचानें




language-agnostic code-golf (7)

एफ #, 297 वर्ण

थोड़े लंगड़ा, लेकिन सरल

let F a=
 for x=0 to Array2D.length1 a-1 do
  for y=0 to Array2D.length2 a-1 do
  if a.[x,y]='+' then
   let mutable i,j=x+1,y+1
   while a.[i,y]<>'+' do i<-i+1
   while a.[x,j]<>'+' do j<-j+1
   printfn"(%d,%d;%d,%d)"x y (i-x+1)(j-y+1)
   a.[i,y]<-' '
   a.[x,j]<-' '
   a.[i,j]<-' '

प्लस के लिए देखो इसके दाईं ओर एक को ढूंढें। इसके नीचे एक खोजें। इस आयत की जानकारी को प्रिंट करें, और 'नल आउट' प्लसज जो हमने पहले से उपयोग किए हैं चूंकि प्रत्येक प्लस केवल एक वैध आयत का हिस्सा है, इसलिए हमें ऐसा करने की ज़रूरत है

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

  • कोई भी तुच्छ परिवर्तनीय इनपुट या आउटपुट प्रारूप ठीक है (जैसे: चार **, स्ट्रिंग्स की सूची, मानक इनपुट की रेखाएं, चार इनसेट, स्ट्रक्चर, निश्चित राशि +/- आकार के लिए; आदि)
  • इसी तरह, किसी विशेष क्रम में आउटपुट की आवश्यकता नहीं होती है।
  • आपके पास अमान्य इनपुट या गलत आयतों के लिए उपयोगी कुछ भी नहीं है, लेकिन इनपुट में नहीं होने वाले आयत के लिए आपको उचित दिखने वाले निर्देशांक का उत्पादन नहीं करना चाहिए।
  • कोई दो वैध आयत साझा नहीं करता + (हालांकि + केवल आयताकार के भाग के रूप में नहीं दिखाई दे सकता है)
  • आप मान सकते हैं कि सभी आयत कम से कम 3x3 हैं: प्रत्येक पक्ष में - या | इस में।

उदाहरण:

"        "
"  +-+ | "
"  | | \-"
"  +-+   "
(2,1;3,3)

"+--+  +--+"
"|  |  |  |"
"+--+  +--+"
(0,0;4,3), (6,0;4,3)

"  +---+  "
"->|...|  "
"  +---+  "
(2,0;5,3)

"+-+ +--+  +--+"
"| | |  |  |  |"
"+-+ |  |  + -+"
"    |  |      "
"    +--+  +-+ "
"  +--+    |   "
"  +--+    +-+ "
(0,0;3,3), (4,0;4,5) # (2,5;4,2) is fine, but not needed

XQuery (304 वर्ण)

यहां मेरा समाधान है:

declare variable $i external;let$w:=string-length($i[1]),$h:=count($i)for$y in 1 to$h,$x in 1 to$w,$w in 2 to$w+1 -$x,$h in 1 to$h where min(for$r in (0,$h),$s in 1 to$h return (matches(substring($i[$y+$r],$x,$w),'^\+-*\+$'),matches(substring($i[$y+$s],$x,$w),'^|.*|$')))return ($x -1,$y -1,$w,$h+1,'')

आप इन्हें इनपुट की लाइन के रूप में चर $i को सेट करके ( XQSharp के साथ) चला सकते हैं

>XQuery boxes.xq "i=('  +-+','+-+-+','| |  ','+-+  ')" !method=text

2 0 3 2  0 1 3 3

मुझे लगता है कि कोई तर्क दे सकता है कि declare variable $i external; सिर्फ इनपुट सेट कर रहा है और ऐसा गिनती में नहीं जोड़ता है, जिसमें 275 वर्ण हैं


पायथन 2.6 - 287 263 254

a = [
    "+-+ +--+  +--+",
    "| | |  |  |  |",
    "+-+ |  |  + -+",
    "    |  |      ",
    "    +--+  +-+ ",
    "  +--+    |   ",
    "  +--+    +-+ "
    ]

l=len
r=range
w,h=l(a[0]),l(a)
[(x,y,u,v)for x in r(0,w)for y in r(0,h)for u in r(x+2,w)for v in r(y+2,h)if a[y][x]==a[v][x]==a[y][u]==a[v][u]=='+' and a[y][x+1:u]+a[v][x+1:u]=="-"*2*(u-x-1)and l([c for c in r(y+1,v-y)if a[c][x]==a[c][u]=='|'])==v-y-1]

के लिए मूल्यांकन:

[(0, 0, 3, 3), (4, 0, 4, 5)]

सी ( 204 186 वर्ण)

    #include<stdio.h>
    char H=7,W=14,*S =
    "+-+ +--+  +--+"
    "| | |  |  |  |"
    "+-+ |  |  + -+"
    "    |  |      "
    "    +--+  +-+ "
    "  +--+    |   "
    "  +--+    +-+ ";
    void main(){
#define F(a,r,t)if(*c==43){while(*(c+=a)==r);t}
char*c,*o,*e=S;while(*(c=e++))
F(1,45,F(W,'|',o=c;F(-1,45,F(-W,'|',c==e-1?
printf("%i,%i %i,%i\n",(c-S)%W,(c-S)/W,(o-c)%W+1,(o-c)/W+1):0;))))
    }

चरित्र की गणना मुख्य () का मुख्य भाग है यह कोड ई के साथ स्ट्रिंग पर चल जाएगा जब तक यह एक संभावित आयत के शीर्ष-बाएं कोने तक नहीं पहुंच जाएगा। यह फिर सी के साथ किनारों की जांच करेगा और नीचे-दाएं कोने पर नज़र रखने के लिए का इस्तेमाल करेगा।

कार्यक्रम का उत्पादन है:

0,0 3,3
4,0 4,5
2,5 4,2

पर्ल, 167 165 15 9 वर्ण

( 156 वर्ण यदि आप stadin को @ ए पर गिनती नहीं करते हैं, तो पिछले 3 वर्णों को हटा दें और अपने इनपुट को @ ए पर प्रदर्शित करने वाली स्ट्रिंग्स की एक सूची असाइन करें।

Stdin से इनपुट हो जाता है न्यूलाइंस महत्वपूर्ण नहीं हैं, पठनीयता के लिए जोड़ा गया है। +++ ऑपरेटर के उपयोग की सूचना; पी

map{$l=$i++;while($c=/\+-+\+/g){$w=$+[0]-2-($x=$-[0]);
$c++while$a[$l+$c]=~/^.{$x}\|.{$w}\|/;
print"($x,$l;",$w+2,",$c)\n"if$a[$c+++$l]=~/^.{$x}\+-{$w}\+/}}@a=<>


क्या आप संस्करण स्वीकार करते हैं, में उदार होना 170 वर्ण

map{$l=$i++;while($c=/\+-*\+/g){pos=-1+pos;$w=$+[0]-2-($x=$-[0]);
$c++while$a[$l+$c]=~/^.{$x}\|.{$w}\|/;
print"($x,$l;",$w+2,",$c)\n"if$a[$c+++$l]=~/^.{$x}\+-{$w}\+/}}@a=<>


आप जो संस्करण स्वीकार करते हैं, रूढ़िवादी हों, 177 वर्ण

map{$l=$i++;while($c=/\+-+\+/g){$w=$+[0]-2-($x=$-[0]);
$c++while$a[$l+$c]=~/^.{$x}\|.{$w}\|/;print
"($x,$l;",$w+2,",$c)\n"if$c>1&&$a[$c+++$l]=~s/^(.{$x})\+(-{$w})\+/$1v$2v/}}@a=<>


टिप्पणी संस्करण:

@a=<>;          # slurp stdin into an array of lines
$l=0;           # start counting lines from zero
map{            # for each line
    while(/\+-+\+/g){               # match all box tops
            $c=1;                           # initialize height

            # x coordinate, width of box - sides
            $w=$+[0]-2-($x=$-[0]);

            # increment height while there are inner parts
            # of a box with x and w coinciding with last top
            # (look into next lines of array)
            $c++  while $a[$l+$c]=~/^.{$x}\|.{$w}\|/;

            # if there is a box bottom on line + height
            # with coinciding x and w, print coords
            # (after incrementing height)
            print "($x,$l;",$w+2,",$c)\n"  
                    if $a[$c+++$l]=~/^.{$x}\+-{$w}\+/
    }
    $l++    # line++
}@a


मेगा टेस्ट केस:

+--+  +-+ +-+  +++   +---+   +-+  +-+-+  +-++-+
|SO|  | | | |  +++   |+-+|   | |  | | |  | || |
+--+  +-+-+-+  +++   ||+||   +-+  +-+-+  +-++-+
        | |          |+-+|   | |
      +-+-+-+        +---+   +-+
      | | | |
      +-+ +-+


++ +-+ ++     +-+   +- + +--+ +--+ +--+
|| +-+ ++   +-+-+   |  | |  | |    |  |
++          | |     |  | |  | |  |    |
            +-+     +--+ + -+ +--+ +--+

स्काला 2.8 - 283 273 26 9 257

val a = Seq(
    "+-+ +--+  +--+",
    "| | |  |  |  |",
    "+-+ |  |  + -+",
    "    |  |      ",
    "    +--+  +-+ ",
    "  +--+    |   ",
    "  +--+    +-+ "
  )

// begin golf count
val (w,h) = (a(0).size-1,a.size-1)
for (
  x <- 0 to w;
  y <- 0 to h;
  u <- x+2 to w;
  v <- y+2 to h;
  if Set(a(y)(x),a(v)(x),a(y)(u),a(v)(u)) == Set(43)
  && (x+1 to u-1).forall(t => (a(y)(t)<<8|a(v)(t)) == 11565)
  && (y+1 to v-1).forall(t => (a(t)(x)<<8|a(t)(u)) == 31868)
) yield (x,y,u-x+1,v-y+1)
// end golf count

का मूल्यांकन करता है:

Vector((0,0,3,3), (4,0,4,5))

अभिव्यक्ति के लिए जवाब (वेक्टर ऑब्जेक्ट) का मूल्यांकन करता है, यही कारण है कि मैं केवल इस भाग की गणना करता हूं (सफेद स्थान हटाया गया)। मुझे बताएं कि यह गिनती का सही तरीका है।

यह काम किस प्रकार करता है

सभी संभव आयतों के निर्देशांक (वास्तव में, केवल> = 3x3) अभिव्यक्ति के for उत्पन्न होते हैं ये निर्देशांक +, - और | सभी आयतों के किनारों और कोनों पर ( if अभिव्यक्ति के for भाग है)।


पायथन 2.6 (251 वर्ण)

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

import re
l,a,o=s.index("\n")+1,re.finditer,sorted
o(o(set((m.start(),m.end())for m in a(r'\+-* *-*\+',s)for n in a(r'\|.+\|',s)if(m.start()%l,m.end()%l)==(n.start()%l,n.end()%l)if m.start()+l==n.start()or m.start()-l==n.start())),key=lambda x:x[0]%l)

इनपुट एक एकल स्ट्रिंग है, एक नई पंक्ति के द्वारा अलग लाइन (सभी एक ही लंबाई)। परिणाम शीर्ष "बाएं" बॉक्स के ऊपर और नीचे के स्ट्रिंग स्लाइस हैं, शीर्ष बाएं शुरू होते हैं। यह "टूटी" बक्से (यानी एक तरफ के बीच में कुछ जगह के साथ, बिना एक पूरे तरफ) की अनुमति देता है यह कई ब्रांड नए साइड इफेक्ट बनाने के लिए एक अवांछित व्यवहार को ठीक करने का एक तरीका था! :-)

इनपुट:

>>>s = """+-+ +--+  +--+
| | |  |  |  |
+-+ |  |  + -+
    |  |      
    +--+  +-+ 
  +--+    |   
  +--+    +-+ """

या:

>>>s = "+-+ +--+  +--+\n| | |  |  |  |\n+-+ |  |  + -+\n    |  |      \n    +--+  +-+ \n  +--+    | \n  +--+    +-+ "

फिर:

>>>import re
>>>l,a,o=s.index("\n")+1,re.finditer,sorted
>>>o(o(set((m.start(),m.end())for m in a(r'\+-* *-*\+',s)for n in a(r'\|.+?\|',s)if(m.start()%l,m.end()%l)==(n.start()%l,n.end()%l)if m.start()+l==n.start()or m.start()-l==n.start())),key=lambda x:x[0]%l)

उत्पादन:

[(0, 3), (30, 33), (4, 8), (64, 68), (10, 14), (40, 44)]

तो (0,3) एक ही बॉक्स के नीचे 1 बॉक्स (30,33) के नीचे, (4,8) दूसरे बॉक्स के ऊपर और इसी तरह।





ascii-art