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.
sumber
Jawaban:
J, 10 (13?) Karakter
Daftar nomor:
ke biner:
Mengubah urutan:
Membalikkan:
Apakah kita perlu menghapus spasi? Melihat jawaban J lain tampaknya kita sehingga kita harus menambahkan 3 karakter dan meminjam
1":
dari jawaban Jan ini .sumber
Python 2, 40
sumber
APL (14)
Dengan asumsi
⎕IO=0
(itu adalah pengaturan):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⎕D
yang merupakan string0123456789
. (Matriks numerik ditampilkan dengan spasi di antara nilai-nilai, matriks karakter tidak. Jadi ini mengubah setiap bit numerik ke salah satu karakter'0' '1'
).sumber
(4⍴2)⊤
→2⊥⍣¯1
Jelly ,
427 byte (tidak bersaing)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.
sumber
/// , 51 byte
Cobalah online
sumber
GolfScript (
18 1715 karakter)(Dengan terima kasih kepada Howard)
Saya tidak mengerti mengapa 10-char
tidak bekerja; Saya menduga bahwa bug dalam interpreter standar menghasilkan tipe yang tidak didukung pada stack.
Alternatif 18 karakter yang saya mengerti sepenuhnya adalah:
Pendekatan yang lebih matematis sedikit lebih lama, pada 28 karakter:
Banyak dari itu untuk konversi basis dan zero-padding. Tanpa itu, turun menjadi 19 karakter,
dengan output
sumber
16,zip{n}/
bekerja?16,zip{','-~n}%
zip
harus 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.CJam - 16
Kode java yang setara (sebagai penjelasan):
sumber
Javascript (ECMA6), 67
Untuk menggunakan ini, hubungi
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,
XOR bitwise ini memberi kita
yang merupakan baris berikutnya (baris 3).
Menerapkan proses yang sama untuk saluran 3, bergeser 2 ke kiri dan kami ...
XOR'ed memberi
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.
adalah untuk memasukkan 0 ke awal setiap baris karena toString mengeluarkan 0 yang terkemuka.
sumber
s=(k,n)=>n?s((k<<n/2)^k,n>>1)+"0".repeat(n)+k.toString(2)+` `:""
J, 21 karakter
i.16
adalah daftar 0..152^i.4
adalah daftar (1,2,4,8)%~/
menghasilkan tabel pembagian di mana argumen kiri membentuk baris tetapi merupakan argumen yang tepat untuk pembagian2|
menghitung sisanya setelah membagi [setiap sel] dengan dua<.
lantai yang bernilai 0 atau 11":
memformat tabel dengan satu karakter per selsumber
floor
seharusnya tidak perlu. Domain2|
sudah 0 atau 1, kan?|
beroperasi di atas kendaraan hias .2|3.25
adalah1.25
. Kami tidak menginginkan itu.GolfScript, 19 karakter
Pendekatan GolfScript lainnya
sumber
Ruby (44)
Membosankan dan panjang: Hanya mencetak representasi biner 0-angka dari angka-angka.
sumber
Nota bene
108177126777470Membalikkan nilai untuk metode mod- off yang lebih sederhana .
151131119Menerapkan pendekatan APL- is lebih banyak . sunting: penggantian talenan string dan ritsleting dengan pengindeksan dan for-loop.
Bertakuk:
Menerapkan kembali fungsi yang digunakan dalam jawaban J yang mengarah ke ini (dengan banyak kode dukungan ).
i
di sini adalah vektor berbasis 1 yang dijelaskan dalam Fungsi Dasar Iverson , maka-1 ... +
untuk menghasilkan0 .. 15
.sumber
Perl (36 +1)
+1 untuk
say
, seperti biasa. dobel0
bukan kesalahan ketik :)sumber
say
.perl -e'...'
standar dan ini membutuhkanperl -E'...'
, tidak ada peningkatan dalam jumlah byte. Lagi pula, saya pikir diputuskan pada Code Golf Meta yang-M5.01
gratis.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 kolmogorov-kompleksitas dan saya berpikir - bagaimana saya bisa mengurangi jumlah kode yang mewakili nilai-nilai itu ...? Basa .
(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, 73
nilai - nilai itu.Catatan: Saya menyadari itu tidak akan mendekati jawaban yang menang, tetapi hanya demi ide ...
sumber
alert(['gut','a43','2z3',73].map(n=>(1e8+parseInt(n,36).toString(2)).slice(-16)).join('\n'))
. Pendekatan ini menggunakan baris baru, bukan empatalert()
.Sprects , 44 byte
Jawaban Cedric diangkut ke Sprects.
sumber
MATL ( non-bersaing ), 8 byte
Cobalah online!
Penjelasan
sumber
CJam ( non-bersaing ),
109 byteTerima kasih kepada @ Dennis untuk 1 byte off!
Cobalah online!
Penjelasan
sumber
JavaScript (ES6),
5852 byteMembangun string secara rekursif.
Bagaimana itu bekerja
Rekursi ini didasarkan pada fakta bahwa pola dibuat dari representasi biner vertikal dari camilan 0x0 hingga 0xF:
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 tunggaln
mulai 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:
Kami membutuhkan 17 byte lagi untuk menyisipkan linebreak. Ini bisa dipersingkat menjadi 14 byte jika linebreak terkemuka dapat diterima.
Demo
sumber
(f=(n=64)=>n--?f(n)+(n>>(n>>4)&1):'')().match(/.{16}/g).join`\n`
(63 byte).replace(/.{16}/g,"$0\n")
memiliki panjang yang sama. Sangat buruk.Bash + coreutils, 65 byte
Bukan yang terpendek, tapi juga yang terpanjang:
(Karakter terakhir adalah spasi)
Cobalah online .
sumber
NARS2000 APL, 22
Berasal dari jawaban APL marinus, yang sepertinya tidak bekerja pada NARS2000.
Hasilkan vektor
Ubah ke berbasis nol
Hasilkan bentuk untuk disandikan
Menyandi
Sesuaikan untuk pengindeksan berbasis 1
Membalikkan poros utama
Indeks
sumber
C, 73 karakter
Ini hanyalah solusi umum untuk menghasilkan 64 bit dalam empat blok 16-bit; Anda hanya perlu mengubah nomor
0xFF0F0F33335555
untuk menampilkan urutan bit lainnya.disederhanakan & ungolfed:
sumber
Haskell, 73
Astaga, 73 karakter! Aku tidak bisa karena cinta tuhan mendapatkan ini lebih kecil.
Bagian sedih yang sebenarnya tentang ini adalah bahwa jika Anda menggemakan output menggunakan bash, Anda hanya perlu 74 karakter.
sumber
JavaScript (ES5) 69
for(x="";4>x;x++){z="";for(n=0;16>n;)z+=1-!(n++&1<<x);console.log(z)}
sumber
inca2 ,
332724Ini 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:
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.y
menghasilkan ini1916 versi char.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
sumber
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
grc's: 24 karakter
sumber
C ++ 130
Mengubah hex menjadi biner
sumber
Haskell (Lambdabot), 47 byte
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
sumber
Julia (39 Bytes)
Naskah kedua yang pernah saya tulis dalam Julia, harus mengakui bahwa saya menyukai Julia, dia binatang buas yang cantik.
Kembali
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.sumber
C
8377767471Cukup mudah.
sumber
?:
, dan penghematan 1 lainnya dengan memindahkan a++
.main
kef
. lolR,
5341 byteTerjemahan dari jawaban python @ grc Memotong 12 byte dari terjemahan asli melalui penggunaan
rep()
'seach
danlength
argumen (dan pencocokan argumen parsial), dan dengan mengingat bahwa0:1
itu setara denganc(0,1)
.Anda juga dapat mencoba terjemahan dari @ Gareth's J answer, kira-kira seperti ini (34 byte):
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.
sumber