Die Herausforderung ist einfach
Schreiben Sie ein Skript, das bei Eingabe einer Zeichenfolge die Zeichenfolge mithilfe des MD2-Hashing-Algorithmus hasht und dann entweder eine positive oder eine negative Ganzzahlausgabe zurückgibt, je nachdem, welcher Zeichensatz im resultierenden Hash häufiger als hexadezimale Zeichenfolge verwendet wird:
01234567 - (positive)
89abcdef - (negative)
- Die Eingabe ist immer eine Zeichenfolge, kann jedoch eine beliebige Länge von bis zu 65535 haben
- Die gesamte Eingabe, Leerzeichen und alles, muss gehasht werden
- Für die Zwecke dieser Herausforderung wird die Ganzzahl 0 weder als positiv noch als negativ angesehen (siehe Bindungsausgabe).
- Der häufigere Satz ist derjenige, dessen Zeichen in der hexadezimalen Hash-Zeichenfolge mit 32 Zeichen häufiger vorkommen
- Ihre Ausgabe kann nachgestellte Leerzeichen jeglicher Art enthalten, solange die einzigen Nicht-Leerzeichen eine gültige Wahrheits- oder False-Ausgabe sind
- Bei einem Gleichstand, bei dem die hexadezimale Zeichenfolge genau 16 Zeichen aus jedem Satz enthält, sollte das Programm eine 0 ausgeben
E / A-Beispiele
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
Gewinnkriterium
Das ist Code-Golf , die wenigsten Bytes gewinnen!
Antworten:
Oktave, 35 Bytes
* Benötigt die neueste Version von Octave (mindestens 4.2).
Berechnet Histcounts der Hash-Zeichenfolge mit der Mitte der Bins sind 7 und 8, berechnet dann die Differenz der Zählungen.
quelle
Mathematica, 43 Bytes
Gibt die Anzahl der Stellen in
01234567
minus der Anzahl der Stellen in aus89abcdef
.quelle
3E
zwischen 8 und 9 und nicht zwischen 7 und 8 liegt: |JavaScript (ES6), 731 Byte
Dieses Monster implementiert den MD2-Algorithmus, es ist also peinlich lang. Basierend auf js-md2 von Chen Yi-Cyuan.
quelle
Python 2 + Crypto ,
1089993918778 BytesPython hat kein natives integriertes für MD2.
12 Bytes dank @ovs gespeichert.
9 Bytes dank @FelipeNardiBatista gespeichert.
quelle
lambda s:cmp(sum((int(x,16)<8)-.5for x in MD2.new(s).hexdigest()),0)
sollte die Byteanzahl auf 93 reduzierensum(x<'8'for x ......
lambda s:sum(x<'8'for x in MD2.new(s).hexdigest())-16
für 78. Die Ausgabe kann eine beliebige Zahl sein, nicht nur-1,0,1
Java 8, 173 Bytes
-4 danke an dzaima
-128 danke an Oliver, das ist jetzt im Grunde seine Antwort.
Positiv für die Wahrheit. Negativ für Falschheit. 0 für 0.
quelle
for
undif
String s="";for(byte b:bytes)h+=h.format("%02x",b);
. Sie müssen auch kein vollständiges Programm schreiben, aber ein Lambda reicht aus :a->{... return x;}
. Schließlich kann die for-Schleife durch ersetzt werdenint x=s.codePoints().filter(c->c>47&&c<56).count();
. Alles in allem bekomme ich 173 für Ihren Algorithmus, Golf gespielt :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;}
. Mehr Golf ist möglich, aber dies ist eine Nettoverbesserung der Byteanzahl, nicht wahr?println
->print
undfor(char c:s.toCharArray())if("01234567".contains(""+c))x++;
->for(String c:s.split(""))if("01234567".contains(c))x++;
PHP, 50 Bytes
druckt 1 für wahr und -1 für falsch und 0 für ein Unentschieden
PHP, 58 Bytes
druckt 1 für wahr und -1 für falsch und 0 für ein Unentschieden
quelle
-0 === 0
echo 16<=>strlen(preg_filter("#[0-7]#","",hash(md2,$argn)));
sollte den Trick ohne zusätzliches Byte machen.<?=preg_match_all("/[0-7]/",hash(md2,$argn))<=>16;
PHP, 56 Bytes
quelle
Java
137130124123 BytesTesten Sie es online!
Grundsätzlich werden wir gebeten, für jedes Byte die 4. und 8. niedrigstwertigen Bits zu überprüfen. Ich gehe die Hex-Darstellung überhaupt nicht durch. Es schien also nur natürlich, mit Bits zu spielen.
Werte
<0
sind falsch, Werte>0
sind wahr, Wert0
ist weder wahr noch falsch. Die übliche Wahrheit und Falschheit kann dieses Mal nicht auf Java angewendet werden (weil es nichttrue
oderfalse
oder0
mit der Regel sein kannif(<truthy>)
), also habe ich mir die Freiheit genommen, dies als solche zu deklarieren.Speichert
byte
durchint
in der for-Schleifendeklaration.quelle
Tcl + Trf-Paket , 79
Probieren Sie es online aus . (Danke @Dennis für das Hinzufügen von Tcl zu TIO.)
quelle