重さの山


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

オンラインでお試しください!

どうやって?

重みは、幅と高さで識別できます。線の|文字間の距離を調べることで、幅を測定できます。最初にすべてのスペースを削除した場合、高さ2のウェイトは、測定された幅が1のそのような線に影響します。

異なるウェイトの幅は3, 7, 7, 15, 211, 2, 5, 10, 20それぞれウェイトの場合)です。末尾追加1我々は発見高さ2のもののための[3],[7],[7,1],[15,1],[21,1]バイナリこれらから変換している3,7,15,31,43、3で割る整数米国を与える1,2,5,10,14以外の重みである、14により交換が必要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

代わりの測定幅置き換える2130、変換前には、使用して“ßœ‘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]][1, 2, '_'], [2, 6, '_'], [3, 6, ' '], [10, 14, ' '], [20, 20, ' ']、各重量の基部にある重量、長さ、および文字を表す次のトリプレットを生成し、各重量の一意の単一行表現を作成するために使用されます。
3重量は2と重複することになるので、私はそれの体内でそれの塩基を置換(_- > )とに値を減少3(これは、塩基をカウントする2ようにボディ3をもたらします5


4

Retina 0.8.2、60バイト

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

オンラインでお試しください!説明:マッチングを容易にするために|sがsに置き換えられ!、次に重みが単項に変換されて合計されます。唯一の興味深い部分は、5ウェイトがa 23ウェイトの合計であると見なされるのに対して1020ウェイトとウェイトはウェイトの半分の2行だけであるということです。



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ここで、キーはパイプ文字間のスペースまたはアンダースコアの数であり、値は対応する合格者数です。キーが正規表現にプラグインされて、行が重要なパターンに一致するかどうかが判断されます。1つの注意点は、パイプ間の部分文字列の長さが6で、スペース(アンダースコアではなく)で構成される場合に1を追加する3項です。一致するパターンがない場合、行の値は0です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.