Двоичные числа Волшебный трюк


28

Задача проста; выведите следующие шесть двумерных целочисленных массивов:

[[ 1, 11, 21, 31, 41, 51],
 [ 3, 13, 23, 33, 43, 53],
 [ 5, 15, 25, 35, 45, 55],
 [ 7, 17, 27, 37, 47, 57],
 [ 9, 19, 29, 39, 49, 59]]

[[ 2, 11, 22, 31, 42, 51],
 [ 3, 14, 23, 34, 43, 54],
 [ 6, 15, 26, 35, 46, 55],
 [ 7, 18, 27, 38, 47, 58],
 [10, 19, 30, 39, 50, 59]]

[[ 4, 13, 22, 31, 44, 53],
 [ 5, 14, 23, 36, 45, 54],
 [ 6, 15, 28, 37, 46, 55],
 [ 7, 20, 29, 38, 47, 60],
 [12, 21, 30, 39, 52]]

[[ 8, 13, 26, 31, 44, 57],
 [ 9, 14, 27, 40, 45, 58],
 [10, 15, 28, 41, 46, 59],
 [11, 24, 29, 42, 47, 60],
 [12, 25, 30, 43, 56]]

[[16, 21, 26, 31, 52, 57],
 [17, 22, 27, 48, 53, 58],
 [18, 23, 28, 49, 54, 59],
 [19, 24, 29, 50, 55, 60],
 [20, 25, 30, 51, 56]]

[[32, 37, 42, 47, 52, 57],
 [33, 38, 43, 48, 53, 58],
 [34, 39, 44, 49, 54, 59],
 [35, 40, 45, 50, 55, 60],
 [36, 41, 46, 51, 56]]

Что это за двумерные целочисленные массивы? Эти числа используются в фокусе с карточками, содержащими эти числа:

enter image description here

Магический трюк просит кого-то подумать о числе в диапазоне [1, 60] и дать тому, кто выполняет магический трюк, все карты, содержащие это число. Тот, кто выполняет магический трюк, может затем суммировать верхние левые числа (все степени 2) данных карт, чтобы получить число, о котором думал человек. Некоторое дополнительное объяснение того, почему это работает, можно найти здесь.

Правила соревнований:

  • Вы можете вывести шесть двумерных целочисленных массивов в любом приемлемом формате. Может быть напечатан с разделителями; может быть трехмерным целочисленным массивом, содержащим шесть двумерных целочисленных массивов; может быть строкой списка строк; и т.п.
  • Вам разрешено заполнять нижнюю правую позицию последних четырех карт отрицательным значением в диапазоне [-60, -1]или символе, '*'вместо того, чтобы пропускать из него целочисленные массивы 2D в виде прямоугольных матриц (нет, вы не можете их заполнять 0или не -integer как null/ в undefinedкачестве альтернативы, за исключением того, *что в реальных картах также используется звезда).
  • Порядок чисел в матрицах является обязательным. Хотя это не имеет значения для физического магического трюка, я рассматриваю этот вызов главным образом как - , отсюда и ограничение порядка.
    Порядок самих матриц в списке вывода может быть в любом порядке, так как из верхней левой карты ясно, какая матрица какая.

Основные правила:

  • Это , поэтому выигрывает самый короткий ответ в байтах.
    Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования.
  • Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вы можете использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
  • По умолчанию лазейки запрещены.
  • Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
  • Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.

Связанный. (Как и в случае, это относится к тому же волшебному трюку, но не очень полезно, чтобы получить вдохновение для этого испытания, я думаю. В этом задании требуется вывести истинное / ошибочное значение, если число nуказано на k'-ой карте; где мой вызов - это KC-вызов для вывода шести матриц.)
Кевин Круйссен

1
@DigitalTrauma Хм, я не уверен, действительно ли это дубликат, потому что ваша задача ascii-art (не помечена как таковая, но она есть), в то время как эта позволяет вывести массив в более мягком формате (не просто четыре по существу одинаковых способа). Я не могу голосовать, чтобы открыть, хотя, потому что у меня есть молоток.
Эрик Outgolfer

@EriktheOutgolfer Woops .. Забыл, что у меня тоже есть молоток>.> Иногда возможность закрывать / открывать молот довольно раздражает ... Хотя у него уже было 2 голоса, так что у вас и у меня было 4 открытых голоса. Но если кто-то захочет закрыть его снова, я не возражаю. Они действительно очень похожи, хотя его задача - это действительно [ascii-art]проблема со строгими (MD5) правилами вывода, где мои очень гибкие (и строки / столбцы меняются местами, а диапазон [1,60]вместо [1,63]; довольно незначительные различия, но все же).
Кевин Круйссен

Похоже, вы не пытались вступить в VTRO с позицией «это мой драгоценный вызов !!!» по крайней мере ...: P
Эрик Outgolfer

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

Ответы:


6

MATL , 12 11 байт

-1 байт спасибо самому мастеру :)

60:B"@fQ6eq

Объяснение:

60:           % create a vector [1,2,3,...,60]
   B          % convert to binary matrix (each row corresponds to one number)
    "         % loop over the columns and execute following commands:
     @f       % "find" all the nonzero entries and list their indices
       Q      % increment everything
        6e    % reshape and pad with a zero at the end
          q   % decrement (reverts the increment and makes a -1 out of the zero
              % close loop (]) implicitly
              % display the entries implicitly

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


8

Perl 6 , 63 46 байт

say grep(*+&2**$_,^61)[$_,*+5...*for ^5]for ^6

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

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


7

Python 2 , 76 байт

r=range;print[[[i for i in r(61)if i&2**k][j::5]for j in r(5)]for k in r(6)]

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

Метод здесь состоит в том, чтобы создать список всех возможных номеров, r(61)а затем свести его к списку номеров для карты.i&2**k .

Затем, используя нарезку списка, этот список номеров 1D переупорядочивается до правильного размера карты 6x5 [card nums][j::5]for j in r(5).

Затем этот генератор просто повторяется для 6 карт for k in r(6).


Хотя я не смог найти решения менее 76 байтов, вот еще два, которые также 76 байтов:

r=range;print[[[i for i in r(61)if i&1<<k][j::5]for j in r(5)]for k in r(6)]

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

Этот следующий вдохновлен Джонатаном Алланом .

k=32
while k:print[[i for i in range(61)if i&k][j::5]for j in range(5)];k/=2

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

Любые комментарии с благодарностью.


6

Древесный уголь , 26 байт

E⁶E⁵⪫E⁶§⁺§⪪Φ⁶¹&πX²ι⁵ν⟦*⟧λ 

Попробуйте онлайн! Ссылка на подробную версию кода. Я попытался вычислить записи напрямую, но это было уже 27 байтов, прежде чем корректировать *в правом нижнем углу. Выводит каждый ряд, объединенный пробелами и пустой строкой между карточками. Объяснение:

E⁶                          Loop over 6 cards
  E⁵                        Loop over 5 rows
     E⁶                     Loop over 6 columns
           Φ⁶¹              Filter over 0..60 where
               π            Current value
              &             Bitwise And
                 ²          Literal 2
                X           Raised to power
                  ι         Card index
          ⪪        ⁵        Split into groups of 5
         §          ν       Indexed by column
        ⁺                   Concatenated with
                      *     Literal string `*`
                     ⟦ ⟧    Wrapped in an array
       §                λ   Indexed by row
    ⪫                       Joined with spaces
                            Implicitly print

Я добавил это правило *для развлечения после того, как увидел звезды на настоящих картах. Интересно, будут ли на нем какие-нибудь языки, но я рад, что хотя бы один из них это сделал. :) Хороший ответ!
Кевин Круйссен

1
У @KevinCruijssen Charcoal нет оператора транспонирования, а для самой лучшей транспонирования в гольфе требуется прямоугольный массив известного размера, поэтому мне нужно добавить что-то, чтобы составить размер, и он должен *быть по меньшей мере таким же коротким, как и все остальное.
Нейл

Я не думаю, что это 26 байтов ...
Tvde1

@ Tvde1 Древесный уголь, как и многие esolangs на этом сайте, использует пользовательскую кодовую страницу. Символы с этой страницы стоят 1 байт, а другие - до 4 байт.
Нейл

6

05AB1E , 16 байтов

60L2вíƶ0ζε0K5ô®ζ

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

объяснение

60L                 # push [1 ... 60]
   2в               # convert each to a list of binary digits
     í              # reverse each
      ƶ             # multiply each by its 1-based index
       0ζ           # transpose with 0 as filler
         ε          # apply to each list
          0K        # remove zeroes
            5ô      # split into groups of 5
              ®ζ    # zip using -1 as filler

05AB1E , 17 байт

6F60ÝNoôāÈϘ5ô®ζ,

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

объяснение

6F                  # for N in [0 ... 5] do
  60Ý               # push [0 ... 60]
     Noô            # split into groups of 2^N numbers
        āÈÏ         # keep every other group
           ˜        # flatten
            5ô      # split into groups of 5
              ®ζ    # transpose with -1 as filler
                ,   # print

5

Шелуха , 13 байт

ṠMöTC5Wnünḣ60

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

объяснение

          ḣ60  Range [1..60]
        ü      Uniquify using equality predicate
         n     bitwise AND: [1,2,4,8,16,32]
 M             For each number x in this list,
Ṡ     W        take the indices of elements of [1..60]
       n       that have nonzero bitwise AND with x,
    C5         cut that list into chunks of length 5
  öT           and transpose it.

5

Python 2 , 82 80 78 74 байта

i=1 
exec"print zip(*zip(*[(n for n in range(61)+[-1]if n&i)]*5));i*=2;"*6

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

-4 байта, благодаря Джонатану Аллану


3
Ницца. iterКлючевое слово является излишним , так как здесь генератор будет делать эту работу так же хорошо .
Джонатан Аллан

@JonathanAllan Круто, спасибо: D
TFeld


4

JavaScript (ES6),  90  88 байт

_=>[1,2,4,8,16,32].map(n=>(g=i=>i<60?g(++i,i&n?m[y%5]=[...m[y++%5]||[],i]:0):m)(y=m=[]))

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

комментарии

_ =>                        // anonymous function taking no argument
  [1, 2, 4, 8, 16, 32]      // list of powers of 2, from 2**0 to 2**5
  .map(n =>                 // for each entry n in this list:
    ( g = i =>              //   g = recursive function taking a counter i
      i < 60 ?              //     if i is less than 60:
        g(                  //       recursive call:
          ++i,              //         increment i
          i & n ?           //         if a bitwise AND between i and n is non-zero:
            m[y % 5] =      //           update m[y % 5]:
            [ ...m[y++ % 5] //             prepend all previous values; increment y
              || [],        //             or prepend nothing if it was undefined so far
              i             //             append i
            ]               //           end of update
          :                 //         else:
            0               //           do nothing
        )                   //       end of recursive call
      :                     //     else:
        m                   //       return m[]
    )(y = m = [])           //   initial call to g with i = y = m = []
                            //   (i and y being coerced to 0)
  )                         // end of map()


4

C (gcc) , 95 байт

i,j,k;f(int o[][5][6]){for(i=6;i;)for(o[--i][4][5]=j=k=-1;j<60;)++j&1<<i?o[i][++k%5][k/5]=j:0;}

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

Возвращает матрицы в виде трехмерного массива int в o.

Последние 4 матрицы имеют -1 в качестве последнего значения.

Сохранено 2 байта благодаря Кевину Круйссену.

Сохранено 7 8 байт благодаря Арно.


Вы можете сохранить 2 байта, изменив o[i][4][5]=-1;for(j=k=0;значение for(o[i][4][5]=-1,j=k=0;так, чтобы скобки можно было удалить. Хороший ответ, кстати, +1 от меня.
Кевин Круйссен


(Обратите внимание, что я не уверен на 100%, разрешено ли передавать 3D-массив, уже выделенный с правильными размерами. Но я позволю обычным игрокам в гольф C лучше понять это.)
Арно

@Arnauld Я думал об этом, но решил против этого.
Матей Мулей

лучше не #includeпоказывать, что это работает без него
только ASCII

3

CJam (18 байт)

6{61{2A#&},5/zp}fA

Онлайн демо . Это полная программа, которая выводит на стандартный вывод.

рассечение

6{             }fA    # for A = 0 to 5
  61{2A#&},           #   filter [0,61) by whether bit 2^A is set
           5/z        #   break into chunks of 5 and transpose to get 5 lists
              p       #   print

3

Желе , 13 байт

60&ƇⱮs€5LÐṂZ€

Ссылка niladic, которая выдает список из (6) списков целых чисел. (Выводится с использованием опции по умолчанию отсутствия *или отрицательного наполнителя.)

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

Как?

Каждая матрица содержит в основном порядке столбцов числа до 60 которые разделяют один установленный бит с верхним левым (минимальным) числом.

Эта программа сначала делает все 60 возможные упорядоченные списки номеров в [1,60]которые разделяют любые установленные биты с их порядковым номером. Затем он разбивает каждый на куски5и сохраняет только те, которые имеют минимальную длину - это будут те, где индекс имеет только один установленный бит (и, следовательно, также является его минимальным значением). Наконец, он переставляет каждый из них, чтобы расположить их в мажорном порядке.

60&ƇⱮs€5LÐṂZ€ - Link: no arguments
60            - set the left argument to 60
    Ɱ         - map across ([1..60]) with:  (i.e. [f(60,x) for x in [1..60]])
   Ƈ          -   filter keep if:  (N.B. 0 is falsey, while non-zeros are truthy)
  &           -     bitwise AND
      €       - for each:
     s 5      -   split into chunks of five
         ÐṂ   - keep those with minimal:
        L     -   length
           Z€ - transpose each

Много 15 с без реализации трюка «минимальная по длине при делении на пять»:

5Ż2*Ɱ60&ƇⱮs€5Z€
6µ’2*60&Ƈ)s€5Z€
60&ƇⱮ`LÞḣ6s€5Z€

... и, пытаясь найти короче, я получил еще 13, не нуждаясь в хитрости вообще:

60B€Uz0Ts5ZƊ€

3

Wolfram Language (Mathematica) , 88 байт

Transpose@Partition[#~Append~-1,5]&/@Last@Reap[Sow[,NumberExpand[,2]]~Do~{,60},Except@0]

Я позволил себе добавить ссылку TIO (основываясь на ответе @ J42161217 ). +1 от меня.
Кевин Круйссен


@ Mr.Xcoder Спасибо. Я использовал этот ~трюк еще в одном месте и заменил переменную kна Null. Извините, нет времени, чтобы добавить ссылку tio.
Бруно Ле Флох

2

Wolfram Language (Mathematica) , 99 байтов

Transpose@Partition[#~FromDigits~2&/@Last@GatherBy[{0,1}~Tuples~6,#[[-k]]&],5]~Table~{k,6}/. 61->-1

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


Вы можете сохранить несколько символов, выполнив: Transpose@вместо Transpose[...]; заполнение до 30 записей перед разбиением; используя, Table[...,{k,6}]чтобы избежать необходимости k=#.
Бруно Ле Флох

@Bruno Le Floch Table может сохранять один байт. Вы пытались транспонировать @? Потому что это не сработает, если вы внимательно посмотрите. Я афк но гольф позже
J42161217

Извините, Transpose@работает после переезда PadRightвнутрь Partition. Другой комментарий состоит в том, что вопрос, кажется, не учитывает ""заполнителя; Вы можете заменить его -1без потери байта.
Бруно Ле Флох


2

R , 73 байта

`!`=as.raw;lapply(0:5,function(i)matrix(c((a=1:60)[(!a&!2^i)>0],-1),5,6))

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

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


Вывод выглядит хорошо. И если R заполняет матрицы столбцами перед строкой, а не строкой перед столбцом, как почти во всех других языках, это просто означает, что это хороший язык программирования для использования в этой задаче. :)
Кевин Круйссен

2

T-SQL, ( 1 168 1139 байт)

Я просто хотел знать, что смогу это сделать.

Оптимизированная версия

 WITH g AS(SELECT 1 AS n UNION ALL SELECT n+1 FROM g WHERE n+1<61),B as(SELECT cast(cast(n&32 as bit)as CHAR(1))+cast(cast(n&16 as bit)as CHAR(1))+cast(cast(n&8 as bit)as CHAR(1))+cast(cast(n&4 as bit)as CHAR(1))+cast(cast(n&2 as bit)as CHAR(1))+cast(cast(n&1 as bit)as CHAR(1))as b FROM g),P as(SELECT * from (values(1), (2), (4), (8), (16), (32)) as Q(p)),S as(select distinct p,p+(substring(b,6,1)*1)*(case when p=1 then 0 else 1 end)+(substring(b,5,1)*2)*(case when p=2 then 0 else 1 end)+(substring(b,4,1)*4)*(case when p=4 then 0 else 1 end)+(substring(b,3,1)*8)*(case when p=8 then 0 else 1 end)+(substring(b,2,1)*16)*(case when p=16 then 0 else 1 end)+(substring(b,1,1)*32)*(case when p=32 then 0 else 1 end)as e from P cross apply B),D as(select * from S where e>=p and e<61),R as(select p,(row_number()over(partition by p order by cast(e as int)))%5 as r,e from D),H as(select k.p,'['+stuff((select','+cast(l.e as varchar)from R l where l.p=k.p and l.r=k.r for xml path('')),1,1,'')+']'as s from R k group by k.p,k.r)select stuff((select','+cast(x.s as varchar)from H x where x.p=z.p for xml path('')),1,1,'')from H z group by z.p

Онлайн демо

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

Подробная версия - с примечаниями в виде комментариев SQL

WITH gen -- numbers 1 to 60
AS (
    SELECT 1 AS num
    UNION ALL
    SELECT num+1 FROM gen WHERE num+1<=60
),
BINARIES -- string representations of binaries 000001 through 111111
as (
SELECT 
    +cast( cast(num & 32 as bit) as CHAR(1))
    +cast( cast(num & 16 as bit)  as CHAR(1))
    +cast( cast(num & 8 as bit)  as CHAR(1))
    +cast( cast(num & 4 as bit)  as CHAR(1))
    +cast( cast(num & 2 as bit)   as CHAR(1))
    +cast(cast(num & 1 as bit)  as CHAR(1)) as binry FROM gen
),
POWERS -- first 6 powers of 2
as (
SELECT * from (values(1), (2), (4), (8), (16), (32)) as Q(powr)
),
SETELEMENTS -- cross apply the six powers of 2 against the binaries
-- returns 2 cols. col 1 = the power of 2 in question.
-- col 2 is calculated as that power of 2 plus the sum of each power of 2 other than the current row's power value, 
-- but only where a given power of 2 is switched "on" in the binary string, 
-- ie. where the first digit in the string represents 32, the second represents 16 and so on. 
-- That is, if the binary is 100100 then the number will be 
-- the sum of (32 x 1) + (16 x 0) + (8 x 0) + (4 x 1) + (2 x 0) + (1 x 0) 
-- but if the current row's power is 32 or 4, then just that number (32 or 4) is excluded from the sum.
-- rows are distinct.
as (
select distinct powr,
powr+
 (substring(binry,6,1) * 1) * (case when powr = 1 then 0 else 1 end)
 +(substring(binry,5,1) * 2) * (case when powr = 2 then 0 else 1 end)
 +(substring(binry,4,1) * 4) * (case when powr = 4 then 0 else 1 end)
 +(substring(binry,3,1) * 8) * (case when powr = 8 then 0 else 1 end)
 +(substring(binry,2,1) * 16) * (case when powr = 16 then 0 else 1 end)
 +(substring(binry,1,1) * 32) * (case when powr = 32 then 0 else 1 end) as elt
from POWERS cross apply BINARIES
),
DISTINCTELEMENTS -- purge calculated numbers smaller than the power of 2 or greater than 60
as (
select * from SETELEMENTS where elt >= powr and elt < 61
)--,
,
ROWNUMBERED -- for each power, number the rows repeatedly from 0 through 5, then back to 0 through 5 again, etc
as (
select powr, (row_number() over (partition by powr order by cast(elt as int)))%5 as r, elt  from DISTINCTELEMENTS
),
GROUPEDSETS -- for each row number, within each power, aggregate the numbers as a comma-delimited list and wrap in square brackets - the inner arrays
as (
select r1.powr, '['+stuff((select ',' + cast(r2.elt as varchar) from ROWNUMBERED r2 where r2.powr = r1.powr and r2.r = r1.r for xml path('')),1,1,'')+']' as s
from ROWNUMBERED r1
group by r1.powr,r1.r
)
select -- now aggregate all the inner arrays per power
stuff((select ',' + cast(g2.s as varchar) from GROUPEDSETS g2 where g2.powr = g1.powr for xml path('')),1,1,'')
from GROUPEDSETS g1
group by g1.powr

Вуаля!

Примечание 1. Часть логики относится к отображению квадратных скобок и запятых.

Примечание 2: более новые версии SQLServer имеют более компактные подходы к созданию списков, разделенных запятыми. (Это было создано на SQL Server 2016.)

Примечание 3: Массивы для данной карты не сортируются (что нормально для спецификации). Числа в массиве правильно отсортированы. В этом случае каждая «карточка» вопроса, выводит свои массивы в отдельный ряд результатов.

Короче к массиву с жестким кодом?

Да.

Байт мне.


Боже, не будет ли короче просто жестко закодировать результат?
Джо Кинг

Ха - ха. Ни как весело, ни растяжимо.
youcantryreachingme

Я не совсем понимаю - вы говорите, что ваше решение работает только случайно, или вы убеждены, что правильно следовали спецификациям?
Джонатан Фрех

@JonathanFrech - я явно не кодировал порядок чисел, хотя в языке может быть неявное условие, приводящее к гарантированному порядку. Они отображаются в правильном порядке возрастания. Отдельно после публикации я понял, что неправильно понял, как должны быть представлены данные (в полосатых массивах на карту, а не в одном наборе на карту) - так что мне еще предстоит решить эту проблему. Таким образом, результат в настоящее время отображает правильные числа в порядке возрастания в каждом из 6 ожидаемых наборов - см. Связанную скрипту sql. Еще предстоит сделать: разбить наборы на 5 подмножеств каждый.
youcantryreachingme

Я ценю ваши усилия, но если ваше решение не является правильным, пожалуйста, исправьте его или удалите ваше сообщение. Как правило, мы не допускаем неправильных ответов задерживаться.
Джонатан Фрех




1

MATLAB, 155 байт

cellfun(@disp,cellfun(@(x)x-repmat(62,5,6).*(x>60),cellfun(@(x)reshape(find(x,30),[5 6]),mat2cell(dec2bin(1:62)-48,62,ones(1,6)),'Uniform',0),'Uniform',0))

Это может быть короче, как несколько строк, но я хотел сделать это в одной строке кода.


1
Не могли бы вы добавить ссылку TIO с тестовым кодом, чтобы я мог проверить вывод?
Кевин Круйссен

1

05AB1E , 14 байтов

žOε60LDNo&ĀÏ5ι

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


1
Почему žOвместо просто 6L? Я знаю, что вы не используете их на своей карте, но мне любопытно, почему вы использовали aeiouyдля создания списка с 6 значениями. xD Хороший ответ, кстати!
Кевин Круйссен

1
@KevinCruijssen Нет особых причин, я просто подумал , что это было смешнее 6L, , , , или 9!.
Grimmy

Это конечно привлекло мое внимание, это точно. ;)
Кевин Круйссен

@KevinCruijssen Я просто понял тœ, ₅œ, ₁œ, а также работа, те довольно прохладно тоже (:
Grimmy

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