ट्वीट करने योग्य हैश फ़ंक्शन चुनौती


73

इस आप 140 बाइट्स 1 या उससे कम स्रोत कोड में हैश फ़ंक्शन लिखेंगे । हैश फ़ंक्शन को इनपुट के रूप में एक ASCII स्ट्रिंग लेना चाहिए, और आउटपुट के रूप में 24-बिट अहस्ताक्षरित पूर्णांक ([0, 2 24 -1]) वापस करना चाहिए।

आपका हैश फ़ंक्शन इस बड़े ब्रिटिश अंग्रेजी शब्दकोश 2 में हर शब्द के लिए मूल्यांकन किया जाएगा । आपका स्कोर शब्दों की राशि है जो एक अन्य शब्द (एक टकराव) के साथ एक हैश मूल्य साझा करता है।

सबसे कम स्कोर जीतता है, पहले पोस्टर से टूट जाता है।

परीक्षण का मामला

सबमिट करने से पहले, निम्नलिखित इनपुट पर अपनी स्कोरिंग स्क्रिप्ट का परीक्षण करें:

duplicate
duplicate
duplicate
duplicate

यदि यह 4 के अलावा कोई भी अंक देता है, तो यह छोटी गाड़ी है।


स्पष्ट नियम:

  1. आपका हैश फ़ंक्शन एक एकल स्ट्रिंग पर चलना चाहिए, न कि एक संपूर्ण सरणी पर। साथ ही, आपका हैश फ़ंक्शन इनपुट स्ट्रिंग और आउटपुट पूर्णांक की तुलना में कोई अन्य I / O नहीं कर सकता है।
  2. अंतर्निहित हैश फ़ंक्शंस या समान कार्यक्षमता (उदाहरण के लिए स्क्रैम्बल बाइट्स के लिए एन्क्रिप्शन) को बंद कर दिया गया है।
  3. आपका हैश फ़ंक्शन नियतात्मक होना चाहिए।
  4. स्कोरिंग इनपुट के लिए विशेष रूप से अनुकूलन करने वाले अधिकांश अन्य प्रतियोगिताओं के विपरीत अनुमति है।

1 मुझे पता है कि ट्विटर बाइट्स के बजाय वर्णों को सीमित करता है, लेकिन सादगी के लिए हम इस चुनौती के लिए एक सीमा के रूप में बाइट्स का उपयोग करेंगे।
2 किसी भी गैर-एएससीआईआई शब्द को हटाते हुए, डेबियन के मलबे के आकार से संशोधित ।


11
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch's? क्या...?
लुइस मेंडो

8
@DonMuesli en.wikipedia.org/wiki/Llanfairpwllgwyngyll (मजेदार तथ्य: यह शब्द जेली के अंतर्निहित संपीड़न शब्दकोश में भी है)
मार्टिन एंडर

8
मुझे लगता है कि आपको अंतर्निहित शब्दकोशों को अस्वीकार करना चाहिए।
डेनिस

4
संदर्भ के लिए: SHA-512 के 24 MSB लेने से 6816 का स्कोर हासिल होगा।
डेनिस

10
कुछ बैक-ऑफ-द-लिफाफा गणना: D=340275शब्दों और R=2^24हैश आउटपुट के साथ, एक यादृच्छिक हैश में एक अपेक्षित D^2/(2*R) = 3450टकराने वाले जोड़े होते हैं, जिनमें से कुछ ओवरलैप होते हैं। एक अपेक्षित D^3/(6*R^2) = 23टॉलरिंग ट्राइबल्स और एक बड़ी संख्या में टकराने की एक नगण्य संख्या है, जिसका अर्थ है कि ये ट्राइबल्स संभावित असहमति हैं। यह एक अपेक्षित 6829शब्द देता है जो हैश मान साझा करता है, ~ 70त्रिक में और बाकी जोड़े में। मानक विचलन का अनुमान है 118, इसलिए <6200एक यादृच्छिक हैश के साथ मिलना लगभग 5 सिग्मा घटना है।
xnor

जवाबों:


11

ठीक है, मैं एक गोल्फ भाषा सीखता हूँ।

CJam, 140 बाइट्स, 3314 टकराने वाले शब्द

00000000: 7b5f 3162 225e d466 4a55 a05e 9f47 fc51  {_1b"^.fJU.^.G.Q
00000010: c45b 4965 3073 72dd e1b4 d887 a4ac bcbd  .[Ie0sr.........
00000020: 9c8f 70ca 2981 b2df 745a 10d0 dfca 6cff  ..p.)...tZ....l.
00000030: 7a3b 64df e730 54b4 b068 8584 5f6c 9f6b  z;d..0T..h.._l.k
00000040: b7f8 7a1f a2d3 b2b8 bcf5 cfa6 1ef7 a55c  ..z............\
00000050: dca8 795c 2492 dc32 1fb6 f449 f9ca f6b7  ..y\$..2...I....
00000060: a2cf 4772 266e ad4f d90c d236 b51d c5d5  ..Gr&n.O...6....
00000070: 5c46 3f9b 7cb4 f195 4efc fe4a ce8d 9aee  \F?.|...N..J....
00000080: 9dbc 223d 6962 3443 2329 257d            .."=ib4C#)%}

एक ब्लॉक (अनाम फ़ंक्शन) को परिभाषित करता है। परीक्षण करने के लिए, आप qN%%N*Nस्टडिन पर शब्दों की न्यूलाइन-सेपरेटेड सूची लेने के लिए जोड़ सकते हैं और स्टडआउट पर हैश की अलग-अलग सूची लिख सकते हैं। समान पायथन कोड:

b=lambda s,a:reduce(lambda n,c:n*a+ord(c),s,0)
f=lambda s:b(s,ord('^\xd4fJU\xa0^\x9fG\xfcQ\xc4[Ie0sr\xdd\xe1\xb4\xd8\x87\xa4\xac\xbc\xbd\x9c\x8fp\xca)\x81\xb2\xdftZ\x10\xd0\xdf\xcal\xffz;d\xdf\xe70T\xb4\xb0h\x85\x84_l\x9fk\xb7\xf8z\x1f\xa2\xd3\xb2\xb8\xbc\xf5\xcf\xa6\x1e\xf7\xa5\\\xdc\xa8y\\$\x92\xdc2\x1f\xb6\xf4I\xf9\xca\xf6\xb7\xa2\xcfGr&n\xadO\xd9\x0c\xd26\xb5\x1d\xc5\xd5\\F?\x9b|\xb4\xf1\x95N\xfc\xfeJ\xce\x8d\x9a\xee\x9d\xbc'[b(s,1)%125]))%(8**8+1)

पायथ, 140 बाइट्स, 3535 3396 टकराने वाले शब्द

00000000: 4c25 4362 2d68 5e38 2038 2a36 3643 4022  L%Cb-h^8 8*66C@"
00000010: aa07 f29a 27a7 133a 3901 484d 3f9b 1982  ....'..:9.HM?...
00000020: d261 79ab adab 9d92 888c 3012 a280 76cf  .ay.......0...v.
00000030: a2e5 8f81 7039 acee c42e bc18 28d8 efbf  ....p9......(...
00000040: 0ebe 2910 9c90 158e 3742 71b4 bdf5 59c2  ..).....7Bq...Y.
00000050: f90b e291 8673 ea59 6975 10be e750 84c8  .....s.Yiu...P..
00000060: 0b0f e7e8 f591 f628 cefa 1ab3 2e3c 72a3  .......(.....<r.
00000070: 7f09 6190 dbd2 d54e d6d0 d391 a780 ebb6  ..a....N........
00000080: ae86 2d1e 49b0 552e 7522 4362            ..-.I.U.u"Cb

नाम के एक फंक्शन को परिभाषित करता है y। परीक्षण करने के लिए, आप jmyd.zस्टडिन पर शब्दों की न्यूलाइन-सेपरेटेड सूची लेने के लिए जोड़ सकते हैं और स्टडआउट पर हैश की अलग-अलग सूची लिख सकते हैं। समान पायथन कोड:

b=lambda s,a:reduce(lambda n,c:n*a+ord(c),s,0)
f=lambda s:b(s,256)%(8**8+1-66*ord("\xaa\x07\xf2\x9a'\xa7\x13:9\x01HM?\x9b\x19\x82\xd2ay\xab\xad\xab\x9d\x92\x88\x8c0\x12\xa2\x80v\xcf\xa2\xe5\x8f\x81p9\xac\xee\xc4.\xbc\x18(\xd8\xef\xbf\x0e\xbe)\x10\x9c\x90\x15\x8e7Bq\xb4\xbd\xf5Y\xc2\xf9\x0b\xe2\x91\x86s\xeaYiu\x10\xbe\xe7P\x84\xc8\x0b\x0f\xe7\xe8\xf5\x91\xf6(\xce\xfa\x1a\xb3.<r\xa3\x7f\ta\x90\xdb\xd2\xd5N\xd6\xd0\xd3\x91\xa7\x80\xeb\xb6\xae\x86-\x1eI\xb0U.u"[b(s,256)%121]))

सैद्धांतिक सीमाएँ

हम कितना अच्छा करने की उम्मीद कर सकते हैं? यहाँ x का एक भूखंड है, सबसे अधिक टकराव वाले शब्दों को प्राप्त करने के लिए आवश्यक शब्दों, बनाम वाई की संख्या, एन्ट्रोपी, बाइट्स में एंट्रोपी। उदाहरण के लिए, बिंदु (२ ,३५, १४०) हमें बताता है कि प्रायिकता १ / २५६ ** १४० के साथ सबसे अधिक २iding३५ टकराए हुए शब्दों में एक यादृच्छिक कार्य हो जाता है, इसलिए यह अत्यधिक संभावना नहीं है कि हम कभी भी १४० से बेहतर कर पाएंगे। कोड के बाइट्स।

ग्राफ


सैद्धांतिक सीमाओं का अच्छा विश्लेषण। उस सैद्धांतिक सीमा को हरा देने के लिए, शायद एक भाषा का उपयोग करना होगा जिसमें प्रश्न में शब्दकोश के लिए अनुकूलित बिल्डिन फ़ंक्शन का उपयोग किया जाएगा (जो धोखा होगा)। यदि भाषा में एक अंतर्निहित क्रिप्टोग्राफिक हैश है, तो सीमा को एक इष्टतम समाधान खोजने के लिए अधिक या कम रचनात्मक विधि में बदल दिया जा सकता है। इस पर विचार करें: $ h (w || c)% 2 ^ {24} $ जहां $ c $ बाइट स्ट्रिंग स्थिरांक है। एक यादृच्छिक ओरेकल मॉडल में जिसे उच्च संभावना के साथ इष्टतम के करीब लाने के लिए दिखाया जा सकता है। बेशक ब्रूट $ c को मजबूर करना संभव नहीं होगा।
कास्परड

आपने ग्राफ के लिए सूत्र की गणना कैसे की? बहुत दिलचस्प!
निकोइरह

@NikoNyrh डायनेमिक प्रोग्रामिंग। Let ( w , c , h ) w शब्दों के साथ एक अवस्था का प्रतिनिधित्व करते हैं , जिनमें से c , h अलग-अलग हैश से टकरा रहा है , और शेष w - c में अलग-अलग हैश हैं। हम कोई भी शब्द जोड़ दें, तो राज्य बन जाता है ( डब्ल्यू + 1, , ) के साथ संभावना 1 - ( + डब्ल्यू - सी / 2 ^ 24, या () डब्ल्यू + 1, सी + 1, एच संभावना रखता है) / 2 ^ 24, या ( डब्ल्यू + 1, सी+ 2, h + 1) प्रायिकता के साथ ( w - c ) / 2 ^ 24। फिर x टकराने वाले शब्दों के साथ ग्राफ्ट की गई अंतिम एन्ट्रॉपी सीx के साथ राज्यों (340275, c , h ) पर संभावनाओं के योग का लॉग बेस 1/256 है ।
एंडर्स केसरग

मैं विश्वास नहीं कर सकता कि किसी ने भी नहीं पूछा है कि आप हैश फ़ंक्शन के साथ कैसे आए? मुझे जानने में बहुत दिलचस्पी होगी।
अनुष

22

पायथन, 5333 4991

मेरा मानना ​​है कि यह पहला दावेदार है जो एक यादृच्छिक ओरेकल की तुलना में काफी बेहतर स्कोर करता है।

def H(s):n=int(s.encode('hex'),16);return n%(8**8-ord('+%:5O![/5;QwrXsIf]\'k#!__u5O}nQ~{;/~{CutM;ItulA{uOk_7"ud-o?y<Cn~-`bl_Yb'[n%70]))

1
टोना! def H(s):n=int(s.encode('hex'),16);return n%...5 बाइट्स बचाता है, अगर आप उन्हें किसी भी तरह से उपयोग कर सकते हैं ...
डेनिस

3
@ डेनिस मैं 5 बाइट्स का इस्तेमाल कर सकता था ताकि स्ट्रिंग को लगातार 5 बाइट्स लंबा कर सकें। अगर मुझे लंबाई बदलनी है तो मुझे स्क्रैच से लगातार तार का निर्माण शुरू करना होगा। और मुझे यकीन नहीं है कि वे 5 बाइट्स मुझे पर्याप्त सुधार देंगे, जो कि स्ट्रिंग के निर्माण पर शुरू होने के लायक है। मैंने सीपीयू समय के घंटे बिताए हैं जो पहले से ही स्ट्रिंग को अनुकूलित कर रहा है।
कास्परड

@ मुझे लगता है कि कुछ अतिरिक्त बाइट्स मुझे निरंतर ज़रूरत से बचने में कुछ पात्रों का उपयोग करने की स्वतंत्रता देंगे। इस तरह मैं संभावित रूप से कुछ अतिरिक्त बाइट्स का उपयोग कर सकता हूं बिना फिर से स्ट्रिंग का निर्माण करने के।
कास्परड

7
यदि आप किसी अन्य बाइट चाहते हैं, 2**24 == 8**8
एंडर्स कासोर्ग

20

पायथन 2, 140 बाइट्स, 4266 टकराने वाले शब्द

मैं वास्तव में गैर-प्रिंट करने योग्य बाइट्स के साथ शुरू नहीं करना चाहता था, जो उनकी अस्पष्ट ट्वीटबिलिटी को देखते हैं, लेकिन ठीक है, मैंने इसे शुरू नहीं किया। :-P

00000000: efbb bf64 6566 2066 2873 293a 6e3d 696e  ...def f(s):n=in
00000010: 7428 732e 656e 636f 6465 2827 6865 7827  t(s.encode('hex'
00000020: 292c 3336 293b 7265 7475 726e 206e 2528  ),36);return n%(
00000030: 382a 2a38 2b31 2d32 3130 2a6f 7264 2827  8**8+1-210*ord('
00000040: 6f8e 474c 9f5a b49a 01ad c47f cf84 7b53  o.GL.Z........{S
00000050: 49ea c71b 29cb 929a a53b fc62 3afb e38e  I...)....;.b:...
00000060: e533 7360 982a 50a0 2a82 1f7d 768c 7877  .3s`.*P.*..}v.xw
00000070: d78a cb4f c5ef 9bdb 57b4 7745 3a07 8cb0  ...O....W.wE:...
00000080: 868f a927 5b6e 2536 375d 2929            ...'[n%67]))

पायथन 2, 140 प्रिंट करने योग्य बाइट्स, 4662 4471 4362 टकराने वाले शब्द

def f(s):n=int(s.encode('hex'),16);return n%(8**8+3-60*ord('4BZp%(jTvy"WTf.[Lbjk6,-[LVbSvF[Vtw2e,NsR?:VxC0h5%m}F5,%d7Kt5@SxSYX-=$N>'[n%71]))

कैस्परर्ड के समाधान के रूप से प्रेरित, स्पष्ट रूप से - लेकिन मापांक स्थान पर एक एफाइन परिवर्तन के महत्वपूर्ण जोड़ के साथ, और पूरी तरह से अलग पैरामीटर।


+1 मैं लड़ाई के बिना हार नहीं मान रहा हूं। लेकिन मुझे लगता है कि मुझे अपने वर्तमान समाधान का अनुकूलन बंद करना होगा और दूसरा तरीका खोजना होगा, क्योंकि यदि मैं मापदंडों को अनुकूलित करने के लिए अपने वर्तमान दृष्टिकोण का उपयोग करता हूं तो मैं आपको हरा नहीं सकता हूं। एक बार जब मैं तुम्हारी पिटाई कर देता हूं, तो मैं अपने समाधान के लिए एक संपादन के साथ वापस
आऊंगा

@kasperd: बहुत बढ़िया, इसे लाओ। :-P
एंडर्स कासोर्ग

1
@AndersKaseorg आपको स्ट्रिंग कैसे मिलेगी?
ASCII- केवल

@AndersKaseorg मैं अपने पैरामीटर की खोज में बहुत तेजी लाने में कामयाब रहा। और मैंने एक बाधा को हटा दिया, जो मेरी खोज को सबॉप्टीमल समाधानों पर अटकने का कारण बना रहा था। लेकिन मैं अभी भी इसे 4885 से बेहतर नहीं बना सका। कुछ विचार करने के बाद कि मैं इसे आगे क्यों नहीं बना सका, मुझे अचानक एहसास हुआ कि मेरे समाधान में क्या गलत है और इसे कैसे ठीक किया जा सकता है। अब आपके समाधान में परिशोधन परिवर्तन मेरे लिए सही अर्थ में है। मुझे लगता है कि एकमात्र तरीका जिसे मैं संभवतः पकड़ सकता हूं, वह है कि मैं अपने आप को एक समृद्ध परिवर्तन का उपयोग कर सकता हूं।
कास्परड

1
@kasperd: बहुत अच्छा। जब n%(8**8-ord('…'[n%70]))अन्य पैरामीटर परिवर्तनों के बिना बेहतर स्ट्रिंग की खोज करते हैं, तो मैं केवल 4995 प्राप्त करने में कामयाब रहा था, इसलिए ऐसा लगता है कि आपके नए ऑप्टिमाइज़र ने मेरा पकड़ लिया है। अब यह और दिलचस्प हो जाता है!
एंडर्स कासोर्ग

16

CJam, 4125 3937 3791 3677

0000000: 7b 5f 39 62 31 31 30 25 5f 22 7d 13 25 77  {_9b110%_"}.%w
000000e: 77 5c 22 0c e1 f5 7b 83 45 85 c0 ed 08 10  w\"...{.E.....
000001c: d3 46 0c 5c 22 59 f8 da 7b f8 18 14 8e 4b  .F.\"Y..{....K
000002a: 3a c1 9e 97 f8 f2 5c 18 21 63 13 c8 d3 86  :.....\.!c....
0000038: 45 8e 64 33 61 50 96 c4 48 ea 54 3b b3 ab  E.d3aP..H.T;..
0000046: bc 90 bc 24 21 20 50 30 85 5f 7d 7d 59 2c  ...$! P0._}}Y,
0000054: 4a 67 88 c8 94 29 1a 1a 1a 0f 38 c5 8a 49  Jg...)....8..I
0000062: 9b 54 90 b3 bd 23 c6 ed 26 ad b6 79 89 6f  .T...#..&..y.o
0000070: bd 2f 44 6c f5 3f ae af 62 9b 22 3d 69 40  ./Dl.?..b."=i@
000007e: 62 31 35 32 35 31 39 25 31 31 30 2a 2b 7d  b152519%110*+}

यह दृष्टिकोण डोमेन और कोडोमैन को 110 निराशाजनक सेटों में विभाजित करता है, और प्रत्येक जोड़ी के लिए थोड़ा अलग हैश फ़ंक्शन को परिभाषित करता है।

स्कोरिंग / सत्यापन

$ echo $LANG
en_US
$ cat gen.cjam
"qN%{_9b110%_"
[125 19 37 119 119 34 12 225 245 123 131 69 133 192 237 8 16 211 70 12 34 89 248 218 123 248 24 20 142 75 58 193 158 151 248 242 92 24 33 99 19 200 211 134 69 142 100 51 97 80 150 196 72 234 84 59 179 171 188 144 188 36 33 32 80 48 133 95 125 125 89 44 74 103 136 200 148 41 26 26 26 15 56 197 138 73 155 84 144 179 189 35 198 237 38 173 182 121 137 111 189 47 68 108 245 63 174 175 98 155]
:c`"=i@b152519%110*+}%N*N"
$ cjam gen.cjam > test.cjam
$ cjam test.cjam < british-english-huge.txt | sort -n > temp
$ head -1 temp
8
$ tail -1 temp
16776899
$ all=$(wc -l < british-english-huge.txt)
$ unique=$(uniq -u < temp | wc -l)
$ echo $[all - unique]
3677

पायथन के लिए निम्नलिखित पोर्ट का उपयोग आधिकारिक स्कोरिंग स्निपेट के साथ किया जा सकता है:

h=lambda s,b:len(s)and ord(s[-1])+b*h(s[:-1],b)

def H(s):
 p=h(s,9)%110
 return h(s,ord(
  '}\x13%ww"\x0c\xe1\xf5{\x83E\x85\xc0\xed\x08\x10\xd3F\x0c"Y\xf8\xda{\xf8\x18\x14\x8eK:\xc1\x9e\x97\xf8\xf2\\\x18!c\x13\xc8\xd3\x86E\x8ed3aP\x96\xc4H\xeaT;\xb3\xab\xbc\x90\xbc$! P0\x85_}}Y,Jg\x88\xc8\x94)\x1a\x1a\x1a\x0f8\xc5\x8aI\x9bT\x90\xb3\xbd#\xc6\xed&\xad\xb6y\x89o\xbd/Dl\xf5?\xae\xafb\x9b'
  [p]))%152519*110+p

1
मैंने आसान सत्यापन के लिए अपने कोड को पायथन में रखा है।
डेनिस

क्या hउस पायथन पोर्ट में सीजेम बिलिन के अनुरूप है?
कैस्परड

हाँ। यह CJam का b(आधार रूपांतरण) है।
डेनिस

क्या आपकी स्कोरिंग प्रक्रिया बैश में है?
GamrCorps

@GamrCorps हां, यह बैश है।
डेनिस

11

अजगर, 6446 6372


यह समाधान सभी पिछली प्रविष्टियों की तुलना में कम टकराव की संख्या को प्राप्त करता है, और इसे कोड के लिए अनुमत 140 बाइट्स में से केवल 44 की आवश्यकता होती है:

H=lambda s:int(s.encode('hex'),16)%16727401

2
@ mbomb007 orlp का अपना सबमिशन करता है %(2**24-1), इसलिए मुझे लगता है कि स्पष्टीकरण के लिए पूछना अच्छा हो सकता है
Sp3000

12
@ mbomb007 चुनौती ऐसी कोई बात नहीं कहती है। यह कहता है कि फ़ंक्शन को इनपुट के रूप में एक ASCII स्ट्रिंग लेना चाहिए और उस सीमा में पूर्णांक आउटपुट करना चाहिए। आप चाहे जो भी इनपुट मेरे फंक्शन में दें, आउटपुट उस रेंज में होगा। शब्द फ़ंक्शन की गणितीय परिभाषा के लिए इसे प्रत्येक अनुमत आउटपुट का उत्पादन करने की आवश्यकता नहीं है। यदि वह वही है जो आप चाहते थे कि गणितीय शब्द जो आप उपयोग कर रहे हैं वह विशेषण फ़ंक्शन था। लेकिन आवश्यकताओं में विशेषण शब्द का इस्तेमाल नहीं किया गया था।
कास्परड

@ mbomb007: कोई आवश्यकता नहीं है कि हैश फ़ंक्शन विशेषण हो। उदाहरण के लिए, कई मेमोरी-एड्रेस-आधारित हैश फ़ंक्शन केवल मेमोरी संरेखण के कारण 2 की कुछ छोटी शक्ति के गुणकों का उत्पादन कर सकते हैं, जिसमें पायथन के पुराने संस्करणों में डिफ़ॉल्ट ऑब्जेक्ट हैश भी शामिल है। कई हैश फ़ंक्शंस में कोडोमैन की तुलना में एक छोटा डोमेन भी होता है, इसलिए वे वैसे भी विशेषण नहीं हो सकते हैं।
user2357112

3
@ mbomb007 - वास्तव में, दिए गए अंग्रेजी भाषा के शब्द हैं, जहां से कहीं अधिक संख्या मूल्य [0, 2**24-1]हैं, यह एक हैश बनाने के लिए गणितीय रूप से असंभव होगा जहां उस सीमा में हर एक मूल्य संभव था।
डारेल हॉफमैन

7

सीजाम, 6273

{49f^245b16777213%}

49 के साथ प्रत्येक वर्ण XOR , x, y + 245x + y के माध्यम से परिणामी स्ट्रिंग को कम करते हैं , और अवशेषों modulo 16,777,213 (सबसे बड़ा 24-बिट प्राइम) लेते हैं ।

स्कोरिंग

$ cat hash.cjam
qN% {49f^245b16777213%} %N*N
$ all=$(wc -l < british-english-huge.txt)
$ unique=$(cjam hash.cjam < british-english-huge.txt | sort | uniq -u | wc -l)
$ echo $[all - unique]
6273

मैंने आपके वर्णन से अजगर में एल्गोरिथ्म को फिर से लागू किया। मैं पुष्टि कर सकता हूं कि आपका स्कोर आधिकारिक स्कोर गणना के साथ जांचता है।
कैस्परड

7

जावास्क्रिप्ट (ईएस 6), 6389

हैश फ़ंक्शन (105 बाइट्स):

s=>[...s.replace(/[A-Z]/g,a=>(b=a.toLowerCase())+b+b)].reduce((a,b)=>(a<<3)*28-a^b.charCodeAt(),0)<<8>>>8

स्कोरिंग फ़ंक्शन (NodeJS) (170 बाइट्स):

h={},c=0,l=require('fs').readFileSync(process.argv[2],'utf8').split('\n').map(a=>h[b=F(a)]=-~h[b])
for(w of Object.getOwnPropertyNames(h)){c+=h[w]>1&&h[w]}
console.log(c)

कॉल के रूप में node hash.js dictionary.txt, जहां hash.jsस्क्रिप्ट है, dictionary.txtडिक्शनरी टेक्स्ट फ़ाइल है (अंतिम न्यूलाइन के बिना), और Fहैशिंग फ़ंक्शन के रूप में परिभाषित किया गया है।

हैशिंग फंक्शन से 9 बाइट शेविंग करने के लिए धन्यवाद नील!


क्यों एक काम करने के लिए? इसके अलावा, ((...)>>>0)%(1<<24)आप के बजाय शायद उपयोग कर सकते हैं (...)<<8>>>8
नील

@ नील क्योंकि वर्णमाला, और मैं उबाऊ हूँ = पी भी, अच्छी बिटवाइज़ मैथिंग! 7 बाइट्स =) को बचाया
Mwr247

अच्छी बात यह है कि यह कोड गोल्फ नहीं है, अन्यथा मुझे आपको अप्रयुक्त चर के लिए भी डिंग करना होगा i
नील

@ नील क्रैप> _ <मैं कुछ वैकल्पिक हैशिंग विचारों का परीक्षण करते समय उपयोग करता हूं और एक्सडी को हटाना भूल गया हां, अच्छी बात यह है कि यह एक गोल्फ नहीं है, हालांकि सभी एक ही है, मुझे बहुत अच्छा लगेगा अगर मैं हैश और स्कोरिंग फ़ंक्शन को संकुचित कर सकता हूं उसी 140 बाइट्स में, इसलिए हर बिट मदद करता है;)
Mwr247

1
@ Sp3000 Gah, मैं देख रहा हूं कि आपका क्या मतलब है। खान उन लोगों की गिनती नहीं कर रहा है जो शुरू में टकराव पाए जाने पर वहां होते हैं। मैं ठीक कर दूँगा।
Mwr247

5

गणितज्ञ, ६४3३

अगला कदम ... चरित्र कोड को समेटने के बजाय हम उन्हें आधार संख्या -151 के अंकों के रूप में मानते हैं, उन्हें मोड्यूल 2 24 लेने से पहले ।

hash[word_] := Mod[FromDigits[ToCharacterCode @ word, 151], 2^24]

यहाँ टकराव की संख्या निर्धारित करने के लिए एक छोटी स्क्रिप्ट है:

Total[Last /@ DeleteCases[Tally[hash /@ words], {_, 1}]]

मैंने बस सभी आधारों को व्यवस्थित रूप से 1आगे की कोशिश की है , और अब तक आधार 151 ने सबसे कम टकरावों को जन्म दिया है। मैं स्कोर को थोड़ा और नीचे लाने के लिए कुछ और कोशिश करूंगा, लेकिन परीक्षण थोड़ा धीमा है।


5

जावास्क्रिप्ट (ईएस 5), 6765

यह सीआरसी 24 को 140 बाइट्स तक मुंडाया गया है। अधिक गोल्फ सकता है, लेकिन मेरा जवाब पाने के लिए चाहता था :)

function(s){c=0xb704ce;i=0;while(s[i]){c^=(s.charCodeAt(i++)&255)<<16;for(j=0;j++<8;){c<<=1;if(c&0x1000000)c^=0x1864cfb}}return c&0xffffff}

नोड में मान्य। जेएस:

var col = new Array(16777215);
var n = 0;

var crc24_140 = 
function(s){c=0xb704ce;i=0;while(s[i]){c^=(s.charCodeAt(i++)&255)<<16;for(j=0;j++<8;){c<<=1;if(c&0x1000000)c^=0x1864cfb}}return c&0xffffff}

require('fs').readFileSync('./dict.txt','utf8').split('\n').map(function(s){ 
    var h = crc24_140(s);
    if (col[h]===1) {
        col[h]=2;
        n+=2;
    } else if (col[h]===2) {
        n++;
    } else {
        col[h]=1;
    }
});

console.log(n);

प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है!
एलेक्स ए।

... और हार्दिक स्वागत है @AlexA के लिए!
बाइनरीमैक्स

5

अजगर, 340053

एक भयानक एल्गोरिथ्म से एक भयानक स्कोर, यह उत्तर एक छोटी पायथन स्क्रिप्ट देने के लिए अधिक मौजूद है जो स्कोरिंग प्रदर्शित करता है।

H=lambda s:sum(map(ord, s))%(2**24)

स्कोर करने के लिए:

hashes = []
with open("british-english-huge.txt") as f:
    for line in f:
        word = line.rstrip("\n")
        hashes.append(H(word))

from collections import Counter
print(sum(v for k, v in Counter(hashes).items() if v > 1))

1
यह स्कोरिंग कोड का उपयोग करने के लिए उपयोगी हो सकता है कि हैश फ़ंक्शन से वापसी मान अनुमत सीमा में पूर्णांक है।
कैस्परद

4

पायथन, 6390 6376 6359

H=lambda s:reduce(lambda a,x:a*178+ord(x),s,0)%(2**24-48)

मार्टिन बंटनर के जवाब के लिए एक मामूली संशोधन माना जा सकता है ।


3
@ mbomb007 यह सच नहीं है। यदि आपका फ़ंक्शन हमेशा 4 आउटपुट करता है, तो यह अभी भी रेंज में आउटपुट कर रहा है [0, 2**24-1]। केवल एक चीज जिसकी अनुमति नहीं है वह किसी भी संख्या को उस सीमा के अंदर आउटपुट नहीं कर रही है, जैसे -1या 2**24
orlp

3

पायथन, 9310


हाँ, सबसे अच्छा नहीं है, लेकिन कम से कम यह कुछ है। जैसा कि हम क्रिप्टो में कहते हैं, कभी भी अपना स्वयं का हैश फ़ंक्शन न लिखें

यह बिल्कुल 140 बाइट्स लंबा है, साथ ही साथ।

F=lambda x,o=ord,m=map:int((int(''.join(m(lambda z:str(o(z)^o(x[-x.find(z)])^o(x[o(z)%len(x)])),x)))^(sum(m(int,m(o,x))))^o(x[-1]))%(2**24))

2

मतलाब, 30828 8620 6848

यह प्रत्येक ascii चरित्र / स्थिति कॉम्बो को एक प्रमुख संख्या निर्दिष्ट करके और प्रत्येक शब्द modulo के लिए उनके उत्पाद की गणना करके हैश का निर्माण 2 ^ 24 से छोटा है। ध्यान दें कि परीक्षण के लिए मैंने कॉल को सीधे लूप से पहले परीक्षक में बाहर ले जाने के लिए स्थानांतरित किया और इसे हैश फ़ंक्शन में पास कर दिया, क्योंकि इसने इसे लगभग 1000 के एक कारक द्वारा फैलाया था, लेकिन यह संस्करण काम करता है, और स्व-निहित है। यह लगभग 40 वर्णों से अधिक लंबे शब्दों के साथ क्रैश हो सकता है।

function h = H(s)
p = primes(1e6);
h = 1;
for i=1:length(s)
    h = mod(h*p(double(s(i))*i),16777213);
end
end

परीक्षक:

clc
clear variables
close all

file = fopen('british-english-huge.txt');
hashes = containers.Map('KeyType','uint64','ValueType','uint64');

words = 0;
p = primes(1e6);
while ~feof(file)
    words = words + 1;
    word = fgetl(file);
    hash = H(word,p);
    if hashes.isKey(hash)
        hashes(hash) = hashes(hash) + 1;
    else
        hashes(hash) = 1;
    end
end

collisions = 0;
for key=keys(hashes)

    if hashes(key{1})>1
        collisions = collisions + hashes(key{1});
    end
end

यदि आप अपने कार्यक्रम में स्थान बचाना चाहते हैं, तो आपको अपना चार्ट doubleस्पष्ट रूप से नहीं बदलना होगा । इसके अलावा आप के numelबजाय उपयोग कर सकते हैं length। सुनिश्चित नहीं हैं कि आप उन सभी अतिरिक्त बाइट्स के साथ क्या करेंगे हालांकि!
स्वेअर

1

रूबी, 9309 टक्कर, 107 बाइट्स

def hash(s);require'prime';p=Prime.first(70);(0...s.size).reduce(0){|a,i|a+=p[i]**(s[i].ord)}%(2**24-1);end 

एक अच्छा दावेदार नहीं है, लेकिन मैं अन्य प्रविष्टियों से एक अलग विचार तलाशना चाहता था।

स्ट्रिंग के पहले n पदों पर पहले n primes असाइन करें, फिर सभी अभाज्य [i] ** (स्ट्रिंग का icii कोड], फिर mod 2 ** 24-1 का योग करें।


1

जावा 8, 7054 6467

यह बिलियन java.lang.String.hashCode फ़ंक्शन द्वारा प्रेरित (लेकिन इससे कॉपी नहीं किया गया) है, इसलिए नियम # 2 के अनुसार इसे अस्वीकार करने के लिए स्वतंत्र महसूस करें।

w -> { return w.chars().reduce(53, (acc, c) -> Math.abs(acc * 79 + c)) % 16777216; };

स्कोर करने के लिए:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

public class TweetableHash {
    public static void main(String[] args) throws Exception {
        List<String> words = Files.readAllLines(Paths.get("british-english-huge.txt"));

        Function<String, Integer> hashFunc = w -> { return w.chars().reduce(53, (acc, c) -> Math.abs(acc * 79 + c)) % 16777216; };

        Map<Integer, Integer> hashes = new HashMap<>();
        for (String word : words) {
            int hash = hashFunc.apply(word);
            if (hash < 0 || hash >= 16777216) {
                throw new Exception("hash too long for word: " + word + " hash: " + hash);
            }

            Integer numOccurences = hashes.get(hash);
            if (numOccurences == null) {
                numOccurences = 0;
            }
            numOccurences++;

            hashes.put(hash, numOccurences);
        }

        int numCollisions = hashes.values().stream().filter(i -> i > 1).reduce(Integer::sum).get();
        System.out.println("num collisions: " + numCollisions);
    }
}

@muddyfish क्या आप वर्तमान संस्करण देख सकते हैं? मुझे लगता है कि ive ने 3-रास्ता-टक्करों के लिए जिम्मेदार है और अभी भी एक ही परिणाम प्राप्त कर रहा है।
बेवुस्तिसिन

यह तीन-तरफ़ा टक्करों के लिए जिम्मेदार नहीं है। यदि आप के hashesसाथ प्रतिस्थापित करते हैं Map<Integer, Integer> hashes = new HashMap<>()और फिर प्रत्येक हैश के लिए शब्दों की संख्या की गणना करते हैं, तो आप उनके लिए सही ढंग से हिसाब कर सकते हैं।
पीटर टेलर

आपका स्कोरिंग अभी भी गलत दिखता है। मुझे लगता है कि एक सही स्कोर की गणना करने के लिए, आपको numHashes + numCollisions आउटपुट करना होगा। (जो मुझे लगता है कि आप एक यादृच्छिक ओरेकल के लिए मेरे 6832 अनुमान के करीब होंगे।)
कास्परड

इस के लिए ग्रेडिंग भागों को संशोधित करें: pastebin.com/nLeg4qut
TheNumberOne

हाँ, ग्रेडिंग तय की और यह अब और अधिक उचित मूल्य की तरह लग रहा है, ty
Bewusstsein

1

पायथन, 6995 6862 6732

बस एक साधारण RSA फ़ंक्शन। सुंदर लंगड़ा, लेकिन कुछ जवाब धड़कता है।

M=0x5437b3a3b1
P=0x65204c34d
def H(s):
    n=0
    for i in range(len(s)):
        n+=pow(ord(s[i]),P,M)<<i
    return n%(8**8)

1

सी ++: 7112 6694 6483 6479 6412 6339 टक्कर, 90 बाइट्स

मैंने अपने गुणांक सरणी के लिए एक भोला आनुवांशिक एल्गोरिदम लागू किया। मैं इस कोड को अपडेट करूंगा क्योंकि यह बेहतर है। :)

int h(const char*s){uint32_t t=0,p=0;while(*s)t="cJ~Z]q"[p++%6]*t+*s++;return t%16777213;}

परीक्षण समारोह:

int main(void)
{
    std::map<int, int> shared;

    std::string s;
    while (std::cin >> s) {
        shared[h(s.c_str())]++;
    }

    int count = 0;
    for (auto c : shared) {
        if ((c.first & 0xFFFFFF) != c.first) { std::cerr << "invalid hash: " << c.first << std::endl; }
        if (c.second > 1) { count += c.second; }
    }

    std::cout << count << std::endl;
    return 0;
}

1

सी #, 6251 6335

int H(String s){int h = 733;foreach (char c in s){h = (h * 533 + c);}return h & 0xFFFFFF;}

अब तक खोजे गए 533 और 733 889 और 155 सभी में से सबसे अच्छा स्कोर देते हैं।


1

tcl

88 बाइट्स, 6448/3233 टक्कर

मैं देख रहा हूं कि लोग या तो टकराने वाले शब्दों की संख्या गिन रहे हैं, या फिर गैर-खाली बकेट में रखे गए शब्दों की संख्या। मैं दोनों गणना देता हूं - पहला समस्या विनिर्देश के अनुसार है, और दूसरा वह है जो अधिक पोस्टर रिपोर्टिंग कर रहा है।

# 88 bytes, 6448 collisions, 3233 words in nonempty buckets

puts "[string length {proc H w {incr h;lmap c [split $w {}] {set h [expr (2551*$h+[scan $c %c])%2**24]};set h}}] bytes"

proc H w {incr h;lmap c [split $w {}] {set h [expr (2551*$h+[scan $c %c])%2**24]};set h}

# change 2551 above to:
#   7: 85 bytes, 25839 colliding words, 13876 words in nonempty buckets
#   97: 86 bytes, 6541 colliding words, 3283 words in nonempty buckets
#   829: 87 bytes, 6471 colliding words, 3251 words in nonempty buckets


# validation program

set f [open ~/Downloads/british-english-huge.txt r]
set words [split [read $f] \n]
close $f

set have {};                        # dictionary whose keys are hash codes seen
foreach w $words {
    if {$w eq {}} continue
    set h [H $w]
    dict incr have $h
}
set coll 0
dict for {- count} $have {
    if {$count > 1} {
        incr coll $count
    }
}
puts "found $coll collisions"

2
स्कोर की गणना के लिए गलत तरीके का उपयोग करते हुए उत्तर कहां से देखते हैं? बहुत कुछ हो चुका है, लेकिन सालों पहले उन्हें ठीक कर दिया गया या हटा दिया गया। मुझे ६००० से कम स्कोर वाले चार उत्तर दिखाई देते हैं क्योंकि उन चार उत्तरों को वास्तव में ऐसे कम स्कोर के लिए अनुकूलित किया गया है।
कैस्परल्ड

1
जहाँ तक मैं बता सकता हूँ, आपका कोड है proc H w {incr h;lmap c [split $w {}] {set h [expr (2551*$h+[scan $c %c])%2**24]};set h}... ठीक है?
आउटगोल्फ

@EriktheOutgolfer: हाँ, यह है
सर्गियोल जूल

1
I दूसरी @kasperd: क्या आप बता सकते हैं कि प्रश्नवाचक युक्ति के अनुसार टकरावों का क्या जवाब है? क्या आपने वास्तव में उन्हें चलाने की कोशिश की?
सर्गिओल

1

पायथन 3, 89 बाइट्स, 6534 हैश टक्कर

def H(x):
 v=846811
 for y in x:
  v=(972023*v+330032^ord(y))%2**24
 return v%2**24

यहां जो भी बड़े मैजिक नंबर आपको दिखते हैं, वे फेक कंटेंट हैं।


1

जावास्क्रिप्ट, 121 बाइट्स, 3268 3250 3244 6354 (3185) टक्कर

s=>{v=i=0;[...s].map(z=>{v=((((v*13)+(s.length-i)*7809064+i*380886)/2)^(z.charCodeAt(0)*266324))&16777215;i++});return v}

पैरामीटर (13, 7809064, 380886, 2, 266324) परीक्षण और त्रुटि से हैं।

अभी भी अनुकूलन मुझे लगता है, और अतिरिक्त मापदंडों को जोड़ने के लिए अभी भी जगह है, आगे अनुकूलन के लिए काम कर रहा है ...

सत्यापन

hashlist = [];
conflictlist = [];
for (x = 0; x < britain.length; x++) {
    hash = h(britain[x]);                      //britain is the 340725-entry array
    hashlist.push(hash);
}

conflict = 0; now_result = -1;
(sortedlist = sort(hashlist)).map(v => {
    if (v == now_result) {
        conflict++;
        conflictlist.push(v);
    }
    else
        now_result = v;
});

console.log(conflictlist);

var k = 0;
while (k < conflictlist.length) {
    if (k < conflictlist.length - 1 && conflictlist[k] == conflictlist[k+1])
        conflictlist.splice(k,1);
    else
        k++;
}

console.log(conflict + " " + (conflict+conflictlist.length));

3268> 3250 - 380713 से 380560 तक तीसरे पैरामीटर को बदला।

3250> 3244 - 380560 से 380886 तक तीसरे पैरामीटर को बदला।

३२४४> ६३५४ -> 2nd० ९ १४३ से 6464० ९ ०६४ तक द्वितीय पैरामीटर को बदला, और पाया कि मैंने गलत गणना पद्धति का उपयोग किया है;


1

यहां कुछ समान निर्माण हैं, जो काफी "बीजनीय" हैं और वृद्धिशील पैरामीटर अनुकूलन को संभव बनाते हैं। लानत है 6k से कम मुश्किल है! मान लें कि स्कोर का मतलब 6829 है और 118 का std है। मैंने ऐसे कम स्कोर को यादृच्छिक रूप से प्राप्त करने की संभावना की भी गणना की है।

क्लोजर ए, 6019, पीआर = 1: 299.5e9

 #(reduce(fn[r i](mod(+(* r 811)i)16777213))(map *(cycle(map int"~:XrBaXYOt3'tH-x^W?-5r:c+l*#*-dtR7WYxr(CZ,R6J7=~vk"))(map int %)))

क्लोजर बी, 6021, पीआर = 1: 266.0e9

#(reduce(fn[r i](mod(+(* r 263)i)16777213))(map *(cycle(map int"i@%(J|IXt3&R5K'XOoa+Qk})w<!w[|3MJyZ!=HGzowQlN"))(map int %)(rest(range))))

क्लोजर सी, 6148, पीआर = 1: 254.0e6

#(reduce(fn[r i](mod(+(* r 23)i)16777213))(map *(cycle(map int"ZtabAR%H|-KrykQn{]u9f:F}v#OI^so3$x54z2&gwX<S~"))(for[c %](bit-xor(int c)3))))

क्लोजर, 6431, पीआर = 1: 2.69e3 (कुछ अलग)

#(mod(reduce bit-xor(map(fn[i[a b c]](bit-shift-left(* a b)(mod(+ i b c)19)))(range)(partition 3 1(map int(str"w"%"m")))))16776869)

यह मेरा मूल तदर्थ हैश फ़ंक्शन था, इसमें चार ट्यून करने योग्य पैरामीटर हैं।


कम स्कोर की चाल एक स्ट्रिंग स्थिरांक है जिसमें प्रत्येक वर्ण को स्वतंत्र रूप से अनुकूलित किया जा सकता है, बिना आपके द्वारा अन्य पात्रों के लिए किए गए अनुकूलन को बर्बाद किए बिना।
कास्परड

हाँ, मैंने पहले केवल छोटे तारों के लिए अनुकूलन करने की कोशिश की, क्योंकि "एंट्रॉपी" स्ट्रिंग में अधिक पात्रों को जोड़ने से उन पर कोई असर नहीं पड़ता (एक बार गुणक rतय हो जाने के बाद)। लेकिन फिर भी मेरी खोज एल्गोरिथ्म अनिवार्य रूप से क्रूर बल है, और मुझे यकीन नहीं है कि क्या गुणक का प्रारंभिक विकल्प rमहत्वपूर्ण है या नहीं।
निकोइरह

हो सकता है कि सिर्फ ASCII मूल्यों को गुणा करने से खेल में पर्याप्त प्रवेश न हो। कई अच्छी तरह से स्कोरिंग एल्गोरिदम के लिए फार्म है लगता है f(n) % (8^8 - g(n))
निकोनिरह

एक उत्तर है जो बताता है कि यह 3677 जितना कम हो गया है। इससे भी कम स्कोर करने वाले लोग कम स्पष्टीकरण देते हैं।
कैस्पर

0

रूबी, 6473 टक्कर, 129 बाइट्स

h=->(w){@p=@p||(2..999).select{|i|(2..i**0.5).select{|j|i%j==0}==[]};c=w.chars.reduce(1){|a,s|(a*@p[s.ord%92]+179)%((1<<24)-3)}}

@P वेरिएबल 999 से नीचे के सभी प्राइमों से भरा है।

यह आस्की मूल्यों को प्रिम्स नंबरों में परिवर्तित करता है और उनके उत्पाद को एक बड़े प्राइम में ले जाता है। 179 का ठगना कारक इस तथ्य से संबंधित है कि मूल एल्गोरिथम एनाग्राम को खोजने के लिए उपयोग किया गया था, जहां सभी शब्द जो समान अक्षरों के पुनर्व्यवस्था होते हैं, उन्हें समान हैश मिलता है। कारक को लूप में जोड़कर, यह बनाता है कि एनाग्राम के अलग-अलग कोड हैं।

मैं कोड को छोटा करने के लिए खराब प्रदर्शन की कीमत पर ** 0.5 (प्राइम के लिए sqrt टेस्ट) निकाल सकता था। मैं भी नौ और पात्रों को हटाने के लिए लूप में प्राइम नंबर फाइंडर निष्पादित कर सकता था, जिससे 115 बाइट्स निकल जाएंगे।

परीक्षण करने के लिए, निम्नलिखित सीमा 1 से 300 में ठगना कारक के लिए सर्वोत्तम मूल्य खोजने की कोशिश करता है। यह मान लेता है कि शब्द फ़ाइल / tmp निर्देशिका में है:

h=->(w,y){
  @p=@p||(2..999).
    select{|i|(2..i**0.5). 
    select{|j|i%j==0}==[]};
  c=w.chars.reduce(1){|a,s|(a*@p[s.ord%92]+y)%((1<<24)-3)}
}

american_dictionary = "/usr/share/dict/words"
british_dictionary = "/tmp/british-english-huge.txt"
words = (IO.readlines british_dictionary).map{|word| word.chomp}.uniq
wordcount = words.size

fewest_collisions = 9999
(1..300).each do |y|
  whash = Hash.new(0)
  words.each do |w|
    code=h.call(w,y)
    whash[code] += 1
  end
  hashcount = whash.size
  collisions = whash.values.select{|count| count > 1}.inject(:+)
  if (collisions < fewest_collisions)
    puts "y = #{y}. #{collisions} Collisions. #{wordcount} Unique words. #{hashcount} Unique hash values"
    fewest_collisions = collisions
  end
end

1
स्कोर संदिग्ध लग रहा है। क्या आप वाकई सभी टकराने वाले शब्दों को गिन रहे हैं? पिछले कई उत्तर गलती से प्रत्येक टकराने वाले हैश मान के लिए केवल एक शब्द गिना।
कैस्परड

आप सही हो सकते हैं। मुझे इस बात पर विचार करना चाहिए कि मैंने कैसे गिना और देखा कि क्या यह आपकी परिभाषा के समान है। मैं गिन रहा हूं कि कितने शब्द हैं और घटाना है कि कितने अनूठे हैशकोड बनाए गए हैं। यदि A और B शब्द समान हैशकोड प्राप्त करते हैं, तो क्या यह एक या दो टकराव है? मैं इसे एक के रूप में गिनता हूं।
पॉल चेरोच

1
मैं स्कोरिंग फ़ंक्शन को परिभाषित नहीं करता था। मैंने इसे केवल उसी उपयोगकर्ता द्वारा पोस्ट किए गए उदाहरण के उत्तर से कॉपी किया, जिसने चुनौती पोस्ट की थी। अधिकांश उत्तरों में स्कोर 6273 और 6848 के बीच होते हैं। स्कोर की गणना में एक ही गलती करने वाले प्रत्येक व्यक्ति को लगभग आधे स्कोर की गणना करने के लिए कई उत्तर दिए गए हैं। (यदि तीन टकराने वाले शब्दों के मामले नहीं हैं तो सही स्कोर आधा है।)
कैस्पर

1
हां, मैंने वही गलती की। मैं बाद में अपने जवाब में संशोधन करूंगा। एक बस पकड़ने के लिए मिला।
पॉल चेरोच

स्कोरिंग तय किया।
पॉल चेरोच

0

tcl

# 91 बाइट्स, 6508 टक्कर

91 बाइट्स, 6502 टक्कर

proc H s {lmap c [split $s ""] {incr h [expr [scan $c %c]*875**[incr i]]};expr $h&0xFFFFFF}

कंप्यूटर अभी भी मूल्यांकन करने के लिए एक खोज कर रहा है यदि कोई मान है जो 147 875 बेस से कम टकराव का कारण बनता है , जो अभी भी रिकॉर्डिस्ट है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.