戊糖验证器


9

作为一个不介意查看他们的五角星形以查看其是否为矩形的人,我决定让您编写一个执行此操作的程序。

你的任务

给定一些输入,并用包含12个唯一字符的换行符分隔,请确定这是否是有效的解决方案。

有效的解决方案必须

  • 每个字符有5个(换行符除外)
  • 每组字符必须完全连接
  • 每组字符必须具有唯一的形状
  • 呈规则的矩形

如果这是有效的解决方案,请输出真实值,否则输出错误值。

您的程序可以是函数,也可以是完整程序,但必须将输入从stdin输入并输出到stdout。

测试用例

有效的解决方案

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

无效的配置

invalid (doesn't contain 12 unique characters)

111112222233333444445555566666
77777888889999900000qqqqqwwwww (Each set has the same shape)

1234567890qw
w1234567890q
qw1234567890
0qw123456789
90qw12345678 (None of the characters are connected)

1234567890qw (Not 5 characters in every set)

1111122222333334444455555666666
77777888889999900000qqqqqwwwwww (More than 5 characters in some sets)

00
0                   
00.@@@ccccF111//=---
 ...@@c))FFF1//8===-
  .ttttt)))F1/8888=- (Doesn't form a rectangular shape)

1. Pentomino的反射形状是否与原始反射相同?2.我们是否可以假设输入将包含可打印的ASCII字符和换行符?
丹尼斯

@Dennis是和是
蓝色

@DigitalTrauma这不是远程复制。顺便说一句,这是一个非常棒的问题,可惜我没时间回答新问题。
水平河圣

@steveverill你是对的-我没有正确阅读此问题
Digital Trauma

Answers:


3

的JavaScript(ES6),237个 235 222字节

f=p=>(m=[],s=[],d=0,l=p.indexOf`
`+1,[...p].map((c,i)=>(i+1)%l&&!m[i]?g=d-2<s.indexOf((t=a=>m[a]|p[a]!=c?r=0:(m[a]=y.push(a),n=a<n?a:n,t(a+1)+t(a-1)+t(a+l)+t(a-l)+1))(n=i,y=[])!=5?g=0:s[d++]=y.map(a=>r+=a-n)|r):0),d==12&g)

感谢@DankMemes节省了2个字节!

用法

f(`000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!`);
=> true

说明

关于此解决方案的一些注意事项:

  • 该答案可能无效。它实际上不检查旋转的戊米诺骨是否具有相同的形状,但是我尝试但找不到符合规则要求并包含两个或多个相同形状的旋转的有效戊米诺骨形。但是我不是pentomino专家,所以如果您找到有效的组合,但失败了,请告诉我。
  • 这些规则还需要使用答案STDIN以及STDOUT用于输入和输出的规则,但prompt()仅适用于单行输入,而我的(Windows)计算机\r\n在粘贴时会在每行新行中自动放置字符,因此我将其设置为接受字符串的函数。
f=p=>(
  m=[],                      // m = map of checked characters
  s=[],                      // s = list of shapes found (stored as integer)
  d=0,                       // d = number shapes found
  l=p.indexOf`
`+1,                         // l = length of each line (including newline character)
  [...p].map((c,i)=>         // iterate through each character of the input
    (i+1)%l&&                // skip newline characters
      !m[i]?                 // skip the character if it has already been mapped
        g=                   // g = pentomino is valid
          d-2<s.indexOf(     // check if shape already existed before just now
            (t=a=>           // t() checks if character is part of the shape then maps it
              m[a]|          // skip if character is already mapped
                p[a]!=c      //    or if the current character is part of the shape
              ?r=0:(
                m[a]=        // mark the character as mapped
                  y.push(a), // y = list of shape character indices
                n=a<n?a:n,   // n = minimum index of all characters in the shape
                t(a+1)+      // check and map adjacent characters
                t(a-1)+
                t(a+l)+
                t(a-l)+
                1
              )
          )(n=i,y=[])
            !=5?g=0:         // make sure there are only 5 characters in the shape
            s[d++]=          // add the shape to the list
              y.map(a=>      // sum of (index of each character in the shape - minimum
                r+=a-n)|r    //     index) = unique integer representing the shape
        ):0
  ),
  d==12&g                    // ensure there is 12 shapes and return the 'is valid' result
)

1
您可以滥用标记的模板l=p.indexOf`<newline here>`来节省2个字节
DankMemes 2015年

@DankMemes感谢您的收获!我写这本书的时候真的很累,还没有仔细检查过。:P
user81655
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.