Задача проста
Напишите скрипт, который при вводе строки будет хэшировать строку с использованием алгоритма хеширования MD2 , а затем возвращать вывод положительного целого или отрицательного целого числа, основанный на том, какой набор символов ниже является более распространенным в результирующем хеше в виде шестнадцатеричной строки:
01234567 - (positive)
89abcdef - (negative)
- Ввод всегда будет строкой, но может иметь любую длину до 65535
- Весь ввод, пробелы и все, должны быть хэшированы
- Для целей этой задачи целое число 0 не считается ни положительным, ни отрицательным (см. Вывод по связи)
- Более распространенным набором является тот, чьи символы чаще встречаются в шестнадцатеричной хэш-строке из 32 символов.
- Ваш вывод может содержать конечные пробелы любого вида, при условии, что единственные непробельные символы являются действительными выводами true или false
- В случае связи, где шестнадцатеричная строка содержит ровно 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
Критерий победы
Это код-гольф , побеждает меньше байтов!
Ответы:
Октава, 35 байт
* Требуется последняя версия Octave (минимум 4.2).
Вычисляет историю хеш-строки с центром бинов 7 и 8, а затем вычисляет разницу в количестве.
источник
Mathematica, 43 байта
Выводит количество цифр в
01234567
минус количество цифр в89abcdef
.источник
3E
между 8 и 9, а не между 7 и 8.: |JavaScript (ES6), 731 байт
Этот монстр реализует алгоритм MD2, поэтому он очень длинный. Основано на js-md2 Чэнь И-Цюаня.
источник
Python 2 + Crypto ,
1089993918778 байтPython не имеет встроенной встроенной функции для MD2.
Сохранено 12 байтов благодаря @ovs.
Сохранено 9 байтов благодаря @FelipeNardiBatista.
источник
lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)
должно уменьшить количество байт до 93sum(x<'8'for x ......
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16
за 78. на выходе может быть любое число, а не только-1,0,1
Java 8, 173 байта
-4 благодаря дзайме
-128 благодаря Оливеру, это в основном его ответ сейчас.
Позитив для правды. Негатив для ложных. 0 для 0.
источник
for
иif
String s="";for(byte b:bytes)h+=h.format("%02x",b);
. Кроме того , вам не нужно писать полную программу, но будет достаточно для лямбда:a->{... return x;}
. Наконец, цикл for можно заменить на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++;
PHP, 50 байт
печатает 1 для правды и -1 для ложного и 0 для связи
PHP, 58 байт
печатает 1 для правды и -1 для ложного и 0 для связи
источник
-0 === 0
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));
должен сделать трюк без дополнительного байта.<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
PHP, 56 байт
источник
Java
137130124123 байтаПроверьте это онлайн!
Обычно для каждого байта нас просят проверить его 4-й и 8-й младшие биты. Я вообще не прохожу шестнадцатеричное представление. Поэтому казалось естественным начать играть с битами.
Ценности
<0
ложны, ценности>0
правдивы, ценность0
не правдива и не ложна. Обычная truthy и falsey не может быть применен к Java на этот раз (потому что не может бытьtrue
илиfalse
или0
с правиломif(<truthy>)
), так что я взял на себя смелость объявить как таковой.Сохраняет
byte
наint
в для объявления петли.источник
Пакет Tcl + Trf , 79
Попробуйте онлайн . (Спасибо @Dennis за добавление Tcl в TIO.)
источник