# Faux Source Code

Output one random character for each character of source code (as illustrated below). The probability of each character is its frequency in the original source code. Thus the output will be fake source code resembling a quine.

# Specification

• Restrictions
• Standard constrains apply. No empty programs or functions. Also no reading your own source.
• Output
• The number of characters output should be exactly the number of characters in the source code
• Each output character should be randomly choosen
• The probability of choosing any character is equal to (occurrences in source) / (length of source)
• This means that even a unary solution needs to 'randomly' choose 1 with probability 1. Which is to say that the output can't be hard coded.
• Winning
• This is code golf, so fewest bytes wins

# Example

Program           Frequency           Probability           Possible Output
-------           ---------           -----------           ---------------
a@!@              a - 1               a - 25%               @@a@
! - 1               ! - 25%
@ - 2               @ - 50%

Program           Frequency           Probability           Possible Output
-------           ---------           -----------           ---------------
caBaDBcDaBDB       a - 3               a - 25%               aaaBBBBccDDD
B - 4               B - 33%
c - 2               c - 17%
D - 3               D - 25%

• Are single-character quines allowed? Sep 7, 2016 at 21:59
• @NathanMerrill Yes, single character (and other unary) solutions are allowed. However, their output still needs to be randomly chosen. Sep 7, 2016 at 22:03
• How shall I find the occurences of characters in a file if I am not allowed to read it? Sep 7, 2016 at 22:38
• Is this code-golf? Sep 7, 2016 at 23:54
• @VolAnd No. The probability of each character appearing is based on the character frequency. If you flip a coin twice and it lands on heads once, it doesn't have to hand on tails the second time. Sep 8, 2016 at 6:29

# Perl 5, 54 bytes

$_=q{print$_[rand@_]for@_="\$_=q{$_};eval"=~/./g};eval


Try it online!

Produces output like:

_anr_;q.=fn_}v"_eo_f=n\di{nqde}[;}}o}t==@$@$=nvr$}/r=. "q}=g{;}=[av$a}a__l[q@@;$;_}./@__a.ne=@@i_}_aet.=$=_o"
/arr_r]po{{l_=;__e"_et=="@vr__a_}@nl"ll~$=~_q~d"=v$~$/ q/@=_$__{f{vl;.]@=__=@lpapr}da@eeg_[$@lr\_{{pq$vrq=/
=v{[_l=p{{={/n$nv$n[_/aev_v=@on}la;}q{_otr$oaglve$.a_}
_aa;@r='{{=@{ntf;;.if}f}a$;$g/n;g;_}rroaqra=;}l.gre[t'


In a brief test, ~3-4% of the results of the program eval successfully. I'm not sure what that says about Perl...

• Ahah, that comment about the 3% of successful eval! Nice one! ;-)
Sep 30, 2016 at 19:42
• @Dada Seriously! The submissions in the answer genuinely work! I was pretty impressed... Sep 30, 2016 at 19:45
• Hopefully, from what I've seen, it just comes from the output being a entire single quoted string (with ' or q//, q{} etc) !
Sep 30, 2016 at 19:52
• @Dada Yeah, or a regex match. Made me chuckle though! :) Sep 30, 2016 at 21:11
• Happy to see you golfing again btw! :)
Sep 30, 2016 at 21:20

## CJam, 14 bytes

{{E*mR}mR}E*


Try it online!

### Explanation

Each character appears exactly twice, so the probabilities of the characters should all be the same.

{           e# Repeat this block 14 times.
{E*mR}   e# Push this (nonsensical) block.
e# Stringify it, giving the string "{E*mR}", which contains each of the
e# seven characters once.
mR        e# Select one of the characters at random.
}E*


# Jelly, 13 bytes

“;⁾vṾWṁ$X€”vṾ  Try it online! ### How it works “;⁾vṾWṁ$X€”vṾ  Main link. No arguments.

“;⁾vṾWṁ$X€” Set the argument and return value to the string s := ';⁾vṾWṁ$X€'.
Ṿ  Uneval; construct a string representation of s.
This yields r := '“;⁾vṾWṁ$X€”'. v Dyadic eval; evaluate s with argument r. ;⁾vṾWṁ$X€     Evaluated link (s). Argument: r

⁾vṾ          Yield 'vṾ'.
;             Concatenate r with 'vṾ'.
This yields t := '“;⁾vṾWṁ$X€”vṾ', i.e., the original source code.$       Combine the previous two links into a monadic chain.
W           Wrap; yield ['“;⁾vṾWṁ$X€”vṾ']. ṁ Mold; repeat ['“;⁾vṾWṁ$X€”vṾ'] once for each charcter in t.
X€     Random each; select a character, uniformly at random, of each
of the 13 repetitions of t.


# Japt, 22 bytes

"+Q ²£ZgMqB"+Q ²£ZgMqB


Test it online!

### How it works

"+Q ²£ZgMqB"+Q ²£ZgMqB  // Implicit: B = 11
"+Q ²£ZgMqB"            // Take this string.
+Q          // Append a quotation mark.
²        // Double the result.
£       // Replace each char in the result Z with
Zg     //  the char in Z at index
MqB  //   random integer in the range [0, 11).
// Implicit: output last expression


# Pyth, 16 Bytes

smO+N"m1NOs+6"16


try it online!

Contains each char twice therefore the probability is the same as if each was only in there once.

smO+N"m1NOs+6"16     #
+N"m1NOs+6"       # Add a quotation mark to the string: "m1NOs+6
O                  # random choice from the string
m            16     # do this 16 times.
s                    # join the list into a string


# PHP, 71140110124140 120 bytes

for($i=2*$n=strlen($s='for($i=2*$n=strlen($s=.chr(39));$i--;)echo$s[rand(0,$n-1)];'.chr(39));$i--;)echo$s[rand(0,$n-1)];


run with php -d

1. creates a string containing the code without the quotation marks
2. and concatenates the quotation mark once using ord
(same probability as if I would double the string and add two quotes);
3. then loops over twice the length of the string to get random characters from it.

Can possibly be golfed further, but my attempts on eval where futile so far.
I will probably not go deeper here.

• The probability of each character is its frequency in the original source code. I may be wrong, but it doesn't look like this entry meets this requirement. Sep 7, 2016 at 22:34
• Oh I missed that point. Back to the editor. How can this be done without reading the code? Sep 7, 2016 at 22:35
• Using this, I got a syntax error, unexpected '<'. But I'm not familiar with PHP, how do I test this? Sep 8, 2016 at 1:00
• @NonlinearFruit: Did you use the -d flag? This is supposed to be saved to a file and then called with php or php-cgi without any flags. Maybe you can use a heredoc. Sep 8, 2016 at 1:49
• @NonlinearFruit: ... or just remove the leading <? for usage with -d. Sep 8, 2016 at 12:56

Python 2, 88 bytes

s='''from random import*; print "".join(choice(s) for c in "s='"+s+"';exec s")''';exec s


All actual merit in getting this far goes to mbomb007 - thanks for your help (and the pointer about backslashes)

• This is a quine-like challenge, without input or reading your source code (suppose it is n characters long), you need to print n random characters. Where the probability of a symbol c being chosen is equal to (number of times c occurs in your solution) / n. Sep 8, 2016 at 16:05
• So more like this? exec("""s = 'from random import choice; print "".join([choice(s) for c in s])'; exec(s)""") Sep 8, 2016 at 16:23
• You haven't included the single quotes yet, and you don't need the square brackets within the join. Sep 8, 2016 at 16:36
• Thanks - and right, I got a little caught up in the rush of nudging closer to the solution Sep 8, 2016 at 16:37
• Here you go: s='''from random import*;print"".join(choice(s)for c in s+"s='';''exec s''")''';exec s. I wish I'd thought of that. Sep 8, 2016 at 16:41

## Ruby, 47 bytes

eval r="47.times{$><<('eval r=%p'%r)[rand 47]}"  This is based on the standard eval quine: eval r="$><<'eval r=%p'%r"


It's a byte longer than the shortest quine, but it's usually the better choice for generalised quines, because any computation done on the source code string does not need to be duplicated. Whereas in the usual quine, every additional computation needs to go both inside and outside the main string, it is only needed inside the main string for this kind of quine.

As for what the code actually does: after obtaining a string representing the entire source code, we simply select a random character (by selecting a random index) 47 times and print each character separately.

# Wolfram Language/Mathematica, 109 Bytes

Function[Print[StringJoin[RandomChoice[StringSplit[StringJoin[ToString[FullForm[Slot]],"[]"],""],109]]]][]


sample output:

niPi[no,ili[Siu[,Sdoio9nthg"t ginuu[1[o]"i,icgi[0TncrS"[ln"o0]r,i][Jon[[et]0"]m [ri"a[]motrin,iFoFnultnnno,Jl


Oh those square brackets.

# JavaScript, 128 bytes

a=";a+=uneval(a);alert(a.replace(/./g,_=>a[Math.random()*64|0]))a=";a+=uneval(a);alert(a.replace(/./g,_=>a[Math.random()*64|0]))


Note: only works in Firefox due to the use of uneval.

Sample runs:

)a(rgc=d6m_a4uar=hp(lll(,d=m=dee(M(gtraoan0)(M(aaaa(M]c)e)/M()/u//M6_n/a"*unea(/>atugrn(a=nav"|;)|=)/,ataa,aaangtue;am)t0;|ctoa/
=lvct;eee,,a.e=6r0;);Mtaaoa.aeea4)a[r.6]e/ll+l.)=)|a[(c"rao4ea/=_acaMh=veerva"a(_(d(l)lgn.;rM">=ea40a*).e(h(laa6r)4a)rhlar=t(ta[
[rt]ll]n))aota.e)g;>ae*;..4tt];l[;].*lnr4(mnM|alg(a.ag(.=e(a>>aa>.hga;a/pat+elc];apc=(ag)tao.).ll4u)dah]r(ul)>lr;,)ret(e/g(=_c*r

• I'm now really surprised that this produced more valid code in Perl than it appears it would in JS! Not as many fun words here, except gtraoan which is nearly a groan I guess... Nov 2, 2016 at 21:04
• @DomHastings Well, Perl is more of a mash of punctuation than JS ;) Nov 2, 2016 at 21:06
• Definitely! It's more of a mess of punctuation than an explosion in a punctuation factory! but I quite like that! Nov 2, 2016 at 21:09
• Does " have a probability of showing up? Nov 2, 2016 at 21:11
• @NonlinearFruit Yup. There's at least one in the first, second, and last example outputs. Nov 2, 2016 at 21:12

# Jelly, 44 bytes

I hope I have interpreted all the rules correctly (I'm not quite sure what the "carry payload" thing is in meta or if it's even relevant to this challenge).

“ẋ2;8220Ọ;8221ỌXµ44Ð¡Ḋ”ẋ2;8220Ọ;8221ỌXµ44Ð¡Ḋ


Test it out at TryItOnline

This constructs a string from which to choose characters. The initial string has all the character used except the open and close quotes. It then doubles that string and concatenates one of each of the open and close quotes from ordinals (hence the need to double the other characters). Lastly it repeatedly picks random characters from the composed string to the length of the program.

• @NonlinearFruit Oops - I updated to add a missed character from my string but did not update to 44 - thanks! Sep 7, 2016 at 23:03

## Pyke, 35 bytes

35F\";"\\+3322 5**F;H)s"\"2*+2* H)s


Try it here!

To check: remove the final H and the resulting string contains the right number of each character (with the extra H)

This does NOT use a generalised quine or in fact a quine at all. It relies on being able to create a string containing all the characters in the source. It should be able to do it for any code but each character logarithmically increases code size. The only number of times a character is allowed in the source is 2 or 7

## Ruby, 81 67 bytes

Saved a bunch of bytes by stealing some tricks from Martin's solution

s="s=%p;67.times{$><<(s%%s)[rand 67]}";67.times{$><<(s%s)[rand 67]}


I didn't realize that you had to randomly select every time; I thought a shuffle would do the trick. This can probably be golfed, but it's the shortest I could get it.

Standard Ruby quine with a few modifications so it prints out the shuffled string. I'm sad because it took like fifteen minutes to figure out the formatting quirks before I realized that I was subconsciously stealing it anyway.

I think the string shuffling can be shortened but I don't know how; I might also be able to finagle the formatting into being shorter once I put some thought into it. Help would be appreciated.

Try it online!

• I think (like my CJam) answer, it's not necessary to use a standard quine as the basis. A direct port of my CJam solution gives 64 bytes: 64.times{$><<"64.times{$><<.inspect[rand 32]}".inspect[rand 32]} Sep 9, 2016 at 8:44

### Example

PS C:\Tools\Scripts\golfing> .\faux-souce-code.ps1
}}[${hr[ini}}] [5i,=[]0,j2($=n4(dm]jh]jc]]7
}..j"rnj9|fn,4r]{9]('["jdh0}$rd,-f,a.c"}{h1 ]5d,),0n5|nh(]73a9da4aRi[5}a}430}}rd$,$r)-hhr%or79-R.R-'r'aa|=1f0][|[{7}do1]$ja0 rd{h


(Yes, that's a newline in the output -- when a string containing a newline is char-array'd, the n is treated as a character, since a char-array is just an array of byte codes, so it also has a 1/175th chance of being selected.)

# Dyalog APL, 20 bytes

f←{(,⎕CR'f')[?⍴⍨20]}


f←{...} define f as

(,⎕CR'f') listified (,) Character (table) Representation (⎕CR) of f ('f')

[?⍴⍨20] indexed with ([...]) random-up-to (?) repeat-itself-times (⍴⍨) of twenty

Let us run it (with a dummy argument) a few times:

      f⍬
)0'0](⍨(([],}⎕))⎕'f2
f⍬
{'['}f[←R[)2←?}⍨]}C2
f⍬
,,⍨←?2}⍴?'⍨}C,'{⎕(C0


Fine, but is the distribution correct? Let us run it on 10,000 dummy arguments and see how many times each character occurs:

      {⍺ , 1E¯4× ⍴⍵}⌸ ∊ f¨ ⍳1E4
C 0.9952
⎕ 0.9996
' 1.9777
f 2.004
← 1.0018
⍨ 1.0173
0 1.0213
] 1.0049
[ 0.9988
2 0.9943
{ 0.9895
) 1.0093
R 1.0054
, 1.0029
? 0.9943
} 0.9861
⍴ 1.0032
( 0.9944


Clearly, f and ' occur twice as often as the other characters, just like in the original source code.

How did we do it?

{⍺ , 1E¯4× ⍴⍵}⌸ ∊ f¨ ⍳1E4


⍳1E4 generates the first 10,000 integers

f¨ runs f on each of those numbers

∊ flattens all the pseudo-quines into a single 200,000-character string

⌸ is a higher-order function which for each unique character in the right side data, feeds the left-side function the unique element as left-argument and the indices where that character occurs as right-argument. The left-side function is

{⍺ , 1E¯4× ⍴⍵}


⍺ left-argument, i.e. the unique character

, followed by

1E¯4× 1×10⁻⁴ times

⍴⍵ the shape of the right-argument (the occurrence indices), i.e.how many times it occurs

Finally, ⌸ puts it all together in a table.

# C#, 277280 268 bytes.

using System;class a{static void Main(){var s="using System;class a{static void Main(){var s=\"x5Cx5C\x5C\x5C\";Random d=new Random();for(int i=0;i++<268;)Console.Write(s[d.Next(0,134)]);}}";Random d=new Random();for(int i=0;i++<268;)Console.Write(s[d.Next(0,134)]);}}


Ungolfed:

using System;
class a
{
static void Main()
{
var s="using System;class a{static void Main(){var s=\"x5Cx5C\x5C\x5C\";Random d=new Random();for(int i=0;i++<268;)Console.Write(s[d.Next(0,134)]);}}";
Random d=new Random();
for(int i=0;i++<268;)
Console.Write(s[d.Next(0,134)]);
}
}


Pretty sure this works correctly.

Sample output:

    fn;i)(]ns;<ftt08et]i+ii8]m[W}dr{rmte,)t edayid 2s cmsee\;ta["e n;o}]iolys;t sftoR{.=g vs8;(sd isWrecn++iia]iuf"avs\i<{ee vfs[ensin\s i]0a(We.0ns R(2roo=ldxil\{t(o"aistt.;.  r w"m1];idi}Ctitiindnn;M[,[+0(,o"]mca[rmnm)<;n"8ReaystinRsanr([(d,n\.ateiR sd.=[=;ttn.;wna)cCt[=+t{Wxs(\}rg

• @NonlinearFruit Thanks, missed that space. Also means I can't use a foreach loop which adds a few bytes :(. However, I think I do have " included correctly with those two escaped quotes in the string, since they appear in the output a few times, unless I'm missing their use somewhere else. Sep 9, 2016 at 14:05
• Ahh, I thought they didn't count if they were in the string, my bad. Will fix in a bit. Sep 9, 2016 at 14:17
• Okay, \'s now appear as well! Sep 9, 2016 at 14:26
• Hm, interesting problem then. Can't just keep adding \\ or I'll always be one short. I'll use the ascii code for \ instead. Sep 9, 2016 at 14:46
• Does (new Random()).Next(0,134)] work? It would save a couple bytes. Sep 12, 2016 at 16:10

# Julia 1.0, 50 bytes

(a=:(print.(rand("(a=:($(a)))|>eval", 50))))|>eval  Try it online! based on this quine: (a=:(print("(a=:($(a)))|>eval")))|>eval


Try it online!

# R, 136 bytes

a=scan(,"");cat(intToUtf8(sample(rep(c(10,utf8ToInt(a)),2),136,T)))
a=scan(,"");cat(intToUtf8(sample(rep(c(10,utf8ToInt(a)),2),136,T)))



Try it online!

exec(a:='from random import*;print(*choices("exec(a:=%r)"%a,k=75),sep="")')
`