Program identyfikacji kształtu


25

Twoim zadaniem jest zbudowanie programu identyfikującego kształt danych wejściowych. Kształty, które można zidentyfikować, mogą być dowolnymi z poniższych:

Plac

Aby zostać zidentyfikowanym jako kwadrat, źródło musi mieć wiersze o tej samej długości i taką samą liczbę wierszy, co znaki w wierszu (z wyłączeniem znaków nowej linii). Opcjonalny znak nowej linii jest dopuszczalny.

$_='
$_="
$_"'
;say

Prostokąt

Aby zostać zidentyfikowanym jako prostokąt, źródło musi mieć linie o jednakowej długości, ale liczba linii nie odpowiada liczbie znaków w linii (z wyłączeniem znaków nowej linii). Opcjonalny znak nowej linii jest dopuszczalny. Może to być pozioma lub pionowa.

$_=
"no
t a
squ
are
";#

$_="but it
is still a
consistent
shape!";##

Trójkąt

Aby zostać zidentyfikowanym jako trójkąt, źródło musi zaczynać się od jednego znaku, a każda kolejna linia musi mieć jeden dodatkowy znak (w tym ostatni) lub po pierwszej linii każda kolejna linia powinna mieć jeden znak mniej do ostatniej, która ma tylko jeden.

$
_=
"So
this
"."".
shape;

$_="or
even,
this
way
!!
"

Bałagan

Wszystko, co nie ma spójnego formatu zgodnie z powyższym, musi zostać zidentyfikowane jako bałagan.

Zasady

  • Możesz zwrócić dowolne cztery spójne wartości do wydrukowania, aby zidentyfikować każdy kształt.
  • Twój kod źródłowy musi również przestrzegać jednego z powyższych kształtów (nie, nie bałagan).
  • Pojedynczy znak nowej linii w twoim źródle jest dopuszczalny.
  • Możesz założyć, że dane wejściowe nie zawierają żadnych pustych linii (w tym nowych linii), nie są puste i nie składają się tylko z nowych linii.
  • Wszystkie kształty muszą mieć wysokość i szerokość> = 2, w przeciwnym razie określa się to jako bałagan.
  • Standardowe luki są zabronione.
  • Najkrótsze rozwiązanie w bajtach w każdym języku wygrywa.

„Twój kod źródłowy musi również przylegać do jednego z powyższych kształtów”. Czy to znaczy, że jeden podkład jest w porządku?
tsh

1
@ tshAll shapes must have a height and width of >= 2.
TFeld

1
Dane wejściowe mogą być tablicą? na przykład kwadrat ['abc','cfd','fgh']?
Luis felipe De jesus Munoz

1
@recursive zaktualizowane, dziękuję!
Dom Hastings

3
Mówisz mi, że mój kod źródłowy nie może być bałaganem? Dlaczego nie?!?!
NH.

Odpowiedzi:



7

Brachylog , 45 bajtów

lᵐ{≥₁|≤₁}o{l>1&t>1&}↰₃
lg,?=∧1w|=∧2w|t⟦₁≡?∧3w

Wypróbuj online!

Kod jest prostokątem (pomimo sposobu, w jaki wyświetla się na moim ekranie). Wyjścia: 1 dla kwadratu, 2 dla prostokąta, 3 dla trójkąta i nic dla bałaganu


Wyjaśnienie:

lᵐ{≥₁|≤₁}o{l>1&t>1&}↰₃
lg,?=∧1w|=∧2w|t⟦₁≡?∧3w

lᵐ                        Get the length of each string
  {     }                 Verify 
   ≥₁                     The list is non-increasing
     |                    or...
      ≤₁                  The list is non-decreasing
         o                Sort it to be non-decreasing
          {        }      Verify
           l>1            The number of lines is greater than 1
              &           and...
               t>1&       The longest line is longer than 1 character
                    ↰₃    Call the following

lg,?                      Join the number of lines with the line lengths
    =∧1w                  If they are all equal, print 1 (Square)
         |=∧2w            Or if just the line lengths are equal, print 2 (Rectangle)
              |t⟦₁         Or if the range [1, 2, ... <longest line length>]
                  ≡?       Is the list of lengths
                    ∧3w    Print 3 (triangle)
                           Otherwise print nothing (mess)

7

Java 10, 231 221 219 217 213 211 207 bajtów

s->{var a=s.split("\n");int r=a.length,l=a[0].length(),R=0,i=1,L,D;if(r>1){for(L=a[1].length(),D=L-l;++
i<r;R=L-a[i-1].length()!=D?1:R)L=a[i].length();R=R<1?D==0?r==l?1:2:D>-2&D<2&(l<2|L<2)?3:0:0;}return R;}

Funkcja sama w sobie jest prostokątem.
1= Kwadraty; 2= Prostokąty; 3= Trójkąty; 0= Bałagan

-14 bajtów dzięki @ OlivierGrégoire .

Wyjaśnienie:

Wypróbuj online.

s->{                        // Method with String parameter and integer return-type
  var a=s.split("\n");      //  Input split by new-lines
  int r=a.length,           //  Amount of lines
      l=a[0].length(),      //  Length of the first line
      R=0,                  //  Result-integer, initially 0
      i=1,                  //  Index integer, starting at 1
      L,D;                  //  Temp integers
  if(r>1){                  //  If there are at least two lines:
    for(L=a[1].length(),    //   Set `L` to the length of the second line
        D=L-l;              //   And set `D` to the difference between the first two lines
        ++i<r;              //   Loop over the array
        ;                   //     After every iteration:
         R=L-a[i-1].length()//     If the difference between this and the previous line
          !=D?              //     is not equal to the difference of the first two lines:
           1                //      Set `R` to 1
          :                 //     Else:
           R)               //      Leave `R` the same
      L=a[i].length();      //    Set `L` to the length of the current line
  R=R<1?                    //   If `R` is still 0:
     D==0?                  //    And if `D` is also 0:
      r==l?                 //     And the amount of lines and length of each line is equal
       1                    //      It's a square, so set `R` to 1
      :                     //     Else:
       2                    //      It's a rectangle, so set `R` to 2
     :D>-2&D<2&             //    Else-if `D` is either 1 or -1,
      (l<2|L<2)?            //    and either `l` or `L` is 1:
       3                    //     It's a triangle, so set `R` to 3
    :0:0;}                  //   In all other cases it's a mess, so set `R` to 0
  return R;}                //  Return the result `R`

1
Naprawiono dla 221 bajtów: s->{var a=s.split("\n");int S=a.length,l=a[0].length(),L,D,b=0,i=1;if(S<2)return 0;for(L=a[1].length(),D=L-l; b<1&++i<S;)if((L=a[i].length())-a[i-1].length()!=D)b=1;return b<1?D==0?S==l?1:2:D==-1|D==1?l==1|L==1?3:0:0:0;}(podwójne spacja po var, podział linii po D=L-l;.
Olivier Grégoire

@ OlivierGrégoire Thanks. I grałem w golfa jeszcze dwa bajty, zmieniając D==-1|D==1na D>-2|D<2. Ten i ten l==1|L==1może być bardziej golfowy przy niektórych operacjach bitowych, ale tak naprawdę to nie moja wiedza.
Kevin Cruijssen

1
207 bajtów: s->{var a=s.split("\n");int r=a.length,l=a[0].length(),L,D,b=0,i=1;if(r>1){for(L=a[1].length(),D=L-l;++ i<r;b=L-a[i-1].length()!=D?1:b)L=a[i].length();b=b<1?D==0?r==l?1:2:D>-2&D<2&(l<2|L<2)?3:0:0;}return b;}(przerwa po D=L-l;++). Nadal można grać w golfa, łącząc pętlę i oświadczenie w jednym, ale nie wiem, jak teraz.
Olivier Grégoire

6

Python 2 , 129 114 109 107 113 bajtów

l=map(len,input().split('\n'));m=len(
l);r=range(1,m+1);print[[1],0,r,r[::-
1],[m]*m,0,[max(l)]*m,l].index(l)%7/2

Wypróbuj online!


Wydruki

  • 0 = Mess
  • 1 = Triangle
  • 2 = Square
  • 3 = Rectangle

@KevinCruijssen Dzięki, powinno być teraz naprawione
TFeld

6

Galaretka , 32 27 bajtów

,U⁼€JẸ,E;SƲ$
ZL«L’aL€Ç$æAƝ

Wypróbuj online!

Teraz pobiera dane wejściowe na liście wierszy i przełącza >1×za ’apomocą i używa SƲpo L€ zamiast FLƲƊ. To pozwoliło mi skondensować się w dwóch liniach i w sumie zaoszczędziłem 5 bajtów. Poniższe wartości są takie same jak poprzednio.

[0.0, 0.0]= Bałagan
[0.0, 1.5707963267948966]= Prostokąt
[0.0, 0.7853981633974483]= Kwadrat
[1.5707963267948966, 0.0]= Trójkąt


ZL«Lpobiera minimalną wysokość i szerokość i odejmuje 1. Çwywołuje drugi link, a na końcu, jeśli wejście jest pojedynczą linią, wynik Çlogicznie ANDuje się z poprzednim numerem, jeśli jest tylko jedna linia, wyjście będzie [0.0, 0.0].

W drugim linku: ,Udaje listę długości linii w połączeniu z jego odwrotnością. Jjest range(number of lines)i ⁼€sprawdza, czy każdy z nich jest równy wynikowi J. (Dowolny) daje 1, jeśli wejście jest trójkątem.

E sprawdza, czy wszystkie długości linii są równe (prostokąt / kwadrat).

SƲza pomocą, $aby zgrupować je w pojedynczą monadę, sprawdza, czy całkowita liczba znaków jest liczbą kwadratową.

Tak więc na końcu drugiego łącza mamy miejsce, w [[a,b],c]którym znajduje się każda liczba, 0lub 1wskazujemy, czy wejście jest odpowiednio trójkątem, prostokątem i liczbą kwadratową znaków.

Jednak kwadratowa liczba elementów nie oznacza, że ​​dane wejściowe są kwadratem, ponieważ takie dane są nieuporządkowane

a3.
4

ma kwadratową liczbę elementów, ale nie jest kwadratem.

W tym miejscu æApojawia się (arctan2). 0æA0== 0æA1== 0. Innymi słowy, jeśli wejście ma kwadratową liczbę elementów, ale nie jest prostokątem, to nie jest kwadratem. Istnieją z pewnością bardziej wyraźne sposoby na zrobienie tego, ale co to ma znaczenie, gdy mamy bajty do przemyślenia i jesteśmy uprawnieni do spójnego, arbitralnego wyniku.

Zauważ, że poprzednio używałem æA/zamiast æAƝ(i ,zamiast ;w drugim łączu), ale poprzednia metoda rozróżnia trójkąty, które mają kwadratową liczbę elementów, i te, które tego nie robią, ale oczywiście powinny być liczone jako to samo.


Patrzyłem na liczby, myśląc, że wydają się niejasno znajome ...
Dom Hastings

@DomHastings Haha. Miałem problem z odróżnieniem kwadratów od mes-liczba-elementów-elementów i arctan2było dokładnie tym, czego potrzebowałem.
dylnan

1
Zabawne, że nie sądzę, że byłoby to krótsze, gdyby nie było ograniczeń źródłowych
dylnan

... Czy na pewno jest to poprawne? Ponieważ nowa linia w galarecie ma wartość 0x7F, a nie 0x0A.
user202729,

@DomHastings Czy to jest ważne? (patrz powód powyżej)
202729

4

Java 10, 274 323 298 229 bajtów

Pierwsze przesłanie trójkąta.

s
->
{  
var 
a=s. 
split 
("\n");
int i,l=
a.length,
c,f=a[0]. 
length(),r=
l<2||f<2&a[1
].length()<2?
0:f==l?7:5;var
b=f==1;for(i=1;
i<l;){c=a[i++]. 
length();r&=c!=f?
4:7;r&=(b&c!=f+1)|
(!b&c!=f-1)?3:7;f=c
;}return r;}        

0 Bałagan

1 Prostokąt

3 Plac

4 Trójkąt

Wypróbuj online tutaj .

Wielokrotnie edytowany, by jeszcze bardziej golf.

Oczywiście mógłbym zaoszczędzić wiele bajtów, zmieniając to również w prostokąt ( 281 267 259 200 bajtów, patrz tutaj ).

Wynik identyfikacji jest manipulowany przy użyciu bitowego AND, co daje maskę bitów w następujący sposób:

1        1      1
triangle square rectangle

Wersja bez golfa:

s -> {
    var lines = s.split("\n"); // split input into individual lines
    int i, // counter for the for loop
    numLines = lines.length, // number of lines
    current, // length of the current line
    previous = lines[0].length(), // length of the previous line
    result = numLines < 2 // result of the identification process; if there are less than two lines
    || previous < 2 & lines[1].length() < 2 // or the first two lines are both shorter than 2
    ? 0 : previous == numLines ? 7 : 5; // it's a mess, otherwise it might be a square if the length of the first line matches the number of lines
    var ascending = previous == 1; // determines whether a triangle is in ascending or descending order
    for(i = 1; i < numLines; ) { // iterate over all lines
         current = lines[i++].length(); // store the current line's length
        result &= current != previous ? 4 : 7; // check if it's not a rectangle or a square
        result &= (ascending & current != previous+1)|(!ascending & current != previous-1) ? 3 : 7; // if the current line is not one longer (ascending) or shorter (descending) than the previous line, it's not a triangle
        previous = current; // move to the next line
    }
    return result; // return the result
}

1
Witamy w PPCG!
Steadybox

Brawo dla trójkątów! Dzięki!
Dom Hastings

Cześć, witamy w PPCG! Świetna pierwsza odpowiedź. Próbowałem również uczynić moją odpowiedź trójkątem, ale kosztowałoby to zbyt wiele bajtów w porównaniu do prostokąta, a niektóre słowa kluczowe były również trochę za długie w mojej początkowej odpowiedzi. :) Świetna odpowiedź, +1 ode mnie. I mogłem edytować swój post, aby dodać wyróżnianie do całego postu, dzięki czemu komentarze w wersji bez golfa są łatwiejsze do odczytania. Miłego pobytu!
Kevin Cruijssen

@KevinCruijssen Dzięki za głosowanie i edycję, wygląda teraz znacznie lepiej. Moja odpowiedź może zostać skrócona poprzez przekształcenie jej również w prostokąt o długości 281 bajtów. Ale gdzie jest w tym zabawa?
OOBalance,

3

JavaScript 125 bajtów

_=>(g=(l=_.split('\n').map(a=>a.length)).
length)<3?0:(r=l.reduce((a,b)=>a==b?a:0))
?r==g?2:1:l.reduce((a,b)=>++a==b?a:0)?3:0

0 = Mess
1 = Rectangle
2 = Square
3 = Triangle

fa=_=>(g=(l=_.split('\n').map(a=>a.length)).length)<3?0:(r=l.reduce((a,b)=>a==b?a:0))?r==g?2:1:l.reduce((a,b)=>++a==b?a:0)?3:0

var square = `asd
asd
asd`

var rectangle = `asd
asd
asd
asd
asd
asd`

var triangle = `asd
asdf
asdfg
asdfgh`

var mess = `asd
dasdasd
sd
dasasd`

console.log(fa(square), fa(rectangle), fa(triangle), fa(mess))


3
Liczba bajtów to 125 (łącznie z nowymi wierszami)
Herman L

Trójkąt powinien przejść do 1? nie 3456
l4m2

@ l4m2 co masz na myśli?
Luis felipe De jesus Munoz

2
trójkąt powinien zawsze zaczynać się od 1?
Luis felipe De jesus Munoz

3
Myślę, że @ l4m2 wskazuje, że trójkąt musi mieć tylko jeden znak w pierwszej lub ostatniej linii, w przeciwnym razie jest to „bałagan”.
Kudłaty


3

PHP, 195 205 bajtów

<?$a=$argv[1];$r=substr($a,-2,1)=="\n"?strrev($a):$a;foreach(explode("\n",$r)as$l){$s=strlen($l);$x[$s
]=++$i;$m=$i==$s?T:M;}$z=count($x);echo$i*$z>2?$z==1&&key($x)==$i?S:($z==1&&$i>2?R:($i==$z?$m:M)):M;?>

Trójkąt do góry nogami dodaje do tego drogie 56 bajtów!

Wyjścia to S, R, T, M

Zaoszczędził kilka bajtów dzięki Domowi Hastingsowi.

Wypróbuj online!

Naprawiono teraz kilka problemów ... Wytwarzają to testy.

$_="
$_="
$_""
;say

RESULT:S
=============
$_=
"no
t a
squ
are
";#

RESULT:R
=============
$
_=
"So
this
"."".
shape;

RESULT:T
=============
$_="or
even,
this
way
!!
"

RESULT:T
=============
as
smiley
asd
A

RESULT:M
=============
X

RESULT:M
=============
XX

RESULT:M
=============
cccc
a
aa
cccc

RESULT:M
=============

Pomija ?>powinien być po prostu w porządku
TSH

To wydaje się wracać Tdo cccc\na\naa\ncccc Wypróbuj online!
Dom Hastings

3

Perl 6 , 81 bajtów

{.lines>>.chars.&{($_==.[0],3)[2*(2>.max
)+($_ Z- .skip).&{.[0].abs+.Set*2+^2}]}}

Wypróbuj online!

Zwraca Truekwadrat, Falseprostokąt, 3trójkąt, Nilbałagan.


Bardzo dobrze, w szczególności czy miałbyś coś przeciwko rozpakowaniu $_ Z- .skip?
Phil H

3

Stax , 39 bajtów

L{%m~;:-c:u{hJchC; 
|mb1=-C;%a\sI^^P}M0

Uruchom i debuguj online!

Najkrótsza jak dotąd odpowiedź tylko ASCII.

0 - Bałagan
1 - Prostokąt
2 - Kwadrat
3 - Trójkąt

Wyjaśnienie

W rozwiązaniu wykorzystano następujący fakt: Jeśli coś jest wyraźnie drukowane podczas wykonywania programu, nie są generowane żadne dane wyjściowe. W przeciwnym razie górna część stosu na końcu wykonania jest domyślnie wyprowadzana.

L{%m~;:-c:u{hJchC;|mb1=-C;%a\sI^^P}M0
L                                        Collect all lines in an array
 {%m                                     Convert each line to its length
    ~;                                   Make a copy of the length array, put it on the input stack for later use
      :-                                 Difference between consecutive elements.
                                         If the original array has only one line, this will be an empty array
        c:u                              Are all elements in the array the same?
                                         Empty array returns false
           {                      }M0    If last test result is true, execute block
                                         If the block is not executed, or is cancelled in the middle, implicitly output 0
            hJ                           The first element of the difference array squared (*)
              chC                        Cancel if it is not 0 or 1
                 ;|m1=                   Shortest line length (**) is 1
                      -                  Test whether this is the same as (*)
                                         Includes two cases:
                                             a. (*) is 1, and (**) is 1, in which case it is a triangle
                                             b. (*) is 0, and (**) is not 1, in which case it is a square or a rectangle
                        C                Cancel if last test fails
                         ;%              Number of lines
                           a\            [Nr. of lines, (*)]
                             I           Get the 0-based index of (**) in the array
                                         0-> Square, 1->Triangle -1(not found) -> Rectangle
                              ^^P        Add 2 and print

3

Haskell , 113 107 103 101 bajtów

((#)=<<k).map k.lines;k=length;1#x=0;l#x|x==[1..l]
  ||x==[l,l-1..1]=3;l#x=k[1|z<-[l,x!!0],all(==z)x]

Wypróbuj online!

Zwraca 0, 1, 2 i 3 odpowiednio dla bałaganu, prostokąta, kwadratu i trójkąta.

Edycja: -2 bajty dzięki Lynn !


3

05AB1E , 35 29 27 bajtów

Zaoszczędzono 8 bajtów dzięki Magic Octopus Urn

DgV€g©ZU¥ÄP®Y
QP®ËJCXY‚1›P*

Wypróbuj online!

0= Bałagan
4= Trójkąt
1= Prostokąt
3= Kwadrat


Wygląda na to, że zawiedzie jakiś niechlujny kod: Wypróbuj online!
Dom Hastings

@DomHastings: Dzięki za złapanie tego. Myślałem, że golf jest trochę niepewny. Teraz powinno być dobrze.
Emigna

Wypróbuj online! - 19 bajtów - 1 (prostokąt), 2 (trójkąt), 5 (kwadrat) i 0 (bałagan) [Korzystanie z liczb binarnych]. Prawdopodobnie nie do zaakceptowania lol. gs€g©QP®¥ ÄP®1å&®ËJCmożna jednak dodać znak spacji i znak Cza 21.
Magic Octopus Urn

@MagicOctopusUrn: Nadal musi sprawdzać długość / wysokość> = 2, ale nadal powinien zapisywać bajty. Sprytna sztuczka budująca liczby wyjściowe z pliku binarnego!
Emigna

1
@MagicOctopusUrn: Użyłem twoich sztuczek delta i binarnych, aby zaoszczędzić trochę bajtów na mojej oryginalnej wersji. Prawdopodobnie mógłbym zaoszczędzić jeszcze kilka przepisywania.
Emigna

2

R , 101 bajtów

"if"(var(z<-nchar(y<-scan(,"",,,"
","")))==0,"if"(length(y)==z,1,2
),"if"(all(abs(diff(z))==1),3,4))

1 = kwadrat
2 = prostokąt
3 = trójkąt
4 = losowo

Kod nie może poradzić sobie z „NEGATIVE ACKNOWLEDGE” (U + 0015) lub kwadratem w powyższym kodzie. Ten bajt można przełączyć na coś innego, jeśli dane wejściowe zawierają ten bajt.

Wypróbuj online!


może mógłbyś użyć readLines()zamiast scan()?
Giuseppe,

@Giuseppe Can't / too noob to readLines to work
Vlo

Hmm, wygląda na to, że musisz określić file("stdin"), aby odczytać go z konsoli (zamiast kolejnych wierszy kodu). Oznacza to, że prawdopodobnie będzie mniej golfa. ach tak.
Giuseppe

2

Ślimaki, 29 bajtów

ada7A
.2,lr
?!(t.
rw~)z
.+~o~

Klucz wyjściowy:

  • 0 - Bałagan
  • 3 - Trójkąt
  • 6 - Prostokąt
  • 7 - kwadrat

Będzie to 23 bajty bez układu źródłowego:

zA
.2,dun!(t.rf~)z.+~o~

Zawsze chętnie bawiłem się tym językiem, odkąd przeczytałem pytanie, które go zrodziło!
Dom Hastings

1

Wolfram Language (Mathematica) , 119 bajtów

(x=StringLength/@#~StringSplit~"\n")/.{{1}->3,s~(t=Table)~{
s=Tr[1^x]}:>0,x[[1]]~t~s:>1,(r=Range@s)|Reverse@r:>2,_->3}&

Za pomocą Replace /. i dopasowywanie wzorców w liczbie znaków według linii.Replacewykopie pierwszy RHS dopasowanej reguły, więc kolejność polega na sprawdzeniu wprowadzenia 1 znaku, następnie kwadratach, prostokątach, trójkątach i przewróceniu mes.

kwadrat = 0, prostokąt = 1, trójkąt = 2, bałagan = 3

Wypróbuj online!


@DomHastings, jest naprawiony.
Kelly Lowder

1

Czerwony , 209 bajtów

func[s][c: copy[]foreach a split s"^/"[append c length? a]d: unique c
r: 0 if 1 < l: length? c[if 1 = length? d[r: 2 if(do d)= l[r: 1]]n: 0
v: copy[]loop l[append v n: n + 1]if(v = c)or(v = reverse c)[r: 3]]r]

Wypróbuj online!

0 Bałagan

1 Plac

2 Prostokąt

3 Trójkąt


1

AWK , 119 bajtów

{p=l;l=L[NR]=length($0)
D=d}{d=p-l;x=x?x:NR>2?\
d!=D:0}END{print x==1?\
3:d*d==1?(L[NR]+L[1]==\
NR+1)?2:3:p!=NR}#######

Wypróbuj online!

Wydajność:

0= Kwadrat
1= Prostokąt
2= Trójkąt
3= Bałagan


1

Rubin , 115 111 bajtów

->s{m=s.split(?\n).map &:size;r=*1..s=m.size;s<2?4:(m|[
]).size<2?m[0]<2?4:s==m[0]?1:2:r==m.reverse||r==m ?3:4}

Wypróbuj online!

Anonimowa lambda. Wyjścia:

  1. Plac
  2. Prostokąt
  3. Trójkąt
  4. Bałagan

Wygląda to na nieudane na niektórych, które powinny być oznaczone jako bałagan: Wypróbuj online!
Dom Hastings

Wydaje mi się, że to będzie musiało zostać naprawione. Prawdopodobnie będzie musiał spróbować trochę zagrać w golfa ...
Kirill L.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.