Generate every ASCII string

5

Description

There are an infinite number of ASCII strings. Write a program that will output every possible ASCII string exactly once.

The ordering does not matter, but you must be able to show that for any possible ASCII string s, there exists an integer n such that s is the nth string in the output. This restriction means that you cannot output 'a', 'aa', 'aaa', 'aaaa', ..., since the string 'b' will never occur.

The simplest ordering (shown here in terms of letters so I don't have to type unprintables) is:

'', 'a', 'b', 'c', ..., 'z', 'aa', 'ab', ..., 'az', 'ba', 'bb', 'bc', ... 'zz', 'aaa', ...

Essentially, this is counting in base 128 using ASCII characters.

Rules

  • The empty string is required
  • You may use any valid ordering you want
  • All possible strings using ASCII must be known to occur in the output
  • The ordering does not need to be deterministic, as long as you can show that every string will be guaranteed to occur. Be careful if you use randomness for each string, because at some point your bits of entropy may not be enough to guarantee a unique string.

Example orderings

Note that, again, I'm showing only letters for the examples, but you have to include all ASCII characters.

Valid:

'', 'a', 'b', 'c', ..., 'z', 'aa', 'ab', ..., 'az', 'ba', 'bb', 'bc', ... 'zz', 'aaa', ...

'', 'z', 'y', 'x', ..., 'a', 'zz', 'zy', ...

'', 'a', 'b', 'ab', 'ba', 'c', 'ac', 'ca', 'bc', 'cb', ...

Invalid:

'', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa', ...

'', 'a', 'ab', 'abc', 'abcd', ..., 'abc...xyza', ...

mbomb007

Posted 2017-08-17T00:18:39.453

Reputation: 21 944

Question was closed 2017-08-17T06:55:28.987

This means only printable ascii right? – Maltysen – 2017-08-17T00:20:53.113

I actually intended this to be all ASCII. – mbomb007 – 2017-08-17T00:22:01.990

uhhh should I repr before printing or something? – Maltysen – 2017-08-17T00:23:05.957

It's up to you. Maybe for testing purposes. Defining a Python generator expression would also be acceptable. – mbomb007 – 2017-08-17T00:24:05.510

2Related, maybe dupe. In fact, I think a past challenge to output all ASCII strings was closed as a dupe. – xnor – 2017-08-17T00:31:45.263

*bijective base 128 – Destructible Lemon – 2017-08-17T00:32:24.937

Can we output the string in bytes (i.e. in Python b'\x01') or must we print the actual character? – notjagan – 2017-08-17T00:48:25.267

3It would have been better to use only printable ASCII. It's difficult to output non-printable chars and check they are the correct ones – Luis Mendo – 2017-08-17T01:23:12.667

@xnor Ah. Yeah maybe a dupe. I searched for a good while looking for potential dupes, and I couldn't find that challenge. – mbomb007 – 2017-08-17T03:02:48.653

And now find a program doing this by Gödel numbering :) – Felix Palmen – 2017-08-17T06:20:34.463

Answers

0

SOGL V0.12, 10 bytes

]¶tēN»─{Rt

Try it Here!

Note that this spams the stack with an extra item every iteration, and with how slow SOGL is, it gets out of hand quickly.

dzaima

Posted 2017-08-17T00:18:39.453

Reputation: 19 048

3

Python 2, 69 62 bytes

a=0
while 1:
 k=a
 while k:print chr(k%128),;k>>=7
 print;a+=1

-7 bytes thanks to @notjagan

Try it online!

fireflame241

Posted 2017-08-17T00:18:39.453

Reputation: 7 021

-7 bytes. – notjagan – 2017-08-17T00:34:55.777

2

Proton, 96 bytes

i=0
(p=print)()
while++i for j:cartesianpower(i,0..128)p(j is tuple? ''.join(map(chr,j)):chr(j))

Try it online!

HyperNeutrino

Posted 2017-08-17T00:18:39.453

Reputation: 26 575

I am sure there's some way to print an empty line that's shorter than (p=print)() but I can't find it if there is – Stephen – 2017-08-17T00:42:34.553

1

Pyth - 12 bytes

.Vj^sCMS127b

Finite version online.

Maltysen

Posted 2017-08-17T00:18:39.453

Reputation: 25 023

1

Ruby, 64 bytes

(f=->a{f[a.flat_map{|s|puts s;(1..127).map{|b|s+b.chr}}]})[['']]

Recursive function that prints the array a then calls itself on a newly constructed array whose contents are (in set notation) { sc | s in a, c in ASCII }. We kick it off with an array containing the empty string.

m-chrzan

Posted 2017-08-17T00:18:39.453

Reputation: 1 390

1

Mathematica, 44 41 61 bytes

Crossed out 44 is still regular 44...

0//.i_:>(Print@@@Array[FromCharacterCode,128,0]~Tuples~i;i+1)

Prints in the pattern: "", "a", "b", ... , "z", "aa", "ab", ... , "az", "ba", "bb", ... , "zz", "aaa", "aab", ... (but with \00, \01, ...).

Try it on Wolfram Sandbox

Unfortunately, I could not use the built-in CharacterRange function (which would have reduced 10 bytes) because it cannot generate the null character.


I recommend testing with the version that pauses 0.25 sec between each Print calls:

0//.i_:>((Pause[0.25];Print@##)&@@@Array[FromCharacterCode,128,0]~Tuples~i;i+1)

JungHwan Min

Posted 2017-08-17T00:18:39.453

Reputation: 13 290

0

Python 3, 103 78 bytes

n=0
while 1:print(n.to_bytes(n.bit_length()+7>>3,"big").decode());n+=n+1&128|1

Try it online!

notjagan

Posted 2017-08-17T00:18:39.453

Reputation: 4 011