টুইটযোগ্য হ্যাশ ফাংশন চ্যালেঞ্জ


73

এই আপনি হ্যাশ ফাংশন লিখবেন 140 বাইট 1 বা তত কম উত্স কোডে। হ্যাশ ফাংশনটি অবশ্যই ইনপুট হিসাবে একটি এএসসিআইআই স্ট্রিং গ্রহণ করতে পারে এবং আউটপুট হিসাবে 24-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যা ([0, 2 24 -1]) ফেরত দেয় ।

আপনার হ্যাশ ফাংশনটি এই বৃহত ব্রিটিশ ইংরেজি অভিধান 2 এর প্রতিটি শব্দের জন্য মূল্যায়ন করা হবে । আপনার স্কোর হ'ল শব্দের পরিমাণ যা অন্য শব্দের সাথে (সংঘর্ষের) সাথে ভাগ করে h

সর্বনিম্ন স্কোর জয়, প্রথম পোস্টার দ্বারা বিচ্ছেদ টান।

পরীক্ষা ক্ষেত্রে

জমা দেওয়ার আগে, দয়া করে নীচের ইনপুটটিতে আপনার স্কোরিং স্ক্রিপ্টটি পরীক্ষা করুন:

duplicate
duplicate
duplicate
duplicate

যদি এটি 4 এর বাইরে অন্য কোনও স্কোর দেয় তবে এটি বগি।


বিধি স্পষ্টকরণ:

  1. আপনার হ্যাশ ফাংশনটি অবশ্যই একটি একক স্ট্রিংয়ে চলতে হবে, পুরো অ্যারে নয়। এছাড়াও, আপনার হ্যাশ ফাংশন ইনপুট স্ট্রিং এবং আউটপুট পূর্ণসংখ্যার চেয়ে অন্য কোনও আই / ও নাও করতে পারে।
  2. অন্তর্নির্মিত হ্যাশ ফাংশন বা অনুরূপ কার্যকারিতা (যেমন স্ক্র্যাম্বল বাইটে এনক্রিপশন) অনুমোদিত নয়।
  3. আপনার হ্যাশ ফাংশন অবশ্যই নির্দোষ হতে হবে।
  4. স্কোরিং ইনপুটটির জন্য বিশেষত অনুকূলকরণ করা বেশিরভাগ অন্যান্য প্রতিযোগিতার বিপরীতে অনুমোদিত is

1 আমি জানি টুইটার বাইটের পরিবর্তে অক্ষরগুলিকে সীমাবদ্ধ করে, তবে সরলতার জন্য আমরা এই চ্যালেঞ্জের সীমা হিসাবে বাইটগুলি ব্যবহার করব।
2 ডেবিয়ানের ব্রিটিশ-বিশাল থেকে পরিবর্তিত , কোনও অ- এসএসআইআই শব্দ অপসারণ করে।


11
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch's? কি ...?
লুইস মেন্ডো

8
@DonMuesli en.wikipedia.org/wiki/Llanfairpwllgwyngyll (মজার বিষয়: যে শব্দ জেলি এর বিল্ট-ইন কম্প্রেশন অভিধানে হয়)
মার্টিন Ender

8
আমি মনে করি আপনার অন্তর্নির্মিত অভিধানগুলি অস্বীকার করা উচিত।
ডেনিস

4
রেফারেন্সের জন্য: SHA-512 এর 24 এমএসবি নেওয়া 68৮১16 এর স্কোর অর্জন করতে পারে
ডেনিস

10
কিছু খাম-পরে-গণনা: D=340275শব্দ এবং R=2^24হ্যাশ আউটপুটগুলির সাথে, একটি এলোমেলো হ্যাশের একটি প্রত্যাশিত D^2/(2*R) = 3450সংঘর্ষযুক্ত জোড় রয়েছে, যার কয়েকটি ওভারল্যাপ করে। এখানে একটি প্রত্যাশিত D^3/(6*R^2) = 23সংঘবদ্ধ ত্রিপল এবং অপ্রাপ্ত সংখ্যক বৃহত্তর সংঘর্ষ, যার অর্থ এই ট্রিপলগুলি সম্ভবত বিচ্ছিন্ন হয়ে পড়ে। এটি একটি প্রত্যাশিত 6829শব্দ দেয় যা একটি হ্যাশ মান ভাগ করে, 70les ট্রিপলগুলিতে এবং বাকী জোড়ায়। স্ট্যান্ডার্ড বিচ্যুতিটি অনুমান করা হয় 118, তাই <6200এলোমেলো হ্যাশের সাথে পাওয়া প্রায় 5 টি সিগমা ইভেন্ট।
xnor

উত্তর:


11

ঠিক আছে ঠিক আছে আমি একটি গল্ফিং ভাষা শিখতে যাব।

সিজেম, 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 এর একটি প্লট, সংঘর্ষের শব্দের সংখ্যা, বনাম y, সর্বাধিক এক্স সংঘর্ষযুক্ত শব্দ পেতে প্রয়োজনীয় বাইটগুলির মধ্যে এনট্রপি। উদাহরণস্বরূপ, বিন্দু (২৮৩৫, ১৪০) আমাদের জানায় যে একটি এলোমেলো ফাংশন সর্বাধিক ২৮৩৫ টি সংঘর্ষের শব্দগুলি সম্ভাব্যতা 1/256 ** 140 দিয়ে সংঘটিত হয়, সুতরাং এর চেয়ে বেশি সম্ভাবনা নেই যে আমরা 140 এর চেয়ে বেশি কিছু করতে সক্ষম হব কোড বাইট।

চিত্রলেখ


তাত্ত্বিক সীমা সম্পর্কে দুর্দান্ত বিশ্লেষণ। এই তাত্ত্বিক সীমাটি হারাতে হলে সম্ভবত প্রশ্নের অন্তর্গত অভিধানটির জন্য অনুকূলিত বিল্টিন ফাংশনগুলির সাথে একটি ভাষা ব্যবহার করতে হবে (যা প্রতারণা হবে)। যদি ভাষাটিতে বিল্টিন ক্রিপ্টোগ্রাফিক হ্যাশ থাকে তবে সীমাটি সর্বোত্তম সমাধান অনুসন্ধানের জন্য আরও কম-বেশি গঠনমূলক পদ্ধতিতে রূপান্তরিত হতে পারে। এটি বিবেচনা করুন: $ এইচ (ডাব্লু || সি)% 2 ^ {24} $ যেখানে $ সি $ একটি বাইট স্ট্রিং ধ্রুবক। একটি এলোমেলো ওরাকল মডেল যা উচ্চ সম্ভাবনার সাথে সর্বোত্তম কাছাকাছি যেতে দেখানো যেতে পারে। অবশ্যই নিষ্ঠুরভাবে $ c b জোর করা সম্ভব হবে না।
ক্যাস্পার্ড

গ্রাফের সূত্রটি আপনি কীভাবে গণনা করলেন? সত্যিই আকর্ষণীয়!
নিকোনিহার

@ নিকোনিয়ার ডায়নামিক প্রোগ্রামিং। আসুন ( ডাব্লু , সি , এইচ ) ডাব্লু শব্দের সাথে একটি রাষ্ট্রের প্রতিনিধিত্ব করুন , যার মধ্যে সি এইচ স্বতন্ত্র হ্যাশগুলির সাথে সংঘর্ষ করছে এবং বাকী ডাব্লু - সি সমস্ত পৃথক হ্যাশ রয়েছে। যদি আমরা একটি এলোমেলো শব্দ যুক্ত করি, তবে সম্ভাব্যতা 1 - ( এইচ + ডাব্লু - সি ) / 2 ^ 24, বা ( ডাব্লু + 1, সি + 1, এইচ ) সম্ভাব্যতা h সহ রাষ্ট্রটি ( ডাব্লু + 1, সি , এইচ ) হয়ে যায় / 2 ^ 24, বা ( ডাব্লু + 1, সিসম্ভাব্যতা ( ডাব্লু - সি ) / 2 ^ 24 সহ + 2, এইচ + 1) । তারপর চূড়ান্ত এনট্রপি সঙ্গে graphed এক্স colliding শব্দ রাজ্যের (340275 এ সম্ভাব্যতার যোগফল লগ বেস 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 বাইটগুলি আমাকে পর্যাপ্ত উন্নতি দেবে যে স্ট্রিংটি তৈরির কাজটি শুরু করা উচিত worth আমি ইতিমধ্যে স্ট্রিং ধ্রুবকটি অনুকূলকরণের কয়েক ঘন্টা সিপিইউ সময় কাটিয়েছি।
ক্যাস্পার্ড

@ ডেনিস আমি অনুমান করি যে অতিরিক্ত কিছু বাইট আমাকে ধ্রুবক প্রয়োজনে পালানোর ক্ষেত্রে কিছু চরিত্র ব্যবহার করার স্বাধীনতা প্রদান করবে। এইভাবে আমি আবার স্ট্রিংটি পুনরায় নির্মাণ না করেই কয়েকটি অতিরিক্ত বাইট ব্যবহার করতে পারি।
ক্যাস্পার্ড

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 আমি লড়াই ছাড়াই ছাড়ছি না। তবে আমি মনে করি আমার আমার বর্তমান সমাধানটির অনুকূলকরণ বন্ধ করতে হবে এবং অন্য একটি পদ্ধতির সন্ধান করতে হবে, কারণ আমি যদি প্যারামিটারগুলি অনুকূল করতে আমার বর্তমান পদ্ধতির ব্যবহার চালিয়ে যাই তবে আমি আপনাকে পরাজিত করব না। আমি একবার আপনার প্রহার করার পরে আমি আমার সমাধানটিতে একটি সম্পাদনা নিয়ে ফিরে আসব ....
ক্যাস্পার্ড

@ ক্যাস্পার্ড: দুর্দান্ত, এটিকে চালিয়ে দিন। :
পি

1
পছন্দ করুন
ASCII- কেবল

@ অ্যান্ডারস ক্যাসরগ আমি আমার প্যারামিটার অনুসন্ধানগুলি অনেক বেশি গতিতে পরিচালিত করেছি। এবং আমি এমন একটি প্রতিবন্ধকতা সরিয়েছি যা আমার অনুসন্ধানকে সাবঅস্টিমাল সমাধানগুলিতে আটকে রাখছিল। তবে আমি এখনও এটিকে 4885 এর চেয়ে ভাল কিছু করতে পারিনি। আমি কেন এটিকে আর তৈরি করতে পারছি না তা নিয়ে কিছুটা চিন্তা করার পরে হঠাৎ বুঝতে পারলাম আমার সমাধানের মধ্যে কী ভুল এবং এটি কীভাবে ঠিক করা যায়। এখন আপনার সমাধানে অ্যাফাইন রূপান্তরটি আমার কাছে সঠিক ধারণা দেয়। আমি মনে করি যে কেবলমাত্র আমি ধরতে পারার একমাত্র উপায় হ'ল নিজেই একটি অ্যাফাইন ট্রান্সফর্মেশন ব্যবহার করা।
ক্যাস্পার্ড

1
@ ক্যাস্পার্ড: খুব সুন্দর। n%(8**8-ord('…'[n%70]))অন্যান্য প্যারামিটার পরিবর্তন ছাড়াই আরও ভাল স্ট্রিংয়ের সন্ধান করার সময় , আমি কেবল 4995-তে পৌঁছাতে সক্ষম হয়েছি, সুতরাং দেখে মনে হচ্ছে আপনার নতুন অপটিমাইজারটি আমার কাছে গেছে। এখন এটি আরও আকর্ষণীয় হয়ে ওঠে!
অ্যান্ডারস ক্যাসরগ

16

সিজেম, 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*+}

এই পদ্ধতিটি ডোমেন এবং কোডোমেনকে ১১০ টি বিচ্ছিন্ন সেটে বিভক্ত করে এবং প্রতিটি জুটির জন্য কিছুটা আলাদা হ্যাশ ফাংশন সংজ্ঞায়িত করে।

স্কোরিং / যাচাইকরণ

$ 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পাইথন বন্দরটিতে কি সিজেএম অন্তর্নির্মিত মিল রয়েছে?
ক্যাস্পার্ড

হ্যাঁ. এটি সিজেমের b(বেস রূপান্তর)।
ডেনিস

আপনার স্কোরিং প্রক্রিয়া কি ব্যাশে আছে?
গামারকর্পস

@ গ্যামার কর্পস হ্যাঁ, এটি বাশ।
ডেনিস

11

পাইথন, 6446 6372


এই সমাধানটি পূর্ববর্তী সমস্ত এন্ট্রিগুলির তুলনায় কম সংঘর্ষের গণনা অর্জন করে এবং কোডের জন্য অনুমোদিত 140 বাইটের মধ্যে কেবল 44 টির দরকার:

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

2
@ mbomb007 orlp এর নিজস্ব জমা দেয় %(2**24-1)তাই আমি মনে করি স্পষ্টতার জন্য জিজ্ঞাসা করা ভাল হতে পারে
Sp3000

12
@ mbomb007 চ্যালেঞ্জটি এমন কোনও কথা বলে না। এটি বলে যে ফাংশনটি অবশ্যই ASCII স্ট্রিংটি ইনপুট হিসাবে গ্রহণ করে এবং সেই ব্যাপ্তিতে একটি পূর্ণসংখ্যা আউটপুট করে। আপনি আমার ফাংশনটি কোনও ইনপুট দিই না কেন, আউটপুটটি এই ব্যাপ্তিতে থাকবে। শব্দ ফাংশনের গাণিতিক সংজ্ঞাটির জন্য প্রতিটি অনুমোদিত আউটপুট তৈরি করার প্রয়োজন হয় না। যদি আপনি গাণিতিক শব্দটি ব্যবহার করতে চান তবে এটি ছিল সার্জেক্টিভ ফাংশন। তবে সুরজেক্ট শব্দটি প্রয়োজনীয়তা হিসাবে ব্যবহৃত হয়নি।
ক্যাস্পার্ড

@ এমবিম্ব ২০০7: হ্যাশ ফাংশনগুলি সার্জেক্টিভ হওয়ার কোনও প্রয়োজন নেই। উদাহরণস্বরূপ, অনেক মেমরি-ঠিকানা-ভিত্তিক হ্যাশ ফাংশন পাইথনের পুরানো সংস্করণগুলিতে ডিফল্ট অবজেক্ট হ্যাশ সহ মেমরি অ্যালাইনমেন্টের কারণে কেবল 2 এর কিছু ক্ষুদ্র ক্ষুদ্রের বহুগুণ উত্পাদন করতে পারে। অনেক হ্যাশ ফাংশন এমনকি কোডোমেনের চেয়ে একটি ছোট ডোমেন থাকে, তাই তারা যাইহোক আক্রমণাত্মক হতে পারে না।
ব্যবহারকারী 2357112

3
@ mbomb007 - প্রকৃতপক্ষে, ইংরাজী ভাষার শব্দের চেয়ে অনেক বেশি সংখ্যক মান [0, 2**24-1]রয়েছে, এমন একটি হ্যাশ তৈরি করা গাণিতিকভাবে অসম্ভব হবে যেখানে এই পরিসরের প্রতিটি মান সম্ভব ছিল।
ড্যারেল হফম্যান

7

সিজেম, 6273

{49f^245b16777213%}

প্রতিটি অক্ষর 49 এর সাথে XOR করুন , এক্স, y y 245x + y এর মাধ্যমে ফলাফলটি স্ট্রিং হ্রাস করুন এবং 16,777,213 (বৃহত্তম বৃহত্তম 24-বিট প্রাইম) এর অবশিষ্টাংশটি নিন take

স্কোরিং

$ 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

জাভাস্ক্রিপ্ট (ES6), 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

স্কোরিং ফাংশন (নোডজেএস) (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অভিধান টেক্সট ফাইল (চূড়ান্ত সম্পর্কে newline ছাড়া), এবং Fহ্যাশ ফাংশন হিসাবে সংজ্ঞায়িত করা হয়।

হ্যাশিংয়ের কাজটি বন্ধ করে 9 টি বাইট শেভ করার জন্য নীলকে ধন্যবাদ!


কেন একটি নিয়োগ? এছাড়াও, আপনার পরিবর্তে ((...)>>>0)%(1<<24)সম্ভবত ব্যবহার করতে পারেন (...)<<8>>>8
নীল

@ নীল কারণ বর্ণমালা, এবং আমি বিরক্তিকর = পি এছাড়াও, দুর্দান্ত বিটওয়াইজ ম্যাথিং! এটি 7 বাইট =) সংরক্ষণ করেছে
Mwr247

ভাল কথা এটি কোড গল্ফ নয়, অন্যথায় আপনাকে অব্যবহৃত ভেরিয়েবলের iজন্যও ডিং করতে হবে ।
নীল

@ নীল ক্রেপ> _ <আমি কিছু বিকল্প হ্যাশিং ধারণাগুলি পরীক্ষা করার সময় এবং এক্সডি অপসারণ করতে ভুলে গিয়েছি হ্যাঁ, ভাল জিনিস এটি কোনও গল্ফ নয়, যদিও সব একই, আমি যদি হ্যাশ এবং স্কোরিং ফাংশনগুলি সংকুচিত করতে পারি তবে আমি এটি পছন্দ করব I'd একই 140 বাইটে, যাতে প্রতিটি বিট সাহায্য করে;)
Mwr247

1
@ এসপি 3000 গাহ, আমি আপনাকে বোঝাতে চাইছি। সংঘর্ষের সন্ধান পেলে আমার প্রাথমিকভাবে সেখানে থাকা লোকদের গণনা করা হচ্ছে না। আমি এটা ঠিক করব।
Mwr247

5

গণিত, 6473

পরবর্তী পদক্ষেপ ... চরিত্রের কোডগুলি সংশ্লেষের পরিবর্তে আমরা তাদেরকে মডুলো 2 24 নেওয়ার আগে, একটি বেস -151 সংখ্যার অঙ্ক হিসাবে গণ্য করি ।

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

সংঘর্ষের সংখ্যা নির্ধারণের জন্য এখানে একটি শর্ট স্ক্রিপ্ট রয়েছে:

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

আমি 1এখন থেকে সমস্ত ঘাঁটি পদ্ধতিগতভাবে চেষ্টা করেছি এবং এখন পর্যন্ত বেস 151 এর মধ্যে সবচেয়ে কম সংঘর্ষের ফলস্বরূপ। স্কোরটি আরও কিছুটা নামিয়ে আনার জন্য আমি আরও কয়েকটি চেষ্টা করব, তবে পরীক্ষাটি কিছুটা ধীর গতির।


5

জাভাস্ক্রিপ্ট (ES5), 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);

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্বাগতম!
অ্যালেক্স এ।

... এবং উষ্ণ স্বাগত @ অ্যালেক্সার জন্য ধন্যবাদ!
বাইনারিম্যাক্স

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


হ্যাঁ, সেরা নয়, তবে অন্তত এটি কিছু is যেমনটি আমরা ক্রিপ্টোতে বলি, কখনও নিজের হ্যাশ ফাংশনটি লিখবেন না

এটি ঠিক 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

এটি প্রতিটি আসকি চরিত্র / অবস্থান কম্বোকে একটি মৌলিক সংখ্যা নির্ধারণ করে এবং প্রতিটি শব্দের জন্য 2 than 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 

ভাল প্রতিযোগী নয়, তবে আমি অন্যান্য এন্ট্রি থেকে আলাদা ধারণাটি অন্বেষণ করতে চেয়েছিলাম।

প্রথম এন প্রাইমগুলি স্ট্রিংয়ের প্রথম এন পজিশনে নির্ধারণ করুন, তারপরে সমস্ত প্রাইম [i] ** (স্ট্রিংয়ের আসকি কোড [i]), তারপরে মোড 2 ** 24-1 যোগ করুন।


1

জাভা 8, 7054 6467

এটি বিল্টিন জাভা.এল.আর. স্ট্রিং.হ্যাশকোড ফাংশন দ্বারা (তবে অনুলিপি করা হয়নি) দ্বারা অনুপ্রাণিত, সুতরাং নিয়ম # 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);
    }
}

@ মুডিফিশ আপনি কি বর্তমান সংস্করণটি পরীক্ষা করে দেখতে পারেন? আমি মনে করি ive 3-মুখী সংঘর্ষের জন্য গণ্য হয়েছে এবং এখনও একই ফলাফল পাচ্ছে।
বেউসস্টেইন

এটি ত্রি-মুখী সংঘর্ষের জন্য অ্যাকাউন্ট করে না। আপনি যদি প্রতিস্থাপন hashesকরে Map<Integer, Integer> hashes = new HashMap<>()এবং তারপরে প্রতিটি হ্যাশের শব্দের সংখ্যা গণনা করেন, আপনি সেগুলির জন্য সঠিকভাবে অ্যাকাউন্ট করতে পারেন।
পিটার টেলর

আপনার স্কোরিং এখনও ভুল দেখাচ্ছে। আমি মনে করি একটি সঠিক স্কোর গণনা করতে, আপনাকে numHashes + numCollisions দিতে হবে। (যা আমি মনে করি আপনাকে এলোমেলো
ওরাকেলের

এটিকে গ্রেডিংয়ের অংশগুলি সংশোধন করুন: পেস্টবিন.
com

হ্যাঁ, গ্রেডিং ঠিক করা হয়েছে এবং এটি এখন অনেক বেশি যুক্তিসঙ্গত মানের মতো দেখাচ্ছে, টাই
বেউসস্টেইন

1

পাইথন, 6995 6862 6732

কেবল একটি সাধারণ আরএসএ ফাংশন। বেশ খোঁড়া, তবে কিছু জবাব দেয়।

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 6312 সংঘর্ষ, 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
স্কোর গণনার জন্য ভুল পদ্ধতি ব্যবহার করে আপনি উত্তরগুলি কোথায় দেখতে পাচ্ছেন? অনেক কিছু হয়েছে, কিন্তু সেগুলি বেশ কয়েক বছর আগে সংশোধন বা মুছে ফেলা হয়েছিল। আমি চারটি উত্তর দেখতে পাচ্ছি 6000 এরও কম স্কোরের সাথে রয়েছি কারণ এই চারটি উত্তর আসলে এই জাতীয় কম স্কোর পাওয়ার জন্য অনুকূলিত হয়েছে।
ক্যাস্পার্ড

1
আমি যতদূর বলতে পারি, আপনার কোডটি proc H w {incr h;lmap c [split $w {}] {set h [expr (2551*$h+[scan $c %c])%2**24]};set h}ঠিক আছে?
এরিক আউটগলফার

@ এরিকথ আউটগল্ফার: হ্যাঁ, এটি
সার্জিওল

1
আমি দ্বিতীয় @ ক্যাস্পার্ড: প্রশ্নগুলি অনুসারে কোন উত্তরগুলির সংঘর্ষের হিসাব নেই তা আপনি কী নির্দেশ করতে পারেন? আপনি কি সত্যিই তাদের চালানোর চেষ্টা করেছিলেন?
সার্জিওল

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 এ তৃতীয় প্যারামিটার পরিবর্তন করা হয়েছে।

3244> 6354 - দ্বিতীয় প্যারামিটারটি 7809143 থেকে 7809064 এ পরিবর্তিত হয়েছে এবং আমি খুঁজে পেয়েছি যে আমি ভুল গণনা পদ্ধতি ব্যবহার করেছি; পি


1

এখানে কয়েকটি অনুরূপ নির্মাণ রয়েছে যা বেশ "বীজযোগ্য" এবং বর্ধিত পরামিতি অপ্টিমাইজেশনকে সম্ভব করে তোলে। অভিঘাত 6k এর চেয়ে কম পাওয়া কঠিন! ধরে নিচ্ছি স্কোরটির গড় গড় 6829 এবং 118 এর স্ট্যান্ড আমি এলোমেলোভাবে এই জাতীয় কম স্কোর পাওয়ার সম্ভাবনাও গণনা করেছি।

ক্লোজার এ, 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গুরুত্বপূর্ণ কিনা or
নিকোনিহার

সম্ভবত কেবলমাত্র ASCII মানগুলি গুন করা গেমটিতে যথেষ্ট এনট্রপি আনবে না। অনেক ভাল স্কোরিং অ্যালগরিদমের ফর্ম আছে বলে মনে হয় f(n) % (8^8 - g(n))
নিকোনিহার

এখানে একটি উত্তর রয়েছে যা ব্যাখ্যা করে যে এটি কীভাবে 3677 এর মতো কম হয়েছে that
কাস্পার্ড

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

@ পি ভেরিয়েবলটি 999 এর নীচে সমস্ত প্রাইমে পূর্ণ হয়।

এটি আসকি মানগুলিকে প্রাইম সংখ্যায় রূপান্তর করে এবং তাদের পণ্যগুলিকে একটি বৃহত মৌলিক করে তোলে। ১9৯ এর ফজ ফ্যাক্টরটি এই সত্যটির সাথে সম্পর্কিত যে মূল অ্যালগরিদম অ্যানোগ্রামগুলি সন্ধান করার জন্য ছিল, যেখানে একই অক্ষরের পুনর্বিন্যাসের সমস্ত শব্দ একই হ্যাশ পায়। লুপটিতে ফ্যাক্টর যুক্ত করে এটি অ্যানাগ্রামগুলিতে স্বতন্ত্র কোডগুলি তৈরি করে।

কোডটি সংক্ষিপ্ত করার জন্য আমি দরিদ্র পারফরম্যান্সের ব্যয়ে ** ০.০ (প্রাইমের জন্য স্কয়ার্ট পরীক্ষা) সরিয়ে ফেলতে পারি। এমনকি আমি আরও 115 টি বাইট রেখে আরও নয়টি অক্ষর মুছে ফেলার জন্য লুপটিতে প্রাথমিক নম্বর সন্ধানকারীকে সম্পাদন করতে পারি।

পরীক্ষা করার জন্য, নিম্নলিখিতটি 1 থেকে 300 রেঞ্জের ফজ ফ্যাক্টরের জন্য সর্বোত্তম মান সন্ধান করার চেষ্টা করে It / 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
স্কোরটি সন্দেহজনক দেখাচ্ছে। আপনি কি নিশ্চিত যে আপনি সমস্ত সংঘর্ষের শব্দটি গণনা করছেন? পূর্ববর্তী বেশ কয়েকটি উত্তর ভুলভাবে প্রতিটি সংঘর্ষকারী হ্যাশ মানের জন্য একটি শব্দ গণনা করে।
ক্যাস্পার্ড

তুমি ঠিক হতে পারো. আমি কীভাবে গণনা করেছি তা বিবেচনা করে দেখতে হবে এবং এটি আপনার সংজ্ঞা অনুসারে একই কিনা। আমি কত শব্দ আছে তা গণনা করছি এবং কতগুলি অনন্য হ্যাশকোড তৈরি হয়েছিল তা বিয়োগ করছি। যদি এ এবং বি শব্দের সাথে একই হ্যাশকোড পাওয়া যায় তবে তা একটি বা দুটি সংঘর্ষ? আমি এক হিসাবে এটি গণনা।
পল চেরনোচ

1
আমি স্কোরিং ফাংশনটি সংজ্ঞায়িত করিনি। আমি চ্যালেঞ্জটি পোস্টকারী একই ব্যবহারকারীর দ্বারা পোস্ট করা উদাহরণ উত্তর থেকে এটি অনুলিপি করেছি। সর্বাধিক উত্তরগুলির স্কোর 6273 এবং 6848 এর মধ্যে রয়েছে There একাধিক উত্তর এসেছে প্রতিটি স্কোর গণনায় একই ভুল করে যা একটি স্কোরকে এটির তুলনায় প্রায় অর্ধেক হিসাবে গণনা করে। (ঠিক অর্ধেক সঠিক স্কোর যদি তিনটি colliding শব্দের কোন মামলা আছে।)
kasperd

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 বেসের চেয়ে কম সংঘর্ষের কারণ হয়ে থাকে এমন কোনও মান আছে কিনা তা মূল্যায়নের জন্য অনুসন্ধান চালিয়ে যাচ্ছে যা এখনও রেকর্ডবাদী।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.