Hasilkan Tabel Pencarian fungsi Universal biner

19

Ini secara tangensial terkait dengan pencarian saya untuk menciptakan bahasa pemrograman esoterik .

Tabel angka biner 0 .. 15 dapat digunakan untuk mengimplementasikan Fungsi Biner Universal menggunakan operasi pengindeksan. Diberikan dua input 1-bit X dan Y, semua 16 fungsi yang mungkin dapat dikodekan dalam opcode 4-bit.

X Y  F|0 1 2 3 4 5 6 7 8 9 A B C D E F
- -    - - - - - - - - - - - - - - - -  
0 0    0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1    0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0    0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
1 1    0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
       -     -   - -   -   -   -   - -
       0    ~X  ~Y ^   &   Y   X   | 1
      ZERO    NOT-Y   AND         OR
          NOT-X   XOR              ONE

Jadi set 16 fungsi ini dapat diterapkan ke input biner sebagai fungsi

U (f, x, y): (f >> ((x << 1) | y)) & 1 ,

atau

U (f, x, y): (f / 2 ^ (x × 2 + y))% 2 ,

atau dengan pengindeksan atau partisi matriks.

Akan bermanfaat untuk mengetahui cara yang paling ringkas untuk mewakili atau menghasilkan tabel nilai sedemikian untuk bahasa apa pun yang mungkin dibangun di atas jenis operasi biner ini.

Target:

Hasilkan keluaran teks persis ini:

0101010101010101
0011001100110011
0000111100001111
0000000011111111

Itu dia! Kemenangan kode terpendek.

luser droog
sumber
2
Saya memiliki intuisi bahwa keluarga APL akan berhasil di sini. :)
luser droog
Juga terkait: Kalkulator gerbang logika sederhana
FireFly
Apakah memimpin atau mengikuti jalur baru diterima?
Titus
Ya, baris baru tambahan baik-baik saja.
luser droog

Jawaban:

20

J, 10 (13?) Karakter

|.|:#:i.16

Daftar nomor:

   i.16
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15`

ke biner:

   #:i.16
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1

Mengubah urutan:

   |:#:i.16
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Membalikkan:

   |.|:#:i.16
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

Apakah kita perlu menghapus spasi? Melihat jawaban J lain tampaknya kita sehingga kita harus menambahkan 3 karakter dan meminjam 1":dari jawaban Jan ini .

Gareth
sumber
1
Gaya penjelasannya sangat bagus. +1 (sangat pendek, juga!)
luser droog
Begitu saya melihat jawaban Peter's Golfscript saya tahu saya bisa melakukan jauh lebih baik. Nah, Anda sudah melakukannya.
John Dvorak
Senang melihat sesuatu yang lebih pendek daripada Golfscript ...
fuenfundachtzig
@luserdroog Wow. Itu banyak kode. Jauh lebih mudah dibaca daripada kode sumber J. :-) Sangat keren.
Gareth
13

Python 2, 40

for n in 1,2,4,8:print 8/n*('0'*n+'1'*n)
grc
sumber
7

APL (14)

Dengan asumsi ⎕IO=0(itu adalah pengaturan):

⎕D[⊖(4⍴2)⊤⍳16]

Penjelasan:

  • ⍳16: angka [0,16)
  • (4⍴2)⊤: menyandikan setiap angka dalam basis 2 menggunakan 4 digit
  • : reverse horisontal (sehingga MSB berakhir di atas)
  • ⎕D[... ]: pilih nilai-nilai ini dari ⎕Dyang merupakan string 0123456789. (Matriks numerik ditampilkan dengan spasi di antara nilai-nilai, matriks karakter tidak. Jadi ini mengubah setiap bit numerik ke salah satu karakter '0' '1').
marinus
sumber
Apakah karakter pertama dalam sumber seharusnya terlihat seperti kotak, atau apakah saya masih kehilangan beberapa font?
Tim Seguine
@TimSeguine Ya, ini persegi, disebut quad dalam literatur APL. Nama variabel yang dimulai dengan quad adalah variabel sistem yang mengubah lingkungan. IO = "indeks asal".
luser droog
Simpan satu byte: (4⍴2)⊤2⊥⍣¯1
Adám
6

Jelly , 42 7 byte (tidak bersaing)

⁴ḶBUz0Y

Cobalah online!

Terima kasih kepada Dennis untuk bantuannya. Inilah pesan pertama, inilah yang terakhir (diskusi lain juga terjadi). Dengan bantuannya, saya tampaknya (hampir) mendapatkan skor kuadrat.

Erik the Outgolfer
sumber
Karena bahasa lebih baru dari pertanyaan, saya tidak dapat menerimanya sebagai jawaban. Pasti dalam menjalankan untuk hadiah, tho!
luser droog
@luserdroog Tidak apa-apa. Tapi, saya pikir tantangannya lebih baru.
Erik the Outgolfer
Saya tahu apa maksud Anda, rasanya belum lama saya mempostingnya. Tetapi bahkan INA2 saya sendiri, pada usia 2 tahun, adalah bahasa yang terlalu muda.
luser droog
+1 untuk 42 hingga 7 codegolf. Itu adalah sesuatu yang tidak Anda lihat setiap hari (kecuali dilakukan dengan sengaja).
Kevin Cruijssen
1
@KevinCruijssen Kenapa harus dilakukan dengan sengaja? Saya hanya pemula Jelly (saya tahu Python 2 dan 3 dengan baik), jadi saya melakukannya dengan cara string, sementara saya "perlu memperlakukan Jelly sebagai bahasa manipulasi array".
Erik the Outgolfer
5

/// , 51 byte

Cobalah online

/a/0101/aaaa
/b/0011/bbbb
/z/0000//o/1111/zozo
zzoo
Cedric Reichenbach
sumber
1
Selamat datang di PPCG! Anda mengalahkan saya untuk itu.
Erik the Outgolfer
@EriktheGolfer Jangan ragu untuk meningkatkan, tapi saya pikir itu versi yang sesingkat mungkin. :)
Cedric Reichenbach
Saya memindahkan ini ke Sprects.
Erik the Outgolfer
4

GolfScript ( 18 17 15 karakter)

(Dengan terima kasih kepada Howard)

16,zip{','-~n}%

Saya tidak mengerti mengapa 10-char

16,zip{n}/

tidak bekerja; Saya menduga bahwa bug dalam interpreter standar menghasilkan tipe yang tidak didukung pada stack.

Alternatif 18 karakter yang saya mengerti sepenuhnya adalah:

4,{2\?.2,*$8@/*n}%

Pendekatan yang lebih matematis sedikit lebih lama, pada 28 karakter:

4,{2.@??)2.4??.@/+2base(;n}/

Banyak dari itu untuk konversi basis dan zero-padding. Tanpa itu, turun menjadi 19 karakter,

4,{2.@??)2.4??\/n}/

dengan output

21845
13107
3855
255
Peter Taylor
sumber
Itu diminta untuk output teks yang tepat - mengapa harus 16,zip{n}/bekerja?
Howard
Di sisi lain yang dapat Anda lakukan16,zip{','-~n}%
Howard
@Howard, saya pikir itu zipharus mengembalikan array array, tetapi sebenarnya mengembalikan array array Ruby (adalah tebakan terbaik saya). Apa pun elemennya, menerapkan `` `` `padanya tidak mempengaruhi cara mereka mencetak, yang tidak seperti salah satu dari 4 tipe data GolfScript. Anda benar yang ','-tampaknya mengubahnya menjadi array normal: trik yang bagus.
Peter Taylor
Tampaknya menghasilkan 4 garis nol tambahan di sini
aditsu
@aditsu, bekerja di demo online . Saya bertanya-tanya mengapa bedanya. Versi Ruby, mungkin?
Peter Taylor
3

CJam - 16

4,{G,f{\m>2%}N}/

Kode java yang setara (sebagai penjelasan):

public class Lookup {
    public static void main(final String... args) {
        for (int i = 0; i < 4; ++i) {
            for (int j = 0; j < 16; ++j) {
                System.out.print((j >> i) % 2);
            }
            System.out.println();
        }
    }
}
aditsu
sumber
3

Javascript (ECMA6), 67

s=(k,n)=>n-.5?s((k<<n/2)^k,n/2)+"0".repeat(n)+k.toString(2)+"\n":"" 

Untuk menggunakan ini, hubungi

s(255,8)

Bitshift!
Dan juga XOR dan sedikit rekursi.

Hal pertama yang perlu diperhatikan adalah bahwa jika kita mengambil garis apa pun dan Anda menggesernya (# dari 0 terus menerus) / 2, kita mendapatkan XOR bagus untuk mendapatkan baris berikutnya.

Sebagai contoh,

0000000011111111 //line 4
0000111111110000 //shifted 4 to the left

XOR bitwise ini memberi kita

0000111100001111 //XOR'ed. This is line 3!

yang merupakan baris berikutnya (baris 3).
Menerapkan proses yang sama untuk saluran 3, bergeser 2 ke kiri dan kami ...

0000111100001111
0011110000111100

XOR'ed memberi

0011001100110011

yaitu baris 2.
Perhatikan bahwa jumlah yang kita alihkan menjadi separuh setiap kali.
Sekarang kita cukup memanggil fungsi ini secara rekursif, dengan 2 argumen. Nilai integer dari baris ini, dan N, yang merupakan seberapa banyak kita perlu bergeser. Ketika kita melakukan berulang hanya lulus dalam nilai XOR'ed bergeser dan n / 2.

"0".repeat(n)

adalah untuk memasukkan 0 ke awal setiap baris karena toString mengeluarkan 0 yang terkemuka.

Kevin Wu
sumber
+1 Sangat keren. Saya tidak memperhatikan pola itu sebelumnya.
luser droog
Pasangan bye dapat memotong ini dengan menggeser n dan bukannya membaginya, dan mengganti baris baru dengan string template:s=(k,n)=>n?s((k<<n/2)^k,n>>1)+"0".repeat(n)+k.toString(2)+` `:""
Shaun H
2

J, 21 karakter

1":<.2|(2^i.4)%~/i.16
  • i.16 adalah daftar 0..15
  • 2^i.4 adalah daftar (1,2,4,8)
  • %~/ menghasilkan tabel pembagian di mana argumen kiri membentuk baris tetapi merupakan argumen yang tepat untuk pembagian
  • 2| menghitung sisanya setelah membagi [setiap sel] dengan dua
  • <. lantai yang bernilai 0 atau 1
  • 1": memformat tabel dengan satu karakter per sel
John Dvorak
sumber
Saya merasa floorseharusnya tidak perlu. Domain 2|sudah 0 atau 1, kan?
luser droog
@luserdroog |beroperasi di atas kendaraan hias . 2|3.25adalah 1.25. Kami tidak menginginkan itu.
John Dvorak
2

GolfScript, 19 karakter

Pendekatan GolfScript lainnya

4,{2\?{&!!}+16,%n}%
Howard
sumber
2

Ruby (44)

Membosankan dan panjang: Hanya mencetak representasi biner 0-angka dari angka-angka.

[21845,13107,3855,255].map{|i|puts"%016b"%i}
daniero
sumber
2

Nota bene 108 177 126 77 74 70

[43690 52428 61680 65280]
{16{dup 2 mod =only 2 idiv}repeat<>=}forall

Membalikkan nilai untuk metode mod- off yang lebih sederhana .

151 131 119

Menerapkan pendekatan APL- is lebih banyak . sunting: penggantian talenan string dan ritsleting dengan pengindeksan dan for-loop.

[[0 1 15{}for]{16 add 2 5 string cvrs}forall]4 
-1 1{0 1 15{2 index exch get 1 index 1
getinterval =only}for pop<>=}for

Bertakuk:

[[0 1 15{}for]{16 add 2 5 string cvrs}forall]
4 -1 1{ % [] i
    0 1 15{ % [] i j
        2 index exch get % [] i [](j)
        1 index 1  % [] i [](j) i 
        getinterval  % [] i [](j)<i>
        =only  % [] i
    }for 
    pop<>= % []
}for

Menerapkan kembali fungsi yang digunakan dalam jawaban J yang mengarah ke ini (dengan banyak kode dukungan ).

-1 16 i + #: |: |.{{==only}forall()=}forall

idi sini adalah vektor berbasis 1 yang dijelaskan dalam Fungsi Dasar Iverson , maka -1 ... +untuk menghasilkan 0 .. 15.

luser droog
sumber
2

Perl (36 +1)

+1 untuk say, seperti biasa. dobel 0bukan kesalahan ketik :)

map say((00x$_,1x$_)x(8/$_)),1,2,4,8
perl Cina goth
sumber
Tidak perlu menambahkan 1 untuk say. perl -e'...'standar dan ini membutuhkan perl -E'...', tidak ada peningkatan dalam jumlah byte. Lagi pula, saya pikir diputuskan pada Code Golf Meta yang -M5.01gratis.
msh210
2

JavaScript (ECMA6), 108

Mencoba pendekatan yang berbeda di sini. Meskipun didorong untuk menggunakan operator biner, saya membiarkan diri saya untuk mengirimkan solusi ini karena tantangannya juga dan saya berpikir - bagaimana saya bisa mengurangi jumlah kode yang mewakili nilai-nilai itu ...? Basa .

['gut','a43','2z3','73'].forEach(n=>{a=parseInt(n,36).toString(2);
alert(('00000000'+a).substr(a.length-8))})

(Line break untuk kenyamanan).

Sayang sekali saya harus mengacaukan padding dengan angka nol di depan, tetapi poin dari kode ini hanya mewakili hasil biner target pada Basis 36, yang merupakan gut, a43, 2z3, 73nilai - nilai itu.

Catatan: Saya menyadari itu tidak akan mendekati jawaban yang menang, tetapi hanya demi ide ...

Yakub
sumber
1
Pada dasarnya saya akan melakukan hal yang sama ketika saya melihat milik Anda. Saya turun ke 92 byte menggunakan teknik dari jawaban saya untuk pertanyaan serupa :alert(['gut','a43','2z3',73].map(n=>(1e8+parseInt(n,36).toString(2)).slice(-16)).join('\n')) . Pendekatan ini menggunakan baris baru, bukan empat alert().
NinjaBearMonkey
2

Sprects , 44 byte

 aaaa
bbbb
zozo
zzoo o1111 z0000 b0011 a0101

Jawaban Cedric diangkut ke Sprects.

Erik the Outgolfer
sumber
2

MATL ( non-bersaing ), 8 byte

16:qYB!P

Cobalah online!

Penjelasan

16:    % Generate range [1 2 ... 16]
q      % Subtract 1, element-wise
YB     % Convert to binary. Gives a 16×4 char array. Each original number is a row
!      % Transpose
P      % Reverse vertically. Implicitly display
Luis Mendo
sumber
2

CJam ( non-bersaing ), 10 9 byte

Terima kasih kepada @ Dennis untuk 1 byte off!

Y4m*zW%N*

Cobalah online!

Penjelasan

Y     e# Push 2
4     e# Push 4
m*    e# Cartesian power of 2 (interpreted as [0 1]) with exponent 4
z     e# Zip
W%    e# Reverse the order of rows
N*    e# Join with newlines. Implicitly display
Luis Mendo
sumber
2

JavaScript (ES6), 58 52 byte

Membangun string secara rekursif.

f=(n=64)=>n--?f(n)+(!n|n&15?'':`
`)+(n>>(n>>4)&1):''

Bagaimana itu bekerja

Rekursi ini didasarkan pada fakta bahwa pola dibuat dari representasi biner vertikal dari camilan 0x0 hingga 0xF:

  0101010101010101 bit #0 <- Y = 0
  0011001100110011 bit #1
  0000111100001111 bit #2
  0000000011111111 bit #3 <- Y = 3
  ----------------
  0123456789ABCDEF
  ^              ^
X = 0          X = 15

Oleh karena itu, setiap posisi (X, Y) dalam pola ini dapat dinyatakan sebagai Y-th bit dari X: X & (1 << Y). Kami juga dapat mengisolasi bit ini dengan: (X >> Y) & 1. Daripada melacak X dan Y, kita iterate pada variabel tunggal nmulai dari 0 sampai 63. Jadi, rumus menjadi: (n >> (n >> 4)) & 1. Sebenarnya lebih mudah untuk beralih dari 63 ke 0, jadi string dibuat dalam urutan terbalik. Dengan kata lain, karakter n-1 ditambahkan di sebelah kiri karakter n .

Sebagai catatan, rekursi tidak membawa apa pun di sini kecuali kode yang lebih pendek.

Tanpa linebreak, kodenya panjangnya 35 byte:

f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):''

Kami membutuhkan 17 byte lagi untuk menyisipkan linebreak. Ini bisa dipersingkat menjadi 14 byte jika linebreak terkemuka dapat diterima.

Demo

f=(n=64)=>n--?f(n)+(!n|n&15?'':`
`)+(n>>(n>>4)&1):''

console.log(f());

Arnauld
sumber
Dalam ideone dengan kedua bahasa, JavaScript tidak dikompilasi dalam exapme di atas ada satu biarkan lebih .... Ada baiknya ide satu fungsi rekursif ...
RosLuP
Apa yang diperlukan untuk membagi setelah 35 byte?
Titus
@Titus - Baiklah. Pada pandangan pertama, saya tidak punya solusi yang bagus untuk itu. Ini adalah upaya (sangat buruk): (f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):'')().match(/.{16}/g).join`\n` (63 byte)
Arnauld
hmm ... dan .replace(/.{16}/g,"$0\n")memiliki panjang yang sama. Sangat buruk.
Titus
2

Bash + coreutils, 65 byte

Bukan yang terpendek, tapi juga yang terpanjang:

for i in {1,2,4,8};{ eval echo \$\[\({0..15}\&$i\)/$i];}|tr -d \ 

(Karakter terakhir adalah spasi)

Cobalah online .

Trauma Digital
sumber
1

NARS2000 APL, 22

"01"[⊖1+(4⍴2)⊤(⍳16)-1]

Berasal dari jawaban APL marinus, yang sepertinya tidak bekerja pada NARS2000.

Hasilkan vektor

      ⍳16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Ubah ke berbasis nol

      (⍳16)-1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Hasilkan bentuk untuk disandikan

      (4⍴2)
2 2 2 2

Menyandi

      (4⍴2)⊤(⍳16)-1
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

Sesuaikan untuk pengindeksan berbasis 1

      1+(4⍴2)⊤(⍳16)-1
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2
1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 2
1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2

Membalikkan poros utama

      ⊖1+(4⍴2)⊤(⍳16)-1
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2
1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 2
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2

Indeks

      "01"[⊖1+(4⍴2)⊤(⍳16)-1]
0101010101010101
0011001100110011
0000111100001111
0000000011111111
luser droog
sumber
Anda dapat mengatur ⎕IO ke 0, sehingga Anda tidak harus menyesuaikan pengindeksan berbasis 1. Itu membawanya ke 16 karakter.
Elias Mårtenson
Ya, tapi kemudian saya khawatir itu terlalu mirip dengan jawaban APL lainnya dan tidak akan layak berada di sini sama sekali.
luser droog
1

C, 73 karakter

i;main(){for(;i<64;)i&15||puts(""),putchar(48|1&~0xFF0F0F33335555>>i++);}

Ini hanyalah solusi umum untuk menghasilkan 64 bit dalam empat blok 16-bit; Anda hanya perlu mengubah nomor 0xFF0F0F33335555untuk menampilkan urutan bit lainnya.

disederhanakan & ungolfed:

int main() {
    int i;
    for(i = 0; i < 64; i++) {
        if(i % 16 == 0) {
            puts("");
        }
        int bit = ~0xFF0F0F33335555 >> i;
        bit &= 1;
        putchar('0' + bit);
    }
}
MarcDefiant
sumber
1

Haskell, 73

Astaga, 73 karakter! Aku tidak bisa karena cinta tuhan mendapatkan ini lebih kecil.

r=replicate
f n=r(div 8n)("01">>=r n)>>=id
main=mapM(putStrLn.f)[1,2,4,8]

Bagian sedih yang sebenarnya tentang ini adalah bahwa jika Anda menggemakan output menggunakan bash, Anda hanya perlu 74 karakter.

Flonk
sumber
1

JavaScript (ES5) 69

for(x="";4>x;x++){z="";for(n=0;16>n;)z+=1-!(n++&1<<x);console.log(z)}

WallyWest
sumber
1

inca2 ,33 27 24

4 16#(,`2|(~16)%.2^~4){D

Ini berdasarkan jawaban Jan Dvorak . inca2 dapat menjalankan ini pada perbaikan bug kemarin. Secara teknis tidak valid karena bahasa ditemukan setelah pertanyaan, tetapi penemuan bahasa adalah bagian dari tujuan saya dalam mengajukan pertanyaan. Jadi, inilah balasannya untuk jawaban yang lain. :)

Penjelasan:

4 16#(,`2|(~16)%.2^~4){D
          (~16)               integers 0 .. 15 
                 2^~4         first 4 powers of 2: 1 2 4 8
          (~16)%.2^~4         division table
        2|                    mod 2 (and floor)
       `                      transpose
      ,                       ravel
     (               ){D      map to chars '0'..'9'
4 16#                         reshape to 4x16

Beberapa tanda kurung seharusnya tidak perlu, tetapi tampaknya ada beberapa masalah yang tersisa dengan interpretasi saya tentang tata bahasa. Dan "ravel => map => membentuk kembali" benar-benar canggung: peta harus lebih pintar. Sunting: perbaikan bug memungkinkan penghapusan parens.


Anjak konversi basis menjadi fungsi terpisah N:x|y%.x^~1+[]/x.ymenghasilkan ini19 16 versi char.

4 16#(,`2N~16){D

Dan sementara saya curang di sini, saya sudah maju dan menjadikan ini fungsi bawaan. Tapi, meskipun itu fungsi niladik (tidak memerlukan argumen), tidak ada dukungan untuk fungsi niladik, dan itu harus dilengkapi dengan argumen dummy.

inca2, 2

U0
luser droog
sumber
1

Pyth 24/26

Metode terpendek adalah jawaban grc yang diterjemahkan ke Pyth yang menurut saya murah, jadi saya lakukan metode saya sendiri:

Milik saya: 26 karakter

 mpbjk*/8dS*d[0 1)[1 2 4 8

grc's: 24 karakter

Fd[1 2 4 8)*/8d+*\0d*\1d
aks.
sumber
1

C ++ 130

Mengubah hex menjadi biner

#define B std::bitset<16>
#define C(x) cout<<x<<endl;
void main(){
B a(0xFF),b(0xF0F),c(0x3333),d(0x5555);
C(d)C(c)C(b)C(a)
}
bacchusbeale
sumber
1

Haskell (Lambdabot), 47 byte

unlines$reverse$transpose$replicateM 4['1','0']

Agak curang karena menggunakan transpose dari Data.List dan replicateM dari Control.Monad, namun keduanya dimuat secara default dari Lambdabot.

Juga, saya yakin ada ruang untuk perbaikan, hanya ingin berbagi ide

michi7x7
sumber
1

Julia (39 Bytes)

Naskah kedua yang pernah saya tulis dalam Julia, harus mengakui bahwa saya menyukai Julia, dia binatang buas yang cantik.

hcat(map(x->collect(bin(x,4)),0:15)...)

Kembali

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

Penjelasan:

  • bin(x,4) - Konversi int ke biner integer dengan padding hingga 4 karakter.
  • collect(_) - Split string menjadi array char.
  • map(x->_,0:15) - Lakukan ini selama 16 digit pertama dalam kisaran.
  • hcat(_...) - Gambar percikan dan mendatar secara horizontal menjadi sebuah matriks.
Guci Gurita Ajaib
sumber
1

C 83 77 76 74 71

x;f(n){for(;x<4;x++,puts(""))for(n=0;n<16;)putchar(49-!(n++&(1<<x)));}

Cukup mudah.

x;
f(n){
    for(;x<4;x++,puts(""))
        for(n=0;n<16;)
            putchar(49-!(n++&(1<<x)));
}
luser droog
sumber
1
Ada penghematan 2 yang mudah dengan tidak menggunakan ?:, dan penghematan 1 lainnya dengan memindahkan a ++.
Peter Taylor
Disimpan 3 dengan mengubah mainke f. lol
luser droog
1

R, 53 41 byte

Terjemahan dari jawaban python @ grc Memotong 12 byte dari terjemahan asli melalui penggunaan rep()'s eachdan lengthargumen (dan pencocokan argumen parsial), dan dengan mengingat bahwa 0:1itu setara dengan c(0,1).

for(n in 2^(0:3))print(rep(0:1,e=n,l=16))

for(n in 2^(0:3))print(rep(c(rep(0,n),rep(1,n)),8/n))

Anda juga dapat mencoba terjemahan dari @ Gareth's J answer, kira-kira seperti ini (34 byte):

t(e1071::bincombinations(4))[4:1,]

Namun, ia menggunakan fungsi yang bukan bagian dari basis R, dan mengeluarkan matriks yang sulit untuk diformat menjadi teks yang dicetak persis seperti dalam spesifikasi.

rturnbull
sumber