मैला कुर्ता-मछली साफ करें


27

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

पृष्ठभूमि

समुद्र की सबसे गहरी खाइयों में, एक दुर्लभ और मायावी चौकोर आकार की मछली रहती है जिसे क्वार्टेट-मछली कहा जाता है । यह गेम ऑफ लाइफ सेलुलर ऑटोमेटन से ग्लाइडर की तरह दिखता है । यहाँ विभिन्न आकारों की दो चौथाई मछली हैं:

-o-
--o
ooo

--oo--
--oo--
----oo
----oo
oooooo
oooooo

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

इनपुट

आपका इनपुट अक्षरों का एक आयताकार 2D ग्रिड है .-o#, जिसे एक नई लाइन-अलग स्ट्रिंग के रूप में दिया गया है। यदि आप चाहें, तो आप |विभाजक के रूप में नईलाइन्स के बजाय पाइप का उपयोग कर सकते हैं , और आप एक अनुगामी और / या पूर्ववर्ती विभाजक मान सकते हैं।

इनपुट में कुछ ओर-लंबाई की बिल्कुल एक चौथाई मछली होगी 3*n, जहां n ≥ 1एक सकारात्मक पूर्णांक होता है, .जो समुद्र तल का प्रतिनिधित्व करने वाली अवधि से घिरा होता है। मछली हमेशा ऊपर दर्शाए गए अभिविन्यास में होगी। इस ग्रिड पर ओवरलैड, हैश के बिल्कुल एक गैर-खाली आयताकार क्षेत्र होगा #, जो कीचड़ की एक बूँद का प्रतिनिधित्व करता है। बूँद आंशिक रूप से या पूरी तरह से क्वारता-मछली को कवर कर सकती है। एक उदाहरण इनपुट होगा

............
..--oo--....
..--oo--....
..---#####..
..---#####..
..ooo#####..
..oooooo....

उत्पादन

आपके आउटपुट को वर्णों के साथ सभी हैश को बदलकर इनपुट से उत्पन्न किया जाएगा .-o, ताकि ग्रिड में बिल्कुल एक चौथाई-मछली हो। इस प्रतिस्थापन को ठीक से करने का एक अनूठा तरीका हमेशा रहेगा; विशेष रूप से, कीचड़ की बूँद मछली को पूरी तरह से तभी ढकेगी जब उसका आकार 3 × 3 हो। आउटपुट इनपुट के समान विभाजक का उपयोग करेगा। उपरोक्त इनपुट के लिए, सही आउटपुट होगा

............
..--oo--....
..--oo--....
..----oo....
..----oo....
..oooooo....
..oooooo....

नियम और स्कोरिंग

आप एक पूर्ण कार्यक्रम या एक फ़ंक्शन लिख सकते हैं। सबसे कम बाइट गिनती जीतता है, और मानक खामियों को रोक दिया जाता है। कोई समय सीमा नहीं हैं: यदि आपका सबमिशन अंततः असीमित समय और संसाधनों को रोक देगा, तो आप ठीक हैं।

परीक्षण के मामलों

Input:
.......
...-o-.
...--o.
##.ooo.
##.....
Output:
.......
...-o-.
...--o.
...ooo.
.......

Input:
...-o-.
...-#o.
...ooo.
.......
Output:
...-o-.
...--o.
...ooo.
.......

Input:
.........
.###.....
.###.....
.ooo.....
Output:
.........
.-o-.....
.--o.....
.ooo.....

Input:
.....
.###.
.###.
.###.
Output:
.....
.-o-.
.--o.
.ooo.

Input:
......
......
......
...###
...###
...###
Output:
......
......
......
...-o-
...--o
...ooo

Input:
###o--....
###o--....
###-oo....
###-oo....
###ooo....
###ooo....
###.......
Output:
--oo--....
--oo--....
----oo....
----oo....
oooooo....
oooooo....
..........

Input:
............
..--oo--....
..--oo--....
..---#####..
..---#####..
..ooo#####..
..oooooo....
Output:
............
..--oo--....
..--oo--....
..----oo....
..----oo....
..oooooo....
..oooooo....

Input:
...--oo--....
.#########...
.#########...
.#########...
...oooooo....
...oooooo....
.............
.............
Output:
...--oo--....
...--oo--....
...----oo....
...----oo....
...oooooo....
...oooooo....
.............
.............

Input:
..............
..............
.########.....
.########.....
.########-....
.########-....
.########o....
.########o....
.########o....
.########o....
.########.....
..............
Output:
..............
..............
..............
..............
....--oo--....
....--oo--....
....----oo....
....----oo....
....oooooo....
....oooooo....
..............
..............

Input:
.................
.................
..---ooo---......
..--#########....
..--#########....
..--#########....
..--#########....
..--#########....
..oo#########....
..oo#########....
..oo#########....
....#########....
Output:
.................
.................
..---ooo---......
..---ooo---......
..---ooo---......
..------ooo......
..------ooo......
..------ooo......
..ooooooooo......
..ooooooooo......
..ooooooooo......
.................

Input:
.........................
.........................
....----oooo----.........
....----########.........
....----########.........
....----########.........
....----########.........
....----########.........
....----########.........
....----########.........
....oooo########.........
....oooo########.........
....oooooooooooo.........
....oooooooooooo.........
.........................
Output:
.........................
.........................
....----oooo----.........
....----oooo----.........
....----oooo----.........
....----oooo----.........
....--------oooo.........
....--------oooo.........
....--------oooo.........
....--------oooo.........
....oooooooooooo.........
....oooooooooooo.........
....oooooooooooo.........
....oooooooooooo.........
.........................

क्या यह ठीक है अगर प्रवेश की संभावना है तो यह (खराब यादृच्छिकता) समाप्त नहीं होगा, हालांकि इसकी संभावना बेहद कम है? क्या आपको एकल न्यूलाइन-पाइप के अलावा वर्ण बदलने की अनुमति है?
ब्लू '

@muddyfish पहले प्रश्न के लिए हाँ (इसे अंततः 1 की संभावना के साथ समाप्त करना चाहिए, एकदम सही यादृच्छिकता मानकर, लेकिन सैद्धांतिक रूप से हमेशा के लिए चल सकता है), दूसरा नहीं (वर्ण निश्चित हैं)।
ज़गर्ब

तो 0.9 आवर्ती ठीक होने की संभावना है?
ब्लू

@muddyfish यदि आप लूप में रैंडम ग्रिड बना रहे हैं, जब तक कि वह फिट न हो जाए, ठीक है।
ज़र्गब

महत्वपूर्ण परीक्षण मामला: ......|......|......|...###|...###|...###(यदि कोई समाधान सभी संभव शीर्ष-बाएँ निर्देशांक की कोशिश करता है, और क्षेत्र पर एक 6x6 फिट करने की कोशिश करता है)
Sp3000

जवाबों:


9

पायथन 2, 433 411 बाइट्स

import re;i,o,l,j=input(),range,lambda s,r:s.replace(*r),"".join;i=l(l(l(i,".1"),"#."),"| ");s=o(len(i))
for x in s:
 for y in s:
    for q in s:
     r=map(list,l(l(i,"o."),"-.").split(" "))
     try:
        for v in o(q):r[x+v][y:y+q]=["".join(c*(q/3)for c in b)for b in["-o-","--o","ooo"]][3*v/q]
        m=re.match(i," ".join(j(i)for i in r))
     except:0
     if sum("-"in p for p in r)and m:print"|".join(l(j(i),"1.")for i in r);_

ए के साथ बाहर निकलता है NameError। इनपुट पाइप अलग हो गया।

मैं यहां टैब और स्पेस मिला रहा हूं। एसई टैब को ठीक से प्रस्तुत नहीं करता है।

'###o--....|###o--....|###-oo....|###-oo....|###ooo....|###ooo....|###.......'
 --oo--....|--oo--....|----oo....|----oo....|oooooo....|oooooo....|..........

'.....|.###.|.###.|.###.'
 .....|.-o-.|.--o.|.ooo.

'...-o-.|...-#o.|...ooo.|.......'
 ...-o-.|...--o.|...ooo.|.......

(नोट शुरू में अतिरिक्त स्थान केवल सावधानी के लिए हैं और वास्तव में मुद्रित नहीं हैं)


आप अपने कोड में अतिरिक्त टैब से छुटकारा पा सकते हैं और उन्हें कुछ बाइट्स में कटौती करने के लिए सिंगल स्पेस के साथ बदल सकते हैं (अर्थात, यदि आपने अपने कोड में बाइट्स को गिनते समय सफेद स्थान को ध्यान में रखा था)।
आर। काप

4

जावास्क्रिप्ट (ईएस 6), 291 बाइट्स

g=>eval('w=g.search`\n`;h=g.length/w|0;for(n=(w<h?w:h)/3|0;s=n*3;n--)for(x=w+1-s;x--;)for(y=h+1-s;y--;[...g].every((c,i)=>c==o[i]|c=="#")?z=p:0)for(p="",i=h;i--;)p=(l=[,"-o-","--o","ooo"][(i-y)/n+1|0],l?"."[t="repeat"](x)+l.replace(/./g,c=>c[t](n))+"."[t](w-x-s):"."[t](w))+(p?`\n`:"")+p;z')

व्याख्या

इनपुट ग्रिड को न्यूलाइन से अलग स्ट्रिंग के रूप में लेता है। पूरी तरह से गोल्फ नहीं, समय मिलने पर और करूंगा।

यह इसके द्वारा काम करता है:

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

var solution =

g=>
  eval(`

    // Get size of input grid
    w=g.search\`\n\`;
    h=g.length/w|0;

    // Check every possible size (n) and position (x and y) of fish
    for(n=(w<h?w:h)/3|0;s=n*3;n--)
      for(x=w+1-s;x--;)
        for(y=h+1-s;y--;

          // Check if possible solution matches input grid
          [...g].every((c,i)=>c==p[i]|c=="#")?z=p:0
        )

          // Create possible solution grid
          for(p="",i=h;i--;)
            p=(
              l=[,"-o-","--o","ooo"][(i-y)/n+1|0],
              l?
                "."[t="repeat"](x)+
                l.replace(/./g,c=>c[t](n))+
                "."[t](w-x-s)
              :"."[t](w)
            )+(p?\`\n\`:"")+p;
    z
  `)
<textarea id="input" rows="6" cols="40">..............
..............
.########.....
.########.....
.########-....
.########-....
.########o....
.########o....
.########o....
.########o....
.########.....
..............</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


4

पायथन 2, 325 बाइट्स

def f(s):
 s=map(list,s.split());R=range;L=len(s);M=len(s[0])
 for h in R(L/3*3,0,-3):
  for x in R(M-h+1):
   for y in R(L-h+1):
    if all(s[v%L][v/L]in".-#o #"[0<=v%L-y<h>v/L-x>=0::2]for v in R(L*M)):
     for k in R(h*h):s[y+k/h][x+k%h]="-o"[482>>k/h*3/h*3+k%h*3/h&1]
     return'\n'.join(map(''.join,s)).replace('#','.')

अब के लिए एक बुरी तरह से गोल्फ समाधान - for .. in range(...)एस एक पूरी ट्रेन मलबे हैं। इनपुट / आउटपुट न्यूलाइन अलग किए गए तार।

बाइट की गिनती वर्तमान में केवल स्पेस इंडेंट मानती है - यदि आवश्यक हो, तो मैं बाद में मिश्रित टैब / स्थान पर जाऊँगा जब मैं गोल्फ कर रहा हूँ।

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