कैरासोन टाइल रखें


23

बोर्ड का खेल

बोर्ड गेम " कारकैसोन " में खिलाड़ी अपने किनारों से मेल खाते हुए टाइल लगाते हैं और इलाके के बड़े सन्निहित क्षेत्रों को बनाने के माध्यम से उच्चतम स्कोर अर्जित करते हैं। निम्नलिखित (मोटे तौर पर) खेल में शामिल टाइलों के प्रकार और मात्रा हैं:

#01 x4 यहाँ छवि विवरण दर्ज करें #02 x5 यहाँ छवि विवरण दर्ज करें #03 x8 यहाँ छवि विवरण दर्ज करें #04 x2 यहाँ छवि विवरण दर्ज करें

#05 x9 यहाँ छवि विवरण दर्ज करें #06 x4 यहाँ छवि विवरण दर्ज करें #07 x1 यहाँ छवि विवरण दर्ज करें #08 x3 यहाँ छवि विवरण दर्ज करें

#09 x3 यहाँ छवि विवरण दर्ज करें #10 x3 यहाँ छवि विवरण दर्ज करें #11 x4 यहाँ छवि विवरण दर्ज करें #12 x5 यहाँ छवि विवरण दर्ज करें

#13 x3 यहाँ छवि विवरण दर्ज करें #14 x3 यहाँ छवि विवरण दर्ज करें #15 x2 यहाँ छवि विवरण दर्ज करें #16 x5 यहाँ छवि विवरण दर्ज करें

#17 x5 यहाँ छवि विवरण दर्ज करें #18 x2 यहाँ छवि विवरण दर्ज करें #19 x3 यहाँ छवि विवरण दर्ज करें #20 x1 यहाँ छवि विवरण दर्ज करें

#21 x5 यहाँ छवि विवरण दर्ज करें #22 x2 यहाँ छवि विवरण दर्ज करें #23 x1 यहाँ छवि विवरण दर्ज करें #24 x1 यहाँ छवि विवरण दर्ज करें

#25 x1 यहाँ छवि विवरण दर्ज करें

काम

इलाके के सबसे बड़े संभावित समीपस्थ क्षेत्रों को बनाए रखने की कोशिश करते हुए, आपको किनारों से मिलान करके एक टाइल रखनी चाहिए।

प्लेसमेंट

  • टाइलें केवल एक (4 तक) रिक्त स्थान में खेल क्षेत्र में किसी भी मौजूदा टाइल (या टाइल) से सटे रखी जा सकती हैं।
  • टाइलें 90, 180 या 270 डिग्री तक घुमाई जा सकती हैं।

एज मिलान

  • एक रखी गई टाइल के किनारों को (4 तक) पड़ोसी टाइलों के स्पर्श किनारों से मेल खाना चाहिए, अर्थात स्पर्श करने वाले पिक्सेल एक ही रंग के होते हैं।

समीपवर्ती भूभाग

  • "इलाके के एक क्षेत्र को बंद करना" एक टाइल को रखने के लिए संदर्भित करता है जैसे कि रंग का कोई भी सन्निहित क्षेत्र आगे टाइल टाइल के साथ जारी नहीं रखा जा सकता है।
  • यदि कोई वैकल्पिक प्लेसमेंट संभव है, तो इसे किसी भी टाइल प्लेसमेंट पर चुना जाना चाहिए जो इलाके के एक क्षेत्र को बंद कर देगा।
  • यदि आपको कई बंद स्थानों में से किसी एक को चुनना है, तो कोई भी चुनें। यदि आपको कई गैर-समापन स्थानों के बीच चयन करना है, तो कोई भी चुनें।
  • समीपवर्ती क्षेत्रों की गणना करते समय # ff00ff (कोने के पिक्सल) की उपेक्षा करें। इमारतों की अवहेलना, यानी रंग के क्षेत्र पहले से ही पूरी तरह से एक टाइल के भीतर संलग्न हैं।

इनपुट

  • इनपुट दो चित्र हैं:

    1. खेल का क्षेत्र।

      • प्रारंभिक खेल क्षेत्र में टाइल #11(एक एकल टाइल) होती है।
      • आउटपुट के रूप में बनाए गए संवर्धित प्ले क्षेत्र को इनपुट के रूप में भी समर्थित होना चाहिए।
    2. रखी जाने वाली खपरैल।

      • सभी उदाहरण टाइल्स को इनपुट के रूप में समर्थित होना चाहिए।
  • अकेले इस छवि डेटा का उपयोग करके किनारों / सन्निहित भू-भाग का निर्धारण करें। कोई हार्डकोडिंग नहीं।

उत्पादन

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

आप ऐसा मान सकते हैं

  • टाइलें हमेशा 55 px से 55 px होती हैं
  • टाइलें कभी भी केवल उदाहरण टाइल्स में वर्तमान में उपयोग किए जाने वाले रंगों की सुविधा देंगी।

टिप्पणियाँ

  • आपके उत्तर में कम से कम 2 पास (अधिक प्रोत्साहित होने के बाद) का उदाहरण आउटपुट होना चाहिए।
  • यह मूल बोर्ड गेम का एक आंशिक और गलत प्रतिपादन है, आपको यहां उल्लिखित किसी भी नियम या रणनीति को लागू करने की आवश्यकता नहीं है।

स्कोर

  • आपका स्कोर आपके सबमिशन की बाइट गिनती है।
  • छवि डेटा आपके स्कोर में शामिल नहीं है।
  • सबसे कम स्कोर जीतता है।


पूरा खेल खेल रहा था

आप एक स्क्रिप्ट लिखने की इच्छा कर सकते हैं जो आपके गेम को पूर्ण गेम खेलने के लिए उपयोग करती है, जिसमें निम्न शामिल हो सकते हैं:

  • 85 के पूर्ण सेट से एक टाइल चुना हुआ छद्म रूप से रखा।
  • यदि सेट नहीं किया जा सकता है तो टाइल को सेट पर लौटा देना।
  • तब तक दोहराएं जब तक कि हर टाइल को रखा नहीं गया है - या जब तक एक पंक्ति में दो टाइलें नहीं रखी जा सकतीं।

यह आपकी बाइट की गिनती में शामिल नहीं होगा, या आपके स्कोर में सुधार नहीं करेगा, लेकिन मैं इस तरह के उत्तर के लिए एक इनाम की पेशकश करूंगा।


1
12, 15 और 17 के बीच अंतर क्या है?
कोन

उस पकड़ने के लिए धन्यवाद, 17 एक डुप्लिकेट था। हालांकि 15 भिन्न होता है क्योंकि यह संभावित रूप से इलाके के एक क्षेत्र को बंद कर सकता है। (btw, रंग के क्षेत्र सन्निहित नहीं हैं यदि केवल पिक्सेल के कोने छूते हैं)
jsh

तो एक 15 और दो 2s आकार के 2 अलग-अलग काले वर्गों को बना सकते हैं 2. जबकि एक 12 और दो 2 एक काले वर्गों को बना सकते हैं जो कि 3 के बजाय 3 है। ठीक है।
कीनू

2
1. यदि आप किसी क्षेत्र के रंग को बदलने के लिए ms पेंट फिल बकेट टूल का उपयोग कर सकते हैं तो यह एक सन्निहित क्षेत्र है। आपके उदाहरण में 7 सन्निहित क्षेत्र होंगे। 2. जो उचित लगे। जब तक आप निर्दिष्ट के रूप में दो छवियों का उपयोग करते हैं, तब तक आप ऐसा कर सकते हैं जो आप चाहते हैं। 3. आप किसी भी तरह से रिक्त स्थान को चित्रित कर सकते हैं। पारदर्शिता एक अच्छा विकल्प है। आप किसी भी रंग का उपयोग कर सकते हैं जो उदाहरण टाइल्स में चित्रित नहीं किया गया है।
jsh

1
@ hosch250 खेल क्षेत्र अनंत है (आवश्यक के रूप में विस्तारित)। नाटक पर सिर्फ पहली टाइल के साथ, पहले टाइल है पूरे खेल क्षेत्र।
जहलाद

जवाबों:


8

PerlMagick के साथ पर्ल 5: 875 789 763

मैंने उस रेखा को गिनना शुरू नहीं किया sub w, जिसका उपयोग कॉम्पैक्ट समाधान (अब ठीक से काम करने के लिए) को पसंद करने के लिए केंद्र की दूरी पर स्थिति को सॉर्ट करने के लिए किया जाता है। इस संस्करण को बंद करने का अनुरोध करने से बचा जाता है, लेकिन मुझे खेल के विपरीत अधिक दिलचस्प और सच लगता है। प्राप्त करने के लिए उस लाइन $s=$t if!grep...को बदल दें $s=$t if grep...

use Image::Magick;
sub p{/x/;@o=$r->GetPixel(y=>$'+pop,x,$`+pop);"@o"}
sub o{$w=&p;"0 0 0"eq$w?3:&p eq$w}
sub f{$r->FloodfillPaint(y=>$J+$',x,$I+$&,channel,All,fill,@_)}
($i=Image::Magick->new)->Read(@ARGV);$r=$b=$i->[0];
$h=$b->Get(rows)+112;$:=$b->Get(width)+112;
$b->Extent(geometry,"$:x$h-56-56",background,none);
@v=grep p()eq"0 0 0",map{map-54+55*$_.x.($'*55-54),//..$:/55}1..$h/55;
sub w{$_=pop;/x/;abs($:-2*$`)+abs($h-2*$')}@v=sort{w($b)<=>w($a)}@v;
map{map{/x/;$I=$`;$J=$';$r=$b->Clone();
($t=$r)->Composite(image,$i->[1],x,$I,y=>$J);
if((o(27,0,27,-1)&o(0,27,-1,27)&o(27,54,27,55)&o(54,27,55,27))==1){
$s=$t if!grep{/../;$r=$t->Clone();f(none);f(red);
!grep{p()eq"1 0 0"}@v}
map{/..$/;($_,$&.$`)}map{($_.-1,$_.55)}10,27,45;
$o=$r=$t;}$i->[1]->Rotate(degrees,90)}($_)x4}@v;
$s||=$o or exit 1;$s->Trim();$s->Write("car.png")

उपयोग: perl car.pl board.png tile.png। परिणाम में संग्रहीत car.png। यदि टाइल नहीं रखी जा सकती है तो निकास स्थिति 1 है।

एक पूरा खेल चलाने के लिए स्क्रिप्ट। यह मानता है कि उपरोक्त कोड फ़ाइल में है car.plऔर टाइल्स को tilesनिर्देशिका में नामित किया 01.pngगया है 25.png

use List::Util shuffle;$x='00';
@t=shuffle map{($x++)x$_}split'',a4582941333353325523152111;
`cp tiles/11.png car.png`;
$i++,`perl car.pl car.png tiles/$_.png`,print"placed $i\n"for@t

यह अब काफी धीमी गति से चलता है। मेरी मशीन पर 8-12 मिनट। बंद पसंद के बंद करने के उदाहरण को प्राथमिकता दें साथ : बंद टालने के साथ (ध्यान दें कि कुछ भी बंद नहीं है)।


लगता है कि क्षेत्र का परीक्षण ठीक से काम नहीं कर रहा है । शहर के साथ सड़क के किनारे की टाइल (0,1) सबसे आखिरी में रखी गई थी।
जहलाद

@ जहल्द आप सही कह रहे हैं। परीक्षणों के लिए मैंने स्थिति को उलट दिया क्योंकि यह एक क्षेत्र को बंद करने के लिए आसान नहीं है (यह उन्हें बंद करने के लिए वास्तविक खेल में एक बेहतर रणनीति है)। लेकिन अब मुझे यकीन नहीं है कि अगर यह उल्टा हालत ठीक से काम भी करे। मैं आज उसे ठीक कर दूंगा।
नटकी

@ जुल्ह फिक्स्ड, नोटिंग के लिए धन्यवाद। सभी BTW के बाद विपरीत स्थिति ठीक थी।
नटकी

15

आम लिस्प, 2650 2221 1992 1186 1111 बाइट्स

अद्यतन: "आसान" गोल्फिंग अब किया, आगे के लाभ के लिए बड़े बदलाव की आवश्यकता होगी।

अद्यतन 2: प्रतिस्पर्धा के साथ, नया संस्करण अब वर्तमान खेल मैदान आयत के अंदर स्थिति का पक्ष नहीं लेता (जो कि 57 बाइट्स अतिरिक्त होगा)। यह विकल्प, साथ ही एक सरल गति अनुकूलन, सिम्युलेटर के साथ डाउनलोड करने योग्य संस्करण में डिफ़ॉल्ट रूप से सक्षम है, लेकिन नीचे दिए गए आधिकारिक उत्तर में नहीं है।

अद्यतन 3: प्रमुख बाइट गिनती लाभ के लिए मामूली इंटरफ़ेस परिवर्तन।

मैंने एक साधारण वेब UI भी बनाया है। पूरा पैकेज (एक एकल LISP फ़ाइल और टाइल चित्र) यहां डाउनलोड किया जा सकता है । आजमाएँ, स्थापित hunchentoot, zpngऔर png-readquiclisp, में लोड के साथ carcassonne.lisp, और करने के लिए कनेक्ट localhost:8080। कोड को सीसीएल / विंडोज और एसबीसीएल / लिनक्स पर परीक्षण किया गया है। उपर्युक्त पुस्तकालय केवल यूआई / सिम्युलेटर भाग के लिए आवश्यक हैं; इसका समाधान स्वयं सादा ANSI कॉमन लिस्प है।

(defun c(f p &aux b a s z(c 55))
  (macrolet((d(v l &body b)`(dotimes(,v,l),@b))
            (b(b c)`(d i c(d j c(setf,b,c))))
            (r(&rest p)`(aref,@p))
            (n(u v i j)`(and(setf l(*(f,u,v)l))
                            (find(r f(+,u,i)(+,v,j))`(0,(r f,u,v))))))
    (labels((p(p w)(d y(ceiling w 2)(d x(- w y y)(rotatef(r p y #6=(+ x y))(r p #6##7=(- w y))(r p #7##8=(- w x y))(r p #8#y)))))
            (a(y x)(or(if(= 0(r f y x))1 #4=(and(= 1(incf(r s y x)))(=(r f y x)z)(push`(,y,x)a)0))0))
            (f(y x)(setf z(r f y x))(if #4#(loop for((y x))= a while(pop a)maximize(+(a(1- y)x)(a y(1- x))(a(1+ y)x)(a y(1+ x))))1)))
      (d i 8(when(d x #1=(array-dimension f 0)(or(= 0(r f(- #1#52 i)x))(return t)))(setf f(adjust-array f`(#2=,(+ #1#c)#2#))))(p f(1- #1#)))
      (d i 4(d u #9=(/ #1#c)(d v #9#
        (let((y(* u c))(x(* v c))(l 9e9))
          (when(= 0(r f y x))
            (b #10=(r f(+ y i)(+ x j))(r p i j))
            (setf s(make-array`(,#1#,#1#))a())
            (ignore-errors(if(> #11=(*(loop for d from 1 to 53
                                            sum(+(n y #3=(+ x d)-1 0)(n #5=(+ y d)(+ 54 x)0 1)(n(+ 54 y)#3#1 0)(n #5#x 0 -1)))
                                      (1+ l))
                                (or(car b)0))
                             (setf b`(,#11#,i,y,x))))
            (b #10#0)))))
         (p p 54))
      (when b(d j(cadr b)(p p 54))(b(r f(+(third b)i)(+(nth 3 b)j))(r p i j)))
      `(,f,b))))

सभी लाइन फ़ीड और लाइन-स्टार्टिंग रिक्ति केवल सौंदर्य प्रसाधनों के लिए है, यह सुनिश्चित करने के लिए, और कुल योग में नहीं गिना जाता है।

आपको फ़ंक्शन cको दो तर्कों के साथ कॉल करना चाहिए : वर्तमान प्ले फ़ील्ड, और जगह पर टाइल। दोनों को 2 डी सरण होना चाहिए; टाइल 55x55 और क्षेत्र एक से अधिक है। इसके अतिरिक्त, फ़ील्ड सरणी समायोज्य होनी चाहिए। फ़ंक्शन नए फ़ील्ड के साथ दो-तत्व सूची को अपने पहले तर्क के रूप में देता है। दूसरा तत्व यह है NILकि यदि टाइल को रखा नहीं जा सकता है, या अन्यथा एक सूची जिसमें शीर्ष-बाएं निर्देशांक और उस सरणी पर नवीनतम टाइल का रोटेशन और स्कोर है। इस जानकारी का उपयोग विज़ुअलाइज़ेशन उद्देश्यों के लिए किया जा सकता है।

ध्यान दें कि आगे की कॉल में, आपको cदूसरी सूची तत्व होने पर भी दिए गए नए फ़ील्ड का उपयोग करना होगा NIL(मूल सरणी adjust-arrayएड और इस प्रकार अमान्य हो सकती है )।

कोड अब थोड़ा सा ओर है, बाइट काउंट ऑप्टिमाइज़ेशन जिसके परिणामस्वरूप निरर्थक गणनाएँ होती हैं। नीचे दिया गया उदाहरण मेरे सिस्टम पर लगभग तीन मिनट में पूरा हुआ।

सभी 85 टाइलों के लिए उदाहरण रन:

यहाँ छवि विवरण दर्ज करें

वेब UI स्क्रीनशॉट:

यहाँ छवि विवरण दर्ज करें


वर्तमान आयत के भीतर होने के लिए प्लेसमेंट का उल्लेख करना एक अच्छा विचार है। मैं देख रहा था कि अगर आप आसान रास्ता अपनाते हैं तो यह सांप हो जाता है।
बीएमएसी

जीतने वाला स्कोर नहीं, लेकिन आपको कुछ अच्छे नवाचारों के लिए इनाम मिलता है।
14

9

डार्कबेसिक प्रो: 2078 1932 1744 बाइट्स

अद्यतन: बस और अधिक गोल्फ प्रयास

अद्यतन: अब पूरी तरह से गैर-समापन विकल्प पसंद करने सहित कल्पना को पूरा करता है।

मैंने DarkBASIC को चुना क्योंकि जब यह क्रिया है, तो यह छवियों को हेरफेर करने के लिए एक बेहद सीधा और सरल आदेश प्रदान करता है।

मैंने उन लोगों के लिए एक EXE अपलोड किया है जिनके पास DarkBASIC कंपाइलर ( Windows ) नहीं है।

नमूना उत्पादन

#constant m memblock
#constant f function
#constant k endfunction
#constant z exitfunction
#constant i image
#constant e endif
#constant t then
#constant o or
#constant s paste image
#constant n next
#constant r for
set i colorkey 0,20,0:load i "map.png",1:f$="next.png"
if file exist(f$)=0 t f$=str$(rnd(24)+1)+".png"
load i f$,2:make m from i 1,1:make m from i 2,2
global ts,h,j,u,v,td
ts=i width(2):h=i width(1):j=i height(1):u=h/ts:v=j/ts:td=ts*2
create bitmap 2,h+td+1,j+td+1:r b=1 to 4:r xx=0 to u+1:r yy=0 to v+1:x=xx*ts-1:y=yy*ts-1
cls 5120:s 1,ts,ts,1:if (a(x+1,y) o a(x,y+1) o a(x-ts,y) o a(x,y-ts)) and a(x,y)=0
x1=ts*xx:y1=ts*yy:make i from m 2,2:s 2,x1,y1,1
cl=0:r fd=0 to 1:r x2=1 to ts-2:r yt=0 to 1:y2=yt*ts-yt:y3=yt*ts+yt-1
aa=x2:ab=x2:ba=y2:bb=y3:t2=y1:r t3=0 to 1:p=point(x1+aa,y1+ba):q=point(x1+ab,y1+bb)
if p<>q and rgbg(q)<>20 and t2+b>0 t goto fa
if fd and p<>0xFF0000
if l(x1+aa,y1+ba,p)=0 t cl=1
e
aa=y2:ba=x2:bb=x2:ab=y3:t2=x1:n t3:n yt:n x2:n fd:dn=1:c=xx-1:g=yy-1:make i from m 3,2:if cl=0 t goto dm
e
fa:
n y:n x
d=ts/2:r x=0 to d:r y=0 to d-1:vx=ts-1-x:vy=ts-1-y:t1=rd(x,y):t2=rd(vy,x):wr(vy,x,t1):t1=rd(vx,vy):wr(vx,vy,t2):t2=rd(y,vx):wr(y,vx,t1):wr(x,y,t2):n x:n y:n b
dm:
if dn=0 t report error "Not placed"
p=c<0:q=g<0:t1=h+ts*(p o c>=u):t2=j+ts*(q o g>=v):cls 5120:p=ts*p:q=ts*q:s 1,p,q,1:s 3,c*ts+p,g*ts+q,1:get i 1,0,0,t1,t2,1:save i "map.png",1
end
f l(x,y,w)
if x<0 o y<0 o x>=h+td o y>=j+td t z 1
p=point(x,y)
if rgbg(p)=20 t z 1
if p<>w t z 0
dot x,y,0xFF0000:rt=l(x+1,y,p) o l(x-1,y,p) o l(x,y+1,p) o l(x,y-1,p)
k rt
f rd(x,y)
w=m dword(2,0):b=m dword(2,12+(y*w+x)*4)
k b
f wr(x,y,d)
w=m dword(2,0):write m dword 2,12+(y*w+x)*4,d
k
f a(x,y)
if x<0 o y<0 o x>=h o y>=j t z 0
b=m byte(1,15+(y*h+x)*4)
k b
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.