Hubungkan piksel

40

Diberikan teks seperti ini:

# #### ## #
## #  ##  #
   ####  ##

Keluarkan teks yang sama tetapi dengan menghubungkan piksel dengan karakter ─│┌┐└┘├┤┬┴┼. Jika sebuah piksel tidak memiliki tetangga, jangan mengubahnya.

Jadi output dari teks terakhir adalah:

│ ─┬── ┌─ │
└─ │  ┌┘  │
   └──┘  ─┘
  • Anda dapat mengambil input sebagai array boolean.
  • Input akan selalu mengandung setidaknya 1 piksel.
  • Anda dapat menghitung karakter kotak gambar sebagai 1 byte.
  • Anda dapat menganggap input diisi dengan spasi.

Uji kasus

## #
=>
── #
###
 #
=>
─┬─
 │
##### ##
 # #  #
########
=>
─┬─┬─ ┌─
 │ │  │
─┴─┴──┴─
 # #
#####
 # #
=>
 │ │
─┼─┼─
 │ │
# # # # #
 # # # #
# # # # #
 # # # #
# # # # #
=>
# # # # #
 # # # #
# # # # #
 # # # #
# # # # #
#####
#####
#####
#####
#####
=>
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘

Karena ini adalah , kode terpendek menang.

TuxCrafting
sumber
2
Haruskah saya menggunakan karakter hash sebagai piksel? Bisakah saya menerima input sebagai array boolean?
Rohan Jhunjhunwala
Mungkinkah ada spasi tambahan atau baris baru?
Sanchises
btw: -|r7LJE3TW+adalah pengganti 1 byte-char yang cocok untuk karakter blok.
Titus

Jawaban:

7

Jelly , 60 52 51 50 49 48 byte

ṖḤ0;+Ḋ×
“µ³Q~E!G⁸ṗṫ\’ḃ61+9471Ọ⁾# j
ZÑ€4×Z++Ñ€ị¢Y

Menyimpan satu byte berkat @ Dennis.

Input adalah array boolean dari 1 dan 0. Ulangi setiap kolom dan setiap baris untuk mengkonversi kepala dan ekor setiap infiks ukuran 3 dari sepasang digit biner ke desimal, dan mengalikannya dengan pusat setiap infiks. Kemudian jumlah itu dengan sendirinya untuk menemukan indeks '#───│┌┐┬│└┘┴│├┤┼ '.

Cobalah online! ( kasus 2 ) ( kasus 3 ) ( kasus 4 )

Penjelasan

Ini bergantung pada ide yang sama dengan jawaban saya di J tetapi alih-alih memproses pada setiap subarray 3x3, saya memproses setiap baris dan setiap kolom sambil tetap mendapatkan tabel indeks yang sama.

Lebih dari setengah byte dihabiskan untuk menghasilkan daftar karakter kotak '#───│┌┐┬│└┘┴│├┤┼ '. Literal string dimulai dengan Jelly dan memiliki arti berbeda tergantung pada terminatornya. Di sini terminator berarti bahwa string akan diuraikan sebagai titik-titik kode dari setiap karakter sesuai dengan halaman kode Jelly , dan mengkonversi dari daftar basis 250 digit ke desimal.

“µ³Q~E!G⁸ṗṫ\’ => 10041542192416299030874093
(bijective base 61) => [1, 1, 1, 3, 13, 17, 45, 3, 21, 25, 53, 3, 29, 37, 61]
(add 9471 and convert to char) => '───│┌┐┬│└┘┴│├┤┼'

Kemudian konversikan desimal itu ke daftar digit dalam basis bijective 61 dan naikkan masing-masing dengan 9471 untuk memindahkannya ke dalam rentang karakter kotak dan konversi masing-masing menggunakan Python chr. Kemudian tambahkan dengan karakter literal ”#dan tambahkan spasi .

ṖḤ0;+Ḋ×  Helper link - Input: 1d list A
Ṗ        Get all of A except the last value
 Ḥ       Double each value in it
  0;     Prepend a 0
    +    Add elementwise with
     Ḋ     All of A except the first value
      ×  Multiply elementwise by A

“µ³Q~E!G⁸ṗṫ\’ḃ61+9471Ọ⁾# j  Nilad. Represents '#───│┌┐┬│└┘┴│├┤┼ '
“µ³Q~E!G⁸ṗṫ\’               Get the code points of each char in the string and
                            convert from a list of base 250 digits to decimal
             ḃ61            Convert that to a list of digits in bijective base 61
                +9471       Add 9400 to each
                     Ọ      Convert from ordinals to chars, gets '───│┌┐┬│└┘┴│├┤┼'
                      ⁾#    A pair of chars ['#', ' ']
                         j  Join the pair using the box characters

ZÑ€4×Z++Ñ€ị¢Y  Input: 2d list M
Z              Transpose
 р            Apply the helper link to each row of the transpose (each column of M)
   4×          Multiply each by 4
     Z         Transpose
      +        Add elementwise with M
       +       Add elementwise with
        р       The helper link applied to each row of M
          ị¢   Use each result as an index to select into the nilad
            Y  Join using newlines
               Return and print implicitly
mil
sumber
15

J , 82 72 66 byte

(ucp' #───│┌┐┬│└┘┴│├┤┼'){~]+]*3 3((2#.1 7 3 5{,);._3)0,.~0,.0,~0,]

Input adalah tabel boolean dari 1 dan 0. Aturan menyatakan bahwa karakter kotak masing-masing dihitung sebagai satu byte, bukan tiga, dan yang telah diterapkan di sini.

Pemakaian

   f =: (ucp' #───│┌┐┬│└┘┴│├┤┼'){~]+]*3 3((2#.1 7 3 5{,);._3)0,.~0,.0,~0,]
   m =: 1 0 1 1 1 1 0 1 1 0 1 , 1 1 0 1 0 0 1 1 0 0 1 ,: 0 0 0 1 1 1 1 0 0 1 1
   m { ' #'
# #### ## #
## #  ##  #
   ####  ##
   f m
│ ─┬── ┌─ │
└─ │  ┌┘  │
   └──┘  ─┘
   ' #' {~ m =: 5 5 $ 1
   f m
┌┬┬┬┐
├┼┼┼┤
├┼┼┼┤
├┼┼┼┤
└┴┴┴┘
   ' #' {~ m =: 5 9 $ 1 0
# # # # #
 # # # # 
# # # # #
 # # # # 
# # # # #
   f m
# # # # #
 # # # # 
# # # # #
 # # # # 
# # # # #

Penjelasan

Pertama input diisi dengan 0 di semua sisi.

   ] m =: 1 0 1 1 1 1 0 1 1 0 1 , 1 1 0 1 0 0 1 1 0 0 1 ,: 0 0 0 1 1 1 1 0 0 1 1
1 0 1 1 1 1 0 1 1 0 1
1 1 0 1 0 0 1 1 0 0 1
0 0 0 1 1 1 1 0 0 1 1
   (0,.~0,.0,~0,]) m
0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 0 1 1 0 1 0
0 1 1 0 1 0 0 1 1 0 0 1 0
0 0 0 0 1 1 1 1 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0

Kemudian setiap subarray ukuran 3 dipilih

   3 3 <;._3 (0,.~0,.0,~0,]) m
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
│0 1 0│1 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 1│0 1 1│1 1 0│1 0 1│0 1 0│
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 1 0│1 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 1│0 1 1│1 1 0│1 0 1│0 1 0│
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
│0 0 0│0 0 0│0 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 0│0 0 1│0 1 1│1 1 0│
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│0 1 1│1 1 0│1 0 1│0 1 0│1 0 0│0 0 1│0 1 1│1 1 0│1 0 0│0 0 1│0 1 0│
│0 0 0│0 0 0│0 0 1│0 1 1│1 1 1│1 1 1│1 1 0│1 0 0│0 0 1│0 1 1│1 1 0│
│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

Maka hanya 5 nilai di setiap subarray yang dipertimbangkan

┌───┐
│xAx│
│CED│
│xBx│
└───┘

Nilai ABCD- nilai dipilih dengan meratakan masing-masing subarray dan memilih pada indeks 1 7 3 5. Nilai-nilai tersebut dikalikan dengan Eyang ada di indeks 4. Kemudian dikonversi dari daftar digit biner ke desimal, dan ditambahkan oleh E. The xnilai-nilai yang tidak diperlukan.

   3 3 (4&{([+2#.*)1 7 3 5&{)@,;._3 (0,.~0,.0,~0,]) m
 5 0 2  8 4 3  0  6 3 0  5
10 3 0 13 0 0  6 11 0 0 13
 0 0 0 10 4 4 11  0 0 2 11

Ini digunakan sebagai indeks untuk memilih karakter yang akan digambar sesuai tabel di bawah ini (disusun ulang sedikit untuk bermain golf). Kolom terakhir cocok dengan nilai output dari setiap subarray ke karakter kotak.

 0  (space)  0
 1  #        1
 2  ┌        6
 3  ┬        8
 4  ┐        7
 5  ├        14
 6  ┼        16
 7  ┤        15
 8  └        10
 9  ┴        12
10  ┘        11
11  │        5, 9, 13
12  ─        2, 3, 4

Selain itu, dalam J, string ' #───│┌┐┬│└┘┴│├┤┼'menggunakan karakter 8-bit sehingga memiliki panjang 47 (untuk setiap byte) untuk 17 karakter yang dibutuhkan. Perintah ucpmengubahnya menjadi karakter 16-bit yang memungkinkannya menjadi panjang 17.

mil
sumber
13

JavaScript (ES6), 155 121 103 102 karakter

let f =
    
s=>s.replace(/#/g,(c,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]==c,8*t(w=s.search`
`+1)+4*t(1)+2*t(-1)+t(-w)])

console.log(f(
  '# #### ## #\n' +
  '## #  ##  #\n' +
  '   ####  ##'
));

Sunting: disimpan 18 byte dengan bantuan ETHproduk
Sunting: disimpan 1 byte dengan menggunakan parameter ganti 1 () sebagai'#'

Bagaimana itu bekerja

Kami beralih pada semua #karakter yang ditemukan dalam string input. Untuk masing-masing dari mereka, kami menguji apakah tetangganya juga #karakter menggunakan t()fungsi:

t = x => s[p + x] == c  // where c = '#'

Parameter xdari t()fungsi offset tetangga sehubungan dengan posisi saat ini p. Kami menggunakan -1 / + 1 untuk menguji tetangga kiri / kanan dan -w / + w untuk tetangga atas / bawah (di mana wlebar baris, yaitu posisi break baris pertama + 1).

Setiap tetangga diberi bobot berbeda (1, 2, 4 atau 8) sesuai dengan kompas berikut:

  1
2 + 4
  8

Setiap kombinasi berat mengarah ke nilai unik dalam [0 .. 15]. Misalnya, jika tetangga di bagian atas dan tetangga di sebelah kanan ditetapkan, jumlahnya akan menjadi 1 + 4 = 5, yang diterjemahkan ke dalam menggunakan tabel ini:

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
#  │  ─  ┘  ─  └  ─  ┴  │  │  ┐  ┤  ┌  ├  ┬  ┼

Karena itu, '#│─┘─└─┴││┐┤┌├┬┼'[weight_sum]mengarah pada karakter yang diharapkan.

Arnauld
sumber
Ha, pada dasarnya kami punya ide yang sama;)
ETHproduk
@ ETHproductions - Cukup banyak. ^^
Arnauld
Sungguh, teknik yang sangat bagus di sana. Anda benar-benar tidak
bermain golf
Anda dapat menyimpan 2 byte seperti ini:s=>(w=s[0].length+1,s=s.join`\n`).replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)])
ETHproduksi
Dan sebenarnya jauh lebih pendek untuk beralih kembali ke string multiline:s=>s.replace(/#/g,(_,p)=>'#│─┘─└─┴││┐┤┌├┬┼'[t=x=>s[p+x]>' ',t(-w)+2*t(-1)+4*t(1)+8*t(w)],w=s.indexOf`\n`+1)
ETHproduksi
8

Python 2.7, 318 315 byte ( 270 267 karakter)

Saya yakin ini bisa di-golf lebih lanjut (terutama saya ingin menyingkirkan komentar lini pertama yang menyebalkan itu) tetapi inilah entri saya:

#encoding:utf-8
f=lambda t:(lambda l,s:'\n'.join(''.join((u'┼├┤│┬┌┐│┴└┘│───#'[(s==l[i][j-1])+2*(s==l[i][j+1])+4*(i<1 or s==l[i-1][j])+8*(i>len(l)-2 or s==l[i+1][j])],s)[s==l[i][j]]for j in range(len(l[i])-1))for i in range(len(l))))([l+' 'for l in t.split('\n')],' ')

Inilah penjelasan tentang bagaimana semuanya bekerja:

#encoding:utf-8 # Dammit, Python. This adds an extra 16 bytes!
f=lambda t:( # main lambda function
    lambda l,s: # inner lambda so we can pass it "local constants" (see last line)
        '\n'.join( # join each line
            ''.join( # join each char within the line
                (u'┼├┤│┬┌┐│┴└┘│───#'[ # string of all possible characters, indexed by binary 0-15 based on adjacent chars
                    (s==l[i][j-1])+ # left
                    2*(s==l[i][j+1])+ # right
                    4*(i<1 or s==l[i-1][j])+ # up ('i<1' just yields zero in case this is the first line, so that we don't get index problems)
                    8*(i>len(l)-2 or s==l[i+1][j])], # down ('i>len(l)-2' is same as above)
                s)[s==l[i][j]] # if original is space, choose space, else choose the previously chosen box-drawing char
                for j in range(len(l[i])-1)) # do this process for each char (excluding last, which is a space)
            for i in range(len(l))) # do this for each line
    )([l+' ' for l in t.split('\n')],' ') # call the inner lambda with two parameters: first, the text split into lines; second, a space char (actually makes code shorter)

EDIT: Menghapus beberapa spasi sebelumnya for ... in ...

Hactar
sumber
9
Menggunakan Python 3 sebagai gantinya harus menyelesaikan masalah penyandian Unicode Anda, saya pikir ...
Byte Commander
6

JavaScript (ES6), 150 139 133 131 karakter

a=>a.map((q,y)=>q.replace(/#/g,(c,x)=>"#│─┘─└─┴││┐┤┌├┬┼"[g=(X,Y=0)=>(a[Y+y]||[])[X+x]==c,g(0,1)*8+g(1)*4+g(-1)*2+g(0,-1)])).join`
`

Mengambil input sebagai array string, mis f(["###", " # "]).

Cuplikan tes

Produksi ETH
sumber
5

ALPACA , 414 + 2 = 416 byte

neighbourhoodV(^ v < >);states" ";statep"#"toA when4inV p,toB when3inV p andvs,toC when3inV p and^s,toD when3inV p and>s,toE when3inV p and<s,toF when2inV p and>s andvs,toG when2inV p andvs and<s,toH when2inV p and<s and^s,toI when2inV p and^s and>s,toJ when^p orvp,toK when<p or>p;stateA"┼";stateB"┴";stateC"┬";stateD"┤";stateE"├";stateF"┘";stateG"└";stateH"┌";stateI"┐";stateJ"│";stateK"─".

Membutuhkan -fIbendera.

Solusi ini menggunakan jumlah byte yang sangat besar, tetapi unik karena menggunakan otomat seluler. ALPACA biasanya digunakan sebagai bahasa logam, tapi di sini saya menggunakannya sebagai bahasa pemrograman.

Versi tidak disatukan:

neighbourhood V (^ v < >);
state s " ";
state p "#" to A when 4 in V p,
to B when 3 in V p and v s,
to C when 3 in V p and ^ s,
to D when 3 in V p and > s,
to E when 3 in V p and < s,
to F when 2 in V p and > s and v s,
to G when 2 in V p and v s and < s,
to H when 2 in V p and < s and ^ s,
to I when 2 in V p and ^ s and > s,
to J when ^ p or v p,
to K when < p or > p;
state A "┼";
state B "┴";
state C "┬";
state D "┤";
state E "├";
state F "┘";
state G "└";
state H "┌";
state I "┐";
state J "│";
state K "─".
DanTheMan
sumber
4

PHP, 203 byte

Ini mungkin dapat dilakukan dengan cara yang lebih singkat.

while($s=fgets(STDIN))$f[]=$s;foreach($f as$y=>&$s)for($x=strlen($s);$x--;)if($s[$x]>$b=" ")$s[$x]="#───│┘└┴│┐┌┬│┤├┼"[($s[$x-1]>$b)+2*($s[$x+1]>$b)+4*($f[$y-1][$x]>$b)+8*($f[$y+1][$x]>$b)];echo join($f);

membaca input dari STDIN. jalankan bersama -r.

Titus
sumber
4

Python 3, 149 byte

def f(s):S=' ';w=s.find('\n')+1;t=lambda i:(s+w*S)[i]>S;return[[c,'#│─┘─└─┴││┐┤┌├┬┼'[t(p-w)+2*t(p-1)+4*t(p+1)+8*t(p+w)]][c>S]for p,c in enumerate(s)]

Mengambil input like ##\n #\ndan mengembalikan output like ['─', '┐', '\n', ' ', '│', '\n'].

Lynn
sumber
3

R, 199 212 byte

EDIT: Ini sekarang fungsi, bukan potongan kode.

Inputnya adalah matriks m1s dan 0s. Ini sangat jelek dan berantakan.

function(m){
v=strsplit(" #─│┘│┐│┤──└┴┌┬├┼","")[[1]]
d=dim(m)+1
n=array(0,dim=d+1)
n[2:d[1],2:d[2]]=m
for(i in 0:(d[1]-2)){for(j in 0:(d[2]-2))cat(v[1+(p<-n[2+i,2+j])*sum(2^(0:3)*n[1:3+i,1:3+j][1:4*2])+p]);cat("\n")}
}

Beberapa tes:

> m = matrix(c(1, 1, 1, 0, 1, 0), nrow=2, byrow=TRUE)
> v=strsplit(" #─│┘│┐│┤──└┴┌┬├┼","")[[1]]
> d=dim(m)+1
> n=array(0,dim=d+1)
> n[2:d[1],2:d[2]]=m
> for(i in 0:(d[1]-2)){for(j in 0:(d[2]-2))cat(v[1+(p<-n[2+i,2+j])*sum(2^(0:3)*n[1:3+i,1:3+j][1:4*2])+p]);cat("\n")}
─┬─
 │ 
> m = matrix(rep(1, 16), ncol=4)
> v=strsplit(" #─│┘│┐│┤──└┴┌┬├┼","")[[1]]
> d=dim(m)+1
> n=array(0,dim=d+1)
> n[2:d[1],2:d[2]]=m
> for(i in 0:(d[1]-2)){for(j in 0:(d[2]-2))cat(v[1+(p<-n[2+i,2+j])*sum(2^(0:3)*n[1:3+i,1:3+j][1:4*2])+p]);cat("\n")}
┌┬┬┐
├┼┼┤
├┼┼┤
└┴┴┘
rturnbull
sumber
Pengajuan harus berupa program lengkap atau fungsi. Membaca dari variabel yang ada bukanlah bentuk input yang diizinkan.
TuxCrafting
Bagaimana Anda membuat beberapa karakter unicode berfungsi baik dengan R? x = "\ U253C" berfungsi tetapi x = "┼" tidak.
Vlo
@ TùxCräftîñg: Tetap sekarang!
rturnbull
@Lo utf-8 adalah penyandian OS asli saya. x = "┼"bekerja dengan baik untuk saya.
rturnbull
3

Perl, 89 88 byte

Termasuk +2 untuk -0p. Karakter khusus dihitung sebagai 1 byte, tetapi untuk membuatnya benar-benar ditampilkan sebagai karakter tunggal, yang terbaik adalah menambahkan opsi -C.

Berikan masukan pada STDIN dengan garis-garis yang diberi spasi agar semua memiliki panjang yang sama:

perl -C connect.pl
# #### ## #
## #  ##  #
   ####  ##
^D

connect.pl:

#!/usr/bin/perl -0p
/
/;$n=".{@-}";s%#%substr"#───│└┘┴│┌┐┬│├┤┼",/\G##/+2*/#\G/+4*/#$n\G/s+8*/\G#$n#/s,1%eg
Ton Hospel
sumber
1

MATL, 102 karakter

Saya memberi nilai pada tetangga (1, 2, 4 atau 8); jumlah mereka akan cocok dengan karakter dalam string yang berisi karakter gambar. Saya pikir masih ada banyak ruang untuk perbaikan, tetapi untuk konsep kasar:

' #│││─┌└├─┐┘┤─┬┴┼' % String to be indexed
wt0J1+t4$(          % Get input, and append zeros at end of matrix (solely to avoid
                    %  indexing a non-existent second row/column for small inputs)
ttttt               % Get a whole load of duplicates to work on
3LXHY)              % Select rows 2:end from original matrix (one of the many dupes)
      w4LXIY)       % Select rows 1:end-1 from the 'destination' summing matrix)
             +HY(   % Add the neighbors below, store in 'destination' matrix
tIY)b3LY)2*+IY(     % +2* the neighbors above    +-------------------------------+
tHZ)b4LZ)4*+HZ(     % +4* the neighbors right    |(note: H and I contain 1:end-1 |
tIZ)b3LZ)8*+IZ(     % +8* the neighbors left     |  and 2:end respectively)      |
HH3$)               % Select the original matrix +-------------------------------+
*                % Make sure only cells that originally had a # get replaced
  1+)            % Add one because the original string is one-indexed. Index using ).

Perbaikan yang harus dilakukan:

  • Mungkin ganti seluruh bagian penjumlahan dengan semacam loop yang bekerja pada salinan yang diputar dari matriks
  • Parit semuanya dan buat sesuatu berdasarkan satu loop yang bekerja melalui matriks
  • Gunakan pengindeksan modular untuk bekerja pada vektor diratakan dari array asli (?)

Cobalah secara Online! (mungkin tidak memiliki dukungan karakter menggambar kotak)

Sanchises
sumber