Seni Membentuk Kata


21

Seni Membentuk Kata

Diberikan matriks biner, dan string huruf, ganti semua 1 dalam matriks dari kiri, ke kanan dengan huruf-huruf string. Setelah huruf-huruf telah dibentuk menjadi bentuk matriks, cetak matriksnya, ganti 0 dengan spasi. Mungkin lebih mudah untuk hanya memberikan satu atau dua contoh.


Kasus: Kasus dasar ...

Masukan satu:

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

"PPCGPPCG"

Output Satu:

  P    
 P C  
G   P
 P C 
  G  

Kasus: Jika string input lebih panjang dari jumlah ...

Input Dua:

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

lambda

Output Dua:

l  
 a 
m b

Kasus: Jika string input lebih pendek dari jumlah ...

Input Tiga:

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

PPCG

Output Tiga:

PPC
G P
PCG

Asumsi yang Tersedia

  • Anda dapat menganggap string input tidak pernah kosong.
  • Anda mungkin menganggap matriks tidak akan pernah kosong.
  • Anda mungkin tidak berasumsi bahwa matriks biner tidak akan pernah menjadi nol semua.

Aturan

  • Jika string lebih pendek dari jumlah, ulangi string; semua harus diganti.
  • Jika string lebih panjang dari jumlah, hanya gunakan apa yang dibutuhkan.
  • Anda dapat menggunakan Benar / Salah menggantikan bilangan bulat / bit untuk input.
  • Ruang tambahan DIBUTUHKAN, semua nol harus diganti dengan spasi.
  • Satu baris baru dapat diterima.
  • Ini adalah kode-golf, kemenangan jumlah byte terendah.

Apakah matriks harus menjadi input sebagai array atau dapatkah saya menggunakan multiline-string?
Titus

@Itus tidak apa-apa, Martin Ender sudah melakukannya.
Magic Octopus Mm

Kasing dasar tidak dari kiri ke kanan. Apakah maksud Anda dari atas ke bawah, lalu dari kiri ke kanan?
edc65

1
Jika matriksnya, misalnya, grid nol 2x2, haruskah kita mengeluarkan spasi tunggal atau grid 2x2 spasi?
artificialnull

@ pieman2201 membersihkan test case # 4 menjadi lebih baik.
Magic Octopus Mm

Jawaban:


3

MATL , 11 byte

yz:)1Gg!(c!

Input adalah matriks numerik (dengan ;pemisah baris) dan string.

Cobalah online! Atau verifikasi kasus uji: 1 , 2 , 3 .

y       % Take the two inputs implicitly. Duplicate the first
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1,0,0; 0,1,0; 1,0,1]
z       % Number of nonzeros
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', 4
:       % Range
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1 2 3 4]
)       % Reference indexing (select values)
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb'
1Gg     % Push first input as a logical matrix; will be used as index
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb', [1,0,0; 0,1,0; 1,0,1]
!       % Transpose. This is necessary because MATL uses column-major order
        % (down, then accross)
(       % Assignment indexing (fill with values). Since the original matrix
        % is numeric, the new values are introduced as their ASCII codes
        % STACK: [108, 0, 109; 0, 97, 0; 1, 0, 98]
c       % Convert to char
        % STACK: ['l m'; ' a '; '  b']
!       % Transpose back. Implicitly display
        % STACK: ['l  '; ' a '; 'm b']

MATL pada dasarnya mendefinisikan kembali bagaimana saya selalu melihat koleksi ...
Magic Octopus Mm

@carusocomputing Seperti di Matlab, tipe data utama adalah array "persegi panjang": matriks atau analog n-dimensionalnya. Mereka dapat berisi angka, karakter, atau nilai Boolean. Ada juga sel array, yang dapat berisi hal-hal yang sewenang-wenang, seperti daftar Python
Luis Mendo

Jawaban terbaik dipilih setelah 2 minggu buka.
Magic Gurita Guci

8

Vim, 44 42 byte

qqy$P0xjf1"_xP{@qq@q:s/0/ /g^M:s/,/^V^M/g^M{D

Disimpan 2 byte berkat @DjMcMoylex !

Di sini, ^Mini adalah baris baru secara literal, dan ^VitulahCTRL-V

Mengambil input dalam format ini:

PPCG
00100,01010,10001,01010,00100

Penafian: Jika string lebih panjang dari ~ 40 karakter, komputer Anda mungkin kehabisan ram.

Penjelasan:

qq             @qq@q                            # Start recording a recursive macro.
  y$P0x                                         # Duplicate the string and cut out the first character
       jf1"_xP{                                 # Find the first 1, and replace it with the cut character from the string.
                                                # Now we have replaced all the 1's with their respective character, but we still have the array in the original format, and we have the string massivly duplicated at the first line, so we need to clean it up:
                    :s/0/ /g^M                  # Replace all 0's with a space
                              :s/,/^V^M/g^M     # Replace all ,'s with a newline. The ^V acts like a backslash, it escapes the newline so that the command isn't run too soon
                                           {D   # Delete the first line

Inilah gif saya "menjalankan" program ":

Saya mengetik kunci


1
Hahaha, cintai disclaimer.
Magic Gurita Guci

Anda bisa menggunakan {di tempat gguntuk mengambil beberapa off.
DJMcMayhem

Ok, gif benar-benar rapi, tetapi apakah Anda pikir Anda bisa memasukkannya melalui tautan saja? Ini ketinggalan krom saya setiap kali saya mencoba menggulir melewati :(
wnnmaw

6

Retina , 41 33 byte

0

+1`(.)(.*)(\D+)1
$2$1$3$1
A1`

Cobalah online!

String input diberikan pada baris pertama input, diikuti oleh matriks. Karena Retina tidak memiliki konsep daftar (atau benar-benar apa pun kecuali string), tidak ada pemisah dalam matriks biner kecuali untuk umpan baris untuk memisahkan baris.

Penjelasan

0

Mengubah nol menjadi spasi.

+1`(.)(.*)(\D+)1
$2$1$3$1

Ganti berulang kali 1dengan karakter pertama dari string input sambil juga memutar karakter itu ke akhir string input. Ini menangani kasus di mana ada lebih 1dari karakter dalam string input.

A1`

Buang baris pertama, yaitu string input.


2
(.)(.*)- Teehee ...
Magic Gurita Guci

6

JavaScript ES6, 67 53 50 49 byte

Disimpan 3 byte berkat @ETHproduksi Tersimpan 1 lagi berkat @Neil

(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

f=
(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

G=_=>h.innerHTML = f(`00100
01010
10001
01010
00100`,z.value)
h.innerHTML = G()
<input id=z oninput="G()" value="PPCG"></input>
<pre id=h>

Kode lama sebelum saya tahu bahwa matriks string adalah format input yang valid:

(a,b)=>a.map(c=>c.map(d=>d?b[i++%b.length]:' ').join``,i=0).join`
`


Saya sarankan c=>' '[c]||b[i++%b.length], tapi sayangnya itu satu byte lagi ...
ETHproduk

1
Namun, ada cara lain untuk menghemat 3 byte:(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
ETHproduk

Saya pikir itu akan dimulai pada karakter kedua dari string. Pembaruan cuplikan akan menyenangkan.
Titus

1
@Titus Pada awalnya, iadalah undefined, begitu ++ikembali NaN. Karena btidak memiliki NaNproperti, b[++i]pengembalian undefined, dan ||operator menjalankan argumen sisi kanannya, mengatur ike 0dan mengembalikan karakter pertama b.
ETHproduk

1
Mengapa Anda menguji \d? Tentunya .sudah cukup, karena Anda hanya perlu berurusan dengan 0s dan 1s ( .tidak cocok dengan baris baru).
Neil

5

Perl, 40 byte

36 byte kode + -i -pbendera.

@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; 

(perhatikan ruang terakhir dan tidak adanya baris baru final).

Untuk menjalankannya, tulis string input setelah -iflag, dan berikan matriks dalam input:

perl -iPPCGPPCG -pe '@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; ' <<< "00100
01010
10001
01010
00100"

Jika Perl Anda agak tua, Anda mungkin perlu menambahkan titik koma akhir (setelah spasi).


5

Python 2, 114 71 byte

Ternyata saya menciptakan kembali roda, ganti ganda sederhana pada string multiline bekerja dengan sangat baik. String memiliki manfaat tambahan untuk dapat menghitung nol secara langsung daripada harus melakukan yang benar-benar jelek s*len(L)*len(L[0])untuk daftar bersarang

lambda S,s:S.replace("0"," ").replace("1","{}").format(*s*S.count('0'))

Solusi lama:

lambda s,L:"\n".join(["".join(map(lambda n:chr(n+32),l)).replace("!","{}")for l in L]).format(*s*len(L)*len(L[0]))

Pertama kita mengonversi semuanya + 32 dengan chr(semua nol menjadi spasi), lalu kita ganti semua !dengan {}untuk mengizinkan penggunaan formatfungsi.

Jika NULLbisa dihitung sebagai spasi. Jika saya memutuskan untuk menipu dan menggunakan NULLalih-alih ruang, saya dapat melewati penambahan 32 untuk menghemat 12 byte. ( printditampilkan '\x00'sebagai spasi)

lambda s,L:"\n".join(["".join(map(chr,l)).replace('\x01','{}')for l in L]).format(*s*len(L)*len(L[0]))

Bukankah lebih pendek untuk menggunakan NULLs, dan menggantinya dengan ruang pada akhirnya?
nedla2004

@ nedla2004, Bagaimana Anda menyarankan saya melakukan itu? Hanya menambahkan .replace('\x00',' ')pada akhirnya menambahkan 20 byte
wnnmaw

Tapi kemudian saya pikir Anda bisa menyingkirkan ini: map (lambda n: chr (n + 32), l)
nedla2004

Solusi kedua bekerja dengan NULLs sepanjang waktu, yang menyelamatkan saya 12 byte, bertukar ke ruang pada akhirnya akan membuat saya lebih mahal
wnnmaw

Saya pikir Anda bisa menghapus lebih dari yang Anda bisa.
nedla2004

3

APL, 18 byte

{(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}

Ini adalah fungsi yang mengambil matriks boolean sebagai argumen kiri dan string sebagai argumen kanannya.

      (↑(1 0 0)(0 1 0)(1 0 1)) {(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}'lambda'
l  
 a 
m b

Penjelasan:

APL memiliki built-in yang melakukan sesuatu seperti ini, \(perluas). Namun, ini hanya berfungsi pada vektor, dan itu mengharuskan setiap karakter untuk benar-benar digunakan.

  • X←,⍺: ratakan matriks dan simpan hasilnya dalam X.
  • ⍵⍴⍨+/X: membentuk kembali vektor karakter sehingga memiliki jumlah elemen yang diperlukan (ini juga menangani pemanjangan string dengan mengulangi karakter jika perlu).
  • X\: ambil salah satu karakter untuk masing-masing 1dan satu ruang untuk masing-masing 0dalam X.
  • (⍴⍺)⍴: membentuk kembali hasilnya sehingga memiliki bentuk matriks asli.

3

PHP, 110 91 97 88 82 81 80 75 byte

disimpan 6 byte berkat @ user59178

while(""<$c=$argv[1][$i++])echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];

Jalankan dengan -r. Mengharapkan matriks sebagai string multiline dalam argumen pertama, string dalam argumen kedua.


1
Versi 80 byte berdasarkan versi 82 ​​byte Anda: foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];Saya menukar urutan dua terner dan dengan demikian menjatuhkan tanda kurung dari yang kedua dengan menggunakan <1daripada>0
user59178

1
Anda bisa menghemat 4 byte dengan menggunakan for(;""!=$c=$argv[1][$i++];)bukanforeach(...)
user59178

3

PowerShell v2 +, 70 byte

param($a,$b)$b|%{-join($_|%{if($_){$a[$n++];$n%=$a.length}else{' '}})}

Mengambil input kata sebagai $adan matriks sebagai array-of-array sebagai $b(lihat contoh di bawah). Loop melalui $b, kemudian loop melalui elemen setiap baris $_|%{...}. Loop dalam adalah kondisi if/ else, di mana kita baik output $a[$n++]dan mengambil mod-sama dengan panjang string, atau output spasi ' '. Itu -joindisatukan kembali menjadi string. Masing-masing string dibiarkan pada pipa, dan output implisit dengan baris baru antara terjadi melalui Write-Outputpada saat penyelesaian program.

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCGPPCG' @(@(0,0,1,0,0),@(0,1,0,1,0),@(1,0,0,0,1),@(0,1,0,1,0),@(0,0,1,0,0))
  P  
 P C 
G   P
 P C 
  G  

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'lambda' @(@(1,0,0),@(0,1,0),@(1,0,1))
l  
 a 
m b

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCG' @(@(1,1,1),@(1,0,1),@(1,1,1))
PPC
G P
PCG


2

Python 3, 104 (atau 83) Bytes

import itertools as i
def f(s,L):s=i.cycle(s);return'\n'.join(' '.join(next(s)*e for e in l)for l in L)

Ada opsi yang lebih pendek (83 Bytes), tetapi akan gagal jika string lebih dari 999 kali lebih pendek dari yang dibutuhkan:

def f(s,L):s=list(s)*999;return'\n'.join(' '.join(s.pop(0)*e for e in l)for l in L)

Solusi kedua tidak berfungsi untuk saya, karena Anda tidak dapat memanggil nextdaftar. Jika Anda melakukannya s=iter(list(s)*999)(89 byte)
L3viathan

1
@ L3viathan maaf, maksudku itu s.pop(0). Sepertinya saya menyalin versi yang salah, memperbaikinya.
Alissa

s[i++%s.length()]adalah metodologi yang baik, meskipun saya tidak tahu python.
Magic Gurita Guci

Itu akan keren, tetapi tidak ada yang namanya i++Python
Alissa

1

Pyth, 12 byte

jms?R@z~hZ\ 

Cobalah online: Demonstrasi

Penjelasan:

jms?R@z~hZ\ dQ   implicit d and Q at the end
                 I use the variable Z, which is initialized with 0 by default
 m           Q   map each line d of the Q (input matrix) to:
   ?R       d       map each number d of the line either to
     @z~hZ             input[Z++] (increase Z, but lookup in input string with old value)
          \            or space
  s                 join chars to a string
j                print each string on a separate line


1

Common Lisp, 152 byte

(defun m(g w)(let((a 0))(loop for r in g do(loop for e in r do(format t"~[ ~;~c~]"e(char w a))(if(= e 1)(setf a(mod(1+ a)(length w)))))(format t"~%"))))

Pemakaian:

* (m (list (list 1 0 1)
           (list 0 1 0)
           (list 1 0 1)) "ppcg")
p p
 c 
g p

Fungsi ini loop melalui setiap elemen dari setiap baris grid. The formatkontrol String baik mencetak spasi jika elemen adalah 0 atau mengkonsumsi argumen karakter jika elemen adalah 1. Sebuah baris baru akan dicetak setelah setiap baris dari grid. Jika string terlalu pendek, itu terulang dari awal; jika terlalu lama, hanya bagian yang sesuai akan dikeluarkan.


1

Pip , 18 byte

17 byte kode, +1 untuk -lbendera.

Yb{a?y@++vs}MMa^s

Mengambil array sebagai argumen baris perintah pertama seperti ini: 100 010 101(perlu dikutip dalam shells) dan string sebagai argumen baris perintah kedua. Cobalah online!

Penjelasan

                   a and b are cmdline args, s is space, v is -1
Yb                 Yank b into global variable y
              a^s  Split a on space into list of rows
  {        }MM     Map this function to the items of the items of a (i.e. each character):
   a               Function argument
    ?              Ternary operator (truthy if 1, falsey if 0)
       ++v         If truthy, increment v...
     y@            ... and use it to index into y (cyclically)
                   I.e.: each time we hit a 1, replace it with the next character of y
          s        If falsey, space
                   The result is a list of lists of characters; -l concats sublists and
                   newline-separates the main list

1

Java, 237 233 Bytes

Sunting: disimpan 4 Bytes berkat Mukul Kumar

Golf:

String T(int[][]m,String b){int l=m.length,a=0;String o="";for(int i=0;i<l;i++){for(int j=0;j<l;j++){if(m[i][j]==1&&a<b.length()){o+=Character.toString(b.toCharArray()[a]);a++;if(a== b.length()-1)a=0;}else o+=" ";}o+="\n";}return o;}

Tidak Disatukan:

public String T(int[][] m, String b) {
    int l = m.length,a=0;
    String o = "";
    for(int i = 0; i < l; i++)
    {
        for(int j = 0; j < l; j++)
        {
            if(m[i][j] == 1 && a < b.length())
            {
                o += Character.toString(b.toCharArray()[a]);
                a++;

                if(a == b.length() - 1)
                    a = 0;
            }
            else
             o += " ";
        }
        o += "\n";
    }
    return o;
}

Pengujian:

  int[][] matrix = new int[][]
  {{ 0, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0 },
  { 1, 0, 0, 0, 1 },{ 0, 1, 0, 1, 0 },
  { 0, 0, 1, 0, 0 },};
  TheArtOfWordShaping taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCGPPCG"));

  matrix = new int[][] {{1,0,0}, {0,1,0}, {1,0, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "lamda"));

  matrix = new int[][] {{1,1,1},{1,0,1},{1,1, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCG"));

  P  
 P C 
G   P
 P C 
  P  

l  
 a 
m d

PPC
P P
CPP

Anda dapat mendeklarasikan semua int dalam satu baris .....
Mukul Kumar

1

Pyke, 12 byte

.FdRIKQoQl%@

Coba di sini!

Menghasilkan matriks karakter

Atau 9 byte, tidak kompetitif.

.FdRIKQo@

Coba di sini!

  • Tambahkan wrapping pada indexable dimana indeks yang diminta lebih besar dari panjang indexable. .F - deep_for (input) I - if ^: Qo @ - Q [o ++] dR - else ""

Bahkan lebih tidak kompetitif, 8 byte

.FIQo@(P

Coba di sini!

  • print_grid sekarang menyelaraskan string kosong dengan benar
  • deep_for sekarang tipe tebak pada tipuan dari tipe yang berbeda dengan kebenaran

.F    (  -  deep_for(input)
 I       -   if ^:
  Qo@    -    input[o++]
       P - pretty_print(^)

1

Java, 122 byte

String g(int[][]a,char[]b){String r="";int e=0;for(int[]c:a){for(int d:c){r+=d==0?' ':b[e++%b.length];}r+='\n';}return r;}

0

Mathematica, 76 byte

""<>(s=#2;f:=(s=RotateLeft[s];Last[s]);Map[If[#1,f," "]&,#,{2}]~Riffle~"\n")&

Fungsi tanpa nama dari dua argumen, yang pertama ( #) adalah array Trues dan Falses, dan yang kedua ( s) adalah daftar karakter. Fungsi pembantu

f:=(s=RotateLeft[s];Last[s])

didefinisikan, yang menempatkan gerakan karakter pertama shingga akhir dan kemudian mengembalikan karakter yang baru saja dipindahkan. Memanggil fbeberapa kali akan mengembalikan karakter ssecara berurutan.

Fungsi utamanya adalah

Map[If[#1,f," "]&,#,{2}]

yang memanggil fsetiap Truenilai dalam array input dan mengembalikan spasi pada setiap input yang salah. ( {2}MengisahkanMap untuk bekerja pada elemen daftar komponen array, daripada daftar itu sendiri.)

60 byte itu mengembalikan array karakter sdan spasi. Bungkusnya

    ""<>(...~Riffle~"\n")&

menempatkan baris baru di antara masing-masing daftar larik itu dan kemudian menggabungkan semuanya.


0

C ++, 61 byte

for(auto&i:m){for(int&j:i)cout<<(j?s[k++%l]:' ');cout<<'\n';}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.