Tantangan:
Anda akan diberi gambar ASCII dari tumpukan bobot sebagai input, dan harus menampilkan berat gabungan tumpukan.
Format:
Ada 5 bobot yang berbeda, dengan berat 1, 2, 5, 10, 20 Passerees (atau unit sewenang-wenang lainnya).
Bobotnya terlihat seperti ini, dalam urutan naik:
1: __
|__|
2: ______
|______|
5: ______
| |
|______|
10: ______________
| |
|______________|
20: ____________________
| |
|____________________|
Bobot akan ditempatkan secara simetris (seperti pada contoh gambar), tidak harus dalam urutan yang diurutkan. Berat akan berbagi batas, jika berlaku:
Kasus uji:
Anda dapat menggunakan semua bobot tunggal sebagai kasus uji juga.
__
_|__|_
|______|
| |
|______|
1 + 2 + 5 = 8
____________________
| |
|____________________|
| |
|______________|
_|__|_
|______|
| |
|______|
20 + 10 + 1 + 2 + 5 = 38
______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8
Aturan tambahan:
- Anda tidak boleh menggunakan spasi tambahan tambahan. Berat terbesar akan sampai ke kiri.
- Anda dapat mengasumsikan spasi tambahan dan baris baru.
- Anda mungkin berasumsi akan ada 10 bobot maksimum
- Anda dapat mengambil input pada format opsional, tetapi Anda tidak dapat mengganti karakter yang digunakan oleh sesuatu yang lain
Ini adalah kode-golf sehingga kode terpendek dalam byte yang menang setiap bahasa. Penjelasan didorong seperti biasa.
Jawaban:
Jelly ,
2423 byteCobalah online!
Bagaimana?
Bobot dapat diidentifikasi dengan lebar dan tinggi. Lebar dapat diukur dengan melihat jarak antara karakter garis
|
. Jika pertama-tama kita menghapus semua spasi maka bobot dengan tinggi dua akan menyumbang garis seperti itu dengan lebar satu yang terukur.Bobot yang berbeda memiliki lebar
3, 7, 7, 15, 21
(1, 2, 5, 10, 20
masing-masing untuk bobot ). Menambahkan trailing1
untuk mereka yang tingginya dua kita temukan[3],[7],[7,1],[15,1],[21,1]
mengkonversi dari biner ini3,7,15,31,43
, bilangan bulat membagi tiga memberi kita1,2,5,10,14
, yang merupakan bobot kecuali14
kebutuhan diganti oleh20
.Atau ganti lebar terukur
21
dengan30
sebelum konversi menggunakan“ßœ‘y
:sumber
Python 2 , 77 byte
Cobalah online!
[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]
akan menghasilkan kembar tiga berikut[1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']
yang mewakili berat, panjang dan karakter di dasar setiap berat, yang akan digunakan untuk membuat representasi garis tunggal yang unik dari setiap bobot.Karena berat ke-3 akan tumpang tindih dengan yang ke-2, saya mengganti dasarnya dengan tubuh itu (
_
->) dan mengurangi nilainya menjadi
3
(itu akan menghitung dasar sebagai2
dan tubuh sebagai3
, menghasilkan5
)sumber
Retina 0.8.2 , 60 byte
Cobalah online! Penjelasan:
|
S diganti dengan!
s untuk kemudahan pencocokan, kemudian bobot diubah menjadi unary dan dijumlahkan. Satu-satunya bagian yang menarik adalah bahwa5
berat dianggap sebagai jumlah dari2
dan3
berat, sedangkan bobot10
dan20
hanya dua baris setengah dari berat.sumber
JavaScript (Node.js) , 73 byte
Cobalah online!
sumber
Python 3 , 76 byte
Cobalah online!
Bagaimana?
sumber
Saya yakin ada beberapa perbaikan yang harus dilakukan, tetapi inilah yang saya miliki saat ini:
Groovy, 131 byte
def f(s){s.split('\n').sum{n=0;[2:1,6:2,14:5,20:10].each{k,v->if(it==~".*\\|[ _]{$k}\\|.*"){n=v+(!it.contains('_')&&k==6?1:0)}};n}}
Ubah input
String
menjadi aCollection<String>
dan kemudian jumlahkan hasil untuk setiap baris untuk mendapatkan total. Menggunakan diMap
mana kuncinya adalah jumlah spasi atau garis bawah di antara karakter pipa dan nilainya adalah jumlah Passerees yang sesuai. Kunci dicolokkan ke regex untuk menentukan apakah garis cocok dengan pola yang signifikan. Satu peringatan adalah terner untuk menambahkan 1 dalam kasus di mana panjang substring antara pipa adalah 6 dan terdiri dari spasi (yang bertentangan dengan garis bawah). Jika tidak ada pola yang cocok, garis tersebut memiliki nilai 0.sumber
Perl 6 , 57 byte
Cobalah online!
sumber