Довідка: Програмісти-прибульці розмовляють лише ASCII


22

Налаштування сцени:

Це середній день, коли ви розслабляєтесь після довгого дня, займаючись улюбленим проведенням часу: відповідаючи на безліч захоплюючих питань на PPCG. Це був не гарний день для вас; ці прокляті програмісти Pyth продовжують отримувати найкращу відповідь, і це вбиває вашу атмосферу. Раптом ви помічаєте нове запитання було розміщено! Ви складаєте свою думку; не цього разу CJammers. Розлючено ти починаєш друкувати, роблячи потік персонажів; плід славної петлі BrainFuck, якою буде ваш кінцевий продукт. Ви вводите та вводите. Швидше! Ще швидше! Ви настільки зосереджені, що навіть не помічаєте, як світло на екрані починає мерехтіти і вимикатися. Раптом монітор світиться зеленим кольором, чужий символ, нанесений на робочий стіл. Використовуючи свої бездоганні навички, виcat ~/Desktop/aliensymbolі подаруйте купу чисел, повідомлення! Будучи дотепним програмістом PPCG, який ви є, ви помічаєте, що це схоже на ASCII. Незалежно від вас, ви print(chr(i) for i in file)і розшифруєте повідомлення. Ваша перша думка: "Мені потрібно поділитися цим спільнотою!".

...

Хто б це подумав? Що першими, хто вступить у контакт із прибульцями, будуть скромні програмісти PPCG. Чому ми? Можливо, це тому, що ми є втіленням людського інтелекту. А може тому, що BrainFuck приблизно так само близький, як ми, до чужої мови. Тим не менш, інопланетяни - будучи ультраінтелектуальними життєвими формами, якими вони є - хочуть перевірити, чи слід класифікувати людський рід як розумний чи ні. Як перевірка нашої психічної майстерності, інопланетяни попросили нас надіслати їм кілька комп’ютерних програм, щоб продемонструвати, що ми технологічно культивовані. Проблема полягає в тому, що єдиною людською мовою, яку вони розуміють, є числовий ASCII!

Допоможіть людству показати тих істот, які справжня інтелектуальна альфа. Нам потрібно надіслати їм скрипт, який перетворить наші текстові вихідні коди в їх чисельні версії ASCII. На жаль, завдяки нашій недостатньо розвиненій технології (спасибі Обамі) ми повинні надіслати якомога менше перекладної програми. Добре, що вони вирішили зв’язатися з PPCG!

Змагання:

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

Приклад значно прояснить це. Взявши вихідний код сумнозвісного hello worldяк вхідний:

#include <stdio.h>

int main() {
    printf("hello, world\n");
    return 0;
}

ваша програма повинна виводити:

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

Деталі щодо впровадження:

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

Що потрібно відзначити

  • Кожен символ у висновку відокремлений символом '\ t', щоб у рядку внизу було розміщено три цифри (ми будемо вважати, що для вашої вкладки встановлено 4 пробіли або більше).
  • Нові рядки відображаються на рядку, у якому була натиснута клавіша повернення (зверніть увагу на 10 у прикладі)
  • Вимоги до друку '\ t' та '\ n' є неоднозначними. У загальному сенсі ваш результат повинен виглядати приємно для очей (потрібно показати тим прибульцям, що ми також маємо естетичне почуття), і якщо ви зможете зігнути попередні два моменти, зберігаючи візуальну цілісність, вам буде прощено.
  • Ви можете припустити, чи існує новий рядок в кінці останнього рядка.

Оцінка балів

Це код-гольф, тому найкоротша програма виграє. Зауважте, навіть якщо ваша програма не найкоротша, але використовує дійсно акуратні хитрощі щодо мови, якою ви користуєтесь, багато +1 для вас!

Удачі. Міжгалактичний рейтинг інтелекту людства лежить на ваших плечах.

Примітка. Пробачте, будь ласка, дірки. Я не письменник : D


8
Можливо, скиньте або значно спростіть «сюжет» і просто залиште виклик. Я, чесно кажучи, не збираюсь читати 3 абзаци доповідей. Я просто збираюся прочитати виклик, адже саме для цього я тут.
mbomb007

1
@YetiCGN Розрив лінії виконує функцію розриву рядка (ви не можете бачити символу, який його представляє, але ви можете бачити перерву), і вам все одно потрібно чітко записати його у версії ascii. Подумайте про це так, ніби ви повторно шукали вихідний код для \ \ n '. Скрізь, де ваш пошук підкреслить, де слід написати десятку. Ось приклад від vim (ігноруйте останній).
gowrath

26
@ mbomb007 tbh, це була досить епічна історія. Мені це сподобалось
Мальтісен

7
@ mbomb007 Ті, хто хоче читати, можуть, ті, хто не може перейти безпосередньо до складної частини; така краса субтитрів.
gowrath

1
Я читав це як "першими, хто зв'язався з людьми, були б покірні програмісти PPCG".
marczellm

Відповіді:


5

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

Бере список рядків, що містять послідовності нових рядків (10 або 13 10 тощо)

↑(⊢,[.5]⎕UCS

затвердити список списків, що складаються з

(... для кожного повернення рядка ...

сам текст

,[.5] слідує в новому вимірі перед першим виміром

⎕UCSто U nicode З haracter S ET кодові точки

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


Хіба ви не називаєте це один раз у кожному рядку, а не брали весь вхід відразу?
Стівен Х.

1
@StevenH. Ні, функція (більшість правої частини) містить цикл, але в цілому вона викликається лише один раз. Дивіться приклад TryAPL, який fвикликається безпосередньо на вході. Викликати функцію один раз по рядку, якби це сказав .
Адам

9

Pyth, 17 13 байт

Ще один із тих програмістів Pyth. Вибачте.

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

jjLC9smCMBd.Q

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

Пояснення:

           .Q  Evaluate all input lines
      m        For each of those lines:
         Bd     Return the line and
       CM       the line mapped to ASCII characters
     s         Sum all these together to begin alternating between line and mapped line
 jLC9          Join all the characters and numbers in the lines and mapped lines on tabs
j              And join all of those on newlines

Я зберігаю старий код та його 'пояснення нижче.

#Jw
jKC9J
jK+CMJT

Спробуйте в Інтернеті! або скористатися легшим для читання тестовим випадком .

Пояснення:

#                  Until we run into an error:
 Jw                 Read in the next line of input and call it J.
                     (When there is no line of input, error is thrown that ends program.) 

j                  Join: 
    J               all characters in input line
 KC9                and insert tab characters (C9), which we can refer to later as K.
                        (Setting it to a variable doesn't save or lose bytes.)

                   Implicit print that join with trailing newline.

j                  Join:
   CMJ              the mapping of ASCII numbers to characters in the input,
 K                  inserting tab characters in between every number
  +   T             And with a trailing 10 for the newline at the end.

1
Я думаю, що ваше перше посилання працює не так добре, як друге (не друкує нові рядки, я думаю). Ви можете оновити код у ньому.
gowrath

8

Python 2, 105 байт

Для цього використовується дещо інший підхід, ніж відповідь ОП. Зауважте, що SO змінює мої буквальні вкладки з пробілами.

def f(s):
 o=x=''
 for c in s:
    o+=c+"  ";x+="%s    "%ord(c)
    if"\n"==c:print o[:-1],x;o=x=''
 print o+"\n"+x

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


Не x+=ord(c)+" "буде коротше "%s "%ord(c)?
DJMcMayhem

@DJMcMayhem Ви не можете додати ціле число до рядка. x+=`ord(c)`+" "однакової довжини.
mbomb007

8

Вім, 86, 77 натискань клавіш

:g/^/norm A<C-v><C-v>10<C-v><esc>Yp:s/./\=char2nr(submatch(0))."\t"/g<C-v><cr>k:s/./&\t/g<C-v><cr>
:%s/<C-v><cr>0<cr>

Це занадто довго, але це те, що ви отримуєте, використовуючи evalфункцію vim ( \=).


6
Не можу сказати, чи ви \=пояснюєте особливість eval, чи сумне обличчя, оскільки ви використовуєте функцію eval ...
AdmBorkBork

2
@timmyD Перший. Це моє сумне обличчя. D;
DJMcMayhem


6

Perl, > 33 31 байт

Включає +3 для -F(не можна поєднувати -eі з кодом 'теж, тому пробіл і -враховується теж).

Запустіть із введенням STDIN або введіть одну або кілька імен файлів як аргумент

perl -M5.010 asciidump.pl <<< "Hoi"

asciidump.pl

#!/usr/bin/perl -F
$"=v9;say"@F@{[unpack'W*']}"

Вихід не є естетичним, якщо текст містить вкладку або немає остаточного нового рядка


5

Pyth, 21 байт

j.imjC9d.zmjC9+CMdT.z

Ось запис від одного з "тих проклятих програмістів Pyth" ;)

Програма, яка приймає введення без котирування багаторядкового рядка на STDIN і друкує результат. Це передбачає, що всі вхідні дані мають зворотний новий рядок. Якщо ви хочете, щоб він не мав зворотного нового рядка, додайте його <на початку програми та )_3в кінці.

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

Вихідні дані для тестового випадку важко помітити в онлайн-перекладачі, тому я включив його сюди:

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

Як це працює

j.imjC9d.zmjC9+CMdT.z  Program. Input: .z (All of STDIN split on newlines)
     C9                 Yield tab character by taking chr(9)
    j                   Join on tab
   m   d.z             Map that over .z
               CM       Map ord()
              +   T     Append 10
           jC9          Join on tab
          m      d .z  Map that over .z
 .i                    Interleave the results of the two mappings
j                      Join on newlines
                       Implicitly print

ви можете зберегти 2 байти, позбавившись .zта взявши введення як список рядків
Maltysen

1
@Maltysen Судячи з питання та інших відповідей, я вважаю, що розділення на нові рядки є частиною виклику.
TheBikingViking

5

С, 136 117 114 байт

#define p(s)while(l[i])printf(s,l[i++]);i=0;puts("")
char l[99];i;f(f){while(fgets(l,99,f)){p("%c\t");p("%d\t");}}

char l[99];i;f(f){while(fgets(l,256,f)){i=0;while(l[i])printf("%c\t",l[i++]);i=0;puts("");while(l[i])printf("%d\t",l[i++]);puts("");}}

Можна перевірити так

infile;
main(c,v)char**v;
{
    infile=fopen(v[1],"r");
    f(infile);    
}

Поселення char**vвсередину main()врятувало б вас там 2 персонажі ..
Алексіс Вілке

А, я рахую лише 114 байт у цьому коді. Я думаю, що ви використовуєте CRLF замість LF (117-> 115), плюс у вас є зворотний новий рядок (115-> 114).
Тім Час

4

PowerShell v2 +, 85 байт

gc $args|%{$a=$b='';$_-split'(.)'-ne''|%{$a+="$_`t";$b+="$(+[char]$_)`t"};$a;$b+"10"}

Введення здійснюється через шлях до файлу. Тоді ми Get-Content(псевдонім gc) на той файл, який автоматично розбивається на нові рядки. Ми петлюємо над кожним із них |%{...}. Почніть з налаштування $aта $bз порожнього рядка - це наші символи ASCII та кодові точки відповідно. Потім ми -splitвводимо рядок кожного символу, зберігаючи його (.), і видаляємо порожні значення -ne''(це пов’язано з тим, як розбирає .NET регулярні вирази), а потім відправляємо їх в інший цикл.

Кожен внутрішній цикл, ми рядок з'єднуємо поточний символ з вкладкою `tі додаємо його на $a. Аналогічно для $b, за винятком того, що ми явно робимо кастинг як a, charа потім як int +.

Поза внутрішнього контуру, ми розміщуємо в результаті $aі $b(з нового рядка целеуказателем, так що ніколи не прийде в нашому зациклення) на трубопроводі. Вони збираються неявними Write-Outputпід час завершення програми.

Приклад

.

PS C:\Tools\Scripts\golfing> .\aliens-only-understand-ascii.ps1 '.\aliens-only-understand-ascii.txt'
#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >   
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   t   (   )       {   
105 110 116 32  109 97  105 110 116 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   w   ,       w   o   r   l   d   \   n   "   )   ;   
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 119 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;   
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}   
125 10

Чорт, я щойно написав відповідь PowerShell, хоча якось встиг повністю пропустити цю! Завжди раді бачити шикарні представлені, хоча! :)
британіст

4

> <> (Риба), 48 байт

>i:0(?v::oa=?v9o
2';'oa<.20r  <~p3
o9nv?=0l
voa<

Завдання, на якому світить мова! Я впевнений, що міг би трохи більше покататися на гольфі, але минув тиждень. Можливо, погляньте на це пізніше.

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

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


4

PHP, 131 115 байт

Просто FGITW, можливо, я можу вдосконалити його більше. Виходить, я можу!

Перша версія в 131 байт:

<?$s=file($argv[1]);foreach($s as$l){$a=str_split(trim($l));echo join(' ',$a).'
';$i=0;while($c=ord($l{$i++}))echo$c.'  ';echo'
';};

Ім'я файлу подається як перший аргумент після імені сценарію: php aliens.php helloworld.c

Друга версія в 115 байт:

function($s){foreach($s as$l){$a=str_split($l);echo join('  ',$a);$i=0;while($c=ord($a[$i++]))echo$c.'  ';echo'
';}};

Перша версія обчислює пропущені нові рядки в кінці рядка, але після додаткового уточнення ми можемо залишити цей код і поставити все у функцію, щоб зберегти 16 байт.

Символи пробілів у join(' ',$a)як і в echo$c.' 'є символами вкладки = \t. Нові рядки в коді призначені за призначенням.


3

Python 3, 89 77 байт

більш гольф-версія, заснована на тій же ідеї:

def f(s):
 for a in s:print(*map('{:>4}'.format,[*a,*a.encode()]),end='\n\n')

Якщо у вході є '\ t', то змініть 4на a 9.

Попередня версія:

def f(s):
 for l in s:
  print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')

Бере список рядків, кожен із яких закінчується символом '\ n'.


protip: ви можете залишити заяву друку на кінці for l in sтfor l in s:print(*l,sep='\t',end='');print(*l.encode(),sep='\t',end='\n\n')
руйнується Лимон

Я не перевіряв цього, але, думаю, міг би зняти 8lambda s:'\n\n'.join(*map('{:>4}'.format,[*a,*a.encode()])for a in s)
DJMcMayhem

3

Powershell, 56 байт

gc $args|%{($a=[char[]]$_)-join"    ";[int[]]$a+10-join"    "}

Сценарій приймає файловий шлях як вхідний. Get-Content автоматично розбиває вхід на масив рядків, розділених на нові рядки у джерелі.

Звідти я ввожу foreach, передаю на масив символів і встановлюю його на $ a, приєднуючись до нього за допомогою вкладок і друкуючи його. Далі, але все-таки в межах foreach, я кидаю масив символів на цілий масив, додаю підводний рядок і знову приєднуюся до вкладки.

Виклик виглядає приблизно так:

PS C:\PretendFolder> .\aoua.ps1 ".\aoua.txt"

і ось вихідний зразок

#   i   n   c   l   u   d   e       <   s   t   d   i   o   .   h   >
35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  10

10
i   n   t       m   a   i   n   (   )       {
105 110 116 32  109 97  105 110 40  41  32  123 10
                p   r   i   n   t   f   (   "   h   e   l   l   o   ,       w   o   r   l   d   \   n   "   )   ;
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  10
                r   e   t   u   r   n       0   ;
32  32  32  32  114 101 116 117 114 110 32  48  59  10
}
125 10

2

JavaScript (ES6), 94 байти

s=>s.replace(/(.*)\n?/g,(s,n)=>n&&[...s].join`␉`+`
${[...n].map(c=>c.charCodeAt()).join`␉`}
`)

Де ␉ являє собою буквальний символ вкладки. Працює до тих пір, поки введення не містить символів вкладки. 81-байтна версія, яка також вимагає, щоб вхід мав останній новий рядок:

s=>s.replace(/.*\n/g,s=>[...s].join`␉`+[...s].map(c=>c.charCodeAt()).join`␉`+`
`)

Я думаю, .split().map()може перемогти .replace(). Після втікання символів, оптимізованих за допомогою зворотних посилань, це має бути 85 байт: s=>s.split('\n').map(c=>(s=[...c]).join('\t')+'\n'+s.map(c=>c.charCodeAt()).join('\t')).join('\n')(Вибачте, я не маю уявлення, чи / як можна включити задники в коментар.)
Арнольд,

@Arnauld Не працює для (наприклад) голого символу нового рядка. Крім того, для включення зворотних посилань у коментар, передуйте їх із зворотним нахилом.
Ніл

2

C #, 64 63 байти

s=>{foreach(int c in s+(s=""))s+=c+(10==c?"\n":"    ");return s;};

-1 байт, використовуючи фактичний символ вкладки замість \t. Примітка. Відображається як 4 пробіли вгорі та 2 пробіли у версії, що не перебуває під загоном.

Безголівки:

/*Func<string, string> Lambda =*/ s =>
{
    // Enumerate the ascii (int) values of the chars in s, 
    // but at the same time set input s to "" to use at the output var.
    // +(s="")   is 2 bytes less than   var o="";
    foreach (int c in s + (s=""))
        // Append the string representation of the ascii value,
        // Append new line if c was new line, otherwise append tab. 
        s += c + (10==c ? "\n" : "  ");
    return s;
};

Результати:

(Примітка: Visual Studio використовував \r\nдля нових рядків, коли я вставляв вхід, отже, 13 10закінчення рядків у виході)

Input:

#include <stdio.h>

int maint() {
    printf("hello, world\n");
    return 0;
}

Output:

35  105 110 99  108 117 100 101 32  60  115 116 100 105 111 46  104 62  13  10
13  10
105 110 116 32  109 97  105 110 116 40  41  32  123 13  10
32  32  32  32  112 114 105 110 116 102 40  34  104 101 108 108 111 44  32  119 111 114 108 100 92  110 34  41  59  13  10
32  32  32  32  114 101 116 117 114 110 32  48  59  13  10
125 

2

CJam, 27 байт

qN/{_1/9c*N+\{is9c}%+}%AN+*

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

Пояснення

q       e# Take the whole input
N/      e# Split on newlines
{       e# Map this block to every line:
_        e# Duplicate
1/       e# Split into characters
9c*      e# Join with tabs (ASCII code 9)
N+       e# Append a newline
\        e# Swap top elements
{is9c}%  e# Map each character to its ASCII code plus a tab character
+        e# Concatenate the two lines
}%      e# (end of block)
AN+*    e# Join with "10" plus a newline

І те, 1/і sнепотрібне.
Мартін Ендер

2

PowerShell, 61 59 байт

gc m|%{$b="$_
"[0..$_.Length]
$b-join'    '
[int[]]$b-join' '}

Що слід зазначити:

  • Читає дані з файлу, названого mв поточному каталозі.
  • Усі розриви рядків (включаючи один, вбудований у рядок після першого $_), є лише буквальними стрічковими лініями (0xA), тому кожен байт.
  • Вміст рядків безпосередньо після -joinоператорів є кожним символом вкладки (незалежно від того, як це відображено тут).

Безумовно

Get-Content m | ForEach-Object -Process { # Read the file line by line
    $b = "$_`n"[0..$_.Length]   # Line by line processing strips line endings, so add a newline
                                # Index operator on a [string] returns a [char], or given a [range], a [char[]]
                                # Using $_.Length automatically accounts for the extra linebreak (0 based index)
    $b -join "`t"               # PowerShell displays [char] as the printable character by default, so join the array with a tab
    [int[]]$b -join "`t"        # We need to convert the [char]s to an [int]s so we can display it as a number
                                # So cast the [char[]] as [int[]], then join with tab again

}

Ваш код друкує ascii 13, новий рядок замість 10, повернення вагони, як у прикладі виходу
виклику

@Chirishman PowerShell підтримує лише ASCII 10 для проривів рядків у файлах .ps1, але це може бути складним в Windows в більшості текстових редакторів. Використовуючи SCiTE або Notepad ++ або інші редактори, що знають рядки, ви можете переконатися, що він використовує закінчення Unix. Після того, як ви впевнені, що файл не містить 13-ти, він надрукує 10-ти.
британіст

0

Java, 202 байти

s->{for(String g : s.split("\n")){g.chars().forEach(c->System.out.print((char)c+"   "));System.out.println();g.chars().forEach(c->System.out.print(c+(c<10?"  ":c<100?"  ":" ")));System.out.println();}};

Я навіть не можу потрудитися зробити це коротшим ..


0

Haskell - 71 байт

f q=unlines[(x>>=(++"\t").show.ord)++'\n':intersperse '\t'x|x<-lines q]

-1

Python 3, 92 97 107 байт

для i в списку (відкрити (вхід ()). прочитати (). розділити ("\ n")): для j в i: друк (i + "\ n" + ord (j))

p=print
for i in list(open(input()).read().split("\n"))
    s=t=''
    for j in i:
        r=str(ord(j))
        s+=j+' '*len(r)
        t+=r+' '
    p(s)
    p(t)

Це неперевірено, але має працювати.

Дякуємо @gowrath, що вказали, що код не працює так, як зазначено в питанні.


Чому ні? Усі input()команди, які там роблять, - це відкрити ім'я файлу.
sonrad10

@gowrath о, добре.
sonrad10

Це не перекриває текст та результати ascii, як у специфікації запитання; просто друкує цифри.
gowrath

@gowrath дякую, я виправлю це якнайшвидше.
sonrad10

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