Hexagolf: Validagons

13

Tantangan

Diberi bentuk seni ASCII, Anda harus mencari tahu apakah bentuknya segi enam biasa atau tidak.

Segi enam

Hexagon reguler didefinisikan menggunakan dua aturan:

  • Ia memiliki enam sisi
  • Setiap sisi memiliki jumlah karakter yang sama

Misalnya, bentuk berikut ini teratur tetapi tidak memiliki enam sisi sehingga bukan segi enam biasa :

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

Demikian pula, bentuk berikut memiliki enam sisi tetapi memiliki sisi dengan panjang yang berbeda dan karenanya bukan segi enam biasa :

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

Namun, bentuk berikut memiliki enam sisi dan semua sisi memiliki jumlah karakter yang sama, jadi itu adalah segi enam biasa:

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

Aturan

Output harus berupa nilai true atau falsey (benar jika bentuknya segi enam biasa, falsey jika tidak).

Bentuk hanya akan berisi karakter ASCII yang dapat dicetak.

Batas bentuk tidak akan pernah mengandung spasi. Jika ya, Anda dapat mengembalikan falsey.

Mungkin ada jumlah spasi kosong sebelum dan / atau setelah bentuk.

Semua sudut dalam bentuk mungkin tidak sama misalnya, bentuk berikut adalah input yang valid:

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

Ini akan mengembalikan nilai falsey.

Semua input bentuk akan berada di kisi yang dipisahkan ruang. Input heksagonal akan berada pada grid yang terhuyung-huyung (setiap baris diimbangi dari yang berikutnya).

Contohnya

Sejujurnya

Bentuk berikut harus mengembalikan nilai kebenaran:

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

Yang berikut harus mengembalikan nilai 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

  *
 * *
* * *

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

Bentuk ini bukan pada grid yang dipisahkan ruang dan tidak terhuyung.


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

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

Untuk input karakter tunggal, program Anda dapat menampilkan benar atau salah:

&

Kemenangan

Program terpendek dalam byte menang.

Peluruhan Beta
sumber
4
Mathematica satu liner yang masuk.
ThreeFx
1
Saya pikir Anda mungkin ingin menambahkan dua test case: Satu tanpa spasi, sebagai contoh: 5 6 7\n8 9 0 1\n2 3 4 5 6\n7 8 9 0\n1 2 3dan satu dengan spasi tambahan di salah satu baris: ss5 6 7\nss8 9 0 1\n2 3 4 5 6\ns7 8 9 0\nss1 2 3(spasi terdepan diganti dengan suntuk membuatnya sedikit lebih jelas dalam bentuk yang tidak diformat ini) . Semua 10 kasus pengujian Anda divalidasi dengan benar dengan kode saya saat ini, tetapi dua kasus ini akan gagal dengan pendekatan yang saya gunakan.
Kevin Cruijssen
Apakah contoh dengan periode tentu falsey? Periode yang hilang adalah ruang yang merupakan salah satu karakter valid yang dapat membentuk segi enam,
Ton Hospel
1
@TonHospel Saya pikir idenya adalah garis besar adalah segi enam reguler yang tidak terputus.
Martin Ender
Semua sudut dalam bentuk mungkin tidak sama misalnya, bentuk berikut adalah input yang valid: Frasa ini tampaknya menyesatkan. Tentunya kita mendeteksi segi enam biasa? Apakah Anda bermaksud menulis bahwa simbol-simbol itu tidak harus memiliki simetri sudut?
Lynn

Jawaban:

2

R, 184 byte

Golf, mungkin bisa golf dengan beberapa 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))}

Tidak serigala, sangat berantakan, lebih seperti setengah jalan golf

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
}

Karena format input tidak ditentukan, Input harus ditentukan dalam format array R, terlihat seperti ini.

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

Berikut adalah fungsi generator yang menghasilkan input. Generator tidak menghasilkan objek yang dimasukkan ke dalam fungsi pemeriksaan segi enam, melainkan kode yang menentukan array (efektif hal yang sama). Jadi ini seharusnya tidak dihitung sebagai penguraian teks. Ingat bahwa saya tidak memasukkan teks, melainkan struktur array.

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

Misalnya, kode yang dihasilkan adalah: 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 ))yang identik denganarray(c(" ", " ", "2", " ", " ", " ", "8", " ", "7", " ", "5", " ", "3", " ", "1", " ", "9", " ", "8", " ", "6", " ", "4", " ", "2", " ", "0", " ", "9", " ", "7", " ", "5", " ", "3", " ", "1", " ", "0", " ", " ", " ", "6", " ", " "), dim = c(5, 9))

Semoga metode input ini sesuai dengan aturan.

Berikut ini adalah contoh-contoh tesnya

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

Hasilkan array input

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

Tes untuk segi enam

sapply(.Last.value , f)

   x1    x2    x3    x4    x5    x6    x7    x8 
 TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE 
Vlo
sumber
@Dosc. Anda tidak memiliki fungsi fungsi yang didefinisikan. Coba tautan ini: goo.gl/9MtCLg Anda juga dapat memeriksa dengan input manual sepertif(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, aku merindukan bagian itu. Terima kasih.
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)

Dimana \nmewakili karakter baris baru literal. Tidak Disatukan:

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;
}
Neil
sumber
Saya menemukan bug: input " x\n g g\ng g g\n g g"harus memberi false, tetapi memberi true.
DLosc
@ Doc saya ambil itu dua spasi sebelum x?
Neil
@Dospl Saya pikir saya sudah memperbaikinya sekarang, biayanya 30 byte ...
Neil
1

SnakeEx , 200 byte

Bahasa yang tepat untuk pekerjaan itu ... semacam.

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 adalah bahasa dari tantangan Pencocokan Pola 2-D . Seharusnya sangat bagus dalam tugas ini, tapi sayangnya semua kasus sudut benar-benar membengkak kode. Saya juga menemukan beberapa bug juru bahasa. Namun, itu adalah tantangan yang menyenangkan.

madalah ular utama yang memanggil semua yang lain untuk melakukan pekerjaan yang sebenarnya. Ini cocok mulai di sudut kanan atas segi enam dan berjalan searah jarum jam. Kelompok bernomor digunakan untuk memverifikasi bahwa panjang sisi diagonal semuanya sama dan panjang sisi horizontal cocok dengan tinggi keseluruhan gambar. Saya bisa menulis penjelasan yang lebih rinci, tetapi saya telah menghabiskan dua hari terakhir berurusan dengan kasus sudut, jadi coba saja sendiri di sini . : ^)

DLosc
sumber
1

Perl, 127 125 124 121 byte

Termasuk +4 untuk -0p

Berikan masukan pada 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*$/
Ton Hospel
sumber