Sześciokąty połączone ASCII


21

Przegląd

Biorąc pod uwagę liczbę sześciokątów, ułóż je w połączony kształt w ramach obrazu sztuki 50 na 50 ASCII. Kształt, który wybierzesz, może być dowolny - bez względu na to, co najbardziej ci odpowiada na grę w golfa - pod warunkiem, że jest podłączony. Może mieć otwory, pod warunkiem, że są większe niż jeden sześciokąt (w przeciwnym razie liczba sześciokątów będzie niejednoznaczna).


Układ

Wszystkie sześciokąty muszą mieć następującą formę (poprawny jest tylko ten rozmiar i orientacja):

 __
/  \
\__/    Note there are 2 underscores per horizontal edge.

Dwa sześciokąty są bezpośrednio połączone, jeśli mają wspólną krawędź:

 __               __
/  \__           /  \
\__/  \          \__/
   \__/    or    /  \
                 \__/

Dwa sześciokąty nie są połączone, jeśli dzielą tylko wierzchołek:

 __  __
/  \/  \
\__/\__/

Udostępnianie połowy krawędzi również nie jest liczone jako połączone:

 __
/  \
\__/
 /  \
 \__/

Zbiór sześciokątów jest połączony, jeśli istnieje ścieżka z dowolnego sześciokąta do dowolnego innego, przy użyciu tylko bezpośrednio połączonych sześciokątów.

Dziury

Sześciokątna dziura w połączonej kolekcji sześciokątów liczy się jako sześciokąt, tak że każdy element sztuki ASCII ma jednoznaczną liczbę sześciokątów.

Ten sposób nie liczyć jako otwór ponieważ potencjalny otwór jest pojedynczy sześciokąt:

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      7 hexagons (not 6 with a hole)

Jest to liczone jako dziura, ponieważ nie odpowiada pojedynczemu sześciokątowi:

    __
 __/  \__
/  \__/  \__
\__/  \__/  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/      8 hexagons with a hole

Wejście i wyjście

Wejście

Liczba całkowita od 1 do 255.

Wynik

Ciąg sztuki ASCII reprezentujący wejściową liczbę połączonych sześciokątów, jak opisano powyżej.

  • Liczba wierszy (podciągi oddzielone znakiem nowej linii) wynosi co najwyżej 50 plus dodatkowy opcjonalny znak nowej linii.
  • Rzędy nie muszą być tej samej długości, ale każdy musi mieć długość co najwyżej 50.
  • Rzędy o zerowej długości mogą istnieć powyżej lub poniżej połączonego kształtu, pod warunkiem że całkowita liczba rzędów nie przekracza 50.
  • Wiersze zawierające tylko przestrzeń mogą istnieć powyżej lub poniżej połączonego kształtu, pod warunkiem że całkowita liczba wierszy nie przekracza 50.
  • Po lewej stronie kształtu mogą pojawiać się spacje, pod warunkiem, że długości wierszy nie przekraczają 50 (kształt nie musi być wyrównany do lewej).
  • Po prawej stronie kształtu mogą pojawić się odstępy, pod warunkiem, że długości wierszy nie przekraczają 50.
  • Wszelkie znaki, które nie stanowią części połączonego kształtu, muszą być spacjami lub znakami nowej linii.

Pod warunkiem, że dane wyjściowe są poprawne, nie jest wymagane zachowanie spójności między kolejnymi uruchomieniami.

Przykłady

Wejście: 6

Prawidłowe dane wyjściowe:

 __    __    __
/  \__/  \__/  \__
\__/  \__/  \__/  \
   \__/  \__/  \__/

 __    __
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/

          __
 __      /  \
/  \__   \__/
\__/  \__/  \
   \__/  \__/
      \__/
      /  \
      \__/

Nieprawidłowe dane wyjściowe:

    __
 __/  \__
/  \__/  \
\__/  \__/
/  \__/  \
\__/  \__/
   \__/      Invalid for 6 as the centre hole counts as a 7th hexagon.

 __    __    __      __
/  \__/  \__/  \    /  \
\__/  \__/  \__/    \__/
   \__/  \__/                Invalid as the 6 hexagons are not connected.

 __    __    __  __
/  \__/  \__/  \/  \
\__/  \__/  \__/\__/
   \__/  \__/           Invalid as vertex touching does not count as connected.

 __    __       __
/  \__/  \     /  \
\__/  \__/     \__/
/  \__/  \
\__/  \__/
   \__/       Invalid as the 6 connected hexagons are not the only visible characters.

Zwycięski

Najkrótsza ważna odpowiedź w bajtach wygrywa.


Tabela liderów

(za pomocą fragmentu tabeli liderów Martina )


Obawiam się, że wszyscy skorzystają z pierwszego przykładowego wzorca wyjściowego, ponieważ jest to prawdopodobnie najłatwiejszy do wdrożenia.
Fatalize

1
@ Zmodyfikuj moje przykłady działają tylko dla danych wejściowych 6. Dla wprowadzenia 255poziomego rzędu sześciokątów nie zmieści się w sztuce ASCII 50 na 50.
trichoplax

Nadal możesz po prostu zapętlić się i wypełnić linie poniżej za każdym razem, gdy osiągniesz limit 50 znaków
Fatalize

1
@Fatalize Wyzwaniem jest zminimalizowanie liczby bajtów w kodzie. Nie mam nic przeciwko, jeśli wzory są proste, po prostu ciekawie będzie zobaczyć, co ludzie próbują i co pasuje do różnych języków.
trichoplax,

@ Fatalizacja: Nie wiem, czy byłaby krótka, czy nie, ale bardziej „interesująca” odpowiedź mogłaby przeprowadzić rzeczywiste wyszukiwanie, aby sprawdzić, gdzie można umieścić sześciokąty, a tym samym uzyskać bardziej interesujące wyniki.
Alex Van Liew

Odpowiedzi:


13

CJam, 64 57 55 bajtów

" __
/  \
\__/"N/{_SS/\+_47>S3*f{\+}_2>\@?}q~(*]:..e>N*

Sprawdź to tutaj.

Spowoduje to wygenerowanie następującego wzorca w kolumnach :

 __    __    __    __    __    __
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/  \
\__/  \__/  \__/  \__/  \__/  \__/
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/  \__/  \__/

Wyjaśnienie

Jest to oparte na doskonałej wskazówce Dennisa , wykorzystującej .e>do złożenia dzieła sztuki ASCII z kilku elementów. Jak mówi, .e>przyjmuje elementarnie maksymalnie dwie tablice (lub łańcuchy), a ponieważ spacje mają najniższy kod znaków, możemy użyć tego do narzucenia dowolnych innych znaków na siatce łańcuchów. Ponadto, jeśli dwie tablice nie mają tej samej długości, elementy zewnętrzne dłuższej tablicy są po prostu kopiowane bez zmian. Oznacza to, że różne wzory nie muszą nawet mieć tego samego rozmiaru. Aby zastosować to do tablic dwuwymiarowych (ponieważ nie chcemy wstawiać nowych linii do samego końca), stosujemy .e>parami do linii, co daje ..e>.

Podstawową ideą kodu jest generowanie Nkopii pojedynczego sześciokąta przesuniętego do właściwej pozycji. „Przesuwamy” sześciokąt pionowo, przygotowując puste linie, i poziomo, przygotowując spacje. Po zakończeniu składamy wszystkie kopie razem, używając pięknego :..e>(prawdopodobnie najdłuższego operatora, jakiego kiedykolwiek użyłem w programie CJam).

Oto kod:

" __
/  \
\__/"N/    e# Get a 2D character grid of the hexagon.
{          e# Read input N, repeat this block N-1 times.
  _        e#   Make a copy, so we leave the last hexagon on the stack.
  SS/\+    e#   Prepend two empty lines.
  _47>     e#   Make a copy and discard the first 47 lines.
  S3*f{\+} e#   Prepend 3 spaces to each line. This copy has been moved back to
           e#   the top and one column to the right.
  _2>      e#   Make a copy and discard another two lines.
  \@?      e#   If any lines were left after that, pick the copy in the next column,
           e#   otherwise, stay in the same column.
}q~(*      
]:..e>     e# Wrap all the hexagons in an array and fold them into a single grid.
N*         e# Join them with newline characters.

Człowieku, naprawdę powinienem nauczyć się jednego z tych języków golfowych.
Alex Van Liew

@AlexVanLiew Powinieneś! :) Ale nie dlatego, że zwiększa twoje szanse na wygraną w golfa kodu, ale dlatego, że CJam jest pięknym językiem, w którym programowanie jest fajne i nie znam żadnego innego języka, w którym powyższe rozwiązanie (które moim zdaniem jest dość eleganckie) miałoby sens. ;)
Martin Ender

Prawdopodobnie nauczyłbym się Pytha lub obu; czy oba są w zasadzie takie same, czy jest jedno lepsze od reszty?
Alex Van Liew

@AlexVanLiew Nie znam dużo Pytha, ale wiem, że daleko im do tego samego. CJam jest językiem stosowym, podczas gdy Pyth powstał jako skrót dla Pythona (ale teraz ma swój własny zestaw wbudowanych funkcji). Pyth może nieco mieć przewagę, jeśli chodzi o golfa, ale osobiście bardzo lubię programować w innym paradygmacie, więc pozostanę przy CJam.
Martin Ender,

Aha widzę. Znam dość dobrze Pythona, dlatego chciałbym nauczyć się Pyth'a, ale jeśli zdobędę czas, może spróbuję też CJama!
Alex Van Liew

7

Python 2, 219 207 znaków

b=bytearray(' ');h=['__ ','/  \\','\\__/'];k=range;x=input();g=[b*50for _ in k(50)]
for i in k(x):
 c=i*3%48+1;r=(i*3+1)/48*2+i%2
 for m in k(i>15,3):n=m==0;g[r+m][c+n:c+4-n]=h[m]
print"\n".join(map(str,g))

Pobiera dane wejściowe na standardowe wejście.

Prawie po prostu tworzy siatkę 50 x 50 przestrzeni i umieszcza sześciokąty tam, gdzie to właściwe. Po sześciokąta 16, nie ma potrzeby pierwszego rzędu h(w sześciokąt w postaci matrycy 2D), więc wykorzystać i>15do uruchomienia zakresu na 1 zamiast 0. c=i*3%48+1;r=(i*3+1)/48*2+i%2oblicza C olumn i r OW trzeba rozpocząć się. njest wartością logiczną, ale jest używany jako liczba całkowita do ustalenia granic (ponieważ h[0]ma tylko 3 znaki, aby uniknąć nadpisywania).

Jestem z tego całkiem zadowolony, ogoliłem około 50 bajtów od początkowej wersji, szczególnie gdy przypomniałem sobie a[x:y]=bskładnię.

Wyjście (n = 30):

  __    __    __    __    __    __    __    __
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
 /  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
 \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
    \__/  \__/  \__/  \__/  \__/  \__/  \__/
(plus 44 lines of spaces each 50 wide)

Ponieważ końcowe linie białych znaków są dozwolone, zmieniłem tworzenie, gaby po prostu utworzyć 50 bytearrays zamiast 3+(x>1)+x/16*2, czyli dokładnej liczby wymaganych wierszy, goląc 12 bajtów.


6

Swift 2.0, 601 591 bajtów

import Cocoa
var a=Int(Process.arguments[1])!,b="/  \\__".join([String](count:9,repeatedValue:""))+"/",c="\\__/  ".join([String](count:9,repeatedValue:""))+"\\",d=c.startIndex,e=c.endIndex,j=[c.stringByReplacingOccurencesOfString("\\",withString:" ").stringByReplacingOccurencesOfString("/",withString:" ").substringToIndex(advance(d,3*a,e)),b.substringToIndex(advance(d,3*a+a%2,advance(e,-1)))]
while a>0{j+=[c.substringToIndex(advance(d,3*a+1,e)),b.substringToIndex(advance(d,3*a+(a+1)%2,e)]
a<=16 ?j+=[" "+j.removeLast().substringFromIndex(advance(d,1))]:()
a-=16}
for l in j{print(l)}

Biegać: swift hexagons.swift 21

Wynik:

 __    __    __    __    __    __    __    __    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/
\__/  \__/  \__/
   \__/  \__/  

Szybcy substringToIndexi stringByReplacingOccurencesOfStringpodejmują tak wiele postaci ...


W ogóle nie znam Swifta, ale czy nie ma sposobu na skonstruowanie tego powtarzającego się łańcucha z mniejszym kodem?
Reto Koradi,

Jedyny sposób, w jaki znam powtarzanie łańcucha, to stringByPaddingToLengthjednak w tym przypadku byłoby to 11 znaków dłużej niż wpisanie całego łańcucha.
David Skrundz

6
Widzę, że Apple naprawdę lubi przesadne łączenie łańcuchów. Nie tak zły jak stringByAppendingStringw Objective-C, ale wciąż ...
Fatalize

Poza kodem golfa jest to naprawdę miłe, ponieważ znacznie ułatwia wyszukiwanie metody.
JustSid,

4

C, 238 bajtów

#define h(A) c[m+A/4][n+A%4]
i,m,n;
f(a)
{
    char c[50][51];
    for(i=0;i<50;i++)for(m=0;m<51;m++)c[i][m]=m-50?32:0;
    for(;a;)
        m=a/12*2,n=a%12*3,a--%2?m=a/12*2+1,n=a%12*3+3:0,
        h(1)=h(2)=h(9)=h(10)=95,h(4)=h(11)=47,h(7)=h(8)=92;
    for(;i;)puts(c-i--+50);
}

Uwzględniane są tylko niezbędne spacje i znaki nowej linii.

Po prostu tworzy matrycę znaków, wypełnia je w odwrotnej kolejności, a następnie drukuje całość.


2

JavaScript (ES6), 265 bajtów

A=Array;f='forEach';U=x=1;y=0;a=A.from(A(51),_=>A.from(A(51),_=>' '));d=h=>(` __
/  \\
\\__/`.split`
`[f]((l,i)=>[...l][f]((c,j)=>{if('_/\\'.indexOf(a[x+i][y+j])<0)a[x+i][y+j]=c})),(x+=U*-2+1),(U=!U),(C-y<=3?((U=x+=2),y=0):y+=3),--h?d(h):a.map(d=>d.join``).join`
`)

Tesseluje sześciokąty z rzędu, od lewej do prawej, naprzemiennie w górę i w dół - jak plaster miodu - aż do osiągnięcia końca rzędu.

Niegolfowany z opisem (działa w Firefoksie):

'use strict';
const CAP = 51;
var a = Array.from(Array(51), () => Array.from(Array(51),() => ' '))

function draw (hexagons, x, y, a, up) {
  // x, y (row, col) represents the current position of the cursor
  /*
  
    Here's a map of the first three iterations:
    
            01234567
     0        __
     1     __/  \__
     2    /  \__/  \
     3    \__/  \__/

    For the first 17 iterations, the cursor will be at:
    
      # | x | y
      ----------
      1 | 1 | 0
      2 | 0 | 3
      3 | 1 | 6
      4 | 0 | 9
      5 | 1 | 12
      6 | 0 | 15
      7 | 1 | 18
      8 | 0 | 21
      9 | 1 | 24
     10 | 0 | 27
     11 | 1 | 30
     12 | 0 | 33
     13 | 1 | 36
     14 | 0 | 39
     15 | 1 | 42
     16 | 0 | 45
     17 | 3 | 0      <- moves back to the first row

  */
` __
/  \\
\\__/`
  // split the hexagon into three lines
  .split('\n').forEach((line, index) => {
    // and for each line
    ;[...line].forEach((char, j) => {
      // if the cursor position (x, y) translated
      // by (index, j) is not already part of a hexagon
      // then replace it with the current (index, j) piece
      // of the hexagon
      /*
         0123
       0  __
       1 /  \
       2 \__/
       
      */
      if ('_/\\'.indexOf(a[x + index][y + j]) < 0)
        a[x + index][y + j] = char
    })
  })
  
  // `up` represents the next hexagon
  // if true, the next hexagon will be drawn attached to
  // the top right edge of the current hexagon
  if (up) {
    x -= 1
  // otherwise, it'll be drawn attached to the bottom right edge
  } else {
    x += 1
  }

  // move three columns to the right
  y += 3
  // change directions
  up = !up

  // if within the right boundary of the 51x51 matrix,
  // move back to the left edge and down 2 rows
  // and draw the next hexagon as an `up` hexagon
  if (51 - y <= 3) {
    y = 0
    x += 2
    up = true
  }

  // if hexagons > 0, then recurse and draw the next hexagon
  // otherwise, return the array (join the columns in each row, then join each row
  // by a new line)
  return --hexagons ?
    draw(hexagons, x, y, a, up)
    : a.map(d => d.join('')).join('\n')
}

var n = parseInt(prompt('Number to draw:'))
var r = draw(n, 1, 0, a, true)
document.write('<pre>' + r.replace(/\n/g, '<br>') + '</pre>')


2

Ruby, 120

->n{a=(1..50).map{' '*50}
n.times{|i|x=i%16*3
3.times{|j|a[47-i/16*2-x/3+j][x..x+3]=[' __ ','/  \\','\__/'][j]}}
puts a}

tworzy tablicę 50 łańcuchów po 50 spacji, a następnie zastępuje 4 znaki w 3 liniach, aby dodać sześciokąty:

" __ "
"/  \"
"\__/"

Ponieważ pierwszy wiersz zawiera spacje, po narysowaniu sześciokąta nie możemy narysować kolejnego pod nim, ponieważ spacje zastąpiłyby poprzednie sześciokąty.

Dlatego sześciokąty są dodawane w postaci rombu 16 x 16 (zniekształcony prostokąt) od dołu do góry i nachylonego od dołu od lewej do prawej u góry.

Ciąg " __ "zostanie następnie nadpisany dodatkowym \i /tam, gdzie to konieczne.

Niegolfowany w programie testowym

g=->n{
  a=(1..50).map{' '*50}              #make an array of 50 strings of 50 spaces
  n.times{|i|                        #loop through all hexagons
    x=i%16*3                         #x coordinate of top left corner of hexagon, 16 per row
    3.times{|j|                      #loop through 3 lines to print hexagon.
      a[47-i/16*2-x/3+j][x..x+3]=    #47-i/16*2 : start at the bottom and work up. each row is 2 lines high and contains 16 hexagons. x/3 : slant upwards as the row moves right. 
       [' __ ','/  \\','\__/'][j]    #These are the symbols for each of the 3 lines required for a hexagon. [x..x+3] defines which characters have to be replaced in each string.
    }      
  }
  puts a                             #print to stdout
}

N=gets.to_i
g.call(N) 

Typowa wydajność (n = 250)

Na górze powinno być jeszcze kilka wierszy białych znaków, aby w sumie było 50, ale nie wiem, czy istnieje sposób, aby Stackexchange sformatował, aby je uwzględnić.

                                              __  
                                           __/  \ 
                                        __/  \__/ 
                                     __/  \__/  \ 
                            __    __/  \__/  \__/ 
                         __/  \__/  \__/  \__/  \ 
                      __/  \__/  \__/  \__/  \__/ 
                   __/  \__/  \__/  \__/  \__/  \ 
                __/  \__/  \__/  \__/  \__/  \__/ 
             __/  \__/  \__/  \__/  \__/  \__/  \ 
          __/  \__/  \__/  \__/  \__/  \__/  \__/ 
       __/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
    __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
 __/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \ 
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/ 
\__/  \__/  \__/  \__/  \__/  \__/  \__/  \__/    
/  \__/  \__/  \__/  \__/  \__/  \__/  \__/       
\__/  \__/  \__/  \__/  \__/  \__/  \__/          
/  \__/  \__/  \__/  \__/  \__/  \__/             
\__/  \__/  \__/  \__/  \__/  \__/                
/  \__/  \__/  \__/  \__/  \__/                   
\__/  \__/  \__/  \__/  \__/                      
/  \__/  \__/  \__/  \__/                         
\__/  \__/  \__/  \__/                            
/  \__/  \__/  \__/                               
\__/  \__/  \__/                                  
/  \__/  \__/                                     
\__/  \__/                                        
/  \__/                                           
\__/                                              
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.