Calcola i caratteri medi della stringa


24

Compito

Il tuo compito è produrre una stringa che contenga caratteri medi di stringa. Il primo carattere del risultato sarebbe il carattere medio del primo carattere (che è il primo carattere) e la media del secondo carattere di due primi caratteri e così via.

Qual è il personaggio medio?

Le stringhe sono matrici di byte. Il carattere medio della stringa può essere trovato calcolando la media dei valori ASCII dei caratteri nella stringa e prendendo il carattere ASCII corrispondente.

Ad esempio, la stringa "Hello!"può essere scritta come sequenza di byte 72 101 108 108 111 33. La media dei valori ascii è 533/6 = 88.833 ... e quando è arrotondata al numero intero più vicino otteniamo 89 che è il codice ASCII per la lettera captial Y.

Regole

  • Si può presumere che l'input contenga solo caratteri ASCII stampabili
  • L'input può essere letto da stdin o come argomenti della riga di comando o come argomenti delle funzioni
  • L'output deve essere stdout. Se il tuo programma è funzionale, puoi anche restituire la stringa che altrimenti stamperesti.
  • Deve essere un intero programma o funzione, non frammento
  • Si applicano scappatoie standard
  • I numeri interi sono arrotondati per funzione floor(x+0.5)o funzione simile.

Come posso vincere?

Questo è , quindi la risposta più breve (in byte) nelle vittorie.

Esempi

  • Hello!HW^adY
  • testtmop
  • 4243
  • StackExchangeSdccd_ccccddd

Domanda modificata. Ora dovrebbe essere chiaro: devi arrotondare le metà verso l'alto.
Hannes Karppila,

1
"L' input può essere letto da stdin o come argomenti della riga di comando ": o come argomenti di funzione (poiché si accettano funzioni), giusto?
Luis Mendo,

Certo, modificato di nuovo.
Hannes Karppila,

2
Mi dispiace disturbarti ancora una volta, ma le funzioni devono effettivamente stampare l'output su STDOUT o possono restituire la stringa desiderata?
Dennis,

Spiacente, ho dimenticato di modificarlo prima. Ora dovrebbe essere ok.
Hannes Karppila,

Risposte:


11

Brainfuck 106 byte

,[>,<.[->+<]>>++<[>[->+>+<<]>[-<<-[>]>>>[<[>>>-<<<[-]]>>]<<]>>>+<<[-<<+>>]<<<]>[-]>>>>[-<<<<<+>>>>>]<<<<<]

Questa è la mia prima partecipazione a un golf di codice, per favore sii gentile! Funziona ma brainfuck non è in grado di gestire i float (non che io sappia), quindi il valore arrotondato è sempre quello inferiore (potrebbe correggere il mio algoritmo in un secondo momento).

Inoltre, l'algoritmo calcola la media dei valori 2 per 2, il che significa che potrebbe essere innacurato in alcuni punti. E ho bisogno di correggere un bug che stampa anche un numero alla fine dell'output.


9

Pyth, 16 byte

smCs+.5csaYCdlYz

Abbastanza diretto. Usando s+.5invece di arrotondare, perché per qualche motivo round(0.5, 0)è 0 in Python.


1
Python 3 arrotonda la metà in modo uniforme, il che introduce meno distorsioni. La domanda non specifica esplicitamente come devono essere arrotondate le metà, quindi ho chiesto chiarimenti al PO.
Dennis,

Domanda modificata. 0.5arrotondato dovrebbe essere 1.
Hannes Karppila,

7

Q, 15 12 byte

12 byte come espressione

"c"$avgs"i"$

q)"c"$avgs"i"$"Hello!"
"HW^adY"
q)"c"$avgs"i"$"test"
"tmop"
q)"c"$avgs"i"$"42"
"43"
q)"c"$avgs"i"$"StackExchange"
"Sdccd_ccccddd"

o 15 byte in funzione

{"c"$avgs"i"$x}

q){"c"$avgs"i"$x} "Hello!"
"HW^adY"
q){"c"$avgs"i"$x} "test"
"tmop"
q){"c"$avgs"i"$x} "42"
"43"
q){"c"$avgs"i"$x} "StackExchange"
"Sdccd_ccccddd"

ne approfitta

  1. il cast "i" $ per convertire una stringa (elenco di caratteri) in un elenco di numeri interi
  2. la funzione avgs, che calcola la media corrente di un elenco come un elenco di float
  3. il cast "c" $ per convertire un elenco di float in un elenco di caratteri e che arrotonda automaticamente ogni float al numero intero più vicino prima di farlo [ie ("c" $ 99,5) = ("c" $ 100) e ("c "$ 99,4) = (" c "$ 99)]

Q richiede il wrapper di funzione qui o puoi cavartela solo con l'espressione tacita "c"$avgs"i"$? Non credo che una soluzione potrebbe essere molto più semplice di così. :)
JohnE

hai ragione - non c'è bisogno del wrapper di funzione, come "c" $ avgs "i" $ "Ciao!" funziona benissimo
scottstein37

Penso che puoi salvare 2 byte cambiando "c"in `c e "i"in` i.
kirbyfan64sos,

sfortunatamente, non penso che funzioni. Per usare la rappresentazione del tipo di simbolo per il casting, dovrei usare `char e` int secondo code.kx.com/wiki/JB:QforMortals2/… Ho considerato di usare 10h e 6h invece di "c" e "i" ma che non risparmierebbe alcun byte - 10h ha la stessa lunghezza di "c" e la sostituzione di 6h con "i" richiede uno spazio finale, rendendoli anche della stessa lunghezza.
scottstein37

4

CJam, 19 byte

Uq{i+_U):Ud/moco}/;

Provalo online nell'interprete CJam .


4

Perl: 31 30 caratteri

(Codice di 29 caratteri + opzione della riga di comando di 1 carattere.)

s!.!chr.5+($s+=ord$&)/++$c!ge

Esecuzione di esempio:

bash-4.3$ perl -pe 's!.!chr.5+($s+=ord$&)/++$c!ge' <<< 'StackExchange'
Sdccd_ccccddd

3

C # 189 135 134 106 106 byte

var x=s.Select((t,i)=>Math.Round(s.Select(a=>(int)a).Take(i+1).Average())).Aggregate("",(m,c)=>m+(char)c);

Può essere visto qui

Giocatore di golf per la prima volta


2

K, 36 byte

`0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic

Uso:

  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"Hello!"
HW^adY
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"test"
tmop
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"42"
43
  `0:_ci_.5+{(+/x)%#x}'.0+1_|(-1_)\_ic"StackExchange"
Sdccd_ccccddd

_cie _icconvertire ascii in caratteri e viceversa, rispettivamente. {(+/x)%#x}è un classico linguaggio K per calcolare una media. Abbastanza semplice nel complesso.

Modifica: oh, ho letto male le specifiche. `0: è necessario per stampare il risultato su stdout. In attesa di chiarimenti sull'input re. La domanda di Dennis.


Se si utilizza K5, questo può essere ridotto a 35 byte: {[s]`0:`c${_.5+(+/u)%#u:x#s}'1+!#s}.
kirbyfan64sos,

O 30:`0:`c$_.5+{(+/x)%#x}'1_|(-1_)\
Giovanni

`c$_.5+{(+\x)%+\~^x}`i$per 24. Potrebbe essere più breve ( `c$`i${(+\x)%+\~^x}`i$) ma il tuo REPL ( johnearnest.github.io/ok/index.html ) non sta arrotondando correttamente quando si lancia da float a int. Esiterei a chiamare questa soluzione ak da allora _cie _icnon sono da nessuna parte nelle specifiche K5 per quanto posso dire, mentre 0:non stampa su stdout ma invece legge un file txt dal disco.
tmartin,

@tmartin: corretto- _cie _icsono completamente sostituiti in K5 con i moduli simili `c$. La soluzione originale che ho pubblicato è compatibile con Kona, che si basa su K2 / K3. In genere cerco di non pubblicare soluzioni con oK in particolare perché la semantica si sta ancora spostando e parzialmente imprecisa.
Giovanni

1
Ah capisco, ha senso per me. Ho pensato che questa fosse un'altra soluzione K5. Ecco una soluzione kona da 28 caratteri`0:_ci_0.5+{(+\x)%1.+!#x}_ic
tmartin

2

Mathematica, 75 byte

FromCharacterCode@Floor[.5+Accumulate@#/Range@Length@#]&@ToCharacterCode@#&

2

Julia, 85 81 byte

s->(i=[int(c)for c=s];print(join([char(iround(mean(i[1:j])))for j=1:length(i)])))

Questo crea una funzione senza nome che accetta una stringa e crea un vettore dei suoi punti di codice ASCII. I mezzi vengono presi per ciascun gruppo sequenziale, arrotondati a numeri interi, convertiti in caratteri, uniti in una stringa e stampati in STDOUT.


2

Ruby, 46

s=0.0
$<.bytes{|b|s+=b;$><<'%c'%(0.5+s/$.+=1)}

ideone .

Scusandomi con w0lf, la mia risposta è stata abbastanza diversa da sembrare degna di essere pubblicata.

$<.bytesscorre su ogni byte in stdin, quindi stampiamo la media mobile in ogni ciclo. '% c' converte un float in un personaggio arrotondando per difetto e prendendo l'ASCII, quindi tutto ciò che dobbiamo fare è aggiungere 0,5 per farlo arrotondare correttamente. $.è una variabile magica che inizia inizializzata su 0 - si suppone che memorizzi il conteggio delle righe, ma dato che qui vogliamo il conteggio dei byte lo incrementiamo solo manualmente.


2

Mathcad, 60 "byte"

inserisci qui la descrizione dell'immagine

Mathcad è un'applicazione matematica basata su fogli di lavoro 2D composti da "regioni", ciascuna delle quali può essere un testo, un'espressione matematica, un programma, una trama o un componente scriptato.

Un'istruzione matematica o di programmazione viene scelta da una barra degli strumenti della tavolozza o immessa utilizzando una scorciatoia da tastiera. Ai fini del golf, si considera un'operazione ("byte") il numero di operazioni da tastiera necessarie per creare un nome o un'espressione (ad esempio, per impostare la variabile a su 3, scrivere a: = 3. L'operatore di definizione : = è un singolo tasto ":", così come a e 3 per un totale di 3 "byte". La programmazione per l' operatore richiede di digitare ctl-shft- # (o un singolo clic sulla barra degli strumenti di programmazione) quindi equivale di nuovo a 1 byte.

In Mathcad l'utente inserisce i comandi del linguaggio di programmazione usando le scorciatoie da tastiera (o selezionandole dalla barra degli strumenti di programmazione) anziché scriverle nel testo. Ad esempio, digitando ctl-] si crea un operatore while-loop che ha due "segnaposto" per inserire rispettivamente la condizione e una singola linea del corpo. Digitando = alla fine delle espressioni Mathcad, Mathcad valuta l'espressione.

(Conta byte) Osservandolo dal punto di vista dell'input dell'utente ed equiparando un'operazione di input di Mathcad (di solito la tastiera, fai clic con il mouse sulla barra degli strumenti se non c'è un collegamento kbd) a un carattere e lo interpreta come un byte. csort = 5 byte come viene digitato carattere per carattere come lo sono altri nomi di variabili / funzioni. L'operatore for è un costrutto speciale che occupa 11 caratteri (inclusi 3 "segnaposto" vuoti e 3 spazi) ma è inserito da ctl-shft- #, quindi = 1 byte (simile ai token in alcune lingue). Digitando '(virgolette) si creano parentesi bilanciate (di solito) quindi conta come 1 byte. Indicizzazione v = 3 byte (tipo v [k).


2

Python 3, 66 byte

Se uso round()invece di int(.5+ecc., Salva un personaggio, ma tecnicamente non è conforme alla sfida: i round()round di Python si dimezzano al numero intero pari più vicino, non verso l'alto. Tuttavia, funziona correttamente su tutti gli input di esempio.

Mi sento anche un po 'sporco per non aver terminato l'output con una nuova riga, ma la sfida non richiede che ...

n=t=0
for c in input():n+=1;t+=ord(c);print(end=chr(int(.5+t/n)))

1
Se si incrementa n prima di stampare, è possibile evitare di regolarlo di 1.
xnor

1
@xnor: viso, palmo. Palmo, viso. Grazie per la segnalazione.
Tim Pederick,

fare print(end=chr(int(...))per salvare alcuni byte
FlipTack

@ Flp.Tkc: grazie! Risposta aggiornata
Tim Pederick,

2

JavaScript (ES6), 75 byte

let f =
s=>s.replace(/./g,x=>String.fromCharCode((t+=x.charCodeAt())/++i+.5),i=t=0)
<input oninput="O.value=f(this.value)" value="Hello!"><br>
<input id=O value="HW^adY" disabled>

Non riesco a credere che non ci sia ancora una risposta JS con questa tecnica ...


1

Python 2, 71

i=s=0
r=''
for c in input():s+=ord(c);i+=1.;r+=chr(int(s/i+.5))
print r

Con ogni nuovo personaggio, aggiorna la somma dei caratteri se il numero di caratteri ida calcolare e aggiungere il carattere medio.


Quasi esattamente lo stesso approccio del mio, solo Python 2 invece di 3, e pubblicato ore prima: +1. (Inoltre, ho scoperto di aver salvato alcuni byte stampando ogni carattere man mano che veniva invece di memorizzarli per un finale print. Funzionerà con Python 2? Dimentico solo ora come sopprimere le nuove righe nell'istruzione print... virgola lo rende uno spazio invece, giusto?)
Tim Pederick il

Python 2 può fare print _,per lasciare uno spazio piuttosto che una nuova riga, ma non è un buon modo per omettere lo spazio. Buona telefonata con l' endargomento di Python 3 , me ne ero dimenticato.
xnor

@TimPederick Forse il controllo del backspace potrebbe essere giustificato per un terminale che lo utilizza, come hack per eliminare lo spazio:print'\b'+_,
xnor


1

Java, 100

Proprio come molte altre risposte qui, sto sommando e facendo la media in un ciclo. Proprio qui per rappresentare Java :)

void f(char[]z){float s=0;for(int i=0;i<z.length;System.out.print((char)Math.round(s/++i)))s+=z[i];}

Il mio codice originale è un 97, ma restituisce solo il modificato char[]anziché stamparlo:

char[]g(char[]z){float s=0;for(int i=0;i<z.length;z[i]=(char)Math.round(s/++i))s+=z[i];return z;}

Ora, è solo abbastanza a lungo perché le barre di scorrimento a comparire per me, ecco una versione con alcune interruzioni di riga, solo perché:

void f(char[]z){
    float s=0;
    for(int i=0;
            i<z.length;
            System.out.print((char)Math.round(s/++i)))
        s+=z[i];
}

Interessante. Puoi mostrarci anche un campione di chiamata? Il mio Java è molto arrugginito.
arte

Come in come chiamarlo? Supponendo che testsia un array di caratteri, basta usare f(test);. Se è un oggetto String, allora useresti f(test.toCharArray());. Anche i letterali a corda vanno bene così:f("Hello!".toCharArray());
Geobits il

Oh. Sicuro. toCharArray()Stupido, ho provato a violarlo con qualche casting. Grazie.
arte

Sarebbe troppo facile semplicemente lanciarlo. Gli dei Java sarebbero furiosi: P
Geobits il

1

C, 62 byte

c;t;main(n){for(;(c=getchar())>0;n++)putchar(((t+=c)+n/2)/n);}

(collegamento ideone)

I risultati sono leggermente diversi dagli esempi del PO, ma solo perché questo codice arrotonda 0,5 invece di su. Non più!


1

R, 135 127 byte

Questo è diventato molto veloce e la prima volta ho sbagliato davvero :) Devo leggere correttamente le domande.

cat(sapply(substring(a<-scan(,''),1,1:nchar(a)),function(x)rawToChar(as.raw(round(mean(as.integer(charToRaw(x)))+.5)))),sep='')

Prova

cat(sapply(substring(a<-scan(,''),1,1:nchar(a)),function(x)rawToChar(as.raw(round(mean(as.integer(charToRaw(x)))+.5)))),sep='')
1: Hello!
2: 
Read 1 item
HW^adY

qualcuno ha pubblicato una sfida dupe nella sandbox, quindi ho trovato questo ... Questo è stato molto tempo fa, ma utf8ToIntsarà di aiuto! Ho un golf da 68 byte di questo se vuoi aggiornarlo.
Giuseppe,

@Giuseppe Vai avanti e pubblicalo tu stesso se lo desideri. Sospetto che sia significativamente diverso da quello che ho fatto qui.
MickyT

1

Perl 5, 41 byte

say map{$s+=ord;chr($s/++$c+.5)}pop=~/./g

correre come

$ perl -E 'say map{$s+=ord;chr($s/++$c+.5)}pop=~/./g' StackExchange
Sdccd_ccccddd

1

TSQL, 118 byte

DECLARE @ varchar(400) = 'StackExchange'

SELECT
top(len(@))char(avg(ascii(stuff(@,1,number,''))+.5)over(order by number))FROM
master..spt_values
WHERE'P'=type

Restituisce i caratteri in verticale

S
d
c
c
d
_
c
c
c
c
d
d
d

1

> <> , 30 byte

i:0(?v
v &l~<
\+l2(?
\&,12,+o;
  • La prima riga legge da stdin e mette i personaggi in pila
  • Il secondo rimuoverà il carattere EOL, prenderà la dimensione dello stack e lo inserirà nel &registro
  • La terza riga aggiungerà i numeri nello stack mentre ce ne sono due o più
  • La quarta riga dividerà il numero risultante per il valore del registro, quindi aggiungerà 1/2, emetterà il valore come carattere e si fermerà. Di fronte a un valore float quando si visualizza un carattere,> <> lo pavimenta, motivo per cui abbiamo aggiunto 1/2

Puoi provarlo sull'interprete online ma devi usare la seguente versione, perché l'interprete online inserisce la casella del codice in un rettangolo e si applica ?agli spazi.

i:0(?v
v &l~<
\+l2(   ?
\&,12,+o;


1

Japt , 13 byte (non concorrenti)

£T±Xc)/°Y r d

Provalo online!

Come funziona

£   T± Xc)/° Y r d
mXY{T+=Xc)/++Y r d}
                     // Implicit: U = input string, T = 0
mXY{              }  // Replace each char X and index Y in the string by this function:
    T+=Xc            //   Add X.charCodeAt() to T.
         )/++Y       //   Take T / (Y + 1).
               r d   //   Round, and convert to a character.
                     // Implicit: output result of last expression

Ah, noccioline; Ho pensato che il filtro "fuori concorso" era stato rimosso dalla classifica, quindi non ho visto questo prima di pubblicare questo .
Shaggy,


1

PHP , 176 byte

<?=(implode('',array_reduce(str_split($argv[1]),function($c,$k){array_push($c[1],chr(floor(((ord($k)+$c[0])/(count($c[1])+1))+0.5)));return[ord($k)+$c[0],$c[1]];},[0,[]])[1]));

Esempio:

>php cg.php Hello!
HW^adY
>php cg.php test  
tmop
>php cg.php 42
43

La soluzione più grande finora, ma basata sul php non può essere molto più breve, credo. È possibile salvare 2 byte rimuovendo le nuove righe.


Hmm, buon punto. Ho pensato di poterli lasciare nel post per una migliore leggibilità. Ma sì, questo è il golf del codice. Li rimuoverò;)
cb0

1
Puoi sempre includere una versione aggiuntiva con imbottitura per la leggibilità a fianco di quella corta. Lo faccio spesso quando il mio codice è troppo lungo per essere completamente visibile sulla maggior parte dei monitor.
Wheat Wizard

0

JavaScript ES7, 122 byte

s=>String.fromCharCode(...[for(i of s)i.charCodeAt()].map((l,i,a)=>Math.round(eval((t=a.slice(0,++i)).join`+`)/t.length)))

Principalmente tutto sta succedendo in questo bit

eval((t=a.slice(0,++i)).join`+`)/t.length)

Il resto è la conversione in loop / codice carattere

Suddiviso:

s=> 
 String.fromCharCode(...                        ) // Converts average character code array to string, ... allows it to take an array
   [for(i of s)i.charCodeAt()]                    // Converts string to char code array
   .map((l,i,a)=>                             )   // Loops through each character
     Math.round(                    /t.length)    // Rounds sum of previous char codes, divides by position + 1
       eval(                       )              // evals string of char codes seperated with +
            (                ).join`+`            // joins previous char codes with +
             t=a.slice(0,++i)                     // creates an array with all the char codes

Se le funzioni non sono consentite:

alert(String.fromCharCode(...[for(i of prompt())i.charCodeAt()].map((l,i,a)=>Math.round(eval((t=a.slice(0,++i)).join`+`)/t.length))))

133 byte


Snippet ES5:

function _toConsumableArray(r){if(Array.isArray(r)){for(var e=0,t=Array(r.length);e<r.length;e++)t[e]=r[e];return t}return Array.from(r)}function _taggedTemplateLiteral(r,e){return Object.freeze(Object.defineProperties(r,{raw:{value:Object.freeze(e)}}))}var _templateObject=_taggedTemplateLiteral(["+"],["+"]),f,t=function t(s){return String.fromCharCode.apply(String,_toConsumableArray(function(){var r=[],e=!0,t=!1,a=void 0;try{for(var n,i=s[Symbol.iterator]();!(e=(n=i.next()).done);e=!0){var o=n.value;r.push(o.charCodeAt())}}catch(l){t=!0,a=l}finally{try{!e&&i["return"]&&i["return"]()}finally{if(t)throw a}}return r}().map(function(l,i,a){return Math.round(eval((f=a.slice(0,++i)).join(_templateObject))/f.length)})))};

// Demo
document.getElementById('go').onclick=function(){
  document.getElementById('output').innerHTML = t(document.getElementById('input').value)
};
<div style="padding-left:5px;padding-right:5px;"><h2 style="font-family:sans-serif">Average of Words Snippet</h2><div><div  style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><input placeholder="Text here..." style="resize:none;border:1px solid #DDD;" id="input"><button id='go'>Run!</button></div><br><div style="background-color:#EFEFEF;border-radius:4px;padding:10px;"><span style="font-family:sans-serif;">Output:</span><br><pre id="output" style="background-color:#DEDEDE;padding:1em;border-radius:2px;overflow-x:auto;"></pre></div></div></div>


0

Python 2, 106 byte

Non è abbastanza corto. Dato che è Python è troppo dettagliato, puoi persino leggere cosa fa guardando il codice. Ma funziona.

a=[.0]+[ord(i)for i in raw_input()]
print"".join([chr(int(.5+(sum(a[:i+1])/i)))for i in range(1,len(a))])

1
"Dato che è Python è troppo dettagliato" ... non rispetto a Java. E non sono d'accordo. Un po 'meno prolisso e non sarebbe bello come lo è. Usa Pyth se vuoi meno dettagli.
mbomb007,

0

Matlab, 43

Utilizzando una funzione anonima:

f=@(s)char(round(cumsum(+s)./(1:numel(s))))

Esempi:

>> f=@(s)char(round(cumsum(+s)./(1:numel(s))))
f = 
    @(s)char(round(cumsum(+s)./(1:numel(s))))

>> f('Hello!')
ans =
HW^adY

>> f('test')
ans =
tmop

>> f('42')
ans =
43

>> f('StackExchange')
ans =
Sdccd_ccccddd

0

JavaScript ES6, 111 byte

w=>w.replace(/./g,(_,i)=>String.fromCharCode([for(f of w.slice(0,++i))f.charCodeAt()].reduce((a,b)=>a+b)/i+.5))

Questo è fastidiosamente lungo grazie in parte alla lunga String.fromCharCodee alle charCodeAtfunzioni di JavaScript . Lo snippet di stack contiene codice non testato, commentato e testabile.

f=function(w){
  return w.replace(/./g,function(e,i){
    return String.fromCharCode(w.slice(0,++i).split('').map(function(f){
      return f.charCodeAt()
    }).reduce(function(a,b){
      // Adds all numbers in the array
      return a+b
      // String.fromCharCode automatically floors numbers, so we add .5 to round up
    })/i+.5)
  })
}

run=function(){document.getElementById('output').innerHTML=f(document.getElementById('input').value)};document.getElementById('run').onclick=run;run()
<input type="text" id="input" value="Hello!" /><button id="run">Run</button><br />
<pre id="output"></pre>


0

Fattore, 80 byte

[ cum-sum [ dup zero? 1 0 ? + / ] map-index [ .5 + floor >fixnum ] map >string ]
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.