Bolos de código prístino y único


82

Su desafío es simple: escriba el mayor tiempo posible de un programa prístino en el idioma que elija utilizando solo bytes únicos. (La definición completa de un programa original, copiado de ese enlace, se encuentra al final de esta pregunta).

Así es, sin condiciones. Su código no tiene que hacer nada en absoluto, solo ejecutarlo sin errores, cumplir con los requisitos para un programa original (vinculado anteriormente) e incluir bytes no duplicados en la codificación que utiliza.

A los fines de la explicación anterior y la definición vinculada de "programa prístino", un error se define como cualquier cosa que hace que el programa no se ejecute por completo o termine con un código de salida distinto de cero después de un período de tiempo finito.

Como esto es , el más largo , no el más corto, gana (medido por el conteo de bytes). El puntaje máximo teóricamente posible es 256, ya que hay 256 bytes distintos posibles. En caso de empate, gana la primera respuesta con la puntuación más alta.


Aquí está la definición completa de un programa prístino, copiado del enlace anterior:

Definamos un programa prístino como un programa que no tiene ningún error en sí mismo, pero lo hará si lo modifica quitando cualquier subcadena contigua de N caracteres, donde 1 <= N < program length.

Por ejemplo, el programa Python 2 de tres caracteres

`8`

es un programa original porque todos los programas resultantes de la eliminación de subcadenas de longitud 1 causan errores (errores de sintaxis, de hecho, pero cualquier tipo de error funcionará):

8`
``
`8

y también todos los programas resultantes de la eliminación de subcadenas de longitud 2 causan errores:

`
`

Si, por ejemplo, `8hubiera sido un programa sin errores, entonces `8`no sería perfecto porque todos los resultados de la eliminación de la subcadena deben ser erróneos.


37
¡Felicitaciones para ti por lograr crear un buen desafío de bolos de código !
ETHproductions

Si un subprograma se ejecuta para siempre pero no produce un error, ¿eso invalida la respuesta?
dylnan

1
@dylnan "un error se define como [...] terminar después de [...] una cantidad de tiempo finita ".
usuario202729

3
@Baldrickk No, no estaría permitido para este desafío. (Si se refiere al ejemplo en la pregunta, es una demostración de lo que es un programa original, pero que no cumple con el requisito adicional de bytes únicos).
Aidan F. Pierce

1
¿Podemos considerar el comportamiento indefinido como un error si en la práctica generalmente resulta en un error? Estoy pensando en algo así como JMP <address outside of the program's memory>en la asamblea. En principio, en una computadora real, podría hacer un bucle infinito o salir con un error distinto de cero, pero generalmente se bloqueará espectacularmente.
Chris

Respuestas:


23

Jalea , 253254 256 bytes

M“¢£¥¦©¬®µ½¿€ÆÇÐÑ×ØŒÞßæçðıȷñ÷øœþ !"#%&'()*+,-./0145689:;<=>?@ABCDEFGHIJKNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|~¶°¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ƁƇƑƓƘⱮƝƤƬƲȤɓƈɗƒɠɦƙɱɲƥʠɼʂƭʋȥẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒȦḂĊḊĖḞĠḢİĿṀṄȮṖṘṠṪẆẊẎŻḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓȧḃċḋėḟġḣŀṁṅȯṗṙṡṫẇẋẏż”L»«’Ɗạ‘}237$¤¡

Pruébalo en línea! o verificarlo!

Resulta que los idiomas de golf pueden jugar ...

  • +1 byte trabajando en . Ahora solo «»no se usan
  • +2 bytes con con «». ¡Ahora tenga la puntuación óptima!

¿Cómo?

La característica crucial de Jelly que lo hace posible es que los caracteres de apertura y cierre de los literales de cadena no son los mismos que en casi todos los demás idiomas.

La estructura del programa es la siguiente:

M <239 character long string> L»«’Ɗạ‘}237$¤¡

Mencuentra los índices de su argumento que apuntan a elementos máximos. Lo único que importa es que, sin argumentos para este programa, Jelly asigna 0errores a la cadena y Jelly cuando Mse aplica 0.

Para evitar Mactuar 0en el programa completo, utilizamos el ¡rápido, que se aplica Mvarias veces según el resultado del enlace que lo precede inmediatamente. En este caso ese enlace es <239 character long string> L»«’Ɗạ‘}237$¤.

Ltoma la longitud de esta cadena (239) y la »«’Ɗdisminuye a 238. La »«parte no hace nada pero Ɗ(los últimos tres enlaces como mónada) hace que si se eliminan se produzca un error. Luego toma la diferencia absoluta entre el resultado de »«’Ɗy la mónada ‘}237$aplicada a la cadena. aumenta y es una mónada, pero la }convierte en una díada y la aplica a su argumento correcto 237, cediendo 238. Así rinde 0en el programa completo.

¤se vincula de nuevo a la cadena literal que forma un nilad. El resultado de esto es 0, por Mlo que no se aplica en absoluto, evitando cualquier error.

Posibles subprogramas:

  • Si se elimina alguna parte de la cadena, <string>..¤será distinta de cero y Mse aplicará 0, causando un error.
  • Si L»«’Ɗạ‘}237$se elimina cualquier parte de M, se aplicará 0o habrá operaciones entre la cadena y un número, lo que dará como resultado a TypeError.
  • Si alguno de ¤¡se elimina, Mse aplica a 0.
  • Si el carácter de cierre de cadena y ambos ’‘se eliminan y no lo hacen, todo después se Mconvierte en una cadena, por Mlo que actuará 0.
    • Si la cadena cierra el carácter y se elimina y no lo hace, todo entre y se convierte en una lista de enteros.
  • Si Msolo se elimina, hay un EOFErrorporque ¡espera un enlace antes del nilad anterior.
  • Si M“y cualquier número de caracteres después de que se elimina, habrá un EOFErrorporque ¤busca un nilod que lo precede pero no encuentra uno. 238no cuenta porque es parte de una mónada.

Esto prácticamente cubre todo.

Anteriormente no lo había usado «»‘porque los dos últimos no se pueden incluir en la cadena porque coinciden con el carácter para formar otras cosas que no sean cadenas. «tampoco puede estar en una “”cadena pero no sé por qué.


31

Haskell , 39 45 50 52 60 bytes

main=do{(\𤶸	陸 ⵙߜ 新->pure fst)LT
EQ[]3
2$1}

El identificador maindebe tener tipo IO apara algún tipo a. Cuando se ejecuta el programa, se realiza el cálculo mainy se descarta su resultado. En este caso su tipo es IO ((a,b)->a).

El resultado es una aplicación de la función (λ a b c d e f → return fst), una función constante de seis argumentos que devuelve la función fst (que da el primer elemento de una tupla de 2), inyectada en la mónada IO. Los argumentos son seis LT(enumeración por menos), EQ(enumeración por la igualdad), lista vacía [], 3, 2y 1.

Lo que serían espacios se reemplazan con caracteres únicos que cuentan como espacios: una pestaña, un espacio sin interrupción, un avance de página, pestaña vertical, MARCA DE ESPACIO OGHAM, espacio regular, nueva línea y retorno de carro. Si falta alguno de estos, habrá una falta de coincidencia en el número de argumentos. Los nombres de los parámetros se eligen como caracteres UTF-8 de tres o cuatro bytes 𤶸陸ⵙ商ߜ新, eligiendo cuidadosamente los caracteres que no generan bytes duplicados.

Gracias a @BMO por sus valiosas contribuciones.

Volcado hexadecimal:

00000000: 6d61 696e 3d64 6f7b 285c f0a4 b6b8 09ef  main=do{(\......
00000010: a793 c2a0 e2b5 990c e595 860b df9c e19a  ................
00000020: 80e6 96b0 2d3e 7075 7265 2066 7374 294c  ....->pure fst)L
00000030: 540a 4551 5b5d 330d 3224 317d            T.EQ[]3.2$1}

Pruébalo en línea!


Hm, '\109999'parece ser válido, al menos en GHC 8.2.2. '\10999a'produce un error léxico
chepner

@chepner: acabo de probar con GHC 8.2.2 y también 𚶯produce un error léxico.
ბიმო

2
@chepner: el mayor Char es maxBound :: Char, es decir '\1114111'. Nota: los números son decimales de forma predeterminada, por lo que si desea hexadecimal, debe poner un xdespués de \ , por ejemplo '\x10999a'.
nimi

@nimi Aaa y creo que hemos establecido la frecuencia con la que realmente uso los escapes Unicode :) Usar la forma correcta para los valores hexadecimales, \x10fffffunciona bien y \x110000proporciona un error fuera de rango como era de esperar.
chepner

25

Python 2 ,  20 21 33 39 45  50 bytes

¡Ahora un gran esfuerzo de colaboración!

+2 gracias a Aidan F. Pierce (reemplazar sorted({0})con map(long,{0}))

+8 gracias a dylnan (uso de \y nueva línea para reemplazar el espacio; sugerencias para pasar de 0una expresión matemática; reemplazo -1con -True; uso de hexadecimal)

+11 gracias a Angs ( 4*23+~91-> ~4836+9*1075/2luego más tarde ~197836254+0xbCABdDF-> ~875+0xDEAdFBCbc%1439/2*6)


if\
map(long,{~875+0xDEAdFBCbc%1439/2*6})[-True]:q

Pruébalo en línea! O vea la suite de confirmación

0xDEAdFBCbces hexadecimal y se evalúa como 59775106236.
~es un complemento en cuanto a bits, por lo que se ~875evalúa como -876.
%es el operador de módulo por lo que se 0xDEAdFBCbc%1439evalúa 293.
/es la división entera por lo que se 0xDEAdFBCbc%1439/2evalúa como 146.
*es la multiplicación por lo que se xDEAdFBCbc%1439/2*6evalúa como 876.
+Esta suma se ~875+xDEAdFBCbc%1439/2*6evalúa a 0.
... ninguna versión eliminada también se evalúa 0.

{0}es una setque contiene un solo elemento, 0.

Llamar sortedcon a setcomo argumento genera una lista, que puede indexarse ​​con [...].

Sin sortedel código ({0})solo se obtendría el sety esto no se puede indexar de la misma manera, if({0})[-True]:qelevaría a TypeError.

La indexación en Python está basada en 0 y permite una indexación negativa desde la parte posterior y Truees equivalente a 1, por lo tanto, sorted({0})[-True]encuentra el elemento 0, mientras sorted({0})[True]que elevará una sintaxis IndexError, como lo hará sorted({})[-True]y sorted({0})[]no es válida.

Lo 0que se encuentra es falsey, por lo que el cuerpo de if, qnunca se ejecuta, sin embargo, si lo hiciera, generaría un NameErrordado que qno se ha definido.

Como una lista no vacía es verdadera, tampoco podemos recortarla if[-1]:q.

Vea el conjunto de confirmación para ver: confirmación de que los bytes son únicos; todos los errores y el éxito del código en sí.


17

C (tcc) , x86_64, 29 31 33 39 40 bytes

main[]={(23*8),-~0xABEDFCfebdc%95674+1};

Devuelve 0 . Gracias a @feersum por sugerir dígitos hexadecimales en mayúsculas.

Pruébalo en línea!

Cómo funciona

La asignación escribe dos entradas ( 184 y 49664 ) en la ubicación de memoria de main . Con entradas de 32 bits y orden de bytes little-endian, los bytes exactos son b8 00 00 00 00 c2 00 00.

Dado que tcc no declara la matriz definida como .data (la mayoría de los compiladores lo haría), entonces saltar a main ejecuta el código de máquina al que apunta.

  • b8 00 00 00 00( mov eax, imm32) almacena el int 0 en el registro eax.

  • c2 00 00( ret imm16) saca 0 bytes adicionales de la pila y los devuelve. (El valor en el registro eax es el valor de retorno de la función).


El enlace TIO muestra un error de segmentación para mí.
pppery

15

> <> , 122 bytes

e"~l=?!z6-d0p}xwutsrqonmkjihgfcba`_]\[>ZYXWVUTSRQPONMLKJIHGFEDCB@<:98754321/,+*)('&%$# .	|{Ay

Pruébalo en línea!

No hace nada. Basado en el mismo formato que mi respuesta Programming a Pristine World .

Primero, verificamos que la longitud del código es 122 y error si no lo es. ><>los programas no pueden finalizar sin el uso del ;comando, pero si este comando está en el programa, podemos eliminar todo antes de que finalice el programa de inmediato. Para combatir esto, usamos el pcomando para colocar un ;código en el código durante el tiempo de ejecución. Para hacer esto, restamos 6 Ay lo colocamos después de p.

Probablemente agregaré la mayoría de los otros valores por encima de 127 una vez que descubra los valores de dos bytes correctos. Los 5 valores que faltan son v^;y las dos nuevas líneas.

De los 7502 subprogramas, 7417 tuvieron errores debido a instrucciones no válidas, 72 por falta de memoria y 13 por quedarse sin memoria.


13

JavaScript, 42 bytes

if([0XacdCADE*Proxy.length]!=362517948)田
  • Eliminar i, fo ifcausará SyntaxError: missing ; before statement;
  • La eliminación causará SyntaxError: expected expression, got end of script;
  • Eliminar 1 o 2 bytes de causará Invalid or unexpected token;
  • Modificar la expresión booleana provocará un error de sintaxis o un error de referencia en

00000000: 6966 285b 3058 6163 6443 4144 452a 5072  if([0XacdCADE*Pr
00000010: 6f78 792e 6c65 6e67 7468 5d21 3d33 3632  oxy.length]!=362
00000020: 3531 3739 3438 29e7 94b0                 517948)...


9

Brain-Flak , 2 bytes

<>

Pruébalo en línea!

Alternativamente [], {}o (). La eliminación de cualquier soporte hace que el otro soporte no coincida.

Prueba de que esta es la solución óptima:

Un programa Brain-Flak está hecho de nilas (un par de paréntesis por sí mismas) o mónadas (un par de paréntesis que contienen 1 o más nilas). Una mónada no puede estar en un programa prístino, ya que simplemente puede eliminar una o más de las nilas. Del mismo modo, no puede tener más de un nilad en el programa, ya que puede eliminar uno de ellos sin interrumpir el programa.

Como tal, este podría ser el lenguaje menos óptimo para una programación prístina o única.


6

Ada, 110 bytes (latin1)

¿Probablemente la mejor respuesta que obtendrá de cualquier idioma en uso en la industria?

Hexdump:

0000000: 7061 636b 4167 4520 6266 686a 6c6d 6f71  packAgE bfhjlmoq
0000010: 7274 7576 7778 797a e0e1 e2e3 e4e5 e6e7  rtuvwxyz........
0000020: e8e9 eaeb eced eeef f0f1 f2f3 f4f5 f6f8  ................
0000030: f9fa fbfc fdfe 0d69 730b 656e 6409 4246  .......is.end.BF
0000040: 484a 4c4d 4f51 5254 5556 5758 595a c0c1  HJLMOQRTUVWXYZ..
0000050: c2c3 c4c5 c6c7 c8c9 cacb cccd cecf d0d1  ................
0000060: d2d3 d4d5 d6d8 d9da dbdc ddde 3b0a       ............;.

Compile guardando en cualquier archivo que termine .adsy se ejecute gcc -c <filename>. Produce un ejecutable que no hace nada. (No se puede proporcionar el enlace TIO porque TIO coloca el código en un .adbarchivo y, gccde forma predeterminada, intenta encontrar una especificación que coincida con ellos)

Básicamente declara un paquete con un nombre abusando de mayúsculas / minúsculas latin1. Necesita un carácter de espacio en blanco diferente para cada uno de los espacios, por lo que utiliza espacio, CR, LF y TAB.

Cómo se ve en la versión vim:

packAgE bfhjlmoqrtuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ^Mis^Kend^IBFHJLMOQRTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ;

Cómo funciona

En Ada, incluso las especificaciones se pueden compilar. Las especificaciones son como los archivos de encabezado de c, pero tienen más funciones y pueden compilar un código básico. Para que sea válida, cualquier especificación debe tener el formato: package <NAME> is ... end <NAME>;con <NAME>coincidencia. Lo bueno de Ada es que no distingue entre mayúsculas y minúsculas. Por lo tanto, siempre que su nombre tenga variantes en mayúsculas y minúsculas, ¡estará listo!

La parte difícil fue obtener una unidad compilable. Normalmente, los programas Ada tienen un procedimiento o función 'principal' que se encuentra fuera de cualquier paquete que se convertirá en el ejecutable final. Desafortunadamente, los procedimientos requieren la beginpalabra clave, lo que conduce a demasiados es (solo se conocen 2 casos), mientras que las funciones requieren la returnpalabra clave, lo que conduce a demasiados ns. Por lo tanto, tuve que compilar un paquete.


5

C, 8 bytes

main(){}

No hace nada.

Pruébalo en línea!


1
Tal vez no entiendo el desafío, pero ¿qué pasa?main(){short x;}
Jerry Jeremiah

@JerryJeremiah: no, main(){short;}compila solo con a warning: useless type name in empty declaration. Creo que C99 y C ++ requieren un tipo de retorno explícito, por lo que int main(o tal vez unsigned main) podría funcionar, pero no con gcc, que solo advierte incluso con -std=c11.
Peter Cordes

@JerryJeremiah: a return 0;podría ser posible con C89, donde no hay implícito return 0al final de main. Salir con un estado distinto de cero puede considerarse un fracaso, según otras respuestas. ¿Agregar banderas de compilación como -Werrorcuenta para la puntuación de una buena manera en el bowling de código? Porque hacer cumplir estrictamente las violaciones de C11 podría permitir un programa mucho más largo. Hmm, #include<>algo y luego úsalo; no puede eliminar tanto la inclusión como el uso, y si falla sin un prototipo o macro def, ganará.
Peter Cordes

@PeterCordes pensé en eso, sino mainy includeambos contienen i, por lo que no puede tener ambas cosas. Del mismo modo para declarar y usar una función. También uso returnen absoluto, ahora que lo pienso.
Chris

¡Vaya! Olvidé el requisito de bytes únicos; Por supuesto int mainque no puede funcionar.
Peter Cordes

4

JavaScript, 22 bytes

with(0xF?JSON:[])parse

Pruébalo en línea!

Posibles errores

Cuando se modifica, arrojará uno de los siguientes errores 1 :

[some_identifier] is not defined
expected expression, got ')'
expected expression, got ':'
expected expression, got '?'
expected expression, got ']'
expected expression, got end of script
identifier starts immediately after numeric literal
missing ( before with-statement object
missing ) after with-statement object
missing : in conditional expression
missing ] after element list
missing exponent
missing hexadecimal digits after '0x'
missing octal digits after '0o'
unexpected token: ')'
unexpected token: ']'
unexpected token: identifier

1. El número exacto de errores distintos depende del motor. Esta lista fue generada con SpiderMonkey (Firefox).


4

Python 3 + Flask-Env , 7 13 14 17 bytes

import\
flask_env

No TIO porque no tiene flask-env.

Encontró el nombre de módulo más largo que no tiene intersección importy no tiene ningún número al final del nombre. _sha256es más largo pero 256por sí solo no da error. Encontré una biblioteca, b3j0f.syncque es un byte más, pero no pude conseguir que se importara correctamente.

  • +1 byte reemplazando un espacio después importcon \<newline>. Sacar uno o ambos causa un error.

Todavía puede haber opciones más largas que flask_env, realmente no hice una búsqueda exhaustiva, pero sí revisé ~ 70,000 módulos. Abierto a sugerencias.


256Se ejecuta sin errores.
Aidan F. Pierce

@ AidanF.Pierce Gracias, arreglado.
dylnan

Probé import *[hawkey]y similares, pero por desgracia no funciona ...
dylnan

1
hawkey no está en la biblioteca estándar, por lo que es "Python con hawkey" (probablemente pueda mejorar con algún otro módulo en alguna parte)
Jonathan Allan

@JonathanAllan Buen punto. Tengo que ir ahora pero buscaré más tarde
dylnan

3

R , 14 bytes

(Sys.readlink)

Pruébalo en línea!

Esto podría ser lo más largo posible en R. Llamar a cualquier función está condenada al fracaso, porque podría eliminar todo menos el nombre de la función, lo que simplemente daría como resultado la impresión del código fuente de la función. Este es el objeto con nombre más largo en la configuración predeterminada de R sin caracteres duplicados y sin nombre de objeto sobrante al eliminar caracteres contiguos.

¡Este primer intento no funcionó, pero aprendí mucho al intentarlo!

dontCheck({family;NROW})


2

Perl 5, 3 bytes

y=>

=>es la "coma gruesa", que cita la palabra a la izquierda. Entonces esto es equivalente a

"y",

que no hace nada

Sin la coma gruesa, yes el operador de transliteración, que no es válido sin tres del mismo carácter repetido más tarde.

La coma gruesa sola también es inválida, como está =y >sola.




1

ML estándar , 22 bytes

val 1089=op-(765,~324)

Pruébalo en línea! op-(a,b)es la forma de-azucarada de a-b. ~denota el menos unario, por lo que en realidad estamos computando 765+324. Esta expresión coincide con el patrón en la constante 1089. Esta coincidencia tiene éxito si el programa no ha sido alterado y no hace, bueno, nada.

Si la coincidencia no tiene éxito porque se eliminaron algunos dígitos, se obtiene un unhandled exception: Bind. La eliminación de op-resultados en un error de tipo porque una tupla coincide con un int. Todas las demás eliminaciones deberían dar como resultado un error de sintaxis.


1

Swift 4 , 19 bytes

[].contains{1 !=
0}

Pruébalo en línea!

Todos los posibles errores que he encontrado son:

  • La eliminación de cualquiera de [, ], {o }dará lugar a un error de sintaxis
  • Eliminarlo [].resultará enUse of unresolved identifier 'contains'
  • Eliminarlo .resultará enConsecutive statements on a line must be separated by ';'
  • Eliminarlo []resultará enReference to member 'contains' cannot be resolved without a contextual type
  • Eliminarlo {1 !=␊0}resultará enExpression resolves to an unused function
  • Eliminarlo 1 !=␊0resultará enMissing return in a closure expected to return 'Bool'
    • Eliminar la nueva línea dará como resultado '!=' is not a prefix unary operator
    • Eliminar el espacio dará como resultado '=' must have consistent whitespace on both sides
    • Eliminarlo !=resultará enMissing return in a closure expected to return 'Bool'
      • También eliminar la nueva línea dará como resultado Consecutive statements on a line must be separated by ';'
      • Eliminar el espacio y la nueva línea (y cero o uno de los dígitos) dará como resultado Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
  • Eliminarlo [].containsresultará enClosure expression is unused

Algunos otros programas interesantes son (uno en cada línea):

[].isEmpty
[:].values
[1:2]

Este contiene dos as
Caird coinheringaahing



0

Retina , 2 bytes

No me sorprendería si esto es óptimo ...

()

Pruébalo en línea!

La expresión regular contiene un grupo vacío. Eliminar cualquiera de los pares causará un error de análisis debido a paréntesis inigualables.

Otras soluciones son: \(, \), \[, \], \*, \+, \?,a]


a]no error
jimmy23013

@ jimmy23013 Ah, no sé cómo me perdí eso. Retrotraído.
mbomb007

-2

C (gcc) , 73 75 bytes

#include <ftw.h>
ABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890(){g FTW_D-1;}

Pruébalo en línea!

Basado en la respuesta de @Steadybox, gracias a @Angs por detectar errores graves.

Sí, es un truco sucio (porque de hecho usa un #definecon -DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=mainy -Dg=return), pero no veo ninguna regla que prohíba dicha opción de compilación.


La primera línea se puede quitar para que el programa no sea impecable
Angs

@Angs Gracias, arreglado (con el precio de agregar otra opción de compilador)
trolley813

8
De acuerdo con esta meta publicación , su envío ya no está en el lenguaje C, sino en C89 + -DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main+ -Dg=return, por lo que diría que esto usa un lenguaje inventado específicamente diseñado para el desafío , que está prohibido por defecto.
Dennis

Puede eliminar el -1error sin error
Jo King
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.