Введення ∩ Вихідний код


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, схоже, немає
Луїс Мендо

@DigitalTrauma Вибачте за неоднозначність, встановлює (в математичному сенсі) ігнорує порядок і не повторюється.
нелінійний

22
Вітаємо, що створили узагальнену квинку, де найкращі рішення не ґрунтуються на стандартній мові. :)
Мартін Ендер

1
Якщо набір не повинен мати повторення, чи не повинні також вхідні набори містити повторення? Або вхід насправді не є набором?
користувач81655

Відповіді:



15

Python 3, 44 байти

Дякую Карлу, що врятував мені один байт :-) Дякую Дада, що врятував мені два байти!

Я думаю, що це працює, але це моя перша проблема, тому я не впевнений на 100%. : \

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

Версія лямбда з 43 байтами: lambda a:set(" lambdaset()&'"+':+"')&set(a)


8
'eroticpuns\()&\''коротше, ніж додавання рядків. (втік, 'але тоді вам потрібен додатковий `\`) Чому крапка є там?
КарлКастор

Уопс, .була реліквією з менш гольф-коду. Використання зворотної косої риси не працює, оскільки тоді вихід з \` is \\ `, а дублювання символу введення заборонено, я думаю.
Джеремі

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

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

1
@Dada: Якщо ви віддаєте перевагу, це може бути inspectour, nicestupor, poeticurns, nopictures, recountspi, або inputscore. Або для нового, який ви можете використовувати prunesit(точний опис того, який код роблять гольфісти!) ipunster, Або nursepitсеред інших.
Deusovi

11

Діалог APL , 8 байт

'∩''⊢'∩⊢

це повертає ті символи з аргументу зліва, які присутні в правому аргументі (якщо в лівому аргументі немає дублікатів - як у цьому випадку - то результат також не має дублікатів

є аргументом

Тоді рядок просто містить ці два плюс символ цитати (подвоєний, як і в рядку).

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



9

Пітон 2, 56 46 39 байт

-1 байт завдяки @Jeremy

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:

Версії " Техас " / 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

Брахілог , 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 байт.
Г. Сліпен

Ще 3 або 4 байти можна зберегти, замінивши (i=getchar())>=0на read(0,&i,1). Це працює на малоінтенсивних машинах. iініціалізується до 1, якщо ви не запускаєте програму з якими-небудь аргументами. Якщо ви хочете, щоб він працював і на машинах з великим ендіаном, видаліть i зі списку аргументів main()і оголосити його всередині тіла як char (але тоді ви зберігаєте лише 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

Математика, 35 байт

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

Анонімна функція. Ігноруйте створені повідомлення. Приймає список символів як вхідний і повертає список символів як вихідний. Символ Unicode - U + 22C2 для \[Intersection].


4

C #, 36 байт

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

Запропонований акторський склад Func<string, IEnumerable<char>>( stringвхід, IEnumerable<char>вихід).



4

Вим, 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 розбиває введення на один символ на рядок.
Денніс

Право, але не вдалося - бути поставленим на другий греп
Джефф Реді

Ви маєте рацію, і це економить необхідність перевірити "." Дякую!
Райлі

1
@Titus Після того, як BASH робить це, річ отримує -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

Тьфу. Лайни або подібний у Quine код в PowerShell смокче, тому що форматування заміни рядків настільки незграбне.

Рядок ace...{2}посередині - це кожен символ, який присутній у решті коду. {0}{1}{2}Використовується в поєднанні з -fоператором Ormat тягнути'{} символів в рядку.

Це поєднується як масив char із входом $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>

Повертає масив символів, присутні як у вихідному масиві рядків / символів, так і у вихідному коді. Редагувати: збережено 2 байти завдяки @ user81655.


f=s=>[...new Set(f+'')]...може зберегти байти.
користувач81655

Або навіть коротше:f=s=>[...s].filter(c=>(new Set(f+'')).has(c))
user81655

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

@ user81655 Ваш другий приклад виходить з ладу, коли sмає повторювані елементи, і indexOfвін коротший, ніж у new Setбудь-якому випадку.
Ніл

У цьому випадку ви можете спробувати зберегти символи (наприклад, змінити cпараметр на символ, який вже є у списку).
користувач81655

3

Матлаб, 37 байт

Досить просто:

Використовує вбудований intersect щоб знайти перехрестя. Вихідний код жорстко закодований. Введіть дані всередині лапок''

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

Ви повинні були використовувати анонімну функцію ... побили вас на 5 байт
Санчіз

Хе-хе, я думаю, це був не мій найкращий гольф ...
Стюі Гріффін

3

JavaScript (Chrome 58 в ОС X 10), 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.
нелінійний

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

Ruby, 34 + nпрапор = 35 байт

Не працює точно з багаторівневим входом, оскільки -nзмушує програму обробляти STDIN по черзі. У цьому коді немає нових рядків, але намагаючись ввести щось подібне, виведеться декілька масивів замість одного. Якщо це не добре відповідно до специфікації, повідомте мене, і я виправлю.

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

2

СписокSharp , 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

@Dennis виправлено; Виявилося, що: після [змусив його спробувати розібрати клас персонажів
Джефф Реді

@izabera приємно, я дуже здивований, що команда: фактично не потребує мітки і що вона змінює значення t без мітки
Geoff Reedy

так, це гнуїзм
izabera

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і повертає ajava.util.Set<Character> містять символи, які присутні як у вхідному, так і в джерело.

Оновлення

Виявилося, що рішення не працює. Я думав, що String#containsтести на матч з регулярними виразками, але це просто буквальна відповідність. Я додав кілька біг, щоб процитувати таких персонажів. але це було не потрібно, але все це зруйнувало. Тепер без цього втечі ми рятуємо деяких персонажів, і це насправді працює :)

Завдяки @NonlinearFruit за те, що нагадав мені використовувати односимвольні змінні.


Перейменуйте inна одну букву на кшталтa
NonlinearFruit

3
@NonlinearFruit Ви маєте рацію: O, як я міг забути про це ?!
Фрозн

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.