Гексагольф: Валідагони


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

Правила

Вихід повинен бути косим або фальсийним значенням (truthy, якщо форма є звичайним шестикутником, фальси, якщо ні).

Фігури завжди містять символи для друку 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

Для введення одного символу ваша програма може виводити або truthy або falsey:

&

Перемога

Виграє найкоротша програма в байтах.


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

Чи приклад з періодами обов'язково фальсифікується? Пропущений період - це пробіл, який є одним із дійсних символів, який може скласти шестикутник,
Тон Євангелія

1
@TonHospel Я думаю, що ідея полягає в тому, що контур - це неперервний регулярний шестикутник.
Мартін Ендер

Наприклад, усі кути фігури можуть бути не рівними, наприклад, наступна форма є дійсною. Ця фразу здається оманливою. Невже ми виявляємо регулярні шестикутники? Ви хочете сказати, що символи не обов'язково мають кутову симетрію?
Лінн

Відповіді:


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 масиву, виглядаючи приблизно так.

         [,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представляє буквальний символ нового рядка. Безголівки:

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?
Ніл

@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-D Pattern Matching . Це повинно бути дуже гарним у цьому завданні, але, на жаль, усі кутові випадки справді роздули код. Я також виявив пару помилок перекладача. І все-таки це був цікавий виклик.

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*$/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.