入力∩ソースコード


70

イントロ

課題は、独自のソースコードと特定の文字列入力の共通部分を出力するプログラム/関数を作成することです。これはコードゴルフであり、より正確には:

  • LetをI入力セットにします
    • {"a","b","c"}
  • Letを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
出力に重複文字が含まれている可能性がありますか?
デジタル外傷

1
@DigitalTrauma例#1、#2、#3からは見えない
ルイスメンドー

@DigitalTraumaあいまいさで申し訳ありませんが、セット(数学的な意味で)は順序を無視し、繰り返しはありません。
NonlinearFruit

22
言語の標準クインに基づいていない最適なソリューションである一般化されたクインを思いついたことにおめでとうございます。:)
マーティンエンダー

1
セットに繰り返しを含めるべきではない場合、入力セットにも繰り返しを含めるべきではありませんか?または、入力は実際にはセットではありませんか?
-user81655

回答:



15

Python 3、44バイト

Karlに1バイト節約してくれてありがとう:-) Dadaに2バイト節約してくれてありがとう!

これはうまくいくと思いますが、それは私の最初の馬鹿げた挑戦なので、100%確信はありません。:\

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

43バイトのLambdaバージョン: lambda a:set(" lambdaset()&'"+':+"')&set(a)


8
'eroticpuns\()&\''文字列を追加するよりも短いです。(エスケープしました'が、追加の「\」が必要です)なぜドットがそこにあるのですか?
カールカストール

おっと、これ.はゴルフの少ないコードの遺物でした。\` is \\ ` からの出力、および入力文字の複製は許可されていないため、バックスラッシュの使用は機能しません。
ジェレミー

1
ラムダにがありません:
デニス

ありがとう@デニス。プログラム内のすべてのキャラクターを見つけようとした後、私の目が曇ってしまいます;)
ジェレミー

1
@Dada:あなたが好む場合は、それができるinspectournicestuporpoeticurnsnopicturesrecountspi、またはinputscore。または、新しいものprunesit(ゴルファーが行うコードの正確な説明!)、、ipunsterまたはnursepitその他を使用できます。
デウソビ

11

Dyalog APL、8 バイト

'∩''⊢'∩⊢

は、左の引数から右の引数にある文字を返します(この場合のように、左の引数に重複がない場合、結果にも重複はありません)

引数です

次に、文字列には、これらの2つと引用文字(文字列のように2倍になった文字)が追加されます。

TryAPLオンライン!



9

パイソン2、56 46の 39バイト

-1バイト@Jeremyに感謝

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

無名ラムダ関数、文字列を受け取り、セットを返します

旧版:

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

私はこれが好きですが、 `\\`に1つではなく2つのバックスラッシュを返します。
ジェレミー

また、ラムダの名前をa
ジェレミー

1
@Jeremyヒントをありがとう'\\'、単一の引用符が終了引用符をエスケープするため、バックスラッシュを文字列形式で表現するPythonの方法です。入力するprint '\\'と、1つの円記号の単なる表現であることがわかります。
カールカストール

で36に到達できますlambda a:{*''' lambda&':{}*'''}&{*a}
モーガンスラップ

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

9

Perl 6、56、55バイト

フランス語」/ Unicodeバージョン(55バイト)

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

テキサス」/ 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から読み取られ、灰色の領域にそれを入れているだろうコンパイルされたプログラム内の文字列として全体のソースを保存)
ブラッド・ギルバートが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
チャットルームをご覧いただけますか?
リーキー修道女

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

1バイト保存するsizeof a代わりに使用することもできますstrlen(a)が、さらに良いのは、配列に既知のサイズ:を与え、5バイトを削減するa[99]="..."ためにstrlen(a)by 99を置き換えることです。
G. Sliepen

別の3つのまたは4バイトを置換することによって保存することができる(i=getchar())>=0read(0,&i,1)。これは、リトルエンディアンのマシンで機能します。i引数を指定してプログラムを実行しない場合、1に初期化されます。ビッグエンディアンのマシンでも動作するようにしたい場合は、引数リストからiを削除しmain()、本体内でcharとして宣言します(ただし、3バイトしか保存しません)。read()EOFで0を返すのが便利です。
G. Sliepen

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

網膜、21 20バイト

ソースコードにない文字を削除してから、重複する文字を削除します。

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

Ds`.

オンラインで試す


ソースコードに改行が含まれています(出力には含まれていません)。
マーティンエンダー

以前は基本的に同じ解決策がありましたが、投稿するのを忘れていました。範囲で数バイトを保存できます[-a(そしてアンダースコアとハイフンを含めて、2行目にバックティックをドロップします)。ただし、将来の参考のために]、最初の文字として配置する場合はエスケープする必要はありません。わかりやすくするために、2つのステージを入れ替えて、後続の改行を回避できます。
マーティンエンダー

@MartinEnderこれはまだラインフィードを重複排除しません、それは問題ですか?
mbomb007

ああ、あなたは正しい、私はそれに気づかなかった。その後s、オプションDと文字クラスを追加する必要があります。
マーティンエンダー

4

Mathematica、35バイト

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

匿名関数。生成されたメッセージを無視します。入力として文字のリストを受け取り、出力として文字のリストを返します。Unicode文字はのU + 22C2です\[Intersection]


4

C#、36バイト

s=>s.Intersect("s=>.Interc(\"\\);");

意図するキャストはFunc<string, IEnumerable<char>>string入力、IEnumerable<char>出力)です。



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を除くソース内の一意の文字ごとに実行します。dの場合、ファイルの最後に移動する代わりに、入力を削除して終了します。


バックスラッシュはコードに含まれていますが、文字列には含まれていないようです。
タイタス

3番目ではないですか?
破壊可能なレモン

4

Bash45 50 41 39 37 34 29バイト

-9バイト、Geoff Reedyに
感謝-4バイト、Dennisに
感謝-5バイト、Nahuel Fouilleulに感謝

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

オンラインでお試しください!


必要なgrepコマンドは1つだけではありませんか?
ジェフリーディ

@GeoffReedy最初のgrepコマンドは、入力を行ごとに1文字に分割します。
デニス

右が、-oは、第二のgrepに置くことができませんでした
ジェフ・リーディ

そのとおりです。「。」を確認する必要がなくなります。ありがとう!
ライリー

1
@Titus BASHがそれを行った後、grepがを取得-o[] [|\'grepouniq-]ます。したがって、次のいずれかを探しています[ ] {space} [ | {slash} ' g r e p o u n i q - ]
ライリー

3

PowerShell v4 +、122 104バイト

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

あー PowerShellのクインまたは馬のようなコードは、文字列置換の書式設定が非常に不格好なので、ひどいものです。

ace...{2}中央の文字列は、残りのコードに存在するすべての文字です。をormat演算子{0}{1}{2}と組み合わせて使用​​して-f'{}文字を文字列に引き込みます。

これは、入力と文字配列として結合$argsされ、パイプラインに供給されます。最初のGroup-Object目的は、入力オブジェクトのハッシュテーブルを(基本的に)作成し、入力で発生する回数です。それはにパイプだだけ持っているそれらの項目を選択するよりも大きいが。それを括弧でカプセル化し、ハッシュテーブルの一部を取り出します(v4 +要件が出てくる場所です。そうでない場合は、パイプラインに追加のステージが必要になります)。|?{...}Where-Object.count1.Name|Select Name

これらの要素はパイプラインに(配列として)残され、印刷は暗黙的に行われます。


3

Python 2、44バイト

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

ただの楽しみのために、ここにクインのような完全なプログラム提出があります。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

またはさらに短く:f=s=>[...s].filter(c=>(new Set(f+'')).has(c))
user81655

@ user81655少なくともFirefoxでは、のソースコードをf+''読み取ることで機能しfます。(特定のケースでは、ソースファイルを変更し、そこからロードされた関数を文字列化しようとすると、Firefoxがクラッシュする可能性があります。)
ニール

@ user81655 2番目の例は、s要素が繰り返されている場合に失敗しindexOfnew Setとにかく短いです。
ニール

その場合、文字を保存してみてください(cパラメーターを既にリストにある文字に変更するなど)。
user81655

3

Matlab、37バイト

とても簡単:

ビルトインintersectを使用して交差点を見つけます。ソースコードはハードコーディングされています。入力は引用符で囲む必要があります''

intersect(input(''),'''intersc(pu),')

あなたは...無名関数を使用していたはずです5バイトであなたを倒す
Sanchises

ヘヘ、私は...それは私の最高のゴルフではなかったと思います
Stewieグリフィン

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

これは、次に、これらの6文字のみを使用する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="")}

私がそれを無視した場合、文字列の改行のような奇妙なものを変更する必要がありますb。とにかく、その非常にシンプルな-関数内のすべての文字でベクトルを構築します。次に、入力をベクトルにプルし、メンバーシップをチェックします。


あなたは、ほぼ一年でサイトを訪問したが、していないf=function(s)cat(instersect(strsplit(s,"")[[1]],strsplit("f=unctio(s)aerpl,\\\"[1]","")[[1]]),sep="")101バイトで、IはI / Oフォーマットはせずに、シンプルにすることができると思うcat...
ジュゼッペ

2

Ruby、34 + nフラグ= 35バイト

-nプログラムがSTDINを1行ずつ処理するため、複数行入力では正確に機能しません。このコードには改行はありませんが、そのような何かを入力しようとすると、1つではなく複数の配列が出力されます。それが仕様に従って良くない場合、私に知らせてください、そして、私は修正します。

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
デニス

-rの1を含む43バイト:sed -r ':;ss[^][str().*\12;:^]ss;ss(.)(.*\1)s\2s;t' 気付く前に書きましたが、非常に似ていることが判明しました
-izabera

@デニス修正; :を持っていることが判明しました[文字クラスを解析しようとした後
Geoff Reedy

@izabera素敵で、私はそれをかなり驚い:コマンドが実際にラベルを必要とし、それはラベルなしで、tの意味を変更することはありません
ジェフ・リーディ

ええ、それはグニズムです
izabera

2

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

更新

ソリューションが機能していなかったことが判明しました。String#contains正規表現の一致のテストを考えましたが、それは単なる文字通りの一致です。文字を引用するためにエスケープを追加しました.が、これは必要ではありませんでしたが、代わりにすべてを台無しにしました。今、このエスケープなしで、いくつかのキャラクターを保存し、実際に動作します:)

1文字の変数の使用を思い出させてくれた@NonlinearFruitに感謝します。


次のinような1文字に名前を変更しますa
NonlinearFruit

3
@NonlinearFruitあなたは正しい:Oどうすればそれを忘れることができますか?!
Frozn

2

SQF71 69 64バイト

関数としてのファイル形式の使用:

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

として呼び出す "STRING" call NAME_OF_COMPILED_FUNCTION

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.