가능한 모든 점자 문자 쓰기


13

오늘 아침 엘리베이터 버튼을 보면서 재미있는 퍼즐이 나왔습니다.

2x3 격자에 맞는 모든 점자 패턴 목록을 생성해야 합니다. 해쉬 #를 사용하여 범프 -를 나타내고 하이픈 을 사용하여 평평한 영역을 나타냅니다.

예상 출력 샘플 :

#-
--
--

##
--
--

#-
#-
--

(and so on...)

규칙 :

  • 프로그램은 각 패턴을 하나 이상의 문자 나 행으로 구분해야합니다.
  • 패턴은 임의의 순서로 생성 될 수있다.
  • 점자 알파벳이 실제로 사용하는 것과 상관없이 모든 패턴이 생성되어야합니다. 완전 공백 패턴은 선택 사항입니다.
  • 고유 한 범프 패턴 만 생성해야합니다. 범프가 동일한 배열에 있기 때문에 다음 패턴은 동등하다고 간주됩니다. 이 경우 왼쪽 상단에 가장 가까운 패턴을 사용하십시오 (예 :이 예의 첫 번째 옵션).
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

보너스 포인트는 당신은 어떤을 위해 작동 할 수있는 경우 XY 크기의 격자입니다. ( 편집 : 합리적인 범위 내. 개념 증명에는 최대 4x4이면 충분합니다.)

위키 기사를 읽으면이 퍼즐의 규칙에 맞는 45 가지 패턴 (공백 포함)이 나타납니다.


그것은 세지 않지만 아주 가깝습니다. 를 들어 xX 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 비트 번호를 작성하고, 매 초마다 비트 사이에 줄 바꿈을 첨가 한 명백한 매핑과 동일 제외 비트 그 12내 프로그램을 계산 정확히 방법은 사실과, - 교환된다. (또한 이진수로 변환하기 전에 64를 숫자에 추가 한 다음 여분의 높은 비트를 제거하십시오. 골프 스크립트 base는 그렇지 않으면 선행 0을 반환하지 않기 때문에 숫자를 6 비트로 0으로 채우는 것입니다.)

추신. 여기 온라인 데모. (서버가 최근 과부하 상태 인 것 같습니다. 시간 초과가 발생하면 다시 시도하거나 인터프리터를 다운로드하여 로컬에서 테스트하십시오.)

편집 : 불필요한 배열 작성 및 덤프를 피하여 두 문자를 저장하도록 관리했습니다. 휴!


2
세부 사항을 추가 하시겠습니까? 이 매핑을 어떻게 정의하고 있는지 알고 싶습니다.
ardnew

@ardnew : 완료, 위 참조.
Ilmari Karonen

나는 이것이 많은 사람들의 대답을 바꿀 것이라고 생각합니다. :-)
Hand-E-Food

3

매스 매 티카 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

펄, 71 67 65 문자

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

int를 이진수로 변환하고 음역을 수행하며 두 문자마다 줄 바꿈을 추가하십시오. 이 /^#/m테스트는 가장 왼쪽 열에 돌출부가없는 두 가지 패턴 (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 변환 대체 -#대한01 모든 $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 제안 사용 및 x by y 그리드 솔루션 추가

편집 : 어떻게 든 독창성에 대한 마지막 제약을 놓쳤습니다. 이 스크립트는 45 개뿐만 아니라 가능한 모든 시퀀스를 생성합니다.

편집 : 118까지 백업하지만 이제는 정확합니다.


교체 ['#','-']'#-'
윈스턴 Ewert

2

J, 35 33 자

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

Ilmari Karonen이 자신의 Golfscript 솔루션에서 제시 한 접근 방식을 사용합니다. 그러나 J 동사 #:(antibase)는 비트 (또는 일반적인 경우에는 숫자)를 목록에 저장하므로 오른쪽 대신 왼쪽에서 색인을 생성해야합니다 (즉, 색인 0은 가장 왼쪽, 가장 높은 비트).

해결책은 다소 간단 합니다. 20+i.44숫자 목록을 20..63포함합니다. #:이 목록에있는 각 요소의 antibase-2를 가져 와서 해당 범위의 각 숫자에 대한 비트 패턴 목록을 생성합니다. {비트를 올바른 패턴으로 선택 (기본적으로 재정렬) 한 다음 {출력을 준비하기 위해 문자열 '-#'의 숫자로 숫자를 사용하기 위해 다시 사용됩니다. 마지막으로 각 항목을 $(모양)이있는 2x3 사각형으로 정렬합니다 .


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필요 변환하지 않으려면, 그래서 튜플은 :), 이미
놈들은
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.