Loopyソリューションの検証


9

これは、ルーピーパズルチャレンジを生成するための追加のチャレンジです。前のリンクのより難しいチャレンジを試みる前に、このチャレンジを解決することをお勧めします。

この課題の目標は、ルーピーパズルのソリューションを検証することです。前のリンクからルーピーパズルが何であるかに関するすべてのドキュメントを入手してください。解決されたルーピーパズルは、「ルーピーパズルの生成」チャレンジへの有効な提出の出力と非常に似た方法でフォーマットされ、次のようになります。

+-+-+ +-+ +-+ +
|   | | |2|3|  
+-+ + + + + +-+
 2| | | |2|  3|
+ + +-+ + + +-+
 2|  2 1|3| |  
+-+ +-+ +-+ +-+
|2  | |    1 2|
+ +-+ +-+ +-+ +
| |2 1 2|3|3| |
+ + +-+ +-+ +-+
| | |3|2   1   
+ +-+ +-+-+-+-+
|        2 2  |
+-+-+-+-+-+-+-+

ソリューションを構成するパスは、文字|と-文字の間の+文字でマークされています。

入力仕様

プログラムは、上記の例のようにフォーマットされたソリューションを入力として、ループパズルを受け取ります。プログラムは入力からパズルのサイズを推測します。入力について次の仮定を行うことができます。

  • パズルは、どちらの方向にも2セル以上99セル以下です
  • したがって、各行の最大長は199文字で、改行文字は含まれません。
  • したがって、入力には最大99行が含まれます
  • 各行は、最後の印刷可能な文字の後に終了するか、空白文字で埋められるため、2・y + 1文字までの長さになります。ここで、yは水平方向のセル数です。
  • x座標とy座標の両方を持つ各位置には+文字も含まれます
  • +文字を含む位置に水平または垂直に隣接する位置には、空白文字が含まれるか、行末にあるか、-水平に隣接する場合は文字が含まれ、|垂直に隣接する場合は文字が含まれます
  • 他のすべての位置が行の最後の後ろにされているか、のいずれかの文字が含まれている、0、1、2、または3
  • すべての行は、プラットフォームのデフォルトの改行文字で終了します
  • 末尾に改行が1つだけあります

入力は、次のいずれかの方法で受信されます。

  • 標準入力から
  • pHTTP POSTリクエストで指定されたパラメータの値として
  • HTMLフォームのコンテンツとして
  • p実装定義のディレクトリで名前が付けられたファイルのコンテンツとして
  • 前者の4つが利用できない場合、実行時に定義された実装方法で
  • 言語が入力を受け取る手段を提供しない場合はハードコード

出力仕様

プログラムは、入力仕様に一致するすべての入力に対して終了し、パズルの解が正しいかどうかを計算します。プログラムは、計算の結果を次のいずれかの方法でブール値として出力します。

  • ゼロ(解が有効)または非ゼロ(解が無効)の終了状況として
  • 文字y(解は有効)またはn(解は無効)の後に、実装で定義された方法で0個以上の任意の文字が出力される

入力仕様に従ってフォーマットされていない入力に遭遇したときのプログラムの動作は規定されていません。

得点

プログラムのスコアは、省略可能な空白文字と省略可能なコメントを除いて、ソース内の文字数です。他の人が読みやすいように投稿をインデントし、フォローしやすいようにソリューションにコメントを付けることをお勧めします。

入力または出力仕様に従わない、または不正な結果を生成する提出は無効です。


入力はどのように処理されますか?ファイルから読み取りますか?STDIN?関数を書くことはできますか?
— マーティンエンダー2014

@MartinBüttner "あなたのプログラムは...を受け取る" ファイルから読み取る理由がわかりません。
— John Dvorak

@MartinBüttner完全なプログラムを作成する必要があります。「あなたのプログラム」、「終了します」、「終了ステータス」という言葉はかなりはっきりしています。
— FUZxxl 2014

1
また、ほとんどのパズルで0は、セルの有効な数値でもあることに注意してください。
— ハワード

@ハワード申し訳ありませんが、それを逃しました。
— FUZxxl 2014

回答:


2

GolfScript、133文字

'|':^4,{48+.(}%+^*1>.^/'-'*+2/:F;4{{~@@/*}2F//n%zip-1%n*}:X*.'+-'?.3+@/(-2<' 9'+\+'9-+  99|+  9'3/:F;.,4*{X}*.9`?@=\' +09
'-!&'ny'1/=

STDINからの入力を予期yし、有効なソリューションとn無効なソリューションを出力します。グリッドでほとんど文字列置換を使用するか、グリッドの回転バージョンでタスクを実行します。

注釈付きコード:

# construct the string "|0|/|1|0|2|1|3|2-0-/-1-0-2-1-3-2"
# split into pieces of two and save to variable F
'|':^4,{48+.(}%+^*1>.^/'-'*+
2/:F;

# run the code block X 4 times
# with X: string-replace 1st item in F with 2nd, 3rd with 4th, ...
# i.e. '|0' with '|/', '|1' with '|0'
# and then rotate grid by 90 degrees
4{{~@@/*}2F//n%zip-1%n*}:X*

# for a valid grid all digits are now reduced to exactly '0'
# (i.e. no '1' or '2' or '3' or '/')

# now follow the loop along and remove it
# start: find the first occurence of '+-+' and replace with '+ 9'
# note: '9' is the marker for the current position
.'+-'?
.3+@/(-2<' 9'+\+

# string-replace '9-+' or '9|+' by '  9' (i.e. go one step along the loop)
# using block X enough times
'9-+  99|+  9'3/:F;
.,4*{X}*

# look for the marker '9' in the result and check if it is at the original
# position again
.9`?
@=

# the remaining grid must not contain any digits besides 0 and 9
# esp. no '|' or '-' may remain
\' +09
'-!

# check if both conditions are fulfilled and output corresponding character
&'ny'1/=

2

C#803 579バイト

STDINから読み取る完全なプログラムは、改行がある限り、一般的な改行スキームに対応する必要があります。別の質問に新しい行を追加する必要がないことを指摘し、ここで削除して4バイトを節約するように促すHackerCowに感謝

ゴルフしたコード:

using C=System.Console;class P{static void Main(){var D=C.In.ReadToEnd().Replace("\r","").Split('\n');int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;var B=new int[w,h];var S=new int[w*h*9];for(;i++<w-2;)for(j=0;j<h-2;B[i,j]=c)if((c=(D[j++][i-1]-8)%10)>5){c=5;T++;S[0]=i+j*w;}for(i=0;++i<w-1;)for(j=0;++j<h-1;)R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R;for(o=h=0;o<O;B[i,j]=0)if(B[i=(c=S[o++])%w,j=c/w]>4){h++;S[O++]=(S[O++]=c-w-1)+2;S[O++]=(S[O++]=c+w-1)+2;z=j%2<1?w*2:2;S[O++]=c-z;S[O++]=c+z;}C.Write(h-R<T?"n":"y");}}

コードは3つのチェックを実行します。最初に、各数値の周りのライン数をチェックし、各ジャンクションに0または2ラインが続くことを確認してから、すべてのラインを結合します。

書式付きコード:

using C=System.Console;

class P
{
    static void Main()
    {
        var D=C.In.ReadToEnd().Replace("\r","").Split('\n');
        int w=D[0].Length+2,h=D.Length+1,i=0,j,c,T=0,O=1,o,z,R=0;
        var B=new int[w,h]; // this is the grid
        var S=new int[w*h*9]; // this is a list of joined up lines (stored as x+y*w)

        for(;i++<w-2;)
            for(j=0;j<h-2;B[i,j]=c)
                if((c=(D[j++][i-1]-8)%10)>5)
                { // we are a line
                    c=5;
                    T++; // increment line counter
                    S[0]=i+j*w; // set start of loop
                }

        for(i=0;++i<w-1;) // this loop checks the numbers and that every + has 0 or 2 lines leading from it
            for(j=0;++j<h-1;)
                R=(i%2+j%2>1&(o=B[i,j-1]%2+B[i-1,j]%2+B[i+1,j]%2+B[i,j+1]%2)>0&o!=2)|((c=B[i,j])<4&c!=o)?7:R; // set R to 7 (no significance) if check fails

        for(o=h=0;o<O;B[i,j]=0) // this loops through the list of joined lines adding more until the whole loop has been seen
            if(B[i=(c=S[o++])%w,j=c/w]>4)
            {
                h++; // increment "seen" counter
                S[O++]=(S[O++]=c-w-1)+2;
                S[O++]=(S[O++]=c+w-1)+2;
                z=j%2<1?w*2:2; // special for | and -
                S[O++]=c-z;
                S[O++]=c+z;
            }

        C.Write(h-R<T?"n":"y"); // check if R is greater than 0 or h is less than T and output appropriately
    }
}

@ edc65、ありがとう
— VisualMelon 2014

1

コブラ-514ビデオ

class P
    def main
        t,m,g=[[1]][:0],nil,File.readAllLines('p')
        u,i=g[0].length,1
        for l in g.length,for c in u,if g[l][c]in'0123'
            n=0
            for j in-1:2:2,for r in[g[l+j][c],g[l][c+j]],if r in'-|',n+=1
            if'[n]'<>g[l][c],m?='n'
        else if g[l][c]in'-|',x,y,t,d=c,l,t+[[c,l]],g[l][c]
        while i
            i=z=6
            for f,b in[[-1,1],[1,1],[0,2],[-1,-1],[+1,-1],[0,-2]]
                if'-'==d,f,b=b,f
                for w in t.count,if z and t[w]==[x+f,y+b],t,x,y,d,z=t[:w]+t[w+1:],x+=f,y+=b,g[y][x],0
                i-=z//6
        print if(t.count,'n',m?'y')

すべての番号の隣に適切な数の行があるかどうかを確認し、行の周りのパスをたどり、見逃していないかどうかを確認します。

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