Il bellissimo cassetto modello (cubetti inclusi)


18

Il bellissimo cassetto modello

Buongiorno PPCG!

L'altro giorno, quando stavo cercando di aiutare qualcuno su Stack Overflow, una parte del suo problema mi ha dato un'idea per questa sfida.

Prima di tutto, controlla la seguente forma:

inserisci qui la descrizione dell'immagine

Dove tutti i numeri neri sono l'indice dei punti nella forma e tutti i numeri blu scuro sono l'indice dei collegamenti tra i punti.

Ora, dato un numero esadecimale da 0x00000 a 0xFFFFF, devi disegnare una forma nella console usando solo lo spazio caratteri e "■" (anche il carattere "o" va bene).

Ecco alcuni esempi in cui viene immesso un numero esadecimale e viene generata la forma:

0xE0C25 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■               ■ 
■               ■ 
■               ■ 
■ ■ ■ ■ ■       ■ 
        ■       ■ 
        ■       ■ 
        ■       ■ 
        ■ ■ ■ ■ ■
0xC1043 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
              ■   
            ■     
          ■       
        ■         
      ■           
    ■             
  ■               
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xE4F27 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■       ■       ■ 
■       ■       ■ 
■       ■       ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■       ■       ■ 
■       ■       ■ 
■       ■       ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xF1957 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■ ■           ■ ■ 
■   ■       ■   ■ 
■     ■   ■     ■ 
■       ■       ■ 
■     ■   ■     ■ 
■   ■       ■   ■ 
■ ■           ■ ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xD0C67 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
  ■             ■ 
    ■           ■ 
      ■         ■ 
■ ■ ■ ■ ■       ■ 
      ■ ■       ■ 
    ■   ■       ■ 
  ■     ■       ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0x95E30 :
■ ■ ■ ■ ■       ■ 
  ■     ■     ■ ■ 
    ■   ■   ■   ■ 
      ■ ■ ■     ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
        ■ ■       
        ■   ■     
        ■     ■   
        ■       ■ 
0x95622 :
■ ■ ■ ■ ■       ■ 
  ■     ■     ■   
    ■   ■   ■     
      ■ ■ ■       
■ ■ ■ ■ ■ ■ ■ ■ ■ 
        ■         
        ■         
        ■         
■ ■ ■ ■ ■         
0xC5463 : 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
        ■     ■   
        ■   ■     
        ■ ■       
■ ■ ■ ■ ■         
      ■ ■         
    ■   ■         
  ■     ■         
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xE5975 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■       ■     ■ ■ 
■       ■   ■   ■ 
■       ■ ■     ■ 
■       ■       ■ 
■     ■ ■ ■     ■ 
■   ■   ■   ■   ■ 
■ ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■ 
0xB5E75 :
■ ■ ■ ■ ■       ■ 
■ ■     ■     ■ ■ 
■   ■   ■   ■   ■ 
■     ■ ■ ■     ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
      ■ ■ ■     ■ 
    ■   ■   ■   ■ 
  ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■ 
0xF4C75 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■ ■     ■       ■ 
■   ■   ■       ■ 
■     ■ ■       ■ 
■ ■ ■ ■ ■       ■ 
      ■ ■ ■     ■ 
    ■   ■   ■   ■ 
  ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■
0xF5D75 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■ ■     ■     ■ ■ 
■   ■   ■   ■   ■ 
■     ■ ■ ■     ■ 
■ ■ ■ ■ ■       ■ 
■     ■ ■ ■     ■ 
■   ■   ■   ■   ■ 
■ ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■ 

Ecco alcune spiegazioni su come funziona:

0xFFFFF(16) = 1111 1111 1111 1111 1111(2)

Qui hai 20 bit, ogni bit indica se esiste o meno un collegamento.

L'indice del bit più significativo (MSB) è 0 (riferimento immagine) o il bit meno significativo (LSB) è 19 (riferimento immagine di nuovo).

Ecco come funziona per la prima forma fornita come esempio:

0xE0C25(16) = 1110 0000 1100 0010 0101(2)

Ciò significa che avrai i seguenti collegamenti esistenti: 0,1,2,8,9,14,17,19.

Se evidenzi le linee sull'immagine di riferimento con quei numeri, ti darà questa forma:

■ ■ ■ ■ ■ ■ ■ ■ ■ 
■               ■ 
■               ■ 
■               ■ 
■ ■ ■ ■ ■       ■ 
        ■       ■ 
        ■       ■ 
        ■       ■ 
        ■ ■ ■ ■ ■

Ecco un'implementazione Python semplice e non golfata se hai bisogno di ulteriore aiuto:

patterns = [
  0xE0C25, 0xC1043, 0xE4F27, 0xF1957, 
  0xD0C67, 0x95E30, 0x95622, 0xC5463, 
  0xE5975, 0xB5E75, 0xF4C75, 0xF5D75
]

def printIfTrue(condition, text = "■ "):
  if condition:
    print(text, end="")
  else:
    print(" "*len(text), end="")

def orOnList(cube, indexes):
  return (sum([cube[i] for i in indexes]) > 0)

def printPattern(pattern):
  cube = [True if n == "1" else False for n in str(bin(pattern))[2::]]
  for y in range(9):
    if y == 0: printIfTrue(orOnList(cube, [0, 2, 3]))
    if y == 4: printIfTrue(orOnList(cube, [2, 4, 9, 11, 12]))
    if y == 8: printIfTrue(orOnList(cube, [11, 13, 18]))
    if y in [0, 4, 8]:
      printIfTrue(cube[int((y / 4) + (y * 2))], "■ ■ ■ ")
      if y == 0: printIfTrue(orOnList(cube, [0, 1, 4, 5, 6]))
      if y == 4: printIfTrue(orOnList(cube, [3, 5, 7, 9, 10, 13, 14, 15]))
      if y == 8: printIfTrue(orOnList(cube, [12, 14, 16, 18, 19]))
      printIfTrue(cube[int((y / 4) + (y * 2)) + 1], "■ ■ ■ ")
    elif y in [1, 5]:
      for i in range(7):
        if i in [2, 5]:
          print(" ", end=" ")
        printIfTrue(cube[y * 2 + (1 - (y % 5)) + i])
    elif y in [2, 6]:
      for i in range(5):
        if i in [1, 2, 3, 4]:
          print(" ", end=" ")
        if i in [1, 3]:
          if i == 1 and y == 2:
            printIfTrue(orOnList(cube, [3, 4]))
          elif i == 3 and y == 2:
            printIfTrue(orOnList(cube, [6, 7]))
          if i == 1 and y == 6:
            printIfTrue(orOnList(cube, [12, 13]))
          elif i == 3 and y == 6:
            printIfTrue(orOnList(cube, [15, 16]))
        else:
          printIfTrue(cube[(y * 2 - (1 if y == 6 else 2)) + i + int(i / 4 * 2)])
    elif y in [3, 7]:
      for i in range(7):
        if i in [2, 5]:
          print("  ", end="")
        ri, swap = (y * 2 - 2) + (1 - (y % 5)) + i, [[3, 6, 12, 15], [4, 7, 13, 16]]
        if ri in swap[0]: ri = swap[1][swap[0].index(ri)]
        elif ri in swap[1]: ri = swap[0][swap[1].index(ri)]
        printIfTrue(cube[ri])
    if y == 0: printIfTrue(orOnList(cube, [1, 7, 8]))
    if y == 4: printIfTrue(orOnList(cube, [6, 8, 10, 16, 17]))
    if y == 8: printIfTrue(orOnList(cube, [15, 17, 19]))
    print()

for pattern in patterns:
  printPattern(pattern)

Ovviamente non è perfetto ed è piuttosto lungo per quello che dovrebbe fare, ed è questo il motivo esatto per cui sei qui!

Rendendo questo programma ridicolmente breve :)

Questo è code-golf, quindi vince la risposta più breve!


Possiamo stampare un singolo spazio finale su linee? I tuoi esempi li contengono.
orlp

Sì :) È permesso
Sygmei,

4
È consentito l'output grafico?
Me21,

1
È necessario un input esadecimale o il decimale è ok?
Tito

1
Forse tutto il codice golf mi sta arrivando, ma quel codice è doloroso da leggere ...
Lynn,

Risposte:


8

JavaScript (ES6), 202 188 187 byte

let f =

n=>`0${x=',16,-54,21,-26,21,21,-26,21,166'}${x},16`.split`,`.map((d,i)=>(k-=d,n)>>i&1&&[..."ooooo"].map(c=>g[p-=(k&3||9)^8]=c,p=k>>2),g=[...(' '.repeat(9)+`
`).repeat(9)],k=356)&&g.join``

console.log(f(0xE0C25))
console.log(f(0xC1043))
console.log(f(0xE4F27))
console.log(f(0xF1957))

Come funziona

n =>                                                 // given 'n':
  `0${x = ',16,-54,21,-26,21,21,-26,21,166'}${x},16` // build the list of delta values
  .split`,`.map((d, i) =>                            // split the list and iterate
    (k -= d, n) >> i & 1 &&                          // update 'k', test the i-th bit of 'n'
    [..."ooooo"].map(c =>                            // if the bit is set, iterate 5 times:
      g[                                             // 
        p -= (k & 3 || 9) ^ 8                        // compute the direction and update 'p'
      ] = c,                                         // write a 'o' at this position
      p = k >> 2                                     // initial value of 'p'
    ),                                               //
    g = [...(' '.repeat(9) + `\n`).repeat(9)],       // initialization of the 'g' array
    k = 356                                          // initial value of 'k'
  )                                                  //
  && g.join``                                        // yield the final string

Lavoriamo su una griglia gdi 9 righe di 10 caratteri. La griglia è inizialmente riempita di spazi, con un LineFeed ogni 10 ° carattere.

Ogni segmento è definito da una posizione iniziale e una direzione.

Le indicazioni sono codificate come segue:

ID | Dir.| Offset
---|-----|-------
 0 |  W  |  -1        Offset encoding formula:
 1 | NE  |  -9        -((ID || 9) ^ 8)
 2 |  N  |  -10
 3 | NW  |  -11

Ogni segmento è codificato come un numero intero:

  • la direzione è memorizzata nei bit # 0 e # 1
  • la posizione iniziale viene memorizzata nei bit da 2 a 8

Ad esempio, il segmento n. 3 inizia dalla posizione 55 e utilizza la terza direzione. Pertanto, è codificato come (55 << 2) | 3 == 223.

Di seguito è riportato l'elenco risultante di numeri interi, dal segmento # 19 al segmento # 0:

356,340,394,373,399,378,357,383,362,196,180,234,213,239,218,197,223,202,36,20

Una volta codificato con delta, a partire da 356, diventa:

0,16,-54,21,-26,21,21,-26,21,166,16,-54,21,-26,21,21,-26,21,166,16

Che è infine codificato come:

`0${x=',16,-54,21,-26,21,21,-26,21,166'}${x},16`

Oops ... Ho dimenticato gli spazi in mezzo. Risolvendolo.
Arnauld,

5

Python 3, 289 byte

def f(n):
 for r in range(9):print(*(" o"[any(n&1<<ord(c)-97for c in"trq|t|t|t|tspon|s|s|s|sml|r|q||p|o|n||m|l|r||qp||o||nm||l|r|p||q|o|m||n|l|rpkih|k|k|k|qomkjgfe|j|j|j|nljdc|i|h||g|f|e||d|c|i||hg||f||ed||c|i|g||h|f|d||e|c|igb|b|b|b|hfdba|a|a|a|eca".split("|")[r*9+c])]for c in range(9)))

Niente di intelligente, solo hardcoding.


Non potresti "trq|t...a|eca".split("|")diventare "tqr t...a eca".split()?
Loovjo,

@Loovjo No, .split()distrugge ||.
orlp

3

Rubino, 116 byte

->n{s=[' '*17]*9*$/
20.times{|i|j=i%9
n>>19-i&1>0&&5.times{|k|s[i/9*72+(j>1?~-j/3*8+k*18:j*16)+k*(2--j%3*2)]=?O}}
s}

Questo si basa su un paio di schemi che ho osservato. Innanzitutto, il motivo si ripete ogni 9 righe. In secondo luogo, se i punti di inizio delle linee orizzontali sono scelti in modo appropriato, le direzioni x si spostano continuamente attraverso destra, sinistra, diritto.

Non registrato nel programma di test

f=->n{
   s=[' '*17]*9*$/                    #Setup a string of 9 newline separated lines of 17 spaces.
   20.times{|i|                       #For each of the 20 bits..
     j=i%9                            #The pattern repeats every 9 bits.
     n>>19-i&1>0&&                    #If the relevant bit is set,
     5.times{|k|                      #draw each of the 5 points on the relevant line.
       s[i/9*72+                      #There are 9 lines starting on each row. Row y=0 starts at 0 in the string, row y=1 at 72, etc.
       (j>1?~-j/3*8+k*18:j*16)+       #~-j=j-1. For j=2..8, the starting x coordinates are (0,0,1,1,1,2,2)*8. For j=0 and 1 starting x coordinates are 0 and 16. 
       k*(2--j%3*2)                   #From the starting points, draw the lines right,left,straight. Down movement if applicable is given by conditional k*18 above.
       ]=?O                           #Having described the correct index to modify, overwrite it with a O character.
     }
   }
s}                                    #Return the string.


[0xE0C25, 0xC1043, 0xE4F27, 0xF1957, 
  0xD0C67, 0x95E30, 0x95622, 0xC5463, 
  0xE5975, 0xB5E75, 0xF4C75, 0xF5D75].map{|m|puts f[m],'---------'}

Credo che esista una soluzione a 112 byte che utilizza una stringa di 20 caratteri e alcune decodifiche per definire i parametri delle 20 righe. Ci proverò più tardi se ho tempo.


Bella spiegazione!
Sygmei,

2

PHP, 142 150 149 byte

for($r="";$c=ord(",(NMKJIGFHDjigfecbd`"[$i]);)if(hexdec($argv[1])>>$i++&1)for($p=96^$c&~$k=3;$k++<8;$p+=7+($c&3?:-6))$r[$p]=o;echo chunk_split($r,9);

stampa la forma per quanto necessario; cioè se la parte inferiore è vuota, verrà tagliata.
Corri con php -nr '<code>' <input>. Non aggiungere prefisso

Provalo online

Aggiungi 11 byte per nessun taglio: inserire ,$r[80]=" "dopo $r="".

spiegazione della codifica

Ogni riga può essere descritta con un punto iniziale e una delle quattro direzioni.
Disegnando su una griglia 9x9, la posizione iniziale varia da 0,0a 8,4; o, combinato, da 0a 8*9+4=76. Fortunatamente, tutti i punti di partenza [0,4,8,36,40,44,72,76]sono divisibili per 4; quindi il codice di direzione [0..3]può essere compresso nei bit 0 e 1 -> non è necessario alcuno spostamento.

Per un facile calcolo del movimento del cursore, 0viene preso per est (solo direzione senza movimento verticale) e [1,2,3]per sud-ovest, sud, sud-est, dove si trova l'offset 9(per movimento verticale) più [-1,0,1]-> [8,9,10]-> delta=code?code+7:1.

La direzione per la prima e l'ultima riga è est, che risulta in codici che vanno da 0 a 76 [0+0,4+0,0+2,0+3,4+1,4+2,4+3,8+1,8+2,...,44+1,44+2,72+0,76+0]; e bit a bit xor 96 su ciascun valore risulta in codici ASCII stampabili e non problematici [96,100,98,99,101,102,103,105,106,68, 72,70,71,73,74,75,77,78,40,44]-> `dbcefgijDHFGIJKMN(,. Il codice utilizza LSB per il bit 0, mentre la riga 0 corrisponde all'MSB, quindi la stringa deve essere invertita. Finito.

abbattersi

for($r="";                  // init result string, loop through line codes
    $c=ord(",(NMKJIGFHDjigfecbd`"[$i]);)
    if(hexdec($argv[1])>>$i++&1)// if bit $i is set, draw line 19-$i:
        for($p=96^$c&~$k=3          // init $k to 3, init cursor to value&~3
            ;$k++<8;                // loop 5 times
            $p+=7+($c&3?:-6)            // 2. map [0,1,2,3] to [1,8,9,10], move cursor
        )
            $r[$p]=o;                   // 1. plot
echo chunk_split($r,9);     // insert a linebreak every 9 characters, print

qualche golf ha spiegato

  • Poiché ^96non ha alcun effetto sui due bit inferiori, può essere ignorato durante l'estrazione della direzione; quindi non è necessario memorizzare il valore in una variabile, che salva 5 byte sull'iniz cursore.
  • L'utilizzo ~3invece di 124salva un byte e consente il prossimo golf:
  • L'inizializzazione del contatore di cicli $k=3all'interno $pdell'assegnazione salva due byte
    e non pregiudica la pre-condizione (poiché il valore superiore ha ancora una cifra).
  • L'uso di una stringa per il risultato ha l'inizializzazione e la stampa più brevi possibili: Quando un carattere è impostato oltre la fine di una stringa, PHP imposta implicitamente i caratteri mancanti sullo spazio. Ed chunk_splitè il modo più breve per inserire le interruzioni di riga.
    Non voglio nemmeno sapere quanto altro ci vorrebbe.
  • 7+($c&3?:-6)è un byte più breve di $c&3?$c%4+7:1.
  • Aggiunto hexdec()(8 byte) per soddisfare la restrizione di input.

2

JavaScript, 184 183 178 168 167 byte

f=
n=>[...`<>K[LM]NO\\^k{lm}no|~`].map((e,i)=>n>>i&1&&[0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]=`o`,e=~e.charCodeAt()),a=[...(` `.repeat(31)+`
`).repeat(9)])&&a.join``
<input oninput=o.textContent=f(+this.value)><pre id=o>

Inizialmente era di 206 byte, ma la risposta di @ Arnauld mi ha ispirato a studiare una soluzione array monodimensionale. Modifica: salvato 1 byte grazie a @ edc65. Risparmiato 5 15 byte grazie a @Arnauld. Ho salvato un ulteriore byte modificando la scelta dei caratteri.


[0,1,2,3,4]è più corto
edc65, il

Penso che puoi salvare 4 byte usando [67,65,52,36,51,50,34,49,48,35,33,20,4,19,18,2,17,16,3,1]e[0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o')
Arnauld il

1
Oppure puoi usare [..."ecVFUTDSREC6&54$32%#"]e [0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o',e=e.charCodeAt()-34)per salvare altri 10 byte.
Arnauld,

@Arnauld Sembra che tu abbia sottostimato i tuoi risparmi di 1, e sono anche riuscito a golfare un byte in più usando ~invece di -34(purtroppo cado fallo di `\` ed è per questo che non salvo 2 byte).
Neil,

Mi chiedo se potresti sostituire questo '\' con il carattere ASCII n. 220.
Arnauld,

1

Lotto, 491 byte

@set n=%1
@for %%i in ("720896 524288 524288 524288 843776 262144 262144 262144 268288" "131072 65536 0 32768 16384 8192 0 4096 2048" "131072 0 98304 0 16384 0 12288 0 2048" "131072 32768 0 65536 16384 4096 0 8192 2048" "165248 1024 1024 1024 89312 512 512 512 10764" "256 128 0 64 32 16 0 8 4" "256 0 192 0 32 0 24 0 4" "256 64 0 128 32 8 0 16 4" "322 2 2 2 171 1 1 1 17")do @set s=&(for %%j in (%%~i)do @set/am=%1^&%%j&call:c)&call echo(%%s%%
:c
@if %m%==0 (set s=%s%  )else set s=%s%o 

Nota: l'ultima riga termina con uno spazio. Mettere un ifcondizionale con una variabile all'interno di un forciclo va oltre il batch, quindi ha bisogno della sua subroutine. Dal momento che non fa nulla di visibile, ci cado dentro per uscire. Il ~unquotes le stringhe nel ciclo esterno permettendo l'anello interno di ciclo sopra i numeri. I numeri sono semplicemente le maschere di bit per tutti i luoghi in cui oè necessario disegnare s.


1

C, 267 262 260 256 caratteri

Il conteggio sfugge come 1 carattere

void f(int i){char*k="\0\x1\x2\x3\x4\x4\x5\x6\x7\x8\0\x9\x12\x1b\x24\0\xa\x14\x1e\x28\x4\xc\x14\x1c\x2d\x4\xd\x16\x1f\x28\x4\xe\x18\x22\x2c\x8\x10\x18\x20\x28\x8\x11\x1a\x23\x2c\x24\x25\x26\x27\x28\x28\x29\x2a\x2b\x2c\x24\x2d\x36\x3f\x48\x24\x2e\x38\x42\x4c\x28\x30\x38\x40\x48\x28\x31\x3a\x43\x4c\x28\x31\x3a\x43\x4c\x28\x32\x3c\x46\x50\x2c\x35\x3e\x47\x50\x48\x49\x4a\x4b\x4c\x4c\x4d\x4e\x4f\x50";for(int n=0,s,l;n<81;!(++n%9)&&putchar(10))for(s=l=0;s<20;!(++l%5||++s^20)&&putchar(32))if(i<<s&1<<19&&k[l]==n&&putchar(111))break;}

k è una ricerca che si riferisce a quali caselle inserire una 'o'.

Provalo online!


1

Befunge, 468 byte

~:85+`!#v_86*-:9`7*-48*%\82**+
3%2:/2\<$v0%2:/2\*g02*!g03%2:/2\*!+4g07%2:/2\*g02*!-8g06%2:/2\*g02*!-4g0
g!*20g*^00>50g*\2/:2%00g8-!*40g*\2/:2%30g8-!*20g*\2/:2%60g66+-!*\2/:2%70
`\5:p00:<g^*!-8g00%2:\-10:\p07-g00:p06+g00:p05`3:p04`\5:p03:<0\p02`3:p01
#o 8`#@_^4>*50g*\2/2%00g!*40g*0\>:#<1#\+_$!1+4g,48*,\1+:8`!#^_55+,$\1+:
g03%2:/2<-^!g00%2:/2\*g01*!g03%2:/2\*g01*!g07%2:/2\*!-4g06%2:/2\*g01*!-4
70g4-!*\^>!*50g*\2/:2%00g4-!*40g*\2/:2%30g8-!*10g*\2/:2%60g8-!*10g*\2/:2%

Provalo online!

La prima riga legge una stringa dallo stdin, valutandola come un numero esadecimale. Il resto del codice è essenzialmente solo un doppio loop sulle coordinate x / y della griglia, con un enorme calcolo booleano che determina se odebba essere emesso un output per ogni posizione.

Esiste sostanzialmente una condizione separata per ciascuno dei 20 punti della griglia, ad esempio (i primi quattro):

(y==0) * (x<5) * bit0
(y==0) * (x>3) * bit1
(x==0) * (y<5) * bit2
(x==y) * (y<5) * bit3

E poi, una volta calcolati tutti e 20, noi O il lotto insieme, e se quel risultato è vero, produciamo a o, altrimenti produciamo uno spazio.

Befunge non ha nulla in termini di operazioni di manipolazione dei bit, quindi per estrarre i bit dall'ingresso, stiamo solo valutando ripetutamente n%2e poi n/=2mentre procediamo attraverso i calcoli delle 20 condizioni.

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.