子供のアルファベットマットは色別に適切にグループ化されていますか?


14

私の子供には、次のようなアルファベットマットがあります。

アルファベットマット

数か月後、マットのタイルをランダムに配置した後、疲れて、背景色に応じてセクションごとにグループ化されたマットのタイルをすべて配置しました。したがって、文字が背景色を表す場合、次のようなマットができました。

AABBCDDDE
ABBCCCDEE
ABCCCCDDE
AACCCDDEE
AAAACCCCE
AAAAAACCC

したがって、A、B、C、D、およびEの色については、マット内のすべてのタイルを同じ背景色で水平または垂直に接続する方法が常にあります。それは私が色によって適切にグループ化されたマットと呼ぶものです。次の表で、前の例のグループを確認できます。

AA
A
A
AA
AAAA
AAAAAA

  BB
 BB
 B

    C
   CCC
  CCCC
  CCC
    CCCC
      CCC

     DDD
      D
      DD
     DD

        E
       EE
        E
       EE
        E

また、すべての色に対して1つのグループしかないため、これは無効です。

ABA
ABA

カラーAタイルは1つのグループのみにグループ化されていないためです。また、タイルは水平または垂直に接続しないため、これも無効になります。

AB
BA

チャレンジ

印刷可能なASCII範囲の文字の2次元配列(両方の次元のサイズが1以上である限り正方形である必要はありません)が与えられている場合、配列が色で適切にグループ化されたマットを表すかどうかを確認します(配列内の異なる文字はそれぞれ異なる色を表します)。入力は、文字の2次元配列(2D char配列、同じ長さの文字列の配列など)を表す限り、任意の妥当な形式であり、出力は、真偽値と偽値(0 / 1、 't' / 'f'、true / false、何かが返され、戻り値が入力間で一貫している限り)。

これはコードゴルフなので、各言語の最短のプログラム/関数/メソッド/ラムダが勝つかもしれません!

A    truthy

AB
AB   truthy

AB
BA   falsey

ABCDE    truthy

ABCDC    falsey

**::dd22
***:d222
*:::::22    truthy

$$$%%%&&
$$%%&&&&
&&$$$%&&    falsey

AABBCDDDE
ABBCCCDEE
ABCCCCDDE
AACCCDDEE
AAAACCCCE
AAAAAACCC   truthy

AABB
ABBA
AAAA    truthy

AAAB
AAAA
AAAA    truthy

色別に適切にグループ化されたマット

色別に適切にグループ化されたマット

(まだこれらの境界線を修正する必要があります...)


1
好奇心から、マットを英数字順に並べてみませんか?当然の挑戦とは何の関係もない、ただ不思議
caird coinheringaahing

4
@cairdcoinheringaahingは、私の特定のOCDが満たされないためです。:
チャーリー

3
あなたの子供たちは、コードゴルフの挑戦のインスピレーションの源であり続けます:
ルイスメンドー

2
他の入力(整数やピクセルなど)ではなく、文字で色を表現する必要があるのはなぜですか?
ジョナサンアラン

2
OCDと言えば、この課題は適切にグループ化されたマットの写真なしでは完了しません。
ジョナ

回答:


6

MATL16 15バイト

1e"G@=4&1ZI1>vzg

入力は2D文字配列です(行はで区切られています;)。出力は0、入力が適格であるか、1そうでない場合です。

オンラインでお試しください!または、すべてのテストケースを確認します

説明

コードは、4つの接続性(つまり、対角線がない)を考慮して、入力の各文字に接続されたコンポーネントが1つだけかどうかを本質的にチェックします。

繰り返される文字は繰り返し処理されます(重複排除よりもゴルファーです)。

1e       % Implicit input. Reshape into a row vector of chars
"        % For each char
  G      %   Push input again
  @      %   Push current char
  =      %   Equal (element-wise)? Gives a matrix of zeros and ones, where one
         %   represents the presence of the current char
  4      %   Push 4. This will indicate 4-connectivity
  &1ZI   %   Matrix with labels of connected componnents. Inputs are a number (4)
         %   to indicate connectivity, and a binary matrix. The output is a matrix
         %   the same size as the input where each connected componnent of ones
         %   in the input is replaced by a different integer starting at 1
  1>     %   Greater than 1 (element-wise)? The result is a matrix. If the result 
         %   is true for some entry the input doesn't qualify
  v      %   Concatenate vertically with results from previous iterations
  z      %   Number of nonzero/true values
  g      %   Logical. Converts nonzero to true
         % Implicit end. Implicit display. False / true are displayed as 0 / 1

3

Befunge-93、317バイト

編集:適切なバイト数に修正。また、さらにゴルフすることができます

93+:10pv  +93p01+1g01_  v@.1<
gp00g1+>00p~1+:93+`!#^_1-00g10
50p93+:vv_v#!:gg03:p02:<>40p#
!`g01: <>\ 1+:vvp05:+<@^p03_^#
v93$_v# !- g00<4v04g<^1<vp06:<
>+\!\>\ 3v> 40v0>g-v^<.g>:70vp
07_v#:<^ >#+0# g#\<  10\v4gg<^
!#v _$^  g03p <\ v1_#:^5>0g  -
   <    ^ g02p1< >-:#^_^#:g05
-1<   ^p\g06\0\+1:\g06\-1:\g06:\+1g06:g07

真実として1、偽として0を出力します

オンラインで試す

これは、ポインターがたどるパスの視覚化です

ファンシーカラー!

注:これは古いバージョン用です


使い方

ここにいくつかの簡単で汚い擬似コードがあります

a = 2Darray() # from 12,12 down and to the right
arrayLocation = 12
x = arrayLocation #stored at 0,0
y = arrayLocation #stored at 1,0
i = input()       #stored in the stack
while (i != 0):
    if (i == 10):
        y++
        x = init
    else
        a[x][y] = i
        x++
    i = input

new.x = init    #stored at 2,0
new.y = init    #stored at 3,0

currentChar = 0    #stored at 4,0
chars = array()    #stored at 1,1 onwards
charnum = 0        #stored 5,0
ToCheck = array()  #stored in the stack

current.x = null   #stored at 6,0
current.y = null   #stored at 7,0

while (new.y < y):
    if (a[new] != 0)
        currentChar = a[new]
        toCheck[] = new
        while (toCheck)
            current = toCheck.pop()
            if (a[current] == currentChar)
                toCheck.append(adjacent(current))
                a[current] = 0
        foreach (chars as char)
            if (char == currentChar)
                return 0
        charNum++
        chars[charNum] = char
    new.x++
    if (new.x > x)
        new.x = init
        new.y++

return 1

基本的に、入力を保存した後、各スペースをチェックしてすべてを処理します。文字が入っているスペースを見つけると、スタックに座標を追加します。次に、同じ文字の周囲のスペースを再帰的にチェックし、各スペースを0に設定します。その文字のセクションを使い果たすと、その文字にすでにセクションがあるかどうかをチェックします。そうであれば、0を返します。そうでなければ、文字の配列に追加します。重複することなくグリッド全体を通過すると、1を返します。

Befungeに精通している人のために、ここにコードの間隔をあけたバージョンがあります

96+:10p    v    +69p01+1g01_v
`+96:+1~p00<+1g00pg01g00-1_^#
v                           <
>40p50p96+:v                ^
v    @.1<  >
>:10g `#^_30p:20p:30gg:#v_$>1+:00g-!#v_0   >30g+
v                       <  ^         >$96+1^
>40p30gv                   ^
       >:!#v_70p:60p:70gg40 g-!#v_$>
           v               ^     > ^
1:\g06\+1:g 07\g07\-1:\g07\ +1: <^p\g06\0\-
v          <               ^
>50gv   >5\g1+:50p40g\1p20g^
    >:!#^_:1g40g-!#v_1-
                   >0.@

正直に言うと、337バイトとカウントすべきだと思います。それ以外の場合、ファイル自体にコードの次元をどのように指定しますか?改行もカウントする必要があります。
NieDzejkob

@NieDzejkobええ、私はそれ以来、バイト数をカウントする方法を変更し、TIOの言うことをすべて順守しました。とにかく行カウントが間違っていましたか?たぶん明日、それをもう少し短くするつもりです
ジョーキング

2

J、66バイト

c=.1=+/@,+.]-:]*[:*@+/((,|."1)0,.1 _1)&(|.!.0)
[:*/[:c"2[="_ 0~.@,

cゼロの行列である場合は、あなたに伝え動詞定義Cを onnected。シングルトンのものを特別なtrueのケースとして扱います。それ以外の場合は、すべてのセルの直交ネイバーカウント、次にそのカウントの符号を取り、それを元のマトリックスと乗算します。その積が元のマトリックスと等しい場合、接続されます。

ネイバーカウントは、4つの方向すべてにシフトしてから合計することで達成されます。4方向のシフトはx、回転/シフトの「-arg can by a table」機能を使用して実現されます。|.

最後に、答え自体は、入力の一意の ~.要素ごとに1/0マトリックスを作成し、それらのマトリックスがすべて接続されていることを確認することで実現しました。これは2行目の動詞です。

オンラインでお試しください!


2

JavaScript(ES6)、114バイト

入力を文字列の配列として受け取ります。0またはを返します1

a=>(C={},F=x=>!C[c=a[y][x]]|(g=v=>(a[y+v]||[])[x]==c)(-1)|g(1)|g(0,x--)|g(0,x+=2)?a[y+=!c]?F(C[c]=c?x:0):1:0)(y=0)

テストケース

フォーマットおよびコメント

a => (                            // given an array of strings a
  C = {},                         // C = object holding encountered characters
  F = x =>                        // F = recursive function taking x:
    !C[c = a[y][x]]               //   c = current character; is it a new one?
    | (g = v =>                   //   g = helper function taking v
        (a[y + v] || [])[x] == c  //       and testing whether a[y + v][x] == c
      )(-1)                       //   test a[y - 1][x]
    | g(1)                        //   test a[y + 1][x]
    | g(0, x--)                   //   test a[y][x - 1]
    | g(0, x += 2) ?              //   test a[y][x + 1]; if at least one test passes:
      a[y += !c] ?                //     increment y if c is undefined; if a[y] exists:
        F(C[c] = c ? x : 0)       //       update C, update x and do a recursive call
      :                           //     else:
        1                         //       all characters have been processed -> success
    :                             //   else:
      0                           //     invalid character detected -> failure
)(y = 0)                          // initial call to F, starting with x = y = 0

1

Wolfram言語(Mathematica)、96バイト

And@@(ConnectedGraphQ@Subgraph[GridGraph@Dimensions[t],Tr/@Position[c,#]]&/@(c=Join@@(t=#)))&

オンラインでお試しください!

入力を文字の2Dリストとして取得します(例:){{"A","B"},{"C","D"}}

文字があります\[Transpose]

使い方

各文字についてcの入力で、取るSubgraphGridGraphと同じのDimensionsすべてのに対応する入力として、Positionその中でc、それはだ場合に発生し、チェックをConnectedGraphQ


1

Python 2、247バイト

def f(a):
 b=map(list,a.split('\n'));l=len(b[0])
 for c in set(a):i=a.find(c);g(b,i/l,i%l,c)
 print all(set(l)<={0}for l in b)
def g(a,i,j,c):
 if len(a)>i>-1<j<len(a[0])and a[i][j]==c:
	for x,y in(0,1),(0,-1),(1,0),(-1,0):g(a,i+x,j+y,c);a[i][j]=0

オンラインでお試しください!


1

JavaScript(ES6)、181バイト

(d,o={})=>{f=(i,j,c,l=d[i])=>{if(c&&l&&l[j]==c){l[j]='';f(i-1,j,c);f(i+1,j,c);f(i,j-1,c);f(i,j+1,c);o[c]=1}};d.map((e,i)=>e.map((c,j)=>o[c]||f(i,j,c)));return!d.some(e=>e.join(''))}

新しい色のタイルが見つかるたびに、接続されているタイルを空の文字列で埋めます。マットが色別に適切にグループ化されている場合、すべてのタイルに空の文字列を入力する必要があります。

テストコード


プログラムはどのように入力を受け取りますか?
スタンストラム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.