输入∩源代码


70

介绍

挑战在于创建一个程序/函数,以打印其自身源代码和给定字符串输入的交集。这是代码高尔夫球,更准确地说:

  • 让我们I可以在输入设置
    • {"a","b","c"}
  • S是源代码集
    • {"b","f"}
  • 然后交集就是他们共享的东西
    • I ∩ S = {"b"}

输入项

输入是灵活的。它应该能够处理用于源代码的字符编码。

输出量

输出灵活。它应该是输入和源代码共享的字符集。而且,集合是不同对象的无序集合。综上所述:

  • 输出是灵活的:
    • 可以是任何数据结构(字符串或其他)
    • 可能是无序的
    • 可能有尾随 \n
    • 应该与众不同

限制

挑战类似,程序/功能可能无法读取其自身的源代码,并且不允许使用0字节的解决方案。

例子

  • #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.

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

测试用例

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.

更新资料

  • [16-08-10]:是不同对象的无序集合
  • [16-08-10]:尾随换行符是可以接受的

2
输出中是否可以包含重复字符?
Digital Trauma

1
@DigitalTrauma从示例#1,#2和#3来看似乎不是
Luis Mendo

@DigitalTrauma对不起,对于歧义,设置(在数学意义上)忽略顺序并且没有重复。
NonlinearFruit

22
祝贺拿出一个广义奎因其中最好的解决方案是不是基于语言的标准奎因。:)
Martin Ender

1
如果一个集合不应该重复,那么输入集合也应该不包含重复吗?还是输入实际上不是集合?
user81655

Answers:


24

果冻10 6 个字节

“Ṿf”Ṿf

在线尝试!

这个怎么运作

“Ṿ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.

15

Python 3,44个字节

感谢Karl为我节省了一个字节:-)感谢Dada为我节省了两个字节!

我认为这可行,但这是我的第一个奎因挑战,所以我不确定100%。:\

print(set("printseu()&'"+'+"')&set(input()))

具有43个字节的Lambda版本: lambda a:set(" lambdaset()&'"+':+"')&set(a)


8
'eroticpuns\()&\''比添加字符串短。(转义了,'但是您需要附加的`\`)为什么点在那里?
KarlKastor

哇,这.是少打高尔夫球的遗物。\` is 我认为使用反斜杠不起作用是因为不允许\\` 的输出和输入字符的重复。
杰里米

1
您的Lambda缺少:
丹尼斯,

谢谢@丹尼斯。在尝试找到程序中的所有字符后,我的眼睛开始模糊;)
Jeremy

1
@Dada:如果你喜欢,也可以是inspectournicestuporpoeticurnsnopicturesrecountspi,或inputscore。或为新的一个,你可以使用prunesit(什么码球手做一个准确的描述!),ipunsternursepit等等。
Deusovi '16

11

Dyalog APL,8 字节

'∩''⊢'∩⊢

is返回左参数中出现在右参数中的那些字符(如果参数没有重复–在这种情况下–那么结果也没有重复)

是论点

然后,字符串仅包含这两个字符加上引号字符(在字符串中加倍)。

在线尝试APL!


10

GolfScript,6个字节

"`&"`&

在线尝试!

这个怎么运作

        # (implicit) Push the input on the stack.
"`&"    # Push the string '`&' on the stack.
   `    # Inspect; turn the string into '"`&"'.
     &  # Perform set intersection.

9

Python 2,56 46 39字节

-1字节感谢@Jeremy

lambda a:set(':&()smelt\ bad\'')&set(a)

匿名lambda函数,接受一个字符串,返回一个集合

旧版本:

lambda x,w=set('newmatrixbuspdl_:-)(=,\ \''):w-(w-set(x))

我喜欢这样,但是它在`\\`上返回两个反斜杠,而不是一个。
杰里米(Jeremy)

另外,我认为您可以通过将lambda的名称更改为a
Jeremy

1
@Jeremy感谢您的提示,'\\'这只是Python以字符串形式表示反斜杠的方式,因为单个反斜杠会转义结尾的引号,因此您必须使用反斜杠转义反斜杠才能起作用。输入print '\\',您将看到它只是一个反斜杠的表示。
KarlKastor

您可以通过转到36 lambda a:{*''' lambda&':{}*'''}&{*a}
Morgan Thrapp '16

1
@MorganThrapp 35lambda a:{*' lambda&\\\':{}*'}&{*a}
seequ

9

Perl 6、56、55字节

法语 ” / Unicode版本(55字节)

say perl q.say perlq$*IN\\\.comb:..comb$*IN.comb:

Texas ” / ASCII版本(56字节)

say (q.sayq(&) $*IN\\\.combperl..comb (&)$*IN.comb).perl
say perl q.sayq(&) $*IN\\\.comb:perl..comb (&)$*IN.comb:

非高尔夫:

my \Source = 'my \\Source = \'say ( $*IN.comb.Set ∩ Source.comb.Set ).perl\'';
say ( $*IN.comb.Set  Source.comb.Set ).perl

例子:

$ 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")

2
不会$*PROGRAM访问程序的源代码,从而违反规则吗?
celtschk

@celtschk我应该在发布之前重新阅读问题,已修复。(从技术上讲,编译器可以看到$*PROGRAM从其中读取了整个源,并将整个源作为字符串存储在了已编译的程序中,这会将其放在灰色区域中)
Brad Gilbert b2gills

8

MATL,8字节

'X&'''X&

在线尝试!

输入是用单引号引起来的字符串。如果字符串包含单引号符号,则应将其复制以转义。

说明

'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

6

其实是6个位元组

`∩è`è∩

在线尝试!

说明:

`∩è`è∩
`∩è`    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

5

Haskell(30字节)

这是一个无聊的解决方案……但是我做不到。:(

filter(`elem`"f(term)\"i`l\\")

5

Brachylog,23个字节

:{e.~e":{}e~\"fd\."}fd.

在线尝试!

说明

:{                 }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 ")

1
你可以看看我们的聊天室吗?
Leaky Nun

1
+1为小胡子男人:{和惊讶的小胡子男人:{}
破坏的柠檬


4

C,142字节

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);}

在ideone上尝试一下


2
没有版本的版本和/或说明会很棒!
YSC

您本可以使用sizeof a而不是strlen(a)保存一个字节,但是更好的方法是为该数组指定一个已知大小:a[99]="...",并替换strlen(a)99以减少5个字节。
G. Sliepen '16

替换(i=getchar())>=0为可以节省另外3或4个字节read(0,&i,1)。这适用于little-endian计算机。i如果不使用任何参数运行程序,则将其初始化为1。如果您还希望它在big-endian机器上也可以运行,请从的参数列表中删除i main()并将其声明为char形式在体内(但随后仅保存3个字节)。read()在EOF上方便地返回0。
G. Sliepen '16

4

CJam,8个字节

"`q&"`q&

在这里尝试。

说明:

"`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.

4

Pyth9 8字节

1字节归功于Sp3000

@Q"\Q@\"

在线尝试!

@Q"\Q@\"
@Q"\Q@\""   implicit string ending

@Q           intersect the input with
  "\Q@\""   the string containing '\', 'Q', '@', '"'.

@z"z\"@短1个字节。
drobilc

@drobilc那会错过\
Leaky Nun

哦,是的,完全忘记了这一点。
drobilc

4

视网膜,21 20字节

删除源代码中没有的字符,然后删除重复的字符。

[^Ds.n\n[-a_-]

Ds`.

在线尝试


您的源代码包含换行符(您的输出没有)。
马丁·恩德

我之前有基本相同的解决方案,但忘了发布。您可以在该范围内保存一些字节[-a(然后在其下划线和连字符之间添加下划线,然后在第二行上放置反引号)。但为将来参考,]如果将其作为第一个字符,则无需转义。哦,为了更好,您可以交换两个阶段以避免尾随换行。
马丁·恩德

@MartinEnder这仍然不会对换行进行重复数据删除,这是一个问题吗?
mbomb007 '16

哦,您是对的,我没有注意到。然后,您必须添加和字符类s的选项D
马丁·恩德

4

Mathematica,35个字节

Characters@"\"#&@C\acehrst⋂"⋂#&

匿名函数。忽略任何生成的消息。将字符列表作为输入,并返回字符列表作为输出。的Unicode字符为U + 22C2 \[Intersection]



4

Vim,78 68 78 79 61击键

彻底改变了我的做法:

oo/\$kjxd<esc>/o<cr>xj$/\/<cr>xj$/\\<cr>xj$/$<cr>xj$/k<cr>xj$/x<cr>xj$/j<cr>xj$/d<cr>xkdd

这个怎么运作:

首先,它与所有程序字符组成一行,然后,找到每个程序字符的第一个实例,如果输入和输出相交,则在输入中,如果不相交,则在输出中删除它将移动到文件的最后一个字符(因此会回绕),并对源中的每个唯一字符执行此操作,但d除外,在该位置(而不是移动到文件的末尾)它通过删除输入来完成


反斜杠在您的代码中,但似乎不在您的字符串中。
泰特斯

不是第三个吗?
破坏的柠檬

4

Bash45 50 41 39 37 34 29字节

-9字节归功于Geoff Reedy
-4字节归功于Dennis
-5字节归功于Nahuel Fouilleul

grep -o '[] [|\'\'grepouniq-]

在线尝试!


您是否只需要一个grep命令?
杰夫·里迪

@GeoffReedy第一个grep命令将输入​​分成每行一个字符。
丹尼斯,

权利,但不能使用-o提上到第二grep的
杰夫·里迪

您说对了,这样省去了检查“。”的麻烦。谢谢!
莱利

1
@Titus在BASH完成后,grep获取-o[] [|\'grepouniq-]。因此,它正在寻找以下任何内容:[ ] {space} [ | {slash} ' g r e p o u n i q - ]
莱利

3

PowerShell v4 +,122104字节

([char[]]($args[0]+'acegfhmnoprstu012|][()"?+_,.$-{0}{1}{2}'-f("'","}","{"))|group|?{$_.count-gt1}).name

啊。PowerShell中的Quines或类似quine的代码很烂,因为字符串替换格式太笨拙了。

ace...{2}中间的字符串是代码其余部分中存在的每个字符。的{0}{1}{2}是在与结合使用-fORMAT操作者将拉'{}字符到的字符串。

将其作为一个char数组与input组合$args,然后馈入管道。第一站是Group-Object(基本上)创建输入对象的哈希表以及它们在输入中出现的次数。会将其传送到|?{...}Where-Object以仅选择.count大于的项目1。我们将其封装在括号中,然后剔除.Name哈希表的一部分(这是v4 +要求起作用的地方,否则我们需要|Select Name在管道中增加一个阶段)。

这些元素保留在管道上(作为数组),并且打印是隐式的。


3

Python 2,44字节

x='c=set;print c(`x`)&c(raw_input())';exec x

只是为了好玩,这里有一个类似quine的完整程序提交。输出Python 2集的字符串表示形式。


3

JavaScript(ES6),59 57字节

f=
t=>[..."\"().=>O[\\]defilnrtx~"].filter(e=>~t.indexOf(e))
;
<input placeholder=Input oninput=o.value=f(this.value).join``><input placeholder=Output id=o>

返回原始字符串/字符数组和源代码中都存在的字符数组。编辑:由于@ user81655,节省了2个字节。


f=s=>[...new Set(f+'')]...可以节省字节。
user81655 '16

甚至更短:f=s=>[...s].filter(c=>(new Set(f+'')).has(c))
user81655 '16

@ user81655至少在Firefox中,f+''可以通过阅读f的源代码来工作。(在某些情况下,可以通过更改源文件,然后尝试对从其中加载的函数进行字符串化处理,使Firefox崩溃。)
Neil

@ user81655第二个示例在s包含重复元素时失败,并且indexOfnew Set任何时候都要短。
尼尔,2016年

在这种情况下,您可以尝试保存字符(例如将c参数更改为列表中已经存在的字符)。
user81655 '16


3

JavaScript(OS X 10上的Chrome 58),12654 12426 11992字节

https://paste.ubuntu.com/25593218/

https://paste.ubuntu.com/25595798/

https://paste.ubuntu.com/25595831/

原始代码:

var t=prompt();"!+()[]".split("").forEach(function(f){if(t.includes(f))alert(f)})

然后将其转换为一种名为jsfk的编程样式,该样式仅使用以下六个字符:

(+)[!] 

使用在线编译器。


如果jsfk是语言,则应在标头而不是Javascript中使用该语言。
NonlinearFruit

1
@NonlinearFruit jsfk是一种编程样式。它是有效的JavaScript
Tornado547

2

R,129个字节

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="")}

如果我取消它,它需要更改怪异的东西,例如字符串for中的换行符b。无论如何,它的超级简单-构建一个包含函数中所有字符的向量。然后它将输入拉入向量,并检查成员资格。


您已经有将近一年没有访问该站点了,但是它f=function(s)cat(instersect(strsplit(s,"")[[1]],strsplit("f=unctio(s)aerpl,\\\"[1]","")[[1]]),sep="")只有101个字节,而且我认为I / O格式可以更简单,而无需cat...
Giuseppe

2

Ruby,34 + n标志= 35个字节

不适用于多行输入,因为-n会导致程序逐行处理STDIN。这段代码中没有换行符,但是尝试输入类似的内容会输出多个数组而不是一个数组。如果根据规格要求不好,请通知我,我会解决。

p $_.chars&"\\\"p $_.chars&".chars

2

ListSharp,222字节

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#>

荒谬但很有趣


2

sed,47个字符

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

我对这会持续多久感到失望,尤其是删除重复字符的位置。


这是sed的哪个版本?GNU sed说sed: -e expression #1, char 47: unterminated `s' command
丹尼斯

43个字节,包括-r的1个:sed -r ':;ss[^][str().*\12;:^]ss;ss(.)(.*\1)s\2s;t' 我在注意到您之前写了它,结果非常相似
izabera

@丹尼斯修复; 原来有一个:[[使它尝试解析字符类后
Geoff Reedy

@izabera不错,我很惊讶:命令实际上不需要标签,并且它更改了没有标签的t的含义
Geoff Reedy

是的,这是一个无耻的想法
izabera '16

2

爪哇8拉姆达,152 142 140个字符

很短:

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

或在这里取消高尔夫:

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());

    }
}

当然,取消高尔夫解决方案是错误的,因为它与花括号和其他一些字符不匹配,只是为了完整起见。

该函数将输入作为a String并返回java.util.Set<Character>包含输入和源中都存在的字符的a 。

更新

原来,该解决方案无效。我以为String#contains正则表达式匹配的测试,但这只是字面上的匹配。我添加了一些转义字符来引用像.这样的字符,但这不是必需的,而是破坏了所有内容。现在没有这种转义,我们保存了一些字符,现在它实际上可以工作了:)

感谢@NonlinearFruit提醒我使用单字符变量。


重命名in为单个字母,例如a
NonlinearFruit

3
@NonlinearFruit你是对的:哦,我怎么能忘记呢?
Frozn

2

SQF71 69 64字节

使用文件即功能格式:

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

称为 "STRING" call NAME_OF_COMPILED_FUNCTION

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.