Podpisz to słowo 2!


17

Podpisz to słowo 2!

Nie tak dawno temu opublikowałem wyzwanie o nazwie Podpisz to słowo! . W wyzwaniu musisz znaleźć podpis słowa, czyli uporządkowane litery (np. Podpis thisjest hist). Teraz wyzwanie to poszło całkiem nieźle, ale była jedna kluczowa kwestia: było O WIELE zbyt łatwe (zobacz odpowiedź na temat GolfScript ). Postawiłem więc podobne wyzwanie, ale z większą ilością reguł, z których większość została zasugerowana przez użytkowników PPCG w komentarzach do poprzedniej układanki. Więc zaczynamy!

Zasady

  1. Twój program musi przyjąć dane wejściowe, a następnie wypisać podpis do STDOUT lub odpowiednika w dowolnym języku, którego używasz.
  2. Nie możesz używać wbudowanych funkcji sortowania, więc rzeczy takie jak $w GolfScript nie są dozwolone.
  3. Obsługiwana jest obsługa wielu znaków - program musi grupować litery zarówno wielkich, jak i małych liter. Tak więc podpis nie Hellojest taki eHllo, Hellojak w odpowiedzi na pytanie GolfScript w pierwszej wersji.
  4. Musi istnieć bezpłatny interpreter / kompilator dla twojego programu, do którego powinieneś utworzyć link.

Punktacja

Twój wynik to liczba bajtów. Wygrywa najniższa liczba bajtów.

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

# Ruby, <s>104</s> <s>101</s> 96 bytes


2
Czy należy zamówić małe i wielkie litery? Na przykład, ThHihsczy możemy generować dane, hHhistczy musimy generować dane hhHistlub Hhhist?
Fatalize

2
@Kslkgh Nie chcę instalować interpretera GolfScript, aby zrozumieć pytanie. Wymagania powinny być jasno określone w samym pytaniu.
feersum

1
@feersum Nie musisz. W odpowiedzi na tłumacza online znajduje się link. Ale ja to wyjaśnię.

8
Prawidłowa obsługa małych / wielkich liter w Unicode jest przerażająca, więc czy to pytanie jest dobrowolnie ograniczone do liter ASCII: [a-zA-Z]?
Matthieu M.,

3
Zapomniałeś zamknąć nawias po „zobacz odpowiedź GolfScript”. xkcd.com/859
nyuszika7h

Odpowiedzi:


11

Pyth, 10 bajtów

sm@+drd1zG

Wypróbuj online: demonstracja

Wyjaśnienie:

             implicit: z = input string
 m       G   map each letter (variable d) of the alphabet to:
   +drd1        d + upper(d)
  @     z       filter z for these two letters
s            sum, join to a string

5

Haskell, 51

f s=[x|(a,b)<-zip['a'..'z']['A'..],x<-s,x==a||x==b]

zipTworzy listę par znaków [('a','A'), ...('z','Z')]. Ze względu na obcięcie drugi punkt końcowy nie musi być określony. Dla każdej pary na liście bierzemy litery w ciągu wejściowym, sktóre są jednym z dwóch znaków w parze.


5

Python 3, 72 70 bajtów

s=input()
print("".join(d*(ord(d)&31==c)for c in range(27)for d in s))

Zakłada, że ​​dane wejściowe obejmują tylko [a-zA-Z].

(-2 bajty dzięki @xnor)


Myślę, że można to zrobić "".join(c*b ...)za "".join(c ... if b) ten sam sposób sum(n ... if b)może być sum(n*b ...).
xnor

Zwijanie dwóch pętli w jedną pętlę z wartownikiem i kompresowanie kontroli równości: c=1 for d in(input()+'~')*26:print(d[ord(d)&32^c:],end='');c+=d>'z'(67)
xnor

@ xnor Dodałem pierwszą wskazówkę (dzięki!), ale myślę, że powinieneś opublikować drugą jako osobną odpowiedź :)
Sp3000,

4

GOTO ++, 531 bajtów

niveaugourou 0
s=ENTRETONTEXTE()
§2 a=LeCaracNumero()&s *(1)
n=*(1)
costaud i=*(2)/&i infeg NombreDeLettres(&s)/i=+*(1)
b=LeCaracNumero()&s &i
c=&b
d=&a
GOTONULPOURLESNULS %4 }&b sup *(96){
c=-*(32)
§4 GOTONULPOURLESNULS %5 }&a sup *(96){
d=-*(32)
§5 GOTONULPOURLESNULS %1 }&c inf &d{
a=&b
n=&i
§1 faiblard
GOTOPRINTDUTEXTE()&a
s=Marijuana()}BOITEAPINGOUINS()}PrendsUnMorceau()&s *(0) &n{ }PrendsUnMorceau()&s }&n+*(1){ *(0){{ «»
GOTONONNULPOURLESNULS %3 }NombreDeLettres(&s) eg *(1){
GOTOPASMALIN %2
§3 GOTOPRINTDUTEXTE()&s

Strona projektu GOTO ++

Oto nieco bardziej czytelna i skomentowana wersja kodu (uwaga, która GOTOrozpoczyna komentarz w GOTO ++):

niveaugourou 0                                          GOTO Allow every keyword to be used
s=ENTRETONTEXTE()                                       GOTO Read from STDIN
§2 a=LeCaracNumero()&s *(1)                             GOTO Get first char in s
n=*(1)                                                  
costaud i=*(2)/&i infeg NombreDeLettres(&s)/i=+*(1)     GOTO Loop on every char of s
b=LeCaracNumero()&s &i                                  GOTO b = i-th char
c=&b                                            
d=&a
GOTONULPOURLESNULS %4 }&b sup *(96){                    GOTO If b is uppercase, goto §4 
c=-*(32)                                                GOTO Get the uppercase ASCII value of b
§4 GOTONULPOURLESNULS %5 }&a sup *(96){                 GOTO same as above but with a
d=-*(32)                                                
§5 GOTONULPOURLESNULS %1 }&c inf &d{                    GOTO If b is after a in alphabetical order, goto §1 (next loop iteration)
a=&b                                                    GOTO Else replace a by b
n=&i                                                                
§1 faiblard                                             GOTO End loop
GOTOPRINTDUTEXTE()&a                                    GOTO Print the value of a
t=PrendsUnMorceau()&s *(0) &n                           GOTO Get the part of s before a
u=PrendsUnMorceau()&s }&n+*(1){ *(0)                    GOTO Get the part of s after a
e=BOITEAPINGOUINS()&t &u                                GOTO Create an array of penguins containing the two substrings
s=Marijuana()&e «»                                      GOTO Concatenate the penguins in the array
GOTONONNULPOURLESNULS %3 }NombreDeLettres(&s) eg *(1){  GOTO If s is one char long, goto §3
GOTOPASMALIN %2                                         GOTO Else goto §2
§3 GOTOPRINTDUTEXTE()&s                                 GOTO Print the last char

2
Znaki świetnego języka programowania: wszystkie polecenia są w języku francuskim, a oficjalna strona internetowa mówi „Wyślij logo i wyglądaj głupio”.
Alex A.,

@AlexA. Znak świetnego języka programowania: function(arg)i function() argoba są ważne. Poza tym nawiasy priorytetowe } {nie są nudne( )
Fatalize

4

Pyth, 15 14 bajtów

s*V/LzJ.irG1GJ

Dzięki za isaacg za usunięcie 1 bajtu.

Nie wiem jeszcze dużo o Pyth, więc może nie być dobrze golfa.

Wypróbuj tutaj.


Jeden łatwy golf: sjest taki sam jak jkna liście strun.
isaacg,

4

JavaScript (ES6), 71 74

Ograniczone do A-Za-z (patrz komentarz @Matthieu M)

Edytuj Zbyt używane do komponowania pojedynczego wyrażenia przecinkami, aby uniknąć „powrotu”. Tutaj wymagane jest wyjście, więc mogę użyć prostego fori zapomnieć o przecinkach.

Używając rozumienia tablicowego, liczba bajtów wynosi 73, ale to już nie jest poprawny EcmaScript 6

Zwykła uwaga: przetestuj fragment kodu w dowolnej przeglądarce zgodnej z EcmaScript 6 (zwłaszcza Chrome nie MSIE. Testowałem na Firefoxie, Safari 9 mogłaby działać)

f=w=>{v=[];for(c of w)v[n=parseInt(c,36)]=(v[n]||'')+c;alert(v.join``)}
<input id=I value='Hellzapoppin'><button onclick=f(I.value)>-></button>


4

JavaScript, 112 194 bajtów

r=[];t=[];a=s.split('').map(function(x){t[i=parseInt(x,36)]?t[i].push(x):t[i]=[x];return i;});while(l=a.length)r[l-1]=t[a.splice(a.indexOf(Math.max.apply({},a)),1)].pop();console.log(r.join(''))

Jest to dalekie od „golfa”, ale jestem teraz trochę zajęty, właśnie edytowałem, aby usunąć sort.


1
@frikinside Chociaż to rozwiązanie może nie pomóc, ponieważ sortowanie zostało niedozwolone, funkcje strzałek JavaScript ES6 mogą to skrócić. (Nie wszystkie przeglądarki obsługują jeszcze ES6, wypróbuj Firefox). Może jednak pomoże w twoich przyszłych rozwiązaniach! :) Przykład tego, jak mogłoby to wyglądać:console.log(input.split('').sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())).join(''))
jrich

@UndefinedFunction Właściwie zdecydowałem się użyć zwykłego javascript do "wyzwania", ale bardzo dziękuję za miłą sugestię!
frikinside

@ edc65 faktycznie zdawałem sobie z tego sprawę w poprzednim komentarzu (tak jak powiedziałeś) i nie zapomniałem o tym, do tej pory nie miałem czasu.
frikinside

4

Python 3, 64

Niewielkie ulepszenie w odpowiedzi Sp3000 , która wykorzystuje ideę iteracji iteracji indeksów znaków, a dla każdej z nich iteracji przez dane wejściowe w celu dopasowania znaków pasujących do wielkości liter.

c=1
for d in(input__+'~')*26:print(end=d[ord(d)&31^c:]);c+=d>'z'

Wykorzystuje pojedynczą pętlę, zapętlając wejście 26 razy. Separator ~służy do określenia, kiedy przejść do indeksu następnego znaku c. Aby sprawdzić, czy znak ddopasowuje wartość cdo wielkości liter, ostatnie pięć bitów wartości bitu djest zapisywane za pomocą x c, przy czym 0 oznacza dopasowanie.

Następnie znak djest drukowany dokładnie wtedy, gdy jest wynik 0, w przeciwnym razie pusty ciąg znaków.


3

Python 2.7, 114 106 bajtów

l=[0]*123
for e in raw_input():l[ord(e)]+=1
print''.join(chr(j)*l[j]for i in range(26)for j in(i+65,i+97))

Rejestruje obecność znaku w tablicy o długości 123 (obejmującej zarówno zakresy AZ, jak i az), a następnie iteruje go, aby uzyskać niezerowe wpisy.
Nieefektywne, ale bardziej wydajne niż brutalne zmuszanie go (ale dłużej :().

Testowanie

<< HelloWorldhi
>> deHhillloorW

Kiedy go uruchomię HelloWorldhi, dostaję['d', 'e', 'H', 'h', 'i', 'lll', 'oo', 'r', 'W']
Blue

@muddyfish oops my bad. Wkleiłem niewłaściwy kod, wypróbowując kilka rzeczy. Dzięki za to :)
Kamehameha

Nie potrzebujesz if l[j]żadnego z nich.
Blue

@muddyfish Nice, stają się pustymi łańcuchami (i są usuwane po edycji join). -8 bajtów. Dzięki :)
Kamehameha

1
@ SirParselot Tak, ale to wyglądało na modyfikację danych wejściowych podanych w pytaniu, więc tego nie zrobiłem
Kamehameha

3

PHP, 275 270 bajtów

<?php
for($i=65;$i<123;$i++){$v[$i]=chr($i);}foreach(str_split($argv[1])as$c){$a=array_search($c,$v);if($a<97){$p[]=($a+32);$z[]=$a;}else{$p[]=$a;}}foreach($p as$chr){$m=min($p);if($z[0]+32==$m){echo chr($m-32);unset($z[0]);}else{echo chr($m);}unset($p[array_search($m,$p)]);}


Objaśnienie:
Kod generuje tablicę z każdą literą w alfabecie, która ma swoją wartość ASCII jako klucz tablicy. Następnie kod generuje nową tablicę, która zawiera wartości ASCII wejścia. Następnie drukowana jest najniższa wartość i usuwana.

Użycie:
Wywołaj skrypt z argumentem: php -d error_reporting=0 script.php Hello

Ungolfed Wersja:

<?php
$input = $argv[1];
$valueArray = [];
for($i=65;$i<123;$i++) {
    $valueArray[$i] = chr($i);
}
$new = str_split($input);
foreach($new as $char) {
    if(array_search($char, $valueArray)<97) {
        $newArray[] = (array_search($char, $valueArray)+32);
        $checkArray[] = array_search($char, $valueArray);
    } else {
        $newArray[] = array_search($char, $valueArray);
    }
}
foreach($newArray as $chr) {
    if($checkArray[0]+32 == min($newArray)) {
        $string .= chr(min($newArray)-32);
        unset($checkArray[0]);
    } else {
        $string .= chr(min($newArray));
    }
    $key = array_search(min($newArray), $newArray);
    unset($newArray[$key]);
}

echo $string;


Wszelkie porady są mile widziane.


Wielkie litery nie działają ... trzeba to naprawić.
jrenk,

Naprawiono, że kod działa również wtedy, gdy wejście zawiera wielkie litery.
jrenk,

3

Haskell, 83 53 bajty

import Data.Char
f y=[c|x<-[' '..],c<-y,toLower c==x]

Zastosowanie: f "HelloWorldhi"-> "deHhillloorW".

Jak to działa: niech ybędzie ciągiem wejściowym

[ |x<-[' '..]                  ]  -- for every x from Space to the last Unicode character
             ,c<-y                -- loop through all character c from the input string
 c                ,toLower c==x   -- and keep those where the lowercase version equals x

Edycja: zapisano 30 bajtów, wyobraź sobie! Dzięki @Mauris.


2
Dlaczego nie wystarczy import Data.Char;f y=[c|x<-[' '..],c<-y,toLower c==x](53 bajtów)? (To zajmie trochę czasu, aby zakończyć, ponieważ length [' '..] == 1114080- ale to skończone.)
Lynn

1
@Mauris: Wow! Btw: 8,5 s na 4-letnim laptopie nie jest zbyt długi.
nimi

3

Python 3, 61 bajtów

Nowa odpowiedź na inną technikę!

z=['']*42
for c in input():z[ord(c)&31]+=c
print(*z,sep='')

Stwierdzając, że ord('a')&31==ord('A')&31i żeord('z')&31==ord('Z')&31 , możemy po prostu utworzyć tablicę pustych łańcuchów i dla każdego znaku dodać go do indeksu tablicy jego wartości ASCII&31 . Po wydrukowaniu zostanie posortowane.

Ograniczone do danych wejściowych a-zA-Z.


2

Python 3, 97 92 bajtów

from itertools import*;print(*min(permutations(input()),key=lambda z:str(z).lower()),sep='')

Najlepszym sposobem sortowania jest oczywiście wygenerowanie wszystkich permutacji, a następnie wybranie minimum, które akurat jest sortowane :)

Ciągi znaków są porównywane małymi literami przed porównaniem, aby zachować zgodność z regułami „rozróżniania wielkości liter”.

Ostrzeżenie: może być bardzo wolne z dużymi łańcuchami.

Tłumacz znajduje się tutaj .


2

Python 3, 118 bajtów

i=input();i,x=map(list,(i,i.lower()))
while x:q=min(x);x.remove(q);q=[q.upper(),q][q in i];i.remove(q);print(q,end="")

Wiem, że można grać w golfa znacznie krócej


Można wymienić if q not in i:z if~-(q in i):.
PurkkaKoodari

Robię, ponieważ wywołuję na nim .remove()funkcję.
Niebieski,

2

PowerShell, 164 bajtów

Jestem pewien, że jest na to lepszy sposób, ale nie mogłem wymyślić nic innego. Po prostu bierze dane wejściowe jako tablicę znaków, sortuje wstawianie i wypluwa dane wyjściowe. Przegrywa okropnie, nawet z innymi językami nie golfowymi.

Kod:

$a=[char[]]($args[0]);For($u=1;$u-lt$a.Count;$u++){$n=$a[$u];$l=$u;while(($l-gt0)-and((""+$a[$l-1]).CompareTo(""+$n)-gt0)){$a[$l]=$a[$l-1];$l--}$a[$l]=$n};$a-join''

Stosowanie:

PS C:\scripts> .\sign-word-2.ps1 tTHhis
hHistT

Rozszerzony i wyjaśniony:

$a=[char[]]($args[0])               # Takes command-line argument, recasts as char array
For($u=1;$u-lt$a.Count;$u++){       # Performs a quick-n-dirty insertion sort
  $n=$a[$u]
  $l=$u
  while(($l-gt0)-and((""+$a[$l-1]).CompareTo(""+$n)-gt0)){
  # Ugly, ugly code here. String.CompareTo(String) is case-insensitive, but
  # because we cast as a char[], Char.CompareTo(Char) is case-sensitive ...
  # So, need to do an on-the-fly re-casting as a string with ""+
    $a[$l]=$a[$l-1]
    $l--
  }
  $a[$l]=$n
}
$a-join''             # Without the -join'', it would print out the chars with a space between

2

Julia, 61 bajtów

f=s->s>""?(k=indmax([s...]%32);f(s[k+1:end]s[1:k-1])s[k:k]):s

Julia wyświetli go jako ciąg wyjściowy, jeśli wywołasz go w REPL. Jeśli musi wydrukować do STDOUT, potrzebuje 78 bajtów:

x->(f=s->s>""?(k=indmax([s...]%32);f(s[k+1:end]s[1:k-1])s[k:k]):s;print(f(x)))

Tłumacz dla Julii można znaleźć tutaj . Jeszcze jeden, który ja już umieścić jakiś kod na, jest tutaj . Zauważ, że w przypadku drugiego z nich musisz uczynić terminal (na dole) widocznym, przeciągając granicę w górę. Kliknięcie „wykonaj” spowoduje, że uruchomi się ono w terminalu w normalnym wierszu poleceń (a zatem nie wyświetli wyniku, jeśli zostanie wywołany bez println). Możesz też po prostu wpisaćjulia sam terminal, a następnie obsłużyć wszystko w REPL, które się pojawi.

A dla odrobiny dodatkowej zabawy, oto inne implementacje

Sortowanie gnomów (83 bajty):

s->(for m=2:endof(s),n=m:-1:2 s[n]%32<s[n-1]%32&&(s=s[[1:n-2,n,n-1,n+1:end]])end;s)

Mój własny algorytm sortowania (84 bajtów):

s->(k=1;while length(k)>0 k=find(diff([s...]%32).<0);s=s[setdiff(1:end,k)]s[k]end;s)

2

Scala, 82 bajty

print((""/:args(0)){case(s,c)=>val(a,b)=s.span(h=>{if(h<97)32 else 0}+h<c);a+c+b})

z linii poleceń:

$ scala -e 'print((""/:args(0)){case(s,c)=>val(a,b)=s.span(h=>{if(h<97)32 else 0}+h<c);a+c+b})' Hello
eHllo

prawdopodobnie można go nieco pograć w golfa ... wprowadzając sortowanie za pomocą fold.


2

kod maszynowy x86, 51 42 bajtów

00000000  b3 82 89 da 8b 07 80 fc  0d 74 12 b9 20 20 09 c1  |.........t..  ..|
00000010  38 e9 7e 06 86 c4 89 07  31 d2 43 eb e7 85 d2 74  |8.~.....1.C....t|
00000020  df c6 47 01 24 b4 09 cd  21 c3                    |..G.$...!.|
0000002a

Sortowanie bąbelkowe, z pewnymi rejestrami ponownie wykorzystującymi sztuczki do golenia bajtów tu i tam; plik .COM przebiega w DOSBox, odbiera dane wejściowe z linii komend i drukuje wyjście na standardowe wyjście.

sample session

Skomentowany montaż:

    org 100h

section .text

start:
    ; bubble sort - external loop
ext:
    ; start from the first character (assume bh=0, true on every DOS)
    mov bl,82h
    ; "not-swapped" flag - 82h => no swaps in current iteration;
    ; 0 => a swap happened (the 82h will come in handy later)
    mov dx,bx
    ; bubble sort - internal loop
int:
    ; read 2 characters at time in the full ax
    mov ax,word[bx]   ; al     ah
                      ; ^[bx]  ^[bx+1]
    ; check if we are at the end (the command line is CR terminated)
    cmp ah,0dh
    je skip
    ; make uppercase in cx
    mov cx,2020h
    or cx,ax
    ; compare
    cmp cl,ch
    jle next
    ; wrong order - swap and rewrite
    xchg al,ah
    mov word[bx],ax
    ; mark that we did a swap
    xor dx,dx
next:
    ; next character
    inc bx
    jmp int
skip:
    ; loop as far as we swapped something
    test dx,dx
    jz ext
end:
    ; $-terminate the string
    mov byte[bx+1],'$'
    ; print
    ; dx already contains the location of the string, since that's the
    ; flag value we used for "no swaps"
    mov ah,9
    int 21h
    ret


1

Perl, 88 bajtów

@_=/./g;a:{for(0..@_-2){@_[$_,$_+1]=@_[$_+1,$_],redo a if uc$_[$_]gt uc$_[$_+1]}}print@_

Po prostu prosty sortowanie bąbelkowe. Zadzwoń z opcją -n, aby przekazać tekst.

na przykład:

echo "tThHiIsS" | perl -n sort2.pl

Wynik:

hHiIsStT

1

PHP, 106 bajtów

Kod:

$c=count_chars($argv[1]);$r=str_repeat;for($i=64;++$i<91;)echo$r(chr($i),$c[$i]),$r(chr($i+32),$c[$i+32]);

W kodzie nie ma nic specjalnego; count_chars()tworzy tablicę indeksowaną kodami ASCII, która zawiera liczbę wystąpień dla każdego znaku ASCII. Reszta jest nudną iteracją tej tablicy.

Przykład wykonania:

$ php -d error_reporting=0 sign.php qwertyuioplkjhgfdsazxcvbnmQWERTYUIOPLKasdfJHGFDSAZXCVBNM
AaaBbCcDddEeFffGgHhIiJjKkLlMmNnOoPpQqRrSssTtUuVvWwXxYyZz

Dodatkowy bajt mogą być zapisywane za pomocą PHP 7 zamienić $c[$i]z ($c=count_chars($argv[1]))[$i]i usunąć przypisanie $cod początku programu.


1

Haskell, 74 bajty

l=(`mod`32).fromEnum
f=foldr(#)""
e#[]=[e]
e#a@(h:t)|l e<l h=e:a|1<2=h:e#t

Całkowicie różni się od mojej innej odpowiedzi . Tym razem jest to prosty rodzaj wstawiania.


1

Pip, 18 14 bajtów

Repozytorium GitHub dla Pip

Wydaje się, że nie ma konkurencji z Pyth, ale jest to dość szanowane.

FcAZ OcQUC_FIa

Działa tylko na ciągach zawierających a-zA-Z. Dla każdej litery alfabetu używa operacji filtrowania, aby pobrać litery z ciągu wejściowego, które są równe tej literze bez rozróżniania wielkości liter:

                    a <- cmdline arg, AZ <- string containing uppercase alphabet (implicit)
FcAZ                For each character c in AZ:
           FIa      Filter characters of a on the following lambda function:
      UC_           Uppercase of character...
         Qc         ... is equal to c
     O              Output the resulting list, joined on empty string by default

Dwie notatki:

  • Przestrzeń jest niezbędna; w przeciwnym razie sekwencja AZObyłaby skanowana jako A ZOzamiast AZ O;
  • Program nie wyświetla końcowego nowego wiersza. Aby dodać jeden, umieść xna końcu kodu (drukując pusty ciąg po zakończeniu pętli).

Przykładowy przebieg (przy użyciu xwariantu):

dlosc@dlosc:~/pip$ pip -e "FcAZ OcQUC_FIax" "HelLo wOrld"
deHlLloOrw

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.