六面体:Validagons


13

挑战

给定ASCII艺术形状,您必须找出形状是否为正六边形。

六边形

使用两个规则定义正六边形:

  • 它有六个侧面
  • 每边有相等数量的字符

例如,以下形状是规则的,但没有六个边,因此不是规则的六边形

B a a h
s a i d
y o u r
g a o t

类似地,以下形状具有六个边,但是具有不同长度的边,因此不是六边形:

  * *
 * * *
* * * *
 * * *
  * *

但是,以下形状具有六个边,并且所有边均具有相同数量的字符,因此它是正六边形:

  T h e
 h e x a
g o n s a
 r e c o
  m i n

规则

输出应为真或假值(如果形状为正六边形则为真,否则为假)。

形状将仅包含可打印的ASCII字符。

形状的边界将永远不会包含空格。如果是这样,则可以返回false。

形状之前和/或之后可以有任意数量的空格。

形状中的所有角度可能不相等,例如,以下形状是有效输入:

  . . .
   . . .
. . . . .
 . . . .
  . . .

它将返回一个假值。

所有形状输入都将在空间分隔的网格上。六角形输入将在交错网格上(每条线都从下一行偏移)。

例子

特鲁西

以下形状应返回真实值:

 # _
+ + +
 9 :

  5 6 7
 8 9 0 1
2 3 4 5 6
 7 8 9 0
  1 2 3

    t h i s
   i       s
  a         h
 e           x
  a         g
   o       n
    ! ! ! !

    5 6 7
   8 9 0 1
  2 3 4 5 6
   7 8 9 0
    1 2 3

虚假

以下应返回假值

r e c t a
n g l e s

  h e l l o
 w o r l d s
t h i s i s b
 e t a d e c
  a y n o w

  *
 * *
* * *

  .....
 .......
.........
 .......
  .....

此形状不在空间分隔的网格上,也不交错。


   * * * *
  ---------
 * * * * * *
-------------
 * * * * * *
  ---------
   * * * *

5 6 7
8 9 0 1
2 3 4 5 6
7 8 9 0
1 2 3

对于单字符输入,您的程序可能会输出真或假:

&

获奖

以字节为单位的最短程序获胜。


4
Mathematica一线班机来了。
ThreeFx

1
我认为您可能想添加两个测试用例:例如,一个不带前导空格的测试用例:5 6 7\n8 9 0 1\n2 3 4 5 6\n7 8 9 0\n1 2 3和一个对一行中的一行有一个额外的空格领导的测试用例:(以这种无格式的形式ss5 6 7\nss8 9 0 1\n2 3 4 5 6\ns7 8 9 0\nss1 2 3替换了前导空格s以使其更加清晰) 。您的所有10个测试用例当前都已使用我的代码正确验证,但是使用我使用的方法,这两种情况将失败。
凯文·克鲁伊森

带有句号的示例是否一定是虚假的?丢失的时间段是一个空格,它是可以构成六边形的有效字符之一,
Ton Hospel

1
@TonHospel我认为想法是轮廓是完整的正六边形。
Martin Ender

形状中的所有角度可能不相等,例如,以下形状是有效的输入:此措辞似乎具有误导性。当然我们正在检测正六边形吗?您是否要写这些符号不一定具有角对称性?
林恩

Answers:


2

R,184字节

打高尔夫球,可能打了几个字节

function(m){e=min;f=max;l=length;v=which(m!=" ",T);a=v[,1];n=l(v[a==1,2]);u=(v[a==e(a),2]);all(u==v[a==f(a),2])&all(c(e(d<-v[a==ceiling(f(v[,1])/2),2]),f(d))==c(u[1]-n+1,u[l(u)]+n-1))}

不打高尔夫球,非常凌乱,更像是半打高尔夫球

f=function(m) {
  v = which(m!=" ",T)
  a = v[,1]
  n = length(v[a==1,2])
  u=(v[a==min(a),2])
  c1 = all(u==v[a==max(a),2])
  d = v[a==ceiling(max(v[,1])/2),2]
  c2 = all(c(min(d), max(d))==c(u[1]-n+1,u[length(u)]+n-1))
  c1 & c2
}

由于未指定输入格式,因此需要以R数组格式指定Input,如下所示。

         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] " "  " "  "5"  " "  "6"  " "  "7"  " "  " " 
[2,] " "  "8"  " "  "9"  " "  "0"  " "  "1"  " " 
[3,] "2"  " "  "3"  " "  "4"  " "  "5"  " "  "6" 
[4,] " "  "7"  " "  "8"  " "  "9"  " "  "0"  " " 
[5,] " "  " "  "1"  " "  "2"  " "  "3"  " "  " " 

这是生成输入的生成器函数。生成器不会生成馈入六边形检查功能的对象,而是生成指定数组的代码(实际上是同一件事)。因此,这不应视为解析文本。请记住,我不是在输入文本,而是在输入数组结构。

generate = function(x) {
  s = strsplit(strsplit(x, "\n")[[1]], "")
  m = max(sapply(s, length))
  dput(do.call(rbind, lapply(s, function(x) c(x, rep(" ", m-length(x))))))
}

例如,生成的代码将是:structure(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), .Dim = c(5L, 9L ))array(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), dim = c(5, 9))

希望此输入法符合规则。

这是测试用例

x1 = 
"  5 6 7
 8 9 0 1
2 3 4 5 6
 7 8 9 0
  1 2 3"

x2 =
" # _
+ + +
 9 :"

x3 = 
"    t h i s
   i       s
  a         h
 e           x
  a         g
   o       n
    ! ! ! !"

x4 ="    5 6 7
   8 9 0 1
  2 3 4 5 6
   7 8 9 0
    1 2 3"

x5 = "r e c t a
n g l e s"

x6 = "  h e l l o
  w o r l d s
t h i s i s b
 e t a d e c
  a y n o w"

x7 ="  *
 * *
* * *"

x8 ="   .....
  .......
.........
  .......
   ....."

生成输入数组

sapply(mget(paste("x", 1:8, sep = "")), generate)

测试六角

sapply(.Last.value , f)

   x1    x2    x3    x4    x5    x6    x7    x8 
 TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE 

@DLosc您尚未定义generate函数。试试这个链接: goo.gl/9MtCLg您也可以使用手动输入进行检查,例如f(array(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), dim = c(5, 9)))
Vlo

啊,我错过了那部分。谢谢。
DLosc

1

JavaScript(ES6),214个字节

(s,a=s.split`\n`,n=a[l=a.length>>1].match(r=/(?=\S).*\S/),i=n.index)=>!/\S(  )*\S/.test(s)&&!a.some((s,j)=>(m=r.exec(s))&&(k=m.index)<i+(j<l?j=l-j:j-=l)|k+(m=m[0].length)+j>i+n[0].length|k+i+j&1|j%l<1&m+j+j!=l*4+1)

其中\n代表文字换行符。取消高尔夫:

function validhex(s) {
    if (/S(  )*/S/.test(s)) return false;
    var a = s.split("\n");
    var l = Math.floor(a.length / 2);
    var n = a[l].match(/(?=\S).*\S/);
    for (var j = -l; j <= l; j++) {
        var m = a[j+l].match(/(?=\S).*\S/);
        if (!m) continue;
        if (m.index < n.index + Math.abs(j)) return false;
        if (m.index + m[0].length + Math.abs(j) > n.index + n[0].length) return false;
        if ((m.index + n.index + j) % 2) return false;
        if (j % l) continue;
        if (m[0].length != l * 4 + 1 - 2 * Math.abs(j)) return false;
    }
    return true;
}

我发现了一个错误:输入" x\n g g\ng g g\n g g"应为false,但应为true。
DLosc

@DLosc我认为这是两个空格x吗?
尼尔

@DLosc我想我已经解决了,虽然花了我30个字节……
Neil

1

SnakeEx,200字节

适合工作的语言...

m:{v<>}{r<RF>2P}{r<R>2P}{h<RF>1P}{w<>}{l<RF>2P}{l<R>2P}{h<.>1}
w:{u<>P}{v<>}
v:{e<L>}{u<R>1}
u:.*{e<>}
e:.$
r:[^ ]+
h:([^ ] )+
l:({c<.>}[^ ])+{c<.>}
c:{b<B>}(. )+{x<>LP}{s<>}
b:.{s<>}
s:[^\!-\~]*$
x:.

SnakeEx是2D模式匹配挑战中的一种语言。它应该确实可以很好地完成此任务,但是不幸的是,所有极端情况确实使代码变得肿。我还发现了一些解释器错误。尽管如此,这仍然是一个有趣的挑战。

m是叫其他所有蛇去做实际工作的主要蛇。它从六边形的右上角开始并顺时针旋转。带编号的组用于验证对角线边的长度均相等,并且水平边线的长度与整个图形的高度匹配。我可以写一个更详细的解释,但是我已经花了最后两天的时间来处理极端情况,所以请在这里自己尝试一下。:^)


1

Perl中,127个 125 124 121字节

包括+4 -0p

在STDIN上输入

#!/usr/bin/perl -0p
/ *(.*\S)/;$a=join'\S *
\1',map$"x(abs).'\S '.(/$n/?'\S ':'. ')x(2*$n-1-abs),-($n=$1=~y/ //)..$n;$_=/^$`( *)$a\S\s*$/
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.