我的孩子的字母垫是否按颜色正确分组?


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

此外,每种颜色只有一组,因此这是无效的:

ABA
ABA

因为颜色A磁贴不仅仅分为一组。这也将无效,因为这些图块既不水平连接也不垂直连接:

AB
BA

挑战

给定一个可打印ASCII范围内的二维字符数组(只要两个维度的大小均等于或大于1,就不必是正方形),请检查该数组是否表示按颜色正确分组的垫子(数组中的每个字符都代表不同的颜色)。输入可以采用任何合理的格式,只要它表示二维字符数组(2D char数组,相同长度的字符串数组,依此类推),并且输出必须是一对真值和假值(0 / 1,'t'/'f',true / false,无论返回什么,并且返回值在输入中都保持一致)。

这是代码高尔夫,因此每种语言中最短的程序/函数/方法/ lambda可能会获胜!

例子

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
出于好奇,为什么不按字母数字顺序排列垫子?当然与挑战
无关

4
@cairdcoinheringaahing,因为这样我的特定OCD不会满意。:-)
查理

3
您的孩子继续成为挑战高尔夫挑战赛的灵感源泉:-)
Luis Mendo

2
为什么颜色必须用字符而不是其他输入(例如整数甚至像素)来表示?
乔纳森·艾伦

2
说到ocd,如果没有正确分类的垫子的图片,这项挑战就不会完成
Jonah

Answers:


6

MATL16 15字节

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

输入是2D char数组(行之间用分隔;)。输出是0如果输入符合条件,或1以其他方式。

在线尝试!验证所有测试用例

说明

代码本质上考虑了4连接性(即,没有对角线),检查输入中的每个字符是否只有一个连接的组件。

重复的字符将被重复处理(这比重复数据删除要复杂得多)。

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所说的一切。我还是线路计数错误吗?也许明天我可以进一步缩短它
Jo King

2

J,66个字节

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

c定义一个动词,它告诉你,如果一和零的矩阵Ç onnected。它将单身人士视为true的特例。否则,它将对每个像元进行正交的邻居计数,然后对该计数进行计数,然后将其与原始矩阵相乘:如果该乘积等于原始矩阵,则将其连接。

邻居计数是通过在所有四个方向上移动然后求和来实现的。使用“ x-arg can by a table”的旋转/移位功能可实现4个方向的移位|.

最后,答案本身是通过为输入的每个唯一 ~.元素创建一个1/0矩阵,然后确保所有这些矩阵都已连接而实现的。这是第二行中的动词。

在线尝试!


2

JavaScript(ES6),114个字节

将输入作为字符串数组。返回01

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(''))}

只要找到新的彩色图块,就用空字符串填充连接的图块。如果垫子按颜色正确分组,则所有瓷砖都应填充空字符串。

测试码


您的程序如何接受输入?
Stan Strum,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.