濁ったクワタタ魚をきれいにする


27

この課題は、年カテゴリの受賞者のルーキーの名誉であるPPCG 2015のベストmuddyfish(のために!私はあなたが探している言語ではありませんよ)とquartata(のために真実-マシンを実装します)。おめでとうございます!

バックグラウンド

海の最も深い海溝には、珍しいとらえどころのない四角い魚が生息しています。Game of Lifeセルラーオートマトンのグライダーのように見えます。以下に、サイズの異なる2つのクオタタ魚を示します。

-o-
--o
ooo

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

あなたは何とかクオタタ魚の写真を撮ることができましたが、魚は泥で覆われているので見るのはかなり難しいです。ここで、写真をクリーンアップするプログラムを作成する必要があります。

入力

入力は、.-o#改行で区切られた文字列として指定された、文字の長方形の2Dグリッドです。必要に応じ|て、区切り文字として改行の代わりにパイプを使用できます。1つの末尾および/または先行区切り文字を想定できます。

入力には、海辺を表す周期で囲まれた正の整数である3*n、辺の長さの1つのクオタタ魚が含まn ≥ 1れます.。魚は常に上記の向きになります。このグリッド上にオーバーレイされると、ハッシュの空でない長方形の領域が1つだけ存在し#、泥の塊を表します。ブロブは、クオタタ魚を部分的または全体的に覆うことがあります。入力例は次のようになります

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

出力

すべてのハッシュを文字.-oで置き換えることにより、入力から出力が生成されます。これにより、グリッドに正確に1つの四角魚が含まれるようになります。この置換を適切に実行するための独自の方法が常にあります。特に、泥の塊は魚のサイズが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で終了する必要がありますが、完全にランダムであると仮定しますが、理論的には永遠に実行される可能性があります)。
-Zgarb

0.9の再発確率は大丈夫ですか?
ブルー

@muddyfishループが収まるまでランダムなグリッドを生成する場合、それは問題ありません。
-Zgarb

重要なテストケース:(......|......|......|...###|...###|...###ソリューションがすべての可能な左上座標を試行し、6x6を領域に
合わせよ

回答:


9

Python 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ます。入力パイプを分離します。

ここではタブとスペースを混在させています。SEはタブを適切にレンダリングしません。

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

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

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

(開始時の余分なスペースは可愛らしさのためだけであり、実際には印刷されません)


コード内の余分なタブを取り除き、単一のスペースに置き換えて数バイトを削減できます(つまり、コード内のバイトをカウントするときに空白を考慮した場合)。
R.ガプス

4

JavaScript(ES6)、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

Python 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(...)sは完全な列車大破です。改行で区切られた文字列を入出力します。

現在、バイトカウントはスペースのインデントのみを想定しています。必要に応じて、ゴルフが終わったら後でタブ/スペースの混合に切り替えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.