เขียนอักษรเบรลล์ที่เป็นไปได้ทั้งหมด


13

ปริศนาที่น่าสนใจมาให้ฉันดูที่ปุ่มลิฟต์เมื่อเช้านี้

คุณจะต้องสร้างรายการของรูปแบบอักษรเบรลล์ทั้งหมดที่เหมาะสมในตาราง 2x3 ใช้แฮช#เพื่อแสดงถึงการชนและยัติภังค์-เพื่อแสดงพื้นที่ราบ

ตัวอย่างผลลัพธ์ที่คาดหวัง:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

กฎ:

  • โปรแกรมของคุณจะต้องแยกแต่ละรูปแบบโดยอย่างน้อยหนึ่งตัวละครหรือบรรทัด
  • รูปแบบอาจถูกสร้างขึ้นในลำดับใด ๆ
  • ทุกรูปแบบโดยไม่คำนึงถึงสิ่งที่อักษรเบรลล์ใช้จริงควรผลิต รูปแบบที่ว่างเปล่าอย่างสมบูรณ์เป็นตัวเลือก
  • ควรสร้างรูปแบบการชนที่ไม่ซ้ำกันเท่านั้น รูปแบบต่อไปนี้ได้รับการพิจารณาว่ามีความเท่าเทียมในขณะที่การกระแทกอยู่ในรูปแบบที่เหมือนกัน ในกรณีเหล่านี้ให้ใช้รูปแบบที่อยู่ใกล้กับมุมบนซ้ายมากที่สุด (เช่นตัวเลือกแรกในตัวอย่างนี้)
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

คะแนนโบนัสหากคุณสามารถทำให้มันทำงานได้สำหรับxใด ๆตามตารางขนาดy ( แก้ไข:ภายในขอบเขตที่เหมาะสมมากถึง 4x4 ก็เพียงพอสำหรับการพิสูจน์แนวคิด)

อ่านบทความ wiki ปรากฏว่ามีรูปแบบที่ 45 (รวมถึงว่าง) ที่ตรงกับกฎของปริศนานี้


มันไม่ได้ค่อนข้างจะนับ แต่มันใกล้มาก สำหรับxx yกริดคุณสร้างครั้งแรกที่2^(xy)ตัวเลขและตัวกรองจากผู้ที่สวมหน้ากากเป็น 0 กับหรือ2^x - 1 (2^(xy+1) - 1)/(2^y - 1)
Peter Taylor

คำตอบ:


6

GolfScript, 34 32 ตัวอักษร

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

ปรากฎว่ามีเป็นโซลูชั่นที่สั้นกว่าเพียงแค่การสร้างทั้งหมด 64 รูปแบบและการกรองคนไม่ดี ในความเป็นจริงโดยการแมปบิตที่เหมาะสมไปยังตำแหน่งกริดคุณสามารถแมปรูปแบบที่ถูกต้อง (ไม่ว่าง) ทั้งหมดไปยังช่วงตัวเลขที่ต่อเนื่องกันตามที่โปรแกรมนี้ทำ

โดยเฉพาะแผนที่ที่ฉันใช้คือ:

5 4
3 1
2 0

โดยที่ตัวเลขแสดงถึงตำแหน่งบิต (เริ่มจากบิตที่สำคัญน้อยที่สุด0) ที่แมปกับตำแหน่งนั้นในตาราง ด้วยการทำแผนที่นี้กริดที่ถูกต้องสอดคล้องกับตัวเลข 20 ถึง 63 รวม

นี่เกือบจะเหมือนกับการแมปที่ชัดเจนที่ได้จากการเขียนเลข 6 บิตในไบนารี่และเพิ่มตัวแบ่งบรรทัดระหว่างบิตที่สองทุกบิตยกเว้นบิต1และ2สลับกัน - และแน่นอนว่าโปรแกรมของฉันคำนวณ (ฉันยังเพิ่ม 64 ไปเป็นตัวเลขก่อนที่จะแปลงเป็นไบนารี่จากนั้นตัดบิตสูงพิเศษนั่นเป็นเพียงการทำให้ตัวเลขเป็นศูนย์เป็น 6 บิตเนื่องจาก GolfScript นั้นbaseจะไม่คืนค่าศูนย์นำหน้าใด ๆ )

ps การสาธิตออนไลน์ที่นี่ (ดูเหมือนว่าเซิร์ฟเวอร์มากเกินไปเมื่อเร็ว ๆ นี้หากคุณหมดเวลาลองอีกครั้งหรือดาวน์โหลดล่ามและทดสอบในเครื่อง)

แก้ไข:จัดการเพื่อบันทึกสองตัวอักษรโดยหลีกเลี่ยงการสร้างอาร์เรย์ที่ไม่จำเป็นและการทุ่มตลาด วุ้ย


2
คุณต้องการเพิ่มรายละเอียดไหม? ฉันสนใจที่จะดูว่าคุณกำหนดแผนที่นี้อย่างไร
ardnew

@ardnew: เสร็จแล้วดูด้านบน
Ilmari Karonen

ฉันคิดว่านี่จะเปลี่ยนคำตอบของผู้คนจำนวนมาก :-)
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จากบรรทัดคำสั่ง args ขึ้นบรรทัดใหม่มีความสำคัญ

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 แต่ละตัวเป็นไบนารี่การแทนที่-และ#สำหรับ0และ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 และเพิ่ม x ด้วยโซลูชัน y กริด

แก้ไข: ฉันพลาดข้อ จำกัด สุดท้ายเกี่ยวกับความเป็นเอกลักษณ์ สคริปต์นี้สร้างลำดับที่เป็นไปได้ทั้งหมดไม่ใช่แค่ 45

แก้ไข: สำรองสูงสุด 118 แต่ถูกต้องแล้ว


แทนที่['#','-']ด้วย'#-'
Winston Ewert

2

J, 35 33 ตัวอักษร

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

ใช้วิธีการที่ Ilmari Karonen เกิดขึ้นในโซลูชัน Golfscript ของพวกเขา อย่างไรก็ตามเนื่องจาก J verb #:(antibase) เก็บบิต (หรือ, ดี, ตัวเลขในกรณีทั่วไป) ในรายการเราจึงต้องจัดทำดัชนีจากทางซ้ายแทนขวา (เช่นดัชนี 0 เป็นบิตซ้ายสุด, สูงสุด)

การแก้ปัญหาค่อนข้างตรงไปตรงมา: 20+i.44ให้รายการของตัวเลข20..63รวม #:รับ antibase-2 ของแต่ละองค์ประกอบในรายการนี้และสร้างรายการ bitpatterns สำหรับแต่ละหมายเลขในช่วงนั้น {เลือก (โดยทั่วไปเรียงลำดับใหม่) บิตเป็นรูปแบบที่ถูกต้องจากนั้น{จะใช้อีกครั้งเพื่อใช้ตัวเลขเป็นดัชนีในสตริง '- #' เพื่อเตรียมเอาต์พุต ในที่สุดเราก็จัดเรียงแต่ละรายการให้เป็นสี่เหลี่ยม 2-by-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สามารถ tweaked ในการทำงานกับรายการตัวเลขมากกว่าหมายเลขเดียวหรือไม่? อาจจะโกนทิ้งตัวละครอีกสองสามตัว
FireFly

1

Python - 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เป็น tuple อยู่แล้วจึงไม่จำเป็นต้องแปลงเป็น :)
quasimodo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.