Bir yığın ağırlık


13

Meydan okuma:

Giriş olarak bir ağırlık yığını ASCII görüntüsü verilecek ve kümenin birleşik ağırlığını çıktı almalısınız.

resim açıklamasını buraya girin

Biçim:

1, 2, 5, 10, 20 Passerees (veya başka bir keyfi birim) ağırlığında 5 farklı ağırlık vardır .

Ağırlıklar artan düzende şöyle görünür:

1:   __
    |__|

2:   ______
    |______|

5:   ______
    |      |
    |______|

10:  ______________
    |              |
    |______________|

20:  ____________________
    |                    |
    |____________________|

Tartımlar simetrik olarak yerleştirilecektir (örnek resimde olduğu gibi), sıralı bir sıraya göre değil. Tartımlar, uygun olduğu hallerde sınırları paylaşacaktır:

Test senaryoları:

Tüm ağırlıkları test senaryoları olarak da kullanabilirsiniz.

   __
 _|__|_
|______|
|      |
|______|
1 + 2 + 5 = 8

 ____________________
|                    |
|____________________|
   |              |
   |______________|
        _|__|_
       |______|
       |      |
       |______|          
20 + 10 + 1 + 2 + 5 = 38 

 ______
|______|
|______|
|______|
|______|
2 + 2 + 2 + 2 = 8

Ek kurallar:

  • Sen olabilir değil ek lider boşluk varsayalım. En büyük ağırlık tamamen sola doğru olacaktır.
  • Sondaki boşlukları ve yeni satırları varsayabilirsiniz.
  • En fazla 10 ağırlık olacağını varsayabilirsiniz.
  • Girdiyi isteğe bağlı bir biçimde alabilir, ancak başka bir şey tarafından kullanılan karakterlerin yerine geçemezsiniz

Bu yani her dilde bayt en kısa kodu kazanır. Açıklamalar her zaman olduğu gibi teşvik edilir.


Buradaki zorluk yazmak için bana ilham bu bir . Herhangi bir ipucu takdir!
tgrass12

Yanıtlar:


7

Jöle ,  24  23 bayt

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

Çevrimiçi deneyin!

Nasıl?

Ağırlıklar, genişlikleri ve yükseklikleri ile tanımlanabilir. Genişlikler, satırın |karakterleri arasındaki mesafeye bakarak ölçülebilir . Önce tüm boşlukları kaldırırsak, o zaman iki yükseklik ağırlığı, ölçülen genişliği bir olan böyle bir çizgiye katkıda bulunacaktır.

Farklı ağırlıklar 3, 7, 7, 15, 21( 1, 2, 5, 10, 20sırasıyla ağırlıklar için) genişliklerine sahiptir . İkilikten dönüştürdüğümüz 1iki boylu için bir iz ekleyerek [3],[7],[7,1],[15,1],[21,1]bunlar 3,7,15,31,43, tamsayı üçe bölmek bize 1,2,5,10,14, 14ihtiyaçların dışında kalan ağırlıklar olan bize verir 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

Alternatif olarak ölçülen genişliği yerine 21ile 30dönüşümden önce kullanılarak “ßœ‘y:

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

4

Python 2 , 77 bayt

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

Çevrimiçi deneyin!

[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]][1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']her bir ağırlığın tabanını, her bir ağırlığın benzersiz bir tek satırlık gösterimini yapmak için kullanılacak olan ağırlığı, uzunluğu ve karakteri temsil eden aşağıdaki üçüzleri üretecektir .
3. ağırlık 2. ile örtüşeceğinden, tabanını gövdesiyle değiştiririm ( _-> ) ve değeri olarak 3düşürürüm (tabanı olarak 2ve gövdeyi sayacak şekilde 3sonuçlanır 5)


4

Retina 0.8.2 , 60 bayt

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

Çevrimiçi deneyin! Açıklama: Eşleştirme kolaylığı için s'ler |s ile değiştirilir !, daha sonra ağırlıklar tekli hale getirilir ve toplanır. Tek ilginç kısım, 5ağırlığın a 2ve bir 3ağırlığın toplamı olduğu düşünülürken , 10ve 20ağırlıkları, ağırlığın sadece iki çizgisidir.



2

Python 3 , 76 bayt

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

Çevrimiçi deneyin!

Nasıl?

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

1

Eminim yapılacak bazı iyileştirmeler var, ama şu anda sahip olduğum şey şu:

Groovy, 131 bayt

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}}

Girdiyi Stringa dönüştürür Collection<String>ve ardından toplamı elde etmek için her satırın sonuçlarını toplar. Bir kullanır Mapanahtar boru karakter arasında boşluk ya da alt sayısıdır ve değeri karşılık gelen Passerees miktardır. Anahtar, çizginin önemli bir kalıpla eşleşip eşleşmediğini belirlemek için normal ifadeye bağlanır. Bir uyarı, borular arasındaki alt dizinin uzunluğunun 6 olduğu ve boşluklardan (alt çizgilerin aksine) oluşması durumunda 1 eklemek için üçlüdir. Herhangi bir desen eşleşmezse, çizginin değeri 0 olur.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.