Nethack中卷轴的自动价格识别


21

哦,天哪!!你不能把我们和门把手一起留在这里!到处都是nethack!- :1天前通过Geobits

好吧,不能令人失望...

介绍

(如果您不关心博览会和/或患有Tab爆炸综合症,则可以跳过本节)

Nethack(和Rogue以及同一个roguelike类型的类似游戏)的特征机制之一就是其识别系统。在游戏开始时,只会“正式识别”起始库存中的项目。绝大多数其他物体始于未知。例如,在被识别之前,“反射盾”将最初显示为“抛光银盾”。

“抛光的银盾”只能是反射,但这在另外两种情况下会产生有趣的结果。

  1. 某些项目互不相同,但是具有相同的“外观”。例如,如果您找到“ 灰色石头 ”,则可能是以下四件事之一:火石(无用),试金石(可能有用),负载石(会重担,因为它重达一吨,而您不能丢掉它)或运气石(极其有用,这对于赢得比赛几乎是必需的)。

  2. 许多物品(卷轴,魔杖,戒指,咒语书,一些装甲等)具有随机外观。这意味着存在一系列可能出现的外观,例如,药水可能具有的列表;例如,[ 金色药水涡旋药水泡沫腾腾的药水紫红色药水等]。这些外观,然后随机分配到他们其实都是(治疗药水瘫痪的药水看到隐形药水多晶型的药水等)。

    这意味着六角形护身符可以在一场游戏中拯救您的生命(挽救生命的护身符),而在下一场游戏中将您窒息杀死(扼杀护身符)

自然地,这使得识别物品成为游戏的关键部分。物品可以被“正式识别”,这意味着它们将明确地显示为一定物品(例如,您发现的所有镶有珠宝的魔杖都将显示为创造怪物的魔杖);这主要是通过标识咒语书来完成的。通常情况下,这些都供不应求,这使我们...

非正式鉴定。这意味着您非常确定(或确定)某个未识别的项目属于某种类型(或只能是几种类型之一),但尚未“正式”识别它。这可以通过几种方法完成:对棒进行雕刻测试,对戒指进行下沉测试,或者最常用的方法...

滚动价格ID图表

... 价格识别!这个挑战是关于什么的。

简而言之,在《毁灭的地下城》中遍布商店(是的,店主们认为在地下地下城中建立商店是个好主意;不要问为什么)。在这些商店里,您可以买卖旅行中遇到的各种物品。在购买或出售商品时,店主会首先告诉您他将多少商品出售给您/从您那里购买。由于某些商品保证有特定的价格,因此您可以使用它来非正式地标识某种商品。

某些物品,例如光轴滚动条,是唯一花费一定金额的物品,使您可以明确地标识它们。但是,大多数商品与其他同类商品共享一个价格组,这只能让您缩小可能性范围(这仍然很有用)。但是,一件商品的买/卖价格受许多变量(例如您的魅力统计)的影响。因此,上面的图表。

你能告诉我我喜欢Nethack吗?

输入项

输入将作为当前正在玩的(原始版本3.4.3)Nethack游戏提供:

"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个字符。

  • 倒数第二行将由以下“ 标记 ”组成:玩家的名称和标题(以“ 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}将始终是以下之一():

      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}将始终是以下之一():

      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我刚刚标价的滚动条的内容。我使用的命名系统(我已经看到其他人使用过)是:

  • 如果将卷轴明确地标识为某个卷轴(标识,轻型,附魔武器),则为该卷轴#name。以下基本价格的滚动条就是这种情况(您将在下面看到如何计算基本价格):20->确定,50->轻,60->附魔武器。

  • 否则,请使用滚动条外观的前三个字母,如果少于3个字符,则使用第一个单词。例如,ZELGO MER变为ZELVE FORBRYDERNE变为VE等等。与此并置(一个空格,然后是)滚动的基本价格。例如,ELB 300

  • 如果基本价格可能是两种可能性之一,那么我通常会一直尝试购买或出售该物品,直到获得一个可以明确地将其放入某个价格槽的报价为止。但是,您无法在此挑战中做到这一点,因此只需用斜杠(/)分隔两个可能的基本价格。例如,HAC 60/80

以下是将商品的基本价格转换为您提供的购买价格的公式:

  • 从项目的基本价格开始

  • 通过以下方式计算得出的可能性为33%的“不确定的附加费” price += price / 3

  • 以相同的方式计算得出33%的“吮吸者加价”的机会(实际上这不是随机机会,但就本挑战而言,是)

  • 一种魅力修饰符,其应用如下:

    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和一些源代码挖掘。颠倒这些公式是您的工作。)

最后,这是一个方便的ASCII图表,显示了具有一定基本价格的滚动条的可能的购买价格(按Charisma stat分组):

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

(这是相同的,只是它列出了所有可以卖的价格维基图表,而维基图表忽略包括两个四个可能的卖出价格不,我没有手动作出这样的图表;与产生此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,因为我找不到一个名字上有空格的店主...)

规则

  • 这是,因此以字节为单位的最短代码将递增 win。

1:在Nethack游戏中不一定总是如此,但是为了简单起见,我们假定这样做。

2:同样,并非总是如此。强度可以从18/01到18 / **,但是您不需要处理。

3:更多的过度简化。例如,店主可以称您为“浮渣”或“最著名和最神圣的生物”,但您不必处理任何此类事情。

4:聪明的玩家通过反复提供要出售的物品直到获得更高的价格来解决这个问题。


15
文字圣墙!
orlp

Answers:


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
那是一大堆脚本。
致命

1
哇,有人终于回答了这个问题?尼斯:D
门把手

@Doorknob想要更新一段时间,终于解决了。
usandfriends
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.