กองน้ำหนัก


13

ท้าทาย:

คุณจะได้รับภาพ ASCII ของน้ำหนักกองเป็นอินพุตและต้องส่งออกน้ำหนักรวมของกอง

ป้อนคำอธิบายรูปภาพที่นี่

รูปแบบ:

มีน้ำหนักแตกต่างกัน 5 น้ำหนัก1, 2, 5, 10, 20 Passerees (หรือหน่วยอื่นโดยพลการ)

น้ำหนักมีลักษณะดังนี้ตามลำดับ:

1:   __
    |__|

2:   ______
    |______|

5:   ______
    |      |
    |______|

10:  ______________
    |              |
    |______________|

20:  ____________________
    |                    |
    |____________________|

น้ำหนักจะถูกวางแบบสมมาตร (ดังในภาพตัวอย่าง) ไม่จำเป็นต้องเรียงตามลำดับ น้ำหนักจะแบ่งขอบเขตตามความเหมาะสม:

กรณีทดสอบ:

คุณสามารถใช้ตุ้มน้ำหนักเดี่ยวเป็นกรณีทดสอบได้เช่นกัน

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

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

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

กฎเพิ่มเติม:

  • คุณไม่สามารถเว้นวรรคนำหน้าเพิ่มเติมได้ น้ำหนักที่ใหญ่ที่สุดจะไปทางซ้าย
  • คุณอาจสมมติช่องว่างและบรรทัดใหม่
  • คุณอาจคิดว่าจะมีน้ำหนักสูงสุด 10
  • คุณอาจใช้อินพุตในรูปแบบที่เป็นตัวเลือก แต่คุณไม่สามารถแทนที่อักขระที่ใช้โดยอย่างอื่น

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์แต่ละภาษาจะชนะ คำอธิบายได้รับการสนับสนุนเช่นเคย


ความท้าทายของคุณเป็นแรงบันดาลใจให้ผมเขียนคนนี้ เคล็ดลับใด ๆ ที่ชื่นชม!
tgrass12

คำตอบ:


7

เยลลี่ ,  24  23 ไบต์

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

ลองออนไลน์!

อย่างไร?

น้ำหนักอาจระบุได้ตามความกว้างและความสูง ความกว้างอาจวัดได้โดยดูที่ระยะห่างระหว่าง|อักขระของบรรทัด หากเราลบช่องว่างทั้งหมดออกก่อนจากนั้นน้ำหนักความสูงทั้งสองจะมีส่วนร่วมกับเส้นที่มีความกว้างที่วัดได้ของหนึ่ง

น้ำหนักต่างกันมีความกว้างเท่ากับ3, 7, 7, 15, 21(สำหรับน้ำหนัก1, 2, 5, 10, 20ตามลำดับ) เพิ่มต่อท้าย1สำหรับผู้ที่มีความสูงของสองเราพบ[3],[7],[7,1],[15,1],[21,1]การแปลงจากไบนารีเหล่านี้เป็น3,7,15,31,43จำนวนเต็มหารด้วยสามช่วยให้เรา1,2,5,10,14ซึ่งเป็นน้ำหนักยกเว้นความต้องการแทนที่โดย1420

ḟ⁶Ỵẹ€”|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

หรือเปลี่ยนความกว้างที่วัดได้21ด้วย30ก่อนการแปลงโดยใช้“ßœ‘y:

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

4

Python 2 , 77 ไบต์

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

ลองออนไลน์!

[i/21, i%21, ' _'[i<50] for i in [23,48,69,224,440]]จะสร้าง triplets ต่อไปนี้[1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']ซึ่งแสดงถึงน้ำหนักความยาวและอักขระในฐานของน้ำหนักแต่ละอันซึ่งจะถูกใช้เพื่อสร้างการแสดงเดี่ยวบรรทัดที่เป็นเอกลักษณ์ของแต่ละน้ำหนัก
เนื่องจากน้ำหนักที่ 3 จะทับซ้อนกับส่วนที่ 2 ฉันแทนที่มันด้วยฐานของมัน ( _-> ) และลดค่าเป็น3(มันจะนับฐานเป็น2และร่างกายตามที่3เกิดขึ้น5)


4

เรติน่า 0.8.2 , 60 ไบต์

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

ลองออนไลน์! คำอธิบาย: |s ถูกแทนที่ด้วย!s เพื่อความสะดวกในการจับคู่จากนั้นน้ำหนักจะถูกแปลงเป็น unary และยอดรวม ส่วนที่น่าสนใจเพียงอย่างเดียวคือ5น้ำหนักนั้นถือเป็นผลรวมของ a 2และ3น้ำหนักในขณะที่10และ20น้ำหนักนั้นมีน้ำหนักเพียงครึ่งเส้น



2

Python 3 , 76 ไบต์

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

ลองออนไลน์!

อย่างไร?

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

ฉันแน่ใจว่ามีการปรับปรุงบางอย่างที่จะทำ แต่นี่คือสิ่งที่ฉันมีในขณะนี้:

Groovy ขนาด 131 ไบต์

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

แปลงอินพุตStringให้เป็น a Collection<String>จากนั้นจะรวมผลลัพธ์สำหรับแต่ละบรรทัดเพื่อให้ได้ผลรวม ใช้Mapตำแหน่งที่คีย์คือจำนวนของช่องว่างหรือขีดล่างระหว่างอักขระไปป์และค่าคือจำนวน Passerees ที่สอดคล้องกัน คีย์ถูกเสียบเข้ากับ regex เพื่อตรวจสอบว่าบรรทัดตรงกับรูปแบบที่สำคัญหรือไม่ หนึ่ง caveat เป็นประกอบไปด้วยเพื่อเพิ่ม 1 ในกรณีที่ความยาวของสตริงย่อยระหว่างท่อคือ 6 และประกอบด้วยช่องว่าง (ตรงข้ามกับขีดล่าง) หากไม่มีรูปแบบที่ตรงกันบรรทัดจะมีค่าเป็น 0


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.