হ্যাশের সংঘর্ষ: "না" মানে "হ্যাঁ"


63

এই কোড গল্ফটি সাম্প্রতিক দৈনিক ডাব্লুটিএফ প্রবন্ধটি দ্বারা অনুপ্রাণিত হয়েছিল আপনি সত্যটি পরিচালনা করতে পারবেন না! , যা এতে লেখা একটি স্ট্রিং তুলনা বৈশিষ্ট্যযুক্ত:

String yes = "YES";
if ((delay.hashCode()) == yes.hashCode())

স্টিভের দলটির জন্য জাভাটির String.hashCodeপদ্ধতিটি যদি এমনভাবে বাস্তবায়িত হতে পারে তবে সমস্যাটি কল্পনা করুন "YES".hashCode() == "NO".hashCode()। সুতরাং, আমি এখানে প্রস্তাবিত চ্যালেঞ্জটি হ'ল:

যতটা সম্ভব অক্ষরের অক্ষরে লিখুন, hএকটি স্ট্রিং প্যারামিটার এবং পূর্ণসংখ্যার রিটার্ন মান সহ একটি হ্যাশ ফাংশন (আমি এটি কল করব ) h("YES")যেমন এর সমান h("NO")

অবশ্যই, এটি কোনও ফাংশনটির সাথে করা তুচ্ছ হবে def h(s): return 0, যা প্রতিটি স্ট্রিংয়ের জন্য একটি হ্যাশ সংঘর্ষ তৈরি করে । এই চ্যালেঞ্জটিকে আরও আকর্ষণীয় করে তুলতে আপনাকে নিম্নলিখিত অতিরিক্ত নিয়ম মেনে চলতে হবে:

এর অন্যান্য তিনটি বা তার চেয়ে কম বড় হাতের হওয়া ASCII অক্ষর (এর মধ্যে রয়েছে 18 277 সম্ভব স্ট্রিং ^[A-Z]{0,3}$), হতে হবে কোন হ্যাশ দুর্ঘটনায়।

ব্যাখ্যা (Heiko Oberdiek দ্বারা নির্দিষ্ট): ইনপুট স্ট্রিং ছাড়া অন্য অক্ষর থাকতে পারে A-Z, এবং আপনার কোড আবশ্যক নির্বিচারে স্ট্রিং হ্যাশ করতে সক্ষম হবেন। (আপনি পারে, তবে, অনুমান যে ইনপুট হয় একটি অক্ষর স্ট্রিং বদলে নাল পয়েন্টার অথবা অন্য কোনো ডাটা টাইপ একটি অবজেক্ট।) যাইহোক, এটা কোন ব্যাপার না কি ফেরত মান স্ট্রিং যে মিলছে না হয় ^[A-Z]{0,3}$যতদিন, এটি একটি পূর্ণসংখ্যা

তদতিরিক্ত, এই ফাংশনটির অভিপ্রায়টি অস্পষ্ট করতে:

আপনার কোডগুলিতে অক্ষর বা স্ট্রিংয়ের অক্ষরে অক্ষরের মধ্যে 'Y', 'E', 'S', 'N', বা 'O' (উপরের বা নীচের দিকে উভয়) অক্ষর অন্তর্ভুক্ত করা উচিত নয়।

অবশ্যই, এই সীমাবদ্ধতা ভাষা কীওয়ার্ড প্রযোজ্য নয়, তাই else, returnইত্যাদি জরিমানা হয়।


4
এই ধরণের সাহায্য করে না যে আমরা এখনও YESNOএই নির্দিষ্ট ব্যতিক্রমটি যাচাই করতে সংখ্যার ASCII মানগুলি ব্যবহার করতে পারি ।
জো জে।

উত্তর:


7

গল্ফস্ক্রিপ্ট: ১৯ টি চর (নামকরণের জন্য 24 টি অক্ষর)

26base.2107=59934*+

এটি ফাংশনের মূল অংশ। এটি একটি নামকৃত কার্যক্রমে বরাদ্দ করাতে hআরও পাঁচটি অক্ষর লাগে:

{26base.2107=59934*+}:h;

(চূড়ান্ত সেমিকোলনটি বাদ দেওয়া যেতে পারে, যদি আপনি স্ট্যাকের মধ্যে পড়ে থাকা কোডটির একটি অনুলিপি কিছু মনে করেন না।)

হ্যাশ ফাংশন মূল 26base, যা সমষ্টি হিসাব করে (26 - · একটি ; = 1 .. এন ), যেখানে n হল ইনপুট অক্ষরের সংখ্যা এবং একটি এর ASCII কোড উল্লেখ করে -th ইনপুট অক্ষর। বড় হাতের ASCII অক্ষর সমন্বিত ইনপুটগুলির জন্য, এটি একটি সংঘর্ষ-মুক্ত হ্যাশ ফাংশন। কোডের বাকি অংশটি ফলাফলের সাথে 2107 (হ্যাশ কোড NO) তুলনা করে এবং যদি তারা সমান হয়, 5991 যোগ করে 2701 + 59934 = 62041, হ্যাশ কোডটি দেয় YES

উদাহরণস্বরূপ আউটপুট, পরীক্ষার ক্ষেত্রে এই অনলাইন ডেমোটি দেখুন


আপনি এই পরীক্ষা কিভাবে? আমি সবেমাত্র সংঘর্ষের গুচ্ছ পেয়েছি । উদাহরণ: h('DXP') == h('KK') == 65884
নিনেনিও

(আমার পরীক্ষার উদ্দেশ্যে, আপনি যা লিখেছিলেন তার পাইথন সমতুল্য lambda w:sum(ord(c)*26**i for i,c in enumerate(reversed(w*9)))%102983:)
নিউনিও

@ ন্যানোনিও: স্পষ্টতই, পর্যাপ্ত পরিমাণে নেই। আমি ভেবেছিলাম যে আমি তিন-অক্ষর-বা-কম ইনপুটগুলির পুরো সেটটি তৈরি করেছি, সেগুলি সমস্ত হ্যাশ করেছি এবং পরীক্ষা করেছি যে হ্যাশের সেটটিতে ইনপুটগুলির সেটের তুলনায় একটি উপাদান কম রয়েছে। স্পষ্টতই, আমার পরীক্ষার জোরে কোথাও একটি বাগ এসেছিল। :-( আমি সংক্ষিপ্তরটি সংশোধন না করা অবধি / আমি মূল 19-
চরিত্রে ফিরে আসব

54

32-বিট পাইথন 2.x (19)

hash(w*9)%537105043

আরএসএ একটি সেমিপ্রাইম মডুলাস ব্যবহার করে এবং এটি এটিকে সুরক্ষিত করে তোলে, তাই আমার হ্যাশ অ্যালগরিদমের সাথে একটি ব্যবহার করা অবশ্যই এটি আরও উন্নত করা উচিত! 1

এটি একটি খাঁটি গণিত ফাংশন, সমস্ত স্ট্রিংয়ের জন্য কাজ করে (নরক, যে কোনও পাথর পাইথন বস্তুর জন্য কাজ করে), এবং এতে কোনও শর্তযুক্ত বা বিশেষ-আবরণ নেই contain 32-বিট পাইথনকে সাধারণত python-32বেশিরভাগ সিস্টেমে কল করা যেতে পারে যা উভয়ই ইনস্টল করেছে 2

আমি এটি পরীক্ষা করেছি এবং এটি 18,279 3-অক্ষর-বা তার চেয়ে কম বড় বড় স্ট্রিংয়ের জন্য 18,278 টি আলাদা মান প্রদান করে। একটি ফাংশনে এটি বরাদ্দ করতে আরও 11 টি বাইট লাগে:

h=lambda w:hash(w*9)%537105043

এবং h('YES') == h('NO') == 188338253

64-বিট পাইথন 2.x (19)

hash(w*2)%105706823

উপরের মত একই চুক্তি।


এই সংখ্যাগুলি নিয়ে আসতে, সামান্য বিস্তৃত গণিত ব্যবহার করা হয়েছিল। আমি একটি ফাংশন খুঁজছেন ছিল fএবং মডুলাস nযেমন যে hash(f('YES')) % n == hash(f('NO')) % n। এটি nবিভাজক পরীক্ষার সমতুল্য d = hash(f('YES')) - hash(f('NO')), অর্থাৎ আমাদের কেবলমাত্র dউপযুক্ত মানগুলির জন্য কারণগুলি পরীক্ষা করতে হবে n

nজন্মদিনের প্যারাডক্স সংঘর্ষের সম্ভাবনা হ্রাস করার জন্য আদর্শটি 20000 ** 2 এর আশেপাশে। উপযুক্ত অনুসন্ধান সন্ধান করা nকিছুটা বিচার এবং ত্রুটি হতে পারে d, ফাংশনের জন্য সমস্ত কারণ (সাধারণত অনেকগুলি হয় না) এবং বিভিন্ন পছন্দগুলির সাথে খেলে f। যদিও খেয়াল করুন যে বিচার এবং ত্রুটি কেবল তখনই প্রয়োজন কারণ আমি nযতটা সম্ভব ছোট করতে চাই (গল্ফের জন্য)। যদি এটির প্রয়োজন না হয় তবে আমি কেবলমাত্র dআমার মডুলাস হিসাবে বেছে নিতে পারি, যা সাধারণত পর্যাপ্ত পরিমাণে বড়।

আপনি আরও মনে রাখবেন যে আপনি এই কৌশলটি কেবল f(s) = s(পরিচয় ফাংশন) ব্যবহার করে বন্ধ করতে পারবেন না কারণ স্ট্রিংয়ের ডানদিকের চরিত্রটি XORচূড়ান্ত হ্যাশের সাথে মূলত একটি রৈখিক সম্পর্ক (আসলে একটি সম্পর্ক) রয়েছে (অন্যান্য চরিত্রগুলি আরও অনেক অবৈধ পথে অবদান রাখে )। স্ট্রিংয়ের পুনরাবৃত্তি তাই নিশ্চিত করে যে স্ট্রিংগুলির মধ্যে পার্থক্যগুলি কেবলমাত্র ডানদিকের চরিত্রটি পরিবর্তনের প্রভাবকে হ্রাস করতে প্রশস্ত করা হয়েছে।


1 এটি পেটেন্ট বাজে কথা।
2 পাইথন স্ট্রিং হ্যাশিং প্রধান সংস্করণ (2 বনাম 3) এবং বেনসেস (32-বিট বনাম 64-বিট) এর উপর নির্ভর করে। এটি প্ল্যাটফর্ম আফাইকের উপর নির্ভর করে না।


আপনি আমার ভোট পেয়েছেন। : ডি
সিজেফুরে 21

দুর্ভাগ্যক্রমে, নতুন হ্যাশ র্যান্ডমাইজেশন বৈশিষ্ট্যের কারণে পাইথনের সাম্প্রতিক সংস্করণগুলিতে এটি কাজ করে না।
dan04

@ ডান04: অদ্ভুত, আমি ভেবেছিলাম যে আমি এটি উল্লেখ করেছি যে এটি কেবল পাইথন ২.x এর জন্য। আমি আবার এটি সম্পাদনা করেছি।
nneonneo

আপনি কি জানেন যে আপনি এই ম্যাজিক নম্বরগুলি কীভাবে খুঁজে পেয়েছেন? আমি একটি ফ্যাক্টর হিসাবে hash('YES'*9)আছে দেখতে 34876679, এবং একটি ফ্যাক্টর হিসাবে hash('NO'*9)আছে 34876679+537105043। তবে আপনি কীভাবে 537105043জানবেন যে এটি একটি ভাল মডুলাস ছিল? অর্থাত্ এটি অন্যান্য সংঘর্ষ ঘটেনি?
আন্তোনিও র্যাগাগিনিন

@ অ্যান্টোনিওরাগাগনিন: উত্তরে এটি যুক্ত হয়েছে।
nneonneo

38

পার্ল, 53 49 40 বাইট

sub h{hex(unpack H6,pop)-20047||5830404}

টেস্ট:

h('YES') = 5830404
h('NO')  = 5830404
Keys:   18279
Values: 18278

জন্য হ্যাশ মান YESএবং NOএকই এবং সেখানে 18279 স্ট্রিং হয় ^[A-Z]{0,3}$, যা সংঘর্ষের কেবল সংঘর্ষের ছাড়া মুক্ত YESএবং NO

Ungolfed:

sub h {
    hex(unpack("H6", pop())) - 20047 || 5830404;
    # The argument is the first and only element in the argument array @_.
    # "pop" gets the argument from array @_ (from the end).
    # The first three bytes of the argument or less, if the argument
    # is shorter, are converted to a hex string, examples:
    #   "YES" -> "594553"
    #   "NO"  -> "4e4f"
    # Then the hex string is converted to a number by function "hex":
    #   0x594553 = 5850451
    #   0x4e4f   =   20047
    # The value for "NO" is subtracted, examples:
    #   case "YES": 5850451 - 20047 = 5830404
    #   case "NO":    20047 - 20047 =       0
    # If the argument is "NO", the subtraction is zero, therefore
    # 5830404 is returned, the result of "YES".
}

# Test
my %cache;
sub addcache ($) {$cache{$_[0]} = h($_[0])}

# Check entries 'YES' and 'NO'
addcache 'YES';
addcache 'NO';
print "h('YES') = $cache{'YES'}\n";
print "h('NO')  = $cache{'NO'}\n";

# Fill cache with all strings /^[A-Z]{0-3}$/
addcache '';
for my $one (A..Z) {
    addcache $one;
    for (A..Z) {
        my $two = "$one$_";
        addcache $two;
        for (A..Z) {
            my $three = "$two$_";
            addcache $three;
        }
    }
}
# Compare number of keys with number of unique values
my $keys = keys %cache;
my %hash;
@hash{values %cache} = 1 x $keys;
$values = keys %hash;
print "Keys:   $keys\n";
print "Values: $values\n";

পুরানো সংস্করণ, 49 বাইট

যেহেতু নতুন অ্যালগরিদম কিছুটা আলাদা, তাই আমি পুরানো সংস্করণ রাখি।

sub h{($_=unpack V,pop."\0"x4)==20302?5457241:$_}

টেস্ট:

h('YES') = 5457241
h('NO')  = 5457241
Keys:   18279
Values: 18278

Ungolfed:

sub h {
    $_ = unpack('V', pop() . ($" x 4);
        # pop():  gets the argument (we have only one).
        # $" x 4: generates the string "    " (four spaces);
        #   adding the four spaces ensures that the string is long
        #   enough for unpack's template "V".
        # unpack('V', ...): takes the first four bytes as
        #   unsigned long 32-bit integer in little-endian ("VAX") order.
    $_ == 20302 ? 5457241 : $_;
        # If the hash code would be "NO", return the value for "YES".
}

সম্পাদনা:

  • ব্যবহার "\0"ভরাট বাইট হিসাবে তুলনায় 4 বাইট সংরক্ষণ $"

কোথায় 5457241এবং 20047থেকে এসেছে? আপনি এই সংখ্যাগুলি কীভাবে গণনা করবেন? আগাম ধন্যবাদ.
AL

@ এন ১: হেক্সে YESরয়েছে 594553। 0x594553 = 5850451. হেক্সে NOরয়েছে 4e4f। 0x4e4f = 20047.
nneonneo

7

পাইথন: 63

একটি অবিশ্বাস্যভাবে খোঁড়া সমাধান:

def h(s):
 try:r=int(s,36)
 except:r=0
 return(r,44596)[r==852]

এটি আলফানিউমেরিক স্ট্রিংকে বেস -৩ as সংখ্যা হিসাবে ব্যাখ্যা করে এবং সমস্ত কিছুর জন্য 0 প্রদান করে কাজ করে। 852 (NO) এর রিটার্ন মান পরীক্ষা করার জন্য এবং তার পরিবর্তে 44596 (YES) ফেরত দেওয়ার জন্য একটি স্পষ্ট বিশেষ মামলা রয়েছে।


3
যদি না আমি ভুল বুঝি: এটি কোড গল্ফ, আপনাকে ইনপুটটি সঠিক বলে ধরে নেওয়ার অনুমতি দেওয়া হয়েছে। আপনি খাঁজ try:এবং পুরো তৃতীয় লাইন করতে পারেন । আপনারও কিন্তু সমান প্রকৃত লাইনে যে যৌক্তিক লাইন, সেমিকোলন (দ্বারা পৃথক না থাকার কয়েক কামড় সংরক্ষণ করতে পারবেন def h(s):r=int(s,36);return(r,44596)[r==852])
undergroundmonorail

1
@underlandmonorail: হ্যাশ ফাংশনটির স্ট্রিং প্যারামিটার প্রশ্নে সীমাবদ্ধ নয় । একটি নির্দিষ্ট শ্রেণীর স্ট্রিংয়ের জন্য (তিনটি পর্যন্ত বড় অক্ষর পর্যন্ত) হ্যাশ ফাংশনের রিটার্ন মানগুলি সম্পর্কে একটি সীমাবদ্ধতা রয়েছে। তবে এটি বিবেচনা করে না, অন্যান্য স্ট্রিংয়ের জন্য কী প্রদান করা হয়, যদি ফেরতের মানটি পূর্ণসংখ্যা হয়।
হাইকো ওবারডিক

3
আমি সেখানে আপনার অ্যারের বুলিয়ান-ইনডেক্সিং পছন্দ করি
kratenko

6

খাঁটি বাশ, 29 বাইট (ফাংশন বডি)

h()(echo $[n=36#$1,n-852?n:44596])

এটি কেবল ইনপুট স্ট্রিংটিকে বেস 36 সংখ্যা হিসাবে বিবেচনা করে এবং দশমিক রূপান্তর করে, তারপরে বিশেষ NOক্ষেত্রে ডিল করে ।

আউটপুট:

$ এইচ এ
10
$ এইচ বি
11
$ এইচ বিড়াল
15941
$ এইচ না
44596
হ্যাঁ হ্যাঁ
44596
$ এইচ জেডজেড
46655
$

5

রুবি, 51 বাইট

h=->s{d=s.unpack('C*').join;d=~/896983|^7879$/?0:d}

পরীক্ষার কোড:

h=->s{d=s.unpack('C*').join;d=~/896983|^7879$/?0:d}

puts 'YES : '+h.call('YES').to_s # 0
puts 'NO : '+h.call('NO').to_s # 0
puts 'NOX : '+h.call('NOX').to_s # 787988
puts 'FNO : '+h.call('FNO').to_s # 707879
puts ''

values = Hash[]
n = 0
('A'..'Z').each{|c|
    values[c] = h.call(c)
    ('A'..'Z').each{|c2|
        values[c+c2] = h.call(c+c2)
        ('A'..'Z').each{|c3|
            values[c+c2+c3] = h.call(c+c2+c3)
            n += 1
        }
    }
}
puts 'tested '+n.to_s
duplicate = Hash.new()

values.each{|k, e|
    if duplicate.has_key?(e)
        puts 'duplicate : "'+k+'" = "'+duplicate[e].to_s+'" ('+e.to_s+')'
    else
        duplicate[e] = k
    end
}

আউটপুট:

YES : 0
NO : 0
NOX : 787988
FNO : 707879

tested 17576
duplicate : "YES" = "NO" (0)

5

জাভাস্ক্রিপ্ট ( ES6 ) 54 বাইট

f=s=>[x.charCodeAt()for(x of s)].join('')^7879||897296
f('YES'); // 897296
f('NO'); // 897296
f('MAYBE'); // -824036582

5

জাভা - 94 77

int h=new BigInteger(s.getBytes()).intValue();return Math.abs(h-(h^5835548));

Unrolled:

int hashCode(String s) {
    int h = new BigInteger(s.getBytes()).intValue();
    return Math.abs(h - (h ^ 5835548));
}

বর্ণনামূলক - এর জন্য f(s) = BigInteger(s.getBytes()):

  • f("YES") xor f("NO") = 5835548
  • সুতরাং f("YES") xor 5835548 = f("NO")
  • তাহলে f("YES") - (f("YES") xor 5835548) = f("NO") - (f("NO") xor 5835548)আমি ঠিক আছি?

আপনি কি বিগইন্টিজারকে ইনলাইন করতে পারবেন না?
মাফু

@ মফুট্র্যাক্ট - হ্যাঁ !!! ধন্যবাদ.
ওল্ডরুকমুডিজিয়ন

5

সিজেম, 15 বাইট

q42b_*81991617%

নীচে গল্ফস্ক্রিপ্ট সমাধান হিসাবে কাজ করে। এটি অনলাইনে চেষ্টা করুন।


গল্ফস্ক্রিপ্ট, 17 বাইট

42base.*81991617%

এই পদ্ধতিটি নিউওনিও এবং ইলমারি করোনেনের উত্তরগুলির উপর ভিত্তি করে ।

কিভাবে এটা কাজ করে

42base    # Interpret the input string as a base 42 number.
          # "YES" is [ 89 69 83 ] in ASCII, so it becomes 42 * (42 * 89 + 69) + 83 = 159977.
          # "NO" is [ 78 79 ] in ASCII, so it becomes 42 * 78 + 79 = 3355.
          #
.*        # Square. "YES" becomes 25592640529, "NO" becomes 11256025.
          #
81991617% # "YES" becomes 11256025.

একটি অ্যালগরিদম নির্বাচন করা

আমরা শুরু করি {b base}:h, অর্থাত্ ইনপুট স্ট্রিংকে একটি বেস-বি নম্বর হিসাবে বিবেচনা করা হয়। যতক্ষণ না b > 25, hনিষ্ক্রিয়।

আমরা hনিম্নলিখিত উপায়ে সংশোধন করা হলে "YES" এবং "NO" স্ট্রিংগুলির জন্য একটি সংঘর্ষ পাই : {x base n}:hযেখানে nকোন বিভাজক "YES" h "NO" h -

দুর্ভাগ্যক্রমে, এর অর্থ আমরা উদাহরণস্বরূপ, YETএবং এর জন্য একটি সংঘর্ষও পাব NP। এটি প্রতিরোধ করতে, মডিউলটি নেওয়ার আগে আমাদের বেস-বি নম্বরটি একটি অ-রৈখিক ফ্যাশনে পরিবর্তন করতে হবে।

গল্ফস্ক্রিপ্টে এটি সম্পাদন করার সবচেয়ে সংক্ষিপ্ততম উপায়টি হল নিজের সাথে বেস-বি নম্বরটি গুণ করা (অর্থাত্ এটি স্কোয়ারিং)। hএখন {base b .* n %}:h

সব করতে অবশেষ যে জন্য উপযুক্ত মান খোঁজার হয় bএবং n। আমরা এটি নিষ্ঠুর শক্তি দ্বারা সম্পন্ন করতে পারি:

for((b=26;b<100;b++)){
    P=($(golfscript <<< "['YES' 'NO']{$b base.*}/-" | factor | cut -d\  -f 2-))

    for n in $(for((i=0;i<2**${#P[@]};i++)){
        for((n=1,j=0;j<${#P[@]};n*=${P[j]}**((i>>j)&1),j++)){ :;};echo $n;} | sort -nu);{
            [[ $n -ge 18277 && $(echo -n '' {A..Z}{,{A..Z}{,{A..Z}}} |
                golfscript <(echo "' '/[{$b base.*$n%}/].&,")) = 18278 ]] &&
            echo $b $n && break
    }
}

এর জন্য সংক্ষিপ্ততম মানগুলি হ'ল b n:

37 92176978
42 81991617

পরীক্ষামূলক

$ echo -n '' {A..Z}{,{A..Z}{,{A..Z}}} |
     golfscript <(echo '{42base.*81991617%}:h;" "/{.`"\t"+\h+puts}/') |
     sort -k 2n |
     uniq -Df 1
"NO"    11256025
"YES"   11256025

3

জাভাস্ক্রিপ্ট (ES6) - 38 টি অক্ষর (33 চর ফাংশন বডি)

h=s=>(a=btoa(s))=="WUVT"|a=="Tk8="||+s

পরীক্ষার কেস:

var l = console.log;
l(  h("YES")  );                // 1
l(  h("NO")  );                 // 1
l(  h("ABC")  );                // NaN     
l(  h("WIN")  );                // NaN
l(  h("YES") === h("NO")  );    // true
l(  h("ABC") === h("WIN")  );   // false
l(  h("WIN") === h("YES")  );   // false

l(  NaN === NaN  );             // false

ব্যাখ্যা:

সবার আগে, আমি আপনাকে NaNজাভাস্ক্রিপ্টে - "একটি নম্বর নয়" - এর সাথে পরিচয় করিয়ে দিই । এটি একটি সংখ্যা:

typeof NaN  // number

যেমন:

typeof 42   // number

এর বিশেষ সম্পত্তি এটি কখনই নিজের সমতুল্য হয় না । আমার ফাংশনটি 1যদি স্ট্রিং YESবা NO, এবং NaNঅন্য কোন স্ট্রিং এর জন্য।

সুতরাং, এটি বিধিগুলি ভঙ্গ করে না, কারণ অন্য কোনও স্ট্রিংয়ের জন্য হ্যাশের সংঘর্ষ হবে না;) ( NaN !== NaNপরীক্ষার ক্ষেত্রে উপরে দেখানো হয়েছে)।

এবং আমার স্বপ্নটি সত্য হয়ে উঠল: বাশ, পার্ল এবং রুবিকে কোড দৈর্ঘ্যে মারধর!

অবহেলিত কোড:

h =  // h is a function 
s => // s = string argument

( ( a = btoa(s) )  ==  "WUVT" | a == "Tk8=" )
        ^-- returns some value stored in `a`

যদি মানটি হয় "WUVT"বা "Tk8=", ফিরে আসুন 1। অন্যথায়, ফিরে

+s // parseInt(s, 10)

যা হবে NaN


2
NaN একটি সংখ্যা হতে পারে তবে শব্দের কোনও অর্থে এটি একটি "পূর্ণসংখ্যা" নয়।
পাওলো ইবারম্যান

2
@ PaŭloEbermann উইকি থেকে , "একটি পূর্ণসংখ্যা এমন একটি সংখ্যা যা ভগ্নাংশের উপাদান ছাড়াই রচিত হয়"। প্রশ্নটি পরিষ্কারভাবে বলে না যে পূর্ণসংখ্যাটি হতে হবে ^\d+$। এবং জেএস NaNএকটি সংখ্যা হিসাবে আচরণ করে । আপনি এটি একটি সংখ্যার দ্বারা গুন করতে পারেন, যোগ করতে পারেন, ভাগ করতে পারেন, সংখ্যার মতো বিয়োগ করতে পারেন। এটি জাভাস্ক্রিপ্টের একটি বিশেষ সম্পত্তি। এটি ব্যবহারে কোনও ক্ষতি নেই।
এটিকে

1
আমি এটি ব্যবহার করতে Object.is()এবং দাবি করতে পেরেছি এটি এখনও একটি সংঘর্ষ…
ব্যবহারকারী 2428118

1
@ user2428118 আমার জ্ঞানে অবজেক্ট.আইস আনার জন্য ধন্যবাদ। আমি এটা কখনই জানতাম না। তবে আমি আপনাকে নোট করতে চাই যে ওপি ==তুলনা করার জন্য সমতা অপারেটর ( ) ব্যবহার করে, যা "হ্যাঁ" বা "না" বাদে কোনও স্ট্রিংয়ের জন্য কোনও হ্যাশ সংঘর্ষের নিশ্চয়তা দেয় না guarantee
গৌরাঙ্গ ট্যান্ডন

2
সত্য যে দাবি উপেক্ষা NaNসংঘর্ষের সস্তা মনে হয় গণনা করা হয় না, এই সমাধান স্ট্রিং সঙ্গে collisions হয়েছে NAমাধ্যমে NPএবং YEQএর মাধ্যমেYET
nderscore

2

পাইথন 92

n=int("".join(map(str,map(ord,raw_input()))))    # hashing function
print n if 1+(n**2-904862*n)/7067329057 else-1   # input validation

হ্যাশিং ফাংশনটি ASCII অক্ষরের সাধারণ মানগুলিকে সম্মতি জানায়, মুদ্রণ বিবৃতিটি নিশ্চিত করে যে দুটি পছন্দসই ইনপুট সংঘর্ষে লিপ্ত হয়।


2

ইসমাস্ক্রিপ্ট ((৩০ বাইট)

আমি ভেরিয়েবল অ্যাসাইনমেন্ট, রিটার্ন এবং ফাংশন কীওয়ার্ড এড়ানোর চেষ্টা করেছি এবং এই সমস্ত বাজে কথা এড়াতে এটি দুর্দান্ত পদ্ধতির মতো দেখায় (এটি একরকমভাবে কার্যকরী প্রোগ্রামিংয়ের মতো দেখায়)। অন্যান্য সমাধানগুলির বিপরীতে, এটি নির্ভর করে না btoaবা atobযা ECMAScript 6 নয়, তবে HTML5। 0+প্রয়োজন, যাতে এটি নির্বিচারে স্ট্রিংকে বিশ্লেষণ করতে পারে।

a=>parseInt(0+a,36)-852||43744

1
নিস! আমি জানতাম না যে তারা পার্সইন্টের জন্য অন্যান্য ঘাঁটি যুক্ত করেছে। আপনি যদিও অনেকগুলি বাইট কাটতে পারেন। :)a=>parseInt(0+a,36)-852||43744
nderscore

@ আন্ডারস্কোর: পরামর্শের জন্য ধন্যবাদ। এটি সত্যিই আমার স্ক্রিপ্টকে অনেক উন্নত করেছে।
কনরাড বোরোস্কি

2

জাভা - 45 (বা 62?)

জাভাতে একটি প্রোগ্রাম চালানোর জন্য যা প্রয়োজন তারপরে কীভাবে মোটামুটি স্কোর করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই, আমাকে ফাংশন সংজ্ঞাটি অন্তর্ভুক্ত করতে হবে? আমার স্কোর যথাযথভাবে সম্পাদনা এবং সামঞ্জস্য করতে নির্দ্বিধায় বর্তমানে আমি @ ওल्डকুরিমডজিয়ন উত্তর হিসাবে একইভাবে স্কোর করছি। int h(String t){}প্রয়োজনে 17 যুক্ত করুন :

int h=t.hashCode();return h*h*3%1607172496;

পরীক্ষার জোতা দিয়ে অসমাপ্ত:

import static org.junit.Assert.*;

import java.util.*;

import org.junit.Test;

public class YesNo {
  @Test
  public void testHashValue() {
    YesNo yesNo = new YesNo();
    Set<Integer> set = new HashSet<>();

    assertEquals(yesNo.hash("YES"), yesNo.hash("NO"));

    set.add(yesNo.hash(""));
    for(char i = 'A'; i <= 'Z'; i++) {
      set.add(yesNo.hash("" + i));
      for(char j = 'A'; j <= 'Z'; j++) {
        set.add(yesNo.hash("" + i + j));
        for(char k = 'A'; k <= 'Z'; k++) {
          set.add(yesNo.hash("" + i + j + k));
        }
      }
    }
    assertEquals(18278, set.size());
  }

  int hash(String toHash) {
    int hashValue=toHash.hashCode();
    return hashValue*hashValue*3%1607172496;
  }
}

1

এবং আলগা হ'ল ...

কনভেয়র, ১৪৫ টি চর

 I
>#<
 26*)2**\88
 >========*
 ^    \ \+-
 ^=====#==<
5**222P:
5======<
5***26*)*(\P\:@e25*:*)4*,F
>==============#=========
             P,F

মূলত এই প্রোগ্রামটি অক্ষরের উপর 26 ধরণের কিছু করে। তারপরে এটি পরীক্ষা করে যে হ্যাশটি 12999 (হ্যাঁ এর হ্যাশ কোড) এর সমান এবং যদি 404 (কোনও হ্যাশকোড) প্রিন্ট করে, অন্যথায় এটি হ্যাশকোডটি প্রিন্ট করবে।

কনভেয়র আমার দ্বারা তৈরি একটি ভাষা যা বর্তমানে বিটা-পর্যায়ে রয়েছে তবে একটি দোভাষী এবং কিছু উদাহরণ এবং উত্স কোড সহ এখানে পাওয়া যাবে: https://github.com/loovjo/Conveyor


0

সি # 4.5 (112 বাইট)

int h(string s){int code=s.Select((v,i)=>((int)v)<<(2*(i-1))).Sum();return(code|1073742225)|(code|-2147483569);}

সি # তে আন্ডারগ্রাউন্ডোমোনোরেলের প্রচেষ্টার সংস্করণ (?) সংস্করণ। স্ট্রিংয়ের বাইটগুলি 32-বিট পূর্ণসংখ্যায় পরিণত করে (কেবলমাত্র 4 টি অক্ষর পর্যন্ত কাজ করে), তারপরে যথাক্রমে "হ্যাঁ" এবং "না" এর ফলাফলের বিপরীতে ফলাফল হয়, তারপরে ওআরগুলি একসাথে।

এটি কোনও সময়ে সংঘর্ষে পড়তে পারে, তবে এটি "হ্যাঁ" এবং "না" ব্যতীত অন্য কোনও ^ [AZ] {2,3} এর জন্য হওয়া উচিত নয়।


আপনার হ্যাশ ফাংশনে আরও অনেক সংঘর্ষ হবে। আপনার "হ্যাশ ফাংশন" মূলত উপসংহারে অনেকগুলি বিট উপেক্ষা করছে। সমস্ত স্ট্রিং জোড়া যা কেবলমাত্র সেই বিটগুলির মধ্যে পৃথক হয় একই হ্যাশ কোডটি ধারণ করে।
পাওলো ইবারম্যান

0

কোনও মন্তব্য নেই - 31 (ফাংশন সামগ্রী: 26)

'=|*==|,,|+|"#|[|,  |+|-%3|]*|:

খুব সহজ সমাধান। ;) যে কোনও এবং সমস্ত ইউটিএফ -8 স্ট্রিংয়ের জন্য কাজ করে।

ব্যাখ্যা: ' স্পষ্টতই, ফাংশন। প্রথমত, এটি পরীক্ষা করে *(এটি ইনপুট) |,,|+|"#|( |NO|) এর সমান কিনা । যদি তা হয় তবে এটি |, |+|-%3|( |YES|) ফেরত দেয় - অন্যথায়, এটি কেবল ফিরে আসে *


2
আমি কোন মন্তব্য দিয়ে কখনও কাজ করি নি, আপনার সমাধানটি ব্যাখ্যা করা কি আপনার পক্ষে যেমন অস্পষ্ট গল্ফসক্রিপ্ট, জে, বা এপিএল উত্তরগুলি দিয়ে প্রায়শই করা হয়ে থাকে তা কি সম্ভব?
কেয়া

@ কেয়া ওহ, হ্যাঁ, দুঃখিত, আমি পোস্টটি সম্পাদনা করব।
সিজেফুরে

1
কোন ক্ষমা প্রয়োজন নেই, আমি কীভাবে এটি কাজ করতে আগ্রহী ছিলাম।
কেয়া

0

সি 54

h(char *c){int d=*(int*)c-20302;return d*(d-5436939);}

স্ট্রিংটিকে পূর্ণসংখ্যায় রূপান্তর করুন - "NO" এবং একই মান দ্বারা গুণিত করুন "" না "-" হ্যাঁ "" NO "এবং" YES "এর জন্য 0 পাওয়ার জন্য এবং নির্দিষ্ট রেঞ্জের অন্য কোনও স্ট্রিংয়ের জন্য শূন্য নয়।

উইন্ডোজ machine মেশিনে সমস্ত মান যদি কোনও ইন্ডিয়ান উদ্বেগ থাকে।


0

স্ট্যাক্স , 12 11 বাইট

ì≤ïøZ‼kESa←

এটি চালান এবং এটি ডিবাগ করুন

ইনপুটটিকে বেস -৩ as হিসাবে অনুবাদ করে, 852 কে বিয়োগ করে, তারপরে 0 কে 43744 দিয়ে প্রতিস্থাপন করে Kon এটি কনরাদের দুর্দান্ত সমাধানের বন্দর ।


-1

কফিস্ক্রিপ্ট - 36

ফিরে উচিত 1জন্য YESএবং NO, এবং যাই হোক না কেন বিকৃত হয়ে আজেবাজে কথা atobঅন্য সব কিছুর জন্য উত্পাদন করে যে একটি করুন Base64- স্ট্রিং নয়।

h=(s)->_=atob s;_ in["`D","4"]&&1||_

জাভাস্ক্রিপ্ট সমতুল্য ( সিএস সংকলক থেকে জেএস কোড নয় ):

function h( s ) {
    var _ = atob( s );

    if( _ === "`D" || _ === "4" )
        return 1;
    else
        return _;
}

3
"ফাংশনটির পূর্ণসংখ্যার রিটার্ন মান থাকতে হবে" - আমি মনে করি _যে ইনপুটটি "হ্যাঁ" বা "কোনও" নয় যখন আপনার ফিরে আসে ।
গৌরাঙ্গ টন্ডন

-1

এখানে একটি দুর্দান্ত লম্পট। এটি কখনও কাজ করে না

পাইথন 2.7 - 79 বাইট

def h(s):n=sum(100**i*ord(c)for i,c in enumerate(s));return (n-7978)*(n-836989)

প্রথমে আমরা (প্রতিটি চরিত্রের আসকি মান) * 100 of (স্ট্রিংয়ে সেই চরিত্রের অবস্থান) এর যোগফল পাই। তারপরে আমরা আমাদের চূড়ান্ত উত্তর পেতে আমরা গুণ করব (সেই ফলাফল - 7978) এবং (সেই ফলাফল - 836989)। 7978 এবং 836989 হ'ল প্রথম বিটের "YES" এবং "NO" এর ফলাফল, সুতরাং হ্যাঁ এবং NO এর জন্য আমরা 0 দ্বারা গুণাচ্ছি না।

এটির কোনও সংঘর্ষ হওয়া উচিত নয়? আমি 18000 সম্ভাব্য কাউন্টারিকেক্সামগুলির বিরুদ্ধে পরীক্ষার মতো অনুভব করি না, তবে যদি একটি অনিচ্ছাকৃত সংঘর্ষ হয় তবে আমি এটিতে আরও 0 টি ফেলতে পারি 100এবং তারপরে আসলে কোনও সংঘর্ষ হওয়া উচিত নয়।

হতাশ হয়েছি যে আমি lambdaএটির জন্য একটি ব্যবহার করতে পারি না , তবে আমি পুরো গণনাটি দু'বার করতে চাইনি তাই আমাকে এটি একটি ভেরিয়েবলে সংরক্ষণ করতে হয়েছিল।

দয়া করে এই জিততে দেবেন না। এটি অত্যন্ত খোঁড়া এবং আমি এর প্রাপ্য নই।


"অন্য কোনও সংঘর্ষের" প্রয়োজনীয়তা পূরণ করে না: 18277-স্ট্রিং সেটগুলির মধ্যে কেবল 18012 অনন্য হ্যাশ রয়েছে যার সংঘর্ষ হওয়া উচিত নয়।
dan04

@ লাডান, আমাকে দ্বিতীয় বার দিন
আন্ডারগ্রাউন্ডোমোনরাইল

1
@ লাদান আমি এটিকে কাজে লাগাতে পারি না। অ্যালগরিদমের সাথে সহজাত কিছু ভুল আছে। আমি এটি মুছে ফেলতে চাই না কারণ অন্য কেউ হয়ত বুঝতে পারে কী হয়েছে, তবে আমি একটি নোট
আন্ডারগ্রাউন্ডোমোরিয়েল

এটি আমার জন্য কাজ করে, জ = ল্যামডা গুলি: (হ্যাশ (গুলি) +997192582) * (হ্যাশ (গুলি) -480644903)
লুকাস

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