Hexdump:
6800B807BF8007BE8200B40EAC3C0D741338D8740A720481EF400181C7A000AB86C3EBE8C3
Run in MS-DOS with 50 line console, the input is taken from the command line.
E.g.
wave.com 1234567890qwertyuiopasdfghjklzxcvbnm
Download binary here
Update: Shaved off three bytes thanks to jrandomhacker
54 characters, if you let the interpreter handle input/output.
e=:|:@((#&' '@],[)"0[:(-<./)0,[:+/\[:(}:(>-<)}.)a.i.])
65 to explicitly read from stdin and write to stdout.
(|:((#&' '@],[)"0[:(-<./)0,[:+/\[:(}:(>-<)}.)a.&i.)~1!:1[3)1!:2[4
e '1234567890qwertyuiopasdfghjklzxcvbnm' z l x v n k c b m j h g y p s f t u o a d w r i 9 q e 8 0 7 6 5 4 3 2 1
e '31415926535897932384626433832795028841971693993751058209749445923078164062862' 9 9 8 6 6 9 6 8 7 3 3 4 2 4 8 9 88 3 4 5 2 5 5 2 33 3 7 5 2 4 9 9 99 7 1 1 3 2 0 1 7 6 3 3 5 8 8 6 1 1 5 2 9 9 3 7 1 4 6 8 0 0 7 9 5 2 0 0 2 6 4 44 2
NB. Look up ASCII codes ord =: a. i. ] ord 'p4ssw0rd' 112 52 115 115 119 48 114 100 NB. Going up? up =: }: < }. up ord 'p4ssw0rd' 0 1 0 1 0 1 0 NB. Going down? down =: }: > }. down ord 'p4ssw0rd' 1 0 0 0 1 0 1 NB. Combine to get ±1 updown =: }: (> - <) }. updown ord 'p4ssw0rd' 1 _1 0 _1 1 _1 1 NB. Start with 0, follow up with partial sums sum =: 0 , +/\ sum updown ord 'p4ssw0rd' 0 1 0 0 _1 0 _1 0 NB. Subtract the minimum to get sequence with base at 0 fix =: - <./ fix sum updown ord 'p4ssw0rd' 1 2 1 1 0 1 0 1 NB. For convenience, name this chain of functions d =: [: fix [: sum [: updown ord
NB. Make spaces before the characters push =: (#&' ' @ ] , [)"0 d push 'p4ssw0rd' p 4 s s w 0 r d NB. Turn it on its side |: push 'p4ssw0rd' w r p ss 0 d 4 NB. Combine into one named function… e =: |: @ push NB. …and inline everything e =: |:@((#&' '@],[)"0[:(-<./)0,[:+/\[:(}:(>-<)}.)a.i.])
The shortest code by character count to print a 'wave' from the input string.
Console.WriteLine("a 'wave' from the input string.");
144 characters originally by barnaba:
chop($_=<>);$l=length;push(@a," "x$l)for(1..$l*2);$l+=(ord $p<=>ord $_),substr($a[$l],$r++,1)=$p=$_ for(split //);/^\s+$/||print "$_\n" for(@a)
121 characters from optimization by Chris Lutz:
$_=<>;chop;$a[@a]=" "x$l for 1..($l=length)*2;$l+=$p cmp$_,substr($a[$l],$r++,1)=$p=$_ for split//;/\S/&&print"$_\n"for@a
94 characters from further optimization:
$_=<>;@a=($"x($l=y///c).$/)x(2*$l);s/./substr$a[$l+=$"cmp$&],"@-",1,$"=$&/ge;/\S/&&print for@a
Note that in traditional Perl golf, one usually adds the number of switches and the length of the code (which would help here by a few strokes), but here we're using stand-alone programs with no switches.
This works in my test on FreeSBIE:
o;main(c){for(;(c=getchar())-10;o=c)printf("\33[1%c%c",c<o?66:c>o?65:71,c);}
But in order to see the output clearly, you have to run it with something like this:
clear ; printf "\n\n\n\n\n" ; echo the quick brown fox jumps over the lazy dog | ./a.out ; printf "\n\n\n\n\n"
Does this count?
v,s="",raw_input()
m=n=len(s)
r=[' ']*n
q=[r[:]for i in range(2*n)]
for j,i in enumerate(s):
m+=(i<v)-(i>v)
q[m][j],v=i,i
for i in q:
if i!=r:print''.join(i)
I haven't done much to compress it yet though. Porting it to something with a spaceship operator now.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With