Entrada ∩ Código fuente


70

Introducción

El desafío es crear un programa / función que imprima la intersección de su propio código fuente y una entrada de cadena dada. Este es el código de golf y para ser más precisos:

  • Deje Iser el conjunto de entrada
    • {"a","b","c"}
  • Dejar Sser el conjunto de código fuente
    • {"b","f"}
  • Entonces la intersección es lo que comparten
    • I ∩ S = {"b"}

Entrada

La entrada es flexible. Debe poder manejar la codificación de caracteres utilizada para el código fuente.

Salida

La salida es flexible. Debe ser el conjunto de caracteres que comparten la entrada y el código fuente. Además, los conjuntos son colecciones desordenadas de objetos distintos. En resumen:

  • La salida es flexible:
    • Podría ser cualquier estructura de datos (cadena o de otra manera)
    • Podría desordenada
    • Podría tener un final \n
    • Debe ser distinto

Restricción

Similar a los desafíos de , el programa / función puede no leer su propio código fuente y no se permiten soluciones de 0 bytes.

Ejemplos

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

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.

Actualizar

  • [16-08-10]: los conjuntos son colecciones desordenadas de objetos distintos
  • [16-08-10]: la nueva línea final es aceptable

2
¿Puede la salida contener caracteres duplicados?
Trauma digital

1
@DigitalTrauma De los ejemplos n. ° 1, n. ° 2 y n. ° 3 parece que no
Luis Mendo

@DigitalTrauma Perdón por la ambigüedad, los conjuntos (en el sentido matemático) ignoran el orden y no tienen repetición.
NonlinearFruit

22
Enhorabuena por llegar a una línea generalizada donde las mejores soluciones no se basan en la línea estándar del idioma. :)
Martin Ender

1
Si un conjunto no debe tener repetición, ¿no deberían los conjuntos de entrada tampoco contener repetición? ¿O la entrada en realidad no es un conjunto?
user81655

Respuestas:


24

Jalea , 10 6 bytes

“Ṿf”Ṿf

Pruébalo en línea!

Cómo 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

Gracias Karl por salvarme un byte :-) ¡Gracias Dada por salvarme dos bytes!

Creo que esto funciona, pero es mi primer desafío quine, así que no estoy 100% seguro. : \

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

Versión Lambda con 43 bytes: lambda a:set(" lambdaset()&'"+':+"')&set(a)


8
'eroticpuns\()&\''es más corto que agregar las cadenas. (se escapó 'pero necesita un `\` adicional) ¿Por qué está allí el punto?
KarlKastor

woops, .era una reliquia de un código menos golfista. El uso de la barra invertida no funciona porque la salida de \` is \\ `y la duplicación del carácter de entrada no están permitidas, creo.
Jeremy

1
A tu lambda le falta el :.
Dennis

Gracias @ Dennis. Mis ojos comienzan a nublarse después de tratar de encontrar a todos los personajes del programa;)
Jeremy

1
@Dada: Si prefiere, podría ser inspectour, nicestupor, poeticurns, nopictures, recountspi, o inputscore. O para el nuevo que podría usar prunesit(una descripción precisa de lo que hacen los golfistas de código) ipunster, o nursepitentre otros.
Deusovi

11

Dyalog APL , 8 bytes

'∩''⊢'∩⊢

is devuelve los caracteres del argumento izquierdo que están presentes en el argumento derecho (si el argumento izquierdo no tiene duplicados, como en este caso, entonces el resultado tampoco tiene duplicados

es el argumento

Luego, la cadena solo tiene esos dos más el carácter de comillas (duplicado, ya que está en una cadena).

TryAPL en línea!


10

GolfScript, 6 bytes

"`&"`&

Pruébalo en línea!

Cómo 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 gracias a @Jeremy

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

función lambda anónima, toma una cadena, devuelve un conjunto

versión antigua:

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

Me gusta esto, pero devuelve dos barras diagonales inversas en `\\` en lugar de solo una.
Jeremy

Además, creo que puede guardar un byte cambiando el nombre de la lambda aa
Jeremy

1
@Jeremy Gracias por la sugerencia, '\\'es solo la forma en que Python representa una barra invertida en forma de cadena, porque una sola escaparía a la cita final, por lo que debe escapar de la barra invertida con una barra invertida para que funcione. Escriba print '\\'y verá que es solo la representación de una barra invertida.
KarlKastor

Puedes llegar a 36 con lambda a:{*''' lambda&':{}*'''}&{*a}.
Morgan Thrapp

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

9

Perl 6 , 56, 55 bytes

Versión " francesa " / Unicode (55 bytes)

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

Versiones " Texas " / ASCII (56 bytes)

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

No golfizado:

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

Ejemplos:

$ 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
¿No $*PROGRAMaccede al código fuente del programa y, por lo tanto, viola las reglas?
celtschk

@celtschk Debería haber releído la pregunta antes de publicar, arreglada. (Técnicamente, el compilador podría ver que $*PROGRAMse lee y almacena toda la fuente como una cadena en el programa compilado, lo que lo habría colocado en un área gris)
Brad Gilbert b2gills

8

MATL , 8 bytes

'X&'''X&

Pruébalo en línea!

La entrada es una cadena entre comillas simples. Si la cadena contiene un símbolo de comillas simples, debe duplicarse para escapar de ella.

Explicación

'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

En realidad, 6 bytes

`∩è`è∩

Pruébalo en línea!

Explicación:

`∩è`è∩
`∩è`    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 es una solución tan aburrida ... Pero no podría hacerlo mejor. :(

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

5

Brachylog , 23 bytes

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

Pruébalo en línea!

Explicación

:{                 }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
¿Puedes echar un vistazo a nuestra sala de chat?
Leaky Nun

1
+1 para el hombre bigote :{y el hombre bigote sorprendido:{}
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);}

Pruébalo con ideone .


2
¡Una versión no explicada y / o explicación sería genial!
YSC

Podría haber usado en sizeof alugar de strlen(a)un byte guardado, pero aún mejor es darle a la matriz un tamaño conocido: a[99]="..."y reemplazar strlen(a)por 99para eliminar 5 bytes.
G. Sliepen

Se pueden guardar otros 3 o 4 bytes reemplazándolos (i=getchar())>=0con read(0,&i,1). Esto funciona en máquinas little endian. ise inicializa a 1 si no ejecuta el programa con ningún argumento. Si desea que funcione también en máquinas big-endian, elimine i de la lista de argumentos main()y declare dentro del cuerpo como un carácter (pero luego guarda solo 3 bytes). read()convenientemente devuelve 0 en EOF.
G. Sliepen

4

CJam, 8 bytes

"`q&"`q&

Pruébalo aquí.

Explicación:

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

Elimina los caracteres que no están en el código fuente, luego elimina los caracteres duplicados.

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

Ds`.

Pruébalo en línea


Su código fuente contiene un salto de línea (su salida no).
Martin Ender

Básicamente tenía la misma solución antes, pero olvidé publicarla. Puede guardar algunos bytes con el rango [-a(y luego incluir un guión bajo y un guión y soltar la tecla de retroceso en la segunda línea). Pero para referencia futura, ]no necesitaría escapar si lo pones como el primer personaje. Ah, y para mayor amabilidad, puede intercambiar las dos etapas para evitar el avance de línea final.
Martin Ender

@MartinEnder Esto todavía no deduplica los avances de línea, ¿es un problema?
mbomb007

Oh tienes razón, no me di cuenta de eso. Tendrás que agregar sa las opciones de Dy la clase de personaje entonces.
Martin Ender

4

Mathematica, 35 bytes

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

Función anónima. Ignora cualquier mensaje generado. Toma una lista de caracteres como entrada y devuelve una lista de caracteres como salida. El carácter Unicode es U + 22C2 para \[Intersection].



4

Vim, 78 68 78 79 61 pulsaciones de teclas

Cambié completamente mi enfoque:

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

Cómo funciona:

Primero, hace una línea con todos los caracteres del programa, luego, encuentra la primera instancia de cada uno de los caracteres del programa, que está en la entrada, si la entrada y la salida se cruzan, o la salida si no lo hacen, elimina se mueve al último carácter del archivo (de modo que se envuelve) y lo hace para cada carácter único en la fuente, excepto d, donde, en lugar de moverse al final del archivo, termina eliminando la entrada


La barra invertida está en su código pero no parece estar en su cadena.
Titus

¿No es el tercero?
Destructible Lemon

4

Bash , 45 50 41 39 37 34 29 bytes

-9 bytes gracias a Geoff Reedy
-4 bytes gracias a Dennis
-5 bytes gracias a Nahuel Fouilleul

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

Pruébalo en línea!


¿No solo necesitas un comando grep?
Geoff Reedy

@GeoffReedy El primer comando grep divide la entrada en un carácter por línea.
Dennis

Correcto, pero no podía ser puesto en el segundo grep
Geoff Reedy

Tienes razón, y eso ahorra tener que verificar el '.'. ¡Gracias!
Riley

1
@Titus Después de que BASH hace lo suyo, grep consigue -oy [] [|\'grepouniq-]. Por lo tanto, está en busca de algo de ellos: [ ] {space} [ | {slash} ' g r e p o u n i q - ].
Riley

3

PowerShell v4 +, 122104 bytes

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

Ugh Quines o código similar a quine en PowerShell apesta, porque el formato de reemplazo de cadena es muy torpe.

La cadena ace...{2}en el medio es cada carácter que está presente en el resto del código. El {0}{1}{2}se utiliza junto con el -foperador ormat para extraer los '{}caracteres en la cadena.

Eso se combina como una matriz de caracteres con la entrada $args, luego se alimenta a la tubería. La primera parada es Group-Objectqué (esencialmente) crea una tabla hash de los objetos de entrada y cuántas veces ocurren en la entrada. Eso es canalizado a |?{...}la Where-Objectúnica seleccionar aquellos elementos que tienen un .countmayor que 1. Encapsulamos eso en parens y extraemos la .Nameparte de la tabla hash (que es donde entra en juego el requisito v4 +, de lo contrario necesitaríamos una |Select Nameetapa adicional en la tubería).

Esos elementos se dejan en la tubería (como una matriz), y la impresión está implícita.


3

Python 2, 44 bytes

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

Solo por diversión, aquí hay una presentación completa del programa tipo quine. Emite la representación de cadena de un conjunto de 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>

Devuelve una matriz de caracteres presentes tanto en la cadena original / matriz de caracteres como en el código fuente. Editar: Guardado 2 bytes gracias a @ user81655.


f=s=>[...new Set(f+'')]...podría guardar bytes.
user81655

O incluso más corto:f=s=>[...s].filter(c=>(new Set(f+'')).has(c))
user81655

@ user81655 Al menos en Firefox, f+''funciona leyendo fel código fuente. (En ciertos casos, puede hacer que Firefox se bloquee al cambiar el archivo fuente y luego intentar stringificar una función cargada desde él.)
Neil

@ user81655 Su segundo ejemplo falla cuando stiene elementos repetidos y indexOfes más corto que de new Settodos modos.
Neil

En ese caso, podría intentar guardar caracteres (como cambiar el cparámetro a un carácter que ya está en la lista).
user81655

3

Matlab, 37 bytes

Bastante sencillo:

Utiliza el incorporado intersectpara encontrar la intersección. El código fuente está codificado. La entrada debe ser entre comillas''

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

Deberías haber usado una función anónima ... venció por 5 bytes
Sanchises

Jeje, supongo que ese no fue mi mejor golf ...
Stewie Griffin

3

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

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

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

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

El código original:

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

Esto se convirtió en un estilo de programación llamado jsfk que solo usa estos seis caracteres:

(+)[!] 

utilizando un compilador en línea.


Si jsfk es el idioma, debe usarlo en el encabezado en lugar de Javascript.
NonlinearFruit

1
@NonlinearFruit jsfk es un estilo de programación . Es 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="")}

Si lo elimino, es necesario que cambien las cosas raras como una nueva línea en la cadena b. De todos modos, es súper simple: construye un vector con todos los caracteres en la función. Luego, extrae la entrada en un vector y verifica la membresía.


no ha visitado el sitio en casi un año, pero f=function(s)cat(instersect(strsplit(s,"")[[1]],strsplit("f=unctio(s)aerpl,\\\"[1]","")[[1]]),sep="")tiene 101 bytes, y creo que el formato de E / S puede ser más simple, sin cat...
Giuseppe

2

Ruby, 34 + nbandera = 35 bytes

No funciona exactamente con entradas de líneas múltiples, ya que -nhace que el programa procese STDIN línea por línea. No hay líneas nuevas en este código, pero tratar de ingresar algo como eso generará múltiples matrices en lugar de una. Si eso no es bueno de acuerdo con las especificaciones, infórmeme y lo arreglaré.

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 pero estoy entretenido


2

sed, 47 caracteres

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

Estoy un poco decepcionado por cuánto tiempo resultó ser esto, especialmente el poco para eliminar los caracteres repetidos.


¿Qué versión de sed es esta? GNU sed dice sed: -e expression #1, char 47: unterminated `s' command.
Dennis

43 bytes incluyendo 1 para -r: lo sed -r ':;ss[^][str().*\12;:^]ss;ss(.)(.*\1)s\2s;t' escribí antes de notar el tuyo y resultó ser muy similar
izabera

@Dennis arreglado; resultó tener un: después de que [hizo que intentara analizar una clase de personajes
Geoff Reedy

@izabera agradable, estoy bastante sorprendido de que el comando: en realidad no necesite una etiqueta y que cambie el significado de t sin etiqueta
Geoff Reedy

sí, es un gnuismo
izabera

2

Java 8 lambda, 152 142 140 caracteres

Bastante corto:

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

O sin golf por aquí:

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

    }
}

Por supuesto, la solución no correcta es incorrecta, ya que no coincide con las llaves y algunos caracteres más, es solo por su integridad.

La función toma la entrada como a Stringy devuelve un que java.util.Set<Character>contiene los caracteres que están presentes tanto en la entrada como en la fuente.

Actualizaciones

Resultó que la solución no estaba funcionando. Pensé que las String#containspruebas para una coincidencia de expresiones regulares, pero es solo una coincidencia literal. Agregué algunos escapes para citar los personajes, .pero esto no fue necesario, pero arruiné todo en su lugar. Ahora, sin este escape, guardamos algunos caracteres y ahora realmente funciona :)

Gracias a @NonlinearFruit por recordarme el uso de variables de un carácter.


Cambiar el nombre inpara que sea una sola letra comoa
NonlinearFruit

3
@NonlinearFruit tienes razón: ¡¿Cómo podría olvidarme de eso ?!
Frozn

2

SQF , 71 69 64 bytes

Usando el formato de archivo como función:

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

Llamar como "STRING" call NAME_OF_COMPILED_FUNCTION

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.