Identifikasi harga otomatis gulungan di Nethack

21

OH ALLAH TIDAK !! Anda tidak dapat meninggalkan kami di sini dengan Gagang Pintu! Itu akan tetap di mana-mana! - 1 hari yang lalu oleh Geobits

Yah, tidak bisa mengecewakan ...

pengantar

(Anda dapat melewati bagian ini jika Anda tidak peduli tentang eksposisi dan / atau jika Anda memiliki Tab Explosion Syndrome )

Salah satu mekanisme karakteristik Nethack (dan Rogue, dan game serupa dalam genre roguelike yang sama) adalah sistem identifikasi . Di awal permainan, hanya item dalam inventaris awal Anda yang "diidentifikasi secara formal." Sebagian besar objek lain mulai tidak diketahui; misalnya, "perisai refleksi" pada awalnya akan ditampilkan sebagai "perisai perak yang dipoles" sebelum diidentifikasi.

"Perisai perak yang dipoles" hanya bisa menjadi perisai refleksi , tetapi ini memiliki konsekuensi yang menarik dalam dua kasus lainnya.

  1. Beberapa item berbeda satu sama lain, tetapi memiliki "penampilan" yang sama. Misalnya, jika Anda menemukan " batu abu-abu ," itu bisa menjadi salah satu dari empat hal: batu batu (tidak berguna), batu ujian (dapat berguna), batu beban (yang akan sangat membebani Anda karena beratnya satu ton dan Anda tidak bisa menjatuhkannya), atau batu keberuntungan (sangat membantu, hampir diperlukan untuk memenangkan permainan).

  2. Banyak item (gulungan, tongkat, cincin, buku mantra, beberapa baju besi, dll.) Memiliki penampilan acak. Artinya, ada daftar kemungkinan penampilan, katakanlah, ramuan bisa; misalnya, [ ramuan emas , ramuan berputar , ramuan bersoda , ramuan ungu-merah , dll]. Penampilan ini kemudian secara acak ditugaskan untuk apa mereka sebenarnya ( ramuan penyembuhan , ramuan kelumpuhan , ramuan lihat tak terlihat , ramuan polimorf , dll.).

    Yang berarti bahwa jimat heksagonal dapat menyelamatkan hidup Anda dalam satu permainan (jimat menyelamatkan hidup) , dan mencekik Anda sampai mati berikutnya (jimat pencekikan) .

Tentu saja, ini membuat mengidentifikasi item menjadi bagian penting dari permainan. Item dapat "diidentifikasi secara formal," yang berarti bahwa mereka akan muncul dengan jelas sebagai item tertentu (mis. Semua tongkat permata yang Anda temukan akan muncul sebagai tongkat monster ); ini dilakukan terutama melalui gulungan atau buku mantra mengidentifikasi. Biasanya mereka dalam pasokan pendek, yang membawa kita ke ...

Identifikasi informal. Ini berarti bahwa Anda cukup yakin (atau pasti) bahwa item tertentu yang tidak dikenal dari jenis tertentu (atau itu hanya dapat menjadi salah satu dari beberapa jenis), tetapi Anda belum "secara formal" mengidentifikasinya. Ini dapat dilakukan melalui beberapa metode: mengukir-pengujian untuk tongkat, menguji-tenggelam untuk cincin, atau, metode yang paling umum ...

gulir grafik ID harga

... identifikasi harga ! Itulah tantangannya.

Singkatnya, ada toko - toko yang berlokasi di seluruh Dungeons of Doom (ya, para pemilik toko berpikir itu akan menjadi ide yang baik untuk mendirikan toko di beberapa penjara bawah tanah; jangan bertanya mengapa). Di toko-toko ini, Anda dapat membeli dan menjual berbagai barang yang Anda temui selama perjalanan. Ketika membeli atau menjual suatu barang, penjaga toko akan memberi tahu Anda berapa banyak dia akan menjualnya kepada Anda / membelinya untuk Anda. Karena barang tertentu dijamin memiliki harga tertentu , Anda dapat menggunakannya untuk mengidentifikasi jenis barang tertentu secara tidak resmi .

Beberapa item, seperti gulungan cahaya , adalah satu-satunya item yang berharga dalam jumlah tertentu, yang memungkinkan Anda untuk mengidentifikasinya secara jelas; Namun, sebagian besar item berbagi grup harga dengan item lain dari kelas yang sama, yang hanya memungkinkan Anda mempersempit kemungkinan (yang masih berguna). Namun, harga beli / jual suatu barang dipengaruhi oleh sejumlah variabel (seperti Karisma Anda stat ). Oleh karena itu bagan di atas.

Bisakah Anda memberi tahu saya suka Nethack?

Memasukkan

Input akan diberikan sebagai (vanilla, 3.4.3) game Nethack yang saat ini dimainkan:

"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

Ini berarti dijamin memiliki beberapa properti:

  • Panjangnya akan selalu 24 baris.

  • Setiap baris akan selalu panjangnya 80 karakter atau kurang.

  • Baris kedua hingga terakhir akan terdiri dari " token " berikut : nama dan judul pemain (dalam bentuk " foo the bar "), daftar atribut (dipisahkan oleh satu spasi), dan penyelarasan pemain ( Sah, Netral, atau Kacau). Setiap token akan dipisahkan oleh jumlah spasi variabel. 1

  • Daftar atribut akan selalu ada St:* Dx:* Co:* In:* Wi:* Ch:*, di mana *karakter mewakili bilangan bulat dari 3 hingga 25. 2 (Poin yang menarik di sini adalah stat terakhir, Karisma, yang Anda perlukan untuk menghitung harga.)

  • Baris pertama akan selalu terdiri dari pesan yang terkait dengan toko (khususnya, pesan yang ditampilkan saat Anda membeli atau menjual suatu barang). Selanjutnya, item ini dijamin menjadi satu, gulir yang tidak dikenal, tidak disebutkan namanya. Untuk membeli barang, ini adalah:

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

    dan untuk penjualan, itu adalah:

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

    di mana "variabel" yang tercantum di {curly braces}adalah sebagai berikut:

    • {TITLE}selalu merupakan salah satu dari " baik ", " terhormat ", " paling ramah ", atau " terhormat ", disatukan dengan " nyonya " atau " tuan ".

    • {PRICE} selalu merupakan bilangan bulat.

    • {LABEL}akan selalu menjadi salah satu dari yang berikut ( sumber ):

      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}akan selalu menjadi salah satu dari yang berikut ( sumber ):

      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
      

    Pesan ini dapat dibagi ke baris lain (tetapi tidak akan pernah mengambil lebih dari 2 baris). 3

  • Selain dari beberapa baris pertama, semua taruhan dimatikan seperti apa tampilan layar lainnya. Nethack menggunakan sebagian besar rangkaian karakter ASCII . Satu-satunya hal yang dapat Anda asumsikan dengan aman adalah bahwa inputnya akan murni ASCII (namun ini mungkin tidak masalah karena Anda dapat membuang baris 3-22).

Jika input diambil sebagai argumen fungsi, itu akan diberikan persis seperti yang ditunjukkan pada contoh di atas (baris baru dipisahkan). Jika Anda memasukkan melalui STDIN, itu akan diberikan sebagai 24 jalur input berturut-turut (sekali lagi, seperti yang ditunjukkan di atas). Anda dapat memilih apakah Anda ingin input memiliki baris tambahan atau tidak. Input dijamin tidak memiliki spasi tambahan.

Keluaran

Keluaran harus disediakan seperti apa yang seharusnya saya #namegulir bahwa saya hanya harga-ID'd. Sistem penamaan yang saya gunakan (dan yang telah saya lihat orang lain gunakan) adalah:

  • Jika gulir secara jelas diidentifikasi sebagai gulir tertentu (identifikasi, cahaya, senjata mempesona), #namemaka itu. Ini adalah kasus untuk gulungan dari harga dasar berikut (Anda akan melihat bagaimana menghitung harga dasar di bawah): 20 -> mengidentifikasi, 50 -> cahaya, 60 -> senjata mempesona.

  • Kalau tidak, ambil tiga huruf pertama dari tampilan gulir, atau kata pertama jika kurang dari 3 karakter. Misalnya, ZELGO MERmenjadi ZEL, VE FORBRYDERNEmenjadi VE, dll. Bersambung dengan ini (spasi, dan kemudian) harga dasar gulir. Sebagai contoh ELB 300,.

  • Jika harga dasar bisa menjadi salah satu dari dua kemungkinan, saya biasanya terus berusaha membeli atau menjual barang sampai saya mendapatkan harga yang ditawarkan yang dengan jelas menempatkannya dalam slot harga tertentu. Namun, Anda tidak dapat melakukan itu dalam tantangan ini, jadi pisahkan saja dua harga dasar yang mungkin dengan garis miring ( /). Sebagai contoh HAC 60/80,.

Inilah rumus untuk mengubah harga dasar suatu barang menjadi harga yang Anda tawarkan untuk membelinya:

  • mulai dengan harga dasar barang

  • kemungkinan 33% "biaya tambahan tidak dikenal," dihitung melalui price += price / 3

  • kesempatan lain dari 33% "pengisap markup" (ini sebenarnya bukan kesempatan acak, tetapi untuk keperluan tantangan ini), dihitung dengan cara yang sama

  • pengubah karisma, yang diterapkan sebagai berikut:

    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
    

Dan inilah rumus untuk harga dasar -> harga jual:

  • mulai dengan harga dasar barang

  • bagi ini dengan 2 atau 3 ("normal" atau "pengisap markup" masing-masing; sekali lagi, tidak acak, tetapi untuk keperluan tantangan ini)

  • peluang pengurangan 25% lebih lanjut 4 , dihitung melaluiprice -= price / 4

Divisi adalah divisi integer, yang berarti hasil pada setiap langkah dibulatkan ke bawah. (Sumber: wiki , dan sedikit penggalian kode sumber. Membalik formula ini adalah pekerjaan Anda.)

Akhirnya, inilah grafik ASCII yang berguna yang menunjukkan kemungkinan harga beli (dikelompokkan berdasarkan status Charisma) dan menjual harga sebuah gulungan dengan harga dasar tertentu:

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

(Ini identik dengan bagan pada wiki kecuali bahwa itu mencantumkan semua kemungkinan harga jual, sementara bagan wiki lalai memasukkan dua dari empat harga jual yang mungkin. Tidak, saya tidak secara manual membuat bagan itu; dihasilkan dengan skrip Ruby ini .)

Uji kasus

Memasukkan:

"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

Keluaran: LEP 60/80


Memasukkan:

"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

Keluaran: enchant weapon


Memasukkan:

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

Keluaran: GAR 300


Memasukkan:

"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

Keluaran: VE 100


Memasukkan:

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

Keluaran: identify

(Saya harus secara manual mengkompilasi Nethack dengan semua nama penjaga toko lainnya dihapus karena saya tidak dapat menemukan penjaga toko yang memiliki ruang dalam namanya ...)

Aturan

  • Ini adalah , jadi kode terpendek dalam byte akan naik menang.

1: ini tidak selalu benar selama permainan Nethack, tapi kami menganggap ini demi kesederhanaan.

2: sekali lagi, tidak selalu benar. Kekuatan bisa 18/01 hingga 18 / **, tetapi Anda tidak perlu mengatasinya.

3: penyederhanaan yang lebih banyak. Sebagai contoh, adalah mungkin bagi seorang penjaga toko untuk memanggil Anda "buih" atau "makhluk paling terkenal dan sakral," tetapi Anda tidak harus menangani semua itu.

4: dimana seorang pemain pintar berkeliling dengan berulang kali menawarkan untuk menjual barang sampai diberi harga yang lebih tinggi.

Gagang pintu
sumber
15
Dinding teks yang suci!
orlp

Jawaban:

10

Javascript (ES6), 1610 724 601 612 419 405 byte

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])

Tembok besar teks, bertemu tembok besar kode.

Tidak disatukan

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]
)

Contoh

kita dan teman
sumber
1
Itu adalah setumpuk naskah.
Fatalkan
1
Woah, seseorang akhirnya menjawab ini? Nice: D
Doorknob
@Doorknob Ingin memperbarui ini untuk sementara waktu, akhirnya berhasil.
usandfriends