Ubin duodadik adalah jenis blok fungsi persegi yang mengambil dua input, satu dari sisi atas dan satu dari sisi kiri, dan memiliki dua output, satu di sisi kanan dan satu di sisi bawah. Setiap output mereka adalah fungsi terpisah dari kedua input mereka.
Misalnya, jika #
mewakili ubin generik, output yang tepat R
adalah fungsi f
input T
dan L
, dan output bawah B
adalah fungsi lain g
dari T
dan L
:
T
L#R R = f(T, L)
B B = g(T, L)
(Ubin disebut "duo" karena ada dua fungsi, dan "diad" karena kedua fungsi memiliki dua argumen .)
Ubin kemudian dapat dikomposisikan bersama pada sebuah grid, output dari satu ubin langsung ke input ubin tetangga. Di sini misalnya, output kanan dari kiri #
masuk ke input kiri kanan #
:
AB D = f(f(A, C), B)
C##D E = g(A, C)
EF F = g(f(A, C), B)
Anda dapat membayangkan bahwa diberikan satu set ubin duodadik, masing-masing dengan fungsi spesifik, komposisi kompleks (dan berpotensi bermanfaat) dapat dibuat.
Dalam tantangan ini, kita hanya akan memusatkan perhatian pada perangkat tradisional dari sepuluh petak duodyadic berbasis logika , di mana semua input dan output adalah bilangan biner bit-tunggal (nol atau yang). Kami akan menggunakan karakter ASCII terpisah untuk menunjukkan setiap jenis ubin.
Karakter ubin dan hubungan input-outputnya adalah sebagai berikut:
( T
untuk input atas, L
untuk input kiri, R
untuk output kanan, B
untuk output bawah.)
- Nol:
0
atau(spasi) →
R = 0
,B = 0
- Satu:
1
→R = 1
,B = 1
- Salib:
+
→R = L
,B = T
- Cermin:
\
→R = T
,B = L
- Hanya di atas:
U
→R = T
,B = T
- Hanya yang tersisa:
)
→R = L
,B = L
- Tidak:
!
→R = not L
,B = not T
- Dan:
&
→R = L and T
,B = L and T
- Atau:
|
→R = L or T
,B = L or T
- Xor:
^
→R = L xor T
,B = L xor T
Tantangan
Tulis sebuah program atau fungsi yang mengambil dalam kotak persegi panjang dari karakter 0 1+\U)!&|^
yang mewakili "sirkuit" yang dibuat menggunakan sepuluh ubin duodyadic berbasis logika. Anda juga perlu mengambil dua string 0
'dan 1
'; satu akan menjadi kolom input kiri dan satu akan menjadi baris input atas. Program / fungsi Anda perlu mencetak / mengembalikan baris output bawah dan kolom output kanan (juga di 0
's dan 1
' s).
Misalnya, di kotak ini
+++
+++
semua input mengalir lurus melintasi grid ke output
ABC
D+++D
E+++E
ABC
jadi input dari 010
/ 01
akan memiliki output 010
/ 01
:
010
0+++0
1+++1
010
Keluaran pasti dari program Anda adalah [bottom output row]\n[right output column]
atau [bottom output row]/[right output column]
:
010
01
atau
010/01
Jika Anda menulis suatu fungsi, Anda dapat mengembalikan dua string dalam sebuah tuple atau daftar (atau masih mencetaknya).
Detail
- Ambil tiga input sebagai string dengan cara yang masuk akal (lebih disukai di kisi pesanan, baris atas, kolom kiri): baris perintah, file teks, sdtin, function arg.
- Anda dapat mengasumsikan panjang baris dan kolom input akan cocok dengan dimensi kisi dan hanya akan berisi
0
'dan1
'. - Kisi Anda harus menggunakan karakter yang tepat (
0 1+\U)!&|^
). Ingat itu0
danmaksudkan hal yang sama.
Uji Kasus
(Baca I / O sebagai top
/ left
→ bottom
/ right
.)
Nand:
&!
00
/ 0
→ 01
/ 1
00
/ 1
→ 01
/ 1
10
/ 0
→ 01
/ 1
10
/ 1
→ 11
/0
Semua yang:
1111
1\+\
1+\+
1\+\
Setiap input harus menghasilkan 1111
/ 1111
.
Xor dari Nand: (perhatikan kolom spasi tambahan)
\)+\
U&!&
+! !
\&!&
!
00000
/ 00000
→ 00000
/ 00000
00000
/ 10000
→ 00010
/ 00000
10000
/ 00000
→ 00010
/ 00000
10000
/ 10000
→ 00000
/00000
Zig zag:
+++\00000000
000\!!!!\000
00000000\+++
Bit pertama dari input kiri menjadi bit terakhir dari output kanan. Yang lainnya adalah 0
.
000000000000
/ 000
→ 000000000000
/ 000
000000000000
/ 100
→ 000000000000
/001
Perambatan:
)))
UUU
U+U
U+U
UUU
Bit pertama dari input kiri menuju ke semua output.
000
/ 00000
→ 000
/ 00000
000
/ 10000
→ 111
/11111
Berikut adalah pastebin dari semua kotak uji 1 × 1.
Mencetak gol
Pengajuan terpendek dalam byte menang.
Bonus: "sirkuit" keren apa yang bisa Anda buat?
PS Jangan ganggu Googling "ubin duodyadic". Saya mengarangnya kemarin; D
Jika Anda ingin mendiskusikan perluasan ide ini menjadi bahasa pemrograman yang lengkap, datanglah ke ruang obrolan ini .
sumber
Jawaban:
Pyth, 122
Agak monster. Hanya menggunakan rekursi, tidak ada yang mewah seperti pemrograman dinamis.
Demonstrasi online .
Input dengan cara berikut: Pertama grid (tidak ada yang melarikan diri, tidak ada simbol tambahan) dan kemudian dua baris input, misalnya (Zig zag)
sumber
Mathematica,
331276270267264262252250 byteIni
adalah karakter Unicode penggunaan pribadi yang digunakan Mathematica sebagai superscriptT
, yaitu operator transposisi.Ini adalah versi yang lebih mudah dibaca:
Ini adalah fungsi tanpa nama yang mengambil tiga string untuk input grid, atas dan kiri dan mencetak output bawah dan kanan.
Penjelasan
Mari kita lalui langkah demi langkah ini (saya akan mencoba untuk tidak mengasumsikan pengetahuan Mathematica). Anda perlu membaca kode kembali ke depan. Algoritma dasar hanya menyapu garis komputasi setiap fungsi dan menyimpan hasilnya
f
untuk diakses oleh ubin berikutnya.Pemrosesan input
Itu sedikit ini:
Ini hanya membagi kisi-kisi menjadi daftar karakter yang bersarang (perhatikan bahwa saya mendefinisikan
h
sebagai alias untukCharacter
suatu tempat dalam kode) dan kemudian menambahkan baris dan kolom dengan input. Ini berfungsi, karena1
dan0
juga nama-nama ubin fungsi konstan, jadi sebenarnya menempatkan mereka pada efek yang sama seperti memberi makan input secara manual. Karena ini adalah fungsi mereka secara teknis akan mengambil input dari luar grid, tetapi karena mereka adalah fungsi konstan yang tidak masalah. Sudut kiri atas mendapat0
tetapi ini cukup sewenang-wenang karena hasil ubin itu tidak pernah digunakan.Perhatikan juga transposisi. Menambahkan kolom membutuhkan lebih banyak karakter daripada menambahkan baris, jadi saya mengubah urutan grid setelah menambahkan baris atas. Ini berarti bahwa bagian atas / bawah dan kiri / kanan ditukar untuk bagian utama dari program, tetapi mereka benar-benar dapat ditukar sehingga tidak masalah. Saya hanya perlu memastikan untuk mengembalikan hasil dalam urutan yang benar.
Memecahkan grid
(Bagian ini sedikit ketinggalan jaman. Akan diperbaiki setelah aku benar-benar yakin sudah selesai bermain golf.)
Selanjutnya, kita menabrak
MapIndexed
bagian dalam daftar bersarang ini. Ini memanggil fungsi anonim yang disediakan sebagai argumen pertama untuk setiap karakter dalam kisi, juga memberikan daftar dengan dua koordinat saat ini. Kisi dilewati secara berurutan, sehingga kami dapat dengan aman menghitung setiap sel berdasarkan yang sebelumnya.Kami menggunakan variabel
r
(ight) danb
(ottom) sebagai tabel pencarian untuk hasil setiap sel. Fungsi anonim kami memiliki koordinat saat ini#2
, jadi kami mendapatkan input dengan sel apa punPerhatikan bahwa pada baris dan kolom pertama ini akan mengakses nilai
r
danb
. Mathematica tidak benar-benar memiliki masalah dengan itu dan hanya akan memberikan Anda kembali koordinat Anda sebagai gantinya, tetapi kami membuang hasil ini, karena semua ubin di baris / kolom itu adalah fungsi konstan.Sekarang ini:
Adalah bentuk golf
Yang pada gilirannya adalah fungsi yang, mengingat dua input ubin, mengembalikan Asosiasi (Anda akan menyebutnya hashmap atau tabel dalam bahasa lain), yang berisi semua hasil ubin yang mungkin untuk kedua input ini. Untuk memahami, bagaimana semua fungsi diimplementasikan, Anda perlu tahu bahwa argumen pertama dari fungsi tersebut dapat diakses dengan
#
dan yang kedua dengan#2
. Selanjutnya,##
memberi Anda urutan kedua argumen yang dapat digunakan untuk "memerciki" argumen.0
: mudah, kami hanya mengembalikan konstanta{0, 0}
dan juga menetapkan iniz
untuk penggunaan di masa mendatang (misalnya di ubin ruang).1
: pada dasarnya adil{1,1}
, tetapi memilikiz
ini disingkat menjadi1+z
. Kami juga menyimpan inio
, karena akan berguna untuk semua ubin di mana kedua output identik.+
: Di sini kita menggunakan urutan.{##}
adalah sama dengan{#,#2}
dan melewati kedua input melalui tidak berubah.\
: Kami menukar dua argumen{#2,#}
,.U
: Sekarang kita bisa memanfaatkano
.o#2
berarti{1,1}*#2
jadi kami hanya menempatkan argumen teratas di kedua output.)
: Analog untuk argumen kiri:o#
.!
: Bitwise tidak menjengkelkan di Mathematica, tapi karena kami hanya pernah memiliki0
dan1
, kita hanya dapat mengurangi kedua input dari1
(demikian pembalik mereka) dan meneruskannya:1-{##}
.&
: Yang ini cukup bagus. Pertama kita perhatikan bahwa bitwise dan untuk0
dan1
identik dengan perkalian. Selanjutnya,o##
sama dengano*#*#2
.|
: Sekali lagi, kami menggunakan fungsi yang setara. Bitwise atau sama sepertiMax
dalam kasus ini, jadi kami menerapkanMax
argumen input dan mengalikan hasilnya menjadi{1,1}
.^
: Yang terpendek yang saya temukan untuk xor adalah untuk mengambil perbedaan dan mengujinya (untuk memastikan positif), jadi kami punyao(#-#2)^2
.Setelah fungsi ini selesai dan mengembalikan asosiasi penuh, kami menggunakan karakter sel saat ini untuk mengeluarkan elemen yang kami minati dan menyimpannya di
r
danb
. Perhatikan bahwa ini juga merupakan nilai balik dari fungsi anonim yang digunakanMapIndexed
, sehingga pemetaan sebenarnya akan memberi saya kisi dari semua hasil.Pemrosesan output
MapIndexed
mengembalikan kotak 3D, di mana dimensi pertama berkorespondensi dengan koordinat grid horizontal (ingat transposisi sebelumnya), dimensi kedua berkorespondensi dengan koordinat grid vertikal dan yang ketiga menunjukkan apakah kita punya output bawah atau kiri. Perhatikan bahwa ini juga berisi baris dan kolom input yang harus kita singkirkan. Jadi kita mengakses output bawah baris bawah dengandan output kanan kolom terakhir dengan
Perhatikan bahwa
2;;
rentang dari elemen kedua ke elemen terakhir.Terakhir, kami berlaku
Print
untuk keduanya (menggunakan@@@
sebagai sintaksis gula untuk tingkat keduaApply
), yang hanya mencetak semua argumennya secara berurutan (dan karena itu diterapkan pada dua ekspresi terpisah, akan ada garis baru antara bawah dan output yang benar).sumber
C,
332309272270266259247225 byteLihat hasil online di sini!
Ini mendefinisikan fungsi
void f(char*, char*, char*)
, yang harus menggunakan papan sebagai input pertama, lalu baris input atas, dan kemudian baris input kiri.Inilah yang saya gunakan untuk mengujinya:
Jadi, dengan memasukkan pengali 2-bit Sp3000:
Kita mendapatkan:
Pada catatan lain, dengan setengah penambah Sp3000 dalam pikiran, saya ingin melihat penambah penuh ...Salah satu dari kalian melakukannya! Saya tidak berpikir sistem berdiri sendiri sebagai bahasa pemrograman, tetapi ini sangat menarik. Ini sepertinya target yang sangat bagus untuk metagolf!Penjelasan Singkat:
Berikut kode yang terurai, yang dikomentari:
Kami beralih
c
, kiri ke kanan (kemudian atas ke bawah), menulis ulangt
input setiap kali dan mendorong output paling kanan yang dimasukkan ke dalaml
string. Kita dapat membayangkan ini sebagai mengganti baris atasc
dengan1
dan dan0
iteratif, dan melacak bit yang didorong keluar di sebelah kanan.Berikut urutan yang lebih visual, baris demi baris:
Ini jelas menjadi lebih rumit dengan berbagai simbol dan ukuran, tetapi ide sentralnya tetap berlaku. Ini hanya berfungsi karena data tidak pernah mengalir ke atas atau ke kiri.
sumber
f
menjadif(c,t,l)char*c,*t,*l
(jangan peduli tentang jenis pengembalian).f(c,t,l)char*c,*t,*l;
. Jangan mengkompilasi dalam mode C11, karena aturan int implisit yang memungkinkan kita untuk menjatuhkan tipe kembali telah dijatuhkan dalam revisi itu.*l
? Ini mengkompilasi dalam mode C99 pada mesin saya.Python 2, 316 byte
Fungsi ini membangun 10 fungsi lambda ubin, kemudian beralih melalui kisi, memperbarui status logika. Keadaan akhir vertikal dan horizontal kemudian dicetak.
Kode ungolfed termasuk tes:
The
test.txt
berkas (termasuk 2 tes lain dengan Sp3000):Output tes:
sumber
Python 2,
384338325 byteSerius CH, jika ini bukan mainan Anda harus mulai menelepon beberapa pabrik mainan.
Lebih banyak bermain golf dan jauh lebih efisien sekarang, tetapi masih belum menyusul CarpetPython. Input like
f("1111\n1\\+\\\n1+\\+\n1\\+\\","0101","1010")
, output adalah tuple dari dua string. Pastikan papan tidak memiliki baris tambahan, yang akan merusak segalanya.Program uji
Anda juga dapat menguji semua kemungkinan kasus dengan
test_all()
.Kasus uji ekstra
Setengah penambah
Inilah setengah penambah yang menambahkan bit kiri atas, menghasilkan
<input bit> <carry> <sum>
:Tes:
Output harus sama bahkan jika bit input kedua / ketiga diubah.
Pergeseran kanan
Diberikan
abc / def
, ini outputfab / cde
:Tes:
Penyortir 3-bit
Mengurutkan tiga bit pertama dari atas ke dalam tiga bit terakhir dari bagian bawah. Output yang tepat adalah sampah.
Tes:
Pengganda 2-bit demi 2-bit
Mengambil bit 1/2 atas sebagai angka pertama, dan bit 3/4 atas sebagai angka kedua. Output ke empat bit terakhir dari bagian bawah. Output yang tepat adalah sampah.
Sunting: Keluar kolom dan dua baris.
Tes:
sumber
R,
524517Mungkin ada banyak ruang untuk mengurangi ini saat ini, tetapi ini benar-benar menarik untuk dilakukan. Ada dua fungsi. Fungsi d adalah pekerja dan f adalah pembanding.
Fungsi d disebut dengan 3 string, Gates, Top dan Left. Gerbang dimasukkan ke dalam matriks yang ditentukan oleh lebar.
Diformat sedikit
Beberapa tes
sumber