Левый центр правый (LCR) код гольф


10

На вечеринке меня познакомили с игрой LCR. Теперь это не отличная игра, так как в ней нет навыков, а есть только случайный шанс. Но это заставило меня задуматься, я мог написать это, и я сделал быструю программу на R для моделирования игры.

Правила игры изменены из Википедии, чтобы соответствовать тому, как мы играли:

Каждый игрок получает как минимум 3 фишки. Игроки по очереди бросают три шестигранных кубика, каждый из которых помечен буквами «L», «C», «R» на одной стороне и одной точкой на трех оставшихся сторонах. Для каждого броска "L" или "R" игрок должен передать один чип игроку слева или справа соответственно. «C» обозначает фишку в центре (банк). Точка не имеет никакого эффекта.

Если у игрока осталось менее трех фишек, они все еще находятся в игре, но их количество фишек - это количество кубиков, которые они бросают в свой ход, а не бросают все три. Когда у игрока ноль фишек, они в этот ход пропускают кубики, но могут получать фишки от других и соответственно делать следующий ход. Победителем становится последний игрок, поставивший фишки в центр.

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

Например, игра может быть выведена как:

[[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],
[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],
[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],
[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]

ht: Джонатан Аллан

Выходные данные не должны выглядеть точно так, но должно быть легко различить бросок костей, сколько фишек у каждого игрока и сколько фишек в центре за каждый ход.

Это код гольф, поэтому выигрывает самый короткий код.


3
«Должно быть легко различить бросок костей» - это неявно (и поэтому легко различить) от состояний фишек, как и игрок, который бросил, так как он основан на ходу. Я бы сказал, что в этом примере вывода есть все необходимое: так ли [[[3,3,3,3],0],[[1,4,3,4],0],[[1,4,3,4],0],[[1,4,1,4],2],[[1,4,1,2],4],[[0,4,1,3],4],[[0,3,2,3],4],[[0,3,0,3],6],[[0,3,1,1],7],[[0,3,1,1],7],[[2,0,1,1],8],[[2,0,0,1],9],[[2,0,0,0],10],[[0,1,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[1,0,0,0],11],[[0,0,0,0],12]]это?
Джонатан Аллан

1
@JonathanAllan, это работает для меня.
Зал CT

1
@KevinCruijssen, хороший вопрос, думаю, я позволю в любом случае.
CT Hall

1
@CTHall В этом случае я отредактировал оба моих ответа (Java и 05AB1E) и включил как с, так и без. :)
Кевин Круйссен

1
Я почти хочу сделать это в Рунике, где каждый указатель инструкции действует как данный игрок. Не уверен, что смогу (даже игнорируя количество игроков), но было бы здорово, если бы я мог.
Draco18s больше не доверяет SE

Ответы:


4

Emacs Lisp , 279 байт

(defmacro n(i)`(incf(nth ,i c)))
(defun f(p s)(g(let((a'(0)))(dotimes(i p)(push s a))(princ a))0 p))
(defun g(c v p)(dotimes(i(min(nth v c)3))(decf(nth v c))(case(random 6)(0(n(mod(1- v)p)))(1(n(mod(1+ v)p)))(2(n p))(t(n v))))(princ c)(or(eq(-sum c)(nth p c))(g c(mod(1+ v)p)p)))

Используйте эту функцию как (f 4 3).

Лучше читаемая версия:

(defmacro n (i) `(incf (nth ,i c)))

(defun f(p s)
  (g
   (let ((a '(0)))
     (dotimes (i p)
       (push s a))
     (princ a))
   0
   p))

(defun g (c v p)
  (dotimes (i (min (nth v c) 3))
    (decf (nth v c))
    (case (random 6)
      (0 (n (mod (1- v) p)))
      (1 (n (mod (1+ v) p)))
      (2 (n p))
      (t (n v))))
    (princ c)
    (or (eq (-sum c) (nth p c))
    (g c (mod (1+ v) p) p)))

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

(3 3 3 3 0)(1 4 3 4 0)(2 2 4 4 0)(2 2 2 5 1)(4 2 2 3 1)(2 2 2 4 2)(2 1 3 4 2)(2 2 0 4 4)(2 2 0 4 4)(1 2 0 4 5)(2 1 0 4 5)(2 1 0 4 5)(2 1 1 3 5)(0 1 1 3 7)(1 0 1 3 7)(1 0 1 3 7)(1 0 3 1 7)(1 0 3 1 7)(1 0 3 1 7)(1 1 2 1 7)(1 1 3 0 7)(0 1 3 0 8)(1 0 3 0 8)(1 1 1 1 8)(1 1 2 0 8)(0 1 2 1 8)(0 1 2 1 8)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 1 9)(0 1 1 0 10)(0 1 1 0 10)(0 0 1 0 11)(0 0 1 0 11)(0 0 1 0 11)(0 0 1 0 11)(0 0 1 0 11)(0 0 0 0 12)

3

Java 8, 281 277 275 274 253 байта

Версия, которая выводит то же состояние, когда у игрока на терне осталось 0 фишек:

p->n->{java.util.Arrays A=null;int c[]=new int[p],i=0,t,r,s=1,u,f=9;for(A.fill(c,n);s>0;f=0,System.out.print(A.toString(c)))for(t=c[++i%p],t=t>3?3:t;t-->f;r*=Math.random(),c[i%p]-=1-r/3,s=c[u=(i+r-1+p)%p]+=1-r&1-r/4,c[u]=s<0?0:s,s=A.stream(c).sum())r=6;}

Начинается с третьего игрока в массиве.

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

Версия, которая пропускает игроков с 0 оставшимися фишками (274 байта):

p->n->{java.util.Arrays A=null;int c[]=new int[p],i=p,t,r,s=1,u,f=9;for(A.fill(c,n);s>0;f=0,System.out.print(A.toString(c))){for(t=c[i%p],t=t>3?3:t;t-->f;r*=Math.random(),c[i%p]-=1-r/3,s=c[u=(i+r-1+p)%p]+=1-r&1-r/4,c[u]=s<0?0:s)r=6;for(s=A.stream(c).sum();s>0&c[++i%p]<1;);}}

Начинается с первого игрока в массиве.

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

-7 байт благодаря @ OlivierGrégoire .

Пояснение (второй версии):

p->n->{                      // Method with two integer parameters and no return-type
  java.util.Arrays A=null;   //  Create a static Arrays-object to save bytes
  int c[]=new int[p],        //  Integer-array with chips of each player (0 by default)
      i=p,                   //  Index integer, starting at the amount of players
      t,                     //  Temp integer to roll 3 dice
      r,                     //  Temp integer for the dice-result
      s=1,u,                 //  Temp integers (and `s` is also the total-sum integer)
      f=9;                   //  Flag integer, starting at a single digit above 3
  for(A.fill(c,n);           //  Give each player in the array the chips
      s>0                    //  Loop as long as the total-sum is not 0 yet
      ;                      //    After every iteration:
       f=0,                  //     Set the flag to 0
       System.out.print(A.toString(c))){
                             //     Print the current state
    for(t=c[i%p],            //   Set `t` to the current player's chips
        t=t>3?3:t;           //   If this is larger than 3: set it to 3 instead
        t-->f                //   Loop that many times (1, 2, or 3)
                             //   (the flag is used to skip this loop the first iteration,
                             //   so we can print the initial state)
        ;                    //     After every iteration:
         r*=Math.random(),   //      Roll the dice in the range [0,5]
         c[i%p]-=r<3?        //      If the dice-roll is 0, 1 or 2:
                  1          //       Remove a chip from this player
                 :0,         //      Else: Leave the chip-amount the same
         s=c[u=(i+r-1+p)%p]  //      If the dice-roll is 0, go to the player left
                             //      If the dice-roll is 2, go to the player right
             +=1-r&1-r/4,    //       And add a chip to this player
         c[u]=s<0?0:s)       //      Change negative amount of chips to 0
      r=6;                   //    Reset the dice-roll to 6 so we can roll again
    for(s=A.stream(c).sum(); //   Calculate the total sum of the chips of the players
        s>0&                 //   If this sum is larger than 0:
         c[++i%p]<1;);}}     //    Determine the next player in line with at least 1 chip

1
Может оставить мое возражение без (крошечного) гольфа: D s=0;for(int C:c)s+=C;(21 байт) можно заменить на s=A.stream(c).sum();(20 байт)
Оливье Грегуар

Кроме того, не уверен, что все в порядке: c[i%p]-=r<3?1:0c[i%p]-=1-r/3. Это сэкономит 2 байта.
Оливье Грегуар

1
@ OlivierGrégoire Ах, умный способ повторного использования Aот java.util.Arrays. : D И, поместив его в цикл, чтобы сохранить точку с запятой, получим -2 байта. И 1-r/3это действительно правильно ( см. Здесь ). Спасибо.
Кевин Круйссен

Хороший трюк с уменьшением сравнения циклов. Я мог бы украсть это.
Stackstuck

1
Не обращайте внимания на мой предыдущий удаленный комментарий: моя таблица истинности была выключена. Это фиксированный: s=c[u=(i+r-1+p)%p]+=1-r&1-r/4(экономит 2 байта по сравнению с s=c[u=(i+r%2*2-1+p)%p]+=r<2?1:0)
Оливье Грегуар

2

Python 2 , 159 148 байт

from random import*
n,c=input()
g=[c]*n;i=0
while sum(g):exec"r=randrange(6);g[i]-=1;g[i-[0,1,~-n][max(0,r-3)]]+=r>0;"*min(3,g[i]);i=(i+1)%n;print g

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

Печатает все фишки игроков после каждого броска


Хорошая попытка, но код не показывает количество фишек в центре.
CT Hall

3
@CTHall Фишки в центре всегда равны n*c - sum(players). Если мне нужно будет явно выписать это, я буду
TFeld

это правда. Я позволю это.
Зал CT

2

Желе , 39 байт

+2, чтобы исправить поведение повторения ( ¡перед ним должна стоять нилада, так что «3Ḣ$-> ⁸FḢ«3).

Если мы можем определить выходные списки, которые должны вращаться, чтобы фишки принадлежали игроку, который действовал ранее слева, мы можем покончить с самым правым 6 байт на 33 байта (однако, на мой взгляд, это несколько неудобно читать).

ẋµ’1¦‘.,2ŻX¤¦$¹Ø.X¤?⁸FḢ«3¤¡ṙ1µSпṙ"JC$$

Диадическая ссылка, принимающая количество фишек на игрока слева и количество игроков справа, которая выдает список фишек в списке игроков как в начале игры, так и после каждого хода (включая ходы, в которых 0 фишек дает пас) ,

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

Как?

Каждый игрок по очереди, до трех раз, в зависимости от количества своих фишек, подбрасывает монету. Когда игрок переворачивает головы, он ничего не делает, но если он переворачивает хвосты, он бросает трехсторонний кубик, теряя фишку в L, C или R. (Обратите внимание, что 0 переворачивается, когда у игрока 0 фишек, эквивалентно прохождению.)
Это повторяется пока сумма фишек игроков не станет равной 0.
Реализация поворачивает игроков влево на одно место каждый ход, а затем поворачивает полученные состояния обратно, чтобы все были выровнены, как если бы они не были.

ẋµ’1¦‘.,2ŻX¤¦$¹Ø.X¤?⁸«3Ḣ¤¡ṙ1µSпṙ"JC$$ - Link: chipsPerPlayer, C; numberOfPlayers, P
ẋ                                      - repeat C P times (making a list of P Cs)
                              п       - collect up results in a list while...
                             S         - ...п condition: sum (while players have chips)
 µ                          µ          - ...п do: the monadic chain:
                         ¡             -   repeat...
                        ¤              -   ...¡ number of times: nilad and link(s) as a nilad:
                    ⁸                  -     chain's left argument (the chip list)
                     «3                -     minimum with three (vectorises)
                       Ḣ               -     head -- i.e. min(left-most player's chips, 3)
                   ?                   -   ...¡ action: if...
                  ¤                    -     ...? clause: nilad and link(s) as a nilad:
               Ø.                      -       the list [0,1]
                 X                     -       random choice (0 is falsey while 1 is truthy)
             $                         -     ...? then: last two links as a monad:
    ¦                                  -       sparsely apply...
   1                                   -       ...¦ to indices: one (the left-most)
  ’                                    -       ...¦ action: decrement (player lost a chip)
            ¦                          -       sparsely apply...
           ¤                           -       ...¦ to indices: nilad and link(s) as a nilad:
      .,2                              -         literal pair of literals .5 and two = [.5,2]
         Ż                             -         prepend a zero = [0,0.5,2]
          X                            -         random choice
                                       -         -- Note application to index .5 is a no-op
                                       -                 index 0 is the right-most entry (L) 
                                       -                 index 2 is the second entry (R) 
                          ṙ1           -   rotate the list left by one for the next п loop
                                     $ - last two links as a monad:
                                    $  -   last two links as a monad:
                                  J    -     range of length -- i.e. [1,2,3,...,turns+1]
                                   C   -     complement = 1-x        [0,-1,-2,...,-turns]
                                 "     -   zipped-appliction of:
                                ṙ      -     rotate left by
                                       -   -- i.e. rotate 1st left by 0, 2nd left by -1, ...)

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

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

... это не совсем правильное поведение? Согласно спецификации, вам нужно бросить все три кубика, а не одну монетку. Если описание не по ошибке и код в порядке.
Stackstuck

@Stackstuck - обзор описания немного вводит в заблуждение, монета подбрасывается каждый раз; Я исправлю это - спасибо. FWIW описание Разбивки кода правильное - оборотная монета ветвление, Ø.X¤?, вложено внутри повтора-вверх-к-3-кратного инструкции, ⁸«3Ḣ¤¡.
Джонатан Аллан

Ах хорошо. Рад, что смог помочь.
Stackstuck

1

C #, 356? +13? Б

Требуется using System;всего +13 байт к коду, показанному ниже, если мне нужно это посчитать. В противном случае просто включите его в любой класс и позвоните L(players, starting chips);.

static int i,j,k,l;public static void L(int p,int s){var r=new Random();var x=new int[p];for(i=0;i<p;i++)x[i]=s;
for(i=0;i<s*p;){for(j=0;j<p;j++){for(l=0;l<x[j]&l<3;l++){k=r.Next(-1,5);if(k<2){if(k==0){x[j]--;i++;}else{x[(p+j+k)%p]++;x[j]--;}}}Console.Write(a(x)+i);}}}public static string a(int[] x){var n="|";for(l=0;l<x.Length;)n+=x[l++]+" ";
return n;}

Пример вывода для игры 2,2:

|1 3 0|2 2 0|1 3 0|1 3 0|0 4 0|0 3 1|0 3 1|2 1 1|1 2 1|1 2 1|0 3 1|0 3 1|0 3 1|1 1 2|1 1 2|1 1 2|0 2 2|1 1 2|0 1 3|1 0 3|0 1 3|0 1 3|0 1 3|1 0 3|1 0 3|1 0 3|0 1 3|1 0 3|0 1 3|0 0 4

Менее гольф-версия:

using System;
//class omitted.
static int i,j,k,l;
public static void LCR(int pl, int sc){
var r=new Random();
var state = new int[pl];
for(i=0;i<pl;i++)state[i]=sc;
for(i=0;i<sc*pl;){
    for(j=0;j<pl;j++){
        for(l=0;l<state[j] && l<3;l++){
            k=r.Next(-1,5);
            if(k<2){
                if(k==0){state[j]--;i++;}else{state[(pl+j+k)%pl]++;state[j]--;}
            }
        }
        Console.Write(a(state)+i);
    }
}
}
public static string a(int[] x){
    var n="|";
    for(l=0;l<x.Length;)n+=x[l++]+" ";
    return n;
}

Ну, это мой первый ответ здесь. Пожалуйста, не ешь меня.
Stackstuck

Ах, Драт. Я перепутал поведение массива с Java. Я просто вернусь с ревизией.
Stackstuck

Хорошо, это исправлено, вывод должен определенно работать.
Stackstuck

... нет, есть еще одна ошибка.
Stackstuck

Люди, говорящие по модулю, когда поведение на самом деле является остатком, не должны этого делать. Там я на 90% уверен, что теперь это работает.
Stackstuck

1

C # (интерактивный компилятор Visual C #) , 201 199 байт

n=>m=>{var r=new Random();var j=Enumerable.Repeat(n,m).ToList();for(int i=0;j.Any(c=>c>0);i++,Print(j))for(int k=0,x=r.Next(6);k++<Math.Min(j[i%m],3);j[((x<1?-1:1)+i+m)%m]+=x<2?1:0,j[i%m]-=x<3?1:0);}

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

startingChips=>playerNum=>{
//Instantiate a new random number generator
var rng = new Random();
//Create a list of chips
var players = Enumerable.Repeat(startingChips, playerNum ).ToList();
//Loop as long any player still has chips
for(int turnNum = 0;players.Any(c=>c>0);
//And print the result every iteration
i++,Print(j))
//Get a random number within the range of 0-5 and loop for...
for(int k = 0,randomNum = rng.Next(6);
//either 3 or the amount of chips we have, whichever is smaller
k++<Math.Min(players[turnNum % playerNum ],3);
//Increment either the right player if the random number is 1, else increment the right player if it is 0
players[((randomNum<1?-1:1)+ turnNum + playerNum ) % playerNum ]+=x<2?1:0,
//Decrement current player if the die roll is under 3
players[ turnNum % playerNum ]-=x<3?1:0);}

1

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

≔⁰ηWΣθ«≔Eθ⭆⌊⟦κ׳⁼λη⟧‽⁶ιUMθ⁻⁺⁺κ№§ι⊕λ3№§ι⊖λ5LΦ§ιλ›μ2≔﹪⊕ηLθη⟦⪫θ,

Попробуйте онлайн! Ссылка на подробную версию кода. Чередует вывод рулонов кубиков и оставшихся фишек (ни исходное количество фишек, ни количество фишек в центре не учитываются). Объяснение:

≔⁰η

Начните с первого игрока.

WΣθ«

Повторяйте, пока ни у кого не осталось фишек.

≔Eθ⭆⌊⟦κ׳⁼λη⟧‽⁶ι

Бросьте до трех кубиков для текущего игрока. Эти кости обозначены 0-5, где 0-2 представляют точку, 3 - проход слева, 4 - центр, 5 - вправо.

UMθ⁻⁺⁺κ№§ι⊕λ3№§ι⊖λ5LΦ§ιλ›μ2

Сложите количество фишек, которые игрок справа прошел слева, и количество фишек, которые игрок слева прошел справа, но вычтите количество фишек, которые игрок сам передал.

≔﹪⊕ηLθη

Переход к следующему игроку.

⟦⪫θ,

Выведите новые номера фишек, которыми владеют игроки.

На самом деле каждому проще одновременно бросать свои кости, что можно сделать за 50 байтов, включая печать рулонов и оставшихся фишек:

WΣθ«≔Eθ⭆⌊⟦κ³⟧‽⁶ιUMθ⁻⁺⁺κ№§ι⊕λ3№§ι⊖λ5LΦ§ιλ›μ2⟦⪫ι,⪫θ,

Попробуйте онлайн! Ссылка на подробную версию кода.


Я не уверен, но не похоже, что в нем учитывается количество фишек, удерживаемых после каждой роли, а не в каждом раунде.
Зал CT

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

1

05AB1E (legacy) , 58 50 49 52 байта

Версия, которая выводит то же состояние, когда у игрока на терне осталось 0 фишек ( 50 49 52 байта ):

и[=ÐO_#¾è3‚Ws\F5ÝΩ©3‹iε¾¹%NQ-}®≠iε®<¾+¹%NQ+}}}}D0›*¼

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

Версия, которая пропускает игроков с 0 оставшимися фишками ( 58 57 60 байт ):

и[=DO_#[D¾èDĀ#\¼}3‚Ws\F5ÝΩ©3‹iε¾¹%NQ-}®≠iε®<¾+¹%NQ+}}}}D0›*¼

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

Оба +3 байта, используя устаревшую версию, потому что новая версия 05AB1E имеет странную ошибку. Он должен работать с Ws\(выдвигать минимум без выталкивания; своп; отбрасывать список), замененным на ß(всплывающий список и выдвигать минимум) и 0›(проверять, больше ли 0) заменять на d(проверять, не неотрицательно ли / больше или равно 0) в новая версия, но по какой-то причине порядок следования изменяется после завершающего ¼! .. : S (и новая версия также очень медленная и истекает через 60 секунд до завершения результата ..>.>)

Первый ввод - количество игроков, второй - количество фишек на игрока.

Пояснение (второй версии):

и                    # Create a list with a size of the (first) implicit input,
                     # filled with the second (implicit) input
[                    # Start an infinite loop:
 =                   #  Print the list with trailing newline, without popping the list
 DO_#                #  If the total amount of chips is 0: stop the infinite loop
 [                   #  Start an inner infinite loop:
  D¾è                #   Get the chips of the I'th player (I is 0 by default)
     D               #   Duplicate this
      Ā#             #   If it is NOT 0: stop the inner infinite loop
        \            #   Remove the duplicated chips for the next iteration
         ¼           #   And increase I by 1
 }                   #  After the inner infinite loop:
 3Ws\               #  If the amount of chips is larger than 3: use 3 instead
      F              #  Loop that many times:
       5ÝΩ           #   Roll a random dice in the range [0,5]
       ©3i          #   If the dice-roll is 0, 1, or 2:
           ε¾¹%NQ-}  #    Remove a chip from the I'th player
           ®≠i       #    If the dice-roll is NOT 1:
              ε®<¾+  #     Go to the player left if 0; or right if 2
              ¹%NQ+} #     And increase that player's chips by 1
      }}}            #  Close both if-statements and the loop
         D0›*        #  Make any negative amount of chips 0
             ¼       #  Increase I by 1

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

@CTHall Вы уверены? В какой из четырех версий TIO вы видели это? Я проверил только последнюю (унаследованная версия, которая пропускает игроков с 0 фишками), но единственный раз, когда он увеличивает игрока, это когда другой игрок на ходу. Вот последний из них с добавленной отладочной строкой, чтобы вы могли видеть, какой (0-индексированный) игрок находится на очереди.
Кевин Круйссен

1
Старые версии кажутся правильными, но в нелегальной версии, похоже, есть ошибка, о которой я упоминал.
Зал CT

@CTHall Ах, ты действительно прав. Я вижу строку, [2, 3, 3, 3]за которой следует [2, 2, 2, 6]..: S Я посмотрю, смогу ли я найти причину и устранить ее. Если нет, я всегда могу удалить его и использовать только устаревшее, так как оно все равно выводит намного больше .. По какой-то причине новая версия довольно медленная со сложными циклами ..>.>
Кевин Круйссен

@ CTHall Я смог точно определить проблему, но не смог ее исправить. По какой-то причине порядок списка меняется сразу после увеличения глобального counter_variable. Я попытался воспроизвести проблему в более простом примере, но не смог. Он как-то связан с вложенными операторами if и отображениями внутри бесконечного цикла, но это определенно странно ... В любом случае, я удалил эту версию, и теперь осталась только старая (и более быстрая) версия, которая работает как задумано.
Кевин Круйссен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.