Anda diberi banyak tabung reaksi ASCII, tugas Anda adalah mengurangi jumlah tabung reaksi yang digunakan.
Setiap tabung reaksi terlihat seperti ini:
| |
| |
| |
|~~|
| |
| |
| |
| |
|__|
Jelas, ~~
adalah ketinggian air. Tabung reaksi juga bisa kosong, dalam hal ini tidak ada ~~
karakter di dalamnya. Tabung tunggal dapat berisi hingga 8 unit level air.
Anda diberi jumlah terbatas tabung reaksi dengan level air yang berbeda di dalamnya. Anda harus menuangkan air dalam jumlah yang paling mungkin dari tabung reaksi, dan mengeluarkan hasilnya.
| | | | | | | | |~~| | |
| | | | | | | | | | | |
| | |~~| | | | | | | | |
|~~| | | | | | | | | |~~|
| | | | | | | | ------> | | | |
| | | | | | | | | | | |
| | | | |~~| | | | | | |
| | | | | | | | | | | |
|__| |__| |__| |__| |__| |__|
05 + 06 + 02 + 00 ------> 08 + 05
Seperti yang Anda lihat, tabung reaksi dipisahkan dengan ruang tunggal. Tabung kosong tidak boleh ditampilkan dalam output. Ini adalah kode golf, jadi kode dengan jumlah byte terkecil menang.
Uji kasus: http://pastebin.com/BC0C0uii
Selamat bermain golf!
Jawaban:
Pyth,
484544 byteCobalah online.
Mencetak satu spasi tambahan di setiap baris.
sumber
JavaScript (ES6),
159148 byteMenghasilkan linefeed tambahan. Sunting: Disimpan 11 byte dengan bantuan dari @Arnauld.
sumber
s.replace(/~~/g,(_,i)=>n+=9-i/s.indexOf`\n`|0,n=0)
harus menyimpan 4 byte. Anda mungkin ingin menginisialisasi n ke -1 dan menggunakann>>3
dan~n&7^i
menyimpan satu byte lagi.-1
idenya tetapi saya dapat memperbaikireplace
idenya.1/"\n"
kebenaran.Perl, 150 byte
149 byte kode +
-n
bendera.Saya tidak akan menjelaskan semua kode, hanya beberapa hal:
$l+=9-$.for/~~/g
menghitung berapa banyak air dalam input.Bagian kedua dari kode mencetak output. Idenya adalah untuk menempatkan tabung terisi penuh sebanyak mungkin, dan yang terakhir yang berisi air yang tersisa (jika ada). Jadi algoritma adalah dalam 4 bagian: mencetak baris pertama dari air (bagian atas tabung):
say"|~~| "x$v.($@="| | ")x$r
. Kemudian, mencetak bagian kosong dari tabung sampai kita mencapai tingkat air dari tabung terakhir:say$:=$@x$%for$l%8..6
. Kemudian mencetak tingkat di mana air tabung terakhir adalah:say$@x$v."|~~|"x$r
. Kemudian, mencetak semua yang tersisa "kosong" tingkat yang:say$:for 2..$l%8;
. Dan akhirnya, mencetak Intinya:say"|__| "x$%
.Nama variabel membuat sulit untuk membaca (
$%
,$@
,$:
) tapi memungkinkan untuk kata kunci sepertix
danfor
ditulis setelah variabel tanpa spasi.Untuk menjalankannya:
Saya tidak puas dengan berapa lama jawaban ini. Saya mencoba membuat yang terbaik dari algoritma saya, tetapi pendekatan yang berbeda mungkin bisa lebih pendek. Saya akan mencoba mengatasinya segera.
sumber
Befunge,
144138 byteCobalah online!
Dua baris pertama memproses input, pada dasarnya mengabaikan segalanya kecuali karakter pertama di setiap tabung yang mungkin menjadi penanda level. Kami mengambil nilai ASCII dari karakter itu, dibagi dengan 2 dan mod 2 (memberi kami 1 atau 0 tergantung pada apakah kita berada pada penanda level atau tidak), kalikan dengan nomor baris (menghitung mundur dari 8, sehingga memberi kami nilai level untuk tabung itu), dan menambahkannya ke total yang berjalan.
Output ditangani pada dua baris kedua, pada dasarnya dimulai pada ujung kanan dari baris ketiga. Kami pertama menghitung jumlah tabung dengan mengambil level air total ditambah 7 dibagi dengan 8. Kemudian ketika iterasi di atas baris semua tabung, kami menghitung karakter untuk ditampilkan di dalam tabung tertentu ( t , menghitung mundur ke 0) untuk diberikan baris ( r , menghitung mundur dari 8 ke 0) sebagai berikut:
Char_type yang dihitung adalah -1 untuk baris paling bawah (dasar tabung), 0 untuk area lain yang bukan permukaan air, dan 1 untuk permukaan air. Dengan demikian dapat digunakan sebagai pencarian tabel sederhana untuk karakter yang sesuai untuk output (Anda dapat melihat tabel ini di awal baris 4).
sumber
Haskell, 186 byte
Contoh penggunaan:
Beri spasi tambahan di setiap baris. Bagaimana itu bekerja:
Nyeri utama adalah kurangnya fungsi yang menghitung seberapa sering substring terjadi dalam string. Ada
count
diData.Text
, tetapi mengimpornya mengarah ke banyak konflik nama yang terlalu mahal untuk diselesaikan.sumber
Python, 261 byte
Saya merasa ada sesuatu yang hilang. Juga, jika banyak baris baru dapat diterima untuk output kosong, saya bisa kehilangan beberapa byte. Mengambil input seperti
'| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n| | | | | |\n|__| |__| |__|'
.sumber
Ruby , 139 byte
(138 byte kode ditambah satu byte untuk
-n
)Cobalah online!
Beberapa penjelasan:
Pembaruan 1: Menambahkan detail pada variabel, the
gsub
tipu daya danEND{
...}
fase.Pembaruan 2: (± 0 byte secara keseluruhan)
n||=0
alih-alihn=n||0
(-1 byte)-n
(+1 byte)sumber
Python 3, 404 byte
Program ini menciptakan hasil yang diinginkan penuh dengan ketinggian air dalam format ASCII dan angka.
sumber