Non farlo. Anche. Blink


50

inserisci qui la descrizione dell'immagine

La tua vita potrebbe dipendere da questo. Non batter ciglio. Non battere ciglio. Sbatti le palpebre e sei morto. Sono veloci Più veloce di quanto tu possa credere. Non voltare le spalle, non distogliere lo sguardo e non battere ciglio! In bocca al lupo.

Gli Angeli piangenti sono una razza aliena che non può muoversi mentre viene osservata da un altro essere (persino un altro Angelo). Si nutrono inviando le loro vittime indietro nel tempo. Tu ( il Dottore ) sei intrappolato in una stanza con alcuni, e devi raggiungere il tuo TARDIS.


Compito

Scrivi un programma che, data una rappresentazione ASCII di una stanza rettangolare, produrrà un percorso che ti porterà in sicurezza. Se un Angelo può attaccare - in qualsiasi momento durante i tuoi progressi - quel percorso non è sicuro. Un Angelo può attaccare se può vederti senza essere visto da te o da un altro Angelo.

Ingresso

L'input è composto da due parti. Innanzitutto, la direzione verso cui sei rivolto (NSEW). Quindi, sulle linee successive, una rappresentazione della stanza, che mostra le posizioni di inizio / fine e la posizione / fronte di tutti gli angeli.

L'esempio sotto mostra che c'è un angelo rivolto a ovest e inizi a sud.

S
..........
....D.....
..........
..........
..........
..........
..........
..........
.........W
..........
...T......
  • . - Spazio vuoto
  • D - The Doctor (posizione iniziale)
  • T - Il TARDIS (posizione finale)
  • N,S,E,W - Un angelo, rivolto nella direzione specificata (nord, sud, est, ovest)

Linea di vista

Puoi vedere qualsiasi spazio entro 45 gradi dalla direzione verso cui sei rivolto. La linea di vista è ostruita se esiste un'altra entità lungo una diagonale diretta orizzontale, verticale o 45 gradi. Qualsiasi altra diagonale non ostruisce la vista. La linea di vista degli angeli funziona allo stesso modo. Ad esempio, nel seguito, -rappresenta il tuo campo visivo, supponendo che tu sia rivolto a sud.

........
...D....
..---...
.-----..
-------.
---N----
---.--N-
---.----

Produzione

L'output è una stringa che rappresenta il percorso che prenderai per uscire. Se esistono più percorsi sicuri, sceglierne uno. Se nessun percorso è sicuro, emettere 0. Se la mappa non è corretta, fai quello che ti piace, incluso lo schianto. Consideralo malformato se la stanza non è rettangolare, non c'è uscita, ecc. Se non ci sono Angeli, non è malformato, semplicemente facile.

Per ogni passaggio, puoi fare una delle due cose: muoverti in una direzione NSEW o girare in una direzione NSEW (senza cambiare posizione). Per spostarsi, basta semplicemente emettere la lettera per quella direzione. Per girare verso una direzione, l'output Fseguito dalla lettera appropriata. Ad esempio, il seguente output:

SSFESSSSSSSW

è un percorso sicuro per il campione indicato nella sezione input. Ti sposti due volte a sud, esci a est per tenere in vista l'angelo, poi vai a sud altre sette volte e ad ovest una volta per entrare nel TARDIS.

Casi test

1) Puoi aggirare l'Angelo rivolto a est per raggiungere il TARDIS. A meno che non si passi direttamente tra loro, si bloccano a vicenda, quindi non importa in che modo ti trovi di fronte in qualsiasi momento.

W
...D....
........
........
........
.E.....W
........
........
...T....

2) perdi. Non c'è modo di superarli. Possono vedersi fino a quando non si passa tra di loro. A quel punto, non puoi affrontarli entrambi e il gioco è fatto. Potrebbe anche solo chiudere gli occhi e farcela.

S
...D....
........
........
........
E......W
........
........
...T....

vincente

Si applicano le regole del golf standard e le scappatoie , vincono meno byte. Cercherò presto di ottenere altri casi di test, ma nel frattempo non esitare a suggerire i tuoi.

Immagine e citazione da Doctor Who.


possiamo usare una libreria per trovare un percorso attraverso un grafico?
Sparr,

@Sparr Sì, ma tutto il necessario per caricare / includere la libreria deve essere aggiunto al conteggio dei byte.
Geobits

2
Ovviamente usa un manipolatore di vortici!
TheDoctor

4
@TheDoctor Jack ha portato il suo con sé, e puoi vedere che non è su nessuna delle mappe ( J).
Geobits il

1
@Timmy È possibile utilizzare qualsiasi definizione standard .
Geobits il

Risposte:


6

Python - 559 565 644 633

M=input()
I=1j
Q={"S":I,"N":-I,"E":1,"W":-1}
A=[]
e=enumerate
for y,l in e(M[2:].split()):
 for x,c in e(l):
    P=x+y*1j
    if c=="D":D=(P,Q[M[0]])
    elif c=="T":T=P
    elif c!=".":A+=[(P,Q[c])]
def s(D,h,r=[]):
 def L(X,p,d):
    S=[p+d*(i+j*I)for i in range(x+y)for j in range(-i+1,i)if j]
    for f in[1,1+I,1-I]:
     i=0
     while i<x+y>1>(S[-1]in[a[0]for a in[D]+A]+[T])*i:i+=1;S+=[p+i*f*d]
    return X[0]in S
 if y>=D[0].imag>=(D[0]in[a[0]for a in A])<all(any(L(a,*b)for b in[D]+A)for a in A if L(D,*a))>(D in r)<=D[0].real<=x:
    r+=[D]
    if D[0]==T:print h;exit()
    for n in"SWEN":s((D[0]+Q[n],D[1]),h+n,r);s((D[0],Q[n]),h+"F"+n,r)
s(D,"")
print"0"

L'input deve essere fornito in questo modo:

"W\n...D....\n........\n........\n........\nE......W\n........\n........\n...T....\n"

Fondamentalmente è questo approccio applicato alla ricerca di tutti gli stati (posizione e direzione) che il Dottore può raggiungere in sicurezza, memorizzando come è arrivato lì e stampando la strada in caso di successo. Posizioni e direzioni sono realizzate con numeri complessi.

Probabilmente potrei mettere in salvo alcuni caratteri usando l'aritmetica dei numeri complessi di Sage, ma sarebbe estremamente lunga.

Ho pensato per la prima volta di poter salvare sei personaggi facendo in modo che il Dottore si trasformasse in una direzione specifica dopo aver raggiunto il Tardis, ma mi sono reso conto che ciò poteva provocare soluzioni sbagliate. Inoltre ho prima letto male le regole.

Ecco una versione per lo più non golfizzata:

Map = input()

I = 1j
string_to_dir = {"S":I,"N":-I,"E":1,"W":-1}

Angels = []
Pos = 0
direction = string_to_dir[Map[0]]
for y,line in enumerate(Map[2:].split()):
    for x,char in enumerate(line):
        Pos = x+y*1j
        if char == "D":
            Doctor = (Pos, direction)
        elif char == "T":
            Tardis = (Pos, direction)
        elif char != ".":
            Angels += [(Pos,string_to_dir[char])]

reachables = []

def display(LoS, Doctor):
    string = ""
    for y,line in enumerate(Map[2:].split()):
        for x,char in enumerate(line):
            if x+y*1j == Doctor[0]:
                string += "D"
            elif x+y*1j in LoS:
                if char in ".D":
                    string += "*"
                else:
                    string += "X"
            elif char != "D":
                string += char
            else:
                string += "."

        string += "\n"
    print string

def LoS(angel,Doctor):
    p,d = angel
    Sight = []
    for i in range(x+y):
        for j in set(range(-i+1,i))-{0}:
            Sight += [p+d*i+d*j*I]
    for line in [d, (1+I)*d, (1-I)*d]:
        for i in range(1,x+y):
            Pos = p + i*line
            Sight += [Pos]
            if Pos in [angel[0] for angel in Angels+[Doctor, Tardis]]:
                break
    return Sight

def search(Doctor, history):
    global reachables

    Sight = sum([LoS(angel, Doctor) for angel in [Doctor]+Angels],[])

    if (
                all(angel[0] in Sight for angel in Angels if Doctor[0] in LoS(angel, Doctor))
            and not (Doctor in reachables)
            and (0<=Doctor[0].imag<=y)
            and (0<=Doctor[0].real<=x)
            and (Doctor[0] not in [angel[0] for angel in Angels])
        ):

        reachables += [Doctor]

        if Doctor[0] == Tardis[0]:
            print history
            exit()
        for new_direction in "SWEN":
            search((Doctor[0]+string_to_dir[new_direction], Doctor[1]), history + new_direction)
            search((Doctor[0], string_to_dir[new_direction]), history + "F" + new_direction)

search(Doctor, "")
print "0"

Casi test

Caso di prova 1:

SSSFSWWWSSSSFWEFSEFWE

Caso di prova 2:

0

Test case di VisualMelon:

SSFWSSSSSFSWWSSWWWFWEEEEFSEFWEFSE

1
Non ho testato il tuo codice, ma sembra che tu abbia incollato due volte l'output del test case 1! Inoltre sarei interessato a vedere che cosa produce il tuo programma se lo nutri il mio caso di test proposto.
VisualMelon

@VisualMelon: Grazie per aver individuato e ho integrato il caso di test.
Wrzlprmft

10

C # 1771 2034 1962 1887 1347bytes

Riscritto il blocco LOS controllando in 1 loop, rendendolo molto più ordinato e più corto di circa 450 byte

using C=System.Console;using T=System.Math;struct P{int x,y,d;static void Main(){int v=C.ReadLine()[0],w,h,i,o=0,x=0,y=0,O,E,F,e=46;var R=C.In.ReadToEnd().Replace("\r","");var M=new int[w=R.IndexOf("\n"),h=(R.Length+1)/(w+1)];for(;o<h;o++)for(i=0;i<w;i++)if((M[i,o]=R[o+o*w+i])==68)M[x=i,y=o]=e;System.Func<int,int,int,bool>S=null;S=(X,Y,D)=>{var Z="SSSE_WNNNE_W___E_W";int I=0,H=0,L=0,J=Y,K=M[X,Y],B;M[X,Y]=D>0?D:K;for(H=0;H<9;H++)for(I=X,J=Y;H!=4&(I+=H%3-1)<w&I>=0&(J+=H/3-1)<h&&J>=0;){if(((B=M[I,J])==Z[H]|B==Z[H+9])&(D<1||!S(I,J,0)))goto W;if(B!=e)break;}for(B=I=-1;++I<w;B=1)for(J=0;J<h;J++)if(I!=X&J!=Y&(((B=M[I,J])==87&I>X&(H=T.Abs(J-Y))<I-X)|(B==69&I<X&H<X-I)|(B==78&J>Y&(L=T.Abs(I-X))<J-Y)|(B==83&J<Y&L<Y-J))&(D<1||!S(I,J,0)))goto W;W:M[X,Y]=K;return B>1;};P a,p=new P{x=x,y=y,d=v};var A=new System.Collections.Generic.List<P>();System.Action q=()=>{if(((E=M[p.x,p.y])==e|E==84)&!A.Contains(p)&!S(p.x,p.y,p.d))A.Add(p);};q();for(o=0;(O=A.Count)!=o;o=O)for(i=O;i-->o;){p=A[i];if((E=M[p.x,p.y])==84)for(R="";;p=a){i=0;n:a=A[i++];O=T.Abs(p.y-a.y)+T.Abs(a.x-p.x);if(O==1&p.d==a.d)R=(a.y-p.y==1?"N":p.y-a.y==1?"S":a.x-p.x==1?"W":"E")+R;else if(O<1)R="F"+(char)p.d+R;else goto n;if(i<2)goto Z;}if(E==e){if(p.x-->0)q();p.x+=2;if(p.x<w)q();p.x--;if(p.y-->0)q();p.y+=2;if(p.y<h)q();p.y--;for(F=0;F<4;q())p.d="NESW"[F++];}}R="0";Z:C.WriteLine(R);}}

Questo è un programma completo che prevede che l'input termini con un EOF e venga passato a STDIN. (Si spera) stampa il percorso più breve verso TARDIS, o "0" se non esiste alcun percorso. Utilizza una prima ricerca scadente Breadth per seguire tutte le possibili rotte, quindi fa un passo indietro da TARDIS a The Doctor per assemblare l'output.

Codice formattato:

using C=System.Console;
using T=System.Math;

struct P
{
    int x,y,d;

    static void Main()
    {
        int v=C.ReadLine()[0],w,h,i,o=0,x=0,y=0,O,E,F,e=46;
        var R=C.In.ReadToEnd().Replace("\r","");
        var M=new int[w=R.IndexOf("\n"),h=(R.Length+1)/(w+1)];

        for(;o<h;o++)
            for(i=0;i<w;i++)
                if((M[i,o]=R[o+o*w+i])==68)
                    M[x=i,y=o]=e;

        System.Func<int,int,int,bool>S=null;
        S=(X,Y,D)=>
        {
            var Z="SSSE_WNNNE_W___E_W";

            int I=0,H=0,L=0,J=Y,K=M[X,Y],B;
            M[X,Y]=D>0?D:K;

            for(H=0;H<9;H++)
                for(I=X,J=Y;H!=4&(I+=H%3-1)<w&I>=0&(J+=H/3-1)<h&&J>=0;)
                {
                    if(((B=M[I,J])==Z[H]|B==Z[H+9])&(D<1||!S(I,J,0)))
                        goto W;
                    if(B!=e)
                        break;
                }

            for(B=I=-1;++I<w;B=1)
                for(J=0;J<h;J++)
                    if(I!=X&J!=Y&(((B=M[I,J])==87&I>X&(H=T.Abs(J-Y))<I-X)|(B==69&I<X&H<X-I)|(B==78&J>Y&(L=T.Abs(I-X))<J-Y)|(B==83&J<Y&L<Y-J))&(D<1||!S(I,J,0)))
                        goto W;
        W:
            M[X,Y]=K;
            return B>1;
        };

        P a,p=new P{x=x,y=y,d=v};
        var A=new System.Collections.Generic.List<P>();
        System.Action q=()=>{if(((E=M[p.x,p.y])==e|E==84)&!A.Contains(p)&!S(p.x,p.y,p.d))A.Add(p);};
        q();

        for(o=0;(O=A.Count)!=o;o=O)
            for(i=O;i-->o;)
            {
                p=A[i];
                if((E=M[p.x,p.y])==84)
                    for(R="";;p=a)
                    {
                        i=0;
                    n:
                        a=A[i++];

                        O=T.Abs(p.y-a.y)+T.Abs(a.x-p.x);
                        if(O==1&p.d==a.d)
                            R=(a.y-p.y==1?"N":p.y-a.y==1?"S":a.x-p.x==1?"W":"E")+R;
                        else if(O<1)
                            R="F"+(char)p.d+R;
                        else goto n;

                        if(i<2)
                            goto Z;
                    }
                if(E==e)
                {
                    if(p.x-->0)q();
                    p.x+=2;if(p.x<w)q();p.x--;
                    if(p.y-->0)q();
                    p.y+=2;if(p.y<h)q();p.y--;

                    for(F=0;F<4;q())
                        p.d="NESW"[F++];
                }
            }
        R="0";
    Z:
        C.WriteLine(R);
    }
}

Uscita per esempio input

SFESWSSSSSSS

Uscita per test case 1)

WSWSWSSSESESE

Uscita per test case 2)

0

Vi presento, come richiesto, un nuovo caso di prova:

S
..E..DS....
...........
...........
...........
...........
...........
...........
...........
....SSSSS.W
.......T...

Il mio programma esce

SESESESESFNSSSSWW

Test Case 1 di WozzeC:

EEEEFWSSSFNWWN

Test Case 2 di WozzeC:

FSEEEESFWSSSSWFNWWWNFENNEES

Ho completamente perso la possibilità di utilizzare X = System.Console. Grazie per quello :)
WozzeC

@WozzeC potresti voler dare un'occhiata a Suggerimenti per giocare a code-golf in C #
VisualMelon

Credo che il medico venga attaccato all'avvio con il tuo caso di test: S
WozzeC

@WozzeC L'angelo dell'ovest nel sud-est può vedere l'angelo dell'est nel nord-ovest, quindi The Doctor può scappare, ma a quel punto sembra che la mia soluzione non si accorga se il dottore viene attaccato all'avvio. Perché questo codice è così difficile da testare!
VisualMelon,

1
Un dispiace, non importa. Ho perso il piccolo dettaglio che non possono spostare se un altro angelo sta guardando.
WozzeC

2

C # 1454, 1396, 1373, 1303 1279

class P{static int x,d,y=x=d=55,o=170,X=0,Y=0,u,k=3;static string[,]t=new string[o,o];static int[,]m=new int[o,o];static string e=" NS ETD W      .",q="0";static void Main(string[]s){m[0,1]=m[1,8]=-1;m[0,2]=m[1,4]=1;u=e.IndexOf(s[0][0]);for(;k<s[0].Length;k++){var c=s[0][k];if(c=='D'){X=x;Y=y;}if(c=='\\'){y++;x=d;k++;}else m[y,x++]=e.IndexOf(c);}k=A(X,Y,1);if((k&u)!=0){W(X,Y,k,"");}System.Console.Write(q);}static void W(int x,int y,int h,string s){t[y,x]=s;for(int i=1;i<9;i*=2){int l=y+m[0,i],g=x+m[1,i];if(m[l,g]==5)q=t[l,g]=s+e[i];else if(m[l,g]==15){m[l,g]=6;m[y,x]=15;int n=A(g,l,1),U;for(int j=1;j<9;j*=2){var z=t[l,g]??s;if((n&h&j)!=0&z.Length>=s.Length){U=u;u=j;W(g,l,n,s+((u!=j)?"F"+e[j]:"")+e[i]);u=U;}}m[y,x]=6;m[l,g]=0;}}}static int A(int x,int y,int L){int r=15,a,b,c,f=0,g,h,R,B;for(a=1;a<d-5;a++){g=1;for(b=y-a;b<=y+a;b++)for(c=x-a;c<=x+a;c++){B=m[b,c];R=0;bool W=(c+a-x)%a==0,V=(b+a-y)%a==0,z=W&V;if(B>0&B<9&B!=6&B!=5&g!=16&!((W|V)&(f&g)!=0)){h=R;if(b==y-a){R=1;if(c==x-a){h=4;R=9;}else if(c==x+a){h=8;R=5;}B&=h&2;}else if(b==y+a){R=2;if(c==x-a){h=4;R=10;}else if(c==x+a){h=8;R=6;}B&=h&1;}else if(c==x-a){B&=4;R=8;}else if(c==x+a){B&=8;R=4;}else B=0;if(B!=0){if(L==1&&A(c,b,0)==15)r&=R;if(L==0)return R;}}if(z){if(B<9&B>0&!(c==x&y==b))f|=g;g*=2;}}}return r;}}

Giusto. Così ho deciso di provarlo e il ragazzo ci è voluto un po '. È costruito principalmente utilizzando operatori logici.

  • Nord = 1 = N
  • Sud = 2 = S
  • Est = 4 = E
  • Ovest = 8 = O
  • Medico = 6 = D
  • TARDIS = 5 = T
  • 15 =. <-Tutti gli spazi liberi

Per evitare di dover controllare Null, ecc. Ho deciso di utilizzare un campo di [MAX_SIZE * 3] * [MAX_SIZE] * 3 e di posizionare il tabellone vicino al centro.

I controlli di loop vengono eseguiti dentro e fuori fino a 50 (MAX_SIZE). Quindi qualcosa del genere:

22222
21112
21D12
21112
22222

Quando viene trovato un EWS o N, faccio lo stesso controllo da parte loro. Se viene trovato qualcosa guardando gli Angeli (non il Dottore), ne restituiscono 15 come passaggio libero. Se non vengono guardati, ritornano in che modo il Dottore dovrebbe affrontare per essere al sicuro. cioè N restituirà 2 per sud. A meno che non sia NW o NE, nel qual caso restituirebbe 6 (2 + 4) e 10 (2 + 8) rispettivamente.

Se due angeli stanno osservando il Dottore, i valori di ritorno da questi sarebbero "ANDed", quindi nell'esempio di test 2 crunchpositions 4 AND 8 si trasformerebbero in 0. Ciò significa che la posizione è cattiva e dovrebbe essere evitata.

Codice espanso:

class P
{
    static int x,d,y=x=d=55,o=170,X=0,Y=0,u,k=3;
    static string[,] t = new string[o, o];
    static int[,] m = new int[o, o];
    static string e = " NS ETD W      .", q="0";
    static void Main(string[]s)
    {   
        m[0, 1]=m[1, 8]=-1;
        m[0, 2]=m[1, 4]=1;
        u=e.IndexOf(s[0][0]);
        for (;k<s[0].Length;k++)
        {
            var c = s[0][k];
            if (c == 'D') { X = x; Y = y; }
            if (c == '\\') { y++; x = d; k++; }
            else m[y, x++] = e.IndexOf(c);
        }
        k=A(X,Y,1);
        if ((k&u)!=0)
        {
            W(X, Y, k,"");
        }
        System.Console.Write(q);
    }
    static void W(int x,int y,int h,string s){
        t[y, x] = s;
        for (int i = 1; i < 9; i*=2)
        {
            int l = y+m[0, i], g = x+m[1, i];
            if (m[l, g] == 5)
                q = t[l, g] = s + e[i];
            else if (m[l, g] == 15)
            {
                m[l, g] = 6;
                m[y, x] = 15;
                int n = A(g, l,1),U;
                for (int j = 1; j < 9; j *= 2)
                {
                    var z = t[l, g]??s;
                    if ((n & h & j) != 0 & z.Length>=s.Length)
                    {
                        U = u;
                        u = j;
                        W(g, l, n,s+((u != j) ? "F" + e[j] : "") + e[i]);
                        u = U;
                    }
                }
                m[y, x] = 6;
                m[l, g] = 0;
            }
        }
    }
    static int A(int x, int y,int L)
    {
        int r = 15,a,b,c,f=0,g,h,R,B;
        for (a = 1; a < d - 5; a++)
        {
            g = 1;
            for (b = y - a; b <= y + a; b++)
                for (c = x - a; c <= x + a; c++)
                {
                    B=m[b, c];
                    R=0;
                    bool W=(c+a-x)%a==0,V=(b+a-y)%a==0,z=W&V; 
                    if (B>0&B<9&B!=6&B!=5&g!=16&!((W|V)&(f&g)!=0))
                    {
                        h=R;
                        if (b==y-a)
                        {
                            R=1;
                            if(c==x-a){h=4;R=9;}
                            else if(c==x+a){h=8;R=5;}
                            B&=h&2;
                        }
                        else if (b==y+a)
                        {
                            R=2;
                            if(c==x-a){h=4;R=10;}
                            else if (c==x+a){h=8;R=6;}
                            B&=h&1;
                        }
                        else if(c==x-a){B&=4;R=8;}
                        else if(c==x+a){B&=8;R=4;}
                        else B=0;
                        if (B!=0)
                        {
                            if(L==1&&A(c,b,0)==15)r&=R;
                            if (L==0)return R;
                        }
                    }
                    if (z)
                    {
                        if (B < 9 & B > 0 & !(c==x&y==b))
                           f |= g;
                        g *= 2;
                    }
                }
        }
        return r;
    }
}

Risultati del test

1 Esempio: FNSSSWNNNWSSSWSSSSENNESES

2 Esempio: nessuna via d'uscita

Esempio VisualMelon: FNSSSSSSSWNNNNNNNWSSSSSSSSSEEEE

Il mio caso di test1: FSSENEEEFWSSFNSWWN

My Test case2: FSEEEESFWSSSSFNWWWWNFENNFSEES

Come si può vedere, il mio dottore adora gironzolare come un idiota per mostrare agli angeli quanto sia divertente muoversi. Posso fare in modo che il software trovi il percorso più breve, ma richiede più tempo e richiede più codice.

Casi di prova per voi ragazzi

S
D....
..NE.
.WTS.
.S...

Un altro:

E
D....
WNNN.
...E.
.WTE.
.SSE.
.....

1
Al codice golfed manca uno spazio in un punto che lo interrompe la compilazione, ma con quella correzione ti faccio contare il byte solo 1395! Bel lavoro che lo rende così basso, ed è un gioco perfettamente giusto da usare using S=System.Console;, oppure potresti semplicemente rimuovere la S nel tuo codice e risparmiare 6 byte di using System. Ora dovrò provare a ridurre ulteriormente il mio approccio ingenuo ...;)
VisualMelon

1
Oh uno spazio mancato, dovrei occuparmene. E ovviamente la S = ... Mi sono lasciata trasportare un po 'quando l'ho imparato. :)
WozzeC

Bel lavoro con il conto alla rovescia del byte;)
VisualMelon

Ho trovato del codice che non è mai stato usato. Inoltre alcune cose inutili aggiuntive.
WozzeC,
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.