Código fuente falso


23

Salida de un carácter aleatorio para cada carácter del código fuente (como se ilustra a continuación). La probabilidad de cada carácter es su frecuencia en el código fuente original. Por lo tanto, la salida será un código fuente falso parecido a una quine.

Especificación

  • Restricciones
    • Se aplican restricciones de estándar . No hay programas o funciones vacías. Además, no leer su propia fuente.
  • Salida
    • El número de caracteres de salida debe ser exactamente el número de caracteres en el código fuente
    • Cada carácter de salida debe elegirse aleatoriamente
    • La probabilidad de elegir cualquier personaje es igual a (occurrences in source) / (length of source)
    • Esto significa que incluso una solución unaria necesita elegir 'al azar' 1con probabilidad 1. Lo que quiere decir que la salida no puede ser codificada.
  • Victorioso
    • Este es el código de golf, por lo que gana menos bytes

Ejemplo

Program           Frequency           Probability           Possible Output
-------           ---------           -----------           ---------------           
 a@!@              a - 1               a - 25%               @@a@
                   ! - 1               ! - 25%
                   @ - 2               @ - 50%
Program           Frequency           Probability           Possible Output
-------           ---------           -----------           ---------------
caBaDBcDaBDB       a - 3               a - 25%               aaaBBBBccDDD
                   B - 4               B - 33%
                   c - 2               c - 17%
                   D - 3               D - 25%

¿Se permiten quines de un solo carácter?
Nathan Merrill

@NathanMerrill Sí, se permiten soluciones de un solo carácter (y otras unarias). Sin embargo, su salida aún debe elegirse al azar.
NonlinearFruit

¿Cómo puedo encontrar las ocurrencias de los caracteres en un archivo si no se me permite leerlo?
Tito


1
@VolAnd No. La probabilidad de que aparezca cada personaje se basa en la frecuencia del personaje. Si lanzas una moneda dos veces y cae una vez en la cara, no tiene que echar mano la segunda vez.
wizzwizz4

Respuestas:


8

CJam , 14 bytes

{{E*`mR}`mR}E*

Pruébalo en línea!

Explicación

Cada personaje aparece exactamente dos veces, por lo que las probabilidades de los personajes deben ser todas iguales.

{           e# Repeat this block 14 times.
  {E*`mR}   e# Push this (nonsensical) block.
  `         e# Stringify it, giving the string "{E*`mR}", which contains each of the
            e# seven characters once.
  mR        e# Select one of the characters at random.
}E*

7

Jalea , 13 bytes

“;⁾vṾWṁ$X€”vṾ

Pruébalo en línea!

Cómo funciona

“;⁾vṾWṁ$X€”vṾ  Main link. No arguments.

“;⁾vṾWṁ$X€”    Set the argument and return value to the string s := ';⁾vṾWṁ$X€'.
            Ṿ  Uneval; construct a string representation of s.
               This yields r := '“;⁾vṾWṁ$X€”'.
           v   Dyadic eval; evaluate s with argument r.


 ;⁾vṾWṁ$X€     Evaluated link (s). Argument: r

  ⁾vṾ          Yield 'vṾ'.
 ;             Concatenate r with 'vṾ'.
               This yields t := '“;⁾vṾWṁ$X€”vṾ', i.e., the original source code.
       $       Combine the previous two links into a monadic chain.
     W           Wrap; yield ['“;⁾vṾWṁ$X€”vṾ'].
      ṁ          Mold; repeat ['“;⁾vṾWṁ$X€”vṾ'] once for each charcter in t.
        X€     Random each; select a character, uniformly at random, of each
               of the 13 repetitions of t.

6

Perl, 59 bytes

$_=q{$_.='$_=q{};eval';@a=/./g;s/./$a[rand@a]/g;print};eval

Utilicé una quine existente como base y la modifiqué para imprimir caracteres aleatorios del contenido de origen.

Uso

Guardar como faux-source-code.ply ejecutar usando:

perl faux-source-code.pl

Produce algo como lo siguiente:

$d='=a{f.gng$d._{{{ag{ed{aa;ae/r$no{a]_q}/$;_}lrq=r_=;_;=$'
vptr.q'ap.vaa@}@{iel];na;f.o/qon/fa}ie;=e{/a}/ag.$vaiqa_gv'
$_..'daq;.;/./.@._ogd;@aapqirv/;nrp=}@$}a/i;vq;.l.l@i}g]qq'
va==/t@dl.fe'}ar.l@n;_tve@=n$;$}$.l'p{a@qv._qag@dgr_$/.$/;v
q{/@d;@a;a_=g_r$r/.qar{=[gnr';@;$qgvad;$===/$//i]}g[tr@@.q}

En una breve prueba, ~ 3% de los resultados del programa con evaléxito. No estoy seguro de lo que dice eso sobre Perl ...


¡Ajá, ese comentario sobre el 3% de éxito eval! ¡Buena esa! ;-)
Dada

@Dada en serio! ¡Las presentaciones en la respuesta realmente funcionan! Estaba bastante impresionado ...
Dom Hastings

Con suerte, por lo que he visto, ¡solo proviene de que la salida es una cadena completa entre comillas (con 'o q//, q{}etc.)!
Dada

@Dada Yeah, o una coincidencia de expresiones regulares. ¡Aunque me hizo reír! :)
Dom Hastings

1
¡Feliz de verte jugando al golf de nuevo por cierto! :)
Dada

4

Japt , 22 bytes

"+Q ²£ZgMqB"+Q ²£ZgMqB

¡Pruébalo en línea!

Cómo funciona

"+Q ²£ZgMqB"+Q ²£ZgMqB  // Implicit: B = 11
"+Q ²£ZgMqB"            // Take this string.
            +Q          // Append a quotation mark.
               ²        // Double the result.
                £       // Replace each char in the result Z with
                 Zg     //  the char in Z at index
                   MqB  //   random integer in the range [0, 11).
                        // Implicit: output last expression

4

Pyth, 16 bytes

smO+N"m1NOs+6"16

Pruébalo en línea!

Contiene cada char dos veces, por lo tanto, la probabilidad es la misma que si cada uno estuviera allí solo una vez.

smO+N"m1NOs+6"16     #
   +N"m1NOs+6"       # Add a quotation mark to the string: "m1NOs+6
  O                  # random choice from the string
 m            16     # do this 16 times.
s                    # join the list into a string

3

PHP, 71 140 110 124 140 120 bytes

for($i=2*$n=strlen($s='for($i=2*$n=strlen($s=.chr(39));$i--;)echo$s[rand(0,$n-1)];'.chr(39));$i--;)echo$s[rand(0,$n-1)];

corre con php -d

  1. crea una cadena que contiene el código sin las comillas
  2. y concatena las comillas una vez usandoord
    (la misma probabilidad que si doblara la cadena y agregue dos comillas);
  3. luego recorre el doble de la longitud de la cadena para obtener caracteres aleatorios de ella.

Posiblemente se pueda jugar más, pero mis intentos de evaluar fueron inútiles hasta ahora.
Probablemente no iré más profundo aquí.


1
The probability of each character is its frequency in the original source code.Puedo estar equivocado, pero no parece que esta entrada cumpla con este requisito.
ETHproductions

Oh, perdí ese punto. De vuelta al editor. ¿Cómo se puede hacer esto sin leer el código?
Tito

Usando esto , obtuve un syntax error, unexpected '<'. Pero no estoy familiarizado con PHP, ¿cómo pruebo esto?
NonlinearFruit

@NonlinearFruit: ¿Usaste la bandera -d? Se supone que esto se guarda en un archivo y luego se llama con phpo php-cgisin marcas. Quizás puedas usar un heredoc.
Titus

@NonlinearFruit: ... o simplemente elimine el líder <?para usar con -d.
Tito

3

Python 2, 88 bytes

s='''from random import*; print "".join(choice(s) for c in "s='"+s+"';exec s")''';exec s

Todo el mérito real para llegar hasta aquí va a mbomb007: gracias por su ayuda (y el puntero sobre las barras invertidas)


1
Este es un desafío tipo quine, sin ingresar o leer su código fuente (supongamos que tiene ncaracteres largos), necesita imprimir ncaracteres aleatorios. Donde la probabilidad de que cse elija un símbolo es igual a (number of times c occurs in your solution) / n.
NonlinearFruit

¿Así más como esto? exec("""s = 'from random import choice; print "".join([choice(s) for c in s])'; exec(s)""")
user59421

Aún no ha incluido las comillas simples, y no necesita los corchetes dentro de join.
mbomb007

Gracias, y claro, me atrapó un poco la prisa de acercarme a la solución
User59421

1
Aquí van: s='''from random import*;print"".join(choice(s)for c in s+"s='';''exec s''")''';exec s. Desearía haber pensado en eso.
mbomb007

3

Ruby, 47 bytes

eval r="47.times{$><<('eval r=%p'%r)[rand 47]}"

Esto se basa en la evalquine estándar :

eval r="$><<'eval r=%p'%r"

Es un byte más largo que el quine más corto, pero generalmente es la mejor opción para los quines generalizados, ya que cualquier cálculo realizado en la cadena de código fuente no necesita duplicarse. Mientras que en el quine habitual, cada cálculo adicional debe ir dentro y fuera de la cadena principal, solo se necesita dentro de la cadena principal para este tipo de quine.

En cuanto a lo que realmente hace el código: después de obtener una cadena que representa todo el código fuente, simplemente seleccionamos un carácter aleatorio (seleccionando un índice aleatorio) 47 veces e imprimimos cada carácter por separado.


3

Wolfram Language / Mathematica, 109 Bytes

Function[Print[StringJoin[RandomChoice[StringSplit[StringJoin[ToString[FullForm[Slot[0]]],"[]"],""],109]]]][]

salida de muestra:

niPi[no,ili[Siu[,Sdoio9nthg"t ginuu[1[o]"i,icgi[0TncrS"[ln"o0]r,i][Jon[[et]0"]m [ri"a[]motrin,iFoFnultnnno,Jl

Oh esos corchetes.


2

Jalea, 44 bytes

Espero haber interpretado todas las reglas correctamente (no estoy muy seguro de qué significa "llevar carga" en meta o si es relevante para este desafío).

“ẋ2;8220Ọ;8221ỌXµ44СḊ”ẋ2;8220Ọ;8221ỌXµ44СḊ

Pruébalo en Pruébelo TryItOnline

Esto construye una cadena para elegir los caracteres. La cadena inicial tiene todos los caracteres utilizados, excepto las comillas de apertura y cierre. Luego dobla esa cadena y concatena una de cada una de las comillas abiertas y cerradas de los ordinales (de ahí la necesidad de duplicar los otros caracteres). Por último, selecciona repetidamente caracteres aleatorios de la cadena compuesta a la longitud del programa.


1
@NonlinearFruit Oops: actualicé para agregar un personaje perdido de mi cadena pero no actualicé a 44, ¡gracias!
Jonathan Allan

2

Pyke, 35 bytes

35F\";"\\+3322 5**F;H)s"\"2*+2* H)s

Pruébalo aquí!

Para verificar: elimine el final Hy la cadena resultante contiene el número correcto de cada carácter (con el extra H)

Esto NO utiliza una quine generalizada o, de hecho, una quine en absoluto. Se basa en poder crear una cadena que contenga todos los caracteres en la fuente. Se debe ser capaz de hacerlo por cualquier código, pero cada personaje aumenta logarítmicamente el tamaño del código. El único número de veces que se permite un personaje en la fuente es 2 o 7


2

Ruby, 81 67 bytes

Ahorró un montón de bytes al robar algunos trucos de la solución de Martin

s="s=%p;67.times{$><<(s%%s)[rand 67]}";67.times{$><<(s%s)[rand 67]}

No me di cuenta de que tenías que seleccionar al azar cada vez; Pensé que un barajado haría el truco. Esto probablemente se puede jugar al golf, pero es lo más corto que pude conseguir.

Quine estándar de Ruby con algunas modificaciones para que imprima la cadena mezclada. Estoy triste porque me tomó como quince minutos descubrir las peculiaridades del formato antes de darme cuenta de que de todos modos lo estaba robando inconscientemente.

Creo que la combinación de cuerdas se puede acortar pero no sé cómo; También podría hacer que el formato sea más corto una vez que lo piense. La ayuda sería apreciada.

Pruébalo en línea!


Creo que (como mi CJam) responde, no es necesario utilizar una quine estándar como base. Un puerto directo de mi solución CJam proporciona 64 bytes:64.times{$><<"64.times{$><<.inspect[rand 32]}".inspect[rand 32]}
Martin Ender

No importa, basarlo en un quine estándar es más corto, pero tendrá que usar el quine basado en evaluación:eval r="47.times{$><<('eval r=%p'%r)[rand 47]}"
Martin Ender

@ Martininder Eso es lo suficientemente diferente como para merecer su propia respuesta, creo. Si no está de acuerdo, siéntase libre de editarlo en el mío, pero mientras tanto le robaré algunos trucos para salvar algunos bytes en el mío.
Financia la demanda de Mónica el

2

C, 125 bytes

char*s="char*s;l,i;f(){l=i=strlen(s);while(i--)putchar(s[rand()%l]);}";l,i;f(){l=i=strlen(s);while(i--)putchar(s[rand()%l]);}

C, 60 bytes para código de golf pero no quine que toma cualquier cadena

l,i;f(char*s){l=i=strlen(s);while(i--)putchar(s[rand()%l]);}

Mientras que para contar caracteres mi solución necesitaba 86:

c[256];i;f(char*s){i=256;while(*s)c[*s++]++;while(--i)while(c[i]?c[i]--:0)putchar(i);}

¿No debería? Quizás no entiendo las reglas de este cuestionario. My ftoma una cadena e imprime a la salida estándar: la cadena puede ser cualquier secuencia de caracteres.
VolAnd

@NonlinearFruit Probabilidades no calculadas pero la expresión rand()%LENGTH_OF_STRINGtoma el carácter de acuerdo con la probabilidad de ese carácter con distribución normal proporcionada por rand(). Tal vez, no entiendo el quineenfoque para C ...
VolAnd

+1 La nueva solución es casi correcta. ssolo necesita contener char*s="";. Creo que algo como esto char*s="char*s=l,i;f(){l=i=strlen(s);while(i--)putchar(s[rand()%l]);};+''"+'""'lo haría (pero no estoy familiarizado con C).
NonlinearFruit

Si la respuesta no es válida en su estado actual, entonces debe eliminarse.
mbomb007

@ mbomb007 ¿Podría explicar su opinión y posiblemente brindarle consejos?
VolAnd

2

JavaScript, 128 bytes

a=";a+=uneval(a);alert(a.replace(/./g,_=>a[Math.random()*64|0]))a=";a+=uneval(a);alert(a.replace(/./g,_=>a[Math.random()*64|0]))

Nota: solo funciona en Firefox debido al uso de uneval .

Ejecuciones de muestra:

)a(rgc=d6m_a4uar=hp(lll(,d=m=dee(M(gtraoan0)(M(aaaa(M]c)e)/M()/u//M6_n/a"*unea(/>atugrn(a=nav"|;)|=)/,ataa,aaangtue;am)t0;|ctoa/
=lvct;eee,,a.e=6r0;);Mtaaoa.aeea4)a[r.6]e/ll+l.)=)|a[(c"rao4ea/=_acaMh=veerva"a(_(d(l)lgn.;rM">=ea40a*).e(h(laa6r)4a)rhlar=t(ta[
[rt]ll]n))aota.e)g;>ae*;..4tt];l[;].*lnr4(mnM|alg(a.ag(.=e(a>>aa>.hga;a/pat+elc];apc=(ag)tao.).ll4u)dah]r(ul)>lr;,)ret(e/g(=_c*r
M.r)_;.a(lraalg("mac>dmrlr"0/ah(a()ead|/0a(m.|u0)(a(0_[dn)a]/raal;eata)a.ataeaa*l)=ra()la=(a)*aaea>n;.a.)ca)orM(tm*a,a=)p;(>r)aa

¡Ahora estoy realmente sorprendido de que esto produzca un código más válido en Perl de lo que parece que lo haría en JS! No hay tantas palabras divertidas aquí, excepto gtraoanque es casi un gemido, supongo ...
Dom Hastings

1
@DomHastings Bueno, Perl es más una mezcla de puntuación que JS;)
ETHproductions

¡Seguro! ¡Es más un desastre de puntuación que una explosión en una fábrica de puntuación! pero eso me gusta bastante!
Dom Hastings

¿ "Tiene una probabilidad de aparecer?
NonlinearFruit

1
@NonlinearFruit Yup. Hay al menos uno en las salidas de primer, segundo y último ejemplo.
ETHproductions

1

Python 3, 134 132 bytes

Utilizo todos los caracteres en mi código fuente dentro de la cadena la cantidad correcta de veces, luego multiplico la cadena por dos para incluirla. El programa imprime un carácter aleatorio de esa cadena para cada carácter en el código (la longitud está codificada).

from random import*
for i in[0]*134:print(choice("""from random import*
for i in[0]*134:print(choice(""*""2""),end='')"""*2),end='')

Pruébalo en línea

Evité las barras diagonales inversas como la peste. Tan pronto como el código contenga \no \", tiene un problema, porque la cadena aún no contiene barras diagonales inversas, por lo que también debe agregarlas, pero en una cadena separada multiplicada por un número mayor, porque se necesitan dos barras diagonales inversas para representar una ( \\)

Salida de ejemplo:

i(tc*"3]i o''r=,,,h34t"r
ri"](fco t)niap)t "it2nc0o  npoi3'"nto(*4 i(ido' r*4f"oi]d rm ,i"eif)m"d
m emi
dfr n*p 3*(i""r1d"dr menc hio'

Debo decir que me recuerda a FlogScript.


1

PowerShell v2 +, 175 bytes

$d='$d={0}{1}{0}{2}-join(0..174|%{3}[char[]]($d-f [char]39,$d,"`n",[char]123,[char]125)|Random{4})'
-join(0..174|%{[char[]]($d-f [char]39,$d,"`n",[char]123,[char]125)|Random})

Quines en PowerShell apesta, porque los delimitadores de reemplazo de cadena {}también denotan bucles y demás, por lo que debe usar un montón de chars en el-f operador, que hincha el código.

Similar a mi respuesta de Quine en cada línea . Básicamente, hacemos un bucle desde y 0hasta 174cada iteración recalculamos la quine $d, la convertimos como una charmatriz y extraemos un Randomelemento elegido uniformemente de la entrada. Por definición, esto da probabilidad (occurrences in source) / (length of source)según sea necesario. Esos personajes están encapsulados en parens y-join vuelven a unir en una cadena.

Ejemplo

PS C:\Tools\Scripts\golfing> .\faux-souce-code.ps1
}}[${hr[`ini}}] [5i,=[]0,j2($=n4(dm]jh]jc]]7
}..j"rnj9|fn,4r]{9]('["jdh0}$rd,-f,a.c"}{h1 ]5d,),0n5|nh(]73a9da4aRi[5}a}430}}rd$,$r)-hhr%or79-R.R-`'r'aa|=1f0][|[{7}do1]$ja0 rd{h

(Sí, esa es una nueva línea en la salida: cuando una cadena que contiene una nueva línea es char-array'd, `nse trata como un carácter, ya que char-array es solo una matriz de códigos de bytes, por lo que también tiene un 1 / 175o posibilidad de ser seleccionado.)


1

Dyalog APL , 20 bytes

f←{(,⎕CR'f')[?⍴⍨20]}

f←{... }define f como

(,⎕CR'f')listified ( ,) Carácter C (tabla) R epresentación ( ⎕CR) de f ( 'f')

[?⍴⍨20]indexado con ( [... ]) aleatorio hasta ( ?) repetirse a sí mismo veces ( ⍴⍨) de veinte

Vamos a ejecutarlo (con un argumento ficticio) algunas veces:

      f
)0'0](⍨(([],}⎕))⎕'f2
      f
{'['}f[←R[)2←?}⍨]}C2
      f
,,⍨←?2}⍴?'⍨}C,'{⎕(C0

Bien, pero ¿es correcta la distribución? Ejecutemos en 10,000 argumentos ficticios y veamos cuántas veces ocurre cada personaje:

      {⍺ , 1E¯4× ⍴⍵}⌸  f¨ 1E4
C 0.9952
 0.9996
' 1.9777
f 2.004 
← 1.0018
⍨ 1.0173
0 1.0213
] 1.0049
[ 0.9988
2 0.9943
{ 0.9895
) 1.0093
R 1.0054
, 1.0029
? 0.9943
} 0.9861
⍴ 1.0032
( 0.9944

Claramente, fy 'ocurre el doble de veces que los otros caracteres, al igual que en el código fuente original.

¿Cómo lo hicimos?

{⍺ , 1E¯4× ⍴⍵}⌸  f¨ 1E4`

⍳1E4 genera los primeros 10,000 enteros

ejecuta f en cada uno de esos números

aplana todas las pseudoquines en una sola cadena de 200,000 caracteres

es una función de orden superior que para cada carácter único en los datos del lado derecho, alimenta a la función del lado izquierdo el elemento único como argumento izquierdo y los índices donde ese carácter aparece como argumento derecho. La función del lado izquierdo es

{⍺ , 1E¯4× ⍴⍵}

argumento izquierdo, es decir, el carácter único

, seguido por

1E¯4× 1 × 10⁻⁴ veces

⍴⍵ la forma del argumento correcto (los índices de ocurrencia), es decir, cuántas veces ocurre

Finalmente, lo pone todo junto en una mesa.


1

C #, 277 280 268 bytes.

using System;class a{static void Main(){var s="using System;class a{static void Main(){var s=\"x5Cx5C\x5C\x5C\";Random d=new Random();for(int i=0;i++<268;)Console.Write(s[d.Next(0,134)]);}}";Random d=new Random();for(int i=0;i++<268;)Console.Write(s[d.Next(0,134)]);}}

Sin golf:

using System;
class a
{
    static void Main()
    {
        var s="using System;class a{static void Main(){var s=\"x5Cx5C\x5C\x5C\";Random d=new Random();for(int i=0;i++<268;)Console.Write(s[d.Next(0,134)]);}}";
        Random d=new Random();
        for(int i=0;i++<268;)
            Console.Write(s[d.Next(0,134)]);
    }
}

Estoy bastante seguro de que esto funciona correctamente.

Salida de muestra:

    fn;i)(]ns;<ftt08et]i+ii8]m[W}dr{rmte,)t edayid 2s cmsee\;ta["e n;o}]iolys;t sftoR{.=g vs8;(sd isWrecn++iia]iuf"avs\i<{ee vfs[ensin\s i]0a(We.0ns R(2roo=ldxil\{t(o"aistt.;.  r w"m1];idi}Ctitiindnn;M[,[+0(,o"]mca[rmnm)<;n"8ReaystinRsanr([(d,n\.ateiR sd.=[=;ttn.;wna)cCt[=+t{Wxs(\}rg

@NonlinearFruit Gracias, perdí ese espacio. También significa que no puedo usar un bucle foreach que agregue algunos bytes :(. Sin embargo, creo que sí he "incluido correctamente con esas dos comillas escapadas en la cadena, ya que aparecen en la salida varias veces, a menos que yo"
Estoy

Ahh, pensé que no contaban si estaban en la cuerda, mi mal. Se arreglará en un momento.
Yodle

¡Bien, ahora también aparecen!
Yodle

1
Hm, problema interesante entonces. No puedo seguir agregando \\ o siempre seré uno corto. Usaré el código ascii para \ en su lugar.
Yodle

Funciona (new Random()).Next(0,134)]? Ahorraría un par de bytes.
NonlinearFruit

1

C, 136 bytes

main(a){for(a=136;a--;)rand()%68?putchar("main(a){for(a=136;a--;)rand()%68?putchar([rand()%67]):putchar(34);}"[rand()%67]):putchar(34);}

Salida de ejemplo:

;%7c(u)"r4-hd)nnr-%n6;6(4or(n4(6(a:=a3r-:()hp(:aa%;4rru}h;(a()3mh3rdi7));a-u36:r3on[4?p((]6n6?()-6t736unhr%:[%[[d(p:[ru)-n(6r=:](p-})8"]

Este programa genera 136 caracteres al azar.

El código fuente completo (menos "comillas") está contenido en una cadena. El programa determina la probabilidad de generar una comilla como 2/136, de lo contrario, generará uno de los otros 67 caracteres al azar.

Hay dos ocurrencias de cada carácter en la cadena en el programa. La probabilidad de generar un carácter de la cadena es 134/136. La probabilidad de elegir un personaje específico en la cadena es 1/67. Entonces, la posibilidad de generar un carácter en la cadena es 134/136 * 1/67 = 2/136. Hay dos ocurrencias de cada carácter de cadena en el programa, por lo que hay una probabilidad de 1/136 de generar un carácter para cada ocurrencia en el programa.

El orden de los símbolos dentro de la cadena no importa.

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.