Pentomino 6x10解决方案标准化器


19

正如您现在最可能看到的那样,在6x10的网格中有2339种解决五味子拼图的方法。12种戊糖胺有不同的标记方案,下图显示了其中的两种:

在此处输入图片说明

图片来源:维基百科

出于当前任务的目的,我们将说归一化的戊糖胺溶液是使用第二种标记方案(康韦)的溶液。

例:

O O O O O S S S Z Z
P P R R S S W W Z V
P P P R R W W Z Z V
U U X R T W Y V V V
U X X X T Y Y Y Y Q
U U X T T T Q Q Q Q

O根据方案,连续5个正方形的块用字母表示。所有作品都一样。

任务:

给定6x10 pentomino的解决方案,在该解决方案中用随机的sheme标记这些片段,请对其进行规范化,以便所有片段都按照Conway的标记方案进行标记。您需要识别这些碎片,并用该碎片的符号标记特定碎片的每个正方形。

输入:

要标准化的解决方案,采用任何您方便的格式,例如:

  • 多行字符串

  • 字符串列表

  • 字符列表

等等

输出:

相同的解决方案(保留所有作品的位置和方向),但每个作品均根据Conway的标注方案进行标注。注意:输出必须以6x10的字符网格打印。允许在行尾使用换行符和空格。您也可以在字符之间打印一个空格(但不能打印空行),如上例所示。

测试用例:

1.输入:

6623338888
6222344478
66A234BB70
1AAA94B770
11A99BB700
1199555550

输出:

UURTTTQQQQ
URRRTVVVSQ
UUXRTVZZSY
PXXXWVZSSY
PPXWWZZSYY
PPWWOOOOOY

2.输入:

45ookkkk00
455ooogk00
4a55gggdd0
4aaa3gnnd.
4am333ndd.
mmmm3nn...

输出:

OWSSQQQQPP
OWWSSSRQPP
OTWWRRRUUP
OTTTXRZZUV
OTYXXXZUUV
YYYYXZZVVV

获奖标准:

每种语言中以字节为单位的最短解决方案为准。不要因为打高尔夫球而灰心。欢迎对算法和实现进行解释。



@KevinCruijssen谢谢!(我没有检查有关四合一的问题)
Galen Ivanov

Answers:


12

APL(Dyalog Classic)54 53 50字节

⍴⍴{'OXRYTPZQUWSV'[⌊5÷⍨⍋⍋,{×/+⌿↑|(⊢-+/÷≢)⍸⍵}¨⍵=⊂⍵]}

在线尝试!

计算输入中每​​个戊基米诺米的不变式:从其每个平方到其重心的量度(∆x,∆y),取abs(∆x)和abs(∆y),求和x分量,分别求和y分量,然后将两个和相加。这给出了12个不同的结果。然后,在所有不变量的排序集合中找到每个戊糖不变量的索引。将0替换为'O',将1 替换为'X',将2替换为'R',等等。


感谢您的快速答复和解释,我+1!我的意思是将解决方案显式打印为6x10网格。我更改了说明,请更新您的解决方案-给您带来的不便,我们深表歉意。
加伦·伊凡诺夫

@GalenIvanov但是... 这是一个网格。我的测试输出“确定”而不是打印结果-也许这太令人困惑了?
ngn

是的,我对测试感到困惑。
加伦·伊万诺夫

3
现在他们在验证之前打印结果
ngn

4

果冻,37 个字节

ŒĠZÆmạƊ€ḅı§AỤỤị“æṂ⁾+’Œ?¤+78Ọ,@FQṢƊyⱮY

一个完整的程序,它包含一个字符串列表(因为我们必须打印-否则删除尾部,Y并且您有一个monad接受一个由数字或字符组成的列表,该列表返回一个由字符组成的列表)。

在线尝试!

怎么样?

我相信这可以使用与ngn 的APL解决方案相同的戊糖分类方法,尽管方式略有不同(我也不知道APL,所以我不确定该方法在分类方法上有多相似)。

(请注意,“æṂ⁾+’Œ?¤+78Ọ仅保存了一个字节“XRPTZWUYSVQO”!)

ŒĠZÆmạƊ€ḅı§AỤỤị“æṂ⁾+’Œ?¤+78Ọ,@FQṢƊyⱮY - Main Link: list of lists of characters L
ŒĠ                                    - group multidimensional indices by value
      Ɗ€                              - last three links as a monad for €ach i.e. f(x):
  Z                                   -   transpose x
   Æm                                 -   mean (vectorises) (i.e. the average of the coordinates)
     ạ                                -   absolute difference with x (vectorises) (i.e. [dx, dy])
         ı                            - square root of -1 (i)
        ḅ                             - convert from base (vectorises) (i.e a list of (i*dx+dy)s)
          §                           - sum each
           A                          - absolute value (i.e. norm of the complex number)
            Ụ                         - grade up (sort indices by value)
             Ụ                        - grade up (...getting the order from the result of A back,
                                      -              but now with one through to 12)
                       ¤              - nilad followed by links as a nilad:
               “æṂ⁾+’                 -   base 250 literal = 370660794
                     Œ?               -   permutation@lex-index = [10,4,2,6,12,9,7,11,5,8,3,1]
              ị                       - index into
                        +78           - add seventy-eight
                           Ọ          - cast to characters (character(1+78)='O', etc...)
                                 Ɗ    - last three links as a monad (i.e. f(L)):
                              F       -   flatten
                               Q      -   de-duplicate
                                Ṣ     -    sort
                            ,@        - pair (with sw@pped @rguments) (giving a list of 2 lists)
                                   Ɱ  - Ɱap across L with:
                                  y   -   translate i.e. swap the letters as per the the pair)
                                    Y - join with new lines
                                      - implicit print

2

Wolfram语言(Mathematica),103个字节

""<>Riffle[(t=#)/.Thread[SortBy[Union@@t,Tr@Kurtosis@Position[t,#]&]->Characters@"UPSWZVRTQXYO"],"\n"]&

将输入作为字符列表的列表。

在线尝试!

这里的主要思想是,对于输入中的每个字符,我们找到其出现位置的坐标,采用峰度并求和其坐标。这给了我们每一个不变的东西。

(峰度是统计中一些最不相关的运算符-关键是在平移下它是不变的,而反射和旋转最多可以切换坐标的顺序。我们求和坐标,因此不变不会改变。)

无论如何,除了奇怪的不变量外,此解决方案与其他方法类似:我们将字符和片段按每个不变量排序,然后将每个字符替换为对应的字符"UPSWZVRTQXYO":片段,并按峰度和排序。

最后,""<>Riffle[...,"\n"]是作为网格打印的代码。


+1是因为知道我从未听说过的一项操作并充分利用了它
Black Owl Kai

我第一次尝试解决问题的方法Sort@VarianceTr@Kurtosis,并且可能有更多的人听说过差异。但是Tr@Variance,由于几个五聚体(例如P和X)具有相同的x方差和y方差之和,因此不起作用。因此,我仔细研究了Mathematica的文档,以期获得一些奇特的东西。
米莎·拉夫罗夫

2

Python 2 191字节

def y(o):print"".join(['XPRTWZUYSVQO\n'[[w for v,w in sorted([sum(abs(u-sum(t)/5)for t in[[complex(r%11,r/11)for r,q in enumerate(o)if q==p]]for u in t),p]for p in o)].index(x)/5]for x in o])

在线尝试!

接受带有尾随换行符的多行字符串,并执行六个嵌套列表推导。

非高尔夫版本

def pentomino_normalizer(input_string):
    # input_string is a multi-line string with a trailing newline

    results = []  # For saving the results of the for loop
    for current_char in input_string:
        # current_char = p in the golfed version

        # The python data type complex stores a real and a imaginary value and
        # is used for storing the x and y coordinates.
        # In the end, the positions list contains a complex number for every
        # occurence of current_char in the string
        # positions_list = t in the golfed version
        positions_list = [complex(i % 11, i / 11) for i, c
                          in enumerate(input_string) if c == current_char]
        # average_pos is the midpoint of all occurences of current_char, 
        # to get rid of translations
        average_pos = sum(positions_list)/5
        # Calculates a value for each tile that is invariant under 
        # translations and rotations,
        # simply the sum of all the distances between the midpoint
        # and the positions
        invariant = sum(abs(pos - average_pos) for pos in positions_list)

        # Saves the invariant value to a list
        results.append(invariant, current_char)

    # This new list contains the characters occuring in the string, sorted
    # by the invariant value. Because this was done with each char in the 
    # input string, this lists contains every value five times and also 
    # contains six newlines
    # at the end of the list
    sorted_results = [w for v, w in sorted(results)]

    # This code snippet maps each char from the input string to its according
    # output and prints to stdout
    chars = ['XPRTWZUYSVQO\n'[sorted_results.index(c)/5] for c in input_string]
    print "".join(chars)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.