Вход ∩ Исходный код


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
Может ли вывод содержать повторяющиеся символы?
Цифровая травма

1
@DigitalTrauma Из примеров № 1, № 2 и № 3, похоже, нет
Луис Мендо

@DigitalTrauma Извините за двусмысленность, множества (в математическом смысле) игнорируют порядок и не имеют повторений.
Нелинейно-

22
Поздравляем с разработкой обобщенного квинуса, в котором лучшие решения не основаны на стандартном квин языке. :)
Мартин Эндер

1
Если набор не должен иметь повторения, не должны ли входные наборы также не содержать повторение? Или вход на самом деле не набор?
user81655

Ответы:



15

Python 3, 44 байта

Спасибо Карлу за то, что он спас мне один байт :-) Спасибо Дада за то, что он спас мне два байта!

Я думаю, что это работает, но это мой первый вызов, поэтому я не уверен на 100%. : \

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

Лямбда-версия с 43 байтами: lambda a:set(" lambdaset()&'"+':+"')&set(a)


8
'eroticpuns\()&\''короче, чем добавление строк. (избежал, 'но тогда вам нужно дополнительное `\`) Почему точка там?
KarlKastor

Woops, это .был пережиток от менее гольф-кода. Использование обратной косой черты не работает, потому что тогда вывод из \` is \\ `и дублирование входного символа, я думаю, не допускаются.
Джереми

1
Ваша лямбда не хватает :.
Деннис

Спасибо @Dennis. Мои глаза начинают затуманиваться после попытки найти всех персонажей в программе;)
Джереми

1
@Dada: Если вы предпочитаете, это может быть inspectour, nicestupor, poeticurns, nopictures, recountspi, или inputscore. Или для нового, который вы можете использовать prunesit(точное описание того, что делают игроки в гольф!) ipunster, Или nursepitсреди других.
Деусов

11

Dyalog APL , 8 байт

'∩''⊢'∩⊢

is возвращает те символы из левого аргумента, которые присутствуют в правом аргументе (если левый аргумент не имеет дубликатов - как в этом случае - то результат также не имеет дубликатов

это аргумент

Тогда в строке просто есть эти два плюс символ кавычки (удвоенный, как в строке).

Попробуй APL онлайн!



9

Python 2, 56 46 39 байт

-1 байт благодаря @ Джереми

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

анонимная лямбда-функция, принимает строку, возвращает набор

старая версия:

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

Мне это нравится, но он возвращает две обратные косые черты в `\\` вместо одной.
Джереми

Кроме того, я думаю, что вы можете сохранить байт, изменив имя лямбды наa
Джереми

1
@Jeremy Спасибо за подсказку, '\\'это просто способ представления обратной косой черты в строковой форме в Python, потому что одиночный экранирует конечную кавычку, поэтому вы должны экранировать обратную косую черту с обратной косой чертой, чтобы она работала. Введите, print '\\'и вы увидите, что это просто представление для одной обратной косой черты.
КарлКастор

Вы можете добраться до 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:

Версии " Texas " / ASCII (56 байт)

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

Примеры:

$ 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

Брахилог , 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
Безголевая версия и / или объяснение было бы здорово!
МСК,

Вы могли бы использовать sizeof aвместо strlen(a)одного сохраненного байта, но еще лучше дать массиву известный размер: a[99]="..."и заменить strlen(a)на, 99чтобы сбрить 5 байтов.
Г. Слипен

Еще 3 или 4 байта можно сохранить, заменив (i=getchar())>=0на read(0,&i,1). Это работает на машинах с прямым порядком байтов. iустанавливается в 1, если вы не запускаете программу с какими-либо аргументами. Если вы хотите, чтобы он также работал на машинах с прямым порядком байтов, удалите i из списка аргументов main()и объявите его внутри тела как символ (но тогда вы сохраните только 3 байта). read()удобно возвращает 0 на EOF.
Г. Слипен

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(а затем добавить знак подчеркивания и дефис и добавить обратную черту во второй строке). Но для дальнейшего использования ]не нужно было бы убегать, если вы указали его в качестве первого символа. Да, и для любезности вы можете поменять местами два этапа, чтобы избежать конечного перевода строки.
Мартин Эндер,

@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, где вместо перемещения в конец файла он завершается удалением ввода


Обратная косая черта в вашем коде, но, похоже, не в вашей строке.
Тит

Разве это не третий?
Разрушаемый Лимон

4

Баш , 45 50 41 39 37 34 29 байт

-9 байт благодаря Джеффу Риди
-4 байт благодаря Деннису
-5 байт благодаря Науэлю Фуйе

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

Попробуйте онлайн!


Вам не нужна только одна команда grep?
Джефф Риди,

@GeoffReedy Первая команда grep разбивает ввод на один символ в строке.
Деннис

Правильно, но нельзя поставить -о на второй 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

Тьфу. Quines или подобный quine код в PowerShell - отстой, потому что форматирование с заменой строк настолько неуклюже.

Строка ace...{2}в середине - это каждый символ, присутствующий в остальной части кода. {0}{1}{2}Используется в сочетании с -fоператором Ormat тянуть '{}символов в строке.

Это объединяется как массив символов с входом $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

Просто для удовольствия, вот полное представление программы, похожее на лебеду. Выводит строковое представление набора 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>

Возвращает массив символов, присутствующих как в исходной строке / массиве символов, так и в исходном коде. Редактировать: 2 байта сохранены благодаря @ user81655.


f=s=>[...new Set(f+'')]...может сохранить байты.
user81655

Или еще короче:f=s=>[...s].filter(c=>(new Set(f+'')).has(c))
user81655

@ user81655 По крайней мере в Firefox, f+''работает, читая fисходный код. (В некоторых случаях вы можете привести к сбою Firefox, изменив исходный файл, а затем попытавшись упорядочить загруженную из него функцию.)
Нил

@ user81655 Ваш второй пример терпит неудачу, когда sсодержит повторяющиеся элементы, и indexOfкороче, чем в new Setлюбом случае.
Нил

В этом случае вы можете попробовать сохранить символы (например, изменить cпараметр на символ, который уже находится в списке).
user81655

3

Matlab, 37 байт

Достаточно просто:

Использует встроенный, intersectчтобы найти пересечение. Исходный код жестко закодирован. Ввод должен быть заключен в кавычки''

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

Вы должны были использовать анонимную функцию ... побить вас на 5 байтов
Sanchises

Хе-хе, я думаю, это был не мой лучший гольф ...
Стьюи Гриффин

3

JavaScript (Chrome 58 на OS X 10), 12654 12426 11992 Bytes

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.
Нелинейный

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 байт, и я думаю, что формат ввода-вывода может быть проще без cat...
Джузеппе

2

Рубин, 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 байта, включая 1 для -r: sed -r ':;ss[^][str().*\12;:^]ss;ss(.)(.*\1)s\2s;t' я написал это прежде, чем заметил твой, и это оказалось очень похоже
izabera

@ Денис исправлен; оказалось, что: после [заставил его попытаться разобрать класс персонажа
Джефф Риди,

@izabera приятно, я очень удивлен, что команде: на самом деле не нужна метка и что она меняет значение t без метки
Джефф Риди,

да, это гнуизм
изабера

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тесты на соответствие регулярному выражению, но это просто буквальное соответствие. Я добавил немного экранирования, чтобы процитировать символы, .но это не было необходимо, но вместо этого все испортило. Теперь без этого выхода мы сохраняем некоторые символы, и теперь это действительно работает :)

Спасибо @NonlinearFruit за напоминание об использовании односимвольных переменных.


Переименовать inв одну букву, какa
NonlinearFruit

3
@NonlinearFruit Вы правы: O, как я мог забыть об этом ?!
Frozn

2

SQF , 71 69 64 байта

Использование формата файла как функции:

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

Позвонить как "STRING" call NAME_OF_COMPILED_FUNCTION

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.