Левый центр правый (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:0→ c[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:
 3‚Ws\               #  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]
       ©3‹i          #   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.