Виведіть номери “Fit”


21

"Придатні номери"

У Сем є "блискуча" ідея для стиснення! Ви можете допомогти?


Ось такий спосіб стиснення схеми стиснення Сема. Спочатку візьміть у базу 10 представлення будь-якого натурального числа, строго меншого за 2 ^ 16, і запишіть його як двійковий рядок без будь-яких провідних нулів.

1 -> 1
9 -> 1001
15 -> 1111
13 -> 1101
16 -> 10000
17 -> 10001
65535 -> 111111111111111

Тепер замініть будь-яку групу одного або декількох нулів на один нуль. Це тому, що число стало меншим. Зараз ваш бінарний рядок буде виглядати так.

1 -> 1 -> 1
9 -> 1001 -> 101
15 -> 1111 -> 1111
13 -> 1101 -> 1101
16 -> 10000 -> 10
17 -> 10001 -> 101
65535 -> 111111111111111 -> 111111111111111

Тепер ви перетворюєте двійкову рядок назад у базове представлення 10 та виводите її у будь-якому прийнятному форматі. Ось ваші тестові приклади. Перше ціле число являє собою вхід, а останнє ціле число являє собою вихід. Зауважте, що деякі цифри не змінюються, і тому їх можна назвати "придатними"

1 -> 1 -> 1 -> 1
9 -> 1001 -> 101 -> 5
15 -> 1111 -> 1111 -> 15
13 -> 1101 -> 1101 -> 13
16 -> 10000 -> 10 -> 2
17 -> 10001 -> 101 -> 5
65535 -> 1111111111111111 -> 1111111111111111 -> 65535
65000 -> 1111110111101000 -> 11111101111010 -> 16250


Ви можете використовувати будь-яку мову, але врахуйте, що Сем ненавидить стандартні лазівки. Це кодовий гольф, тому код може бути максимально коротким, щоб звільнити місце для "стислих" цифр.
Примітка. Це НЕ прийнятна схема стиснення. Використовуючи це, ви негайно звільниться.
Цитування: Я не приймаю за це поняття. Це відбувається з блогу @Conor O »Брайна тут побачити цей OEIS прилягання чисел. https://oeis.org/A090078


1
З комічного блогу @ Conor: посилання
1616

3
OEIS A090078 може стати в нагоді.
Аднан

Саме я написав комікс. <s> Я також очікую 35-відсоткового відшкодування роялті </s>;)
Conor O'Brien

Чи поясніть, будь ласка, пояснення проблеми?
Rohan Jhunjhunwala

1
Чому 16 дорівнює 8? Чи не повинно бути 16 10000?
вийшов

Відповіді:


10

05AB1E , 8 6 байт

b00¬:C

Пояснення

b        # convert input to binary
 00¬:    # replace 00 with 0 while possible
     C   # convert to int

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

Збережено 2 байти завдяки Аднану


Ви можете замінити „00'0на 00¬:).
Аднан

@Adnan Ніцца! Не думав про це.
Емінья

Я навіть не знаю, чому я їх чітко висунув як струни ...
Emigna

Так, це трохи протизаконно, але це працює :).
Аднан

Це виглядає так, що він виграє: D, я дам йому трохи більше часу, перш ніж приймати, щоб більше людей могли брати участь.
Rohan Jhunjhunwala

13

Утиліти Bash + GNU, 27

dc -e2o?p|tr -s 0|dc -e2i?p

Введення зчитується зі STDIN.


Приємно! Я ніколи не використовував dc:)
Master_ex

4
Сторінка dc man дуже багато читає, як документи, для деяких мов для гольфу.
Йорданія


7

Медузи , 20 байт

p
d
# S
,1
*
\dbi
 2

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

Пояснення

  • i є вхідним.
  • b перетворює його у двійковий (список цифр)
  • \dз аргументами 2і список dцифр застосовується (двійкові цифри до числа) до кожної підрядки довжини-2 списку цифр.
  • * приймає синум результатів: 00 переходить до 0, а все інше - до 1.
  • ,1 дорівнює 1 до кінця, тому остання цифра не втрачається.
  • # Sвибирає з biтих цифр, які мають 1 у списку, обчисленому вище: ті, що не є лівою половиною 00.
  • dперетворює назад у число і pдрукує результат.

6

Python 2, 36 байт

f=lambda n:n and f(n/2)<<(n%4>0)|n%2

Пряма рекурсивна реалізація без вбудованих базових перетворень або рядкових операцій. Менше гольфу:

f=lambda n:n and[f(n/2),n%2+2*f(n/2)][n%4>0]

Коли nкратний 4, вона закінчується в двох 0 в двійковому форматі, тому ми включається на пів-ділення на 2. В іншому випадку, ми поділимося nна (n%2) + 2*(n/2), залишити останню двоичная цифра n%2один, і рекурсії на інші цифри n/2.


Не є n%2зайвим?
xsot

@xsot Не впевнений, що ти маєш на увазі. Діяння |nдає неправильні результати.
xnor

Я маю в виду , ви можете замінити всі (n%4>0)|n%2з (n%4>0).
xsot

@xsot Пріоритет виглядає так (f(n/2)<<(n%4>0)) | n%2.
xnor

Ах, мені тоді погано. Я думав, що перехід має найнижчий пріоритет.
xsot

5

Bash (sed + bc), 60 55 43 байт

echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]

редагувати:

  1. змінено sed -E 's/0+на sed 's/00*та змінено ехо та трубу, що використовується для передачі значення на bc <<<.
  2. Чудова пропозиція від @Digital Trauma!

приклад:

$ bash script.sh 65000
16250
$ bash script.sh 15
15
$ bash script.sh 9
5

1
sed + bc також була моєю першою думкою. echo "obase=2;$1"|bc|sed 's/00*/0/g;s/^/ibase=2;/'|bcна 2 байти коротше
Райлі

1
Використовуйте труби і тікає в свою користь: echo $[2#`bc<<<obase=2\;$1|sed s/00\*/0/g`]. Але dcі tr зробити це коротше .
Цифрова травма

1
@DigitalTrauma: Дякую, це чудово! @Riley: приємна ідея, це було б трохи коротше:bc<<<"obase=2;$1"|sed 's/00*/0/g;s/^/ibase=2;/'|bc
Master_ex

якщо ви використовуєте tr -s 0замість sed, ви можете опуститися до 36 байт
Riley

@Riley: Правда, але Digital Trauma вже використовує його в іншій відповіді на
башти,

4

Perl 6 ,  31  27 байт

{:2(.base(2).subst(:g,/0+/,0))}
{:2(.base(2)~~{S:g/0+/0/})}

Пояснення:

-> $_ {
  # convert from base 2
  :2(

    # convert to base 2
    $_.base(2)

    # substitute
    .subst(
      :global,
      / 0+ /,  # all substrings made of 0s
      '0'      # with one 0
    )
  )
}

Приклад:

my &fit-compress = {:2(.base(2)~~{S:g/0+/0/})}
say fit-compress 1;     # 1
say fit-compress 9;     # 5
say fit-compress 15;    # 15
say fit-compress 13;    # 13
say fit-compress 16;    # 2
say fit-compress 17;    # 5
say fit-compress 65535; # 65535
say fit-compress 65000; # 16250

# number created with 「:2( [~] <0 1>.roll: 256 )」
say fit-compress 80794946326210692074631955353531749442835289622757526957697718534769445507500
# 4240335298301026395935723255481812004519990428936918

4

MATL, 11 9 8 байт

BFFOZtXB

Ця версія працює лише в MATLAB, оскільки strrepв MATLAB можна обробляти логічні введення. Ось версія, яка буде працювати в Octave (9 байт) (і, отже, інтерпретатор в Інтернеті), яка явно відкидає логічні вводи для введення double.

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

Пояснення

    % Implicitly grab input
B   % Convert decimal to binary
FF  % Create the array [0 0]
O   % Number literal
Zt  % Replaces all [0 0] with [0] (will replace any number of 0's with 0)
XB  % Convert binary to decimal
    % Implicitly display

4

Python 3, 55 , 50 байт.

Збережено 4 байти завдяки Sp3000.

Досить просте рішення.

import re
f=lambda x:eval(re.sub('0+','0',bin(x)))

4
Чи можете ви зберегти 0bі просто evalзамість цього?
Sp3000

@ Sp3000 Безумовно, можна! Дякую за пропозицію!
Морган Трапп

Дозволені анонімні лямбда; ви можете скоротити це до 48 байт, скориставшисьlambda x:eval(re.sub('0+','0',bin(x))) <insert newline here> import re
MilkyWay90

3

Javascript (ES6), 40 байт

n=>'0b'+n.toString(2).replace(/0+/g,0)-0

1
Боюся, це фрагмент. Якщо в описі виклику не вказано інше, очікується, що рішення будуть або повноцінними програмами, або функціями.
манантська робота

Що вимагає бути "повною програмою" в Javascript, якщо я не хочу використовувати функцію? Порадьте, будь ласка.
cychoi

Наприклад , з Node.js: console.log(+('0b'+parseInt(process.argv[1]).toString(2).replace(/0+/g,0))).
манатство

Не по темі. У вашому блоці коду є та сама проблема, що і в @Master_ex. Це тому, що деякі популярні сценарії конфігурації оболонки забруднюють термінал? Або винна SE?
cychoi

1
Найкоротшим виправленням може бути N=>попередження, яке зробить його дійсним поданням функції.
Мартін Ендер

3

Насправді 14 байт (неконкуренто)

├`'0;;+(Æ`Y2@¿

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

Це надсилання не є конкурентоспроможним, оскільки виправлена ​​помилка Æпісля публікації цього виклику.

Пояснення:

├`'0;;+(Æ`Y2@¿
├               bin(input) (automatically discards leading zeroes)
 `'0;;+(Æ`Y     call this function until the output stops changing:
  '0;;+           push "0", "00"
       (Æ         replace "00" with "0" in binary string
           2@¿  convert from binary to decimal

Тоді опублікуйте конкуруючу версію!
Leaky Nun



2

PHP, 53 51 байт

<?=bindec(preg_replace("/0+/",0,decbin($argv[1])));

Бере аргумент з консолі.

Завдяки:

@manatwork замініть "0" на 0


1
Здебільшого "0"і 0обробляються однаково.
манатурка

@manatwork Дякую Це було досить очевидним, що я повинен був бачити себе.
Jeroen

2

Perl, 38 + 1 ( -p) = 39 байт

$_=oct"0b".sprintf("%b",$_)=~s/0+/0/gr

Потрібен -pпрапор для запуску (я додав -lпрапор, щоб зробити його більш читабельним, але інакше він не потрібен):

perl -plE '$_=oct"0b".sprintf("%b",$_)=~s/0+/0/gr' <<< "1
9
15
13
16
17
65535
65000"

Зауважте, що сказати про код: він перетворює число у двійковий ( sprintf"%b"), потім замінює блоки нулів лише на один нуль і перетворює результат у десятковий ( oct"0b".).


2

C #, 112 91 байт

int x(int x)=>Convert.ToInt32(Rege‌​x.Replace(Convert.ToS‌​tring(x,2),"0+","0"),2);

-8 байт завдяки TuukkaX


int f(int x){var a=Regex.Replace(Convert.ToString(x,2),"0+","0");return Convert.ToInt32(a,2);}- 94 байти за допомогою регулярного вираження. Я бачив, що багато C # рішень не включають, System.Text.RegularExpressionsтому, можливо, це дозволено і тут ...?
Yytsi

int f(int x){return Convert.ToInt32(Regex.Replace(Convert.ToString(x,2),"0+","0"),2);}86 байт.
Yytsi

я не знаю, як ви рахуєте
downrep_nation

Я також використовую цю сторінку, але вона не працюватиме, тому я використовував іншу сторінку. Ви також повинні згадати необхідну версію C #.
Yytsi

mothereff.in/byte-counter обчислює 79 байт для вашого поточного рішення. Мені довелося ввести рішення вручну, інакше це дасть мені 91.
Yytsi

2

Ява, 75

int f(Integer x){return x.valueOf(x.toString(x,2).replaceAll("0+","0"),2);}

Тестова програма:

public class Fit {
    int f(Integer x){return x.valueOf(x.toString(x,2).replaceAll("0+","0"),2);}

    public static void main(final String... args) {
        final Fit x = new Fit();
        System.out.println(x.f(65000));
    }
}

Java 8 перетворити на lamda x-> blah; для меншої кількості байтів
Рохан Джунхунвала

int f (Integer x) {return x.parseInt (x.toString (x, 2) .replaceAll ("0 +", "0"));} на пару менших байтів
Rohan Jhunjhunwala

@RohanJhunjhunwala Це неправильно, для цього потрібно використовувати базу 2. Що стосується лямбда, я вважаю, що вона не є повною без специфікації типу.
aditsu

о добре, інша відповідь java використовує ту саму техніку
Rohan Jhunjhunwala



1

PowerShell v2 +, 69 байт

[convert]::ToInt32(([convert]::ToString($args[0],2)-replace'0+',0),2)

( . Коротший спосіб перетворення в / з бінарного в PowerShell )

Бере введення $args[0], використовує вбудований .NET [convert]::ToString(int,base)для перетворення вхідного цілого числа у бінарний базовий рядок. Це фільтрується через -replaceсмужку, щоб викреслити будь-які пробіги одного або більше-нулів просто 0. Цей результуючий рядок надсилається назад через інший напрямок через[convert]::ToInt32(string,base) щоб перетворити двійковий назад у ціле число. Це ціле число залишено на конвеєрі, а вихід неявний.

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

PS C:\Tools\Scripts\golfing> 1,9,15,13,16,17,65535,65000|%{"$_ -> " +(.\output-fit-number.ps1 $_)}
1 -> 1
9 -> 5
15 -> 15
13 -> 13
16 -> 2
17 -> 5
65535 -> 65535
65000 -> 16250

1

Реалізація посилань у SILOS "лише" 417 байт

Гольф

readIO :
i + 1
I = i
z = 1 
n = 32
b = n
z = 1
n = b
lbla
n - 1
GOSUB p
j = i
j - p
if j b
if z c
z = 1
GOTO e
lblc
b - 1
if n a
GOTO f
lblb
z = 0
A = a
A + 1000
set A 1
i - p
lble
a + 1
if n a
lblf
q = 1000
e = q
e + b
i = 0
lbl>
d = q
d - e
if d ?
n = b
n - i
GOSUB p
g = get q
g * p
o + g
i + 1
q + 1
GOTO >
lbl?
o / 2
printInt o
GOTO z
funcp
p = 1
Z = n
lblQ
if Z C
GOTO D
lblC
Z - 1
p * 2
GOTO Q
lblD
return
lblz

Ось реалізація посилань повністю не зосереджена. Як бонусна функція, вона дає кроки, необхідні для отримання відповіді.

/**
*Reference Implementation in the high quality S.I.L.O.S language.
*/
readIO Enter a number to "compress"
//some declarations
i + 1
I = i
z = 1 
//the above is a flag which shows whether or not a zero was last outputted
n = 32
b = n
//maximum number of input bits
printLine Original Binary



lblbinLoop
n - 1
GOSUB pow
j = I
j - p
if j printOne
if z ENDLOOP
print 0
GOTO ENDLOOP
lblprintOne
z = 0
print 1
I - p
lblENDLOOP
if n binLoop




printLine  
printLine Binary "Compressed"


z = 1
n = b


lbltopA
n - 1
GOSUB pow
j = i
j - p
if j printAOne
if z DontPrint
z = 1
print 0
GOTO ENDLOOPA
lblDontPrint
b - 1
if n topA
GOTO endOfBin
lblprintAOne
z = 0
print 1
A = a
A + 1000
set A 1
i - p
lblENDLOOPA
a + 1
if n topA

lblendOfBin

printLine  
printLine -----------
printLine Base 10 Output
print Out Bits:
printInt b

q = 1000
e = q
e + b
i = 0
lblOutputDec
d = q
d - e
if d DONE
n = b
n - i
GOSUB pow
g = get q
g * p
o + g
i + 1
q + 1
GOTO OutputDec
lblDONE
printLine
printLine ---------
o / 2
printInt o

GOTO funcs
//function declarations must be wrapped in gotoes to avoid the interpreter from complaining (breaking)

/**
*This will store the nth power of two in the "p" variable
*/
funcpow
p = 1
Z = n
lbltop
if Z continue
GOTO end
lblcontinue
Z - 1
p * 2
GOTO top
lblend
return

lblfuncs

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

Вибірка вибірки для 65000

Enter a number to "compress"
65000
Original Binary
1111110111101000 
Binary "Compressed"
11111101111010 
-----------
Base 10 Output
Out Bits:14
---------
16250

4
Реалізація довідок повинна знаходитись у тілі викликів, а не як відповіді, оскільки вони є непрограшними і, отже, не є серйозними конкурентами.
Мего

Гаразд, я пограю в гольф.
Rohan Jhunjhunwala

Я не хотів підірвати тіло виклику цим @Mego
Rohan Jhunjhunwala

@TimmyD одну секунду я зараз гольфую
Rohan Jhunjhunwala

@Mego Я зараз займався гольфом
Rohan Jhunjhunwala


1

Сітківка , 30 байт

.+
$*1;
+`(1+)\1
$1;
1;
1
;+
0

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

І ось я подумав, що Ретіна буде серед перших відповідей ...


@randomra Я задаю питання OP для уточнення
Leaky Nun

Чи здатна сітківка перетворювати двійкову на десяткову чи двійкову до одинакової конверсії? Я буду виключати будь-яку, щоб не виключити сітківку
Rohan Jhunjhunwala

@RohanJhunjhunwala: Так, це
Бізнес-кіт

Чи можливо зробити це перетворення в одинарне чи десяткове? В ідеалі я хотів би побачити десятковий, але я прийму будь-який.
Rohan Jhunjhunwala

1

Java, 152 143 138 байт

interface C{static void main(String[]b){Integer i=0;System.out.print(i.parseInt(i.toString(i.parseInt(b[0]),2).replaceAll("0+","0"),2));}}
  • На 9 байт менше завдяки @RohanJhunjhunwala. Я вважаю за краще тримати його як повністю функціонуючу програму з основним тощо. Однак, звичайно, можна по-іншому гольфу більше.
  • На 5 байт менше завдяки пропозиціям @ LeakyNun.

1
клас A {загальнодоступний статичний недійсний головний (String [] a) {Integer i; System.out.print (i.parseInt (i.toBinaryString (i.parseInt (a [0])). substituAll ("0+", " 0 "), 2));}} за 8 байт збереження
Rohan Jhunjhunwala

загортайте його в лямбда-вираз для ще більшого збереження та видалення визначень класу та вашого набору.
Rohan Jhunjhunwala

@RohanJhunjhunwala: Ах! Integer i;Частина проста і фантастика!
Master_ex

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

1
codegolf.stackexchange.com/questions/6671/… - це корисне ознайомлення, щоб ознайомитись з менш відомими (насмілюся сказати, тінішими) "особливостями" мови Java.
Rohan Jhunjhunwala

1

Діалог APL , 19 байт

{2⊥⍵/⍨~0 0⍷⍵}2∘⊥⍣¯1

СпробуйтеAPAP онлайн!

Ця функція справді є "на вершині" двох функцій, перша функція:

2∘⊥⍣¯1зворотний з бінарні в десяткове цілому конверсії, тобто БІНАР від десяткового цілого перетворення
два 2 пов'язано з -По-десятковому
повторити операцію одне негативного час ¯1(тобто один раз, але перевернуте)

У другій функції вищевказаний бінарний результат представлений :

{2⊥⍵/⍨~0 0⍷⍵}
0 0⍷⍵Булево, де {0, 0} починається з ⍵
~булевого заперечення, тому тепер у нас є ᴛʀᴜᴇ скрізь, але при не перших нулях у нульових
⍵/⍨прогонах використовують це для фільтрації ⍵, тож це видаляє наші небажані нулі
2⊥перетворювати двійкові в десяткові


1

TSQL, 143 байти

Не використовувати вбудовані модулі для перетворення з бінарних даних у бінарні.

Гольф:

DECLARE @i INT=65000

,@ CHAR(99)=''WHILE @i>0SELECT @=REPLACE(LEFT(@i%2,1)+@,'00',0),@i/=2WHILE @>''SELECT @i+=LEFT(@,1)*POWER(2,LEN(@)-1),@=STUFF(@,1,1,'')PRINT @i

Безголівки:

DECLARE @i INT=65000

,@ CHAR(99)=''
WHILE @i>0
  SELECT @=REPLACE(LEFT(@i%2,1)+@,'00',0),@i/=2

WHILE @>''
  SELECT @i+=LEFT(@,1)*POWER(2,LEN(@)-1),@=STUFF(@,1,1,'')

PRINT @i

Скрипка


+1 за використання вбудованих додатків. Моя відповідь SILOS (реалізація посилань) робить те саме, але це було знижено, оскільки люди не думали, що це серйозний конкурент. Чи є новий рядок значущим?
Rohan Jhunjhunwala

@RohanJhunjhunwala нова лінія не є суттєвою. Я підраховую символи коду після того, як вхідна змінна була визначена і призначена значення.
t-clausen.dk

ок сенс Амкеса -
Рохан Джунххунвала

@RohanJhunjhunwala Я думаю, що це здорово, що ви використовуєте неконверсійну мову для вирішення питань Codegolf. Здається, у вас є непотрібний код для додавання додаткової інформації - мабуть, лише у вашій версії, що не має волі. Ви завжди повинні намагатися надати найкоротший можливий код, скорочуючи кути та зловживаючи мовними запитаннями (в межах питання). Якщо можливо, вам слід надати загадку, тому маглів я можу перевірити її
t-clausen.dk

Версія без гольфу містить непотрібний код, але версія для гольфу не містить додаткового коду. Я можу перекласти його в Java, якщо ви хочете, щоб я його протестував.
Rohan Jhunjhunwala

1

CJam, 16

q~2b1+0a%0a*);2b

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

Це досить довго через відсутність регулярного вираження.

Пояснення:

q~     read and evaluate the input number
2b     convert to base 2 (array of 1s and 0s)
1+     append a 1 to deal with trailing zeros
0a%    split by [0], dropping empty pieces; only chunks of 1s are left
0a*    join by [0]
);     discard the 1 we appended before
2b     convert back from base 2

1

Java, 64 байти

i->{return i.parseInt(i.toString(i,2).replaceAll("0+","0"),2);};

Тестова програма

public static void main(String[] args) {
    Function<Integer, Integer> function = i -> {
        return i.parseInt(i.toString(i, 2).replaceAll("0+", "0"), 2);
    };

    System.out.println(function.apply(1)); // 1
    System.out.println(function.apply(9)); // 5
    System.out.println(function.apply(15)); // 15
    System.out.println(function.apply(13)); // 13
    System.out.println(function.apply(16)); // 2
    System.out.println(function.apply(17)); // 5
    System.out.println(function.apply(65535)); // 65535
}

1

CJam , 23 байти

ri2be`{_:g:>{:g}&}%e~2b

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

Пояснення

ri          e# Read input as an integer
2b          e# Convert to binary
e`          e# Run-length encoding. Gives a nested (2D) array with run-lengths 
            e# and binary digits
{           e# This block is mapped over the outer array, i.e. is applied to
            e# each inner array
   _        e#   Duplicate the inner array
  :g        e#   Signum of each element of inner array
  :>        e#   This gives true if second element (digit) is false and first
            e#   element (run-length) is not zero. If so, we need to set that
            e#   run-length to 1
  {:g}&     e#   If that's the case, apply signum to original copy of inner
            e#   array, to make run-length 1
}%          e# End block which is mapped over the outer array
e~          e# Run-length decoding
2b          e# Convert from binary. Implicitly display

1

Рубі, 37 35 байт

Збережено два байти завдяки маневреній роботі.

->a{a.to_s(2).gsub(/0+/,?0).to_i 2}

Наївний підхід. (:


Що стосується "0"см 2 - й пункт в sepp2k «s наконечник . Що стосується .to_i(2), коли немає двозначності щодо того, куди належить параметр, круглі дужки необов’язкові.
манатурка

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