Convertir una cadena a minúsculas (¡sin funciones integradas a minúsculas!)


25

El objetivo de este código de golf es crear un código que permita al usuario ingresar una cadena ASCII (contiene solo caracteres ASCII imprimibles ), y su programa genera la variante en minúscula de esta cadena.

Importante: ¡NO está permitido usar una función incorporada que convierta la cadena (o solo un carácter) a minúsculas (como ToLower()en .NET, strtolower()en PHP, ...)! Sin embargo, puede usar todas las demás funciones integradas.

Otra nota importante: la cadena de entrada no contiene solo caracteres en mayúscula. La cadena de entrada es una combinación de mayúsculas, minúsculas, números y otros caracteres imprimibles ASCII .

¡Buena suerte!


44
desafortunadamente, tendré que darme de baja. No soy un principiante
John Dvorak

@ Jan: Bueno, con principiante en realidad quería decir que el nivel de habilidad de esto sería 'principiante', no que solo los principiantes podrían ingresar. Eliminé la palabra 'principiante' y seguramente, puedes ingresar.
ProgramFOX

1
¿Se permiten expresiones regulares? Solo GolfScript podría vencer s/./\L\0/g.
manatwork

3
@manatwork: seguramente \Lestá integrado?
Marinus

@manatwork: Sí, se permite una expresión regular.
ProgramFOX

Respuestas:


21

Shell - 10

Traducción de la solución Perl de @Gowtham usando /bin/tr.

tr A-Z a-z

Ejecución de muestra:

% tr A-Z a-z <<<'Hello WORLD! @'
hello world! @

¿Qué hace que esta sea la respuesta aceptada, por curiosidad? Gowtham tenía una solución de 10 caracteres primero ...
Ry-

1
Basado en la discusión sobre meta , parece que el razonamiento es que la solución de Gowtham es de 11 caracteres (porque la -pbandera cuenta como una). Sin embargo, estoy de acuerdo, parece que merece más ser aceptado ...
FireFly

Ah, gracias, eso tiene sentido. ¡Lo tendré en cuenta!
Ry-

53

Python 2.7 - 30 (con abuso de reglas terrible y sin complejos)

raw_input().upper().swapcase()

Como señaló una edición anónima, puedes hacerlo en 2726 en Python 3 :

input().upper().swapcase()

Estoy abusando flagrantemente de las reglas aquí, pero ...

Importante: ¡NO está permitido usar una función incorporada que convierta la cadena (o solo un carácter) a minúsculas (como ToLower()en .NET, strtolower()en PHP, ...)! Sin embargo, puede usar todas las demás funciones integradas.

Esto toma las cuerdas y las convierte en mayúsculas . Luego, en una llamada a un método muy poco relacionado, invierte las mayúsculas y minúsculas de la cadena, de modo que cualquier letra minúscula se convierta en mayúscula ... y cambie las letras mayúsculas por minúsculas .


1
La solución Python 3 tiene 26 caracteres.
Timtech

@Timtech no puedo contar.

1
No solo no está relacionado. Es muy poco relacionado.
Carter Pape

1
Esto tendrá resultados extraños cuando encuentre texto que contenga los caracteres ß.
FUZxxl

33

Perl - 11 10 caracteres.

y/A-Z/a-z/

y///es igual que tr///!

En acción:

% perl -pe 'y/A-Z/a-z/' <<< 'Hello @ WORLD !'
hello @ world !

3
+1, para el único lenguaje de la vida real que supera a los menos reales (?)
Behrooz el

En realidad son 11 caracteres. La -popción se cuenta como 1.
manatwork

@manatwork O debería contarse como 2: -y p:)
Gowtham

1 si asume -e( perl -e-> perl -pe), 3 si asume un script ( perl-> perl -p).
nyuszika7h

10

Befunge-98-26 22 21 19

~:''-d2*/1-!' *+,#@

Se basa en el hecho de que (c-39)/26es 1solo para códigos de caracteres de caracteres ASCII en mayúsculas (suponiendo la división de enteros). Para cada personaje c, imprimir c + (((c-39)/26)==1)*' '.

Sesión de muestra:

% cfunge lower.b98
hello WORLD!
hello world!
This is a TEST!!11 az AZ @[`{
this is a test!!11 az az @[`{

9

Pitón 3, 58

print("".join(chr(ord(x)+('@'<x<'[')*32)for x in input()))

¿Puedes explicar cómo funciona esto? Estoy realmente interesado en mejorar en Python. No entiendo cómo funciona el map(ord,input())bit.
asteri

1
@JeffGohlke: mapaplica una función (en este caso ord) a un interable y devuelve un iterable. Es como una forma más corta de (ord(x) for x in input()).
Ry-

Lo tengo. ¡Gracias por la explicación!
asteri

1
Su respuesta sigue el espíritu de la pregunta, pero la mía sigue la letra de la pregunta ...

Muy agradable. Batir mi solución no publicada de 62 longitudes for c in input():print([c,(chr(ord(c)+32))]['@'<c<'['],end=''). Intenté algunos con el map(ord,input())truco, pero no pude multiplicar el valor de verdad por 32 y agregarlo al truco del código de personaje. Muy agradable.
Steven Rumbalski

8

Ruby, 18 caracteres

Nada realmente interesante

gets.tr'A-Z','a-z'

(ejecutar en IRB)

Solo por diversión: una versión confusa:

$,=$* *' ';$;=$,.tr'A-Z','a-z';$><<$;

Corre así:

c:\a\ruby>lowercase.rb Llamas are AMAZING!

Salida

llamas are amazing!

7

J - 30

'@Z'(]+32*1=I.)&.(a.&i.)1!:1]1

J se lee de derecha a izquierda, así que para desglosar esto:

  1. Solicitar al usuario la entrada: 1!:1]1
  2. Realizar algoritmo en código-punto-espacio: &.(a.&i.)
  3. Identificar el rango de caracteres para cada letra; los caracteres entre los puntos de código "@" y "Z" son considerados mayúsculas: 1=I..
  4. Para cada punto de código en mayúscula, agregue 32: ]+32* ...
  5. Tenga en cuenta que el paso (2) crea un paso implícito (5): comenzamos proyectando desde el carácter al dominio de enteros, por lo que ahora que hemos terminado, asignamos esos enteros de nuevo a los caracteres.

Obviamente, esta implementación particular solo considera ASCII; pero el enfoque podría extenderse al menos al plano multilingüe básico en Unicode.


1
¡Agradable! Desafortunadamente, parece que su solución va por el CAMINO INCORRECTO. ;-) Sin embargo, debería ser una solución fácil. (Editar: '@Z'(]+32*1=I.)&.(a.&i.)1!:1]1debería hacerlo)
FireFly

Buena captura, gracias. También estoy impresionado de que hayas podido arreglar el código tú mismo: J no es el lenguaje más accesible de inmediato :)
Dan Bron

Ah, he jugado algunos con J yo mismo. Me las arreglé para inventarlo u:(a.i.x)+32*1='@Z'I.x=.1!:1]1, que coincide con tu longitud pero es mucho menos interesante (ya que no usa 'under'). Hablando de eso, no sabía sobre dyadic I., así que gracias por usar eso. :-)
FireFly

Guay. Pero su solución Befunge todavía tiene J beat por 4 caracteres. Obviamente, no puedo dejar que eso permanezca :) Estoy tratando de ver si recortar la solución J siguiendo su ejemplo confiando únicamente en '@', en lugar de tanto '@' como 'Z'.
Dan Bron

(32(23)b.])&.(3&u:), debe ser 5 bytes más corto.
FrownyFrog

7

C 64 63 59 55 caracteres

main(c){while(c=getchar(),~c)putchar(c-65u<27?c+32:c);}

Cuento solo 63 caracteres allí.
manatwork

Puedes perder 9 caracteres: soltar int y ,c>=0. No son necesarios aquí.
JoeFish

necesitamos c> = 0 ya que getchar (EOF) será <0. Gracias por otra sugerencia.
Rozuur

2
1. ~(c=getchar())2.c-64u<27
ugoren

1
Error insignificantemente pequeño: parece que debería haber 65 en lugar de 64. pastebin.com/Zc9zMx2W
manatwork

5

Golfscript - 17

Programa:

{..64>\91<*32*+}%

Explicación:

  1. {}% asigna el código dentro de cada carácter en cadena.
  2. .. copia la parte superior de la pila (el personaje) dos veces.
  3. 64> 1 si el código de caracteres es mayor que 64, de lo contrario 0.
  4. \intercambia los dos elementos en la pila (obtiene la segunda copia de la carta y almacena el resultado 64>en la posición dos).
  5. 91< comprueba si el código de caracteres es menor que 91. Similar al paso 3.
  6. *multiplica los resultados de los pasos 3 y 5 juntos. Solo igual a 1, si ambos pasos eran verdaderos.
  7. 32* multiplica el resultado del paso 6 por 32. Será 32 si el paso 6 fue 1, de lo contrario 0.
  8. + agregue el resultado (ya sea 32 o 0) en el código de caracteres.

Salida de ejemplo:

echo HelLO @ WorLD | ruby golfscript.rb upper_to_lower.gs
hello @ world

4

Perl: 24 caracteres

s/[A-Z]/chr 32+ord$&/ge

Ejecución de muestra:

bash-4.1$ perl -pe 's/[A-Z]/chr 32+ord$&/ge' <<< 'Hello @ WORLD !'
hello @ world !

Hem, ¿por qué chr ord? Estoy bastante seguro de que no aprenderá nada al leer mi respuesta ;-)
F. Hauri

Truco increíble, @ F.Hauri!
manatwork

@ nyuszika7h, el +1 es el -pparámetro de línea de comando, no una nueva línea.
manatwork

Oh cierto, lo siento.
nyuszika7h

3

Pitón (33)

En caso de duda, use el caparazón.

import os;os.system('tr A-Z a-z')

Lamentablemente, esto es aún más largo que la solución de Lego.


+1 Eso no es un Python incorporado que está utilizando. ¡Solo funciona en Linux, pero sigue siendo muy flexible!

@LegoStormtroopr funciona en todas partes, hay un trcomando (que hace lo correcto) en la ruta del shell invocado, supongo.
Paŭlo Ebermann

3

DELPHI

const
  UpChars:set of AnsiChar = ['A'..'Z'];
var
  I: Integer;
begin
  SetLength(Result, Length(pString));
  for I := 1 to length(pstring) do
    Result[i] := AnsiChar((Integer(pString[i] in UpChars))*(Ord(pString[i])+32));
  WriteLn(Result);
end;

3
Esto no es golf. ¿No sientes que esta pieza es muy diferente en comparación con otras?
Ray

1
@ray Golfing se trata de hacer que su código sea lo más corto posible. Delphi no es un gran idioma para el golf. Yo uso Delphi y aunque no hay una gran posibilidad de que pueda ganar un golf con Delphi, sigue siendo divertido desafiarte a ti mismo.
Teun Pronk

3

JavaScript - 109 104 (ES6: 95)

Gracias a algunos por la versión corregida.

a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&c<91)*32);alert(b.join(""))

Lo siguiente funciona si el navegador admite expresiones de función ES6:

alert(prompt().split("").map(c=>String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)).join(""))

El primer código no funciona (probado en FF y Chrome) porque cuando intentas obtener un carácter después de la longitud de la cadena, obtienes undefinedy luego c.charCodeAt()falla porque indefinido no tiene charCodeAt. Un ejemplo de trabajo 105 caracteres:a=prompt();for(b=[i=0];c=a.charCodeAt(i);)b[i++]=String.fromCharCode(c|(c>64&&c‌​<91)*32);alert(b.join(''))
algunos

@ algunos, me pregunto cómo se me ocurrió ese fragmento ... Estoy bastante seguro de que probé ese código, tal vez copié una versión que no funciona o algo así. De todos modos, gracias por la corrección.
FireFly

Usar un bit a bit en andlugar de uno lógico ... ¡bien!
Algunos

Una aún más ES6 solución ( 79 ): L=s=>[String.fromCharCode(c.charCodeAt()|(c>"@"&c<"[")*32)for(c of s)].join(''). Uso:L('SoMeTeXt')
Florent

¡Agradable! Sin embargo, no estoy seguro de que sea una mera función, ya que todas las demás soluciones son programas "adecuados". Aún así, muy buen uso de for..ofindependientemente.
FireFly

3

Perl 18

s/[A-Z]/$&|" "/eg

Algo como:

perl -pe 's/[A-Z]/$&|" "/eg'  <<<'are NOT allowed to: ToLower() in .NET, strtolower() in PHP'
are not allowed to: tolower() in .net, strtolower() in php

y

perl -pe 's/[A-Z]/$&|" "/eg' <<< "The input string Doesn't cOntaIn...( C0D3-@01F. ;-)"
the input string doesn't contain...( c0d3-@01f. ;-)

Para @FireFly :

perl -pe 's/[A-Z]/$&|" "/eg' <<< "Doesn't this translate @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

no.

Más genérico: 18 caracteres de todos modos:

s/[A-Z]/$&|" "/eg

s/[A-Z]/$&^" "/eg

Esto no cambiará nada en el estado:

perl -pe 's/[A-Z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
doesn't ... @ to ` and [\]^_ to {|}~del? 

Todo funciona bien, pero la ventaja de cambiar |(o) por ^(xor) es que la misma sintaxis podría usarse para toLower, toUppero swapCase:

superior:

perl -pe 's/[a-z]/$&^" "/eg' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
DOESN'T ... @ TO ` AND [\]^_ TO {|}~DEL? 

y swapCase (18 + 1 = 19 caracteres) :

perl -pe 's/[a-z]/$&^" "/egi' <<< "Doesn't ... @ to \` and [\]^_ to {|}~DEL? "
dOESN'T ... @ TO ` AND [\]^_ TO {|}~del? 

Olvidé +1 por lo -psiento @manatwork
F. Hauri

¿No se traduce esto @en backtick y [\]^_to {|}~DEL? Y ahí está la parte difícil ...
FireFly

1
@FireFly No, $&tiene que coincidir [A-Z].
F. Hauri

Oh mi error. Muy bien, entonces!
FireFly

3

javascript 80

"X".replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)})

(76 si quitas "X")

con prompty alert- 92

alert(prompt().replace(/[A-Z]/g,function($){return String.fromCharCode($.charCodeAt()+32)}))

violín

gracias a @FireFly @some @ C5H8NNaO4 y @minitech


Er, tendrías que terminar el segundo argumento replacecon function($){return ...}, ¿no? Por cierto, el primer parámetro de la función de reemplazo es la cadena coincidente, por lo que puede colocar los parens en la expresión regular.
FireFly

¿Cómo haría para ejecutarlo, así?
C5H8NNaO4

@ C5H8NNaO4 str (código aquí)
Math chiller

66
Creo que todas (o al menos la mayoría) de las respuestas aquí leídas de stdin e impresas en stdout. Por lo que deduzco, la convención es usar prompty alertpara E / S en JS.
FireFly

1
Necesita una /gbandera para que esto funcione correctamente.
Ry-

2

R

71 caracteres:

chartr(paste(LETTERS,collapse=""),paste(letters,collapse=""),scan(,""))

83 caracteres:

a=as.integer(charToRaw(scan(,"")))
b=a%in%(65:90)
a[b]=a[b]+32
rawToChar(as.raw(a))

Esos son 86caracteres: las líneas nuevas cuentan como 2 caracteres. ( string-functions.com/length.aspx )
Timtech

@Timtech: en R puedes reemplazar las nuevas líneas en el código por ;lo que no cuentan solo para un personaje. Podría escribirse:a=as.integer(charToRaw(scan(,"")));b=a%in%(65:90);a[b]=a[b]+32;rawToChar(as.raw(a))
plannapus

Sí, ahora me di cuenta. Leí sobre meta ... parece que solo en Windows las nuevas líneas son de 2 caracteres (estaba usando un programa para medir la longitud de mi código).
Timtech



2

PHP (42)

Ejecutar desde la línea de comando:

-R'echo@str_ireplace($a=range(a,z),$a,$argn);'

-R y las comillas simples no se cuentan.


Si sigues la solución Peal de Gowtham, solo contarías 42 caracteres.
Eisberg

1
@eisberg: se actualizó el puntaje, dejando una versión de 43 caracteres en el historial en caso de cualquier disputa.
favor

str_ireplacehace una búsqueda que no distingue entre mayúsculas y minúsculas, que es estirar las reglas, si no las rompe.
ugoren

@ugoren No lo creo. Como se afirma claramente que solo la función integrada en el cambio de mayúsculas y minúsculas no está permitida y esto es ignorar el caso y no cambiarlo.
Eisberg

2

PowerShell: 69 65 64

He intentado media docena de formas para hacer que Reemplazar funcione de la manera que quiero sin usar la [regex]::Replacesintaxis larga , pero no he tenido suerte. Si alguien más tiene una idea de lo que podría funcionar, sugiéralo.

Código de golf:

[regex]::Replace((read-host),"[A-Z]",{[char](32+[char]"$args")})

Cambios del original:

  • Se reorganizó el último argumento para que [int]ya no sea necesario, por sugerencia en los comentarios.

Explicación:

(read-host) obtiene la entrada del usuario.

[regex]::Replace(... )le dice a PowerShell que use la coincidencia RegEx para realizar operaciones de reemplazo en una cadena.

"[A-Z]" coincide con todas las letras mayúsculas.

{... }le dice a PowerShell que use un script para determinar el valor de reemplazo.

[char]"$args" toma la coincidencia actual y la escribe como un carácter ASCII.

32+ convierte el carácter en un entero, que representa el código ASCII, y aumenta el valor en 32, lo que coincidiría con el código ASCII de la letra minúscula correspondiente.

[char](... )toma el valor resultante y lo convierte de nuevo a un carácter ASCII.

Demo del original:

ingrese la descripción de la imagen aquí

(Versión actual probada: la captura de pantalla aún no se ha publicado).


1
No he comprobado cómo [regex]::Replace[int]+
solucionarlo

1
En realidad, todo el último argumento se puede reorganizar {[char](32+[char]"$args")}, lo que elimina la necesidad de lanzar explícitamente a int y afeita a un personaje más
goric el

@goric Geez, ¿por qué no pensé en eso ya? Todavía estoy aprendiendo, supongo.
Iszi

2

k2, 15 bytes

Llegué muy tarde a este, pero me pareció genial de todos modos.

{_ci 32+_ic x}'

También:

Pyth, 10 bytes

Realmente no cuenta porque Pyth fue creado después de que esto fue publicado. Aún genial

jkmC+32Cdw

2

05AB1E , 3 bytes

u.š

Puerto de @ user8777 Python 3 respuesta .

Pruébalo en línea.

Explicación:

u    # Convert the (implicit) input to uppercase
   # Switch the case (upper to lower and vice-versa)
     # (and output the result implicitly)

Pero sin ningún tipo de alteración de mayúsculas y minúsculas:

05AB1E , 12 11 bytes

ÇIS.u32*+çJ

-1 byte gracias a @Emigna .

Pruébalo en línea.

Explicación:

Ç            # Get the unicode values of each character of the (implicit) input-String
 IS          # Get the input-string, split to characters again
   .u        # Check for each if it's uppercase or not (1 if truthy; 0 if falsey)
     32*     # Multiply that result by 32 (32 if truhy; 0 if falsey)
        +    # Add it to all the unicode values at the same indices in the list
         ç   # Convert the now modified unicode values back to characters
          J  # And join all characters together to a string again
             # (which is output implicitly as result)

1
ÇIS.u32*+çJguarda un byte en su versión de 12 bytes.
Emigna

@Emigna Ah, inteligente. Había intentado el .u32*+enfoque de esta manera: εÇy.u32*+ç]Jpero desafortunadamente çenvuelve a los personajes en una lista, por lo que Jse requería un adicional o `después del ç...
Kevin Cruijssen

1

Javascript, 105

prompt().split("").map(function(a){c=a.charCodeAt(0);return String.fromCharCode(c|(c-64?32:0))}).join("")

En realidad, no se especificó ningún formulario de salida, así que ejecútelo en la consola Sí, JavaScript realmente es detallado con charcode <-> string


1
c.charCodeAt()- el valor predeterminado es 0si se omite un índice. Además, se rompe en '@', creo (se pone "en minúsculas" en el backtick)
FireFly

@FireFly Nice, Gracias !, ok, lo arreglaré =)
C5H8NNaO4

1

Rubí: 66

def l(s)s.bytes.map{|b|(65..90).include?(b)?b+32:b}.pack('c*');end

1

C # - 108

class P{static void Main(string[]a){foreach(var c in a[0])System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

Alrededor de 70 solo para el cuerpo del método.

Agregue 5 caracteres para incluir un LF / CR en la salida:

class P{static void Main(string[]a){foreach(var c in a[0]+"\n")System.Console.Write(
(char)(c>64&&c<91?c+32:c));}}

Una versión de LINQ sería más corta:

class P{static void Main(string[]a){a[0].Any(c=>System.Console.Write(
(char)(c>64&&c<91?32+c:c))is P);}}

(103) ... excepto que requiere using System.Linq;(total: 121).


1

Haskell - 58

p x|(elem x['A'..'Z'])=[x..]!!32|1<2=x
main=interact$map p

1

Python 3 - 70

Actualizado para los cambios de OP.

Soy un novato en Python, por lo que cualquier crítica es bienvenida.

print("".join(chr(ord(c)+32) if 64<ord(c)<91 else c for c in input()))

Lo siento, tenía que decir que no puedes usar una función para bajar en un personaje. Pregunta actualizada
ProgramFOX

1
Vea mi comentario reciente : su código solo funciona si la cadena de entrada contiene solo caracteres en mayúscula, pero tenga en cuenta que también contiene otros caracteres ASCII, como caracteres en minúscula y números.
ProgramFOX

Bien, se actualizará cuando llegue a casa
asteri

@ProgramFOX Actualizado.
asteri

Jeff, mira la respuesta de @minitechs . Ambos tienen enfoques muy similares, por lo que deberían poder ver cómo y por qué su respuesta es más corta.

1

Perl, 9 + 1 (para el indicador -p) = 10

$_="\L$_"

\L se le preguntó específicamente y se le permitió, porque a pesar de que está integrado, no es una función.


1

Powershell, 53 49 bytes

-4 bytes gracias @AdmBorkBork

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

Script de prueba:

$f = {

-join($args|% t*y|%{[char](32*($_-in65..90)+$_)})

}

@(
    ,("Hello WORLD from PowerShell", "hello world from powershell")
) | % {
    $a,$e = $_
    $r = &$f $a
    "$($r-eq$e): $r"
}

Salida:

True: hello world from powershell

¡guay! ¯\_(ツ)_/¯
mazzy

1

Código de máquina 8086, 14 bytes

Montado:

AC 3C 41 7C 06 3C 5A 7F 02 0C 20 AA E2 F2

Listado sin ensamblar:

 ; Lowercase a string
 ; Input: string: SI, length: CX
 ; Output: string: DI
 TOLOW  MACRO   
        LOCAL _LOOP, _STORE
       _LOOP:
 AC         LODSB           ; load byte from [SI] into AL, advance SI 
 3C 41      CMP  AL, 'A'    ; is char less than 'A'? 
 7C 06      JL   _STORE     ; if so, do not convert 
 3C 5A      CMP  AL, 'Z'    ; is char greater than 'Z'? 
 7F 02      JG   _STORE     ; if so, do not convert 
 0C 20      OR   AL, 020H   ; lowercase the char 
       _STORE:
 AA         STOSB           ; store char to [DI], advance DI 
 E2 F2      LOOP _LOOP      ; continue loop through string 

Implementado como a MACRO(esencialmente una función). Cadena de entrada SI, longitud CX. Cadena de salida en DI.

Salida del programa de prueba PC DOS:

ingrese la descripción de la imagen aquí

Descargue y pruebe el programa de ejemplo TOLOW.COM .


¿De dónde viene el conteo de 14 bytes? el fragmento es más largo que eso, incluso sin comentarios ... ¿es 14 bytes el programa compilado?
Jonás

1
@ Jonás El código de operación de byte está en la columna de la izquierda AC 3C 41, etc. Agregaré el código de byte hexagonal ensamblado en la parte superior para mayor claridad. codegolf.meta.stackexchange.com/a/12340/84624
640KB
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.