আমার MD2 হ্যাশগুলিতে কোন অক্ষরগুলি বেশি দেখা যায়?


11

চ্যালেঞ্জ সহজ

একটি স্ক্রিপ্ট লিখুন, যখন একটি স্ট্রিং ইনপুট দেওয়া হয়, তখন MD2 হ্যাশিং অ্যালগরিদম ব্যবহার করে স্ট্রিংটি হ্যাশ করবে এবং তারপরে ধনাত্মক পূর্ণসংখ্যার বা নেতিবাচক পূর্ণসংখ্যার ফলাফলের ভিত্তিতে নীচে বর্ণিত সেটটিকে হেক্সাডেসিমাল স্ট্রিং হিসাবে ফলাফলের হ্যাশের মধ্যে আরও সাধারণ দেখাবে:

01234567 - (positive)
89abcdef - (negative)
  • ইনপুটটি সর্বদা একটি স্ট্রিং থাকবে তবে 65535 অবধি কোনও দৈর্ঘ্যের হতে পারে
  • পুরো ইনপুট, সাদা স্থান এবং সমস্ত, অবশ্যই হ্যাশ করা উচিত
  • এই চ্যালেঞ্জের উদ্দেশ্যে, পূর্ণসংখ্যা 0টিকে ইতিবাচক বা নেতিবাচক হিসাবে বিবেচনা করা হয় না (টাই আউটপুট দেখুন)
  • আরও সাধারণ সেটটি হ'ল 32 অক্ষর হেক্সাডেসিমাল হ্যাশ স্ট্রিংয়ের মধ্যে যার চরিত্রগুলি বেশি সাধারণ
  • আপনার আউটপুটটিতে যে কোনও ধরণের শ্বেত স্পেস থাকতে পারে, যতক্ষণ না কেবলমাত্র শ্বেতস্থান অক্ষর বৈধ সত্য বা মিথ্যা আউটপুট থাকে
  • টাই করার ক্ষেত্রে, যেখানে হেক্সাডেসিমাল স্ট্রিংটিতে প্রতিটি সেট থেকে ঠিক 16 টি অক্ষর রয়েছে, প্রোগ্রামটি 0 আউটপুট করা উচিত

আই / ও উদাহরণ

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 হ্যাশিং অ্যালগরিদমকে এটিকে স্বয়ংসম্পূর্ণ করার জন্য লিঙ্ক করা বা আদর্শভাবে ব্যাখ্যা করা ভাল।
মার্টিন এন্ডার

@ মার্টিনএেন্ডার করবে!
স্কিডসদেব

আমি মনে করি জিত , হেরে , এবং টাই করার
গণিত জাঙ্কি

@ মাথজানকি সত্য, সম্ভবত এতটা স্পেকটি পরিবর্তন করা উচিত নয়, তবে আমার ধারণা কেবল 1, 0 বা -1 থাকা সবচেয়ে ভাল উপায়
স্কিডসদেব

2
এটি আমাকে একটি গিরগিটির চ্যালেঞ্জ হিসাবে আঘাত করে । হয় আপনার ভাষার MD2 করতে একটি বিল্ট-ইন বা লাইব্রেরি রয়েছে এবং বাকীটি সরল অক্ষর গণনা, বা এটি হয় না এবং আপনাকে নিজে এটি প্রয়োগ করতে হবে।
xnor

উত্তর:


1

অক্টাভা, 35 বাইট

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

* অষ্টাভের সর্বশেষতম সংস্করণ প্রয়োজন (কমপক্ষে 4.2)।

এটির কেন্দ্রের বিন্যাসের সাথে হ্যাশ স্ট্রিংয়ের গণনা হিস্টকাউন্টগুলি 7 এবং 8 হয় তারপরে গণনার পার্থক্য গণনা করে।


কয়েক দিন হয়ে গেছে আমি আপনাকে বিজয়ী উত্তর হিসাবে তুলে ধরব, যদি পরে কোনও সংক্ষিপ্ত সমাধান আসে তবে আমি সর্বদা এটি পরিবর্তন করতে পারি। সাবাশ!
স্কিডসদেব

@ মায়ুব ধন্যবাদ!
rahnema1


8

জাভাস্ক্রিপ্ট (ES6), 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 অ্যালগরিদম বাস্তবায়নের একমাত্র।
স্কিডদেব

সর্বোচ্চ পয়েন্টের প্রাপ্য সর্বোচ্চ বাইট উত্তর।
ম্যাজিক অক্টোপাস উরান

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 টি বাইট সংরক্ষণ করা হয়েছে।


lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)বাইট গণনাটি 93
ovs

@ovs খুব চালাক!
mbomb007


lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-1678 এর জন্য আউটপুটটি কোনও সংখ্যা হতে পারে, কেবল নয়-1,0,1
ফিলিপ নারদী বাতিস্তা

4

জাভা 8, 173 বাইট

-4 ধন্যবাদ তাইজাইমা

-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
আপনি এবং 4-বাইট সংরক্ষণ করতে পারেন এর forif
ঘের

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();। সব সব, আমি তোমার অ্যালগরিদম golfed জন্য 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;}। আরও গল্ফিং সম্ভব, তবে এটি বাইট গণনায় নেট উন্নতি, তাই না?
অলিভিয়ার গ্রাগোয়ার

printlnprintfor(char c:s.toCharArray())if("01234567".contains(""+c))x++;for(String c:s.split(""))if("01234567".contains(c))x++;
গল্ফকে

@ অলিভিয়ারগ্রোগোয়ার জাভা 8-এর বিষয়ে আমি বেশি কিছু জানি না, আমি একই সময়ে গ্রোভি / গ্রেইলে স্যুইচ করেছি।
যাদু অক্টোপাস উরন

3

পিএইচপি, 50 বাইট

সত্যের জন্য 1 এবং মিথ্যাটির জন্য -1 এবং টাইয়ের জন্য 0 টি প্রিন্ট করে

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

পিএইচপি, 58 বাইট

সত্যের জন্য 1 এবং মিথ্যাটির জন্য -1 এবং টাইয়ের জন্য 0 টি প্রিন্ট করে

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

সমস্ত নির্দিষ্ট পরিবর্তনগুলির জন্য দুঃখিত, চূড়ান্ত আউটপুট প্রয়োজনীয়তা এখন আছে। মূলত আপনি বর্তমানে যা বিপরীত করেছেন (সত্যবাদী হিসাবে 1, মিথ্যা জন্য -1) যা পিএইচপি-0 === 0
তে

@ মাইউব এটি অনেক দীর্ঘ 1 বাইট আরও যথেষ্ট। সবচেয়ে ভাল উপায় হ'ল আউটপুটটি ভাষার সম্ভাবনার দ্বারা নির্দিষ্ট করা এবং সাধারণ নয়
জার্গ হালসারম্যান

1
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));অতিরিক্ত বাইট ছাড়া কৌশলটি করা উচিত।
ক্রিস্টোফ

1
গল্ফ সংস্করণ:<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
ক্রিস্টোফ

@ খ্রিস্টফ আমি এমন এক নির্বোধের মতো অনুভব করি যা আমি
প্রিগ_ম্যাচ_সাল্ট


1

জাভা 137 130 124 123 বাইট

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

এটি অনলাইন পরীক্ষা!

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

মানগুলি <0মিথ্যা, মান >0সত্যবাদী, মান 0সত্যবাদী বা মিথ্যা নয়। স্বাভাবিক truthy এবং falsey এই সময় জাভা প্রয়োগ করা যাবে না (কারণ এটা হতে পারে না trueবা falseবা 0নিয়ম সঙ্গে if(<truthy>),) তাই আমি যেমন ডিক্লেয়ার স্বাধীনতা গ্রহণ করেন।

সংরক্ষণ

  1. 137 -> 130 বাইট: বিট ক্রিয়াকলাপগুলি ব্যবহার করে গল্ফ করা হয়েছে, প্রতিবার 2 টি সরিয়ে আমি "ফালসি" বিট পাই।
  2. 130 -> 124 বাইট: আরও বিটওয়াইস অপারেশন
  3. 124 -> 123 বাইট: প্রতিস্থাপিত byteদ্বারা intলুপ ঘোষণা জন্য।

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