Генерируйте коробки!


19

Ваша задача - сгенерировать блоки, используя любой один символ ASCII относительно заданных входных данных.

Тестовые случаи

1 1   --> =====
          =   =
          =====

1 2   --> =========
          =   =   =
          =========

2 1   --> =====
          =   =
          =====
          =   =
          =====

2 2   --> =========
          =   =   =
          =========
          =   =   =
          =========

2 5   --> =====================
          =   =   =   =   =   =
          =====================
          =   =   =   =   =   =
          =====================

вход

  • Ввод может быть взят из одного из следующих

    • stdin
    • Аргументы командной строки
    • Аргументы функции (2 аргумента, по одному на каждое число)
  • Входные данные, если они взяты из stdinаргументов командной строки или аргументов командной строки, будут содержать два натуральных числа, разделенных пробелом.

  • Два числа обозначают количество полей в каждом столбце и строке

Выход

  • Ящики должны быть выведены в stdout(или ближайший эквивалент)
  • Каждая коробка должна иметь три горизонтальные пробелы в них

правила

  • Оба числа будут больше 0, но не превысят 1000
  • Любой видимый символ может быть использован для вывода полей. (пока они не слишком резкие для глаз!)
  • Вам разрешено написать полную программу или функцию.
  • Не должно быть никаких ненужных символов, за исключением необязательного завершающего символа новой строки.

счет

Это , поэтому выигрывает самое короткое представление (в байтах).

Ответы:



10

Сетчатка , 57 байт

1(?=.* (1*))
$1#$1#


1(?=(1*#1*#)*$)
=   
1
====
#
=#

Принимает ввод в унарном виде с завершающим переводом строки.

Каждая строка должна идти в свой собственный файл и #должна быть заменена на новую строку в файлах. Это нецелесообразно, но вы можете запускать код как один файл с -sфлагом, сохраняя #маркеры (и изменяя конечный символ новой строки на также #во входных данных). При желании вы можете изменить #обратно на новые строки в выходных данных. Например:

> echo -n 11 111#|retina -s boxes|tr # '\n'
=============
=   =   =   =
=============
=   =   =   =
=============

Метод: 5 шагов замещения. Первые две (первые 4 строки) создает 2*N+1на Mсетке единиц и следующих 3 шагов (6 линий) формате его в желаемый результат.

Промежуточные строки (разделенные символом -'s):

11 111
------------------
111
111
111
111
 111
------------------
111
111
111
111
111
------------------
111
=   =   =   
111
=   =   =   
111
------------------
============
=   =   =   
============
=   =   =   
============
------------------
=============
=   =   =   =
=============
=   =   =   =
=============

Один файл в строке всегда кажется очень странным выбором дизайна.
curiousdannii

1
@curiousdannii Это было сделано таким образом, чтобы символ новой строки можно было использовать в выражениях регулярных выражений без экранирования, но его планируется изменить в более приемлемый формат из 1 файла.
Рандомра

8

JavaScript ( ES6 ), 83

Функция с параметрами строк и столбцов. Используя строки шаблона, есть 2 встроенных символа новой строки, которые являются значимыми и учитываются.

Вывод через alert(всплывающее окно). Так как мы alertиспользуем пропорциональный шрифт, мы получаем лучший результат, если вместо буквы использовать ширину, аналогичную пробелу =.

Протестируйте в Firefox, используя консоль, чтобы получить реальный alertвывод, или запустите фрагмент ниже.

f=(r,c)=>{for(x=y="|";c--;)x+="||||",y+="   |";for(o=x;r--;)o+=`
${y}
`+x;alert(o)}

// TEST

// redefine alert to avoid that annoying popup during test
alert=x=>O.innerHTML=x

test=_=>([a,b]=I.value.match(/\d+/g),f(a,b))

test()
<input id=I value='2 3'><button onclick="test()">-></button>
<pre id=O></pre>


Фрагмент кода запуска не работает для меня, просто посмотрите на поле с «2 3» внутри и стрелкой, которая, кажется, подсказывает, что вы должны щелкнуть по нему, чтобы получить результат. Использование кнопки полной страницы или использование другого браузера ничего не меняет.
Деннис Джаэруддин

@DennisJaheruddin, то же самое происходит со мной при использовании Chrome (не поддерживает ES6). Попробуйте Firefox.
Спикатрикс

1
@DennisJaheruddinTest in Firefox
edc65

7

JavaScript (ES6), 75 73

Используя обильные repeatвызовы, мы повторяем |, затем повторяем |с завершающими пробелами и повторяем оба этих повторения, чтобы создать строки:

f=(y,x)=>alert(((s="|"[r="repeat"](x*4)+`|
`)+"|   "[r](x)+`|
`)[r](y)+s)

(Новые строки важны, согласно предложению edc65 использовать строки шаблона.)

Отрывок:

<input id="x" type="range" max="10" min="1" step="1" value="3"><input id="y" type="range" max="10" min="1" step="1" value="2"><pre id="o"></pre><script>function f(y,x){return ((s="|"[r="repeat"](x*4)+"|\n")+"|   "[r](x)+"|\n")[r](y)+s};function redraw(){document.getElementById("o").innerHTML=f(document.getElementById("y").value,document.getElementById("x").value)};document.getElementById("x").onchange=redraw;document.getElementById("y").onchange=redraw;document.getElementById("x").oninput=redraw;document.getElementById("y").oninput=redraw;redraw();</script>

Без строк шаблона, без повторного использования имени метода и с добавленными пробелами:

f=(y,x)=>alert(
    (
      (s="|".repeat(x*4)+"|\n") + 
      "|   ".repeat(x)+"|\n"
    ).repeat(y)+s
)

(Использование рекомендации edc65 по использованию |для лучшего визуального интервала.)


7

Пип, 29 24 = 23 + 1 байт

Требуется -nфлаг. Принимает высоту и ширину в качестве аргументов командной строки и строит блоки из 1s.

([1X4m]XbRLa+1)@<v.1R0s

Объяснение:

                         a,b are cmdline args; m is 1000; v is -1; s is " " (implicit)
 [1X4m]                  List containing 1111 and 1000
       Xb                String repetition of each element b times
         RLa+1           Repeat the list a+1 times
(             )@<v       Now we have one row too many at the end, so take everything
                         but the last item (equiv to Python x[:-1])
                  .1     Concatenate a 1 to the end of each row
                    R0s  Replace 0 with space
                         Print, joining list on newlines (implicit, -n flag)

Эта программа использует большое преимущество того факта, что строки - это числа, а числа - это строки в Pip. (И три пробела в этих полях оказались правильными, чтобы воспользоваться встроенной mпеременной!)

Вот как список строится с помощью ввода 2 3:

[1111;1000]
[111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111;100010001000]
[111111111111;100010001000;111111111111;100010001000;111111111111]
[1111111111111;1000100010001;1111111111111;1000100010001;1111111111111]
[1111111111111;"1   1   1   1";1111111111111;"1   1   1   1";1111111111111]

И окончательный вывод:

C:\> pip.py 2 3 -ne "([1X4m]XbRLa+1)@<v.1R0s"
1111111111111
1   1   1   1
1111111111111
1   1   1   1
1111111111111

Больше на Пипе


6

Perl, 72 63 52 50 байт

Моя самая короткая версия еще использует, $/чтобы получить символ новой строки более компактно:

$ perl -e 'print((($,="="."   ="x pop.$/)=~s/./=/gr)x(1+pop))' 2 5
=====================
=   =   =   =   =   =
=====================
=   =   =   =   =   =
=====================

Предыдущее обновление помещает практически пустые строки в разделитель выходных записей $,и печатает список непрерывных строк.

$ perl -e 'print((($,="="."   ="x pop."\n")=~s/./=/gr)x(1+pop))' 2 5

Предыдущая версия может быть немного понятнее для случайного читателя:

$ perl -E 'say($y=($x="="."   ="x pop)=~s/./=/gr);for(1..pop){say$x;say$y}' 2 5

Первая версия используется @ARGVвместо pop:

$ perl -E 'say($y=($x="="."   ="x$ARGV[1])=~s/./=/gr);for(1..$ARGV[0]){say$x;say$y}' 2 5


5

GNU sed -r, 160

Вздох, я думал, что это будет меньше, но здесь это все равно. К сожалению, регулярные выражения sed не имеют никакой возможности поиска.

:
s/(.*)1$/   =\1/;t
s/([= ]+)/\1\n\1/
:b
s/   (.*\n)/===\1/;tb
s/(1*)1 $/\n\1/
:c
s/([^\n]*\n[^\n]*\n)(1*)1$/\1\1\2/;tc
s/(=+)(.*)/\1\2\1/
s/(^|\n)(.)/\1=\2/g

Принимая вход как унарный от STDIN:

$ sed -rf boxes.sed <<< "11 111"
=============
=   =   =   =
=============
=   =   =   =
=============
$

4

CJam, 25 байт

q~)S3*'=5*+4/f*3f>\)*1>N*

Попробуйте онлайн в интерпретаторе CJam .

Как это устроено

q~                        e# Read H and W from STDIN.
   S3*'=5*+               e# Push "   =====".
           4/             e# Chop into ["   =" "===="].
  )          f*           e# Repeat each string W+1 times.
               3f>        e# Cut off the first three characters.
                  \)*     e# Repeat the resulting array H+1 times.
                     1>   e# Remove the first string.
                       N* e# Join the lines.

4

Marbelous, 168 байтов

Этот ответ работает только до 255x255, а не 1000x1000 из-за ограничений языка Marbelous. Я работаю над 32-битной библиотекой, но она не будет готова в ближайшее время.

Вход предоставляется в виде двух параметров командной строки или параметров функции для основной платы.

@2@3}1@0
SLEL//>0\/
@3@1}0--
}1&0@0/\&0
@1/\@2}1\/
:SL
..}0@0
&0/\>0&0
EN..--\/
{0@0/\ES
:EL
..@0
..>0EN
}0--\/
@0/\EX
:EX
}0
\/3D3D3D3D
:ES
}0
\/3D202020
:EN
}0
{03D0A

псевдокод:

MB(H,W):
    EL(W)
    for 1..H:
        SL(W)
        EL(W)
EL(W):
    for 1..W:
        EX()
    EN()
SL(W):
    for 1..W:
        ES()
    EN()
EX():
    print "===="
ES():
    print "=   "
EN():
    print "=\n"

3

CJam 52 51 46 41 байт

l~:B;:A;'=:U{{U4*}B*N}:V~{U{SZ*U}B*NUV}A*

Благодаря Sp3000 за -5 символов

Спасибо Мартину Бюттнеру за еще 5 символов

Попытайся


3

функция c, 81

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

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

x,y;f(h,w){for(;y<=h*2;y++)for(x=0;x<w*4+2;x++)putchar(x>w*4?10:x&3&&y&1?32:61);}

int main (int argc, char **argv)
{
  f(2, 3);
}

Я опустил несколько символов, чтобы рассматривать их как одну строку вместо двойной для: x;f(h,w){for(w=w*4+2;x<=w*h*2+w;x++)putchar(x%w?x/w%2?x%w%4!=1?32:61:61:10);}- 78

1
Если бы я сначала посмотрел на другие ответы = /, мой комментарий - более длинная версия ответа Рето Коради.

да, я очень старался (и не смог), чтобы получить это в один (более короткий) цикл
Digital Trauma

3

PHP4.1, 76 71 69 байт

Это как игра в гольф, как я могу получить.

$R=str_repeat;echo$R(($T=$R('-',4*$H+1))."
|{$R('   |',$H)}
",$V),$T;

Это предполагает, что ключ Hбудет иметь количество строк и Vколичество блоков в строке.

Я использую -и |просто так, коробки действительно выглядят как коробки. При необходимости я могу изменить его на =. Неважно, какой символ используется.
Уход, -а |также помогает понять беспорядок, который происходит.


Старый метод, 76 байт:

for($R=str_repeat;$H--;)echo$T=$R('-',($V*4)+1),"
|{$R('   |',$V)}
";echo$T;

Пример вывода:

http://localhost/file.php?H=2&V=3

-------------
|   |   |   |
-------------
|   |   |   |
-------------

3

Юлия, 59 байт

(n,m)->(l="="^(4m+1)*"\n";print(l*("="*"   ="^m*"\n"*l)^n))

Это создает безымянную функцию, которая принимает два целых числа в качестве входных данных и печатает результат в STDOUT. Чтобы назвать его, дайте ему имя, например f=(n,m)->....

Ungolfed + объяснение:

function f(n, m)
    # Store the solid row
    l = "="^(4m + 1) * "\n"

    # Print all rows by repeating a pattern n times
    print(l * ("=" * "   ="^m * "\n" * l)^n)
end

Примеры:

julia> f(2, 3)
=============
=   =   =   =
=============
=   =   =   =
=============

julia> f(1, 5)
=====================
=   =   =   =   =   =
=====================

Любые предложения приветствуются.


3

bash + coreutils, 57

dc -e"2do$2 4*1+^1-pd8*F/1+$1si[fli1-dsi0<c]dscx"|tr 0 \ 

Используется dcдля печати двоичных чисел, которые имеют 1s для краев поля и 0s для пробелов.

  • число X всех единиц вычисляется 2 ^ (width * 4 + 1) - 1, затем нажимается и печатается
  • 10001...0001число вычисляется путем , затем толкнулX* 8 / 15 + 1
  • стек затем сбрасывали heightраз

trЗатем преобразует 0S в пространстве символов.

Выход

$ ./boxes.sh 2 4
11111111111111111
1   1   1   1   1
11111111111111111
1   1   1   1   1
11111111111111111
$ 

3

R 83 81

В качестве неназванной функции, принимающей h и w в качестве параметров. Строит 1-ю и 2-ю строки в векторе для каждой строки и повторяет его hраз. Добавляет вектор для нижней строки и catвыводит вектор, используяfill для ограничения длины линий. Теперь использует правило любого видимого символа.

function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')

Тестовый забег

> f=function(h,w)cat(rep(c(A<-rep(1,w*4+2),rep('   1',w)),h),A[-1],fill=w*4+1,sep='')
> f(4,2)
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
1   1   1
111111111
> 

3

Python 3 2, 160 87 85 79 байт

Я знаю, что это может быть гораздо лучше, я хотел бы несколько предложений, так как это моя первая попытка в гольф.

def d(x,y):
    for i in[1]*x:print'='*(4*y+1)+'\n'+'=   '*(y+1)
    print'='*(4*y+1)

Благодаря @Cool Guy и @ советы Sp3000, я сузил размер до чуть выше ниже половины.

Например: д (3,3)

=============
=   =   =   =   
=============
=   =   =   =   
=============
=   =   =   =   
=============

Попробуйте это здесь .

Извините за оставшиеся пробелы.


1
Уровень отступа может быть уменьшен.
Spikatrix

3
Вам не нужно создавать список, а затем присоединиться. Строки могут быть '='*(4*y+1)
умножены

1
Установка w=4*y+1сохраняет 3 байта.
DLosc

@Cool Guy Я использую вкладку, а не 4 пробела.
nsane

О хорошо Не заметил этого
Spikatrix

2

KDB (Q), 37 байт

{(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}

объяснение

                      (4#"=";"=   ")     / box shape
           (5+4*y-1)#'                   / extend y axis
 (3+2*x-1)#                              / extend x axis
{                                   }    / lambda

Тестовое задание

q){(3+2*x-1)#(5+4*y-1)#'(4#"=";"=   ")}[2;5]
"====================="
"=   =   =   =   =   ="
"====================="
"=   =   =   =   =   ="
"====================="

2

JavaScript, 92 85 байт

Я надеялся, что это будет короче, чем другой ответ JS (хорошая работа, как всегда, edc65), ну да ладно. У меня такое чувство, что здесь математику можно продолжить.

f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s

Извините, не могу помочь с математикой - у меня кружится голова ... но вот какой-то микрооперт: f=(r,c)=>(x=>{for(i=s='';(y=i++/x)<r-~r;)s+=i%x?' *'[-~y%2|!(-~i%4)]:'\n'})(4*c+2)||s-> 85
edc65

@ edc65 это здорово, спасибо! Такие вещи, как 2*r+1=> r-~r- это именно то, что я имел в виду, играя в гольф по математике, и именно этот гений. :)
ввые

2

Октав, 69 65 64

y=ones([2,4].*input()+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

Спасибо DLosc за указание на проблемы, которые привели к -1

Принимает вход как [1 1]и выходы:

#####
# #
#####

Вы также можете просто ввести «1» и получить 1x1. Если вход действительно должен быть 1 1, размер увеличивается до88 8584 :

y=ones([2,4].*eval(['[',input(0,'s'),']'])+1);y(1:2:end,:)=y(:,1:4:end)=4;char(y+31)

Примечание: Matlab не допускает связывание или ввод октавы (целое число), но вот версия Matlab ( 67 ):

y=ones([2,4].*input('')+1);y(1:2:end,:)=4;y(:,1:4:end)=4;char(y+31)

2

C, 76 байтов

w,n;f(r,c){for(w=c*4+2,n=w*r*2+w;n--;)putchar(n%w?n/w%2&&n%w%4-1?32:61:10);}

Вызывается как функция с количеством строк и столбцов в качестве аргументов. Например:

f(5, 2)

2

CJam, 30 29 байт

Новая версия с лишним +в конце удалена (спасибо, Денис):

l~_4*)'=*N+:F\'=S3*+*'=+N++*F

Я знаю, что Деннис уже опубликовал решение CJam, которое превосходит это на многие мили. Но это моя самая первая попытка CJam, так что это чудо, что оно работает вообще. :)

Довольно грубая сила. Строит первую строку из 4 * H + 1 =знаков, затем вторую строку из =повторяющихся Hвремен, с =добавлением еще одной . Затем объединяет две строки, повторяет все Vразы, а затем добавляет еще одну копию первой строки.

Такое ощущение, что у меня слишком много манипуляций со стеком, и даже в итоге я сохранил первую строку в переменной, потому что в противном случае мне пришлось перетасовывать вещи в стеке.

В целом не очень элегантно, но вы должны начать где-нибудь ... и я хотел сначала попробовать простую задачу.


Вам не нужно +в конце. CJam печатает весь стек.
Деннис

2

CJam, 23

q~[F8]f{2b*1+' f+N}*_0=

Попробуйте онлайн

Объяснение:

q~        read and evaluate the input (height width)
[F8]      make an array [15 8] - 1111 and 1000 in base 2
f{…}      for width and each of [15 8]
  2b      convert the number to base 2
  *       repeat the digits "width" times
  1+      append a 1 to the array of digits (right edge)
  ' f+    add the space character to each digit (0->' ', 1->'!')
  N       push a newline
*         repeat the resulting array "height" times
_0=       copy the first line (bottom edge)


1

Ява, 181

Я надеюсь, что согласно

Вам разрешено написать полную программу или функцию.

это соответствует правилам подсчета байтов функции , которая в данном случае равна 181

import static java.lang.System.*;
public class Boxes
{
    public static void main(String[] args)
    {
        Boxes b=new Boxes();
        System.out.println("1,1:");
        b.b(1,1);
        System.out.println("1,2:");
        b.b(1,2);
        System.out.println("2,1:");
        b.b(2,1);
        System.out.println("2,2:");
        b.b(2,2);
        System.out.println("2,5:");
        b.b(2,5);
    }

    void b(int R, int C){String s="",e=s,x,y,z=s,a="====",n="=\n";int r,c;for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="=   ";}s+=x+n+y+n;}for(c=C;c-->0;){z+=a;}s+=z+n;out.println(s);}
}

Вывод неверный. Смотрите вывод № 2: «В каждом квадрате должно быть три горизонтальных пространства ». Ваш код выводит два пробела, а не три
Spikatrix

@CoolGuy Определили это - теперь на 2 байта больше, но это мало что меняет ...
Marco13

1
Ok. +1. Сохраните два байта, изменив for(r=R;r-->0;){x=y=e;for(c=C;c-->0;){x+=a;y+="= ";}s+=x+n+y+n;}наfor(r=R;r-->0;s+=x+n+y+n){x=y=e;for(c=C;c-->0;y+="= "){x+=a;}}
Spikatrix

1

C #, 153 151 150

Это не может действительно конкурировать, но здесь это просто для удовольствия:

(h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}}

Как запустить:

public class Program
{
    public static void Main()
    {
        new System.Action<int, int>((h,w)=>{string s="=",e="\n",a="====",b="   =",m=a,o;int i=0,j;for(;i++<=h*2;){o=s;for(j=0;j++<w+1;o=m)System.Console.Write(o);m=m==a?b:a;s=e+s;e="";}})(3, 4);
    }
}

Открыт для улучшений.


замените строку на var.
CSharpie

К сожалению, это не разрешено. Смотрите это
pmudra

1
Объявление этих intвне цикла может сохранить байт.
Спикатрикс

1

Python 2,7, 66 байт.

Я знаю, что в python уже есть лучшие решения, но это лучшее, что я придумал.

def f(x,y):a,b,c="="*4,"   =","\n=";print "="+a*y+(c+b*y+c+a*y)*x

Пример:

f(3,4)

=================
=   =   =   =   =
=================
=   =   =   =   =
=================
=   =   =   =   =
=================

Извините, но это приводит к неправильному выводу для тестовых случаев 2,3 и 5. Вы перепутали столбцы и строки и получили противоположный путь.
Спикатрикс

1

Руби, 57 48 45

f=->h,w{l=?=*w*4+?=;(l+$/+'=   '*w+"=
")*h+l}

Использование:

print f[2,5]

Спасибо manatwork за сохранение 3 байта.


Две небольшие возможности улучшения: '='?=и "<LF>"$/.
manatwork

Еще один маленький: ?=*(w*4+1)?=+?=*w*4
manatwork

1

Java, 123 119 байт

void p(int h,int w){String b="=",d="\n=";for(;w-->0;d+="   =")b+="====";for(d+="\n"+b;h-->0;b+=d);System.out.print(b);}

Злоупотребление входными параметрами в качестве счетчиков очень помогло уменьшить размер кода.

Спасибо Cool Guy за предложение злоупотребления синтаксисом.


Гольф это больше с помощью forпетли вместо whileпетли.
Spikatrix

К сожалению, для (; w -> 0;) такая же длина, как while (w -> 0)
ECS

1
Я имел в виду while(w-->0){d+=" =";b+="====";}-> for(;w-->0;b+="====")d+=" =";который сохраняет три байта
Spikatrix

Вы правы. Мне действительно удалось выжать из этого 4 байта благодаря вашему предложению.
ECS

1

SAS, 117 119

macro a array a[0:1]$4('#   ' '####');do x=1 to 2+2*&x-1;t=repeat(a[mod(x,2)],&y-1);put t $char%%eval(&y*3). '#';end;%

Пример:

%let x=4;
%let y=4;
data;a;run;

Результат:

#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############
#   #   #   #
#############

Есть ли онлайн-компилятор, где я мог бы это проверить? Кстати, согласно вашему результату, ваша программа выдает неправильный вывод. См. Вывод2: в каждом
Spikatrix,

@ CoolGuy, ты прав, я этого не уловил, обновил свой пост. Вы можете попробовать SAS On Demand. Это был бы наименее хлопотный способ получить доступ к онлайн-компилятору без настройки собственного экземпляра AWS
Fried Egg

Ваша первая ссылка не работает для меня. Хром даетDNS_PROBE_FINISHED_NXDOMAIN
Spikatrix

Попробуйте это, хотя первая ссылка для меня работает нормально SAS On Demand или перейдите по ссылке на этой странице в «Центр управления» здесь
Fried Egg

Я не знаю почему, но посещение центра управления вызывает ту же ошибку, что упоминалась в моем предыдущем комментарии: /
Spikatrix
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.