ヘキサゴルフ:バリダゴン


13

チャレンジ

ASCIIアートの形を考えると、その形が正六角形かどうかを調べる必要があります。

六角形

通常の六角形は、2つのルールを使用して定義されます。

  • それは6つの側面を持っています
  • 各辺の文字数は等しい

たとえば、次の形状は規則的ですが、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文字のみが含まれます。

図形の境界線にスペースが含まれることはありません。存在する場合、falseyを返すことができます。

図形の前後に任意の量の空白が存在する可能性があります。

たとえば、形状のすべての角度が等しくない場合があります。次の形状は有効な入力です。

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

falsey値を返します。

すべての形状入力は、スペースで区切られたグリッド上にあります。六角形の入力は、互い違いのグリッド上にあります(各行は次の行からオフセットされます)。

真実の

次の形状は、真の値を返す必要があります。

 # _
+ + +
 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が1つのライナーを受信します。
ThreeFx 16

1
2つのテストケースを追加することをお勧めします。たとえば、1つは先行スペースなし、もう1つは行の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個のテストケースはすべて、現在私のコードで正しく検証されていますが、これら2つのケースは、私が使用したアプローチでは失敗します。
ケビンCruijssen 16

期間のある例は必ずしも偽であるか?不足している期間は、六角形を作ることができ、有効な文字の一つであるスペースである
トンHospel

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
}

入力形式は指定されていないため、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/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)

where \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"はfalseを与えるべきですが、trueを与えます。
DLosc

@DLosc x?の前に2つのスペースがあると考えます。
ニール

@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パターンマッチングチャレンジの言語です。このタスクは本当にうまくいくはずですが、残念なことに、すべてのコーナーケースでコードが肥大化しました。また、インタープリターのバグもいくつか発見しました。それでも、それは楽しい挑戦でした。

m他のすべてを呼び出して実際の作業を行う主な蛇です。六角形の右上隅から始まり時計回りに一致します。番号付きグループは、対角線の辺の長さがすべて等しく、水平辺の長さが図全体の高さと一致することを確認するために使用されます。詳細な説明を書くことはできますが、ここ2日間はコーナーケースの処理に費やしたので、ここで試してみてください。:^)


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.