计算机游戏NetHack起源于1987年,当时在计算机游戏中广泛使用图形。游戏中有很多怪物,而且可能需要同时在屏幕上放很多东西,所以怪物是以极小的方式画出来的:一个怪物只是在屏幕上画一个ASCII角色。
除了有很多怪物,还有很多类型的怪物。重要的是要知道哪个是哪个,当你看到一只小猫和一条龙时,你的反应可能会有所不同。因此,ASCII的大部分用于表示怪物;例如,一只小猫是f,而红色的龙是D。这意味着,它可以非常有帮助地知道一个给定的怪物将是什么样子,因为它将帮助你认识它,如果你遇到它在稍后的游戏。(请注意,怪物的种类多于ASCII字符,因此其中一些字符是共享的;红龙和蓝龙都是D。)
您的程序必须以NetHack怪物的名称作为输入,并生成游戏中表示它的ASCII字符作为输出。允许程序假定输入实际上是NetHack怪物的名称;如果它希望崩溃,如果输入无效,它可能产生毫无意义的结果等等。
下面的Stack代码段是一个JSON对象,它将可能的输入完全映射到相应的输出:
{
"Aleax": "A",
"Angel": "A",
"Arch Priest": "@",
"Archon": "A",
"Ashikaga Takauji": "@",
"Asmodeus": "&",
"Baalzebub": "&",
"Chromatic Dragon": "D",
"Croesus": "@",
"Cyclops": "H",
"Dark One": "@",
"Death": "&",
"Demogorgon": "&",
"Dispater": "&",
"Elvenking": "@",
"Famine": "&",
"Geryon": "&",
"Grand Master": "@",
"Green-elf": "@",
"Grey-elf": "@",
"Hippocrates": "@",
"Ixoth": "D",
"Juiblex": "&",
"Keystone Kop": "K",
"King Arthur": "@",
"Kop Kaptain": "K",
"Kop Lieutenant": "K",
"Kop Sergeant": "K",
"Lord Carnarvon": "@",
"Lord Sato": "@",
"Lord Surtur": "H",
"Master Assassin": "@",
"Master Kaen": "@",
"Master of Thieves": "@",
"Medusa": "@",
"Minion of Huhetotl": "&",
"Mordor orc": "o",
"Nalzok": "&",
"Nazgul": "W",
"Neferet the Green": "@",
"Norn": "@",
"Olog-hai": "T",
"Oracle": "@",
"Orcus": "&",
"Orion": "@",
"Pelias": "@",
"Pestilence": "&",
"Scorpius": "s",
"Shaman Karnov": "@",
"Thoth Amon": "@",
"Twoflower": "@",
"Uruk-hai": "o",
"Vlad the Impaler": "V",
"Wizard of Yendor": "@",
"Woodland-elf": "@",
"Yeenoghu": "&",
"abbot": "@",
"acid blob": "b",
"acolyte": "@",
"air elemental": "E",
"aligned priest": "@",
"ape": "Y",
"apprentice": "@",
"arch-lich": "L",
"archeologist": "@",
"attendant": "@",
"baby black dragon": "D",
"baby blue dragon": "D",
"baby crocodile": ":",
"baby gray dragon": "D",
"baby green dragon": "D",
"baby long worm": "w",
"baby orange dragon": "D",
"baby purple worm": "w",
"baby red dragon": "D",
"baby silver dragon": "D",
"baby white dragon": "D",
"baby yellow dragon": "D",
"balrog": "&",
"baluchitherium": "q",
"barbarian": "@",
"barbed devil": "&",
"barrow wight": "W",
"bat": "B",
"black dragon": "D",
"black light": "y",
"black naga hatchling": "N",
"black naga": "N",
"black pudding": "P",
"black unicorn": "u",
"blue dragon": "D",
"blue jelly": "j",
"bone devil": "&",
"brown mold": "F",
"brown pudding": "P",
"bugbear": "h",
"captain": "@",
"carnivorous ape": "Y",
"cave spider": "s",
"caveman": "@",
"cavewoman": "@",
"centipede": "s",
"chameleon": ":",
"chickatrice": "c",
"chieftain": "@",
"clay golem": "'",
"cobra": "S",
"cockatrice": "c",
"couatl": "A",
"coyote": "d",
"crocodile": ":",
"demilich": "L",
"dingo": "d",
"disenchanter": "R",
"djinni": "&",
"dog": "d",
"doppelganger": "@",
"dust vortex": "v",
"dwarf king": "h",
"dwarf lord": "h",
"dwarf mummy": "M",
"dwarf zombie": "Z",
"dwarf": "h",
"earth elemental": "E",
"electric eel": ";",
"elf mummy": "M",
"elf zombie": "Z",
"elf": "@",
"elf-lord": "@",
"energy vortex": "v",
"erinys": "&",
"ettin mummy": "M",
"ettin zombie": "Z",
"ettin": "H",
"fire ant": "a",
"fire elemental": "E",
"fire giant": "H",
"fire vortex": "v",
"flaming sphere": "e",
"flesh golem": "'",
"floating eye": "e",
"fog cloud": "v",
"forest centaur": "C",
"fox": "d",
"freezing sphere": "e",
"frost giant": "H",
"gargoyle": "g",
"garter snake": "S",
"gas spore": "e",
"gecko": ":",
"gelatinous cube": "b",
"ghost": " ",
"ghoul": "Z",
"giant ant": "a",
"giant bat": "B",
"giant beetle": "a",
"giant eel": ";",
"giant mimic": "m",
"giant mummy": "M",
"giant rat": "r",
"giant spider": "s",
"giant zombie": "Z",
"giant": "H",
"glass golem": "'",
"glass piercer": "p",
"gnome king": "G",
"gnome lord": "G",
"gnome mummy": "M",
"gnome zombie": "Z",
"gnome": "G",
"gnomish wizard": "G",
"goblin": "o",
"gold golem": "'",
"golden naga hatchling": "N",
"golden naga": "N",
"gray dragon": "D",
"gray ooze": "P",
"gray unicorn": "u",
"green dragon": "D",
"green mold": "F",
"green slime": "P",
"gremlin": "g",
"grid bug": "x",
"guard": "@",
"guardian naga hatchling": "N",
"guardian naga": "N",
"guide": "@",
"healer": "@",
"hell hound pup": "d",
"hell hound": "d",
"hezrou": "&",
"high priest": "@",
"hill giant": "H",
"hill orc": "o",
"hobbit": "h",
"hobgoblin": "o",
"homunculus": "i",
"horned devil": "&",
"horse": "u",
"housecat": "f",
"human mummy": "M",
"human zombie": "Z",
"human": "@",
"hunter": "@",
"ice devil": "&",
"ice troll": "T",
"ice vortex": "v",
"iguana": ":",
"imp": "i",
"incubus": "&",
"iron golem": "'",
"iron piercer": "p",
"jabberwock": "J",
"jackal": "d",
"jaguar": "f",
"jellyfish": ";",
"ki-rin": "A",
"killer bee": "a",
"kitten": "f",
"knight": "@",
"kobold lord": "k",
"kobold mummy": "M",
"kobold shaman": "k",
"kobold zombie": "Z",
"kobold": "k",
"kraken": ";",
"large cat": "f",
"large dog": "d",
"large kobold": "k",
"large mimic": "m",
"leather golem": "'",
"lemure": "i",
"leocrotta": "q",
"leprechaun": "l",
"lich": "L",
"lichen": "F",
"lieutenant": "@",
"little dog": "d",
"lizard": ":",
"long worm": "w",
"lurker above": "t",
"lynx": "f",
"mail daemon": "&",
"manes": "i",
"marilith": "&",
"master lich": "L",
"master mind flayer": "h",
"mastodon": "q",
"mind flayer": "h",
"minotaur": "H",
"monk": "@",
"monkey": "Y",
"mountain centaur": "C",
"mountain nymph": "n",
"mumak": "q",
"nalfeshnee": "&",
"neanderthal": "@",
"newt": ":",
"ninja": "@",
"nurse": "@",
"ochre jelly": "j",
"ogre king": "O",
"ogre lord": "O",
"ogre": "O",
"orange dragon": "D",
"orc mummy": "M",
"orc shaman": "o",
"orc zombie": "Z",
"orc": "o",
"orc-captain": "o",
"owlbear": "Y",
"page": "@",
"panther": "f",
"paper golem": "'",
"piranha": ";",
"pit fiend": "&",
"pit viper": "S",
"plains centaur": "C",
"pony": "u",
"priest": "@",
"priestess": "@",
"prisoner": "@",
"purple worm": "w",
"pyrolisk": "c",
"python": "S",
"quantum mechanic": "Q",
"quasit": "i",
"queen bee": "a",
"quivering blob": "b",
"rabid rat": "r",
"ranger": "@",
"raven": "B",
"red dragon": "D",
"red mold": "F",
"red naga hatchling": "N",
"red naga": "N",
"rock mole": "r",
"rock piercer": "p",
"rock troll": "T",
"rogue": "@",
"rope golem": "'",
"roshi": "@",
"rothe": "q",
"rust monster": "R",
"salamander": ":",
"samurai": "@",
"sandestin": "&",
"sasquatch": "Y",
"scorpion": "s",
"sergeant": "@",
"sewer rat": "r",
"shade": " ",
"shark": ";",
"shocking sphere": "e",
"shopkeeper": "@",
"shrieker": "F",
"silver dragon": "D",
"skeleton": "Z",
"small mimic": "m",
"snake": "S",
"soldier ant": "a",
"soldier": "@",
"spotted jelly": "j",
"stalker": "E",
"steam vortex": "v",
"stone giant": "H",
"stone golem": "'",
"storm giant": "H",
"straw golem": "'",
"student": "@",
"succubus": "&",
"tengu": "i",
"thug": "@",
"tiger": "f",
"titan": "H",
"titanothere": "q",
"tourist": "@",
"trapper": "t",
"troll": "T",
"umber hulk": "U",
"valkyrie": "@",
"vampire bat": "B",
"vampire lord": "V",
"vampire": "V",
"violet fungus": "F",
"vrock": "&",
"warg": "d",
"warhorse": "u",
"warrior": "@",
"watch captain": "@",
"watchman": "@",
"water demon": "&",
"water elemental": "E",
"water moccasin": "S",
"water nymph": "n",
"water troll": "T",
"werejackal": "d",
"wererat": "r",
"werewolf": "d",
"white dragon": "D",
"white unicorn": "u",
"winged gargoyle": "g",
"winter wolf cub": "d",
"winter wolf": "d",
"wizard": "@",
"wolf": "d",
"wood golem": "'",
"wood nymph": "n",
"woodchuck": "r",
"wraith": "W",
"wumpus": "q",
"xan": "x",
"xorn": "X",
"yellow dragon": "D",
"yellow light": "y",
"yellow mold": "F",
"yeti": "Y",
"zruty": "z"
}因此,这里的任务基本上是“给定由上面的JSON对象表示的字典中的一个键,返回相应的值”。
注意,在某种程度上,这个挑战是一个反向的kolmogorov-复杂性;不是从一个小/空输入转到一个大输出,而是从一个大输入转到一个小输出。(因此输入中有大量冗余信息,您可以随意忽略或使用这些信息)。它也非常类似regex高尔夫,只是a)允许任何语言(不仅仅是regex),和b)有两个以上的可能的输出。(我们以前有过一些类似的任务,比如这些 二,但是这个任务有点不同,因为指定的输入/输出行为有更强的模式)。
您可以使用任何合理的输入和输出格式(例如,您可以将输出作为字符、其ASCII代码或一个字符长的字符串)。如果您愿意,可以提交函数而不是完整的程序。
在标准漏洞中已经提到了这一点,但只是想重申一句:除了程序的源代码之外,您不能在任何地方存储输入和输出之间的通信。这一挑战基本上是关于在尽可能小的空间内表示输入/输出行为,因此您不能从互联网下载列表、将通信存储在外部文件中、在调试模式下启动NetHack并生成所讨论的怪物来查看它的外观等等。(此外,我也不想为了测试你的作品而与怪物搏斗。)
这是密码-高尔夫,所以获胜的条目将是最短的条目,以字节计。祝好运!
发布于 2017-01-02 08:06:29
import java.util.*;class G{public static void main(String[]u){BitSet s=BitSet.valueOf(Base64.getDecoder().decode("D94FuoCWYEIhCTEgLWwRNU/CMB1cE7XBhxBsBCusihaASRg14IJpQMOIDJdFx3BOdDcmThdhILVkCgGsEmhII8UE+SB4kDYEEJzw7Tw54oUEQZe0AUHCACH6nAdqgiZgJhASCIPAEAzJBmuMIrBCHE8IiFjgKQwrN4/90B4QFaLBQBEwTArRBMLCLHQOUQs7ZXZ8B8uGC1EbeAMJBdihUDgCIwGUEKgEAu4W2SJkIAhzB1IQSHgNiEAwABQECV5BvAB7eizABXxFLEg5iMA3whhAFXOKHXEURB7UA7PQjgUK7sji8CmIC0FJsTB4tAMFgiARB3hOJATDsBkgGKnGmWIiIWBRwkMgToQJ49G8gTR4IqcB4vJwDBHSVBLQhpwHsUFipqBcWWaEsCBoGBF0AlNAE305HAfdU1AEbELBO0EERAfkmMkgZcEXDIa4MAp4HcENmYAMBB7UBbTwBqQPSMS9kVkEBMhCudAqBAKaR1CzZggDRw8WMAh0FQPEyKAsRAxzBwn0grwDMQMyQMdADRtFUBAsBQetRRBwcUgrlsQ1IkosBc9B6iBcjAkSDDKgEAQ1wgLIMEEwMkYB42ERBCdiEJMAt1wYSIAQkdIEI0UPNhALsDnRQ1AT/HQi1AyCEwiICOICpiAPlB8MwxnBPIk6JYaIgDy8NJHDsiAqzK0JAXpQPXgPLwJuEEbMTAGBYlQbDESvAXJAAQ=="));int i,j,k,c,d,h=u[0].hashCode(),a=(h&4092)>>2|(h>>5)&1024|(h>>7)&2048|(h>>9)&4096;char r='@';for(i=k=0;i<4297;i+=14){for(c=0,j=7;j>=0;j--)c+=c+(s.get(i+j)?1:0);if((k+=c)==a){for(d=0,j=13;j>=8;j--)d+=d+(s.get(i+j)?1:0);r=d<5?" &':;".charAt(d):(char)((d<31?60:66)+d);}}System.out.println(r);}}未高尔夫球:
import java.util.*;
class G {
public static void main(String[] u) {
BitSet s = BitSet.valueOf(Base64.getDecoder().decode(
"D94FuoCWYEIhCTEgLWwRNU/CMB1cE7XBhxBsBCusihaASRg14IJpQMOIDJdFx3BOdDcmThdhILVkCgGsEmhII8UE+SB4kDYEEJzw7Tw54oUEQZe0AUHCACH6nAdqgiZgJhASCIPAEAzJBmuMIrBCHE8IiFjgKQwrN4/90B4QFaLBQBEwTArRBMLCLHQOUQs7ZXZ8B8uGC1EbeAMJBdihUDgCIwGUEKgEAu4W2SJkIAhzB1IQSHgNiEAwABQECV5BvAB7eizABXxFLEg5iMA3whhAFXOKHXEURB7UA7PQjgUK7sji8CmIC0FJsTB4tAMFgiARB3hOJATDsBkgGKnGmWIiIWBRwkMgToQJ49G8gTR4IqcB4vJwDBHSVBLQhpwHsUFipqBcWWaEsCBoGBF0AlNAE305HAfdU1AEbELBO0EERAfkmMkgZcEXDIa4MAp4HcENmYAMBB7UBbTwBqQPSMS9kVkEBMhCudAqBAKaR1CzZggDRw8WMAh0FQPEyKAsRAxzBwn0grwDMQMyQMdADRtFUBAsBQetRRBwcUgrlsQ1IkosBc9B6iBcjAkSDDKgEAQ1wgLIMEEwMkYB42ERBCdiEJMAt1wYSIAQkdIEI0UPNhALsDnRQ1AT/HQi1AyCEwiICOICpiAPlB8MwxnBPIk6JYaIgDy8NJHDsiAqzK0JAXpQPXgPLwJuEEbMTAGBYlQbDESvAXJAAQ=="));
int i, j, k, c, d, h = u[0].hashCode(),
a = (h & 4092) >> 2 | (h >> 5) & 1024 | (h >> 7) & 2048 | (h >> 9) & 4096;
char r = '@';
for (i = 0, k = 0; i < 4297; i += 14) {
for (c = 0, j = 7; j >= 0; j--)
c += c + (s.get(i + j) ? 1 : 0);
if ((k += c) == a) {
for (d = 0, j = 13; j >= 8; j--)
d += d + (s.get(i + j) ? 1 : 0);
r = d < 5 ? " &':;".charAt(d) : (char) ((d < 31 ? 60 : 66) + d);
}
}
System.out.println(r);
}
}怪物的名字是:
hashcode方法=> 32位进行散列所述显示字符编码在6位上。
所以每个元组(怪物名称,字符)使用14位。所有元组都保存在一个BitSet和基64编码。
使用base64编码和BitSet操作,我丢失了很多字节:-)
发布于 2017-01-02 07:10:18
def f(s):import re;m=re.search(s[-3:-1]+s[:2]+str(len(s))+"(.)","omgn5Gteen13vligr7glero10'akga12Sanso11aragi9rgoDe10&tiet5HleVl16Vanst11Hmpmo14nubge15brsho5uingo21Nbuin7&gobl11Dgobl12Duaja6faule10lkest7Eolic9Ttawa15EanKo14KanKo12Kviba12&gore10Dimim3iutzr5zingn10Ganhi10Herfr15emmel9Mlele13'guNa6Wkaja6dotco6docvr5&petr7tmaor10oarli6:nhpi7;moma11&icli4Linbl20Nolwa11Titwr6Wtlgi12ateru12Rbign12Zozgr9Plepa11'oufo9vingu23Norhi8onena10&tati5Hiosc8sinre18Nligo6obeki10aeaow7Yeyfl12elewo10'adsh5 anfr11Hapap3Ygrog4Obequ9ahopy6Steki6fgogr11Dgogr12Dpepi9Sngdi5dindw10hlegl11'imgr11Pbava11Bcero12phaOl8Tdoli10dcuwi15dargn14GotIx5Dinbl13Parwa4dpuhe14dtisa9&ilba14:liho9onyer6&euAs8&aupl14Cttle9qmmdw11Molbr10Fmism11mncPe10&mpwa11noror3oispy8caumo16Clest11'haUr8okekr6;bigi12ZbuBa9&gowh12Dbiko13Zbiet12Zmmgn11Molwe8dmowa11&icde8Lbiho6hdola9dleJu7&otMi18&ulum10Uenpi9&luho10ighye12ymamu5qorwh13ughbl11yylga8gKoKe12Knndj6&mmet11Magbl10Narsh5;osgh5 orxo4Xoltr5Tdoma8qopCy7Hceir12pgoba18Dorlo9wgoba16Dbidw12ZinFa6&goor13DeaAl5Aiuba14qloac9bkemo6Yniqu16QteDi8&aufo14Ckesh8Fetye4Yolro9ryema18hersh15eaggo11Nrase9ranig6:ghba12Winbr13Polwi11dgeti5fzoNa6&orga9emmko12Manfi8aorgn10Gatco6Alecl10'goye13Deabu7hinog9Oheli6Feoch9:ynly4fngte5ieeel12;rawe7ricch11caior11ocala9fguvi13Fangi9aangi5Hhepa7fdesa10:cuOr5&rswa8ubrco5Sorva12Vxaxa3xovlu12tbaba3Bilcr9:geAn5Aolwo4dviic9&tafi14Ecegl13pbugr8xorpu11wgoCh16Dicar9Laggu13Ndegi12shoAr6Aolla12kedce9sitma8&erti11qicma11Lbior10Zviho12&test12vbusu8&fofo3ddeca11srara9rolko6kmpwo10ntaea15Ellbl10jgosi13Daksn5Svibo10&tosk8Zicco10cvera5Bgoba15DatDe5&goba17Dpuwu6qkawe10dmmhu11Mdodo3dunhe10dtcsa9Yckge5:tefi11vsiqu6iloqu14bewne4:yoGe6&caho8fucwo9rorMo10oisje9;taai13Eardw5holye11Fordw10hlloc11jough5Zerfl14emila11mtedu11vthro5qteic10vtuLo11Hmmor9Mirva7Vbagi9Bolro10Tmako13kleir10'biel10Zmmgi11Mnema5ilego10'olre8Forbl13usiwa14Sroba6&agre8Nrohe6&orgr12ulefl11'ocja10JghYe8&aumi8HiuSc8sbihu12Zriki6Ayemi11horko11kolgr10Furle6ianfi10Hmigi11monpo4ullsp13jaiKo11Ktedi12Rapca15Yorog9Oylwi15geegi9;orba14worba16w");return m.group(1)if m else'@'这是我的测试工具,以防它对其他人有帮助。
MAPPING = {
# as given in the original question
}
def validate_solution(f):
for k, v in MAPPING.iteritems():
vv = f(k)
if vv != v:
print 'FAIL: f(%s) = %s instead of %s' % (k, vv, v)
print 'SUCCESS!'我编写了一个小程序来枚举所有提取4个字符的各种方法以及字符串的长度。我最初的计划是对这些字符进行ord(),对它们进行一些计算,并将其归结为一个完美的哈希函数,该函数将索引生成一个输出表。因此,我编写了另一个小程序来枚举所有将这4个字符相加/乘/模的各种方法;但是产生的散列函数仍然有太多的冲突。最后,我放弃了,只做了你在这里看到的事情,这只是一张从每个怪物名字的小字符串表示到适当的符号的地图。
就是:我想得到的是
def f(monster_name):
small_string = f1(monster_name)
integer_index = f2(small_string)
symbol = "relatively_short_table"[integer_index]
return symbol但我只设法做到
def f(monster_name):
small_string = f1(monster_name)
symbol = {relatively_large_dict}[small_string]
return symbol其中,我的字典查找{relatively_large_dict}[small_string]是表示为re.match(small_string+"(.)", "relatively_large_string")的高尔夫球。
发布于 2017-01-02 01:33:21
s=>{h=0;for(i of s)h=(h<<5)-h+i.charCodeAt()|0;for(v of "Aqgh201etxitsxy0_&ctpzfekt09j36uafamqw46mz1qcxvnnoego4212nxfivutt09qyac4td1ayiotfh3dvub5fggzjqa58h37bnva3dzy_D9wlywkgkifldlp6t46v97basg905f8wadwt0w49q0gk9c8edz9e33uj6esjl_Hkkt54kr0qdlxs6hxdxxyegrdzcmz8ymvg_Ki0enu0ct1shv_o193ve2y3tpa71xu3pud405o7_We09jfsayx_Tw2gk0spoqab5c9k_s7timco3yh674rp1_Vppq2k9t1q_b3mo3tac13_E0r50a7vi5a0kgim_Y2omnjbkq59mw5njf5t_Lu9z2bj6w2128_:n0gngsocqeuh5czhyiedwd3a_w9lf1hv1rra7r_qmckg7rbhlldbvros4f44h_B32t12yzdci83_yjkb3va_Nt2cbaqd46toc29anic1qq3es_P3mkmtv2l4j8r_ukjb44lwm5vkaz5hwkh_j3oo7uj9ip_Fzuk8mh1rpfw7obl6s9fsq_hzmwz3f7kdhiaj4enlxha1_c0q0yu8tnf_'nf7c1sks8rzgxhw83vjq0s76xhrvppbgn_Slr90h5su3zokncwi2m_doi5t2p4vw6dryycyhtl6eujb1ta26752ta7hr19d9vceq_Rqk8tsy_vuxwglitt4u25zfhj5q_M4j7tjk9cryvqn8101u5h646p_Ztzwr09t8ckxx3hbsl6r7dqv7qxmnwt_;u7r3e9trqqkmdj5tlx_apoj0ngpcqy6r7t8gw9_e2wtyw9oyve8uxlf_C8tpo3hlb3_gxji2n2nl4_ kwft9p_maxcdzat5e_rcy28c360mmndp8ksxh_pegqkkuur3_Gh6f8pheo0nn2_xu6yjdx_iz538jwkbwuh4ge7ymj_f3eytt6khltgxj13itedbz_Jlgk_knskybpe8n69a_llnv_tuxgkxc_nod5ob3cft_Oij0a222q3_Q6af_Uc5x_Xzjn_z6iq".split`_`)if(~v.slice(1).match(/.../g).indexOf(h.toString(36).slice(-3)))return v[0];return"@"}使用Javascript散列的黄金版本找到这里。存储在表中的实际散列(那个长字符串)获取该方法产生的散列的绝对值,将其转换为基-36,并删除除三个最不重要的数字之外的所有值。
https://codegolf.stackexchange.com/questions/105303
复制相似问题