写下所有可能的盲文字符


13

今天早上看着电梯按钮,一个有趣的难题传给我。

您需要生成一个适合2x3网格的所有盲文图案列表。使用散列#表示凹凸,使用连字符-表示平坦区域。

预期输出样本:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

规则:

  • 您的程序必须用至少一个字符或一行分隔每个模式。
  • 图案可以以任何顺序生成。
  • 不论盲文字母表实际使用什么样式,都应制作所有图案。完全空白的模式是可选的。
  • 仅应生成唯一的凹凸图案。由于凸起的排列相同,因此以下图案被认为是等效的。在这些情况下,请使用最靠近左上角的图案(即,本示例中的第一个选项)。
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

奖励积分,如果你可以把它用于任何工作,XŸ大小的网格。(编辑:在合理范围内。最多4x4足以用于概念验证。)

阅读Wiki文章后,看来有45种模式(包括空白)符合该难题的规则。


它不算数,但是非常接近。对于xx y网格,您将生成第一个2^(xy)数字,并针对2^x - 1或过滤掉那些掩码为0的数字(2^(xy+1) - 1)/(2^y - 1)
彼得·泰勒

Answers:


6

GolfScript,34 32个字符

44,{84+2base(;{'-#'=}/@\n.}%2/n*

原来有不是简单地生成所有64种模式以及过滤掉坏的更短的解决方案。实际上,通过适当地将位映射到网格位置,可以像该程序一样将所有有效(非空)模式映射到连续的数字范围。

具体来说,我使用的映射是:

5 4
3 1
2 0

其中数字表示0映射到网格中该位置的位位置(从最低有效位开始)。使用此映射,有效网格对应于数字20至63(包括20和63)。

这几乎与通过以二进制形式写出6位数字并在第二位之间添加换行符而获得的显而易见的映射相同,除了这些位12被交换外-实际上,这正是我的程序如何计算它。(在将数字转换为二进制之前,我还要在数字上加上64,然后去除多余的高位;这只是将数字零填充至6位,因为base否则GolfScript 不会返回任何前导零。)

附言 在线演示在这里。(服务器最近似乎过载;如果超时,请重试或下载解释器并在本地进行测试。)

编辑:设法通过避免不必要的数组构建和转储来保存两个字符。


2
您介意添加一些细节吗?我很想知道您如何定义此映射。
ardnew

@ardnew:完成,请参见上面。
Ilmari Karonen 2012年

我认为这将改变很多人的答案。:-)
Hand-E-Food

3

Mathematica 97

Grid /@ Cases[(#~Partition~2 & /@ Tuples[{"#", "-"}, 6]), x_ /; 
         x[[All, 1]] != {"-", "-", "-"} && x[[1]] != {"-", "-"}]

盲文


不包括空白:

Length[%]

44

NB!=是Mathematica中的单个字符。


3

C#– 205

class C{static void Main(){var s="---##-##";Action<int,int>W=(i,m)=>{Console.WriteLine(s.Substring((i>>m&3)*2,2));};for(int i=0;i<64;++i){if((i&3)>0&&(i&42)>0){W(i,0);W(i,2);W(i,4);Console.WriteLine();}}}}

可读版本:

class C
{
    static void Main()
    {
        var s = "---##-##"; // all two-bit combinations
        // a function to write one two-bit pattern (one line of a Braille character)
        Action<int,int> W = (i,m) => { Console.WriteLine(s.Substring(((i >> m) & 3) * 2, 2)); };
        // for all possible 6-bit combinations (all possible Braille characters)
        for(int i = 0; i < 64; ++i)
        {
            // filter out forbidden (non-unique) characters
            if ((i & 3) > 0 && (i & 42) > 0)
            {
                // write three rows of the Braille character and an empty line
                W(i,0);
                W(i,2);
                W(i,4);
                Console.WriteLine();
            }
        }
    }
}

3

Perl,71 67 65个字符

y/10/#-/,s/../$&
/g,/^#/m&&print
for map{sprintf"%06b
",$_}18..63

将int转换为二进制,执行音译,并在每两个字符后添加一个换行符。该/^#/m测试消除了两个模式(20和21),这些模式在最左侧的列中没有凸起的凸起。

一般的解决方案,150 106 103 100炭

从命令行参数读取x和读取y。换行符很重要

y/01/-#/,s/.{$x}/$&
/g,/^#/m*/^.*#/&&print
for map{sprintf"%0*b
",$x*$y,$_-1}1..1<<($y=pop)*($x=pop)

像以前一样在0..2 xy上进行迭代,将每个int转换为二进制,用-and 替换#0and 1,并在每个$x字符后插入一个换行符。

/^#/m测试在最左边的列中是否有凸起的凸起,并 /^.*#/测试在第一行中是否有凸起的凸起。仅打印通过两个测试的图案。


如何计算无效组合?
scleaver

因为环路不包括图案为1..17,20,和21
暴民

2

蟒蛇, 120 118 113 95 118

for j in range(256):
    if j/4&48and j/4&42:print''.join('_#'[int(c)]for c in bin(j/4)[2:].rjust(6,'0'))[j%4*2:j%4*2+2]

编辑:使用Winston Ewert建议并通过y网格解决方案添加了x

编辑:我不知何故错过了关于唯一性的最后约束。该脚本生成所有可能的序列,而不仅仅是45。

编辑:备份到118,但现在正确


替换['#','-']'#-'
温斯顿·埃韦特2012年

2

J,35 33个字符

3 2$"1'-#'{~(2 A.i.6){"1#:20+i.44

使用Ilmari Karonen在其Golfscript解决方案中提出的方法。但是,由于J动词#:(反基)将位(或一般情况下的数字)存储在列表中,因此我们需要从左而不是从右索引(即索引0是最左边的最高位)。

解决方案非常简单:20+i.44给出一个数字列表(20..63含)。 #:接受此列表中每个元素的antibase-2,从而为该范围内的每个数字生成位模式列表。 {将这些位选择(基本上重新排序)为正确的模式,然后{再次使用该位以将数字用作字符串“-#”中的索引,以准备输出。最后,我们将每个条目安排为一个带有$(形状)的2×3矩形。


3 2$"1'-#'{~(2 A.i.6){"1#:20+i.44      N.B. use A. (anagram) to generate the right permutation

3 2$"1'-#'{~0 1 2 4 3 5{"1#:20+i.44


有谁知道如何(0 2 3 ,. 1 4 5) { #: 44调整像数字列表而不是单个数字那样的东西?可能会刮掉更多的字符。
FireFly 2012年

1

蟒- 121 112

不包括空白

from itertools import*
print'\n'.join('%s%s\n'*3%b for(b,n)in zip(product(*['_#']*6),range(64))if n&48and n&42)

您可以使用'_#',repeat=6->*['_#']*6
展位

@boothby:谢谢。此外,b已经是一个元组,因此无需将其转换:)
quasimodo 2012年
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.