Hexagolf : Validagons


13

도전

ASCII 아트 셰이프가 제공되면 셰이프가 정육각형인지 아닌지를 알아야합니다.

육각형

정규 육각형은 두 가지 규칙을 사용하여 정의됩니다.

  • 그것은 여섯면이
  • 각면에는 같은 수의 문자가 있습니다

예를 들어, 다음 모양은 규칙적이지만 6 개의 변이 없으므로 규칙적인 육각형 이 아닙니다 .

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

마찬가지로, 다음과 같은 모양은 6 개면을 가지고 있지만 서로 다른 길이의 측면을 가지고 있으며, 그래서없는 일반 육각 :

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

그러나 다음 모양에는 6 개의 변이 있고 모든 변의 문자 수가 동일하므로 정육각형입니다.

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

규칙

출력은 진실 또는 거짓 값이어야합니다 (모양이 정육각형 인 경우에는 타당하고 그렇지 않으면 거짓 임).

도형에는 인쇄 가능한 ASCII 문자 만 포함됩니다.

도형의 테두리에는 공백이 포함되지 않습니다. 그렇다면 거짓을 반환 할 수 있습니다.

모양 전후에 임의의 양의 공백이있을 수 있습니다.

예를 들어, 모양의 모든 각도가 동일하지 않을 수 있습니다. 다음 모양은 유효한 입력입니다.

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

잘못된 값을 반환합니다.

모든 모양 입력은 공백으로 구분 된 격자에 있습니다. 육각형 입력은 지그재그 그리드에 있습니다 (각 라인은 다음 라인에서 오프셋됩니다).

Truthy

다음 모양은 정확한 값을 반환해야합니다.

 # _
+ + +
 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 가지 테스트 사례가 모두 내 코드로 올바르게 유효성을 검사하지만이 두 가지 사례는 내가 사용한 접근 방식으로 실패합니다.
Kevin Cruijssen

마침표가있는 예제가 반드시 거짓입니까? 누락 된 기간은 육각형을 구성 할 수있는 유효한 문자 중 하나입니다.
Ton Hospel

1
@TonHospel 나는 그 윤곽선이 깨지지 않는 규칙적인 육각형이라는 생각이 듭니다.
Martin Ender

예를 들어 도형의 모든 각도가 같지 않을 수 있습니다. 다음 도형이 유효한 입력입니다. 이 문구는 잘못된 것 같습니다. 분명히 우리는 규칙적인 육각형을 감지하고 있습니까? 기호가 반드시 각도 대칭을 가질 필요는 없다는 것을 쓰시겠습니까?
Lynn

답변:


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
}

입력 형식이 지정되어 있지 않기 때문에 Input을 R 배열 형식으로 지정해야합니다.

         [,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 생성 함수가 정의되지 않았습니다. 이 링크를 사용해보십시오 : goo.gl/9MtCLgf(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

자바 스크립트 (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"은 거짓을 주어야하지만 사실을 준다.
DLosc

@DLosc 나는 그것을 전에 두 칸 띄운 것으로 생각 x합니까?
Neil

@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는 2-D 패턴 일치 챌린지 의 언어입니다 . 이 작업을 잘 수행해야하지만 불행히도 모든 코너 케이스가 실제로 코드를 부풀 렸습니다. 또한 몇 개의 통역사 버그도 제기했습니다. 여전히 재미있는 도전이었습니다.

m실제 작업을 수행하기 위해 다른 모든 사람을 호출하는 주요 뱀입니다. 육각형의 오른쪽 상단에서 시작하여 시계 방향으로 일치합니다. 번호가 매겨진 그룹을 사용하여 대각선 길이가 모두 같고 수평 길이가 전체 그림의 높이와 일치하는지 확인합니다. 더 자세한 설명을 쓸 수는 있지만 지난 이틀 동안 코너 사건을 처리 했으므로 여기서 직접 사용해보십시오 . : ^)


1

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*$/
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.