Entrada Code Código Fonte


70

Introdução

O desafio é criar um programa / função que imprima a interseção de seu próprio código-fonte e uma determinada entrada de string. Isso é código de golfe e, para ser mais preciso:

  • Seja Io conjunto de entrada
    • {"a","b","c"}
  • Let SSer o conjunto de código fonte
    • {"b","f"}
  • Então o cruzamento é o que eles compartilham
    • I ∩ S = {"b"}

Entrada

A entrada é flexível. Deve ser capaz de lidar com a codificação de caracteres usada para o código-fonte.

Resultado

A saída é flexível. Deve ser o conjunto de caracteres que a entrada e o código-fonte compartilham. Além disso, conjuntos são coleções não ordenadas de objetos distintos. Em suma:

  • A saída é flexível:
    • Pode ser qualquer estrutura de dados (string ou não)
    • Poderia desordenado
    • Poderia ter uma trilha \n
    • Deve ser distinto

Restrição

Semelhante aos desafios do , o programa / função pode não ler seu próprio código-fonte e soluções de 0 byte não são permitidas.

Exemplos

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

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

Casos de teste

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.

Atualizar

  • [16-08-10]: conjuntos são coleções não ordenadas de objetos distintos
  • [16-08-10]: a nova linha à direita é aceitável

2
A saída pode conter caracteres duplicados?
Digital Trauma

11
@DigitalTrauma a partir de exemplos # 1, # 2 e # 3 não aparece
Luis Mendo

@DigitalTrauma Desculpe pela ambiguidade, os conjuntos (no sentido matemático) ignoram a ordem e não têm repetição.
NonlinearFruit

22
Parabéns por apresentar uma solução generalizada, onde as melhores soluções não se baseiam na solução padrão da linguagem. :)
Martin Ender

11
Se um conjunto não deve ter repetição, os conjuntos de entrada também não devem conter repetição? Ou a entrada não é realmente um conjunto?
user81655

Respostas:


24

Geléia , 10 6 bytes

“Ṿf”Ṿf

Experimente online!

Como funciona

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

Obrigado Karl por me salvar um byte :-) Obrigado Dadá por me salvar dois bytes!

Eu acho que isso funciona, mas é o meu primeiro desafio, então não tenho 100% de certeza. : \

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

Versão Lambda com 43 bytes: lambda a:set(" lambdaset()&'"+':+"')&set(a)


8
'eroticpuns\()&\''é mais curto que adicionar as strings. (escapou do 'mas você precisa de um `\` adicional) Por que o ponto está lá?
KarlKastor

woops, .era uma relíquia de código menos jogado. Usar barra invertida não funciona porque a saída de \` is \\ `e duplicar o caractere de entrada não são permitidas, eu acho.
Jeremy

11
Seu lambda está faltando o :.
Dennis

Obrigado @Dennis. Meus olhos começam a ficar nublados depois de tentar encontrar todos os personagens do programa;)
Jeremy

11
@Dada: Se você preferir, pode ser inspectour, nicestupor, poeticurns, nopictures, recountspi, ou inputscore. Ou para o novo que você pode usar prunesit(uma descrição precisa do que os jogadores de código fazem!) ipunster, Ou nursepitentre outros.
Deusovi 11/08/16

11

Dyalog APL , 8 bytes

'∩''⊢'∩⊢

is retorna os caracteres do argumento esquerdo que estão presentes no argumento direito (se o argumento esquerdo não tiver duplicatas - como neste caso -, o resultado também não terá duplicatas

é o argumento

Em seguida, a string possui esses dois mais o caractere de citação (dobrado, como em uma string).

TryAPL online!


10

GolfScript, 6 bytes

"`&"`&

Experimente online!

Como funciona

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

-1 Byte graças a @ Jeremy

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

função lambda anônima, pega uma string, retorna um conjunto

versão antiga:

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

Eu gosto disso, mas ele retorna duas barras invertidas em `\\` em vez de apenas uma.
Jeremy

Além disso, eu acho que você pode salvar um byte, alterando o nome do lambda paraa
Jeremy

11
@ Jeremy Obrigado pela dica, '\\'é apenas a maneira do Python de representar uma barra invertida em forma de string, porque uma única escaparia da citação final, então você deve escapar da barra invertida com uma barra invertida para fazê-lo funcionar. Digite print '\\'e você verá que é apenas a representação de uma barra invertida.
KarlKastor

Você pode chegar a 36 com lambda a:{*''' lambda&':{}*'''}&{*a}.
Morgan Thrapp

11
@MorganThrapp 35lambda a:{*' lambda&\\\':{}*'}&{*a}
Veja

9

Perl 6 , 56, 55 bytes

Versão " francês " / Unicode (55 bytes)

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

Versões " Texas " / ASCII (56 bytes)

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

Não-golfe:

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

Exemplos:

$ 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
Não $*PROGRAMacessa o código fonte do programa e, portanto, viola as regras?
Celtschk

@celtschk Eu deveria ter relido a pergunta antes de postar, corrigido. (Tecnicamente, o compilador poderia ver que $*PROGRAMé ler e armazenar toda a fonte como uma string no programa compilado, o que teria colocá-lo em uma área cinzenta)
Brad Gilbert b2gills

8

MATL , 8 bytes

'X&'''X&

Experimente online!

Entrada é uma cadeia de caracteres entre aspas simples. Se a string contiver um símbolo de aspas simples, ela deverá ser duplicada para escapar dela.

Explicação

'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

Na verdade, 6 bytes

`∩è`è∩

Experimente online!

Explicação:

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

Esta é uma solução tão chata ... Mas eu não poderia fazer melhor. :(

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

5

Braquilog , 23 bytes

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

Experimente online!

Explicação

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

11
Você pode dar uma olhada no nosso chat?
Leaky Nun

11
+1 para o bigode :{e o bigode surpreso #:{}
Destructible Lemon


4

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

Experimente em ideone .


2
Uma versão sem explicação e / ou explicação seria ótima!
YSC

Você poderia ter usado em sizeof avez de strlen(a)um byte salvo, mas o melhor é dar à matriz um tamanho conhecido: a[99]="..."e substituir strlen(a)por 99para reduzir 5 bytes.
G. Sliepen 8/09/16

Outros 3 ou 4 bytes podem ser salvos substituindo (i=getchar())>=0por read(0,&i,1). Isso funciona em máquinas little-endian. ié inicializado como 1 se você não executar o programa com nenhum argumento. Se você deseja que ele funcione também em máquinas big-endian, remova i da lista de argumentos main()e declare-o dentro do corpo como um caractere (mas, em seguida, salve apenas 3 bytes). read()convenientemente retorna 0 no EOF.
G. Sliepen 8/09/16

4

CJam, 8 bytes

"`q&"`q&

Experimente aqui.

Explicação:

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

Retina, 21 20 bytes

Remove os caracteres que não estão no código-fonte e remove os caracteres duplicados.

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

Ds`.

Experimente online


Seu código fonte contém um avanço de linha (sua saída não).
Martin Ender

Eu tinha basicamente a mesma solução anteriormente, mas esqueci de publicá-la. Você pode salvar alguns bytes com o intervalo [-a(incluir um sublinhado e um hífen e soltar o backtick na segunda linha). Mas, para referência futura, ]não precisaria escapar se você o colocasse como o primeiro personagem. Ah, e por gentileza, você pode trocar os dois estágios para evitar o avanço de linha à direita.
Martin Ender

@MartinEnder Isso ainda não desduplica os feeds de linha, isso é um problema?
mbomb007

Oh, você está certo, eu não percebi isso. Você terá que adicionar sàs opções De classe de personagem então.
Martin Ender

4

Mathematica, 35 bytes

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

Função anônima. Ignore as mensagens geradas. Pega uma lista de caracteres como entrada e retorna uma lista de caracteres como saída. O caractere Unicode é U + 22C2 para \[Intersection].



4

Vim, 78 68 78 79 61 pressionamentos de teclas

Mudou completamente minha abordagem:

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

Como funciona:

Primeiro, ele cria uma linha com todos os caracteres do programa e, em seguida, localiza a primeira instância de cada um dos caracteres do programa, que está na entrada, se a entrada e a saída se cruzam, ou a saída, se não, exclui ele é movido para o último caractere do arquivo (e assim por diante) e o faz para cada caractere único na origem, exceto d, onde, em vez de ir para o final do arquivo, termina excluindo a entrada


A barra invertida está no seu código, mas não parece estar na sua string.
Titus

Não é o terceiro?
Destructible Lemon

4

Bash , 45 50 41 39 37 34 29 bytes

-9 bytes graças a Geoff Reedy
-4 bytes graças a Dennis
-5 bytes graças a Nahuel Fouilleul

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

Experimente online!


Você não precisa apenas de um comando grep?
Geoff Reedy

@GeoffReedy O primeiro comando grep divide a entrada em um caractere por linha.
Dennis

Certo, mas não conseguiu a -o ser colocado para o segundo grep
Geoff Reedy

Você está certo, e isso economiza ter que verificar o '.'. Obrigado!
Riley

11
@Titus Depois que o BASH faz as coisas, o grep recebe -oe [] [|\'grepouniq-]. Por isso, está à procura de qualquer coisa destas: [ ] {space} [ | {slash} ' g r e p o u n i q - ].
Riley

3

PowerShell v4 +, 122 104 bytes

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

Ugh. Quines ou código semelhante a quine no PowerShell é péssimo, porque a formatação de substituição de string é muito desajeitada.

A cadeia ace...{2}no meio é todo caractere presente no restante do código. O {0}{1}{2}é usado em conjunto com o -foperador ormat para puxar os '{}caracteres para a sequência.

Isso é combinado como um conjunto de caracteres com a entrada $argse depois é alimentado no pipeline. A primeira parada é Group-Objectqual (essencialmente) cria uma hashtable dos objetos de entrada e quantas vezes eles ocorrem na entrada. Isso é canalizada para |?{...}a Where-Objectselecionar apenas aqueles itens que têm um .countmaior do que 1. Encapsulamos isso em parênteses e removemos a .Nameparte da hashtable (que é onde o requisito v4 + entra em jogo, caso contrário, precisaríamos de um |Select Nameestágio adicional para o pipeline).

Esses elementos são deixados no pipeline (como uma matriz) e a impressão está implícita.


3

Python 2, 44 bytes

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

Apenas por diversão, aqui está uma submissão completa do programa, semelhante a um quine. Produz a representação de string de um conjunto Python 2.


3

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>

Retorna uma matriz de caracteres presentes na cadeia de caracteres / matriz original e no código-fonte. Editar: salvou 2 bytes graças a @ user81655.


f=s=>[...new Set(f+'')]...poderia salvar bytes.
user81655

Ou ainda mais curto:f=s=>[...s].filter(c=>(new Set(f+'')).has(c))
user81655 11/11

@ user81655 Pelo menos no Firefox, f+''funciona lendo fo código fonte. (Em certos casos, você pode obter o Firefox para falhar, alterando o arquivo de origem e, em seguida, tentar stringify uma função carregado a partir dele.)
Neil

@ user81655 O seu segundo exemplo falha quando stem elementos repetidos e indexOfé mais curto do que new Setqualquer outra forma.
Neil

Nesse caso, você pode tentar salvar caracteres (como alterar o cparâmetro para um caractere que já está na lista).
user81655

3

Matlab, 37 bytes

Bem simples:

Usa o builtin intersectpara encontrar a interseção. O código fonte é codificado. A entrada deve ser fornecida entre aspas''

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

Você deveria ter usado uma função anônima ... vencê-lo por 5 bytes #
Sanchises

Hehe, eu acho que não era o meu melhor golfe ...
Stewie Griffin

3

JavaScript (Chrome 58 no OS X 10), 12654 12426 11992 bytes

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

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

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

O código original:

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

Isso foi convertido em um estilo de programação chamado jsfk, que usa apenas esses seis caracteres:

(+)[!] 

usando um compilador online.


Se jsfk é o idioma, você deve usá-lo no cabeçalho em vez de Javascript.
NonlinearFruit

11
@NonlinearFruit jsfk é um estilo de programação . É javascript válido
Tornado547

2

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

Se eu desfazer isso, ele precisa mudar coisas estranhas, como uma nova linha na string b. De qualquer forma, é super simples - cria um vetor com todos os caracteres na função. Em seguida, ele puxa a entrada para um vetor e verifica a associação.


você ainda não visitou o local em quase um ano, mas f=function(s)cat(instersect(strsplit(s,"")[[1]],strsplit("f=unctio(s)aerpl,\\\"[1]","")[[1]]),sep="")é de 101 bytes, e acho que o formato de I / O pode ser mais simples, sem cat...
Giuseppe

2

Ruby, 34 + nsinalizador = 35 bytes

Não funciona exatamente com entrada com várias linhas, pois -nfaz com que o programa processe STDIN linha por linha. Não há novas linhas nesse código, mas tentar inserir algo assim produzirá várias matrizes em vez de uma. Se isso não for bom, de acordo com as especificações, informe-me e eu corrigirei.

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

2

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

ridículo, mas estou entretido


2

sed, 47 caracteres

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

Estou um pouco decepcionado com o tempo que isso acabou, especialmente com a remoção de caracteres repetidos.


Qual versão do sed é essa? GNU sed diz sed: -e expression #1, char 47: unterminated `s' command.
Dennis

43 bytes, incluindo 1 para -r: sed -r ':;ss[^][str().*\12;:^]ss;ss(.)(.*\1)s\2s;t' i escreveu antes de notar a sua e que acabou por ser muito semelhante
izabera

@Dennis fixed; acabou por ter um: após a [causou a tentar analisar uma classe de personagem
Geoff Reedy

@izabera bom, estou muito surpreso que o comando: na verdade não precisa de um rótulo e que ele muda o significado de t sem uma etiqueta
Geoff Reedy

sim, é um gnuism
izabera

2

Java 8 lambda, 152 142 140 caracteres

Muito curto:

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

Ou não destruído por aqui:

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

    }
}

É claro que a solução não destruída está errada, pois não combina com os colchetes e mais alguns personagens, é apenas por uma questão de perfeição.

A função recebe a entrada como a Stringe retorna a java.util.Set<Character>contendo os caracteres presentes na entrada e na fonte.

Atualizações

Acabou que a solução não estava funcionando. Eu pensei em String#containstestes para uma correspondência de regex, mas é apenas uma correspondência literal. Eu adicionei algumas fugas para citar os personagens, .mas isso não era necessário, mas estragou tudo. Agora, sem essa fuga, salvamos alguns personagens e agora ele realmente funciona :)

Obrigado a @NonlinearFruit por me lembrar de usar variáveis ​​de um caractere.


Renomeie ina ser uma única letra comoa
NonlinearFruit

3
@NonlinearFruit você está certo: O que eu poderia esquecer disso ?!
Frozn 12/08/16

2

SQF , 71 69 64 bytes

Usando o formato de arquivo como uma função:

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

Ligar como "STRING" call NAME_OF_COMPILED_FUNCTION

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.