Hexagolf: 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 ที่พิมพ์ได้เท่านั้น

เส้นขอบของรูปร่างจะไม่มีช่องว่าง ถ้าเป็นเช่นนั้นคุณสามารถกลับมาโกหกได้

อาจมีช่องว่างตามอำเภอใจก่อนและ / หรือหลังรูปร่าง

มุมทั้งหมดในรูปร่างอาจไม่เท่ากันรูปร่างต่อไปนี้เป็นอินพุตที่ถูกต้อง:

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

มันจะคืนค่าเท็จ

อินพุตรูปร่างทั้งหมดจะอยู่ในตารางที่คั่นด้วยช่องว่าง อินพุตแบบหกเหลี่ยมจะอยู่ในตารางที่มีการส่าย (แต่ละบรรทัดจะถูกชดเชยจากถัดไป)

ตัวอย่าง

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

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

  *
 * *
* * *

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

รูปร่างนี้ไม่ได้อยู่บนกริดที่คั่นด้วยช่องว่างและไม่ได้ถูกย้าย


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

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 ไบต์

Golfed อาจจะ golfed โดยไม่กี่ไบต์

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 ยุ่งมากเหมือนตีกอล์ฟครึ่งทาง

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
}

เนื่องจากรูปแบบอินพุตไม่ได้รับการระบุจึงจำเป็นต้องระบุอินพุตในรูปแบบอาเรย์อาเรย์

         [,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/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แสดงถึงอักขระบรรทัดใหม่ตามตัวอักษร Ungolfed:

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

@Losc ฉันเอามันเป็นสองช่องว่างก่อนxหรือไม่
Neil

@DLosc ผมคิดว่าผมมีมันคงที่ในขณะนี้เสียค่าใช้จ่าย 30 ไบต์ แต่ ...
นีล

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 มิติรูปแบบการจับคู่ความท้าทาย มันควรจะดีจริงๆในงานนี้ แต่น่าเสียดายที่ทุกมุมกรณีป่องรหัสจริงๆ ฉันยังเปิดใช้งานข้อบกพร่องล่ามสองสาม ถึงกระนั้นมันก็เป็นความท้าทายที่สนุก

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*$/
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.