6

I was wondering if its possible to make a one-liner with pyp that has the same functionality as this.

perl -l -a -F',' -p -e'if ($. > 1) { $F[6] %= 12; $F[7] %= 12;$_ = join(q{,}, @F[6,7]) }'

This takes in a comma separated list of numbers with 8 numbers per line and outputs it in the same format except the last two numbers in each line are reduced modulo 12. It also outputs the first line (the header line) verbatim first.

I have quite a lot of these obscure perl one-liners and I would like in the first instance to translate them all to python.

kojiro
  • 74,557
  • 19
  • 143
  • 201
marshall
  • 2,443
  • 7
  • 25
  • 45
  • 2
    Can you show what you've tried in implementing this in pyp and how far you've gotten? Are you stuck on something in particular? – kojiro May 04 '13 at 20:19

1 Answers1

4

For the record, I'm not sure I approve. Writing code horizontally doesn't seem to me that much better than writing it vertically, and -- in a friendly way -- I'm a little sceptical this offers as many advantages in practice as it might seem. One of the joys of Python is that you no longer have to worry about writing GolfScript.

That said, how about:

pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm"

which produces:

localhost-2:coding $ cat exam.pyp 
a,b,c,d,e,f,g,h
11,22,33,44,55,66,77,88
12,23,34,45,56,67,78,89
13,24,35,46,57,68,79,80
localhost-2:coding $ cat exam.pyp | pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm"
a,b,c,d,e,f,g,h
11,22,33,44,55,66,5,4
12,23,34,45,56,67,6,5
13,24,35,46,57,68,7,8

[Disclaimer: this is my first-ever pyp program, which I downloaded about ten minutes ago.]

DSM
  • 342,061
  • 65
  • 592
  • 494
  • There is something really broken about the speed of this one-liner. For a file with 500000 seconds the perl line takes < 2 seconds. The pyp line never seems to finish. It works fine on very small files. – marshall May 05 '13 at 18:16
  • I just created a large test file with for j in xrange(500000): print ",".join(str(i) for i in [random.choice(xrange(1000)) for i in xrange(8)]) – marshall May 05 '13 at 18:19
  • Posted separate question http://stackoverflow.com/questions/16378512/python-one-liner-converting-perl-to-pyp . – marshall May 05 '13 at 18:30