Frazioni egiziane


20

Panoramica:

Da Wikipedia : Una frazione egiziana è la somma di frazioni unitarie distinte. Cioè, ogni frazione nell'espressione ha un numeratore uguale a 1 e un denominatore che è un numero intero positivo e tutti i denominatori differiscono l'uno dall'altro. Il valore di un'espressione di questo tipo è un numero razionale positivo a / b. Ogni numero razionale positivo può essere rappresentato da una frazione egiziana.

Sfida:

Scrivi la funzione più breve che restituirà i valori di tutti i denominatori per l' insieme più piccolo di frazioni unitarie che si sommano a una determinata frazione.

Regole / Vincoli:

  • L'input sarà di due valori interi positivi.
    • Questo può essere su STDIN, argv, separati da virgole, lo spazio delimitato, o qualsiasi altro metodo che preferite.
  • Il primo valore di input deve essere il numeratore e il secondo valore di input il denominatore.
  • Il primo valore di input deve essere inferiore al secondo.
  • L'output può includere un valore / i che supera i limiti di memoria del sistema / lingua (RAM, MAX_INT o qualsiasi altro codice / vincolo di sistema esistente). Se ciò accade, è sufficiente troncare il risultato al valore più alto possibile e notare che in qualche modo (cioè ...).
  • L'output dovrebbe essere in grado di gestire un valore di denominatore fino ad almeno 2.147.483.647 (2 31 -1, con segno a 32 bit int).
    • Un valore più alto ( long, ecc.) È perfettamente accettabile.
  • L'output deve essere un elenco di tutti i valori dei denominatori dell'insieme più piccolo di frazioni di unità rilevate (o delle frazioni stesse, ovvero 1/2).
  • L'output deve essere ordinato in ordine crescente in base al valore del denominatore (decrescente in base al valore della frazione).
  • L'output può essere delimitato in qualsiasi modo tu voglia, ma ci deve essere un carattere tra in modo da differenziare un valore dal successivo.
  • Questo è il golf del codice, quindi vince la soluzione più breve.

exmaples:

  • Ingresso 1:

    43, 48

  • Uscita 1:

    2, 3, 16

  • Ingresso 2:

    8/11

  • Uscita 2:

    1/2 1/6 1/22 1/66

  • Ingresso 3:

    5 121

  • Uscita 3:

    33 121 363


Input / Output 2 dovrebbe essere 8, 11e 2, 6, 22, 66giusto?
mellamokb,

2
Un possibile suggerimento, per rimuovere l'ambiguità, sarebbe quello di richiedere il più piccolo insieme di frazioni unitarie con il minimo denominatore finale. Ad esempio, 1/2 1/6 1/22 1/66sarebbe preferibile 1/2 1/5 1/37 1/4070per l'input 8/11.
primo

2
Suggerisco di aggiungere 5/121 = 1/33+1/121+1/363ai casi di test. Tutti i programmi golosi (incluso il mio) danno 5 frazioni per questo. Esempio tratto da Wikipedia .
ugoren,

1
@primo Penso che se ci sono più minimi, qualunque sia possibile trovare sarebbe accettabile. Se un algoritmo può essere scritto con meno caratteri di conseguenza, non vorrei ostacolare quella soluzione.
Gaffi,

1
Ho fatto +1 da quando in realtà ho imparato a conoscere le frazioni egiziane in un corso di Storia della matematica (e ho dovuto fare matematica con loro, oltre a trovare somme frazionarie come questo problema). Una sfida piacevole e creativa.
mbomb007,

Risposte:


6

Lisp comune, 137 caratteri

(defun z(n)(labels((i(n s r)(cond((= n 0)r)((< n(/ 1 s))(i n(ceiling(/ 1 n))r))(t(i(- n(/ 1 s))(1+ s)(cons s r))))))(reverse(i n 2'()))))

(z 43/48) -> (2 3 16)

(z 8/11) -> (2 5 37 4070)

(z 5/121) -> (25 757 763309 873960180913 1527612795642093418846225)

Non c'è bisogno di preoccuparsi di numeri enormi o di gestire la notazione frazionata!


(defun z (n) (labels ((i (nsr) (cond ((= n 0) r) ((<n (/ 1 s)) (in (soffitto (/ 1 n)) r)) (t ( i (- n (/ 1 s)) (1+ s) (cons sr))))))) (reverse (in 2 '())))) (z 43/48) Mostra non provocare in tio ... Cosa devo usare per stampare il risultato?
RosLuP,

1
(stampa (z 103/333)) restituisce un elenco di 5 numeri ma esiste un elenco di 4 numeri come: 1 / 4,1 / 18,1 / 333,1 / 1332. Quindi la funzione sopra non restituisce il minimo.
RosLuP,

8

Python 2, 169 167 caratteri

x,y=input()
def R(n,a,b):
 if n<2:return[b/a][b%a:]
 for m in range((b+a-1)/a,b*n/a):
  L=R(n-1,a*m-b,m*b)
  if L:return[m]+L
n=L=0
while not L:n+=1;L=R(n,x,y)
print L

Accetta argomenti separati da virgole su stdin e stampa un elenco Python su stdout.

$ echo 8,11 | ./egypt.py 
[2, 5, 37, 4070]

2
1. Penso che puoi salvare due caratteri usando la scheda al secondo livello di rientro. 2. Lo script non indica il troncamento a causa del superamento dei limiti di memoria del sistema.
breadbox

In Tio Il tuo codice non è più disponibile per 103/45533
RosLuP,

Invece in Ideone il tuo codice va in errore di runtime per lo stesso input 103.45533: Errore di runtime #stdin #stdout #stderr 0.89s 99264KB
RosLuP

4

PHP 82 byte

<?for(fscanf(STDIN,"%d%d",$a,$b);$a;)++$i<$b/$a||printf("$i ",$a=$a*$i-$b,$b*=$i);

Ciò potrebbe essere ridotto, ma il numeratore e il denominatore attuali devono essere mantenuti come numeri interi per evitare errori di arrotondamento in virgola mobile (anziché mantenere la frazione corrente).

Esempio di utilizzo:

$ echo 43 48 | php egyptian-fraction.php
2 3 16
$ echo 8 11 | php egyptian-fraction.php
2 5 37 4070

Operatore virgola emulato come argomenti inutili per printf? Dovrei salvare questo trucco da qualche parte.
Konrad Borowski il

1
Sono abbastanza sicuro che si tratti di un avido algoritmo , quindi non fornirà sempre il più piccolo insieme di frazioni. Se lo esegui con input come 5 121o 31 311, darà la risposta sbagliata (dopo molto tempo).
GRC

@grc 31/311 -> {a [1] -> 11, a [2] -> 115, a [3] -> 13570, a [4] -> 46422970}
Dr. belisarius,

4

C, 163 177 caratteri

6/6 : finalmente il programma ora gestisce correttamente il troncamento in tutti i casi. Ci sono voluti molti più caratteri di quanto sperassi, ma ne è valsa la pena. Il programma dovrebbe aderire al 100% ai requisiti del problema ora.

d[99],c,z;
r(p,q,n,i){for(c=n+q%p<2,i=q/p;c?d[c++]=i,0:++i<n*q/p;)q>~0U/2/i?c=2:r(i*p-q,i*q,n-1);}
main(a,b){for(scanf("%d%d",&a,&b);!c;r(a,b,++z));while(--c)printf("%d\n",d[c]);}

Il programma prende il numeratore e il denominatore sull'input standard. I denominatori sono stampati sull'output standard, uno per riga. L'output troncato viene indicato stampando un denominatore zero alla fine dell'elenco:

$ ./a.out
2020 2064
2
3
7
402
242004

$ ./a.out
6745 7604
2
3
19
937
1007747
0

I denominatori nel secondo esempio sono pari a 95485142815/107645519046, che differisce da 6745/7604 per circa 1e-14.


Ancora una volta, penso che questo sia un avido algoritmo.
GRC

Il ciclo più esterno esplora tutte le possibili risposte di N denominatori prima di iniziare a testare le risposte di N + 1 denominatori. Puoi chiamarlo avido, suppongo, ma credo che soddisfi il problema dichiarato.
breadbox,

Scusa, lo riprendo. Non segue la soluzione avida, ma ho scoperto che non è completamente accurato per alcuni input ( 31 311ad esempio).
GRC

31 311trabocca, ma il programma non riesce a contrassegnarlo.
breadbox

3

Python, 61 caratteri

Input da STDIN, separato da virgola.
Uscita su STDOUT, newline separato.
Non restituisce sempre la rappresentazione più breve (ad es. Per 5/121).

a,b=input()
while a:
    i=(b+a-1)/a
    print"1/%d"%i
    a,b=a*i-b,i*b

I personaggi vengono contati senza nuove righe non necessarie (ovvero unendo tutte le linee all'interno whiledell'uso ;).
La frazione è a/b.
iè b/aarrotondato, quindi lo so 1/i <= a/b.
Dopo la stampa 1/i, lo sostituisco a/bcon a/b - 1/i, che è(a*i-b)/(i*b) .


Voglio votare questo, dato che è così piccolo, ma manca solo quel pezzo!
Gaffi,

2
Voglio sistemare questo pezzo, ma poi non sarà così piccolo ... Ho la sensazione che reinventerò la soluzione di Keith Randall.
ugoren,

2

C, 94 byte

n,d,i;main(){scanf("%i%i",&n,&d);for(i=1;n>0&++i>0;){if(n*i>=d)printf("%i ",i),n=n*i-d,d*=i;}}

Provalo online

modifica: nei commenti è stata pubblicata una versione più breve del codice, quindi l'ho sostituito. Grazie!


2
Ciao e benvenuto nel sito! Questa è una competizione di code-golf , quindi l'obiettivo è rendere il tuo codice il più breve possibile . Sembra che ci siano molte cose che potresti fare per abbreviare il tuo codice. Ad esempio, è possibile rimuovere dalla risposta tutti gli spazi bianchi non necessari.
DJMcMayhem

@DJMcMayhem Grazie signore, capito e fatto.
う ち わ 密 か il

Ciao, benvenuto in PPCG! Potresti forse aggiungere un link TryItOnline con il codice di test per i casi di test nella sfida? Inoltre, alcune cose che potresti golf: for(i=2;n>0&&i>0;i++)possono essere for(i=1;n>0&++i>0;); le parentesi del for-loop possono essere rimosse (perché ha solo l' ifinterno); d=d*i;può essere d*=i;; e io non sono del tutto sicuro, ma penso che #include <stdio.h>può essere senza spazi: #include<stdio.h>. Oh, e potrebbe essere interessante leggere Suggerimenti per giocare a golf in C e Suggerimenti per giocare a golf in <tutte le lingue>
Kevin Cruijssen,

@KevinCruijssen Grazie per i suggerimenti.
う ち わ 密 か,



0

AXIOM, 753 byte

L==>List FRAC INT
macro  M(q)==if c<m or(c=m and m<999 and reduce(max,map(denom,q))<xv)then(m:=c;a:=q;xv:=reduce(max,map(denom,a)))
f(x,n)==(y:=x;a:L:=[];c:=0;q:=denom x;q:=q^4;for i in n.. repeat((c:=c+1)>50=>(a:=[];break);1/i>y=>1;member?(1/i,a)=>1;a:=concat(a,1/i);(y:=y-1/i)=0=>break;numer(y)=1 and ~member?(y,a)=>(a:=concat(a,y);break);(i:=floor(1/y))>q=>(a:=[];break));a)
h(x:FRAC INT):L==(a:L:=[];x>1=>a;numer(x)=1=>[x];n:=max(2,floor(1/x));xv:=m:=999;d:=denom x;zd:=divisors d;z:=copy zd;for i in 2..30 repeat z:=concat(z,i*zd);d:=min(10*d,n+9*m);for i in n..d repeat((c:=maxIndex(b:=f(x,i)))=0=>1;c>m+1=>1;M(b);v:=reduce(+,delete(b,1));for j in z repeat((c:=1+maxIndex(q:=f(v,j)))=1=>1;member?(b.1,q)=>1;q:=concat(b.1,q);M(q)));reverse(sort a))

L'idea sarebbe quella di applicare l'algoritmo goloso con diversi punti iniziali e salvare l'elenco che ha una lunghezza minima. Ma non sempre troverebbe la soluzione minima con meno definito: "la matrice A sarà inferiore alla matrice B se e solo se A ha pochi elementi di B, o se il numero di elementi di A è uguale al numero di elementi di B , di A è minore di B se l'elemento più piccolo di A è maggiore come numero, rispetto all'elemento più piccolo di B ". Ungolf e prova

-- this would be the "Greedy Algorithm"
fracR(x,n)==
   y:=x;a:L:=[];c:=0;q:=denom x;q:=q^4
   for i in n.. repeat
      (c:=c+1)>50   =>(a:=[];break)
      1/i>y         =>1
      member?(1/i,a)=>1
      a:=concat(a,1/i)
      (y:=y-1/i)=0  =>break
      numer(y)=1 and ~member?(y,a)=>(a:=concat(a,y);break)
      (i:=floor(1/y))>q           =>(a:=[];break)
   a

-- Return one List a=[1/x1,...,1/xn] with xn PI and x=r/s=reduce(+,a) or return [] for fail
Frazione2SommaReciproci(x:FRAC INT):L==
    a:L:=[]
    x>1       =>a
    numer(x)=1=>[x]
    n:=max(2,floor(1/x));xv:=m:=999;d:=denom x;zd:=divisors d;z:=copy zd
    for i in 2..30 repeat z:=concat(z,i*zd)
    d:=min(10*d,n+9*m) 
    for i in n..d repeat
        (c:=maxIndex(b:=fracR(x,i)))=0=>1 
        c>m+1                         =>1
        M(b)
        v:=reduce(+,delete(b,1))
        for j in z repeat
              (c:=1+maxIndex(q:=fracR(v,j)))=1=>1
              member?(b.1,q)                  =>1
              q:=concat(b.1,q)
              M(q) 
    reverse(sort a)

(7) -> [[i,h(i)] for i in [1/23,2/23,43/48,8/11,5/121,2020/2064,6745/7604,77/79,732/733]]
   (7)
      1   1      2   1  1      43  1 1  1      8  1 1  1  1
   [[--,[--]], [--,[--,---]], [--,[-,-,--]], [--,[-,-,--,--]],
     23  23     23  12 276     48  2 3 16     11  2 6 22 66
      5    1  1   1      505  1 1 1  1    1
    [---,[--,---,---]], [---,[-,-,-,---,----]],
     121  33 121 363     516  2 3 7 602 1204
     6745  1 1  1  1    1      1       77  1 1 1  1  1   1
    [----,[-,-,--,---,-----,------]], [--,[-,-,-,--,---,---]],
     7604  2 3 19 950 72238 570300     79  2 3 8 79 474 632
     732  1 1 1  1   1    1     1
    [---,[-,-,-,--,----,-----,-----]]]
     733  2 3 7 45 7330 20524 26388
                                                      Type: List List Any
       Time: 0.07 (IN) + 200.50 (EV) + 0.03 (OT) + 9.28 (GC) = 209.88 sec
(8) -> h(124547787/123456789456123456)
   (8)
        1             1                         1
   [---------, ---------------, ---------------------------------,
    991247326  140441667310032  613970685539400439432280360548704
                                     1
    -------------------------------------------------------------------]
    3855153765004125533560441957890277453240310786542602992016409976384
                                              Type: List Fraction Integer
                     Time: 17.73 (EV) + 0.02 (OT) + 1.08 (GC) = 18.83 sec
(9) -> h(27538/27539)
         1 1 1  1  1    1      1        1
   (9)  [-,-,-,--,---,-----,------,----------]
         2 3 7 52 225 10332 826170 1100871525
                                              Type: List Fraction Integer
                     Time: 0.02 (IN) + 28.08 (EV) + 1.28 (GC) = 29.38 sec

riferimenti e numeri da: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fractions/egyptian.html

per aggiungere qualcosa, questo sotto sarebbe quello ottimizzato per trovare la frazione di lunghezza minima che ha il massimo denominatore in meno (e non ottimizzato per la lunghezza)

L==>List FRAC INT

-- this would be the "Greedy Algorithm"
fracR(x,n)==
   y:=x;a:L:=[];c:=0;q:=denom x;q:=q^20
   for i in n.. repeat
      (c:=c+1)>1000  =>(a:=[];break)
      1/i>y          =>1
      member?(1/i,a) =>1
      a:=concat(a,1/i)
      (y:=y-1/i)=0  =>break
      numer(y)=1 and ~member?(y,a)=>(a:=concat(a,y);break)
      (i:=floor(1/y))>q           =>(a:=[];break)
   a

-- Return one List a=[1/x1,...,1/xn] with xn PI and x=r/s=reduce(+,a) or return [] for fail
Frazione2SommaReciproci(x:FRAC INT):L==
    a:L:=[]
    x>1       =>a
    numer(x)=1=>[x]
    n:=max(2,floor(1/x));xv:=m:=999;d:=denom x;zd:=divisors d;z:=copy zd; 
    w1:= if d>1.e10 then 1000 else 300; w2:= if d>1.e10 then 1000 else if d>1.e7 then 600 else if d>1.e5 then 500 else if d>1.e3 then 400 else 100;
    for i in 2..w1 repeat(mt:=(i*zd)::List PI;mv:=[yy for yy in mt|yy>=n];z:=sort(removeDuplicates(concat(z,mv)));#z>w2=>break)
    for i in z repeat
        (c:=maxIndex(b:=fracR(x,i)))=0=>1 
        c>m+1                         =>1
        if c<m or(c=m and m<999 and reduce(max,map(denom,b))<xv)then(m:=c;a:=b;xv:=reduce(max,map(denom,a)))
        v:=reduce(+,delete(b,1))
        for j in z repeat
              (c:=1+maxIndex(q:=fracR(v,j)))=1=>1
              member?(b.1,q)                  =>1
              q:=concat(b.1,q)
              if c<m or(c=m and m<999 and reduce(max,map(denom,q))<xv)then(m:=c;a:=q;xv:=reduce(max,map(denom,a)))
    reverse(sort a)

i risultati:

(5) -> [[i,Frazione2SommaReciproci(i)] for i in [1/23,2/23,43/48,8/11,5/121,2020/2064,6745/7604,77/79,732/733]]
   (5)
      1   1      2   1  1      43  1 1  1      8  1 1  1  1
   [[--,[--]], [--,[--,---]], [--,[-,-,--]], [--,[-,-,--,--]],
     23  23     23  12 276     48  2 3 16     11  2 6 22 66
      5    1  1   1      505  1 1 1  1    1
    [---,[--,---,---]], [---,[-,-,-,---,----]],
     121  33 121 363     516  2 3 7 602 1204
     6745  1 1  1  1    1      1       77  1 1 1  1  1   1
    [----,[-,-,--,---,-----,------]], [--,[-,-,-,--,---,---]],
     7604  2 3 19 950 72238 570300     79  2 3 8 79 474 632
     732  1 1 1  1   1    1     1
    [---,[-,-,-,--,----,-----,-----]]]
     733  2 3 7 45 7330 20524 26388
                                                      Type: List List Any
                     Time: 0.08 (IN) + 53.45 (EV) + 3.03 (GC) = 56.57 sec
(6) -> Frazione2SommaReciproci(124547787/123456789456123456)
   (6)
        1            1               1                  1
   [---------, ------------, ----------------, -------------------,
    994074172  347757767307  2764751529594496  1142210063701888512
                      1
    -------------------------------------]
    2531144929865351036156388364636113408
                                              Type: List Fraction Integer
         Time: 0.15 (IN) + 78.30 (EV) + 0.02 (OT) + 5.28 (GC) = 83.75 sec
(7) -> Frazione2SommaReciproci(27538/27539)
         1 1 1  1   1     1       1       1
   (7)  [-,-,-,--,----,-------,-------,-------]
         2 3 7 43 1935 3717765 5204871 7105062
                                              Type: List Fraction Integer
                     Time: 0.05 (IN) + 45.43 (EV) + 2.42 (GC) = 47.90 sec

Sembra che molti buoni denominatori abbiano come divisori fattori il denominatore della frazione di input.


0

C, 85 78 byte

Migliorato da @ceilingcat , 78 byte:

n,d;main(i){for(scanf("%i%i",&n,&d);n;n*++i/d&&printf("%i ",i,d*=i,n=n*i-d));}

Provalo online!


La mia risposta originale, 85 byte:

n,d,i=1;main(){for(scanf("%i%i",&n,&d);n&&++i;n*i/d?printf("%i ",i),n=n*i-d,d*=i:0);}

Provalo online!

Parte del merito dovrebbe essere di Jonathan Frech , che ha scritto questa soluzione a 94 byte su cui ho migliorato.


0

APL (NARS), 2502 byte

fdn←{1∧÷⍵}⋄fnm←{1∧⍵}⋄ffl←{m←⎕ct⋄⎕ct←0⋄r←⌊⍵⋄⎕ct←m⋄r}⋄divisori←{a[⍋a←{∪×/¨{0=≢⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}π⍵}⍵]}

r←frRF w;x;y;c;q;i;j
(x i)←w⋄i-←1⋄y←x⋄r←⍬⋄c←0⋄q←fdn x⋄q←q*20
i+←1
→4×⍳∼1000<c+←1⋄→6
j←÷i⋄→2×⍳j>y⋄→2×⍳(⊂j)∊r⋄r←r,(⊂j)⋄y←y-j⋄→0×⍳y=0⋄→5×⍳1≠fnm y⋄→5×⍳(⊂y)∊r⋄r←r,⊂y⋄→0
→2×⍳∼q<i←ffl ÷y
r←⍬

r←fr2SumF x;n;xv;m;d;zd;z;i;b;c;t;v;j;k;q;w1;w2;t;b1
z←r←⍬⋄→0×⍳1≤ffl x
:if 1=fnm x⋄r←,⊂x⋄→0⋄:endif
n←2⌈ffl÷x⋄xv←m←999⋄d←fdn x⋄zd←divisori d
w1←1000⋄w2←50⋄:if d>1.e10⋄w2←700⋄:elseif d>1.e7⋄w2←600⋄:elseif d>1.e5⋄w2←500⋄:elseif d>1.e3⋄w2←400⋄:elseif d>1.e2⋄w2←100⋄:endif
:for i :in ⍳w1⋄z←∪z∪k/⍨{⍵≥n}¨k←i×zd⋄:if w2<≢z⋄:leave⋄:endif⋄:endfor
z←∪z∪zd⋄z←z[⍋z]
:for i :in z
    :if 0=c←≢b←frRF x i ⋄:continue⋄:endif
    :if      c>m+1      ⋄:continue⋄:endif
    :if      c<m        ⋄m←c⋄r←b⋄xv←⌈/fdn¨b
    :elseif (c=m)∧(m<999)
         :if xv>t←⌈/fdn¨b⋄m←c⋄r←b⋄xv←t⋄:endif
    :endif
    :if c≤2⋄:continue⋄:endif
    v←↑+/1↓b⋄b1←(⊂↑b)
    :for j :in z
       :if 1=c←1+≢q←frRF v j⋄:continue⋄:endif
       :if        b1∊q      ⋄:continue⋄:endif
       q←b1,q
       :if  c<m⋄m←c⋄r←q     ⋄xv←⌈/fdn¨q
       :elseif (c=m)∧(m<999)
           :if xv>t←⌈/fdn¨q⋄m←c⋄r←q⋄xv←t⋄:endif
       :endif
    :endfor
:endfor
→0×⍳1≥≢r⋄r←r[⍋fdn¨r]

Traslazione dal codice AXIOM per questo problema, in APL, utilizzando per la prima volta (per me) il tipo di frazione (ovvero bignum ...).

103r233 indica la frazione 103/233. Test:

  ⎕fmt fr2SumF 1r23
┌1────┐
│ 1r23│
└~────┘
  ⎕fmt fr2SumF 2r23
┌2──────────┐
│ 1r12 1r276│
└~──────────┘
  ⎕fmt fr2SumF 43r48
┌3────────────┐
│ 1r2 1r3 1r16│
└~────────────┘
  fr2SumF 8r11
1r2 1r6 1r22 1r66 
  fr2SumF 5r121
1r33 1r121 1r363 
  fr2SumF 2020r2064
1r2 1r3 1r7 1r602 1r1204 
  fr2SumF 6745r7604
1r2 1r3 1r19 1r950 1r72238 1r570300 
  fr2SumF 77r79
1r2 1r3 1r8 1r79 1r474 1r632 
  fr2SumF 732r733
1r2 1r3 1r7 1r45 1r7330 1r20524 1r26388 
  fr2SumF 27538r27539
1r2 1r3 1r7 1r43 1r1935 1r3717765 1r5204871 1r7105062 
  fr2SumF 124547787r123456789456123456
1r994074172 1r347757767307 1r2764751529594496 1r1142210063701888512 
  1r2531144929865351036156388364636113408 
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.