Setumpuk bobot

13

Tantangan:

Anda akan diberi gambar ASCII dari tumpukan bobot sebagai input, dan harus menampilkan berat gabungan tumpukan.

masukkan deskripsi gambar di sini

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 sehingga kode terpendek dalam byte yang menang setiap bahasa. Penjelasan didorong seperti biasa.

Stewie Griffin
sumber
Tantangan Anda menginspirasi saya untuk menulis yang ini . Ada tips yang dihargai!
tgrass12

Jawaban:

7

Jelly ,  24  23 byte

ḟ⁶Ỵẹ€”|IFṚ’œṗ$Ḅ:3“ÇÞ‘yS

Cobalah 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, 20masing-masing untuk bobot ). Menambahkan trailing 1untuk 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 kita 1,2,5,10,14, yang merupakan bobot kecuali 14kebutuhan diganti oleh 20.

ḟ⁶Ỵẹ€”|IFṚ’œṗ$Ḅ:3“ÇÞ‘yS - Link: list of characters    e.g. <example 2>
 ⁶                      - literal space character
ḟ                       - filter discard
  Ỵ                     - split at new lines
     ”|                 - literal pipe character
   ẹ€                   - get indices for €ach             [[],[1,2],[1,22],[1,2],[1,16],[2,5],[1,8],[1,2],[1,8]]
       I                - incremental differences          [[],[1],[21],[1],[15],[3],[7],[1],[7]]
        F               - flatten                          [1,21,1,15,3,7,1,7]
         Ṛ              - reverse                          [7,1,7,3,15,1,21,1]
             $          - last two links as a monad:
          ’             -   decrement                     [6,0,6,2,14,0,20,0]
           œṗ           -   partition at truthy indices   [[],[7,1],[7],[3],[15,1],[21,1]]
              Ḅ         - convert from binary             [0,15,7,3,31,43]
               :3       - integer divide by three         [0,5,2,1,10,14]
                 “ÇÞ‘   - code-page-indices               [14,20]
                     y  - translate                       [0,5,2,1,10,20]
                      S - sum                             38

Atau ganti lebar terukur 21dengan 30sebelum konversi menggunakan “ßœ‘y:

ḟ⁶Ỵẹ€”|IF“ßœ‘yṚ’œṗ$Ḅ:3S
Jonathan Allan
sumber
4

Python 2 , 77 byte

lambda x:sum(i/21*x.count('|'+i%21*' _'[i<50]+'|')for i in[23,48,69,224,440])

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 sebagai 2dan tubuh sebagai 3, menghasilkan 5)

tongkat
sumber
4

Retina 0.8.2 , 60 byte

T`|`!
!__!
1
!_{6}!
11
! {6}!
3$*
!.{14}!
5$*
!.{20}!
10$*
1

Cobalah online! Penjelasan: |S diganti dengan !s untuk kemudahan pencocokan, kemudian bobot diubah menjadi unary dan dijumlahkan. Satu-satunya bagian yang menarik adalah bahwa 5berat dianggap sebagai jumlah dari 2dan 3berat, sedangkan bobot 10dan 20hanya dua baris setengah dari berat.

Neil
sumber
2

Python 3 , 76 byte

lambda t:sum([1,2,3,5,5,9,11][len(x)//4+(x<'_')]for x in t.split('|')[1::2])

Cobalah online!

Bagaimana?

sum([1,2,3,5,5,9,11][len(x)//4+(x<'_')]for x in t.split('|')[1::2])
                                                t.split('|')         - split ascii art into pieces
                                                            [1::2])  - weights are at odd indexes
                                       for x in                      - iterates over the weights
                     len(x)//4                                       - map widths to 0,1,3,5,7
                              +(x<'_')                               - add 1 if the first row of 2-row weight
    [1,2,3,5,5,9,11][                 ]                              - value of each part of a weight
sum(                                                              )  - add 'em all up
RootTwo
sumber
1

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 Stringmenjadi a Collection<String>dan kemudian jumlahkan hasil untuk setiap baris untuk mendapatkan total. Menggunakan di Mapmana 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.

TheJizel
sumber