Braille grafikleri


46

4x2 bloklar halinde bir boolean matris kesin ve Braille karakter olarak bunları işlemek U+2800... U+28FF.

[[0,1,0,0,1,0],
 [1,0,0,0,0,0],
 [1,0,0,0,1,0],
 [1,1,1,1,0,0]]

⣎⣀⠅

Boyutları 4 ve 2'nin katı değilse, 0-s'yle doldurun.

[[0,1,0],
 [1,0,0],
 [1,1,1]]

⠮⠄

Her zamanki golf oynama kuralları geçerlidir, giriş biçiminde esnektir. Çıktı, bir matrisin yapısına sahip olmalı veya bir matris gibi görünmelidir, örneğin, dizelerin listesi; newlines ile tek dize.

İpucu: chr(0x2800 + 128*b7 + 64*b6 + 32*b5 + 16*b4 + 8*b3 + 4*b2 + 2*b1 + b0)nokta deseni

b0 b3
b1 b4
b2 b5
b6 b7

Büyük test:

[[0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0],
 [0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1],
 [0,1,1,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1],
 [1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1],
 [1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1,0],
 [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0],
 [1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0],
 [1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,1],
 [1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,0],
 [1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,0],
 [1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0],
 [1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,1,0,0,1,1,0,0],
 [0,1,1,0,1,1,1,0,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0],
 [0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0],
 [0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,1,1,1,1,0]]

⣰⠟⠻⣦⠀⠠⠾⡇⢠⡞⢛⡆
⣿⢠⣬⣥⠄⣀⠀⡇⢈⣻⣈⡀
⣿⠘⢹⡇⡞⠙⡇⣧⡉⢹⡏⠀
⠘⠷⠟⠁⠳⠾⠃⠘⠇⠾⠧⠀

İkinci meydan okuma için tebrikler.
Adám

5
Daha iyi açıklama: Satırları siyah beyaz (piksel başına 1 bit) çerçeve arabelleğinin veya grafik tuvalinin yatay raster çizgilerini temsil eden 2B Boolean değer dizisine sahipsiniz. Bu kanvasın tüm 4x2 dikdörtgen bloklarını Unicode Braille karakterlerine kodlayın. Kesirli blokları kenarlarından tutmak için, kanvasın genişliğini 2 katına, yüksekliğini dörde katlayın, sıfırlarla (veya aksi halde eşit çıktının olmasını sağlayın, verileri öyle doluymuş gibi yapın).
Kaz

3
@Kaz bilmiyorum, şahsen gerçekten bu yazının özlü olduğunu takdir ediyorum. IMO, daha fazla yazarak fazla netlik eklenmeyecek (yüksekliğin 4 katı ve 2 genişliğinin olması gerektiğine dikkat çeken birkaç küçük açıklamanın yanı sıra); Önerin benim için şu anki yazıdan daha zor.
Quelklef

Yanıtlar:


10

Jöle ,  31  30 bayt

sz0Z
ç€2ZF€ç€8Zœ?@€€-36Ḅ+⁽$ṁỌY

Çevrimiçi deneyin!

Nasıl?

sz0Z - Link 1, split & right-pad with zeros: list, items; number, chunkSize
s    - split items into chunks of length chunkSize
 z0  - transpose with filler zero
   Z - transpose

ç€2ZF€ç€8Zœ?@€€-36Ḅ+⁽$ṁỌY - Main link: list of lists of numbers (1s & 0s), M
ç€2                       - call the last link (1) as a dyad for €ach (left=M, right=2)
                          -  ((left,right) bits read left-right then top-bottom)
   Z                      - transpose the resulting list of lists of lists
                          -  ((left, right) bits read top-bottom then left-right)
    F€                    - flatten €ach
      ç€8                 - call the last link (1) as a dyad for €ach (left=^, right=8)
         Z                - transpose the resulting list of lists of lists
                          -  ("blocks" each and all read left-right top-to bottom)
               -36        - literal -36
             €€           - for €ach (block-wise row) for €ach (block)
          œ?@             -   lexicographical permutation with reversed arguments
                          -    (get the permutation at index -36 (modular) in a list of
                          -     all permutations of the indexes sorted lexicographically.
                          -     That is the 8!-36 = 40284th - equivalently the values at
                          -     indexes [8,7,6,4,2,5,3,1])
                  Ḅ       - convert from binary list to integer (vectorises)
                    ⁽$ṁ   - base 250 literal = 10240
                   +      - add
                       Ọ  - cast to character (vectorises)
                        Y - join with newlines
                          - implicit print

1'den büyük "rakamları" destekliyor mu ? Sonuca 10240 (0x2800 - iki bayt) eklemek yerine, ikili basamaklı vektörlere 40 (0x28 - bir bayt) hazırlayabilirsiniz. Jelly hakkında fazla bir şey bilmiyorum, bu yüzden bunun gerçekten işe yarayacağından emin değilim.
22'de

Gerçekten de, önerdiğiniz gibi 40'lık bir basamağı dönüştürürdüm, ancak daha fazla kod baytı ( ) gerektiren bence her listeye (2 derinlikte ;@€€40Ḅ) hazırlanmamız gerekiyor.
Jonathan Allan,

6

JavaScript ES7 210 207 201 200 198 194 185 183 bayt

a=>eval('for(y=0,c="";A=a[y];y+=4,c+=`\n`)for(x=0;A[x]+1;x+=2)c+=String.fromCharCode(10240+eval("for(N=k=0;k<6;k++)N+=(g=(X,Y=3)=>(a[Y+y]||0)[X+x]|0)(k>2,k%3)*2**k")|g(0)+g(1)*2<<6)')

Ngn sayesinde 4 bayt kaydedildi

Luke sayesinde 3 bayt kurtarıldı

Nasıl çalışır

Kodu parçalara ayıracağım ve ayrı ayrı konuşacağım:

for(y=x=0, c=""; a[y]; x+=2)
    !((a[y] || [])[x]+1) && (y+=4,x=0,c+=`\n`)

Burası her değişkenin bildirildiği yerdir. xve y"imleç" in konumu (geçerli braille karakterinin sol üst kenarı). X koordinatı her tekrarlamada 2 artar ve indeks ile bir satır olmadığında durur y( undefinedmevcut değilse, bir [x] döner , bu da false'a dönüşür).

İkinci sırada birden fazla numara var. (a[y] || [])[x]Konumdaki değere bakmanın (x, y)hata atmamasını sağlar. Her &&zamanki ve işleçtir ve sol doğruysa ifadenin yalnızca sağ tarafını denetler. Bu çevrilebilir

if (!((a[y] || [])[x] + 1)) 
    y+=4,x=0,c+=`\n`

Bir sonraki bölüm:

c+=String.fromCharCode(10240+eval("for(N=k=0;k<6;k++)N+=(g=(x,y)=>(a[y]||[])[x]||0)(~~(k/3)+x,k%3+y)*2**k,N")+g(x,y+3)*64+g(x+1,y+3)*128)

String.fromCharCodesadece iletilen sayıyı aynı karakter koduna sahip bir unicode karakterine dönüştürür. Parantez içindeki ifade, Braille karakterinin dizinini hesaplar:

for(N=k=0;k<6;k++)N+=(g=(x,y)=>(a[y]||[])[x]||0)(~~(k/3)+x,k%3+y)*2**k

İçindeki pozisyondan geçer

1 4
2 5
3 6

order, bu pozisyonlardaki değerleri i ile 2 ile çarpın , burada indeks olur ve bunları birlikte ekler.

g=(x,y)=>(a[y]||[])[x]||0

Bölüm, bir ve koordinat gverilen pozisyonun dizinin sınırları dışında kalması durumunda pozisyondaki değeri ya da 0 değerini döndüren bir lambda fonksiyonunu bildirir .xy(x, y)

+g(x,y+3)*64+g(x+1,y+3)*128

Bu bölüm, biraz önce tanımlanmış olan işlevi kullanarak son iki konumu doğru ağırlıkta ekler.

Son fakat en az değil

a=>eval('...')

bölüm 2 fonksiyona sahiptir. Anonim bir lambda tanımlar ve for döngüsünün herhangi bir soruna yol açmamasını sağlar (bunun gibi tek satırlık bir lambda sadece döngü için bir tek içeremez, bir değerlendirme bunu engeller).


birkaç basit öneri: ||0-> |0; ~~(k/3)-> (k>2); *128-> <<7( +-s ile |-s değiştirilir )
ngn

ES7 sürümünü neden birincil çözümünüz olarak göndermiyorsunuz?
Shaggy

@Shaggy Henüz herkes ES7 çalıştıramaz, bu yüzden bir yedekleme
Bálint

Bu önemli değil 'Bu parçalar etrafında;) Kodunuzu doğru çalıştırabilir bir tek tercüman (tarayıcı) olduğu sürece, burada geçerli olduğu kabul edilir.
Shaggy

@ngn İlk ikisi için teşekkürler, ama bit kaydırma temelde her şeyden daha düşük önceliğe sahip, bu yüzden işe yaramaz
Bálint

6

Mathematica, 126 110 97 90

FromCharacterCode[10240+ListCorrelate[2^{{0,3},{1,4},{2,5},{6,7}},#,1,0][[;;;;4,;;;;2]]]&

Bu çözelti yararlanır ListCorrelateiçin bir matris boyunca (ters) bir çekirdek evriştirilir esas olarak kayar matris çarpım (veya nokta ürün) olup. Burada görsel bir açıklamaya bakınız . 0Dördüncü argüman kullanılarak doldurma yapılır . Aşağıdaki örnekte, sonucun yukarıdaki ipucuyla eşleşmesini bekliyoruz:

ListCorrelate[
  2^{{0, 3}, {1, 4}, {2, 5}, {6, 7}},
  {{b0, b3}, {b1, b4}, {b2, b5}, {b6, b7}}
]

(* returns {{b0 + 2 b1 + 4 b2 + 8 b3 + 16 b4 + 32 b5 + 64 b6 + 128 b7}} *)

ListConvolveÜçüncü argüman olacağından, bunun daha kısa olmadığını unutmayın -1.

Bu, çekirdeği matrisin her pozisyonunda uyguladığından, her dördüncü satırdaki ve ikinci sütundaki elemanları çıkarmamız gerekir. Biz kestirme kullanmak Spanve Part: [[;;;;4,;;;;2]].

Faydalı FromCharacterCodebir karakter kodları matrisi alabilir ve bir dizge listesi döndürür.


Bu çözüm, izin verilen çıktı biçimlerinden biri olan dizelerin bir listesini döndürür. Basitçe Column@çıktının “bir matris gibi görünmesini” sağlayın.


Ücretsiz çevrimiçi bir Mathematica not defterinde bununla oynayabilirsiniz. Buraya gidin , Yeni Not Defteri Oluştur'u tıklatın, bir dakika bekleyin, bu kodu yapıştırın ve ardından düğmesine basın shift+enter.

m1={{0,1,0,0,1,0},{1,0,0,0,0,0},{1,0,0,0,1,0},{1,1,1,1,0,0}};
m2={{0,1,0},{1,0,0},{1,1,1}};
m3={{0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0},{0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1},{0,1,1,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1},{1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1,0},{1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0},{1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0},{1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,1},{1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,0},{1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,0},{1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0},{1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,1,0,0,1,1,0,0},{0,1,1,0,1,1,1,0,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0},{0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0},{0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,1,1,1,1,0}};

MatrixToBraille := Column@
  FromCharacterCode[10240+ListCorrelate[2^{{0,3},{1,4},{2,5},{6,7}},#,1,0][[;;;;4,;;;;2]]]&

MatrixToBraille/@{m1,m2,m3}

O zaman şunu görmelisin:


5

Dyalog APL, 133 122 114 112 101 100 98 95 95 94 93 90 88 86 bayt

Devraldı ⎕IO←0

{C⍴{⎕UCS 10240+2⊥(∊S⌷⍨⍵+⍳¨A)[⍎¨⍕76531420]}¨(,b)/,⍳⍴b←{0 0≡A|⍵}¨⍳⍴S←⍵↑⍨A×C←⌈(⍴⍵)÷A←4 2}

- Sohbet sırasında @ Adám sayesinde 8 9 12 bayt

@Ngn sayesinde -2 bayt

Çevrimiçi deneyin!

Nasıl (giriş )?

  • A←4 2, vektörü 4 2değişkende saklayınA
  • (⍴⍵)÷, bölünmüş boyutlarıA
  • , tavan
  • C←, saklandı C
  • , çarpılır A
  • ⍵↑⍨, bu boyutlara uygun
  • S←, saklandı S
  • ⍳⍴, indeksleri S
  • {0 0≡A|⍵}¨, 1bir hücrenin sol üst olduğu, 0her yerde
  • (,b)/,⍳⍴b←, truthy endeksleri
  • {⎕UCS 10240+2⊥(∊S⌷⍨⍵+⍳¨A)[⍎¨⍕76531420]}¨, her öğeyi braille haline getirin
  • C⍴, boyutları yeniden biçimlendirmek C

düşünün +/(2*0 3 1,A,4+⍳3)×something2⊥something[⍎¨⍕76524130]
ngn

Bunu şimdi değiştirdiğim için hala çalışıyor ⎕IO←0mu?
Zacharý

Aslında, sadece işe yarayacak ⎕IO←0:)
ngn

Bunu denedim, yanlış bir şey mi yapıyorum? tio.run/…
Zacharý

Üzgünüm, APL’de bu aptalca şeyi ( ⎕IO) unuttum . İçin ⎕IO←1tabii ki 76524130. her basamağa 1 eklemek olurdu,
ngn

4

JavaScript, 136 bayt

a=>(b=a.map(x=>[]),a.map((l,i)=>l.map((c,j)=>b[i>>2][j>>1]|=c<<'01263457'[i%4+j*4%8])),b.map(l=>l.map(c=>String.fromCharCode(10240+c))))

Ngn sayesinde , bit kaydırma kullanmak 4 bayttan tasarruf sağlar.


bit kaydırmayı kullanabilirsiniz i/4|0->i>>2
ngn 28:17

c*2**o da biraz vardiya :)
ngn

4

Python 2 + drawille , 141 125 120 116 bayt

Ngn ve L3viathan sayesinde 16 bayt kurtardı

L3viathan sayesinde 5 bayt kurtarıldı

Ngn sayesinde 4 byte kurtarıldı

from drawille import*
def a(d,c=Canvas(),e=enumerate):[c.set(j,i)for i,x in e(d)for j,y in e(x)if y];print c.frame()

Çevrimiçi deneyin!

tio çekmeceye takılı olmadığı için çalışmaz


Python ve pilleri! :) Beni şaşırtmadı. Kullanırsanız enumerate()ve bir liste anlaşması yaparsanız, bunu 120 baytın altına daraltabilirsiniz .
ngn

Fonksiyonu bir liner yaparak birkaç bayttan def b(d,c=l.Canvas()):print([c.set(j,i)for i,x in enumerate(d)for j,y in enumerate(x)if y]and c).frame()
tasarruf edin


and c;print c.frame()
Numaraya

3

APL (Dyalog) , 57 54 bayt *

-3 OP sayesinde. Boole matrisi için bilgi istemi. Karakter matrisini yazdırır.

1↓⎕UCS{240,⌽(,⍉3↑⍵),⊢⌿⍵}⌺(2 24 2)⊢0⍪⍣3⍪∘03⊢⎕,0

Çevrimiçi deneyin!

⎕,0 sağa bir sıfır ekleyin (sütun sayısı eşitse yoksayılır)

 verim (ayırmak 3ve )

⍪∘0⍣3 üç kere üzerine sıfırlar ekle (çünkü kısmi pencereleri düşürür)

0⍪⍣3 üstte üç kez sıfır yığınları (çünkü sol üst köşede başlar)

 ki (ayırır parantez ve verim 0)

{}⌺(2 2⍴4 2) Her 4 satır 2 sütun penceresinde, 4 satır dikey ve 2 satır yatay adım:

⊢⌿⍵ son satır (litre dikey sağ azaltma); [b6,b7]

(), Hazırla:

  3↑ üç sıra al; [[b0,b3],[b1,b4],[b2,b5]]

   devrik; [[b0,b1,b2],[b3,b4,b5]]

  , ravel; [b0,b1,b2,b3,b4,b5]

 şimdi sahibiz [b0,b1,b2,b3,b4,b5,b6,b7]

 ters; [b7,b6,b5,b4,b3,b2,b1,b0]

40, 40 hazırlayın (40 × 2 9 = 10240 için);[40,b7,b6,b5,b4,b3,b2,b1,b0]

2⊥ baz-2 olarak değerlendir (ikili)

⎕UCS karaktere dönüştür

1↓ ilk satırı bırak (tümüyle sıfır çünkü '' dolgu '')


* Olarak Klasik, sayım olarak ⎕U233A.


Birkaç byte tasarruf etmenin kolay bir yolu var, Jelly çözümü altındaki yorumuma bakın.
ngn

Bir yanlışlık olmalı - TIO bağlantısı buraya gönderdiğiniz kodla eşleşmiyor.
ngn

sonun yakınındaki sıfır 0⍪⍣3⍪∘0⍣3⊢⎕,00⍪∘0⍣3⊢⎕,0
tuş kodudur

@ Sabit Sabit, ancak yalnızca bir hata nedeniyle ihtiyaç duyulduğuna dair bir his var ⍪∘0⍣3ve birincisi test durumlarınız için gerekli değil. ,0
Adám

Test durumlarım ayrıntılı değildir - çözüm elbette herhangi bir geçerli girdi için çalışmalıdır. Sen kısaltabilir 0⍪⍣3⍪∘0⍣3⊢⍵,0için 0(⊖⍪)⍣6⊢⍵,0.
ngn

2

Python 3 , 168 165 161 bayt

def f(m):
 while m:
  r,m,s=[*zip(*m)],m[4:],''
  while r:s+=chr(10240+sum(q<<int(w)for(q,w)in zip((r[0]+(0,)*3)[:4]+(r+[()])[1],'01263457')));r=r[2:]
  print(s)

Çevrimiçi deneyin!


Güzel golf! Arama yapmak [*zip(*m[:4])]yerine üç byte kaydedebilirsiniz list.
Lynn,


1

Python 3 , 169 bayt

a=[]
y=0
for l in eval(input()):
 y-=1;a+=y%4//3*[-~len(l)//2*[10240]];x=0
 for v in l:a[-1][x//2]|=v<<(6429374>>y%4*6+x%2*3&7);x+=1
for l in a:print(*map(chr,l),sep='')

Çevrimiçi deneyin!


Sen yeniden yazabilirsiniz if y%4<1:a+=-~len(l)//2*[10240],olarak a+=(y%4<1)*[-~len(l)//2*[10240]]ve uygun x=0;y+=1aynı satırda. Sanırım bir bayt kazandırıyor.
ngn

@ngn oradan birkaç bayt daha kurtardı, teşekkür ederim!
Lynn,

1

Perl 5 , 164 bayt

163 bayt kodu + 1 bayrağı -p

@a=eval}{for(;$r<@a;$r+=4){for($c=0;$c<@{$a[0]};$c+=2){$n="0b";map$n.=0|$a[$r+3][$c+$_],1,0;for$y(1,0){map$n.=0|$a[$r+$_][$c+$y],2,1,0}$\.=chr 0x2800+oct$n}$\.=$/}

Çevrimiçi deneyin!

Her satırın virgülünü bir satıra ayırır.


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.