सभी संभव ब्रेल वर्ण लिखें


13

एक दिलचस्प पहेली मुझे आज सुबह लिफ्ट के बटनों को देखकर आई।

आपको सभी ब्रेल पैटर्न की एक सूची तैयार करनी होगी जो 2x3 ग्रिड में फिट होती है। एक सपाट क्षेत्र #को निरूपित करने के लिए एक टक्कर और एक हाइफ़न -को निरूपित करने के लिए हैश का उपयोग करें ।

अपेक्षित आउटपुट नमूना:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

नियम:

  • आपके प्रोग्राम को प्रत्येक पैटर्न को कम से कम एक वर्ण या पंक्ति द्वारा अलग करना होगा।
  • पैटर्न किसी भी क्रम में उत्पन्न हो सकते हैं।
  • सभी पैटर्न, चाहे ब्रेल वर्णमाला वास्तव में उपयोग करता है, का उत्पादन किया जाना चाहिए। पूरी तरह से खाली पैटर्न वैकल्पिक है।
  • केवल अद्वितीय बंप पैटर्न उत्पन्न किया जाना चाहिए। निम्न पैटर्न को समतुल्य माना जाता है क्योंकि धक्कों एक समान व्यवस्था में हैं। इन मामलों में, पैटर्न का उपयोग करें जो शीर्ष-बाएं कोने के सबसे करीब है (जैसे कि इस उदाहरण में पहला विकल्प।)
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

बोनस अंक यदि आप इसे y आकार के ग्रिड द्वारा किसी भी x के लिए काम कर सकते हैं । ( EDIT: उचित सीमा के भीतर। 4x4 तक अवधारणा के प्रमाण के लिए पर्याप्त है।)

विकी लेख को पढ़ने पर, ऐसा प्रतीत होता है कि इस पहेली के नियमों को पूरा करने वाले 45 पैटर्न (रिक्त सहित) हैं।


यह काफी मतगणना नहीं है, लेकिन यह बहुत करीब है। के लिए 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-बिट संख्या लिखने और हर दूसरे बिट के बीच की रेखा विराम जोड़कर, द्वारा प्राप्त मानचित्रण रूप में ही है , सिवाय इसके कि बिट्स 1और 2और वास्तव में, कि वास्तव में कैसे मेरे कार्यक्रम में यह गणना करता है - लगा दिया जाता था। (मैं उन्हें बाइनरी में परिवर्तित करने से पहले 64 की संख्या भी जोड़ता हूं, और फिर अतिरिक्त उच्च बिट को बंद कर देता हूं; यह केवल 6 बिट्स के लिए संख्याओं को शून्य-पैड करने के लिए है, क्योंकि गोल्फस्क्रिप्ट baseअन्यथा किसी भी अग्रणी शून्य को वापस नहीं करेगा।)

Ps। ऑनलाइन डेमो यहाँ। (सर्वर हाल ही में अतिभारित लगता है; यदि आपको कोई टाइमआउट मिलता है, तो पुन: प्रयास करें या दुभाषिया डाउनलोड करें और स्थानीय रूप से परीक्षण करें।)

संपादित करें: अनावश्यक सरणी निर्माण और डंपिंग से बचने के लिए दो वर्णों को बचाने के लिए प्रबंधित। ओह!


2
क्या आपको कुछ विवरण जोड़ने का मन है? मुझे यह देखने में रुचि है कि आप इस मानचित्रण को कैसे परिभाषित कर रहे हैं।
2

@ कर्णदेव: हो गया, ऊपर देखिए।
इल्मरी करोनें

मुझे लगता है कि यह बहुत से लोगों के उत्तरों को बदलने वाला है। :-)
हाथ-ई-फूड

3

गणितज्ञ 97

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

ब्रेल


रिक्त शामिल नहीं है:

Length[%]

44

एनबी! = गणितज्ञ का एकल चरित्र है।


3

सी # - 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

इंट्री को बाइनरी में बदलें, लिप्यंतरण करें, और हर दो वर्णों के बाद एक नई पंक्ति जोड़ें। /^#/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 से अधिक, प्रत्येक इंट्री को बाइनरी में बदलना , प्रतिस्थापित करना -और उसके #लिए 0और 1हर $xवर्ण के बाद एक नई पंक्ति सम्मिलित करना ।

/^#/mपरीक्षण करता है कि बाएं स्तंभ में एक उठा हुआ धब्बा है, और /^.*#/परीक्षण करता है कि शीर्ष पंक्ति में एक उभड़ा हुआ गांठ है। केवल पैटर्न जो दोनों परीक्षण पास करते हैं, मुद्रित होते हैं।


अमान्य संयोजन के लिए यह खाता कैसे है?
स्कैल्वर

क्योंकि पाश शामिल नहीं 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]

संपादित करें: विंस्टन ईवर्ट सुझाव का इस्तेमाल किया और y ग्रिड समाधान द्वारा एक्स को जोड़ा

संपादित करें: मैंने किसी तरह विशिष्टता के बारे में आखिरी बाधा को याद किया। यह स्क्रिप्ट केवल 45 नहीं, सभी संभव अनुक्रम उत्पन्न करती है।

संपादित करें: 118 तक का बैक अप लेकिन अब सही


के ['#','-']साथ बदलें'#-'
विंस्टन एवर्ट

2

जे, 35 33 चार्ट

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

दृष्टिकोण का उपयोग करता है Ilmari Karonen अपने Golfscript समाधान के साथ आया था। हालांकि, चूंकि जे क्रिया #:(एंटीबॉडी) बिट्स (या, अच्छी तरह से, जेनेरिक मामले में अंक) को एक सूची में संग्रहीत करता है, हमें इसे दाएं के बजाय बाईं ओर से इंडेक्स करने की आवश्यकता है (यानी इंडेक्स 0 सबसे बाईं ओर, सबसे अधिक है)।

समाधान सीधा है: 20+i.44संख्याओं की सूची देता है 20..63, समावेशी। #:इस सूची में प्रत्येक तत्व का एंटीबेस -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एक एकल संख्या के बजाय संख्याओं की सूची के साथ काम करने के लिए कैसे ट्विक किया जा सकता है? संभवत: कुछ और चरों के बाल काट दिए जाएंगे।
फायरफली

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
बूथबी

@ बॉबी: धन्यवाद। इसके अलावा, bपहले से ही एक ट्यूपल है, इसलिए इसे परिवर्तित करने की कोई आवश्यकता नहीं है :)
quasimodo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.