Nethackの巻物の自動価格識別


21

ああ神々!Doorknobでここから離れることはできません!どこでもネットハックになります!- 前から1dによってGeobits

失望することはできませんでした...

前書き

(説明を気にしない場合や、タブ爆発症候群がある場合は、このセクションをスキップできます)

Nethack(およびRogue、および同じローグライクジャンルの同様のゲーム)の特徴的なメカニズムの1つは、その識別システムです。ゲームの開始時には、開始インベントリ内のアイテムのみが「正式に識別されます」。他のオブジェクトの大部分は未知から始まります。たとえば、「反射の盾」は、識別される前に「研磨された銀の盾」として最初に表示されます。

「磨かれた銀色の盾」は反射の盾にしかなれませんが、これは他の2つの場合に興味深い結果をもたらします。

  1. 一部のアイテムは互いに異なりますが、同じ「外観」を持っています。あなたが見つけた場合、「たとえば、灰色の石を、」それは4つの物事のいずれかになります。フリントストーン(役に立たない)、試金石(便利です)、LOADSTONEはそれはトンの重量を量ると、あなたので、(深刻なあなたを妨げなります落とすことはできません)、または幸運の石(非常に役立つ、ゲームに勝つためにほとんど必要)。

  2. 多くのアイテム(スクロール、杖、指輪、魔法書、鎧など)の外観はランダム化されています。これが意味することは、ポーションが持つ可能性のある可能性のある外観のセットリストがあることです。たとえば、[ 黄金のポーション渦巻きポーション発泡性のポーション赤紫色のポーションなど]。これらの外観は、ランダムに彼らが実際に(何であるかに割り当てられている治癒のポーション麻痺のポーション目に見えない参照のポーション多形のポーション、など)。

    つまり、六角形のお守り、あるゲームであなたの命を救うことができ(命を救うお守り)次のゲームであなたを窒息死させることができます(絞殺のお守り)

当然、これによりアイテムの識別がゲームの重要な部分になります。アイテムは「正式に識別される」ことができます。つまり、それらは明確に特定のアイテムとして明確に表示されます(たとえば、見つけた宝石の杖はすべて、モンスターを作成する杖として表示されます)。これは、主に巻物または特定の魔法書によって行われます。しかし、通常、それらは不足しています。

非公式の識別。これは、特定の特定されていないアイテムが特定のタイプであること(または複数のタイプのうちの1つにしかなれないこと)はかなり確実(または確実)であることを意味します。これはいくつかの方法で行うことができます:ワンドの彫刻テスト、リングのシンクテスト、または最も一般的な方法...

スクロール価格IDチャート

... 価格の確認!これがこの課題の目的です。

一言で言えば、Dungeons of Doomの至るところにショップがあります(そう、店主は地下ダンジョンに店を構えるのは良い考えだと思ったので、理由を聞かないでください)。これらのショップでは、旅行中に出くわすさまざまなアイテムを売買できます。アイテムを購入または販売するとき、店主は最初にあなたにどれだけあなたにそれを売る/あなたからそれを購入するかを教えてくれます。特定のアイテムには特定の価格が保証されているため、これを使用して特定のタイプのアイテムを非公式に識別することができます。

巻物などの一部のアイテムは、特定の金額がかかる唯一のアイテムです。これにより、明確に識別することができます。ただし、ほとんどのアイテムは同じクラスの他のアイテムと価格グループを共有しているため、可能性を絞り込むことしかできません(これは依然として有用です)。ただし、アイテムの売買価格は、多くの変数(Charisma統計など)の影響を受けます。したがって、上記のチャート。

Nethackが好きだと言えますか?

入力

入力は、現在プレイされているNethackゲーム(バニラ、3.4.3)として提供されます。

"For you, most gracious sir; only 177 for this scroll labeled VERR YED HORRE."
--More--

        ------------
        |          .                                        ---------
        |          |                         ----------     |    ^  |
        |          .##       ################.        +#   #.       .#
        |          | #                       |       _|#   #---------#
        |          | ###                   ##.<       |#   ####      #
        |          .#########################----------#      #      #
        ------------   ###     #         ############# #      #      #
           #             #  -----------  #             #      #   ####
         ###             ###|         |###             #      #   #----------
         #                 #.         |#             ### #    #   #|.???????|
        ##                  |         |#             #--------#   #|.??@????|
    ----.----###############.         |#             #|      |#   #-@???????|
    |.......+#              |         |#             #.      |#    ----------
    |.......|               |         .#              |      |#
    |......>|               -----------               |      +#
    ---------                                         --------


Wizard the Evoker         St:12 Dx:14 Co:11 In:16 Wi:12 Ch:10  Chaotic
Dlvl:2  $:0  HP:11(11) Pw:0(8) AC:9  Exp:1 T:11

これは、いくつかのプロパティが保証されていることを意味します。

  • それはなります常に長い24行あること。

  • 各行の長さは常に 80文字以下です。

  • 最後から2番目の行は、次の「トークン」で構成されます。プレーヤーの名前とタイトル(「foo the bar」の形式)、属性のリスト(単一のスペースで区切られた)、およびプレーヤーの配置(合法的、中立、または無秩序)。各トークンは、可変数のスペースで区切られます。1

  • 属性のリストは常にですSt:* Dx:* Co:* In:* Wi:* Ch:*。ここで、*文字は3〜25の整数を表します。2(ここで重要なのは、価格を計算するために必要な最後の統計、Charismaです)。

  • 最初の行は、常にショップ関連のメッセージ(具体的には、アイテムを売買するときに表示されるメッセージ)で構成されます。さらに、このアイテムは、単一の正体不明の名前のないスクロールであることが保証されています。アイテムを購入する場合、これは次のとおりです。

    "For you, {TITLE}; only {PRICE} for this scroll labeled {LABEL}."--More--
    

    そして、販売のために、それは次のとおりです。

    {SHK} offers {PRICE} gold pieces for your scroll labeled {LABEL}.  Sell it? [ynaq] (y)
    

    ここにリストされて{curly braces}いる「変数」は次のとおりです。

    • {TITLE}常に「良い」、「名誉ある」、「最も優雅な」、または「尊敬される」のいずれかであり、「女性」または「サー」のいずれかと連結されています。

    • {PRICE} 常に整数です。

    • {LABEL}常に次のいずれかになります(source):

      ZELGO MER       JUYED AWK YACC  NR 9             XIXAXA XOXAXA XUXAXA
      PRATYAVAYAH     DAIYEN FOOELS   LEP GEX VEN ZEA  PRIRUTSENIE
      ELBIB YLOH      VERR YED HORRE  VENZAR BORGAVVE  THARR
      YUM YUM         KERNOD WEL      ELAM EBOW        DUAM XNAHT
      ANDOVA BEGARIN  KIRJE           VE FORBRYDERNE   HACKEM MUCHE
      VELOX NEB       FOOBIE BLETCH   TEMOV            GARVEN DEH
      READ ME
      
    • {SHK}常に次のいずれかになります(source):

      Skibbereen      Ballingeary     Inishbofin      Annootok        Abitibi
      Kanturk         Kilgarvan       Kesh            Upernavik       Maganasipi
      Rath Luirc      Cahersiveen     Hebiwerie       Angmagssalik    Akureyri
      Ennistymon      Glenbeigh       Possogroenoe    Aklavik         Kopasker
      Lahinch         Kilmihil        Asidonhopo      Inuvik          Budereyri
      Kinnegad        Kiltamagh       Manlobbi        Tuktoyaktuk     Akranes
      Lugnaquillia    Droichead Atha  Adjama          Chicoutimi      Bordeyri
      Enniscorthy     Inniscrone      Pakka Pakka     Ouiatchouane    Holmavik
      Gweebarra       Clonegal        Kabalebo        Chibougamau     Lucrezia
      Kittamagh       Lisnaskea       Wonotobo        Matagami        Dirk
      Nenagh          Culdaff         Akalapi         Kipawa
      Sneem           Dunfanaghy      Sipaliwini      Kinojevis
      

    このメッセージは別の行に分割される場合があります(ただし、2行を超えることはありません)。3

  • 最初の数行を除き、画面の残りの部分についてはすべての賭けがオフになっています。NethackはASCII文字セットの大部分を使用ます。安全に想定できる唯一のことは、入力が純粋にASCIIであるということです(ただし、3行目から22行目は破棄できるため、これはおそらく重要ではありません)。

入力が関数の引数として使用される場合、上記の例に示すとおりに正確に入力されます(改行で区切られます)。STDINを介して入力する場合、24の連続した入力行として与えられます(これも上記のとおりです)。入力の末尾に改行を含めるかどうかを選択できます。入力には、末尾のスペースがないことが保証されています。

出力

出力は#name、価格IDを付けたばかりのスクロールとして提供する必要があります。私が使用している(および他の人が使用しているのを見た)命名システムは次のとおりです。

  • 巻物が特定の巻物として明確に識別されている場合(識別、光、強化武器)、#nameそれ。これは、次の基本価格のスクロールの場合です(基本価格の計算方法は以下で説明します):20->識別、50->ライト、60->エンチャント武器。

  • それ以外の場合は、スクロールの外観の最初の3文字を使用します。3文字未満の場合は最初の単語を使用します。たとえば、にZELGO MERなりZEL、にVE FORBRYDERNEなりますVE。これと連結します(スペース、そして)スクロールの基本価格。たとえば、ELB 300

  • 基本価格が2つの可能性のいずれかである場合、通常、特定の価格帯に明確に配置される提示価格を取得するまで、アイテムの売買を試み続けます。ただし、このチャレンジではそれができないため、2つの可能な基本価格をスラッシュ(/)で区切るだけです。たとえば、HAC 60/80

これは、アイテムの基本価格を購入するために提供される価格に変換するための公式です:

  • アイテムの基本価格から始めます

  • 33%の「正体不明の追加料金」の可能性。 price += price / 3

  • 33%の「サッカーマークアップ」のもう1つのチャンス(これは実際にはランダムなチャンスではありませんが、このチャレンジの目的のためです)、同じ方法で計算されます

  • 次のように適用されるカリスマ修飾子。

    Ch    3-5     6-7       8-10      11-15  16-17     18        19-25
    Mod   +100%   +50%      +33%      +0%    -25%      -33%      -50%
    Code  p *= 2  p += p/2  p += p/3  ---    p -= p/4  p -= p/3  p /= 2
    

そして、ここに基本価格->販売価格の式があります:

  • アイテムの基本価格から始めます

  • これを2または3で割ります(「通常」または「サッカーマークアップ」。それぞれ、ランダムではありませんが、この課題のためです)

  • さらに25%削減の機会4を介して計算price -= price / 4

除算は整数除算です。つまり、各ステップでの結果は切り捨てられます。(出典:wiki、およびソースコード掘り下げ。これらの式を逆にするのはあなたの仕事です。)

最後に、可能性のある購入価格(Charisma statでグループ化)と特定の基本価格を持つスクロールの販売価格を示す便利なASCIIグラフを次に示します。

Base  Ch<6          6-7          8-10         11-15        16-17        18           19-25        Sell
20    40/52/68      30/39/51     26/34/45     20/26/34     15/20/26     14/18/23     10/13/17     5/6/8/10
50    100/132/176   75/99/132    66/88/117    50/66/88     38/50/66     34/44/59     25/33/44     12/16/19/25
60    120/160/212   90/120/159   80/106/141   60/80/106    45/60/80     40/54/71     30/40/53     15/20/23/30
80    160/212/282   120/159/211  106/141/188  80/106/141   60/80/106    54/71/94     40/53/70     20/26/30/40
100   200/266/354   150/199/265  133/177/236  100/133/177  75/100/133   67/89/118    50/66/88     25/33/38/50
200   400/532/708   300/399/531  266/354/472  200/266/354  150/200/266  134/178/236  100/133/177  50/66/75/100
300   600/800/1066  450/600/799  400/533/710  300/400/533  225/300/400  200/267/356  150/200/266  75/100/113/150

(これは、すべての可能な販売価格をリストすることを除いて、ウィキのグラフと同じですが、ウィキグラフは4つの可能な販売価格のうち2つを含めることを無視します。いいえ、手動で作成しませんでした; このRubyスクリプトで生成されました)

テストケース

入力:

"For you, honored sir; only 80 for this scroll labeled LEP GEX VEN ZEA."
--More--                   #                                          #
                      ----------------                              -----
                      |              |              ------------####+   |
      -----           |              -##############+          .#   |   |
      |   .###########|           >  |#           # |          |  ##.   |
      |   |          #------------.---#           ##.          |  # -----
      -+---          ##################             ----.-------###    #
       ####                     ###                     #       #      #
          #                     #                       #     ###      ###
          ###                 ###                       #     #          #
            #                 #                         #   ###     -----|--
       -----.---            ###                     ----+---#       |...@..|
       |       |            #                       |      |#       |???+??|
       |  <    .#          ##                     ##+      |        |+?????|
       |       |#    ------.-------                 |      |        |??]?@?|
       ---------###  |            |                 |      |        --------
            #     #  |            |                 --------
                  ###|            |                       #
                    #+            |
                     --------------

Wizard the Evoker         St:11 Dx:15 Co:9 In:20 Wi:9 Ch:11  Chaotic
Dlvl:7  $:0  HP:11(11) Pw:1(8) AC:9  Exp:1

出力: LEP 60/80


入力:

"For you, most gracious sir; only 80 for this scroll labeled DAIYEN FOOELS."
--More--                                                             #
                ------------                         -----      -------
 -----          |          |                         |   |      |     |
 |!)%|          |          |     ---------------     |   |     #-     |
 |*[@|          |          .#####|   <         |#####.   |   ###|     |
 |?(?|          ---------.--    #+             |#    |   |   #  |     |
 |[!(|                  ##       |             |#    |   +#### #.     .#
 |.@.|         ##################.             +#    ---.-     #|     |#
 ---|-                ###        ---------------#       ##     #-------#
    ##                #                    ######        #     #       #
     #              ###                         #        #     #       #
     ##             #                           #        #     #       #
  ------        #####                           #        #     #       #
  |    |       -.----                           #        #     #       #
  |    .#####  |^   |                        ####        #     #       #
  |    |    #  |    |          ----          #-----------.---- #       #------
  |    |    ###|    |          |  |          #.      >       | #       #|    |
  ------      #.    |          |  |           |              .##       #|    |
               |    |          ----           |              |         #.    |
               ------                         ----------------          ------

Wizard the Evoker         St:11 Dx:14 Co:16 In:15 Wi:10 Ch:9  Chaotic
Dlvl:6  $:0  HP:11(11) Pw:9(9) AC:9  Exp:1

出力: enchant weapon


入力:

Aklavik offers 113 gold pieces for your scroll labeled GARVEN DEH.  Sell it?
[ynaq] (y)

     -----      ------                                 ---------      -------
     |   |      |    |                         #     ##.       |      |.?)%/|
     |   |    ##.    |                       -----   # |       |      |.@!=*|
     |<  |    # |    |            #        ##.   .#####+    >  |#    #-.*?@[|
     |   .##### |    |      ------------   # | { |#    |^      |#    #|.=%)+|
     ---.-      |    |      |          .#### |   |#    ---------##   #-------
       ##       -.----     #.          |     |   |#          # ###   #
       #         ########  #|          .##   |   |#            ##    #
     ###                #  #------------ #   -----#          ####    #
     #                  #######          ##########################  #
     #                    #   #                            ###----.--#
     #                    ### #                            # #|     |#
   --.----       ########################################### #.     |#
   |     |       #----------.-#                               |     |#
   |     |       #|          |#                               -------
   |     |       #|          .#
   |     |########|          |
   -------        ------------
                   #    #
Wizard the Evoker         St:9 Dx:14 Co:11 In:19 Wi:10 Ch:12  Chaotic
Dlvl:4  $:0  HP:11(11) Pw:5(9) AC:9  Exp:1 Satiated

出力: GAR 300


入力:

"For you, good lady; only 67 for this scroll labeled VE FORBRYDERNE."--More--

                                                 -------
                                               ##|     |
  ------------                                 # |     |
  |+[!/!?%[?)|                               ### |     |          --------
  |[)(!/+]?!@|               #               #   |     |        ##+      |
  |.......@..|            --------------   ###   | <   | ##       |      |
  --------+---           #|            |   #     |     |  #       |    > |
          #            ###|            .####     --.----  ###    #-      |
          #            ###.            |           #        #  ###|      |
          #          #### ---.----------           #        ######.      |
          #          ####    ##                    #         ###  --------
          #        ####       #                    #         #
          #        ####       ########################     ###
        ###      ####                            ----+---- #
        #   #    ####                            |       .##
    ----.------####                              |  ^    |
    |         +####                              |    >  |
    |         |                                  | ^     |
    -----------                                  ---------

Wizard the Evoker         St:18 Dx:18 Co:16 In:20 Wi:20 Ch:18  Chaotic
Dlvl:4  $:150 HP:11(11) Pw:5(7) AC:9  Exp:1

出力: VE 100


入力:

Droichead Atha offers 5 gold pieces for your scroll labeled XIXAXA XOXAXA
XUXAXA.  Sell it? [ynaq] (y)
                                                ------------
                   -----                        |          .#
                   |   .### -----------        #.       {  |#
       -----       |   |  # |         |      ###|          |#
       |   .#     #.   |  # |         |      #  ---------+--#
       |   |    ###-|---    |         .##  ###          ##  #
       |   |    #   # #     |         | #  #            #   #
       |   -#####   #       |         | #### ############   #
       |>  | ##     #       ---------+-  ## -.----------    # ----------
       |   .####    ###             ## #####|          |    # |.*??/?)*|
       -----   #      #             #  #    |          |    # |@*)%!)]%|
               ###    ###         ######    |          |    # |.=)!%*!!|
                 #      #         #  #      |          |    ##+@*[%)(%?|
                 #####################      |          |      |.]?*?)%%|
                    -----+---.----##########.          |      |.%)%!!!%|
                    |            +##        ------------      ----------
                    |    <       |                  #
                    |            |
                    --------------

Wizard the Digger          St:11 Dx:9 Co:14 In:6 Wi:6 Ch:9  Lawful
Dlvl:3  $:0  HP:15(15) Pw:0(1) AC:9  Exp:1

出力: identify

(自分の名前にスペースのある店主が見つからなかったため、他の店主名をすべて削除してNethackを手動でコンパイルする必要がありました...)

ルール

  • これはであるため、バイト単位の最短コード勝ちます。

1:これは、Nethackゲームでは必ずしも当てはまるわけではありませんが、単純にするためにこれを想定しています。

2:繰り返しますが、常に真実とは限りません。強度は18/01から18 / **になりますが、それを処理する必要はありません。

3:より大きな単純化。たとえば、店主があなたを「スカム」または「最も有名で神聖な生き物」と呼ぶことは可能ですが、そのいずれも処理する必要はありません。

4:スマートプレーヤーは、より高い価格が与えられるまでアイテムの販売を繰り返し申し出ることで回避します。


15
テキストの聖なる壁!
orlp

回答:


10

Javascript(ES6)、1610 724 601 612 419 405バイト

a=>(b=a.match(/(\d+) (g|f).+d (\w{0,3})[\s\S]+h:(\d+)/m),c=+b[4],d=[20,50,60,80,100,200,300].map(e=>(f=e>>1,g=~~(e/3),[e,b[2]=='g'?[g-(g>>2),g,f-(f>>2),f]:[e,e+g,e+g+~~((e+g)/3)].map(h=>c<6?h*2:c<8?h+h>>1:c<11?h+~~(h/3):c<16?h:c<18?h-(h>>2):c<19?h-~~(h/3):h>>1)])).filter(i=>i[1].includes(+b[1])),j={20:'identify',50:'light',60:'enchant weapon'}[d[0][0]],k=b[3]+' '+d[0][0],d.length==1?j||k:k+'/'+d[1][0])

テキストの大きな壁、コードの大きな壁に会います。

非ゴルフ

inp => (
    extraction = inp.match(/(\d+) (g|f).+d (\w{0,3})[\s\S]+h:(\d+)/m),

    charisma = +extraction[4],

    allowed = [20, 50, 60, 80, 100, 200, 300].map(base => (
        tmp1 = base >> 1,
        tmp2 = ~~(base / 3),
        [
            base,
            extraction[2] == 'g' ?
                [tmp2 - (tmp2 >> 2), tmp2, tmp1 - (tmp1 >> 2), tmp1]
            :
                [base, base + tmp2, base + tmp2 + ~~((base + tmp2) / 3)].map(val =>
                    charisma < 6 ?
                        val * 2
                    : charisma < 8 ?
                        val + val >> 1
                    : charisma < 11 ?
                        val + ~~(val / 3)
                    : charisma < 16 ?
                        val
                    : charisma < 18 ?
                        val - (val >> 2)
                    : charisma < 19 ?
                        val - ~~(val / 3)
                    : val >> 1
            )
        ]
    )).filter(key => key[1].includes(+extraction[1])),

    name_ = {
        20: 'identify',
        50: 'light',
        60: 'enchant weapon'
    }[allowed[0][0]],

    tmp3 = extraction[3] + ' ' + allowed[0][0],

    allowed.length == 1 ?
        name_ || tmp3
    :
        tmp3 + '/' + allowed[1][0]
)


1
これはスクリプトの大きな山です。
15年

1
うわー、誰かが最終的にこれに答えましたか?ニース:D
ドアノブ

@Doorknobしばらくの間これを更新したいと思っていましたが、ようやくそれに回りました。
usandfriends
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.