Viết tất cả các ký tự chữ nổi có thể


13

Một câu đố thú vị đã đến với tôi khi nhìn vào các nút thang máy sáng nay.

Bạn được yêu cầu tạo một danh sách tất cả các mẫu chữ nổi phù hợp với lưới 2x3. Sử dụng hàm băm #để biểu thị một vết sưng và dấu gạch nối -để biểu thị một vùng phẳng.

Mẫu đầu ra dự kiến:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

Quy tắc:

  • Chương trình của bạn phải phân tách từng mẫu bằng ít nhất một ký tự hoặc dòng.
  • Các mẫu có thể được tạo ra theo thứ tự bất kỳ.
  • Tất cả các mẫu, bất kể bảng chữ cái chữ nổi thực sự sử dụng, nên được sản xuất. Các mẫu hoàn toàn trống là tùy chọn.
  • Chỉ nên tạo ra các mẫu vết sưng độc đáo. Các mô hình sau đây được coi là tương đương vì các va chạm trong một sự khác biệt giống hệt nhau. Trong những trường hợp này, sử dụng mẫu gần góc trên cùng bên trái (nghĩa là tùy chọn đầu tiên trong ví dụ này.)
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

Điểm thưởng nếu bạn có thể làm cho nó làm việc cho bất kỳ x bởi y lưới có kích thước. ( EDIT: Trong giới hạn hợp lý. Lên đến 4 x 4 là đủ để chứng minh khái niệm.)

Đọc bài viết wiki, có vẻ như có 45 mẫu (bao gồm cả trống) đáp ứng quy tắc của câu đố này.


Nó không hoàn toàn đếm, nhưng nó rất gần. Dành choxy lưới x, bạn tạo các 2^(xy)số đầu tiên và lọc ra các số có mặt nạ bằng 0 so với 2^x - 1hoặc (2^(xy+1) - 1)/(2^y - 1).
Peter Taylor

Câu trả lời:


6

GolfScript, 34 32 ký tự

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

Hóa ra, có những giải pháp ngắn hơn là chỉ tạo ra tất cả 64 mẫu và lọc ra những mẫu xấu. Trong thực tế, bằng cách ánh xạ các bit phù hợp vào các vị trí lưới, có thể ánh xạ tất cả các mẫu hợp lệ (không trống) sang một dãy số liên tiếp, như chương trình này thực hiện.

Cụ thể, ánh xạ tôi sử dụng là:

5 4
3 1
2 0

trong đó các số biểu thị vị trí bit (bắt đầu từ bit có trọng số thấp nhất 0) được ánh xạ tới vị trí đó trong lưới. Với ánh xạ này, các lưới hợp lệ tương ứng với các số từ 20 đến 63.

Điều này gần giống như ánh xạ rõ ràng thu được bằng cách viết ra số 6 bit ở dạng nhị phân và thêm ngắt dòng giữa mỗi bit, ngoại trừ các bit 12được hoán đổi - và thực sự, đó chính xác là cách chương trình của tôi tính toán nó. (Tôi cũng thêm 64 vào các số trước khi chuyển đổi chúng thành nhị phân, sau đó loại bỏ bit cực cao; đó chỉ là không đệm các số thành 6 bit, vì basenếu không thì GolfScript sẽ không trả về bất kỳ số 0 đứng đầu nào.)

Thi thiên Demo trực tuyến tại đây. (Gần đây máy chủ có vẻ bị quá tải; nếu bạn hết thời gian chờ, hãy thử lại hoặc tải xuống trình thông dịch và kiểm tra cục bộ.)

Chỉnh sửa: Được quản lý để lưu hai ký tự bằng cách tránh xây dựng mảng và đổ rác không cần thiết. Phù!


2
Bạn có nhớ thêm một số chi tiết? Tôi quan tâm để xem cách bạn xác định ánh xạ này.
ardew

@ardnew: Xong, xem ở trên.
Ilmari Karonen

Tôi nghĩ rằng điều này sẽ thay đổi rất nhiều câu trả lời của mọi người. :-)
Thực phẩm điện tử cầm tay

3

Toán học 97

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

chữ nổi


Trống không được bao gồm:

Length[%]

44

NB! = Là một ký tự đơn trong Mathicala.


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();}}}}

Phiên bản dễ đọc:

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 char

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

Chuyển đổi int thành nhị phân, thực hiện chuyển ngữ và thêm một dòng mới sau mỗi hai ký tự. Các /^#/mthử nghiệm loại bỏ hai mô hình (20 và 21) mà không có một vết sưng tấy ở cột bên trái.

Giải pháp chung, 150 106 103 100 char

Đọc xytừ dòng lệnh args. Dòng mới có ý nghĩa

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

Lặp lại hơn 0..2 xy như trước, chuyển đổi từng int thành nhị phân, thay thế -#cho 01, và chèn một dòng mới sau mỗi $xký tự.

/^#/m kiểm tra rằng có một vết sưng nổi lên ở cột ngoài cùng bên trái và /^.*#/ kiểm tra xem có một vết sưng nào ở hàng trên cùng không. Chỉ có các mẫu vượt qua cả hai bài kiểm tra được in.


Làm thế nào để tài khoản này cho các kết hợp không hợp lệ?
scleaver

Bởi vì vòng lặp loại trừ các mẫu cho 1..17, 20 và 21.
mob

2

Con trăn 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]

Chỉnh sửa: đã sử dụng đề xuất Winston Ewert và thêm x bởi y giải pháp lưới

Chỉnh sửa: Tôi bằng cách nào đó đã bỏ lỡ các ràng buộc cuối cùng về tính độc đáo. Kịch bản này tạo ra tất cả các chuỗi có thể, không chỉ 45.

Chỉnh sửa: Sao lưu lên tới 118 nhưng giờ đã chính xác


Thay thế ['#','-']bằng'#-'
Winston Ewert

2

J, 35 33 ký tự

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

Sử dụng phương pháp mà Ilmari Karonen đã đưa ra trong giải pháp Golfscript của họ. Tuy nhiên, vì động từ J #:(antase) lưu trữ các bit (hoặc, tốt, các chữ số trong trường hợp chung) trong một danh sách, chúng ta cần lập chỉ mục từ bên trái thay vì bên phải (tức là chỉ số 0 là bit ngoài cùng, cao nhất).

Giải pháp khá đơn giản: 20+i.44đưa ra một danh sách các con số 20..63, bao gồm. #:lấy kháng thể-2 của mỗi thành phần trong danh sách này và do đó tạo ra một danh sách các bitpotype cho mỗi số trong phạm vi đó. {chọn (về cơ bản sắp xếp lại) các bit vào đúng mẫu và sau đó {được sử dụng lại để sử dụng các chữ số làm chỉ số trong chuỗi '- #' để chuẩn bị đầu ra. Cuối cùng, chúng tôi sắp xếp mỗi mục vào một hình chữ nhật 2 x 3 với $(hình).


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


Có ai biết làm thế nào một cái gì đó như (0 2 3 ,. 1 4 5) { #: 44có thể được điều chỉnh để làm việc với một danh sách các số chứ không phải là một số duy nhất? Có lẽ sẽ cạo đi một vài ký tự.
FireFly

1

Con trăn - 121 112

trống không được bao gồm

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)

bạn có thể cắt sản phẩm đó với '_#',repeat=6->*['_#']*6
boothby

@boothby: cảm ơn. Ngoài ra, bđã là một tuple, vì vậy không cần phải chuyển đổi nó :)
quasimodo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.