Input ∩ Codice sorgente


70

Intro

La sfida è quella di creare un programma / funzione che stampa l'intersezione del proprio codice sorgente e di un dato input di stringa. Questo è il codice golf e per essere più precisi:

  • Lascia che Isia il set di input
    • {"a","b","c"}
  • Lascia che Ssia impostato il codice sorgente
    • {"b","f"}
  • Quindi l'intersezione è ciò che condividono
    • I ∩ S = {"b"}

Ingresso

L'input è flessibile. Dovrebbe essere in grado di gestire la codifica dei caratteri utilizzata per il codice sorgente.

Produzione

L'output è flessibile. Dovrebbe essere l'insieme di caratteri che condividono l'input e il codice sorgente. Inoltre, i set sono raccolte non ordinate di oggetti distinti. In sintesi:

  • L'output è flessibile:
    • Potrebbe essere qualsiasi struttura di dati (stringa o altro)
    • Non ordinato
    • Potrebbe avere un finale \n
    • Dovrebbe essere distinto

Restrizione

Simile a sfide, il programma / funzione potrebbe non leggere il proprio codice sorgente e le soluzioni a 0 byte non sono consentite.

Esempi

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

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

Casi test

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.

Aggiornare

  • [16-08-10]: i set sono raccolte non ordinate di oggetti distinti
  • [16-08-10]: la nuova riga finale è accettabile

2
L'output può contenere caratteri duplicati?
Trauma digitale

1
@DigitalTrauma Dagli esempi n. 1, n. 2 e n. 3 non sembra
Luis Mendo

@DigitalTrauma Ci scusiamo per l'ambiguità, i set (in senso matematico) ignorano l'ordine e non hanno ripetizioni.
NonlinearFruit

22
Congratulazioni per aver creato un quine generalizzato in cui le migliori soluzioni non si basano sul quine standard del linguaggio. :)
Martin Ender,

1
Se un set non dovrebbe avere ripetizioni, anche i set di input non dovrebbero contenere ripetizioni? O l'ingresso non è in realtà un set?
user81655

Risposte:


24

Gelatina , 10 6 byte

“Ṿf”Ṿf

Provalo online!

Come funziona

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

Grazie Karl per avermi salvato un byte :-) Grazie Dada per avermi salvato due byte!

Penso che funzioni, ma è la mia prima sfida, quindi non ne sono sicuro al 100%. : \

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

Versione lambda con 43 byte: lambda a:set(" lambdaset()&'"+':+"')&set(a)


8
'eroticpuns\()&\''è più breve dell'aggiunta delle stringhe. (è scappato il 'ma poi hai bisogno di un ulteriore `\`) Perché il punto è lì?
KarlKastor,

guaio, .era una reliquia da codice meno golfato. L'uso di backslash non funziona perché quindi l'output da \` is \\ `, e duplicare il carattere di input non è consentito, credo.
Jeremy,

1
Alla tua lambda manca il :.
Dennis,

Grazie @Dennis. I miei occhi iniziano a annebbiarsi dopo aver cercato di trovare tutti i personaggi nel programma;)
Jeremy

1
@Dada: Se preferisci, potrebbe essere inspectour, nicestupor, poeticurns, nopictures, recountspi, o inputscore. O per quello nuovo che potresti usare prunesit(una descrizione accurata di cosa fanno i golfisti di codice!) ipunster, O nursepittra gli altri.
Deusovi,

11

Dyalog APL , 8 byte

'∩''⊢'∩⊢

restituisce quei caratteri dell'argomento sinistro presenti nell'argomento destro (se l' argomento sinistro non ha duplicati - come in questo caso - anche il risultato non ha duplicati

è l'argomento

Quindi la stringa ha solo quei due più il carattere di citazione (raddoppiato, come è in una stringa).

ProvaAPL online!


10

GolfScript, 6 byte

"`&"`&

Provalo online!

Come funziona

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

-1 Byte grazie a @Jeremy

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

funzione lambda anonima, accetta una stringa, restituisce un set

vecchia versione:

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

Mi piace, ma restituisce due barre rovesciate su `\\` invece di una sola.
Jeremy,

Inoltre, penso che puoi salvare un byte cambiando il nome del lambda ina
Jeremy

1
@Jeremy Grazie per punta, '\\'è solo il modo di Python di rappresentare una barra rovesciata in forma di stringa, perché uno solo sarebbe sfuggire alla fine citazione, in modo da avere per sfuggire alla barra rovesciata con un backslash per farlo funzionare. Digita print '\\'e vedrai che è solo la rappresentazione di una barra rovesciata.
KarlKastor,

Puoi arrivare a 36 con lambda a:{*''' lambda&':{}*'''}&{*a}.
Morgan Thrapp,

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

9

Perl 6 , 56, 55 byte

Versione " francese " / Unicode (55 byte)

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

Versioni " Texas " / ASCII (56 byte)

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

Esempi:

$ 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
Non $*PROGRAMaccede al codice sorgente del programma e quindi viola le regole?
Celtschk,

@celtschk Avrei dovuto rileggere la domanda prima di pubblicare, risolto. (Tecnicamente il compilatore potrebbe vedere che $*PROGRAMviene letto e memorizzato l'intera fonte come una stringa nel programma compilato, che lo metterebbe in una zona grigia)
Brad Gilbert b2gills

8

MATL , 8 byte

'X&'''X&

Provalo online!

L'input è una stringa racchiusa tra virgolette singole. Se la stringa contiene un simbolo a virgoletta singola, deve essere duplicata per evitarlo.

Spiegazione

'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

In realtà, 6 byte

`∩è`è∩

Provalo online!

Spiegazione:

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

Questa è una soluzione così noiosa ... Ma non potrei fare di meglio. :(

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

5

Brachylog , 23 byte

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

Provalo online!

Spiegazione

:{                 }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
Puoi dare un'occhiata alla nostra chat room?
Leaky Nun,

1
+1 per l'uomo con i baffi :{e l' uomo con i baffi sorpresi:{}
Limone distruttibile


4

C, 142 byte

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

Provalo su ideone .


2
Una versione non golfata e / o una spiegazione sarebbero grandiose!
YSC,

Avresti potuto usare sizeof ainvece che strlen(a)per un byte salvato, ma ancora meglio è dare all'array una dimensione nota:, a[99]="..."e sostituire strlen(a)con 99per radere 5 byte.
G. Sliepen,

È possibile salvare altri 3 o 4 byte sostituendoli (i=getchar())>=0con read(0,&i,1). Funziona su macchine little-endian. iviene inizializzato su 1 se non si esegue il programma con alcun argomento. Se vuoi che funzioni anche su macchine big-endian, rimuovi i dall'elenco degli argomenti di main()e dichiaralo all'interno del corpo come carattere (ma poi salvi solo 3 byte). read()restituisce comodamente 0 su EOF.
G. Sliepen,

4

CJam, 8 byte

"`q&"`q&

Provalo qui.

Spiegazione:

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

Pyth , 9 8 byte

1 byte grazie a Sp3000

@Q"\Q@\"

Provalo online!

@Q"\Q@\"
@Q"\Q@\""   implicit string ending

@Q           intersect the input with
  "\Q@\""   the string containing '\', 'Q', '@', '"'.

@z"z\"@è più corto di 1 byte.
drobilc,

@drobilc Quello perderebbe il \.
Leaky Nun,

oh sì, me ne sono completamente dimenticato.
drobilc,

4

Retina, 21 20 byte

Rimuove i caratteri non presenti nel codice sorgente, quindi rimuove i caratteri duplicati.

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

Ds`.

Provalo online


Il codice sorgente contiene un avanzamento riga (l'output no).
Martin Ender,

Avevo praticamente la stessa soluzione in precedenza ma ho dimenticato di pubblicarla. È possibile salvare alcuni byte con l'intervallo [-a(e quindi includere un trattino basso e un trattino e rilasciare il backtick sulla seconda riga). Ma per riferimento futuro, ]non avresti bisogno di scappare se lo metti come primo personaggio. Oh e per gentilezza, puoi scambiare le due fasi per evitare il trascinamento della linea.
Martin Ender,

@MartinEnder Questo ancora non deduplica i feed di riga, è un problema?
mbomb007,

Oh hai ragione, non me ne sono accorto. Dovrai quindi aggiungere sle opzioni De la classe di caratteri.
Martin Ender,

4

Mathematica, 35 byte

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

Funzione anonima. Ignora eventuali messaggi generati. Accetta un elenco di caratteri come input e restituisce un elenco di caratteri come output. Il carattere Unicode è U + 22C2 per \[Intersection].



4

Vim, 78 68 78 79 61 sequenze di tasti

Completamente cambiato il mio approccio:

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

Come funziona:

Innanzitutto, crea una linea con tutti i caratteri del programma, quindi trova la prima istanza di ciascuno dei caratteri del programma, che si trova nell'input, se l'input e l'output si intersecano, o l'output in caso contrario, elimina esso si sposta sull'ultimo carattere del file (quindi si avvolge) e lo fa per ogni carattere univoco nella sorgente, tranne d, dove invece di spostarsi alla fine del file, termina eliminando l'input


La barra rovesciata è nel tuo codice ma non sembra essere nella tua stringa.
Tito

Non è il terzo?
Limone distruttibile

4

Bash , 45 50 41 39 37 34 29 byte

-9 byte grazie a Geoff Reedy
-4 byte grazie a Dennis
-5 byte grazie a Nahuel Fouilleul

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

Provalo online!


Non hai bisogno solo di un comando grep?
Geoff Reedy,

@GeoffReedy Il primo comando grep divide l'input in un carattere per riga.
Dennis,

Giusto, ma non è stato possibile aggiungere -o al secondo grep
Geoff Reedy,

Hai ragione, e questo evita di dover controllare il '.'. Grazie!
Riley,

1
@Titus Dopo che BASH fa la sua cosa, grep ottiene -oe [] [|\'grepouniq-]. Così è alla ricerca di qualche cosa di queste: [ ] {space} [ | {slash} ' g r e p o u n i q - ].
Riley,

3

PowerShell v4 +, 122 104 byte

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

Ugh. Quines o codice simile a quine in PowerShell fa schifo, perché la formattazione di sostituzione delle stringhe è così ingombrante.

La stringa ace...{2}nel mezzo è ogni carattere presente nel resto del codice. La {0}{1}{2}viene utilizzato in combinazione con l' -foperatore ormat per tirare i '{}caratteri nella stringa.

Viene combinato come char-array con l'input $args, quindi immesso nella pipeline. Il primo stop è Group-Objectche (essenzialmente) crea una tabella hash degli oggetti di input e quante volte si verificano nell'input. Questo è convogliato per |?{...}il Where-Objectper selezionare solo gli elementi che hanno un .countmaggiore rispetto 1. Lo incapsuliamo in parentesi e estraiamo la .Nameparte dell'hashtable (che è dove entra in gioco il requisito v4 +, altrimenti avremmo bisogno di uno |Select Namestadio aggiuntivo per la pipeline).

Tali elementi vengono lasciati sulla pipeline (come array) e la stampa è implicita.


3

Python 2, 44 byte

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

Solo per divertimento, ecco una presentazione di un programma completo simile a un quine. Emette la rappresentazione in formato stringa di un set di Python 2.


3

JavaScript (ES6), 59 57 byte

f=
t=>[..."\"().=>O[\\]defilnrtx~"].filter(e=>~t.indexOf(e))
;
<input placeholder=Input oninput=o.value=f(this.value).join``><input placeholder=Output id=o>

Restituisce un array di caratteri presenti sia nell'array stringa / carattere originale sia nel codice sorgente. Modifica: salvato 2 byte grazie a @ user81655.


f=s=>[...new Set(f+'')]...potrebbe salvare byte.
user81655

O ancora più breve:f=s=>[...s].filter(c=>(new Set(f+'')).has(c))
user81655

@ user81655 Almeno in Firefox, f+''funziona leggendo fil codice sorgente. (In alcuni casi è possibile che Firefox si blocchi in modo anomalo modificando il file sorgente e quindi tentando di stringere una funzione caricata da esso.)
Neil

@ user81655 Il tuo secondo esempio fallisce quando sha elementi ripetuti ed indexOfè più breve di new Setcomunque.
Neil,

In tal caso, potresti provare a salvare i caratteri (come cambiare il cparametro in un carattere che è già nell'elenco).
user81655

3

Matlab, 37 byte

Abbastanza semplice:

Utilizza l'integrato intersectper trovare l'intersezione. Il codice sorgente è hard coded. L'input deve essere indicato tra virgolette''

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

Avresti dovuto usare una funzione anonima ...
batterti di

Hehe, immagino che non sia stato il mio miglior golf ...
Stewie Griffin,

3

JavaScript (Chrome 58 su OS X 10), 12654 12426 11992 byte

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

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

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

Il codice originale:

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

Questo è stato quindi convertito in uno stile di programmazione chiamato jsfk che utilizza solo questi sei caratteri:

(+)[!] 

usando un compilatore online.


Se jsfk è la lingua, dovresti usarla nell'intestazione anziché in Javascript.
NonlinearFruit

1
@NonlinearFruit jsfk è uno stile di programmazione . È javascript valido
Tornado547,

2

R, 129 byte

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 lo deseleziono, deve essere cambiato qualcosa di strano come una nuova riga nella stringa b . Ad ogni modo, è super semplice: crea un vettore con tutti i personaggi nella funzione al suo interno. Quindi estrae l'input in un vettore e verifica l'appartenenza.


non visiti il ​​sito da quasi un anno, ma f=function(s)cat(instersect(strsplit(s,"")[[1]],strsplit("f=unctio(s)aerpl,\\\"[1]","")[[1]]),sep="")è di 101 byte e penso che il formato I / O possa essere più semplice, senza cat...
Giuseppe

2

Rubino, 34 + nbandiera = 35 byte

Non funziona esattamente con input multi-linea, poiché -nfa sì che il programma elabori STDIN riga per riga. Non ci sono newline in questo codice, ma provare a inserire qualcosa del genere produrrà più array invece di uno. Se ciò non va bene secondo le specifiche, ti prego di informarmi e risolverò.

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

2

ListSharp , 222 byte

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

ridicolo ma sono divertito


2

sed, 47 caratteri

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

Sono un po 'deluso da quanto è venuto fuori, soprattutto per rimuovere i personaggi ripetuti.


Quale versione di sed è questa? Dice GNU sed sed: -e expression #1, char 47: unterminated `s' command.
Dennis,

43 byte di cui 1 per -r: l' sed -r ':;ss[^][str().*\12;:^]ss;ss(.)(.*\1)s\2s;t' ho scritto prima di notare il tuo e si è rivelato molto simile
izabera,

@Dennis fixed; risultò avere un: after the [lo indusse a cercare di analizzare una classe di personaggi
Geoff Reedy il

@izabera nice, sono abbastanza sorpreso che il comando: in realtà non abbia bisogno di un'etichetta e che cambi il significato di t senza un'etichetta
Geoff Reedy

sì, è uno gnuismo
izabera,

2

Java 8 lambda, 152 142 140 caratteri

Piuttosto 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 ungolf qui:

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

    }
}

Ovviamente la soluzione non golfata è sbagliata, poiché non corrisponde alle parentesi graffe e ad alcuni altri personaggi, è solo la loro per completezza.

La funzione accetta input come a Stringe restituisce a java.util.Set<Character>contenente i caratteri presenti sia in input che in source.

aggiornamenti

Si è scoperto che la soluzione non funzionava. Ho pensato ai String#containstest per una partita regex ma è solo una corrispondenza letterale. Ho aggiunto un po 'di fuga per citare i personaggi come .ma questo non era necessario ma invece ha rovinato tutto. Ora senza questa fuga salviamo alcuni personaggi e ora funziona davvero :)

Grazie a @NonlinearFruit per avermi ricordato di usare variabili di un carattere.


Rinomina income una singola lettera comea
NonlinearFruit

3
@NonlinearFruit hai ragione: O come potrei dimenticarmene ?!
Frozn,

2

SQF , 71 69 64 byte

Utilizzando il formato file come funzione:

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

Chiama come "STRING" call NAME_OF_COMPILED_FUNCTION

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.