Распечатать сетку звездочек 10 на 10


83

Фон

Это стандартный пример учебника для циклов.

Это одна из первых программ, которую я изучил, когда начал изучать программирование ~ 10 лет назад.

задача

Вы должны напечатать этот точный текст:

**********
**********
**********
**********
**********
**********
**********
**********
**********
**********

Спекуляции

  • У вас могут быть дополнительные завершающие символы новой строки.
  • У вас могут быть дополнительные завершающие пробелы (U + 0020) в конце каждой строки, включая дополнительные завершающие новые строки.

счет

Это . Кратчайший ответ в байтах побеждает.

Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.


2
@DylanMeeus "Вы должны напечатать этот точный текст:"
Лики Монахиня

13
@DylanMeeus Так как это связано с инструментами разработки, скрывающими повторяющиеся результаты консоли, и не является родным для консолей JavaScript в целом и не входит в спецификацию JavaScript - а также тот факт, что эта функция может быть отключена - я думаю, это должно быть приемлемым. Не все браузеры свернут так.
Trotski94

6
@ LeakyNun Фрагмент таблицы лидеров, пожалуйста!
дкудрявцев

2
Одна из самых интересных вещей в этом вызове заключается в том, что в зависимости от вашего языка ********** может быть короче, чем цикл. Меня удивляет, когда для данного языка лучше переключаться между 1 или 2 циклами.
Двана

1
Вы говорите, что новые строки являются приемлемыми. Приемлемы ли новые переводы строк?
Альберт Реншоу

Ответы:



70

C (gcc), 41 39 байт

main(i){for(;++i<puts("**********"););}

какая версия с?
Зайбис

@Zaibis Отлично работает на gcc: coliru.stacked-crooked.com/a/848cb22a00c35c29 .
orlp

4
выглядит хорошо, добрый день ANSI C.
YSC

4
main(i){while(11-i++)puts("**********");}это альтернатива, такой же длины.
YSC

6
Мне нравится умное использование возврата из puts()(и начального значения i).
Тоби Спейт

65

Bash + coreutils, 19 байт

Я предпочитаю повторять вещи в Bash, используя «да».

yes **********|head

Я сэкономил 2 байта по предложению @ Neil. Но когда каталог, в котором вы работаете, эта команда не только содержит файлы, начинающиеся с '.' точка вам нужно приложить звезды *с ".

Bash + coreutils, 21 байт

yes "**********"|head

2
Отличная идея для использования yes. Мы обычно обозначаем такие решения как «Bash + coreutils».
manatwork

8
Приятно, что 10 строк по умолчанию оказываются по умолчанию для head.
Цифровая травма

3
Можете ли вы сохранить два байта, требуя, чтобы любые файлы в текущем каталоге начинались с .?
Нил

@Neil, ты комментируешь мой ответ? Если это так, я не понимаю :)
CousinCocaine

1
Вы также можете писать yes \**********|headбез ограничений на файлы.
Флориан Ф

50

Vim, 13 8 байт

Сохранено 5 байтов благодаря @Lynn

qqi*␛9.o␛q9@q 

10i*␛Y9p

10i*␛вставьте 10 раз *, Y9pскопируйте строку и вставьте ее 9 раз.


8
10i*♥Y9pработает.
Линн

1
Это безумие vi.
nbubis

Я думаю, что вы можете рассчитывать нажатия клавиш вместо байтов для текстовых редакторов, что означает, что <ESC> будет короче.
Аддисон

1
Почему ♥, а не ␛?
кл.

1
Я бы использовал yy9pсебя, но хорошая работа, используя заглавные буквы, чтобы спасти персонажа!
Джо З.

49

Pyth, 6 байт

VT*T\*

Tравен 10 в Pyth, Vabвыполняет операторы b atimes, \*является символьной константой звездочки и умножает ( *) строку и целое число, повторяет эту строку n раз. Неявная печать Пита Vозначает, что напечатано 10 строк.


40

Hexagony, 37 35 34 31

10"+}(=${";<$<1}42/.0@_=<>\;>(_

Expanded:

   1 0 " +
  } ( = $ {
 " ; < $ < 1
} 4 2 / . 0 @
 _ = < > \ ;
  > ( _ . .
   . . . .

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

В основном просто есть два цикла for, отсчитывающих от десяти до нуля, распечатывающих звездочку на внутреннем цикле и новую строку на внешнем цикле.

Объяснение:

Эта программа состоит из трех основных частей: инициализация памяти, цикл, который печатает десять звездочек, и цикл, который печатает новую строку. Цикл, который печатает новую строку, также содержит цикл, который печатает звездочки.

Во-первых, код выполняет полностью линейную инициализацию памяти. Код работает как: 10"+}42. Это устанавливает память о соседних краях, чтобы выглядеть так:

10 \ / 10
    |
   42

42 - код ASCII для символа звездочки, и эти два десятка будут использоваться в качестве наших счетчиков циклов. Следует отметить, что указатель памяти в данный момент направлен в сторону от двух десятков, поэтому перемещение назад поставит нас на одну из десятков.

Далее мы запускаем цикл печати звездочки. Линейно, код выглядит следующим образом : ;".._(. Это распечатывает звездочку, перемещает указатель памяти назад и влево и, наконец, уменьшает значение там. После одной итерации память будет выглядеть так:

10 \ / 9
    |
   42

Затем мы попадаем в условие цикла: крайний левый край >. Если край, который мы только что уменьшили, все еще является положительным, мы отскакиваем и выполняем a, {чтобы переместить нас обратно на 42. Затем мы нажимаем a $и возвращаемся к началу цикла печати ;, пропуская <. Если значение было равно нулю, мы отправляемся в другой цикл.

Внешний цикл начинается с обнуления недавно обнуленного края памяти до десяти (это 10в коде, идущем на юго-запад). Затем мы печатаем эту десятку как символ ASCII, который является новой строкой. Далее мы переходим на другой край памяти и уменьшаем его , {(а затем выполнить то , что составляет кучу Без операционное: =${_=. Теперь, после одной итерации этого цикла, память будет выглядеть так:

 9 \ / 10
    |
   42

На этот раз память обращена наружу от края, сохраняя девять на диаграмме выше. Затем мы выполняем, <который действует как условие цикла для внешнего цикла. Если значение было ненулевым, мы отскакиваем от некоторых зеркал, затем начинаем выполнять значимые инструкции снова после входа в вершину шестиугольника на "движущемся юго-западе. Это заставляет нас двигаться назад и влево, снова на 42, но лицом внутрь. Затем =переворачивает наше направление, правильно сбрасывая состояние, чтобы снова начать внутренний цикл. Если край был установлен в ноль, указатель инструкции отправляется в небольшое приключение, которое ничего не делает, пока не выйдет из программы.

Приключение начинается с указания указателя, отправляющегося на северо-восток, опасно игнорируя безопасность основных направлений. Он смело игнорирует зеркало, которое выровнено с его направлением (/ ), и героически выпрыгивает из батута ($полностью уклоняясь от смертельной ловушки другого, совершенно идентичного батута. Взглянув на пустоту неинициализированных ребер шестиугольника, указатель, не колеблюсь ни на минуту, добавляет два пустых ребра, с которыми он сталкивается, устанавливая текущее ребро в их сумму: 0 (ребро было фактически нулевым заранее, но указатель любит считаю, что это было довольно важно). Поскольку край равен нулю, указатель делает разворот налево на развилке дороги, идя в таинственный лес (из шестиугольников). Там он оказывается дезориентированным, двигаясь вперед и назад и вперед, пока не окажется в том же месте в памяти, что и начался. Думая, что проблема должна заключаться в том, что текущий фронт был установлен в ноль в прошлый раз, указатель смело устанавливает1в текущий край. Затем благородный указатель исследует другой путь, проложенный с ... ловушкой! Текущее ребро уменьшается и возвращается в ноль! Указатель, ошеломленный шокирующим поворотом событий, возвращается в ловушку, устанавливая текущее ребро в отрицательное. Разъяренный, указатель пытается вернуться в сравнительно приятный лес, только чтобы заметить, что, поскольку текущее ребро не является положительным, пути еще раз сместились, и указатель обнаружил, что идет в пещеру. Под пещерой я подразумеваю пасть гигантского шестиугольного червя. Беспомощный, указатель проклинает сексуальность своим умирающим дыханием. Также программа заканчивается.


Черт возьми, я надеюсь, что червь был в порядке с глотанием указателя. Эти вещи могут причинить боль .
Джоффан

3
+1 за написание самого интересного - единственного - объяснения гексагонии, которое я когда-либо читал. Я чувствовал себя таким напряженным, когда край был уменьшен!
Джо

37

Emacs, 10 8 нажатий клавиш

F3 C-1 0 * ENTER F4 C-9 F4

объяснение

F3             Starts a macro recording
C-1 0 *        Apply 10 times command '*': prints 10 asterix'
ENTER          Insert new line
F4             Stops the macro record
C-9 F4         Apply 9 times the macro

Спасибо Шону за сохранение двух нажатий клавиш, предлагая заменить C-udigitна C-digit.


9
+1, я всегда одобряю ответы текстового редактора (хотя сам я больше фанат vim) :)
DJMcMayhem

1
Если C-uсчитается только одно нажатие клавиши, то вы можете сбрить два удара, набрав C-1 C-0(или M-1 M-0) вместо C-u 1 0и C-9вместо C-u 9.
Шон

15
+1, потому что вы должны были страдать, используя emacs, чтобы написать это.
Аддисон

1
В качестве альтернативы (ничего не экономит) повторение строки может быть выполнено внутри макроса:F3 C-1 0 * ENTER C-1 0 F4
Джонатан Кэрролл

@JonathanCarroll да, если бы мы печатали более 10 строк, это сэкономило бы байты;)
YSC

29

Желе , 7 байт

”*x⁵Ṅ9¡

В чем дело?

”*x⁵Ṅ9¡  - No arguments
”*       - character literal, *
  x      - multiply (dyadic operation)
   ⁵     - integer literal, 10 (we have now constructed the string '**********')
    Ṅ    - Print & linefeed (monadic operation)
     9   - integer literal, 9
      ¡  - Repeat n times (n is 9 as the first Ṅ is not a repeat)

Проверьте это на tryitonline


9
Мне очень нравится Ṅ9¡.
Деннис

Версия списка: ”*ẋ⁵Wẋ⁵.
Эрик Outgolfer

@EriktheGolfer вам нужно Yв конце, чтобы «напечатать этот точный текст»
Джонатан Аллан

@JonathanAllan Это список сам по себе, хотя. Он не предназначен для «печати этого точного текста», но, если вы хотите работать с ним, вы будете использовать его.
Эрик Outgolfer

26

PowerShell, 14 12 байт

,('*'*10)*10

Создает строку звездочек длины, 10используя умножение строк. Инкапсулирует это в скобках и передает это в запятую для построения массива. Мы используем умножение массива для создания массива из 10 элементов, состоящего из этого элемента (т. Е. Из 10 элементов массива звездочек). Это остается на конвейере, и вывод неявный (поскольку по умолчанию Write-Outputдля массива используется разделение новой строки, мы получаем это бесплатно - спасибо @Joey за разъяснения).

Старше, 14 байтов

0..9|%{'*'*10}

Полная программа. Петли от 0до 9до ForEach-Objectпетли |%{...}. На каждой итерации мы используем умножение строк для создания 10строки длины *. Эти результирующие строки остаются в конвейере, а вывод в конце неявен (поскольку по умолчанию Write-Outputдля массива используется разделение строк новой строкой, мы получаем его бесплатно - спасибо @Joey за разъяснения).


5
Мне это нравится, потому что powershell может стать настолько многословным. Все же это элегантно и коротко.
Двана

Ну, технически массив никогда не пропускается через a ToString, он разворачивается и передается элемент за элементом в Write-Output. В тех случаях, когда массив преобразуется в строку, его элементы разделяются пробелом.
Джои

@ Джои Честно, это лучший способ выразить это. Я буду редактировать формулировку (и мой шаблон ответа ;-)).
AdmBorkBork

1
Я могу быть предвзятым, потому что я связан с реализацией PowerShell, поэтому мне пришлось многое узнать о том, что на самом деле происходит внутри интерпретатора;)
Joey

25

V , 7 байт

10é*10Ä

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

Примерно так же просто, как может быть ответ.

Объяснение:

10      "10 times:
  é*    "insert an asterisk
    10Ä "make 10 copies of the current line

Неконкурентная версия (5 байт):

10O±*

Объяснение:

10O     " Insert the following on the next ten lines:
   ±    "   10 copies of
    *   "   an asterisk

Это не сработало, когда задача была опубликована из-за ошибки.


Точка порядка: é и Ä являются многобайтовыми символами (по крайней мере, в utf-8, как вы их здесь), поэтому эта программа имеет длину 9 байт.
ограбить

6
@rob Здесь они кодируются в utf-8, потому что именно так работает браузер. V использует кодировку «Latin1», где они находятся E9и C4соответственно.
DJMcMayhem

21

Медуза , 12 10 байт

Спасибо Zgarb за сохранение 2 байта.

P$'*
 &;10

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

объяснение

Используя более условные обозначения, эта программа представляет следующее выражение:

P( $( &;(10), '* ) )

&;принимает одно значение и создает пару с удвоенным значением, так что &;(10)дает нам [10 10]. Затем $происходит изменение формы, которое образует сетку звездочек размером 10х10. Наконец, Pпечатает массив в «матричном формате», который печатает каждую строку в отдельной строке.


20

HTML & CSS, 104 60 байт

p::after{content:"**********"
<p><p><p><p><p><p><p><p><p><p>

Я не уверен, правильно ли подсчитано число байтов (так как я не считаю <style>теги для CSS. HTML-код также можно сократить, если я использую препроцессор HTML, но я не уверен, что это нарушает правила

Благодаря manatwork и бизнес-кат.

Смотрите мою нефритовую запись 36 байтов


Вы можете опустить самозакрывающиеся /s и написать все теги в одной строке. Но лучше поменяйте теги на <p>более короткие, даже если вам нужно добавить p{margin:0}.
manatwork

2
Это не действительный CSS. Вам нужна закрывающая скобка!
Ричард Гамильтон

25
@RichardHamilton действительный css и рабочий css - это не одно и то же
подземный

1
@ClementNerma Зачем кому-то ставить код после этого?
Эрик Outgolfer

2
Вы можете оставить последнее, >я верю
12Me21

16

Python 2, 22 21 байт

print('*'*10+'\n')*10

print(("*"*10+'\n')*10)работал на меня.
piepi

6
@piepi Вот почему в Python 2 вам лучше играть в гольф - вам не нужны круглые скобки при звонке print.
Shooqie

@shooqie Вы не можете победить решение Python3, используя Python2. Python2 и Python3 - это разные языки. Вы также не сравните решение Python2 со специализированным языком гольфа, таким как Pyth.
Alfe

16

MATLAB, 14 байтов

repmat('*',10)

У меня нет MATLAB для проверки этого, поэтому я не уверен, есть ли между ними пробелы *.
Эрик Outgolfer

@EriktheGolfer явно нет :)
PieCot

matпредлагает матрицу, поэтому я и спросил.
Эрик Outgolfer

2
@EriktheGolfer извините, я был груб. Mat, фактически, ссылается на матрицу, но в этом случае это матрица char, которая является массивом строк (каждая строка похожа на строку). Таким образом, матрица выходных данных печатается по одной строке за строкой без пробелов между элементами одной строки.
PieCot

16

APL , 9 байт

Работает на всех когда-либо сделанных APL.

10 10'*'

10 10 десять строк и десять столбцов

 циклически г epeating

'*' звезда

Попробуй APL онлайн!


Стоит отметить, что это решение не относится к Dyalog; это также работает с GNU APL.
Arc676

3
@ Arc676 Правда. Фактически, это работает на всех когда-либо сделанных APL.
Адам

аааа, мне нужен только еще один байт ... Я чуть не обошел тебя с помощью трюка с форматированием:∘.⊢⍨⍕⍨,⍨5
ngn

@ngn Это ужасно ужасно!
Адам

14

Java 7, 63 байта

void f(){for(int i=0;i++<10;)System.out.println("**********");}

Просто для удовольствия. Я не могу найти какие-либо хитрости, чтобы сделать это короче. Попытка добавить логику для 100-циклов или вернуть строку вместо печати только в конечном итоге хуже.


1
Вы можете сбрить его на один байт, если объявите iпеременную класса (по умолчанию 0):int i;void f(){for(;i++<10;)System.out.println("**********");}
shooqie

1
Это нарушило бы возможность многократного использования, если бы я не сделал что- i=0то в функции, сводя на нет экономию.
Geobits

3
+1 Кажется , вы действительно правы , что это самый короткий .. Рекурсивная 65 байт: int i=10;void f(){System.out.println("**********");if(i-->0)g();}; Один на один рекурсивный составляет 67 байт: int i=99;void f(){System.out.print(i%10<1?"*\n":"*");if(i-->0)g();}; Использование Стринг-конструктор с полукокса массива составляет 82 байта: void g(){System.out.print(new String(new char[10]).replace("\0","**********\n"));}; и string.Format составляет 81 байт: void g(){System.out.print(String.format("%010d",0).replace("0","**********\n"));}. Ах, хорошо, мы попробовали. ;)
Кевин Круйссен

2
Но считается ли он без добавления самого объявления класса? Какова самая короткая полная программа java7, которая может сделать это?
jsbueno

1
Вы должны посчитать оператор импорта, чтобы он не работал здесь для экономии.
Geobits

14

Рубин, 15 символов

puts [?**10]*10

Образец прогона:

bash-4.3$ ruby -e 'puts [?**10]*10'
**********
**********
**********
**********
**********
**********
**********
**********
**********
**********

Вы можете объяснить ?**10? Это действительно создает цепочку из десяти звездочек, но мне неясно, как ...
erich2k8

3
Это ?буквенное обозначение символа, так ?* == '*'. Второй *является String.*метод , так ?**10 == '*'.*(10).
manatwork

Боюсь, я до сих пор не понимаю, почему ?буквальные обозначения чего-либо, но, возможно, некоторые вопросы лучше оставить без ответа. ;)
erich2k8

Извините, я не могу найти ссылку на это. Это просто синтаксис Ruby, который допускает различные строковые литеральные обозначения плюс один в случае, если длина строки составляет 1 символ: ?знак, за которым следует символ, не требуя закрывающей пары ?знака.
manatwork

1
Я нашел это в ссылке здесь: ruby-doc.org/core-2.3.0/doc/syntax/literals_rdoc.html There is also a character literal notation to represent single character strings, which syntax is a question mark (?) followed by a single character or escape sequence that corresponds to a single codepoint in the script encoding:
erich2k8

13

Блокнот, 34 31 нажатие клавиш

**********
^A^C↓^V^A^C↓^V^V^V^V

^ обозначает Ctrl- <следующий символ> нажатие клавиши, ↑ ↓ - клавиши вверх и вниз соответственно.

Реквизит в Crypto для 3 сохраненных нажатий клавиш.


2
Вы должны использовать нажатия клавиш, чтобы посчитать это.
Утренняя монахиня

1
Это Shift + Up. Ctrl + Up это что-то еще.
Нил

1
31 нажатие клавиш**********↵^A^C↓^V^A^C↓^V^V^V^V
Crypto

1
26 нажатий клавиш*****^A^C^V^V↵^A^C^V^A^C^V^V^V^V^V
Энди

5
23 нажатия клавиш**^A^C^V^V^V^V^V↵^A^C^V^V^A^C^V^V^V^V^V
Энди

13

Эмоджикод , 54 байта

🏁🍇🔂i⏩0 10🍇😀🔤**********🔤🍉🍉

Объяснение:

🏁🍇                        👴 The beginning of program.
    🔂 i ⏩ 0 10 🍇          👵 This is called a "range".
                          It basically starts with i=0 and increments until i=10, then exits. 👵
        😀 🔤**********🔤    👵 😀 is printing class.
                          The 🔤s make the characters they surround string literals. 👵
    🍉                     👴 End of range
🍉                         👴 End of program

2
Я считаю 54 UTF-8 байт.
Конор О'Брайен

Этот язык ненавидит Windows 7 ...
Джон Дворжак


10

R, 27 29 байт

cat(rep('\r**********\n',10))

Альтернативный ответ (34 байта): cat(rep('**********',10),sep='\n')


Это добавляет дополнительный пробел в начале всех строк, кроме первой (см. Здесь ).
plannapus

Спасибо, это работает, добавляя \r.
Мами

1
Другая альтернатива, слишком много (37) байтов: cat(matrix('*',10,10),fill=10,sep='') r-fiddle
Джонатан Кэрролл

Другая альтернатива, также 29 байтов:write(rep("*",100),"",10,,"")
Джузеппе

1
И write(rep("**",50),1,5,,"")составляет 27 байт и избегает первого возврата каретки.
Дж. Доу

9

PHP, 32 байта

for(;$i++<10;)echo"**********
";

(вариант 32 байта - было написано с echo)

<?=str_repeat("**********
",10);

(вариант 33 байта)

<?=str_pad("",110,"**********
");

(вариант 33 байта)

for(;$i++<110;)echo$i%11?"*":"
";

(вариант 35 байт)

for(;$i++<10;)printf("%'*10s
",'');

(вариант 38 байт)

<?=($a=str_repeat)($a("*",10)."
",10);

3
Второй также может быть добавлен в 32 байта :<?=str_repeat("**********↵",10);
insertusername здесь

1
Как у вас уже есть хорошая коллекция альтернатив, вот еще для развлечения: echo chunk_split(str_repeat("*",100),10);Самый длинный до сих пор, только в моем видении это PHP способ сделать это.
Манатворк

Может быть короче байта с кодировкой WIN-1252: for(;++$i<111;)echo$i%11?~Õ:~õ;илиfor(;++$i<11;)echo~ÕÕÕÕÕÕÕÕÕÕõ;
около

Другой вариант по модулю в течение 33 байт: for(;$i++<110;)echo"*↵"[$i%11<1];. И добавить раствор 37 байт для этой коллекции: for(;$i++<110;)echo chr($i%11?42:10);.
Тит


8

Brainfuck, 46 43 байта

+[[---<]+[-->]<]<<[--<<++..........-->>>.<]

Попробуйте онлайн! Требуется переводчик с лентой, которая открыта слева и имеет 8-битные ячейки.

Первая часть этой программы +[[---<]+[-->]<]настраивает ленту так:

[255, 250, 245, ... 15, 10, 5, 0, 250, 240, 230, ..., 40, 30, 20, 10, 0]
                                                                      ^

Это дает 40 для вывода звездочек ( *, ASCII 42), 20 для использования в качестве счетчика цикла и 10 для вывода новых строк.


7

JavaScript (ES6), 37 байт

console.log(`**********
`.repeat(10))

Простой ответ.


5
Не можете ли вы сохранить 6 с помощью alert?
Кевин Л.

1
Возможно, вы могли бы сохранить 13 байтов, удалив console.log()и указав REPLв заголовке.
Патрик Робертс

6

Чеддер, 21 20 байт

print('*'*10+'
')*10

Еще один простой ответ.


4
Используйте буквальный перевод строки, чтобы сохранить 1 байт
Leaky Nun

2
->Может быть, использовать функцию вместо печати?
Downgoat

6

Haskell, 29 байт

putStr$[0..9]>>"**********\n"

<list1> >> <list2>делает (length <list1>)копии <list2>.


6

Р, 35 33 32 байта

Ô Р, ты иногда такой многословный .

for(i in 1:10)cat(rep("*",10),"\n")

Интересно, что catфункция не имеет значения (она предоставляет NULLSTDOUT), поэтому вы не можете делать что-то подобное rep(cat(rep))), что было бы смешнее!

РЕДАКТИРОВАТЬ:
Новое решение, предложенное @LeakyNun, -2 байта.

for(i in 1:10)cat("**********\n")

РЕДАКТИРОВАТЬ: сокращение его всего на -1 байт, @ user5957401

for(i in 0:9)cat("**********\n")

3
for(i in 1:10)"**********\n"
Утренняя монахиня

1
@ LeakyNun: простота является ключом! Я, catтем не менее, в противном случае ничего не производит.
Фредерик

cat(rep("**********\n",10))
Утренняя монахиня,

@LeakyNun Это не даст желаемый результат: смотрите здесь . Разделитель по умолчанию в catэто пробел, отсюда и вывод.
plannapus

5

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

Число байтов предполагает кодировку ISO 8859-1. Лидирующий перевод строки значителен.


10$**
.
$_¶

Первый этап записывает строку из десяти звездочек, второй этап заменяет каждую звездочку всей строкой и переводом строки. Это печатает два конечных перевода строки.


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