# Input ∩ Source Code

## Intro

The challenge is to create a program/function that prints the intersection of its own source code and a given string input. This is code golf and to be more precise:

• Let I be the input set
• {"a","b","c"}
• Let S be the source code set
• {"b","f"}
• Then the intersection is what they share
• I ∩ S = {"b"}

## Input

Input is flexible. It should be able to handle the character encoding used for the source code.

## Output

Output is flexible. It should be the set of characters that the input and source code share. Also, sets are unordered collections of distinct objects. In summary:

• Output is flexible:
• Could be any data structure (string or otherwise)
• Could unordered
• Could have a trailing \n
• Should be distinct

## Restriction

Similar to challenges, the program/function may not read its own source code and 0-byte solutions are not allowed.

## Examples

• #1
functor x(I){ return I ∩ self; }

Inputs                                Outputs
------                                -------
enter preformatted text here      ->  {"e","n","t","r","f","o","x"}

["Albrt"," Einstin"]              ->  {"l","r","t","n","s"}

• #2
(_)->_&"(_)->&\"\\"

Inputs                                Outputs
------                                -------
"Security at the expense of       ->  "
usability comes at the expense
of security."

(0____0)                          ->  (_)

• #3
ಠa益длф

Inputs                                Outputs
------                                -------
Far out in the uncharted backwaters ->"a"
of the unfashionable end of the
Western Spiral arm of the Galaxy lies
a small unregarded yellow sun.
Orbiting this at a distance of roughly
ninety-eight million miles is an
utterly insignificant little blue-green
planet whose ape-descended life forms
are so amazingly primitive that they
still think digital watches are a pretty
neat idea.

(ノಠ益ಠ)ノ彡┻━┻                      ->"ಠ益"


## Test Cases

Albert Einstein

\__( O__O)_/

!@#$%^&*()_+{}|:"<>? 1234567890-=[]\;',./ (ノಠ益ಠ)ノ彡┻━┻ “¤>%,oỊȤʠ“ØụĊ5D³ṃṠɼQ»j;Ç;“;}¶” ┬──┬ ノ( ゜-゜ノ) Far out in the uncharted backwaters of the unfashionable end of the Western Spiral arm of the Galaxy lies a small unregarded yellow sun. Orbiting this at a distance of roughly ninety-eight million miles is an utterly insignificant little blue-green planet whose ape-descended life forms are so amazingly primitive that they still think digital watches are a pretty neat idea.  Update • [16-08-10]: sets are unordered collections of distinct objects • [16-08-10]: trailing newline is acceptable • May the output contain duplicate characters? – Digital Trauma Aug 10 '16 at 18:44 • @DigitalTrauma From examples #1, #2 and #3 it appears not – Luis Mendo Aug 10 '16 at 18:50 • @DigitalTrauma Sorry for the ambiguity, sets (in the mathematical sense) ignore order and have no repetition. – NonlinearFruit Aug 10 '16 at 19:05 • Congratulations for coming up with a generalised quine where the best solutions are not based on the language's standard quine. :) – Martin Ender Aug 10 '16 at 20:27 • If a set should not have repetition, shouldn't the input sets also not contain repetition? Or is the input actually not a set? – user81655 Aug 11 '16 at 15:37 ## 43 Answers # Jelly, 10 6 bytes “Ṿf”Ṿf  Try it online! ### How it works “Ṿf”Ṿf Main link. Argument: s (string) “Ṿf” Set the return value to 'Ṿf'. Ṿ Uneval; yield '“Ṿf”'. f Filter; remove the characters from '“Ṿf”' that do not appear in s.  ## Python 3, 44 bytes Thanks Karl for saving me one byte :-) Thanks Dada for saving me two bytes! I think this works, but it's my first quine challenge so I'm not 100% sure. :\ print(set("printseu()&'"+'+"')&set(input()))  Lambda version with 43 bytes: lambda a:set(" lambdaset()&'"+':+"')&set(a) • 'eroticpuns$$)&\'' is shorter than adding the strings. (escaped the ' but then you need a additional \) Why is the dot there? – KarlKastor Aug 10 '16 at 19:26 • woops, the . was a relic from less golfed code. Using backslash doesn't work because then the output from \ is \\, and duplicating the input character isn't allowed, I think. – Jeremy Aug 10 '16 at 19:32 • Your lambda is missing the :. – Dennis Aug 10 '16 at 19:45 • Thanks @Dennis. My eyes start clouding over after trying to find all the characters in the program ;) – Jeremy Aug 10 '16 at 19:48 • @Dada: If you'd prefer, it could be inspectour, nicestupor, poeticurns, nopictures, recountspi, or inputscore. Or for the new one you might use prunesit (an accurate description of what code golfers do!), ipunster, or nursepit among others. – Deusovi Aug 11 '16 at 6:53 # Dyalog APL, 8 bytes '∩''⊢'∩⊢  ∩ is returns those characters from the left argument that are present in the right argument (if the left argument has no duplicates – as in this case – then the result also has no duplicates ⊢ is the argument Then the string just has those two plus the quote character (doubled, as it is in a string). TryAPL online! # GolfScript, 6 bytes "&"&  Try it online! ### How it works  # (implicit) Push the input on the stack. "&" # Push the string '&' on the stack.  # Inspect; turn the string into '"&"'. & # Perform set intersection.  # Python 2, 5646 39 Bytes -1 Byte thanks to @Jeremy lambda a:set(':&()smelt\ bad\'')&set(a)  anonymous lambda function, takes a string, returns a set old version: lambda x,w=set('newmatrixbuspdl_:-)(=,\ \''):w-(w-set(x))  • I like this, but it returns two backslashes on \\ instead of just one. – Jeremy Aug 10 '16 at 19:35 • Also, i think you can save a byte by changing the name of the lambda to a – Jeremy Aug 10 '16 at 19:37 • @Jeremy Thanks for tip, '\\' is just Python's way of representing a backslash in string form, because a single one would escape the end quote, so you have to escape the backslash with a backslash to make it work. Type print '\\' and you'll see that it is just the representation for one backslash. – KarlKastor Aug 10 '16 at 20:12 • You can get to 36 with lambda a:{*''' lambda&':{}*'''}&{*a}. – Morgan Thrapp Aug 11 '16 at 16:08 • @MorganThrapp 35 lambda a:{*' lambda&\\\':{}*'}&{*a} – seequ Aug 11 '16 at 20:44 # Perl 6, 56, 55 bytes "French" / Unicode version (55 bytes) say perl q.say perlq∩*IN\\\.comb:..comb∩*IN.comb:  "Texas" / ASCII versions (56 bytes) say (q.sayq(&) *IN\\\.combperl..comb (&)*IN.comb).perl  say perl q.sayq(&) *IN\\\.comb:perl..comb (&)*IN.comb:  # Non-golfed: my \Source = 'my \\Source = \'say ( *IN.comb.Set ∩ Source.comb.Set ).perl\''; say ( *IN.comb.Set ∩ Source.comb.Set ).perl  # Examples:  echo -n 'say perl q.say perlq∩*IN\\\.comb:..comb∩*IN.comb:' > test-unicode.p6 echo -n 'say (q.sayq(&) *IN\\\.combperl..comb (&)*IN.comb).perl' > test-ascii.p6 perl6 test-ascii.p6 <<< 'abcdefghijklmnopqrstuvwxyz' set("p","a","l","r","c","q","b","s","e","m","y","o") perl6 test-unicode.p6 < test-unicode.p6 set("\\","I","p"," ","a","c","l","r","q","b","∩","*","s","m","e",".","y",":","o","N","$") perl6 test-ascii.p6 < test-ascii.p6 set("p","\\","I"," ","a","l","r","c","q","b",")","*","s","e","m","\&",".","(","y","o","N","$") perl6 test-ascii.p6 < test-unicode.p6 set("p","\\","I"," ","a","l","r","c","q","b","*","s","e","m",".","y","o","N","$") perl6 test-unicode.p6 <<< 'Albert Einstein' set(" ","l","r","b","s","e") perl6 test-unicode.p6 <<< '\__( O__O)_/' set("\\"," ") perl6 test-ascii.p6 <<< '!@#%^&*()_+{}|:"<>?' set(")","*","\&","(","$") perl6 test-unicode.p6 <<< "1234567890-=[]\\;',./" set("\\",".") perl6 test-unicode.p6 <<< '(ノಠ益ಠ)ノ彡┻━┻' set() “¤>%,oỊȤʠ“ØụĊ5D³ṃṠɼQ»j;Ç;“;}¶” set("o") perl6 test-unicode.p6 <<< '┬──┬ ノ( ゜-゜ノ)' set(" ") perl6 test-ascii.p6 <<< 'Far out in the uncharted backwaters of the unfashionable end of the Western Spiral arm of the Galaxy lies a small unregarded yellow sun. Orbiting this at a distance of roughly ninety-eight million miles is an utterly insignificant little blue-green planet whose ape-descended life forms are so amazingly primitive that they still think digital watches are a pretty neat idea.' set("p"," ","a","l","r","c","b","s","e","m",".","y","o")  • Doesn't *PROGRAM access the source code of the program, and thus violate the rules? – celtschk Aug 12 '16 at 8:34 • @celtschk I should have re-read the question before posting, fixed. ( Technically the compiler could see that *PROGRAM is read from and store the entire source as a string in the compiled program, which would have put it into a grey area ) – Brad Gilbert b2gills Aug 15 '16 at 0:29 # MATL, 8 bytes 'X&'''X&  Try it online! Input is a string enclosed in single quotes. If the string contains a single-quote symbol, it should be duplicated to escape it. ### Explanation 'X&''' % Push string with the three characters used by the program. The single-quote % symbol needs to be escaped by duplicating it X& % Take input implicitly. Set intersection. Display implicitly  ## Actually, 6 bytes ∩èè∩  Try it online! Explanation: ∩èè∩ ∩è push the function ∩è (which contains every character in the source code except '') è repr (same as Python repr - leaves "∩è", which contains every character in the source code) ∩ set intersection with input  # Haskell (30 bytes) This is such a boring solution... But I couldn't do better. :( filter(elem"f(term)\"il\\")  # Brachylog, 23 bytes :{e.~e":{}e~\"fd\."}fd.  Try it online! ### Explanation :{ }f Find all chars that verify the predicate below d. Remove duplicates and output e. Take a char from the input ; this is our output… ~e":{}e~\"fd\." … if that char is in the string :{}e~"fd. (the first \ is here to escape the ")  • Can you have a look at our chatroom? – Leaky Nun Aug 11 '16 at 9:56 • +1 for moustache man :{ and surprised moustache man :{} – Destructible Lemon Aug 17 '16 at 4:29 # 05AB1E, 11 bytes Code: "'ÃJÙ"'"JÃÙ  Uses the CP-1252 encoding. Try it online!. # C, 142 bytes main(i){char*p,a[]="remain([*]){fought?>:01;,\\\"=capsv+-l}";for(;(i=getchar())>=0;p?putchar(i),memmove(p,p+1,a+strlen(a)-p):0)p=strchr(a,i);}  • An ungolfed version and/or explanation would be great! – YSC Aug 11 '16 at 11:58 • You could have used sizeof a instead of strlen(a) for one byte saved, but even better is to give the array a known size: a[99]="...", and replace strlen(a) by 99 to shave off 5 bytes. – G. Sliepen Sep 8 '16 at 11:58 • Another 3 or 4 bytes can be saved by replacing (i=getchar())>=0 with read(0,&i,1). This works on little-endian machines. i is initialized to 1 if you don't run the program with any arguments. If you want it to work on big-endian machines as well, remove i from the argument list of main() and declare it inside the body as a char (but then you save only 3 bytes). read() conveniently returns 0 on EOF. – G. Sliepen Sep 8 '16 at 12:03 # CJam, 8 bytes "q&"q&  Try it here. Explanation: "q&" e# Push that string to the stack  e# Stringify, pops the string and pushes "\"r&\"" to the stack q e# Pushes the input to the stack & e# Union, pops two elements and pushes a list of every element that is contained in both.  # Pyth, 9 8 bytes 1 byte thanks to Sp3000 @Q"\Q@\"  Try it online! @Q"\Q@\" @Q"\Q@\"" implicit string ending @Q intersect the input with "\Q@\"" the string containing '\', 'Q', '@', '"'.  • @z"z\"@ is 1 byte shorter. – drobilc Aug 13 '16 at 11:23 • @drobilc That would miss out the \. – Leaky Nun Aug 13 '16 at 12:26 • oh, yeah, totally forgot about that. – drobilc Aug 13 '16 at 12:32 # Retina, 21 20 bytes Removes characters not in the source code, then removes duplicate characters. [^Ds.n\n[-a_-] Ds.  Try it online • Your source code contains a linefeed (your output doesn't). – Martin Ender Aug 11 '16 at 17:58 • I had basically the same solution earlier but forgot to post it. You can save a few bytes with the range [-a (and then include an underscore and a hyphen and drop the backtick on the second line). But for future reference, ] wouldn't need escaping if you put it as the first character. Oh and for niceness, you can swap the two stages to avoid the trailing linefeed. – Martin Ender Aug 11 '16 at 19:41 • @MartinEnder This still doesn't deduplicate line feeds, is that a problem? – mbomb007 Aug 12 '16 at 13:39 • Oh you're right, I didn't notice that. You'll have to add s to the options of D and the character class then. – Martin Ender Aug 12 '16 at 13:41 # Mathematica, 35 bytes Characters@"\"#&@C\acehrst⋂"⋂#&  Anonymous function. Ignore any generated messages. Takes a list of characters as input and returns a list of characters as output. The Unicode character is U+22C2 for $Intersection]. # C#, 36 bytes s=>s.Intersect("s=>.Interc(\"\$$;");  Intended cast is Func<string, IEnumerable<char>> (string input, IEnumerable<char> output). # Vim, 78 68 78 79 61 keystrokes Completely changed my approach: oo/\kjxd<esc>/o<cr>xj/\/<cr>xj/\\<cr>xj/<cr>xj/k<cr>xj/x<cr>xj/j<cr>xj/d<cr>xkdd  How it works: First, it makes a line with all the program characters, then, it finds the first instance of each of the program characters, which is either in the input, if the input and output intersect, or the output if they don't, deletes it, moves to the last character of the file (so it wraps around) and does that for each unique character in source, except d, where instead of moving to the end of the file, it finishes up by deleting the input • Backslash is in your code but doesn´t seem to be in your string. – Titus Dec 21 '16 at 16:54 • Isn't it the third? – Destructible Lemon Dec 21 '16 at 20:11 # Bash, 45 50 41 39 37 34 29 bytes -9 bytes thanks to Geoff Reedy -4 bytes thanks to Dennis -5 bytes thanks to Nahuel Fouilleul grep -o '[] [|\'\'grepouniq-]  Try it online! • Don't you only need one grep command? – Geoff Reedy Aug 11 '16 at 23:21 • @GeoffReedy The first grep command splits the input into one character per line. – Dennis Aug 12 '16 at 3:43 • Right but couldn't the -o be put on to the second grep – Geoff Reedy Aug 12 '16 at 12:52 • You're right, and that saves having to check for the '.'. Thanks! – Riley Aug 12 '16 at 14:11 • @Titus After BASH does it's thing, grep gets -o and [] [|\'grepouniq-]. So it is looking for anything of these: [ ] {space} [ | {slash} ' g r e p o u n i q - ]. – Riley Dec 21 '16 at 17:09 ## PowerShell v4+, 122 104 bytes ([char[]](args[0]+'acegfhmnoprstu012|][()"?+_,.-{0}{1}{2}'-f("'","}","{"))|group|?{_.count-gt1}).name  Ugh. Quines or quine-like code in PowerShell sucks, because the string replacement formatting is so clunky. The string ace...{2} in the middle is every character that's present in the rest of the code. The {0}{1}{2} is used in conjunction with the -format operator to pull the '{} characters into the string. That's combined as a char-array with the input args, then fed into the pipeline. The first stop is Group-Object which (essentially) creates a hashtable of the input objects and how many times they occur in the input. That's piped to |?{...} the Where-Object to only select those items that have a .count greater than 1. We encapsulate that in parens, and pluck out the .Name portion of the hashtable (which is where the v4+ requirement comes into play, otherwise we'd need an additional |Select Name stage to the pipeline). Those elements are left on the pipeline (as an array), and printing is implicit. ## Python 2, 44 bytes x='c=set;print c(x)&c(raw_input())';exec x  Just for fun, here's a quine-like full program submission. Outputs the string representation of a Python 2 set. ## JavaScript (ES6), 59 57 bytes f= t=>[..."\"().=>O[\$defilnrtx~"].filter(e=>~t.indexOf(e)) ; <input placeholder=Input oninput=o.value=f(this.value).join><input placeholder=Output id=o> Returns an array of characters present in both the original string/character array and the source code. Edit: Saved 2 bytes thanks to @user81655. • f=s=>[...new Set(f+'')]... could save bytes. – user81655 Aug 11 '16 at 15:17 • Or even shorter: f=s=>[...s].filter(c=>(new Set(f+'')).has(c)) – user81655 Aug 11 '16 at 15:27 • @user81655 At least in Firefox, f+'' works by reading f's source code. (In certain cases you could get Firefox to crash by changing the source file and then attempting to stringify a function loaded from it.) – Neil Aug 11 '16 at 15:27 • @user81655 Your second example fails when s has repeated elements, and indexOf is shorter than new Set anyway. – Neil Aug 11 '16 at 15:30 • In that case, you could try saving chars (like changing the c parameter to a character that is already in the list). – user81655 Aug 11 '16 at 15:30 # Matlab, 37 bytes Quite simple: Uses the builtin intersect to find the intersection. The source code is hard coded. Input must be given inside quotation marks '' intersect(input(''),'''intersc(pu),')  • You should've used an anonymous function...beat you by 5 bytes – Sanchises Dec 21 '16 at 15:46 • Hehe, I guess that wasn't my best golf... – Stewie Griffin Dec 21 '16 at 17:07 # JavaScript (Chrome 58 on OS X 10), 1265412426 11992 Bytes https://paste.ubuntu.com/25593218/ https://paste.ubuntu.com/25595798/ https://paste.ubuntu.com/25595831/ The original code: var t=prompt();"!+()[]".split("").forEach(function(f){if(t.includes(f))alert(f)})  This was then converted into a programming style called jsfk which only uses these six characters: (+)[!]  using an online compiler. • If jsfk is the language, you should use that in the header instead of Javascript. – NonlinearFruit Sep 23 '17 at 14:00 • @NonlinearFruit jsfk is a programming style. It is valid javascript – Tornado547 Nov 28 '17 at 16:01 # R, 129 bytes f=function(s){b=strsplit("f=unctio(s){arpl;,[1]b\\\"qemh0T}",c())[[1]];cat(b[unique(pmatch(strsplit(s,c())[[1]],b,0,T))],sep="")}  If I ungolf it, it needs to have weird things changed like a newline in the string for b. Anyhow, its super simple -- builds a vector with all characters in the function in it. Then it pulls the input into a vector, and checks membership. • you haven't visited the site in almost a year, but f=function(s)cat(instersect(strsplit(s,"")[[1]],strsplit("f=unctio(s)aerpl,\\\"[1]","")[[1]]),sep="") is 101 bytes, and I think the I/O format can be simpler, without cat... – Giuseppe Aug 8 '17 at 19:26 # Ruby, 34 + n flag = 35 bytes Doesn't exactly work with multi-lined input, since -n causes the program to process STDIN line-by-line. There aren't newlines in this code, but trying to input something like that will output multiple arrays instead of one. If that is not good according to spec, please inform me and I will fix. p$_.chars&"\\\"p \$_.chars&".chars


## ListSharp, 222 bytes

STRG S=READ[<here>+"\\S.txt"]
ROWS T=ROWSPLIT S BY [""]
ROWS R=ROWSPLIT "STRG =EAD[<her>+\".tx]OWPLIBYCFMHVNc#isn()oay\r\n" BY [""]
ROWS R=SELECT FROM T WHERE[EVERY STRG IS ANY STRG IN R]
SHOW=<c#R.Distinct().ToArray()c#>


ridiculous but im entertained

## sed, 47 characters

:s;st[^])(*\1.s2t:[;^]tt;st$$.$$$$.*\1$$t\2t;ts


I'm a little disappointed at how long this came out to be, especially the bit to remove repeated characters.

• Which version of sed is this? GNU sed says sed: -e expression #1, char 47: unterminated s' command. – Dennis Aug 12 '16 at 3:03
• 43 bytes including 1 for -r: sed -r ':;ss[^][str().*\12;:^]ss;ss(.)(.*\1)s\2s;t' i wrote it before noticing yours and it turned out to be very similar – izabera Aug 12 '16 at 7:23
• @Dennis fixed; turned out having a : after the [ caused it to try and parse a character class – Geoff Reedy Aug 12 '16 at 13:04
• @izabera nice, I'm quite surprised that the : command doesn't actually need a label and that it changes the meaning of t without a label – Geoff Reedy Aug 12 '16 at 13:07
• yeah it's a gnuism – izabera Aug 12 '16 at 13:25

## Java 8 lambda, 152142 140 characters

Quite short:

s->s.chars().mapToObj(i->(char)i).filter(c->"COSTab\"\\cefh(i)j+l-mn.oprstuv>".contains(""+c)).collect(java.util.stream.Collectors.toSet())


Or ungolfed over here:

public class Q89400 {

static Set<Character> inAndQuine(String in) {
return in.chars()
.mapToObj(i->(char)i)
.filter(c->"COSTab\"\\cefh(i)j+l-mn.oprstuv>".contains(""+c))
.collect(java.util.stream.Collectors.toSet());

}
}


Of course the ungolfed solution is wrong, as it doesn't match the curly brackets and some more characters, it's just their for the sake of completeness.

The function takes input as a String and returns a java.util.Set<Character> containing the characters which are present in both input and source.

It turned out that the solution wasn't working. I thought String#contains tests for a regex match but it is just a literal matching. I added some escaping to quote the characters like . but this wasn't necessary but ruined everything instead. Now without this escaping we save some characters and now it actually works :)

Thanks to @NonlinearFruit for reminding me of using one-character variables.

• Rename in to be a single letter like a – NonlinearFruit Aug 12 '16 at 12:16
• @NonlinearFruit you're right :O how could I forget about that?! – Frozn Aug 12 '16 at 13:13

# SQF, 7169 64 bytes

Using the file-as-a-function format:

i="-_h ;""=()sSplitrng"splitString"";i-(i-(_this splitString""))


Call as "STRING" call NAME_OF_COMPILED_FUNCTION`