Приштин та унікальний код боулінгу


80

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

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

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

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


Ось повне визначення первозданної програми, скопійованої із вищенаведеного посилання:

Давайте визначимо незайману програму як програму, яка не має жодних помилок, але буде помилкою, якщо змінити її, видаливши будь-яку суміжну підрядку з N символів, де 1 <= N < program length.

Наприклад, три символьна програма Python 2

`8`

це незаймана програма, тому що всі програми, що виникають у результаті видалення підрядків довжиною 1, викликають помилки (насправді синтаксичні помилки, але будь-який тип помилок буде робити):

8`
``
`8

а також усі програми в результаті видалення підрядків довжиною 2 викликають помилки:

`
`

Якщо, наприклад, `8була програма, що не помиляється, тоді `8`вона не була б незайманою, оскільки всі результати видалення підрядків повинні помилятися .


37
Капелюхи від вас за управління, щоб створити хороший код-боулінг виклик!
ETHproductions

Якщо підпрограма працює вічно, але помилка не робить цю відповідь недійсною?
ділнан

1
@dylnan "помилка визначається як [...] закінчення [...] через обмежений час."
користувач202729

3
@Baldrickk Ні, це завдання не буде дозволено. (Якщо ви посилаєтесь на приклад у запитанні, це демонстрація того, що таке первозданна програма, але яка не відповідає додатковій вимозі унікальних байтів.)
Айдан Ф. Пірс,

1
Чи можна вважати невизначену поведінку помилкою, якщо на практиці це зазвичай призводить до помилки? Я думаю про щось на зразок JMP <address outside of the program's memory>у зборах. В принципі, на справжньому комп’ютері він може нескінченно циклічно виходити або виходити з ненульовою помилкою, але, як правило, він виходить аварійно.
Кріс

Відповіді:


20

Желе , 253 254 256 байт

M“¢£¥¦©¬®µ½¿€ÆÇÐÑ×ØŒÞßæçðıȷñ÷øœþ !"#%&'()*+,-./0145689:;<=>?@ABCDEFGHIJKNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|~¶°¹²³⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ƁƇƑƓƘⱮƝƤƬƲȤɓƈɗƒɠɦƙɱɲƥʠɼʂƭʋȥẠḄḌẸḤỊḲḶṂṆỌṚṢṬỤṾẈỴẒȦḂĊḊĖḞĠḢİĿṀṄȮṖṘṠṪẆẊẎŻḅḍẹḥịḳḷṃṇọṛṣṭụṿẉỵẓȧḃċḋėḟġḣŀṁṅȯṗṙṡṫẇẋẏż”L»«’Ɗạ‘}237$¤¡

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

Виходить мови для гри в гольф можуть миску ...

  • +1 байт, працюючи в . Зараз тільки «»не використовуються
  • +2 байти з с «». Тепер майте оптимальний бал!

Як?

Найважливішою особливістю Jelly, яка робить це можливим, є те, що символи, що відкриваються та закриваються для рядкових літералів, не такі, як майже у всіх інших мовах.

Структура програми така:

M <239 character long string> L»«’Ɗạ‘}237$¤¡

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

Для запобігання Mдії 0в повній програмі ми використовуємо ¡швидкий, який застосовується Mкілька разів, визначений результатом посилання безпосередньо перед ним. У цьому випадку це посилання є <239 character long string> L»«’Ɗạ‘}237$¤.

Lприймає довжину цього рядка (239), і »«’Ɗзменшує його до 238. »«Частина нічого не робить, але Ɗ(останні три посилання як монада) робить це так, що якщо їх видалити, виникла помилка. Потім приймається абсолютна різниця між результатом »«’Ɗі монадою, ‘}237$застосованим до рядка. приріст і є монадою, але }перетворює це в діаду і застосовує його до правильного аргументу 237, поступаючись 238. Таким чином, поступається 0в повній програмі.

¤посилання назад до рядкового буквалу, що утворює нилад. Результат цього 0, тому Mне застосовується взагалі, запобігаючи будь-якій помилці.

Можливі підпрограми:

  • Якщо будь-яку частину рядка буде видалено, <string>..¤вона не буде нульовою та Mзастосовується до неї 0, викликаючи помилку.
  • Якщо будь-яка частина L»«’Ɗạ‘}237$вилучена або Mбуде застосована, 0або будуть відбуватися операції між рядком і числом, в результаті чого з'явиться a TypeError.
  • Якщо будь-яке з ¤¡них видалено, Mзастосовується до нього 0.
  • Якщо символ, що закриває рядок, і обидва ’‘вилучаються, і ні, все після Mперетворення в рядок так Mбуде діяти 0.
    • Якщо символ закриття рядка і видаляються і не всі між і перетворюється в список цілих чисел.
  • Якщо Mвилучено самотужки, це є, EOFErrorтому що ¡очікує посилання перед попереднім nilad.
  • Якщо M“і будь-яка кількість символів після її видалення буде, EOFErrorтому що ¤шукає ниладу, який передує йому, але не знаходить його. 238не рахується, тому що це частина монади.

Це в значній мірі охоплює все.

Раніше я не використовував, «»‘тому що останні два не можуть бути включені в рядок, оскільки вони відповідають символу для формування інших речей, ніж рядки. «не може бути в “”рядку, але я не знаю, чому.


31

Haskell , 39 45 50 52 60 байт

main=do{(\𤶸	陸 ⵙߜ 新->pure fst)LT
EQ[]3
2$1}

Для певного типу a ідентифікатор mainповинен мати тип IO a. Коли програма виконується, проводиться обчислення main, і його результат відкидається. У цьому випадку його тип є IO ((a,b)->a).

Результатом є застосування функції (λ a b c d e f → return fst), шестиаргументної постійної функції, що повертає функцію fst (яка дає перший елемент 2-кортежу), що вводиться в монаду IO. Шість аргументів LT(перерахування менше ніж), EQ(перерахування рівності), порожній список [], 3, 2і 1.

Пробіли замінюються унікальними символами, які вважаються пробілами: вкладка, нерозривний пробіл, формат подачі, вертикальна вкладка, OGHAM SPACE MARK, регулярний пробіл, нова лінія та повернення каретки. Якщо будь-який із них відсутній, у кількості аргументів буде невідповідність. Імена параметрів вибираються у вигляді трьох-чотирьох байтових символів UTF-8 𤶸陸ⵙ商ߜ新, ретельно вибираючи символи, які не призводять до дублювання байтів.

Дякуємо @BMO за його цінні внески.

Шістнадцятковий дамп:

00000000: 6d61 696e 3d64 6f7b 285c f0a4 b6b8 09ef  main=do{(\......
00000010: a793 c2a0 e2b5 990c e595 860b df9c e19a  ................
00000020: 80e6 96b0 2d3e 7075 7265 2066 7374 294c  ....->pure fst)L
00000030: 540a 4551 5b5d 330d 3224 317d            T.EQ[]3.2$1}

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


Hm, '\109999'здається, дійсна, принаймні, у GHC 8.2.2. '\10999a'створює лексичну помилку.
чепнер

@chepner: Я щойно тестував GHC 8.2.2, а також 𚶯створює лексичну помилку.
ბიმო

2
@chepner: найбільший Char є maxBound :: Char, тобто '\1114111'. Примітка: цифри десяткові за замовчуванням, так що якщо ви хочете , шестикутника, ви повинні занурюватися xпісля того , як \ , наприклад '\x10999a'.
німі

@nimi Aaaand я думаю, ми встановили, як часто я фактично використовую уникнення Unicode :) Використання правильної форми для шістнадцяткових значень, \x10ffffпрацює добре і \x110000надає помилку поза діапазоном, як можна було б очікувати.
чепнер

24

Python 2 ,  20 21 33 39 45  50 байт

Зараз дуже багато спільних зусиль!

+2 завдяки Айдану Ф. Пірсу (замінити sorted({0})на map(long,{0}))

+8 завдяки dylnan (використання \та новий рядок для заміни простору; пропозиції перейти 0до математичного виразу; замінивши -1на -True; використання шістнадцяткових)

+11 завдяки Angs ( 4*23+~91-> ~4836+9*1075/2потім пізніше ~197836254+0xbCABdDF-> ~875+0xDEAdFBCbc%1439/2*6)


if\
map(long,{~875+0xDEAdFBCbc%1439/2*6})[-True]:q

Спробуйте в Інтернеті! Або подивіться набір підтверджень

0xDEAdFBCbcє шістнадцятковим і оцінює до 59775106236.
~біт-розумним доповненням, так ~875оцінюється -876.
%є оператором модуля, який так 0xDEAdFBCbc%1439оцінює 293.
/це ціле ділення, так що 0xDEAdFBCbc%1439/2оцінюється до 146.
*є множенням, так xDEAdFBCbc%1439/2*6оцінюється до 876.
+Доповнення так ~875+xDEAdFBCbc%1439/2*6оцінює 0.
... жодна знімана версія також не оцінюється 0.

{0}є setщо містить єдиним елементом, 0.

Виклик sortedз в setякості аргументу наводить список, який може бути проіндексовані в с [...].

Без sortedкоду ({0})просто setвийшло б і це не можна індексувати так само, if({0})[-True]:qпіднімемо a TypeError.

Індексація в Python базується на 0 і дозволяє негативну індексацію ззаду та Trueеквівалентна 1, отже, sorted({0})[-True]знаходить елемент 0, а sorted({0})[True]підніме IndexError, як буде, так sorted({})[-True]і sorted({0})[]недійсний синтаксис.

0, Який знаходиться в falsey так тілі if, q, ніколи не виконується, однак , якби це було підняти , NameErrorтак як qне була визначена.

Оскільки не порожній список є правдоподібним, ми не можемо підрівняти if[-1]:qжодне з них.

Перегляньте набір підтверджень, щоб побачити: підтвердження байтів унікальних; всі помилки; і успіх самого коду.


17

C (tcc) , x86_64, 29 31 33 39 40 байт

main[]={(23*8),-~0xABEDFCfebdc%95674+1};

Повертає 0 . Дякуємо @feersum за те, що він пропонує великі шістнадцяткові цифри.

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

Як це працює

Завдання записує два входи ( 184 та 49664 ) у місце пам'яті основного . З 32-бітовими входами та порядком байтів малоекземлярів є точні байти b8 00 00 00 00 c2 00 00.

Оскільки tcc не оголошує визначений масив як .data (більшість компіляторів), то перехід до головного виконує машинний код, на який він вказує.

  • b8 00 00 00 00( mov eax, imm32) зберігає int 0 в регістрі eax.

  • c2 00 00( ret imm16) вискакує 0 зайвих байт із стека та повертається. (Значення в регістрі eax - це значення повернення функції).


15

> <> , 122 байти

e"~l=?!z6-d0p}xwutsrqonmkjihgfcba`_]\[>ZYXWVUTSRQPONMLKJIHGFEDCB@<:98754321/,+*)('&%$# .	|{Ay

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

Нічого не робить. На основі того ж формату, що і моя відповідь Програмування в Приштині .

Спочатку ми перевіряємо, чи довжина коду дорівнює 122, і помилка, якщо її немає. ><>програми не можуть закінчитися без використання ;команди, але якщо ця команда є в програмі, ми можемо просто видалити все перед цим, щоб програма негайно закінчилася. Для боротьби з цим ми використовуємо pкоманду для розміщення ;в коді під час виконання. Для цього віднімаємо 6 від Aі ставимо його після p.

Я, мабуть, додаю більшість інших значень вище 127, як тільки я визначу правильні два байти. Відсутні 5 значень v^;і два нових рядки.

З 7502 підпрограм, 7417 з них помилилися з невірних інструкцій, 72 - з підточеної пам'яті та 13 - з втратою пам'яті.


13

JavaScript, 42 байти

if([0XacdCADE*Proxy.length]!=362517948)田
  • Видалення i, fабо ifвикличе SyntaxError: missing ; before statement;
  • Видалення спричинить SyntaxError: expected expression, got end of script;
  • Видалення 1 або 2 байтів з цього викличе Invalid or unexpected token;
  • Змінення булевого виразу спричинить помилку синтаксису або помилку посилання

00000000: 6966 285b 3058 6163 6443 4144 452a 5072  if([0XacdCADE*Pr
00000010: 6f78 792e 6c65 6e67 7468 5d21 3d33 3632  oxy.length]!=362
00000020: 3531 3739 3438 29e7 94b0                 517948)...


8

Мозок-Флак , 2 байти

<>

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

Або [], {}або (). Видалення будь-якої дужки призводить до того, що інша дужка не буде відповідати.

Доказ того, що це оптимальне рішення:

Програма Brain-Flak складається з ниладів (пара дужок самостійно) або монад (пара дужок, що містять 1 або більше ниладів). Монада не може бути в первозданній програмі, оскільки ви можете просто видалити один або кілька ниладів. Аналогічно, у вас не може бути більше однієї програми, оскільки ви можете видалити один з них, не порушуючи програму.

Таким чином, це може бути найменш оптимальною мовою для незайманого або унікального програмування.


6

Ада, 110 байт (латинська1)

Мабуть, найкраща відповідь, яку ви отримаєте з будь-якої мови, що використовується у промисловості?

Hexdump:

0000000: 7061 636b 4167 4520 6266 686a 6c6d 6f71  packAgE bfhjlmoq
0000010: 7274 7576 7778 797a e0e1 e2e3 e4e5 e6e7  rtuvwxyz........
0000020: e8e9 eaeb eced eeef f0f1 f2f3 f4f5 f6f8  ................
0000030: f9fa fbfc fdfe 0d69 730b 656e 6409 4246  .......is.end.BF
0000040: 484a 4c4d 4f51 5254 5556 5758 595a c0c1  HJLMOQRTUVWXYZ..
0000050: c2c3 c4c5 c6c7 c8c9 cacb cccd cecf d0d1  ................
0000060: d2d3 d4d5 d6d8 d9da dbdc ddde 3b0a       ............;.

Компілюйте, зберігаючи будь-який файл, який закінчується .adsта працює gcc -c <filename>. Виробляє виконуваний файл, який нічого не робить. (Неможливо надати посилання TIO, оскільки TIO ставить код у.adb файл і gccза замовчуванням намагається знайти відповідну специфікацію для них)

В основному оголошує пакет із назвою, що зловживає великими / малими літерами latin1. Для кожного простору потрібен різний символ пробілу, тому він використовує простір, CR, LF та TAB.

Як це виглядає у версії vim:

packAgE bfhjlmoqrtuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ^Mis^Kend^IBFHJLMOQRTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ;

Як це працює

У Ада можна навіть складати технічні характеристики. Spec - це як файли заголовків c, але більш повнофункціональні і можуть складати якийсь основний код. Щоб бути дійсним, будь-яка специфікація повинна мати формат: package <NAME> is ... end <NAME>;с<NAME> збігом. Приємна річ у Ада - це те, що вона абсолютно не чутлива до справи. Таким чином, поки у вашого імені є великі та малі варіанти, вам буде добре!

Важкою частиною було отримання комбінованої одиниці. Зазвичай програми Ada мають "основну" процедуру або функцію, що лежить поза будь-яким пакетом, який стане остаточним виконуваним файлом. На жаль, процедури вимагають beginключового слова, що призводить до занадто багато es (відомі лише 2 випадки), тоді як функції вимагають returnключового слова, що призводить до занадто великої кількості ns. Таким чином, мені довелося просто скласти пакет.


4

C, 8 байт

main(){}

Нічого не робить.

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


1
Можливо, я не розумію виклику, але що робитиmain(){short x;}
Джеррі Єремія

@JerryJeremiah: ні, main(){short;}компілюється лише з a warning: useless type name in empty declaration. Я думаю, що для C99 і C ++ потрібен чіткий тип повернення, щоб int main(або, можливо unsigned main) міг працювати, але не з gcc, який попереджає навіть з -std=c11.
Пітер Кордес

@JerryJeremiah: return 0;можливо, це можливо з C89, де return 0в кінці кінця немає неявного main. За іншими відповідями вихід з ненульовим статусом можна вважати провалом. Чи -Werrorправильно додавати прапорці компілятора, як підрахунок до балу, добре в боулінгу коду? Тому що суворо виконувати порушення C11 може дати програму набагато довший. Хм, #include<>щось, а потім використовувати; ви не можете видалити і включення, і використання, і якщо воно вийде з ладу без прототипу або макрозахисту, ви виграєте.
Пітер Кордес

@PeterCordes Я думав про це, але mainі те, і includeінше містять i, так що ви не можете мати обох. Аналогічно для оголошення та використання функції. Також використовуючи returnзовсім придумати це.
Кріс

ой, я забув про унікальну байтну вимогу; звичайно, int mainне може працювати.
Пітер Кордес

4

JavaScript, 22 байти

with(0xF?JSON:[])parse

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

Можливі помилки

При зміні він видасть одну з таких помилок 1 :

[some_identifier] is not defined
expected expression, got ')'
expected expression, got ':'
expected expression, got '?'
expected expression, got ']'
expected expression, got end of script
identifier starts immediately after numeric literal
missing ( before with-statement object
missing ) after with-statement object
missing : in conditional expression
missing ] after element list
missing exponent
missing hexadecimal digits after '0x'
missing octal digits after '0o'
unexpected token: ')'
unexpected token: ']'
unexpected token: identifier

1. Точна кількість явних помилок залежить від двигуна. Цей список створено за допомогою SpiderMonkey (Firefox).


3

Python 3 + Flask-Env , 7 13 14 17 байт

import\
flask_env

Ніякого TIO, оскільки його немає flask-env.

Знайдено найдовше ім'я модуля, яке не має перетину importі не має жодних чисел у кінці імені. _sha256довше, але 256самостійно не помиляється. Я знайшов одну бібліотеку, b3j0f.syncщо на один байт довше, але я не зміг її імпортувати належним чином.

  • +1 байт, замінивши пробіл після importна \<newline>. Виймання будь-якого або обох викликає помилку.

Можливо, є ще довші варіанти, ніж flask_envя насправді не робив вичерпного пошуку, але я переглянув ~ 70 000 модулів. Відкрити для пропозицій.


256працює без помилок.
Айдан Ф. Пірс

@ AidanF.Pierce Спасибі, виправлено.
ділнан

Я спробував import *[hawkey]і подібне, але, на жаль, не працює ...
dylnan

1
Хокі немає в стандартній бібліотеці, тому це "Python with hawkey" (напевно, це може бути краще і з іншим модулем десь)
Jonathan Allan

@JonathanAllan Добре. Треба їхати прямо зараз, але я шукатиму пізніше
dylnan

3

R , 14 байт

(Sys.readlink)

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

Це може бути найдовше можливим у Р. Виклик будь-якої функції приречений на збій, тому що ви зможете видалити все, крім імені функції, що призведе до того, що надрукується вихідний код функції. Це найдовший іменований об'єкт у налаштуваннях R за замовчуванням, не містить дублікатів символів та жодного імені об'єкта при видаленні суміжних символів.

Ця перша спроба не спрацювала, але я багато чого навчився, намагаючись!

dontCheck({family;NROW})


2

Perl 5, 3 байти

y=>

=>- це "жирна кома", яка цитує баревору зліва. Тож це рівнозначно

"y",

що нічого не робить.

Без жирової коми yє оператором транслітерації, який недійсний без трьох повторень, що повторюються пізніше.

Сама жирна кома також недійсна, як =і >сама.


2

мозковий ебать , 2 байти

[]

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

Натхненний відповіддю Мозга -Флака Джо Кінга . Це оптимально, тому що єдиною помилкою в мозковій епіляції є неперевершені дужки. (Знову дякую Джо Кінгу за цю інформацію.)


Так. Єдиною помилкою, яка може мати мозкові помилки, є неперевершені дужки
Jo King


1

Стандартний ML , 22 байти

val 1089=op-(765,~324)

Спробуйте в Інтернеті! op-(a,b)є дегазованою формою a-b. ~позначає одинарний мінус, тому ми насправді обчислюємо 765+324. Цей вираз узгоджено по константі 1089. Цей матч є успішним, якщо програма не була підроблена і не робиться - ну нічого.

Якщо збіг не вдається, оскільки деякі цифри було вилучено, ви отримуєте an unhandled exception: Bind. Видалення op-результатів помилки типу, тому що кортеж узгоджується з int. Усі інші видалення повинні призвести до синтаксичної помилки.


1

Швидкий 4 , 19 байт

[].contains{1 !=
0}

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

Усі можливі помилки, які я знайшов:

  • Видалення будь-якого з [, ], {або }призведе до синтаксичну помилку
  • Видалення [].призведе доUse of unresolved identifier 'contains'
  • Видалення .призведе доConsecutive statements on a line must be separated by ';'
  • Видалення []призведе доReference to member 'contains' cannot be resolved without a contextual type
  • Видалення {1 !=␊0}призведе доExpression resolves to an unused function
  • Видалення 1 !=␊0призведе доMissing return in a closure expected to return 'Bool'
    • Видалення нового рядка призведе до '!=' is not a prefix unary operator
    • Вилучення місця призведе до '=' must have consistent whitespace on both sides
    • Видалення !=призведе доMissing return in a closure expected to return 'Bool'
      • Також видалення нового рядка призведе до Consecutive statements on a line must be separated by ';'
      • Видалення пробілу та нового рядка (і нуля чи однієї з цифр) призведе до Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored
  • Видалення [].containsпризведе доClosure expression is unused

Деякі інші цікаві програми (по одному в кожному рядку):

[].isEmpty
[:].values
[1:2]

Тут містяться два as
caird coinheringaahing



0

Сітківка , 2 байти

Я не здивуюсь, якщо це оптимально ...

()

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

Регекс містить порожню групу. Видалення будь-якого з батьків призведе до помилки синтаксичного аналізу через не збігаються дужки.

Інші рішення: \(, \), \[, \], \*, \+, \?,a]


a]не помиляється.
jimmy23013

@ jimmy23013 А, я не знаю, як я це пропустив. Відкотився назад.
mbomb007

-2

C (gcc) , 73 75 байт

#include <ftw.h>
ABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890(){g FTW_D-1;}

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

На основі відповіді @Steadybox, завдяки @Angs за виявлення серйозної помилки.

Так, це брудна хак (бо насправді використовує #defineз -DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=mainі-Dg=return ), але я не бачу ніякого правила , яке забороняє таку опцію компілятора.


Перший рядок можна забрати, щоб програма не була первозданною
ангс

@Angs Спасибі, виправлено (з ціною додавання іншого варіанта компілятора)
trolley813

6
Згідно з цією мета-публікацією , ваше повідомлення вже не є мовою С, а C89 + -DABCEGHIJKLMNOPQRSUVXYZabjkmopqrsvxz234567890=main+ -Dg=return, тому я стверджую, що для цього використовується створена мова, спеціально розроблена для виклику , яка заборонена за замовчуванням.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.