Автоматична ідентифікація цін на сувої в Nethack


21

О, БОГИ НІ !! Ви не можете залишити нас тут з Дорнобом! Це буде скрізь сіткою! - 1d тому від Geobits

Ну, не міг розчарувати ...

Вступ

(ви можете пропустити цей розділ, якщо вам не важливо експозицію та / або якщо у вас є синдром вибухової вибухи )

Однією з характерних механіки Нетхака (і Rogue, і подібних ігор в одному і тому ж жанровій схожій жанрі) є його система ідентифікації . На початку гри "формально ідентифікуються" лише предмети у вашому початковому інвентарі. Переважна більшість інших об'єктів починаються невідомими; наприклад, "щит відображення" спочатку відображатиметься як "полірований сріблястий щит", перш ніж його ідентифікують.

"Полірований срібний щит" може бути лише щитом відображення , але це має цікаві наслідки у двох інших випадках.

  1. Деякі предмети відрізняються один від одного, але мають однаковий «зовнішній вигляд». Наприклад, якщо ви знайдете " сірий камінь ", це може бути одна з чотирьох речей: крем'яний камінь (непотрібний), сенсорний камінь (може бути корисним), вантажний камінь (який сильно обтяжить вас, тому що важить вагу тонни, і ви не може кинути його), або вдача (надзвичайно корисна, майже необхідна для перемоги в грі).

  2. Багато предметів (сувої, палички, каблучки, книги-орфограми, деякі броні тощо) мають рандомізований вигляд. Це означає, що існує набір переліку можливих проявів, скажімо, зілля; наприклад, [ золоте зілля , закручене зілля , неміцне зілля , фіолетово-червоне зілля тощо]. Ці прояви потім випадковим чином присвоюються тим, що вони є насправді ( зілля зцілення , зілля від паралічу , зілля бачити невидиме , зілля з поліморфу тощо).

    Що означає, що шестикутний амулет міг врятувати ваше життя в одній грі (амулет рятівного життя) , а наступну задушити вас (амулет задухи) .

Природно, це робить ідентифікацію предметів критичною частиною гри. Елементи можуть бути "формально ідентифіковані", це означає, що вони однозначно відображатимуться як певний предмет (наприклад, всі коштовні палички, які ви знайдете, відображатимуться як палички створення монстра ); це робиться в основному за допомогою сувої або книги орфографії ідентифікації. Зазвичай їх не вистачає, але це призводить нас до ...

Неформальна ідентифікація. Це означає, що ви майже впевнені (або певні), що певний невстановлений предмет певного типу (або що він може бути лише одним із декількох типів), але ви його ще "формально" не визначили. Це можна зробити за допомогою декількох методів: гравірування-тестування на палички, тестування раковини на кільцях або, найпоширеніший метод ...

прокрутка ID діаграми ціни

... ідентифікація ціни ! У чому полягає ця проблема.

Коротше кажучи, є магазини, розташовані по всій Підземеллях Сунь (так, крамарі думали, що було б гарною ідеєю встановити магазин у підземній підземеллі; не запитуйте чому). У цих магазинах ви можете купувати та продавати різні предмети, на які ви потрапляєте під час подорожей. Купуючи чи продаючи предмет, кравець спочатку скаже вам, за скільки він би продав його вам / купив у вас. Оскільки на певні товари гарантується конкретна ціна , ви можете використовувати цю інформацію для неофіційного визначення певного виду товару.

Деякі предмети, такі як прокручування світла , є єдиними предметами, які коштують певну суму, що дозволяє однозначно їх ідентифікувати; Однак більшість товарів поділяють цінову групу з іншими товарами того ж класу, що лише дозволяє звузити можливості (що все-таки корисно). Тим НЕ менше, ціни на покупку / продаж з пункту залежать від цілого ряду змінних (таких , як ваш Charisma стат). Звідси діаграма вище.

Не могли б ви сказати, що мені подобається 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 (Тут цікавою є остання статистика, Харизма, на яку потрібно обчислити ціни.)

  • Перший рядок завжди міститиме повідомлення, пов’язане з магазином (зокрема, повідомлення, яке відображається під час покупки чи продажу товару). Крім того, цей предмет гарантовано буде одним, невстановленим, неназваним прокруткою. Для придбання предмета це:

    "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
      

    Це повідомлення може бути розділено на інший рядок (але воно не займе більше двох рядків). 3

  • Окрім перших кількох рядків, усі ставки відключені, як виглядає решта екрана. Nethack використовує більшість наборів символів ASCII . Єдине, що ви можете сміливо припустити, це те, що вхід буде суто ASCII (однак це, мабуть, не має значення, оскільки ви все одно можете відкинути лінії 3-22).

Якщо вхід приймається як аргумент функції, він буде заданий точно так, як показано в прикладі вище (розділений новий рядок). Якщо ви вводите через STDIN, він буде вказаний у вигляді 24 послідовних рядків введення (знову, як показано вище). Ви можете вибрати, хочете ви, щоб вхід мав зворотний новий рядок чи ні. На вході гарантується відсутність пробілів.

Вихідні дані

Вихід повинен бути наданий як те, що я повинен #nameпрокручувати, що я просто цінував ID. Система імен, яку я використовую (і яку я бачив, як інші використовують), це:

  • Якщо сувій однозначно ідентифікується як певний сувій (ідентифікація, легка, чарівна зброя), #nameце що. Це стосується сувої наступних базових цін (ви побачите, як розрахувати базову ціну нижче): 20 -> визначити, 50 -> легка, 60 -> чарівна зброя.

  • В іншому випадку візьміть перші три літери зовнішності прокрутки або перше слово, якщо воно менше трьох символів. Наприклад, ZELGO MERстає ZEL, VE 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 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

(Це ідентично графіку на wiki, за винятком того, що в ньому перераховані всі можливі ціни продажу, тоді як вікі-графік нехтує включенням двох з чотирьох можливих цін продажу. Ні, я не вручну склав цю діаграму; генерується за допомогою цього сценарію 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
Це одна велика купа сценарію.
Фаталізувати

1
Вау, хтось нарешті відповів на це? Ніцца: D
Дверна ручка

@Doorknob Бажаючи оновити це на деякий час, нарешті обійшов його.
usandfriends
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.