Tüm olası Braille karakterlerini yazın


13

Bu sabah asansör düğmelerine bakarken ilginç bir bulmaca geldi.

2x3 ızgarasına uyan tüm Braille kalıplarının bir listesini oluşturmanız gerekir . #Bir yumru belirtmek için bir karma ve -düz bir alanı belirtmek için bir tire kullanın.

Beklenen çıktı örneği:

#-
--
--

##
--
--

#-
#-
--

(and so on...)

Kurallar:

  • Programınız her bir deseni en az bir karakter veya satırla ayırmalıdır.
  • Desenler herhangi bir sırada oluşturulabilir.
  • Braille alfabesinin ne kullandığına bakılmaksızın tüm desenler üretilmelidir. Tamamen boş desen isteğe bağlıdır.
  • Yalnızca benzersiz yumru modelleri oluşturulmalıdır. Aşağıdaki kalıplar, çarpmalar aynı düzenlemede olduğu için eşit kabul edilir. Bu durumlarda, sol üst köşeye en yakın deseni kullanın (yani, bu örnekteki ilk seçenek.)
#-  -#  --  --
#-  -#  #-  -#
--  --  #-  -#

Bonus puan Eğer herhangi biri için çalışması eğer x tarafından y büyüklüğünde ızgara. ( DÜZENLEME: Makul sınırlar dahilinde. Kavramın kanıtı için 4x4'e kadar yeterlidir.)

Wiki makalesini okurken, bu bulmacanın kurallarını karşılayan 45 desen (boşluk dahil) var.


Çok sayılmaz, ama çok yakın. For xx yilk üretmek ızgaraları 2^(xy)karşı 0'a maske olanlar dışarı numaraları ve filtreyi 2^x - 1ya (2^(xy+1) - 1)/(2^y - 1).
Peter Taylor

Yanıtlar:


6

GolfScript, 34 32 karakter

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

Oradaki Dönüşler dışında olan sadece 64 kalıpları oluşturmayı ve kötü olanları filtreleyerek daha kısa çözümleri. Aslında, bitleri ızgara konumlarına uygun şekilde eşleyerek, bu programdaki gibi tüm geçerli (boş olmayan) kalıpları ardışık bir sayı aralığına eşlemek mümkündür.

Özellikle, kullandığım eşleme:

5 4
3 1
2 0

burada sayılar 0, ızgaradaki o konuma eşlenen bit konumunu (en küçük anlamlı bitten başlayarak ) gösterir. Bu eşleme ile, geçerli ızgaralar 20 ila 63 arasındaki sayılara karşılık gelir.

Bu neredeyse 6 bitlik sayıyı ikili olarak yazarak ve her iki bit arasına satır sonları ekleyerek elde edilen bariz eşleme ile aynıdır , ancak bitler 1ve 2yer değiştirmeleri hariç - ve gerçekten de programım tam olarak bu şekilde hesaplar. (Ayrıca sayıları ikiliye dönüştürmeden önce 64 eklerim ve daha sonra ekstra yüksek biti çıkarırım; bu, sayıları 6 bite sıfırlamaktır, çünkü GolfScript'ler baseaksi takdirde önde gelen sıfırlar döndürmez.)

Ps. Online demo burada. (Sunucu son zamanlarda aşırı yüklenmiş gibi görünüyor; bir zaman aşımı alırsanız, tekrar deneyin veya yorumlayıcıyı indirin ve yerel olarak test edin.)

Düzenleme: Gereksiz dizi oluşturma ve boşaltma kaçınarak iki karakter kaydetmek için yönetilir. Uf!


2
Bazı ayrıntılar eklemek ister misiniz? Bu eşlemeyi nasıl tanımladığınızı görmek istiyorum.
ardnew

@ardnew: Bitti, yukarıya bakın.
Ilmari Karonen

Bence bu birçok insanın yanıtını değiştirecek. :-)
Hand-E-Food

3

Mathematica 97

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

körler alfabesi


Boşluk dahil değildir:

Length[%]

44

NB! = Mathematica'da tek bir karakterdir.


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

Okunabilir sürüm:

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 karakter

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

İnt'yi ikiliye dönüştürün, harf çevirisi yapın ve her iki karakterden sonra bir yeni satır ekleyin. /^#/mTest sol sütununda bir yükseltilmiş yumru sahip olmayan iki kalıpları (20 ve 21) ortadan kaldırır.

Genel çözelti, 150 106 103 100 karakter

Komut satırı argümanlarını okuyun xve yalın. Yeni satırlar önemlidir

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

Bıkmadan üzerinde 0..2 xy önceki gibi, ikili her int dönüştürmek yerine -ve #için 0ve 1ve her sonrasında bir yeni satır ekleme $xkarakterler.

/^#/men sol sütunda /^.*#/yükseltilmiş bir yumru olduğunu test eder ve üst sırada yükseltilmiş bir yumru olduğunu test eder. Yalnızca her iki testi de geçen desenler yazdırılır.


Bu geçersiz kombinasyonları nasıl açıklıyor?
scleaver

Çünkü döngü 1..17, 20 ve 21 kalıplarını hariç tutar.
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]

Düzenleme: Winston Ewert önerisini kullandı ve x by y grid solution ekledi

Düzenleme: Bir şekilde benzersizlik ile ilgili son kısıtlamayı kaçırdım. Bu komut dosyası, sadece 45 değil tüm olası dizileri oluşturur.

Düzenleme: 118'e kadar yedekle ama şimdi doğru


Değiştir ['#','-']ile'#-'
Winston Ewert

2

J, 35 33 karakter

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

Ilmari Karonen, Golfscript çözümlerinde ortaya çıkan yaklaşımı kullanır. Bununla birlikte, J fiili #:(antibaz) bitleri (veya genel durumdaki rakamları) bir listede sakladığından, onu sağ yerine soldan dizine eklememiz gerekir (yani, dizin 0 en soldaki, en yüksek bittir).

Çözüm oldukça basittir: dahil 20+i.44sayıların bir listesini verir 20..63. #:bu listedeki her bir elementin antibaz-2'sini alır ve böylece o aralıktaki her sayı için bir bit-bitleri listesi üretir. {bitleri doğru desene (temelde yeniden sıralar) seçer ve ardından {çıktıyı hazırlamak için rakamları '- #' dizesindeki dizinler olarak kullanmak için tekrar kullanılır. Son olarak, her girişi $(şekil) ile 2'ye 3 dikdörtgen şeklinde düzenliyoruz .


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


Herkes (0 2 3 ,. 1 4 5) { #: 44tek bir sayı yerine bir sayı listesi ile çalışmak için nasıl tweaked olabilir biliyor mu ? Muhtemelen birkaç karakter daha tıraş olur.
FireFly

1

Python - 121 112

boşluk dahil değildir

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)

bu ürünü '_#',repeat=6->*['_#']*6
boothby ile

@ boothby: teşekkürler. Ayrıca, bzaten bir demet olduğunu, bu yüzden onu dönüştürmek gerek :)
quasimodo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.