すべての可能な点字を書きます


13

今朝、面白いパズルがエレベーターのボタンを見て私に来ました。

2x3グリッドに収まるすべての点字パターンのリストを生成する必要があります。ハッシュ#を使用してバンプ-を示し、ハイフンを使用して平坦な領域を示します。

予想される出力サンプル:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

ルール:

  • プログラムでは、各パターンを少なくとも1つの文字または行で区切る必要があります。
  • パターンは任意の順序で生成できます。
  • 点字のアルファベットが実際に使用するものに関係なく、すべてのパターンを作成する必要があります。完全に空白のパターンはオプションです。
  • 一意のバンプパターンのみを生成する必要があります。以下のパターンは、バンプが同一の配置にあるため、同等と見なされます。これらの場合、左上隅に最も近いパターン(つまり、この例の最初のオプション)を使用します。
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

あなたはそれがすべてのために動作させることができればボーナスポイントのxyの大きさのグリッド。(編集:妥当な範囲内。概念実証には4x4までで十分です。)

ウィキの記事を読むと、このパズルのルールを満たす45のパターン(空白を含む)があるようです。


それほど重要ではありませんが、非常に近いものです。以下のためxのx yグリッドは、最初に発生2^(xy)に対して0にマスクするものから数字やフィルタを2^x - 1(2^(xy+1) - 1)/(2^y - 1)
ピーターテイラー

回答:


6

GolfScript、34 32文字

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

64個すべてのパターンを生成し、悪いパターンを除外するよりも短いソリューションあることわかります。実際、ビットをグリッド位置に適切にマッピングすることにより、このプログラムのように、すべての有効な(空でない)パターンを連続した数値範囲にマッピングすることができます。

具体的には、私が使用するマッピングは次のとおりです。

5 4
3 1
2 0

数字は0、グリッド内のその位置にマッピングされたビット位置(最下位ビットから開始)を示します。このマッピングでは、有効なグリッドは20から63までの数字に対応します。

これは、ビットとスワップが入れ替わることを除いて、6ビット数を2進数で書き出し、2ビットごとに改行を追加することで得られる明らかなマッピングとほぼ同じです。(また、バイナリに変換する前に数値に64を追加し、余分な高ビットを取り除きます。GolfScript は先行ゼロを返さないため、数値を6ビットにゼロで埋めます。)12base

追伸 オンラインデモはこちら。(サーバーは最近過負荷になっているようです。タイムアウトが発生した場合は、再試行するか、インタープリターダウンロードしてローカルでテストしてください。)

編集:不要な配列の構築とダンプを回避することにより、2つの文字を保存することができました。 ふう!


2
詳細を追加しますか?このマッピングをどのように定義しているのか興味があります。
ardnew

@ardnew:完了、上記を参照。
イルマリカロネン

これは多くの人々の答えを変えるだろうと思います。:-)
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をバイナリに変換し、音訳を実行し、2文字ごとに改行を追加します。この/^#/mテストでは、左端の列に隆起のない2つのパターン(20と21)が削除されます。

一般的な解決策、150 106 103 100 CHAR

読むxyコマンドライン引数から。改行は重要です

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をバイナリに変換し-#for 0とfor に置き換え、1すべての$x文字の後に改行を挿入します。

/^#/m左端の列に/^.*#/隆起があることをテストし、一番上の行に隆起があることを テストします。両方のテストに合格したパターンのみが印刷されます。


これは無効な組み合わせをどのように説明しますか?
スクリーバー

ループが1..17、20、および21のパターンを除外するため。–
mob

2

Python、 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の提案を使用し、x by yグリッドソリューションを追加

編集:一意性に関する最後の制約を見逃した。このスクリプトは、45だけでなく、可能なすべてのシーケンスを生成します。

編集:118までバックアップしますが、現在は正しいです


交換する['#','-']'#-'
ウィンストン・エバート

2

J、35 33文字

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

Ilscript KaronenがGolfscriptソリューションで考案したアプローチを使用します。ただし、J動詞#:(アンチベース)はビット(または、一般的な場合は数字)をリストに格納するため、右ではなく左からインデックスを付ける必要があります(つまり、インデックス0は左端の最上位ビットです)。

解決策はかなり単純です。20+i.44数字のリストを20..63含めます。 #:このリストの各要素のantibase-2を取得し、その範囲の各数値のビットパターンのリストを作成します。 {ビットを正しいパターンに選択(基本的に並べ替え)して{から、出力を準備するために文字列「-#」のインデックスとして数字を使用するために再び使用されます。最後に、各エントリを$(shape)で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

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

@boothby:ありがとう。また、bすでにタプルなので、変換する必要はありません:)
quasimodo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.