Hexagolf: Hợp lệ


13

Thử thách

Đưa ra một hình dạng nghệ thuật ASCII, bạn phải tìm hiểu xem hình dạng đó có phải là hình lục giác thông thường hay không.

Hình lục giác

Một hình lục giác thông thường được xác định bằng hai quy tắc:

  • Nó có sáu mặt
  • Mỗi bên có số ký tự bằng nhau

Ví dụ: hình sau đây là hình bình thường nhưng nó không có sáu cạnh và do đó không phải là hình lục giác đều :

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

Tương tự, hình dạng sau có sáu cạnh nhưng có các cạnh có độ dài khác nhau và do đó không phải là hình lục giác thông thường :

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

Tuy nhiên, hình dạng sau có sáu cạnh và tất cả các cạnh có cùng số ký tự, vì vậy nó là một hình lục giác đều:

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

Quy tắc

Đầu ra phải là giá trị trung thực hoặc giá trị falsey (trung thực nếu hình dạng là hình lục giác đều, falsey nếu không).

Các hình dạng sẽ chỉ bao gồm các ký tự ASCII có thể in được.

Đường viền của hình sẽ không bao giờ chứa khoảng trắng. Nếu có, bạn có thể trả lại falsey.

Có thể có số lượng khoảng trắng tùy ý trước và / hoặc sau hình dạng.

Tất cả các góc trong hình có thể không bằng nhau, ví dụ, hình sau đây là đầu vào hợp lệ:

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

Nó sẽ trả về một giá trị falsey.

Tất cả các hình dạng đầu vào sẽ nằm trên một lưới ngăn cách. Đầu vào hình lục giác sẽ nằm trên một lưới so le (mỗi dòng được bù từ cái tiếp theo).

Ví dụ

Sự thật

Các hình dạng sau sẽ trả về giá trị trung thực:

 # _
+ + +
 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

Falsey

Sau đây sẽ trả về giá trị falsey

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

  *
 * *
* * *

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

Hình dạng này không nằm trên một lưới ngăn cách không gian và không được đặt so le.


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

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

Đối với các đầu vào ký tự đơn, chương trình của bạn có thể xuất ra trung thực hoặc falsey:

&

Chiến thắng

Chương trình ngắn nhất tính bằng byte thắng.


4
Mathicala một lót đến.
ThreeFx

1
Tôi nghĩ rằng bạn có thể muốn thêm hai trường hợp thử nghiệm: một không có khoảng trắng ở đầu, ví dụ: 5 6 7\n8 9 0 1\n2 3 4 5 6\n7 8 9 0\n1 2 3và một không gian bổ sung dẫn đến một trong các hàng: ss5 6 7\nss8 9 0 1\n2 3 4 5 6\ns7 8 9 0\nss1 2 3(không gian hàng đầu được thay thế sđể làm cho nó rõ ràng hơn một chút trong hình thức không được định dạng này) . Hiện tại tất cả 10 trường hợp thử nghiệm của bạn đang xác thực chính xác với mã của tôi, nhưng hai trường hợp này sẽ thất bại với cách tiếp cận tôi đã sử dụng.
Kevin Cruijssen

Là ví dụ với các giai đoạn nhất thiết phải falsey? Khoảng thời gian bị thiếu là một khoảng trống là một trong những ký tự hợp lệ có thể tạo thành hình lục giác,
TonMedel

1
@TonHosp Tôi nghĩ rằng ý tưởng là phác thảo là một hình lục giác đều đặn không bị phá vỡ.
Martin Ender

Tất cả các góc trong hình có thể không bằng nhau, ví dụ, hình sau đây là đầu vào hợp lệ: Cụm từ này có vẻ sai lệch. Chắc chắn chúng ta đang phát hiện các hình lục giác đều đặn? Bạn có nghĩa là viết rằng các biểu tượng không nhất thiết phải có đối xứng góc?
Lynn

Câu trả lời:


2

R, 184 byte

Chơi gôn, có thể bị đánh gôn bởi một vài byte

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

Ungolfed, rất lộn xộn, giống như chơi golf một nửa

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
}

Vì định dạng đầu vào không được chỉ định, Đầu vào cần được chỉ định theo định dạng mảng R, trông giống như thế này.

         [,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"  " "  " " 

Đây là một hàm tạo tạo đầu vào. Trình tạo không tạo ra một đối tượng được đưa vào chức năng kiểm tra hình lục giác, mà là mã chỉ định mảng (thực tế là cùng một thứ). Vì vậy, điều này không nên được tính là phân tích văn bản. Hãy nhớ rằng tôi không nhập văn bản, mà là một cấu trúc mảng.

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

Ví dụ: mã được tạo sẽ là: 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 ))trùng vớiarray(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), dim = c(5, 9))

Hy vọng phương thức nhập liệu này tuân thủ các quy tắc.

Dưới đây là các trường hợp thử nghiệm

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 ="   .....
  .......
.........
  .......
   ....."

Tạo mảng đầu vào

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

Kiểm tra hình lục giác

sapply(.Last.value , f)

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

@DLosc Bạn không có chức năng tạo được xác định. Hãy thử liên kết này: goo.gl/9MtCLg Bạn cũng có thể kiểm tra với một đầu vào thủ công như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

Ah, tôi đã bỏ lỡ phần đó. Cảm ơn.
DLosc

1

JavaScript (ES6), 214 byte

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

Trường hợp \nđại diện cho một nhân vật dòng chữ mới. Ung dung:

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;
}

Tôi tìm thấy một lỗi: đầu vào " x\n g g\ng g g\n g g"sẽ cho sai, nhưng cho đúng.
DLosc

@DLosc Tôi lấy đó là hai khoảng trắng trước x?
Neil

@DLosc Tôi nghĩ rằng tôi đã sửa nó ngay bây giờ, tốn 30 byte mặc dù ...
Neil

1

SnakeEx , 200 byte

Ngôn ngữ phù hợp cho công việc ... sắp xếp.

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 là một ngôn ngữ từ Kết hợp mẫu 2-D thử thách . Nó phải thực sự tốt trong nhiệm vụ này, nhưng thật không may, tất cả các trường hợp góc thực sự làm phồng mã. Tôi cũng bật lên một vài lỗi phiên dịch. Tuy nhiên, đó là một thử thách thú vị.

mlà con rắn chính kêu gọi tất cả những người khác làm công việc thực tế. Nó khớp bắt đầu từ góc trên cùng bên phải của hình lục giác và đi theo chiều kim đồng hồ. Các nhóm được đánh số được sử dụng để xác minh rằng độ dài cạnh chéo đều bằng nhau và chiều dài cạnh ngang phù hợp với chiều cao của toàn bộ hình. Tôi có thể viết một lời giải thích chi tiết hơn, nhưng tôi đã dành hai ngày qua để giải quyết các vụ án ở góc, vì vậy hãy tự mình thử nó ở đây . : ^)


1

Perl, 127 125 124 121 byte

Bao gồm +4 cho -0p

Cung cấp đầu vào trên 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*$/
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.