crypt :: String -> String -> String
crypt key salt =
taketail 10 $
unsafePerformIO $ peekCString $
unsafePerformIO $
withCString key $ \k ->
withCString salt $ \s ->
c_crypt k s
where
taketail :: Int -> [a] -> [a]
taketail i x = (reverse (take i (reverse x)))
makesalt :: String -> String
makesalt x =
map
fixsalt
(take 2
(if (length x) < 2 then ("H.") else (tail x)))
where
fixsalt :: Char -> Char
fixsalt c
| (inrange '0' '9' c) = c
| (inrange ':' '@' c) = (chr ((ord c) + 7))
| (inrange 'A' 'Z' c) = c
| (inrange '[' '`' c) = (chr ((ord c) + 6))
| (inrange 'a' 'z' c) = c
| c == '/' || c == '.' = c
| otherwise = '.'
where
inrange :: Ord a => a -> a -> a -> Bool
inrange low upp x = x >= low && x <= upp
tripcode :: String -> String
tripcode s = crypt s (makesalt s)
main :: IO ()
main = do
args <- getArgs
putStrLn (tripcode (head args))
Name:
Anonymous2006-11-04 7:12
Real men would do without unsafePerformIO. Plus your indent style gives me hives.
Still, this has got to be the most concise expression of the tripcode algorithm I've seen yet.
>>3
Doubt it. If there were one in the standard library, its definition would likely be exactly as you wrote (only more general with the types, of course).
>>3
Ooooooor you could do something with "drop" and "length". That's just one complete pass, instead of two reverses. Not that this kind of a mickey mouse optimization matters in this case...
Name:
Anonymous2006-11-04 9:29
If n is list length and k is take length then taketail i x = (reverse (take i (reverse x)))has a time cost of roughly n + 2k taketail3 i x =
let d = max 0 (length x - i)
in drop d xhas a time cost of roughly 2n - k
Still, this has got to be the most concise expression of the tripcode algorithm I've seen yet.
it's a much simplified version of the tripcode algorithm, and it's not all that concise...
perl1: #!/usr/bin/perl
(($salt=substr $ARGV[0].'H..',1,2)=~tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/)=~s/[^\.-z]/./g;
print substr(crypt($ARGV[0],$salt),-10),"\n";
c: #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/des.h>
int main(int argc, char *argv[]) {
const char saltchars[]=":;<=>?@[\\]^_`ABCDEFGabcdef";
char key[16]={0};
if(argc>1) strncpy(key,argv[1],8);
else exit(1);
char salt[3]={0};
char trip[11]={0};
int i=0;
int j;
strncpy(salt,key+1,2);
if(strlen(key)==2) salt[1]='H';
if(strlen(key)<2) {
salt[0]='H';
salt[1]='.'; }
if(strlen(key)==0) salt[0]='.';
for(i=0;i<2;i++) for(j=0;j<13;j++) if(salt[i]==saltchars[j]) salt[i]=saltchars[j+13];
if(salt[0]<'0'||salt[0]>'z') salt[0]='.';
if(salt[1]<'0'||salt[1]>'z') salt[1]='.';
memcpy(trip,DES_crypt(key,salt)+3,10);
puts(trip);
return(0); }
>>8
But these lack the clarity of the Haskell version. (Also, char salt[3]={0}; doesn't do what you might think it did, though the result is the same. For instance, char salt[3]={42}; would set the first element to 42 and the rest to 0.)
Only a functional programming nut could call that code "clear" or "consice".
Name:
Anonymous2006-11-04 13:01
>>9
What? = {0} is used to initialize arrays with zeros, nothing else.
Name:
Anonymous2006-11-04 13:04
javascript ftw.
first, include http://javascript.internet.com/passwords/javacrypt.js.
then, do this: String.prototype.translate = function (s1, s2) {
var o = new Object();
for (i=0; i<s1.length; i++) o[s1[i]] = s2[i];
var a=this;
for (i=0; i<a.length; i++) if (o[a[i]]) a[i] = o[a[i]];
return a;
};
alert(Javacrypt.crypt(((key=prompt('key?'))+'H..').substring(1,3).replace(/[^\.-z]/g,'.').translate(':;<=>?@[\\]^_`','ABCDEFGabcdef'),key)[0].substring(3));
>>27
Yes yes, let's all reimplement standard UNIX libc calls for every last program. That's so much more readable and has absolutely no chance at all of repeating the same bugs over and over!
Name:
Anonymous2006-11-15 18:02
Péter pue.
Name:
Anonymous2006-11-17 15:50
Perl sucks because there's a hundred ways of doing any given task. Haskell, on the other hand, fucking rocks!!
s zzs vvxv
and s ZVZchr 122Zie
and s ZVZchr 122Zie
and s ZVZchr 122Zie
and s SxSlcfirstSe
and s YZZxZYvvxvYi and print
z
and s ZVZchr 122Zie
and s ZVZchr 122Zie
and s ZVZchr 122Zie
and s SxSlcfirstSe
and s YZZxZYvvxvYi and print
>>40
also proof that the code tags don't work right on here. newlines right after [/code] get removed.
Name:
Anonymous2006-11-28 17:49
...NET?
Name:
Anonymous2006-12-09 14:14
Okay guys, I just learned list comprehension, and using that, I managed to turn my five line permutation function into a one-line golden masterpiece (I can't even understand the code anymore!). How's this for concise (LOL)!!
Any ideas on how I can remove the Eq dependency (/=) elegantly? I realize you usually want to be able to distinguish elements in a permutation, but it'd still be nice. Hmm... thinking about the code, I just figured it out! It does ys <- for every y <-. Nice, that explains why it works :)
Now, I want to see you C fanboys do this in 2000 lines of code!!
Name:
Anonymous2006-12-09 14:26
>>43
I just realized this doesn't work if two elements are the same... removing the Eq dependency would fix that, however.
Name:
Anonymous2006-12-09 14:54
>>43
how is this shit any better than obfuscated perl
it takes just as much effort to understand
Also, the Haskell solution is using simple language features, what's hard to understand about the solution is the actual algorithm used... I think, at least.
>>43
You could get rid of the Eq dependency by zipping the items on the input list with elements [1..], and then instead of having an Eq constraint on the 'a' type variable you could go with Int's Eq instance. If the caller needs the outputs to appear at most once in the output lists, s/he can just nub the input and be done with it.
Name:
Anonymous2006-12-15 20:30
Your code is incorrect. These will fail (compare to 2channel):
#><
#kami
Name:
sister preggo test in python2006-12-18 9:45
>>> def do_her():
... question = raw_input('do you really want to do her?')
... if question in ('y','yes','oh yes') : return True
... if question in ('n','no','im gay') : return False
... print 'is she pregnant?:'
... print do_her
Name:
Anonymous2006-12-18 10:11
>>51 >>8 it's a much simplified version of the tripcode algorithm,
anyway, this language is much better than all the other crap in this thread: function do_tripcode: dup. "2" "1" substr. "H." swap. concat. "A-Ga-f." ":-@[-` --{-" tr. crypt. "10" "3" substr.
function main: do_tripcode, print.
>>61
Incorrect, code written by novices is highly readable and thus easy to refactor into god-level unreadable Haskell.
Name:
Anonymous2007-01-03 10:26
>>61
It's not unreadable until you go entirely point-free and mix in some arrows for good measure.
Name:
Anonymous2007-01-03 10:34
Haskell is shit. I shouldn't have to achieve satori just to make a short program that takes 10 minutes in C.
Name:
Anonymous2007-01-03 11:03
>>53
If you can't tell me what language that is, maybe you can tell me how to google for "dup." instead of "dup".
Name:
Anonymous2007-01-03 12:15
>>65
I searched for "function dup substr concat swap crypt" in
msn.com and the first match was this thread.
Name:
Anonymous2007-01-03 12:19
dup. execute 'dup' (duplicates the value on top of the stack) instead of pushing it onto the stack" pop. "2" "1" substr. push '2' and then '1' onto the stack and then execute 'substr'" pop.
you should be able to figure out the rest...
as for what language it is, it doesn't have a name yet, but it does have a working compiler (currently unreleased) and about half of the standard library is written.
oops, just ignore the '" pop.' on the end of each of those lines...
thats how you do comments in this language, i replaced the " at the beginning with [/code] and forgot to take the stuff off the end of each comment.
Name:
Anonymous2007-01-03 12:24
>>67
Did you start from scratch, or adopt another compiler?
>>71
actually, no. i didn't even think of the similarities with forth, as i've never used forth... >>67
oops... the comma is a typo for a period.
the period means to pop the first value off the stack and execute it if it's a function or just discard it if it's not. so the function gets pushed onto the stack and then popped off and executed. except that the compiler doesn't actually do the push and pop.
and actually i guess you could use just a period instead of " pop." for comments...