Tantangan Anda adalah menafsirkan diagram sirkuit, lengkap dengan gerbang logika.
Gerbang logika (Anda sebenarnya tidak perlu tahu apa yang harus dilakukan untuk menyelesaikan tantangan ini):
- dan gerbang:
a
- atau gerbang:
o
- gerbang nand:
A
- atau gerbang:
O
- gerbang xor:
x
- gerbang xnor:
X
- bukan gerbang:
~
Setiap gerbang tetapi yang terakhir membutuhkan dua input. Input berasal dari .
di sudut kiri atas dan kiri bawah dari 3 oleh 3 persegi yang berpusat di gerbang. Karena tidak, input langsung ke kiri. Output adalah .
langsung ke kanan.
Kabel diwakili oleh -|\/.=
-
kontak dua kabel, satu ke kanan, dan satu ke kiri:c-c
|
kontak dua kabel, satu di atas, dan satu di bawah:c | c
/
dan\
bekerja sebagai berikut:c c \ / c c
.
kontak setiap kawat di sekitarnya:ccc c.c ccc
=
spesial; itu menghubungkan kabel yang berdekatan di atasnya:-=-
menghubungkan dua kabel. Berikut ini
\|/ -=- /|\
masing-masing kabel berlawanan terhubung satu sama lain, tetapi tidak yang lain (di sinilah berbeda dari
.
).- Agar arus mengalir, dua kabel harus keduanya terhubung ke yang lain, sehingga
|-
, arus tidak mengalir.
Contoh pemasangan kabel:
.-.
= \
.--. .---=---
-. = .--
.--. .-------
input dibagi menjadi dua kabel dan kemudian dibagi menjadi tiga. Dalam perpecahan ini, kawat bawah bergerak ke tengah, dan perpecahan ke bawah dari kawat atas muncul di bagian bawah. Selanjutnya, bagian atas dari tiga kabel dipindahkan ke tengah.
Contoh kabel dengan gerbang:
--.
o..~..
--. o.---
a.---.
--.
Masukkan format:
- setiap kabel input akan diberi label dengan digit. Pada akhir (tepat sebelum baris baru), setiap output akan diberi label dengan
:
(dan kawat akan selalu pergi tepat ke dalamnya, yaitu-:
atau.:
atau=:
) - input akan selalu valid; tidak akan ada loop atau kabel bergabung bersama tanpa gerbang. Perhatikan bahwa mungkin ada kabel dengan ujung longgar.
=
akan digunakan hanya jika diperlukan.
Format output:
- setiap input direferensikan dengan nomor yang sesuai.
- sebuah ekspresi dikeluarkan. Misalnya, jika kabel menghitung input 1 dan input 2, hasilnya adalah
1a2
. - fungsi apa pun yang dikeluarkan harus sesuai dengan gerbang logika di awal.
- untuk tidak menunjukkan, letakkan
~
sebelum tempat yang benar. untuk beberapa fungsi, gunakan tanda kurung untuk menunjukkan urutan eksekusi. Kurung juga dapat digunakan ketika hanya ada satu fungsi. Sebagai contoh,
1-.~.-. A.~.-: . 2-. / x. 3-.
memiliki satu kemungkinan keluaran
~((2x3)A(~1))
- banyak output harus dipisahkan oleh baris baru (atau setara)
Input sampel:
1--.---.
x. \
2--. x.-=---------.
. .~. X.--.
3---. . a.----. /
O.~.-. \ /
. =
4-. / / .-:
X. .----:
5-.
Satu kemungkinan output yang sesuai:
(~1)a(~(3O(4X5))
((1x2)x3)X((~1)a(~(3O(4X5))))
Jawaban:
Python
24881567806706697657653Yay untuk gzip + exec!
Keterbatasan dan asumsi
Karena itu, hanya hingga 9 input yang didukung - banyak digit tidak ditangani dengan benar. Karena spek menunjukkan bahwa input diberi label dengan digit , bukan angka , ini diizinkan.
Masukan dan keluaran
Input diambil melalui standar masuk, dan keluaran melalui standar keluar.
Pengujian
Input dan output sampel:
Diuji di sini: http://ideone.com/gP4CIq
Algoritma
Ini pada dasarnya DFS agak naif dari output. Untuk setiap output, ia mulai dari karakter satu ke kiri dan menelusuri kawat, bercabang (dan menambahkan ke ekspresi) di setiap gerbang. Ketika mencapai input, itu menambahkannya ke ekspresi dan backtracks ke titik terakhir bercabang, karena kita bisa yakin bahwa percabangan tidak mungkin tanpa gerbang. Dan tentu saja setiap kasus yang tidak valid dibuang. Tidak ada yang benar-benar istimewa - dan karena itu kemungkinan lebih lama dari yang seharusnya.
Catatan
Ukuran mungkin bisa dikurangi sedikit dengan restrukturisasi, tapi saya sudah menghabiskan cukup waktu untuk ini untuk hari ini. Versi golf secara manual adalah yang dikompresi.
Kompresi gzip membuat golf menjadi menarik, karena caching tertentu (misalnya
d=(-1,0,1)
) sebenarnya membutuhkan lebih banyak ruang daripada membiarkan algoritma kompresi mengatasinya. Namun, saya memilih golf versi manual sejauh mungkin daripada mengoptimalkan kompresi.Bermain golf secara manual (
909895840803):Ungolfed penuh (2488):
sumber
0
angka? Bagaimana kalau bertukar pemesanan sehingga2
datang sebelumnya1
, dll..isdigit()
, yang secara efektif setara dengan regex[0-9]
sejauh yang saya tahu. Apakah itu benar menurut spesifikasi Anda? Apa yang Anda maksud dengan bertukar pemesanan? Cara ini diterapkan, itu akan menuju cabang atas dari setiap gerbang logika pertama, tetapi tidak ada jaminan pemesanan input.isdigit()
konsisten. Urutan bertukar berarti sesuatu seperti2
input pertama, dan1
sebagai input kedua (diurutkan secara vertikal).Jawa:
15231512 karakterIni memberikan output ini untuk input sampel:
Untuk memeras ukurannya:
r
, tanpa ekstensi file apa pun dalam namanya.Saya yakin itu mungkin untuk mengurangi lebih banyak, tetapi hanya sedikit.
Penerjemah diimplementasikan dalam bentuk semacam automata seluler. Ini memindai seluruh nilai pengaturan bidang, mengulanginya sebanyak yang diperlukan hingga tidak ada perubahan yang terdeteksi.
Ini adalah versi yang tidak dikoleksi:
sumber
try{}catch(Exception e){}
daripada duathrows Exception
. Mungkin ada hal-hal lain, tetapi saya tidak tahu cara bermain golf Jawa.