मेरे MD2 हैश में कौन से वर्ण अधिक सामान्य हैं?


11

चुनौती सरल है

एक स्क्रिप्ट लिखें, जब एक स्ट्रिंग इनपुट दिया जाता है, तो MD2 हैशिंग एल्गोरिथ्म का उपयोग करके स्ट्रिंग हैश करेगा , और फिर एक सकारात्मक पूर्णांक या नकारात्मक पूर्णांक आउटपुट लौटाएगा जिसके आधार पर नीचे वर्ण सेट हेक्साडेसिमल स्ट्रिंग के रूप में अधिक सामान्य हैश:

01234567 - (positive)
89abcdef - (negative)
  • इनपुट हमेशा एक स्ट्रिंग होगा, लेकिन 65535 तक किसी भी लंबाई का हो सकता है
  • संपूर्ण इनपुट, व्हाट्सएप और सभी, हैशेड होना चाहिए
  • इस चुनौती के प्रयोजनों के लिए, पूर्णांक 0 को न तो सकारात्मक माना जाता है और न ही नकारात्मक (देखें टाई आउटपुट)
  • अधिक सामान्य सेट वह है जो वर्ण के 32 वर्ण हेक्साडेसिमल हैश स्ट्रिंग के भीतर अधिक सामान्य है
  • आपके आउटपुट में किसी भी तरह का व्हाट्सएप शामिल हो सकता है, जब तक कि केवल गैर-व्हाट्सएप पात्र एक वैध सत्य या गलत आउटपुट नहीं हैं
  • एक टाई की स्थिति में, जहां हेक्साडेसिमल स्ट्रिंग में प्रत्येक सेट से ठीक 16 वर्ण होते हैं, कार्यक्रम को 0 पर आउटपुट करना चाहिए

I / O उदाहरण

Input: "" (Empty String)
Hash: 8350e5a3e24c153df2275c9f80692773
Output: 1

Input: "The quick brown fox jumps over the lazy cog" (Without quotes)
Hash: 6b890c9292668cdbbfda00a4ebf31f05
Output: -1

Input: "m" (Without quotes)
Hash: f720d455eab8b92f03ddc7868a934417
Output: 0

जीत का मानदंड

यह , सबसे कम बाइट्स जीतता है!


1
इसे लिंक करने या आदर्श रूप से MD2 हैशिंग एल्गोरिथ्म को चुनौती विनिर्देश में स्पष्ट करने के लिए अच्छा होगा कि इसे स्वयं निहित किया जाए।
मार्टिन एंडर

@MartinEnder करेंगे!
स्काइड्सदेव

मुझे लगता है कि यह जीत , हार और टाई के
गणित दीवाने

@mathjunkie सच, शायद कल्पना को इतना बदलना नहीं चाहिए, लेकिन मुझे लगता है कि सिर्फ 1, 0 या -1 का सबसे अच्छा तरीका है
स्काइड्सडेव

2
यह मुझे एक गिरगिट चुनौती के रूप में प्रभावित करता है । या तो आपकी भाषा में एमडी 2 करने के लिए एक बिल्ड-इन या लाइब्रेरी है और बाकी सरल चरित्र की गिनती है, या यह नहीं है और आपको अपने आप को लागू करना होगा।
xnor

जवाबों:


1

ऑक्टेव, 35 बाइट्स

@(s)diff(hist(hash('md2',s),+'78'))

* ऑक्टेव के नवीनतम संस्करण की आवश्यकता है (कम से कम 4.2)।

गणना के साथ हैश स्ट्रिंग के हिस्टकोड की गणना करता है, जो डिब्बे का केंद्र 7 और 8 है, फिर गणना के अंतर की गणना करता है।


यह देखते हुए कि कुछ दिन हो गए हैं, मैं तुम्हें जीत के जवाब के रूप में रखूंगा, अगर कोई बाद में किसी छोटे समाधान के साथ आता है तो मैं इसे हमेशा बदल सकता हूं। बहुत बढ़िया!
स्किड्सदेव

@ माय्यूब धन्यवाद!
rahnema1

8

गणितज्ञ, 43 बाइट्स

Tr@Sign[15-2#~Hash~"MD2"~IntegerDigits~16]&

में अंकों की संख्या को अंक में आउटपुट करता 01234567है 89abcdef


1
बहुत बुरा 3Eजो 8 और 9 के बीच है और 7 और 8. के ​​बीच नहीं है: |
मार्टिन एंडर

8

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

यह राक्षस MD2 एल्गोरिदम को लागू कर रहा है, इसलिए यह शर्मनाक रूप से लंबा है। चेन यी-साइुआन द्वारा js-md2 पर आधारित ।

let f =

m=>{L=x=s=b=0,n=m.length,M=[],X=[],C=[],S=[...atob`KS5DyaLYfAE9NlSh7PAGE2KnBfPAx3OMmJMr2bxMgsoem1c8/dTgFmdCbxiKF+USvk7E1tqe3kmg+/WOuy/ueqloeZEVsgc/lMIQiQsiXyGAf12aWpAyJzU+zOe/95cD/xkws0iltdHXXpIqrFaqxk+4ONKWpH22dvxr4px0BPFFnXBZZHGHIIZbz2XmLagCG2Alra6wufYcRmFpNEB+D1VHoyPdUa86w1z5zrrF6iYsUw1uhSiECdPfzfRBgU1Satw3yGzBq/ok4XsIDL2xSniIlYvjY+ht6cvV/jsAHTny77cOZljQ5KZ3cvjrdUsKMURQtI/tHxrbmY0znxGDFA`].map(c=>c[O='charCodeAt']());for(l=1;l-2;){for(j=19;j--;)M[j]=M[16+j]||0;for(i=s;i<16;x++)L=(x-n||(b+=i-s,s=i-16,l=2),C[i]^=S[(M[i++]=x<n?m[O](x):16-(b&15))^L]);for(i=0;i<l;i++){for(j=16;j--;)X[32+j]=(X[16+j]=(i?C:M)[j])^X[j];for(t=j=0;j<18;t=t+j++&255)for(k=0;k<48;)t=X[k++]^=S[t]}}for(i=16,n=-i;i--;)n+=!(X[i]&8)+!(X[i]&128);return n}

console.log(f(''))
console.log(f('The quick brown fox jumps over the lazy cog'))
console.log(f('m'))


मुझे इससे हराएं। वास्तव में अच्छा प्रयास।
ल्यूक

इस प्रकार प्रॉप्स, अब तक, वास्तव में बिल्ट-इन फ़ंक्शंस का उपयोग करने के बजाय पूर्ण एमडी 2 एल्गोरिदम को लागू करने के लिए एकमात्र है।
स्किड्सदेव

अधिक अंक के योग्य उच्चतम बाइट उत्तर।
मैजिक ऑक्टोपस Urn

5

पायथन 2 + क्रिप्टो , 108 99 93 91 87 78 बाइट्स

पायथन में एमडी 2 के लिए एक देशी बिलिन नहीं है।

from Crypto.Hash import*
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16

@ ब्वॉयज की बदौलत 12 बाइट्स बचाए।
सहेजे गए 9 बाइट्स @FelipeNardiBatista का धन्यवाद।


lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)बाइट काउंट को 93 से कम करना चाहिए
ovs

@ अति चतुर!
mbomb007


lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-1678 के लिए। आउटपुट किसी भी संख्या में हो सकता है, न कि सिर्फ-1,0,1
फेलिप नार्डी बतिस्ता

4

जावा 8, 173 बाइट्स

-4 dzaima के लिए धन्यवाद

-128 ऑलिवर के लिए धन्यवाद, यह मूल रूप से अब उसका जवाब है।

a->{String h="";for(byte b:java.security.MessageDigest.getInstance("MD2").digest(a.ge‌​tBytes()))h+=h.forma‌​t("%02x",b);return h.codePoints().filter(c->c>47&&c<56).count()-16;}

सत्य के लिए सकारात्मक। मिथ्या के लिए नकारात्मक। 0 के लिए 0।


1
आप की enclosing कोष्ठक को हटाने के द्वारा 4 बाइट बचा सकता है forऔरif
dzaima

1
हेक्स के लिए बाइट्स golfed जा सकता है: String s="";for(byte b:bytes)h+=h.format("%02x",b);। इसके अलावा, आपको एक पूर्ण कार्यक्रम लिखने की आवश्यकता नहीं है, लेकिन एक लैम्ब्डा पर्याप्त a->{... return x;}:। अंत में लूप के लिए इसके द्वारा प्रतिस्थापित किया जा सकता है int x=s.codePoints().filter(c->c>47&&c<56).count();। सब के सब, मैं अपने एल्गोरिथ्म के लिए 173 मिलता है, गोल्फ a->{String h="";for(byte b:java.security.MessageDigest.getInstance("MD2").digest(a.getBytes()))h+=h.format("%02x",b);return h.codePoints().filter(c->c>47&&c<56).count()-16;}:। अधिक गोल्फिंग संभव है, लेकिन यह बाइट की गिनती में शुद्ध सुधार है, है ना?
ओलिवियर ग्रेगोइरे

गोल्फ के लिए कुछ चीजें: println-> printऔर for(char c:s.toCharArray())if("01234567".contains(""+c))x++;->for(String c:s.split(""))if("01234567".contains(c))x++;
केविन क्रूज़सेन

@ OlivierGrégoire मुझे जावा 8 के बारे में ज्यादा जानकारी नहीं है, मैंने उसी समय के आसपास ग्रूवी / ग्रेल्स पर स्विच किया।
मैजिक ऑक्टोपस Urn

3

PHP, 50 बाइट्स

सत्य के लिए 1 प्रिंट करता है और -1 झूठे के लिए और 0 एक टाई के लिए

<?=preg_match_all("#[0-7]#",hash(md2,$argn))<=>16;

PHP, 58 बाइट्स

सत्य के लिए 1 प्रिंट करता है और -1 झूठे के लिए और 0 एक टाई के लिए

<?=16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));

सभी विशिष्ट परिवर्तनों के लिए क्षमा करें, अब अंतिम आउटपुट आवश्यकताएं हैं। मूल रूप से आपके पास वर्तमान में क्या है, लेकिन उलट (सत्य के लिए 1, -1 झूठी के लिए) जो कि PHP में iirc के रूप में काफी आसान होना चाहिए-0 === 0
Skidsdev

@ माय्यूब यह बहुत लंबा है 1 बाइट अधिक है। सबसे अच्छा तरीका है कि भाषा की संभावनाओं द्वारा उत्पादन को निर्दिष्ट किया जाए और सामान्य न हो
Jörg Hülsermann

1
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));अतिरिक्त बाइट के बिना चाल करना चाहिए।
क्रिस्टोफ

1
गोल्फ संस्करण:<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
क्रिस्टोफ़

@Christoph मुझे एक बेवकूफ की तरह लगता है जो मैंने preg_match_all के बारे में नहीं सोचा है
Jörg Hülsermann


1

जावा 137 130 124 124 बाइट्स

a->{int c=32;for(int b:java.security.MessageDigest.getInstance("MD2").digest(a.getBytes()))c-=(b>>6&2)+(b>>2&2);return c;}

इसे ऑनलाइन टेस्ट करें!

मूल रूप से, प्रत्येक बाइट के लिए, हमें इसके 4 और 8 वें महत्वपूर्ण बिट्स के खिलाफ जांच करने के लिए कहा जाता है। मैं हेक्स प्रतिनिधित्व से बिल्कुल नहीं गुज़रता। इसलिए बिट्स के साथ खेलना शुरू करना स्वाभाविक ही लगा।

मूल्य <0मिथ्या हैं, मूल्य सत्य >0हैं, मूल्य 0न तो सत्य है और न ही मिथ्या है। हमेशा की तरह truthy और falsey इस समय जावा के लिए लागू नहीं किया जा सकता (क्योंकि यह नहीं हो सकता है trueया falseया 0नियम के साथ if(<truthy>),) तो मैं इस तरह के रूप में घोषित करने की छूट ले ली।

बचाता है

  1. 137 -> 130 बाइट्स: बिट ऑपरेशंस का उपयोग करके, 2 एवरीटाइम को हटाकर मुझे "फाल्सी" बिट मिलता है।
  2. 130 -> 124 बाइट्स: अधिक बिटवाइज़ ऑपरेशन
  3. 124 -> 123 बाइट्स: प्रतिस्थापित byteद्वारा intपाश घोषणा के लिए में।

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