Найвищі чи найменші випадки?


13

Виклик:

Вхідні дані:

  • Рядок, що містить ASCII для друку (за винятком пробілів, вкладок та нових рядків)
  • Булева

Вихід:

Частини струни поділяються на чотири групи:

  • Букви нижнього регістру
  • Великі літери
  • Цифри
  • Інший

Виходячи з булевого, ми або виводимо найвищий показник однієї (або декількох) цих чотирьох груп, або найнижчий, замінюючи все інше пробілами.

Наприклад:

Введення: "Just_A_Test!"
Він містить:
- 3 JAT
малі літери: ustest
- 6 малі літери: - 0 цифр
- 3 інші:__!

Це будуть виходи для trueабо false:

true:   " ust    est "

// digits have the lowest occurrence (none), so everything is replaced with a space
false:  "            "

(Примітка. Ви можете ігнорувати пробіли, тому результати можуть бути " ust est"і ""відповідно.)

Правила виклику:

  • Вхід ніколи не буде порожнім або міститиме пробіли, а складається лише з друкованого ASCII в діапазоні 33-126або '!'наскрізь '~'.
  • Ви можете приймати вхідні та / або вихідні дані як масив символів або список, якщо ви хочете.
  • † Дозволяються будь-які дві послідовні та чіткі значення булевих значень: true/ false; 1/ 0; 'H'/ 'L'; "highest"/ "lowest"; Зауважте, що ці чіткі значення слід використовувати (дещо) як булеві! Тому заборонено вводити дві повні програми, одну, яка дає правильний результат, trueа іншу для false, а потім матимете лише власний код <run input with parameter>. Я додав відповідну нову лазівку за замовчуванням, хоча вона все ще може використовувати багато тонких налаштувань щодо визначень.
  • Якщо виникнення двох або більше груп однакове, ми виводимо всі ці події.
  • Необхідні проміжки проміжки необов’язкові, а також окремий трейлінг нового рядка також необов’язковий. Необхідні провідні проміжки є обов’язковими. І будь-які інші провідні місця або нові рядки заборонені.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод з відповідними параметрами, повноцінні програми. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Тестові приклади:

Inputs:                              Output:

"Just_A_Test!", true                 " ust    est "     (or " ust    est")
"Just_A_Test!", false                "            "     (or "")
"Aa1!Bb2@Cc3#Dd4$", either           "Aa1!Bb2@Cc3#Dd4$"
"H@$h!n9_!$_fun?", true              " @$ !  _!$_   ?"
"H@$h!n9_!$_fun?", false             "H     9        "  (or "H     9")
"A", true                            "A"
"A", false                           " "                (or "")
"H.ngm.n", true                      "  ngm n"
"H.ngm.n", false                     "       "          (or "")
"H.ngm4n", false                     "H.   4 "          (or "H.   4")

Чи прийнятно виводити найбільш / найменші як окремі записи? Наприклад, для «хешування задоволення» тест, може "H "і " 9 "(з відповідними пробілами) буде виводитися замість "H 9"?
AdmBorkBork

@AdmBorkBork Я не розумію, що ти маєш на увазі; і ті, Hі 9є частиною "найменшої".
Ерік Аутгольфер

Чи може бути булеве вхідне значення "max"/ "min", яке потім використовується Math[b]для позначення Math.maxабо Math.min?
Джастін Марінер

@JustinMariner Ви знаєте .. Я передумав про це шкода. Я думаю, це для JS? Я думаю, що багато мов програмування можуть використовувати щось подібне, тому занадто багато існуючих відповідей слід змінити. Так вибачте, вам доведеться дотримуватися b?"max":"min"своєї відповіді. Думаю, це чітка лінія, можливо, я повинен просто використати значення truthy / falsey наступного разу ..
Кевін Круїйсен

Відповіді:


3

Лушпиння , 27 26 24 22 байт

-2 байти завдяки Згарбу

-2 байти завдяки Леву

Приймає ' 'як Falseі 'a'як True(У лушпинні, пробіл у Fasly та всі інші символи - Truthy)

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;

Спробуйте в Інтернеті!

Як це працює?

Fż▲→ġ#¬Ö#≡⁰Ṫḟë½D±o¬□m;   Function, takes a character c and a string S as arguments
                    m;   Wrap each character in S into it's own string
             ë           List of four functions returning booleans:
              ½D±o¬      Lower case?,Upper case?,Digit?,Not alphanumeric?
           Ṫḟ            Outer product with find†
       Ö#≡⁰              Sort on how many characters have the same Truthyness as c
    ġ#¬                  Group strings with equal numbers of spaces
   →                     Take the last group
Fż▲                      Squash it all into one list

це функція, яка приймає присудок pі список Lі повертає перший елемент, Lякий задовольняє p. Якщо жоден елемент не задовольняє pаргумент за замовчуванням, повертається. У цьому випадку ' '. Застосовуючи один рядок символів, ми по суті говоримо if p c then c else ' '.

Є функція , яка приймає функцію fі два списки L1, L2. Він повертає таблицю fзастосованих для всіх пар L1і L2. У цьому випадку fце , L1наш список з 4 -х функцій, іL2 список з одного рядка символів.

Після того, як у Ṫḟнас з'явиться список рядків, де кожна рядок є результатом заміни символів, які не відповідають одному із правил, на a ' '.

Примітка. У нових версіях Husk ġ#¬Ö#≡⁰можна замінити на k#≡⁰економію 3 байти!


З цікавості: чому ' 'і 'a'? Можливо, я це краще розумію, коли додається пояснення, тому що я не можу прочитати лушпиння. ;)
Кевін Круїссен

Приємно! Ось 24 байти з використанням .
Zgarb

@Zgarb Дякую! Я не дуже зрозумів, що Mmmробив сам :)
H.PWiz

На жаль, це не дуже допомагає з гольфу, але S`?' може бути простішим як?IK'
Лев

Я схильний уникати використання I, іноді це змушує перекладача вічно. Це також здається марнотратним.
H.PWiz

7

Желе , 31 байт

ØṖḟØBṭØBUs26¤f€³Lİ⁴¡$ÐṀFf
¹⁶Ç?€

Спробуйте в Інтернеті!

Булевими значеннями є 2і 1(або будь-яка інша додатна парна / непарна пара), які представляють TrueіFalse відповідно,. Спробую додати пояснення після подальшого гольфу.

Завдяки caird coinheringaahing за збереження 2 байтів, а Lynn за збереження 4 байтів! Завдяки одному з фокусів Еріка , який надихнув мене зберегти 4 байти!

Як це працює

Зауважте, що це пояснення для 35-байтової версії. Новий робить приблизно те саме (але трохи підмітив Лінн), тому я його не зміню.

ØBUs26f€³µ³ḟØBW,µẎLİ⁴¡$ÐṀF - Niladic helper link.
ØB                         - String of base digits: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
                             abcdefghijklmnopqrstuvwxyz'. 
  U                        - Reverse.
   s26                     - Chop into sublists of length 26, preserving shorter
                             trailing substrings.
      f€³                  - For each, keep the common characters with the input.
            ØB             - Base digits.
          ³ḟ               - Get the signs in the input. Filter the characters of the
                             input that aren't alphanumeric.
              W,µẎ         - Concatenate (wrap, two element list, tighten).
                       ÐṀ  - Keep the elements with maximal link value.
                  L        - Length.
                    ⁴¡     - Do N times, where N is the second input.
                   İ       - Inverse. Computes 1 ÷ Length. 2 maps to the length itself,
                             because 1 ÷ (1 ÷ Length) = length; 1 yields
                             (1 ÷ Length), swapping the maximal numbers with minimal ones.
                         F - Flatten.

¹⁶e¢$?€ - Main link.
      € - For each character.
   e¢?  - If it is contained by the last link (called niladically), then:
¹       - Identity, the character itself, else:
 ⁶      - A space.


@cairdcoinheringaahing Дякую! :) Я хотів пограти в цю частину з тих пір, як я опублікував відповідь, але не зміг зрозуміти, чому це не працює ... У мене був сторонній µD:
Містер Xcoder

31 байт : генеруйте класи як ØṖḟØBṭØBUs26¤, а потім протестуйте належність із fта Çзамість e¢$.
Лінн


5

R , 193 186 179 158 байт

-7 байт завдяки NofP та його пропозиція cbind

-6 байт з використанням outer, -1 байт перемикання [^a-zA-Z0-9]з[[:punct:]]

-21 байт завдяки MickyT за вказівку на список символів дозволено

function(S,B){y=outer(c("[a-z]","[A-Z]","\\d","[[:punct:]]"),S,Vectorize(grepl))
S[!colSums(y[(s=rowSums(y))=="if"(B,max,min)(s),,drop=F])]=" "
cat(S,sep='')}

Перевірте всі тестові випадки

Приймає 1/Tяк truthy ( max) та 0/Ffalsey ( min), і приймає Sяк список одиночних символів.

Спробуйте в Інтернеті!

У моїй оригінальній версії (з пропозиціями NofP) матриця yбудується шляхом оцінки grepl(regex, S)для кожного regex, а потім об'єднання їх у колони матриці. Це призводить до декількох дзвінків grepl, але, як Sце зафіксовано, здавалося, що потрібно ще щось зробити. Як я зазначив:

Існують потенційно більш короткі підходи; mapply, наприклад:

y=mapply(grepl,c("[a-z]","[A-Z]","\\d","[^a-zA-Z0-9]"),list(S))

на жаль, це не спроститься як матриця в 1-символьному прикладі "A".

Я використовував, outerа не mapply, який завжди повертає масив (матриця в цьому випадку), і був змушений Vectorize grepl, що насправді простоmapply обгортка навколо нього.

Я також виявив заздалегідь задану групу символів, [:punct:]яка відповідає розділовим знакам (непробільних, не буквено-цифрових) символів.


1
Якщо ви заміните матрицю cbind, ви можете її зменшити до 186 байт: y = cbind (g ("[az]", S), g ("[AZ]", S), g ("\\ d", S), g ("[^ a-zA-Z0-9]", S))
NofP

@NofP о, дуже приємно. Крім того, ви можете оточити код за допомогою зворотних посилань (`), щоб він відображався like this. :)
Джузеппе

У правилах зазначено, що ви можете використовувати масив символів або список як вхідні дані, тому ви, ймовірно, могли видалитиS=el(strsplit(G,""))
MickyT

@MickyT ах, я пропустив це, дякую.
Джузеппе

4

Лушпиння , 31 29 28 байт

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□

Використовує 0 для мінімального та 1 для максимального підрахунку символів. Спробуйте в Інтернеті!

Пояснення

Списки функцій класні.

SMS?' `ṁ§foSM≠?▲▼⁰M#Kë½D±o¬□  Inputs are bit B and string S.
                     ë        Make a list L of the four functions
                      ½       is-lowercase-letter,
                       D      is-uppercase-letter,
                        ±     is-digit, and
                         o¬□  not is-alphanumeric.
                  M#          For each of them, take number of matches in S,
              ?▲▼⁰            take maximum or minimum depending on B,
          oSM≠                and mark those entries that are not equal to it.
        §f          K         Remove from L the functions that correspond to marked entries, call the result L2.
                              These functions test whether a character should be replaced by a space.
SM                            Do this for each character C in S:
      `ṁ                      Apply each function in L2 to C and sum the results.
  S?'                         If the result is positive, return space, otherwise return C.

4

Пітон 2 , 140 байт

g=lambda x:x.isalnum()-~(x>'Z')*x.isalpha()
def f(s,m):k=map(g,s).count;print''.join([' ',c][k(g(c))==sorted(map(k,range(4)))[m]]for c in s)

Спробуйте в Інтернеті!

Джонатан Фрех врятував байт. Спасибі!

Найвищий - m=-1найнижчий m=0.


1
Я думаю, ви можете зберегти байт, замінивши +x.isalpha()*-~(x>'Z')на -~(x>'Z')*x.isalpha().
Джонатан Фрех


3

Java (OpenJDK 8) , 448 439 432 362 361 354 352 348 343 320 байт

s->b->{int w[]=new int[4],m=0,n=-1>>>1,l;s.chars().forEach(c->{if(c>96&c<123)w[0]++;else if(c>64&c<91)w[1]++;else if(c>47&c<58)w[2]++;else++w[3];});for(int W:w){m=W>m?W:m;n=W<n?W:n;}l=m-n;m=b?m:n;return l<1?s:s.replaceAll("["+(w[0]!=m?"a-z":"")+(w[1]!=m?"A-Z":"")+(w[2]!=m?"\\d]":"]")+(w[3]!=m?"|[^a-zA-Z0-9]":"")," ");}

Спробуйте в Інтернеті!



Ви можете видалити +ін \\|+$за додаткову -1 байт.
Kevin Cruijssen

Можна зберегти ще три байти, змінивши останню частину на String r=(w[0]!=m?"[a-z]|":"")+(w[1]!=m?"[A-Z]|":"")+(w[2]!=m?"[0-9]|":"")+(w[3]!=m?"[^a-zA-Z0-9]|":"");return r.isEmpty()?s:s.replaceAll(r.replaceAll(".$","")," ");}.
Kevin Cruijssen

Ох, і n=s.length()можна n=-1>>>1за додаткові -4.
Kevin Cruijssen

О, ще одна маленька річ до гольфу: [0-9]->\\d
Кевін Круїссен

3

Рубі , 118 116 байт

Бере 0(найнижчий) або-1 (найвищий) за свій другий аргумент.

-2 байти завдяки Лінні.

->s,t{s.gsub(/./){|c|[/\d/,/[a-z]/,/[A-Z]/,/[^\da-z]/i].group_by{|x|s.scan(x).size}.sort[t][1].any?{|x|x=~c}?c:" "}}

Спробуйте в Інтернеті!

Безумовно

->s,t{
  s.gsub(/./) {|c|
    [ /\d/,
      /[a-z]/,
      /[A-Z]/,
      /[^\da-z]/i
    ]
    .group_by {|x| s.scan(x).size }
    .sort[t][1]
    .any? {|x| x =~ c } ? c : " "
  }
}

Дуже класна відповідь! Ви можете використовувати -1як "найвище" значення і замінити minmax[t]на sort[t].
Лінн

3

Пітон 2, 190 183 174 173 байт

Дякую Джонатану Фреху за скорочення

from re import*
def f(i,c):
 q='[a-z]','[A-Z]','\d','[\W_]';l=[len(set(finditer(p,i)))for p in q]
 for j,k in enumerate(l):
	if k-eval(c):i=compile(q[j]).sub(' ',i)
 print i

Це сприймає рядки 'max(l)'і 'min(l)'як істинні та хибні. (Я не думаю, що це порушує правила ...?) Це довше, ніж інші два відповіді пітона, але різні, тому я думав, що опублікую його. Я не великий гольфіст, тому я здогадуюсь, що це можна вдосконалити, але все, що я намагався, не вийшло.

Спробуйте в Інтернеті!


Привіт, ласкаво просимо на сайт! Коли я намагаюся запустити це, я отримую помилки, і я не зовсім впевнений, чому. Однією з причин може бути те, що sum(1for m...має бути sum(1 for m..., але я думаю, що є й інші проблеми. Чи можете ви надати посилання на онлайн-перекладача (наприклад, tio ), щоб продемонструвати, як ви це називаєте, і показати, що він не помиляється?
Джеймс

@DJMcMayhem Я щойно додав посилання, дякую за надання посилання, я не знав, як це зробити. Я не отримую помилки, коли запускаю її там.
ділнан

Ах, я не міг сказати, що ти вводиш max(l)і min(l)як рядки, тому я отримував помилки. Дякуємо, що очистили це! Хоча зараз це знаходиться на межі порушення правила №3, "Зауважте, що ці чіткі значення слід використовувати (дещо) як булеві", але це, безумовно, трохи сіра зона.
Джеймс

До речі, ось підказка TIO: Якщо ви розмістите виклики функцій у полі нижнього колонтитулу , вони не будуть зараховані до вашої кількості байтів, тому ви зможете легко побачити, як довго триває ваша відповідь: Спробуйте в Інтернеті!
Джеймс

@DJMcMayhem Ах, дякую. Я погоджуюся, що це якась сіра зона. Я міг би прийняти "max" і "min" як справжнє хибне, тоді зробіть eval (c + '(l) "), який додає 6 байтів і здається більш прийнятним, але поки ОП не відхилить мою відповідь, я припускаю, що це нормально.
dylnan

2

JavaScript (ES6), 151 149 байт

g=
(s,f,a=[/\d/,/[A-Z]/,/[a-z]/,/[_\W]/],b=a.map(r=>s.split(r).length))=>s.replace(/./g,c=>b[a.findIndex(r=>r.test(c))]-Math[f?"max":"min"](...b)?' ':c)
<input id=s oninput=o.textContent=g(s.value,f.checked)><input id=f type=checkbox onclick=o.textContent=g(s.value,f.checked)><pre id=o>

На жаль, правила, ймовірно, не дозволяють мені пройти Math.maxабо Math.minяк прапор. Редагувати: збережено 2 байти завдяки @JustinMariner.


1

Желе , 37 байт

ØWṖs26µẎØṖḟW⁸;
¢f@³L$ÐṂFe@Ѐ³¬¹⁴?a³o⁶

Спробуйте в Інтернеті!

-6 байт "запозичення" з поста Еріка: D


Lol збереження пробілів - це фактично половина програми: D
Містер Xcoder

Чи можете ви додати пояснення, чи ви все ще працюєте над гольфом?
Кевін Круїссен

@KevinCruijssen Гольф перший: D
HyperNeutrino

1

Java (OpenJDK 8) , 307 + 34 306 + 27 295 байт

Мої "цікаві" приймають на себе виклик.

Дякуємо Кевіну Крейсейну за скорочення імпортних байтів, видалення імпорту цілком!

s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,z=0,y=-1>>>1;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<s.length();i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}

Спробуйте в Інтернеті!

Пояснення:

String t=s.replaceAll("\\d","2")
          .replaceAll("[a-z]","0")
          .replaceAll("[A-Z]","1")
          .replaceAll("\\D","3")

Спочатку замінює кожну групу цілим числом від 0 до 3, використовуючи простий регулярний вираз, і зберігає це в новому рядку.

int a[]={0,0,0,0},m,i=0,z=0,y=-1>>>1;

Ініціалізує масив цілих чисел, а також пару інших цілих чисел, які використовуватиме згодом. Встановлює yзмінну до максимального розміру int, використовуючи неподписаний правий бітовий зсув.

t.chars().forEach(j->{a[j%4]++;});

Для кожного символу модифікованого рядка для його обчислення використовується модуль 4 значення ASCII для обчислення індексу вищезгаданого масиву для збільшення.

for(int x:a){
    z=x>z?x:z;
    y=x<y?x:y;
}

Потім це прокручується підрахунок кожної групи, що зберігається в масиві, і обчислює мінімум ( y) та максимум ( z).

for(;i<s.length();i++)
    v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);

Знову прокручуємо кожен символ у рядку, перевіряючи, чи дорівнює група цієї групи символів, що дорівнює min / max (використовуючи згаданий раніше модульний трюк). Якщо вона не дорівнює, то в новій рядку в місці символів додається пробіл, інакше додається початковий символ.

return v;

Нарешті поверніть нову струну!


1
Приємна відповідь, +1 від мене! Дві невеликі речі для гольфу: import java.util.stream.IntStream;можна import java.util.stream.*;і ,iможна, ,i=0після чого можна зняти i=0з петлі for-петлю. Ох, і (s,b)->може бути s->b->.
Kevin Cruijssen

@KevinCruijssen Дякую! Я не розумів, що ти можеш зав'язати лямбда
Люк Стівенс

Це називається каррінг. :) Ви можете це зробити так java.util.function.Function<String, java.util.function.Function<Boolean, String>> g = s->b->{...};.
Кевін Крейссен

1
О, і ще одна річ у гольфі: IntStream z=IntStream.of(a);m=(b?z.max():z.min()).getAsInt();можна l=s.length(),x=0,y=lі, for(int x:a){z=x>z?x:z;y=x<y?x:y;}і (b?z:y)тому вам більше не потрібно імпорту. Склавши все це стає: s->b->{String t=s.replaceAll("\\d","2").replaceAll("[a-z]","0").replaceAll("[A-Z]","1").replaceAll("\\D","3"),v="";int a[]={0,0,0,0},i=0,l=s.length(),z=0,y=l;t.chars().forEach(j->{a[j%4]++;});for(int x:a){z=x>z?x:z;y=x<y?x:y;}for(;i<l;i++)v+=a[t.charAt(i)%4]!=(b?z:y)?" ":s.charAt(i);return v;}( 294 байти ) .
Kevin Cruijssen

1
@KevinCruijssen Oooooh приємно думаючи! Я можу трохи зачекати, перш ніж змінити його на випадок, якщо ви придумаєте що-небудь інше;)
Люк Стівенс

1

Bash, 229 227 212 байт

LANG=C;g="A-Z a-z 0-9 !A-Za-z0-9";declare -A H
f()(((i=$2?99:-1));r=$1;for h in $g;{ t=${r//[$h]};t=${#t};(($2?t<i:t>i))&&i=$t&&H=([$h]=1);((t-i))||H[$h]=1;};for h in $g;{((${H[$h]}))||r=${r//[$h]/ };};echo "$r")

Спробуйте в Інтернеті


Я не впевнений, як пробіли навколо дужок і квадратних блоків працюють у Bash, але все одно, здається, це працює без місця вf(){(( .
Kevin Cruijssen

1
так, простір є загальнообов’язковим, за винятком (, також 2 байти можуть бути збережені, використовуючи (замість цього {, знижуючи продуктивність, оскільки створюється нижня оболонка
погіршує нижня частина Nahuel Fouilleul

1

PHP, 161 158 байт

for([,$s,$z]=$argv;~$c=$s[$i++];)foreach([punct,upper,lower,digit]as$f)(ctype_.$f)($c)?$$i=$f:$g[$f]++;while(~$c=$s[$k++])echo$g[$$k]-($z?min:max)($g)?" ":$c;

Запустіть -nrабо спробуйте в Інтернеті .

  • Перший цикл: для кожної позиції запам’ятайте групу символів
    та порахуйте кількість випадків у групах, у яких поточний символ не знаходиться.
    (заперечення зберегло 3 байти)
  • Залежно від другого параметра, виберіть мінімум без рахунку для правди, максимум без рахунку для помилки.
  • другий цикл: якщо (група поточного символу) безлічинна величина відрізняється
    від мінімальної / максимальної невідлікової, тоді друкується простір, інакше друкується символ.

1
@KevinCruijssen Переконайтесь, що у вас вибрана остання версія PHP (7.1.0).
Тит

1

JavaScript (ES6), 139 байт

s=>b=>s.map(c=>++a[g(c)]&&c,a=[0,0,0,0],g=c=>c>-1?0:/[a-z]/i.test(c)?c<"a"?2:1:3).map(c=>a.map(v=>v-Math[b?"max":"min"](...a))[g(c)]?" ":c)

Введення та вихід - це масив символів. Приймає фактичні булеві значення для введення.

Інший підхід від відповіді @ Ніла ; майже уникаючи регулярних виразів. Натомість я використав серію перевірок для визначення категорії кожного символу:

  • Повернення цифр true за те, c>-1що нецифрові збої не відповідають математичним порівнянням
  • Великі літери відповідають рівню /[a-z]/i і мають кодові точки менше, ніж"a"
  • Малі літери збігаються з регулярним виразом, але мають кодові точки не менше ніж "a"
  • Символи не проходять жодного з цих тестів

Випробування

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.