Create a regex to match a given range of integers in a given radix

6

Task

Write a program/function that, given three integers n,a,b prints a regular expression which matches all of the base-n integers from a to b (and no integers outside of that range).

Your algorithm should, in theory, work for arbitrarily large integers. In practice, you may assume that the input can be stored in your data type. (don't abuse native data type, that's a standard loophole)

Input

Three integers, n, a, b where n is in the range 1-32. a and b may be taken as base-n string/character list/digit list.

Output

A single string, represent the regex.

Rules

  • Base-n integers use the first n digits of 0123456789ABCDEFGHIJKLMNOPQRSTUV, you can choose to use upper-case or lower-case.
  • a and b may be negative, denoted by a - in front of the integer
  • You may assume a ≤ b.
  • Any regex flavor is allowed.
  • The behavior of the regex on strings not a base-n integer is undefined.

Winning criteria

Answers will be scored by the length of the code in bytes. (so rules apply)

Josh Withee

Posted 2017-12-18T16:05:03.933

Reputation: 449

Should we be able to match integers inside other text, or are we guaranteed they will be on their own? – Erik the Outgolfer – 2017-12-18T16:49:23.533

Also, should we be able to match negative integers too? If so, how will the sign be represented? – Erik the Outgolfer – 2017-12-18T16:51:43.730

Yes it should be able to match negative integers. Looks like that got edited out of the question. – Josh Withee – 2017-12-18T17:06:44.533

You can assume the integer will be on its own – Josh Withee – 2017-12-18T17:07:27.137

So, are negative integers represented with a - in the front or something else? – Erik the Outgolfer – 2017-12-18T17:10:00.760

@EriktheOutgolfer question updated – Josh Withee – 2017-12-18T19:12:00.157

Answers

4

05AB1E, 17 bytes

ŸεD0‹'-×sÄIB«}'|ý

Try it online!

For some reason I don't seem to be able to replace I with ³.

Erik the Outgolfer

Posted 2017-12-18T16:05:03.933

Reputation: 38 134

2

Jelly, 24 bytes

ƓØBḣḊ;0
rµṠṾṖ$€ż⁸Aṃ¢¤j”|

Try it online!

Take 2 input from command line argument as decimal number, and base from stdin.

user202729

Posted 2017-12-18T16:05:03.933

Reputation: 14 620

Looks like this doesn't work for negative numbers. – Erik the Outgolfer – 2017-12-18T19:19:14.403

@EriktheOutgolfer Fixed. – user202729 – 2017-12-19T01:21:50.480

1

Python 2, 157 bytes

n,a,b=input();s=o=''
for i in range(a,b+1):
 if i<0:i=abs(i);s='-'
 if i==0:o='0'+o
 while i:i,r=i/n,i%n;o=[`r`,chr(55+r)][r>9]+o
 o='|'+s+o;s=''
print o[1:]

Try it online!

ovs

Posted 2017-12-18T16:05:03.933

Reputation: 21 408