Виявити теплові хвилі


48

Фон

Королівський метеорологічний інститут Нідерландів визначає теплову хвилю * як серію щонайменше 5 днів поспіль за погоди ≥25 ° C ("літня погода"), таким чином, що принаймні 3 з цих днів становлять ≥30 ° C ("тропічна погода" ).

Тропічну погоду не слід вимірювати послідовно: наприклад: 30, 25, 30, 26, 27, 28, 32, 30це 8-денна теплова хвиля з 4 днями тропічної погоди.

* (Ну, за голландськими мірками.)

Виклик

Враховуючи не порожній список позитивних цілих чисел, що представляють вимірювання температури Цельсія за наступні дні, вирішіть, чи містить цей список теплову хвилю (відповідно до наведеного вище визначення).

Виграє найкоротша відповідь у байтах.

Тестові справи

Фальсі:

[30]
[29, 29, 29, 47, 30]
[31, 29, 29, 28, 24, 23, 29, 29, 26, 27, 33, 20, 26, 26, 20, 30]
[23, 31, 29, 26, 30, 24, 29, 29, 25, 27, 24, 28, 22, 20, 34, 22, 32, 24, 33]
[23, 24, 25, 20, 24, 34, 28, 32, 22, 20, 24]
[24, 28, 21, 34, 34, 25, 24, 33, 23, 20, 32, 26, 29, 29, 25, 20, 30, 24, 23, 21, 27]
[26, 34, 21, 32, 32, 30, 32, 21, 34, 21, 34, 31, 23, 27, 26, 32]
[29, 24, 22, 27, 22, 25, 29, 26, 24, 24, 20, 25, 20, 20, 24, 20]
[23, 33, 22, 32, 30]
[28, 21, 22, 33, 22, 26, 30, 28, 26, 23, 31, 22, 31, 25, 27, 27, 25, 28]
[27, 23, 42, 23, 22, 28]
[25, 20, 30, 29, 32, 25, 22, 21, 31, 22, 23, 25, 22, 31, 23, 25, 33, 23]

Truthy:

[30, 29, 30, 29, 41]
[1, 1, 25, 30, 25, 30, 25, 25, 25, 25, 25, 25, 25, 25, 40, 1, 1]
[31, 34, 34, 20, 34, 28, 28, 23, 27, 31, 33, 34, 29, 24, 33, 32, 21, 34, 30, 21, 29, 22, 31, 23, 26, 32, 29, 32, 24, 27]
[26, 29, 22, 22, 31, 31, 27, 28, 32, 23, 33, 25, 31, 33, 34, 30, 23, 26, 21, 28, 32, 22, 30, 34, 26, 33, 20, 27, 33]
[20, 31, 20, 29, 29, 33, 34, 33, 20]
[25, 26, 34, 34, 41, 28, 32, 30, 34, 23, 26, 33, 30, 22, 30, 33, 24, 20, 27, 23, 30, 23, 34, 20, 23, 20, 33, 20, 28]
[34, 23, 31, 34, 34, 30, 29, 31, 29, 21, 25, 31, 30, 29, 29, 28, 21, 29, 33, 25, 24, 30]
[22, 31, 23, 23, 26, 21, 22, 20, 20, 28, 24, 28, 25, 31, 31, 26, 33, 31, 27, 29, 30, 30]
[26, 29, 25, 30, 32, 28, 26, 26, 33, 20, 21, 32, 28, 28, 20, 34, 34]
[34, 33, 29, 26, 34, 32, 27, 26, 22]
[30, 31, 23, 21, 30, 27, 32, 30, 34, 29, 21, 31, 31, 31, 32, 27, 30, 26, 21, 34, 29, 33, 24, 24, 32, 27, 32]
[25, 33, 33, 25, 24, 27, 34, 31, 29, 31, 27, 23]

2
Чи гарантована температура нижче 100 градусів Цельсія?
FryAmTheEggman

3
@FryAmTheEggman Ну, в Нідерландах, так :), але я не хочу, щоб ваша відповідь зловживала цим фактом, так що ні.
Лінн

1
@HatWizard Так, це нормально. Наприклад, "Crash / Don't crash" також добре.
Лінн

2
Привіт, @Lynn, це було великим викликом і досі є :-)
Roland Schmitz

1
@RolandSchmitz Дякую! Я щасливо здивований творчими відповідями, які вийшли з нього так пізно в життя виклику. 🎉
Лінн

Відповіді:



19

Желе , 15 байт

:5_5Ṡ‘ẆP«LƊ€>4Ṁ

Монадічна посилання, що приймає список номерів, який повертається, 1якщо теплову хвилю було виявлено ще 0.

Спробуйте в Інтернеті! або побачити набір тестів .

Як?

Критерієм є наявність прогону більш ніж чотирьох значень, більших або рівних 25, з яких більше двох має бути більшим або рівним 30.

Якщо ми розділимо їх на п’ять, то критерієм стає наявність прогону більш ніж чотирьох значень, більших або рівних п'яти, з яких більше двох має бути більшим або рівним шести.

Якщо від цих значень відняти п’ять, то критерієм стає наявність прогону більш ніж чотирьох значень, більших або рівних нулю, з яких більше двох має бути більшим або рівним одному.

Якщо взяти знак цих значень (отримуючи -1, 0 або 1), критерієм стає наявність прогону з більш ніж чотирьох значень, не рівних -1, з яких більше двох має бути рівним одиниці.

Якщо до цих значень додати одне (отримуючи 0, 1 або 2), критерієм стає наявність прогону з більш ніж чотирьох значень, не рівних нулю, з яких більше двох має бути рівним двом.

Добуток списку, що містить будь-які нулі, дорівнює нулю, а добуток списку, що містить більше двох подвійних (а решта - це більше), більше чотирьох. Це означає, що критерієм у цьому скоригованому списку стає те, що мінімум товару та довжина перевищують 4.

:5_5Ṡ‘ẆP«LƊ€>4Ṁ - Link: list of numbers
:5              - integer divide by five (vectorises)
  _5            - subtract five (vectorises)
    Ṡ           - sign {negatives:-1, zero:0, positives:1} (vectorises)
     ‘          - increment (vectorises)
      Ẇ         - all sublists
          Ɗ€    - last three links as a monad for €ach:
       P        -   product
         L      -   length
        «       -   minimum
            >4  - greater than four? (vectorises) -- 1 if so, else 0
              Ṁ - maximum -- 1 if any are 1, else 0


9

C (стук) , 64 байти

h;o(*t){for(h=1;*t;++t)h=h&&*t<25?1:h*(*t<30?2:6)%864;return!h;}

Функція o () повертає 1 для теплової хвилі або 0.

Завдяки магічному номеру 864 та Удо Борковському та Матсісу за свої ідеї.

Як це робити? Кожна послідовність чисел повторюється операцією зменшення, починаючи зі значення зменшення 1. Якщо видно число> = 25, зменшення множимо на 2. Якщо бачимо число> = 30, зменшення множимо на 2 і на 3 = 6. Якщо видно число <25, зменшення починається знову з 1. Якщо зменшення ділиться на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то виявляється теплова хвиля, і результат Операція по модулю дорівнює 0, що призводить до зменшення значення 0 і повернення значення true.

Спробуйте в Інтернеті!


Ласкаво просимо до PPCG.
Мухаммад Салман

Ласкаво просимо до PPCG! Дуже приємна перша відповідь у комплекті з тестовим набором! Чи можете ви додати пояснення, щоб ми зрозуміли магію?
JayCe

Це дійсно елегантне рішення, молодець :)
Лінн


7

APL (Dyalog Classic) , 21 20 байт

184↓⍉×\25 30⍸↑,⍨\⎕

Спробуйте в Інтернеті!

використовує ⎕io←1

25 30⍸x дорівнює 0, якщо x <25, 1, якщо 25≤x <30, або 2 в іншому випадку

ми обчислюємо сукупні продукти цих продуктів, починаючи з (або еквівалентно: закінчуючи на) усіх можливих місць, відкидаємо перші 4 продукти та виявляємо наявність продуктів ≥8 (що становить 2 3 )


6

Japt , 19 18 байт

ô<25 d_ʨ5©3§Zè¨30
ô                  // Partition the input at every item
 <25               // where the value is less than 25.
     d_            // Then, return whether any resulting subarray
       ʨ5         // is at least five items long
          ©        // and
           3§      // has at least three items
             Zè¨30 // with a value of at least 30.

Я сподіваюся, що всі дискусії в коментарях я отримав правильно.
Поголив один байт завдяки Шаггі .

Спробуйте в Інтернеті!


Думав, що це вийде коротше, коли я читав це, але міг керувати лише 18 байтами .
Кудлатий

@Shaggy Я теж думав, але коротшої версії я також не зміг знайти. Дякую за покажчик!
Ніт

1
Схоже, ми зараз перемагаємо в цьому :)
Shaggy

Чи символи, що не належать до ASCII, не вважаються кількома байтами?
судо

1
@sudo Ці символи є однобайтовими. Наприклад, було б 3 байти, але ¨це один байт. Символи, які використовуються вище, були підібрані для мови гольфу саме з тієї причини, що всі вони є одним байтом.
Ніт

5

PowerShell , 121 байт

param($a)$b="";($a|%{if($_-ge25){$b+="$_ "}else{$b;$b=""}})+$b|?{(-split$_).count-ge5-and(-split$_|?{$_-ge30}).count-ge3}

Спробуйте в Інтернеті! або Перевірте всі тестові випадки

PowerShell не має еквіваленту того .someчи іншого .every, тому це прокатується вручну.

Ми приймаємо введення $aяк масив цілих чисел. Встановіть змінну помічника $bна порожню рядок. Потім проведіть через ціле ціле число $a. Всередині циклу, якщо ціле число -gперетворюється на величину eякості 25, додайте його в наш потенційний рядок $b, інакше поставте $bна конвеєр і встановіть його в порожній рядок.

Вийшовши за межі циклу, масив - об'єднайте результати конвеєра за допомогою $bта додайте їх через Where-Objectпункт |?{...}. Це витягує ті рядки , які мають елемент довжину -ge5(на основі розщеплення на пробільних) і підрахунок темпів більше , ніж 30бути -ge3. Ці рядки залишаються на конвеєрі, тому значення truthy не є порожнім (див. Посилання "перевірити всі тестові випадки" для розрізнення truthy / falsey).


спробуйте використовувати $args замість цього param($a)і$a
mazzy

-2 байти...{$a=-split$_;$a.count-ge5-and($a|?{$_-ge30}).count-ge3}
маззи

109 байт з масивами. зберегти $args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}-B{,($b=@())}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}як get-heatWave.ps1. Тестовий сценарій regex101.com/r/lXdvIs/2
mazzy

103 байти$b=@();$args|%{if($_-ge25){$b+=$_}else{,$b;$b=@()}}-E{,$b}|?{$_.count-ge5-and($_|?{$_-ge30}).count-ge3}
маззи

Що робить -E? Я з цим не знайомий.
AdmBorkBork

5

Желе , 17 16 байт

:5_5Ṡṣ-ḤS«LƊ€Ṁ>4

Спробуйте в Інтернеті!

Як це працює

:5_5Ṡṣ-ḤS«LƊ€Ṁ>4  Main link. Argument: T (array of temperatures)

:5                Divide each item of T by 5 (integer division).
  _5              Subtract 5 from each quotient.
    Ṡ             Take the signs.
                  This maps (-oo,25) to -1, [25,30) to 0, and [30,+oo) to 1.
     ṣ-           Split at occurrences of -1.
       Ḥ          Double, replacing 1's with 2's.
           Ɗ€     Map the three links to the left over each chunk.
        S             Take the sum.
          L           Take the length.
         «            Take the minimum of the results.
             Ṁ    Take the maximum.
              >4  Test if it's larger than 4.
                  Note that the sum is larger than 4 if and only if there are more
                 than two 2's, which correspond to temperatures in [30,+oo).



4

05AB1E , 20 байт

Œʒ24›DPsO4›*}29›O2›Z

Спробуйте в Інтернеті!

Пояснення

Œ                     # push sublists of input
 ʒ          }         # filter, keep the lists where:
           *          # the product of:
     DP               # the product and
       sO4›           # the sum compared using greater-than to 4
  24›                 # for the elements greater than 24
                      # is true
                      # the result is:
                   Z  # the maximum from the remaining lists where
                O     # the sum of 
             29›      # the elements greater than 29
                 2›   # is greater than 2

4

Пакет, 119 байт

@set h=0
@for %%t in (0 %*)do @if %%t lss 25 (set/as=5,t=3)else set/a"t+=!!t*(29-%%t)>>9,s-=!!s,h+=!(s+t+h)
@echo %h%

Приймає введення як аргументи командного рядка і виводить 1 для теплової хвилі в іншому випадку 0.


4

Пітон , 67 байт

f=lambda l:l>l[:4]and(min(l)>24<sorted(l)[~2]-5)|f(l[1:])|f(l[:-1])

Спробуйте в Інтернеті!

Час очікується на більш тривалих тестових випадках через експоненціальний ріст. Знаходить суміжні списки, багаторазово рубаючи перший або останній елемент. На 3 дні температура ≥30 ° C перевіряється, переглядаючи третє за величиною значення sorted(l)[~2]. Базові випадки, можливо, можуть бути коротшими, скориставшись правдою / фальсі або закінчившись помилкою.




4

APL (Dyalog Unicode) , 29 байт

∨/(5≤≢¨a)∧3≤+/30≤↑ae⊆⍨25e←⎕

Спробуйте в Інтернеті!

∨/чи є такі елементи, що

(5≤≢¨a)5 <підрахунок днів у кожній серії ( aмає всі можливі серії днів)

і

3≤+/30≤3 ≤ загальна +/кількість елементів, що становить ≥ 30 дюймів

↑a← матриця, утворена

e⊆⍨25≤e←⎕ ряд послідовних елементів, що ≥ 25


Ваш перший тест коментується без потреби - він працює.
ngn

@ngn Дякуємо, що помітили це, виправлено
Kritixi Lithos

4

Котлін , 57 байт

{var r=1;it.any{r*=2;if(it>29)r*=3;if(it<25)r=1;r%864<1}}

(-1 байт, замінивши явний параметр v-> на неявний параметр it )

{var r=1;it.any{v->r*=2;if(v>29)r*=3;if(v<25)r=1;r%864<1}}

(-16 байт, використовуючи будь-яку операцію {}, як показано на Ruby Solution від GB )

{it.stream().reduce(1){r,v->if(r*25>r*v)1 else(r*if(v<30)2 else 6)%864}<1}

(-1 байт дякую Лінн: замінено r> 0 && v <25 на r * 25> r * v)

{it.stream().reduce(1){r,v->if(r>0&&v<25)1 else(r*if(v<30)2 else 6)%864}<1}

Цей лямбда-вираз приймає список і повертає істинне для теплової хвилі або помилки.

Завдяки магічному номеру 864 та Удо Борковському та Матсісу за свої ідеї.

Як це робити? Кожна послідовність чисел повторюється будь-якою операцією {}, починаючи зі значення зменшення 1. Скорочення множимо на 2 і множимо на 3 (2 * 3 = 6), якщо число більше або дорівнює 30. Якщо число <25 видно, що зменшення починається знову з 1. Якщо зменшення ділиться на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то виявляється теплова хвиля, а результат роботи модуля дорівнює 0, що призводить до справжнє повернене значення у внутрішній лямбда, викликане через будь-яку операцію {}, яка потім зупиняє ітерацію та повертає значення true.

Спробуйте в Інтернеті!


Приємне пояснення :)
JayCe

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

@ jonathan-frech, я змінив функціональне тіло на дещо довше лямбда-вираз, включаючи дужки, які є необов’язковими, як вони є на Java. Це справедливо?
Роланд Шмітц

@RolandSchmitz Переглядаючи інші подання Котліна та подання функцій Java лямбда, я думаю, не враховуючи кількість байтів оголошень функції; це означає, що ваше первісне подання, швидше за все, дійсне. Вибачте за коментар, мені це здалося дивним, оскільки я вважаю, що це виглядає дуже snippet-esk, оскільки це не дійсна конструкція мови без оголошення типу.
Джонатан Фрех

3

Диво , 34 байти

(/>@(& <2!> '<29#0)*> '<24#0).cns5

Приклад використання:

((/>@(& <2!> '<29#0)*> '<24#0).cns5) [25 33 33 25 24 27 34 31 29 31 27 23]

Пояснення

Докладна версія:

(some x\\(and <2 (fltr <29) x) (every <24) x) . (cns 5)

Візьміть перекриваючі послідовності з 5-ти послідовних елементів, а потім перевірте, чи є в будь-якій послідовності всі елементи> 25 і більше 2-х елементів> 30.


Гей, це не пов’язано, але посилання на facebook на вашому веб-сайті мертве.
mbomb007


3

Стакс , 23 байти

Æ7)║▄░Ä╟═╙hⁿ╧\ßY8÷K▌µ½x

Запустіть і налагоджуйте його на staxlang.xyz!Це потребує тривалого часу, тому я відключив автозапуск.

Розпаковано (28 байт) та пояснення

:efc%4>nc{24>f=a{29>f%2>|&|&
:e                              Set of all contiguous subarrays
  f                             Filter, using the rest of the program as a predicate:
   c                              Copy subarray on the stack
    %4>                           Five or more elements?
                        |&        AND
       nc                         Copy subarray twice to top
         {   f                    Filter:
          24>                       Greater than 24?
              =                   Equals the original subarray?
                          |&      AND
               a                  Move subarray to top
                {   f             Filter:
                 29>                Greater than 30?
                     %2>          Length greater than two?
                                  Implicit print if all three conditions are met

Це надрукує всі підматриці, які можна зараховувати як теплові хвилі, які будуть хибними, якщо і лише тоді, коли таких немає.


3

Рубін , 89 байт

->a{(0..a.size).map{|i|(b=a[i..-1].take_while{|t|t>24}).size>4&&b.count{|t|t>29}>2}.any?}

Спробуйте в Інтернеті!


Я вважаю, що це не вдається, оскільки у другому випадку, +30 днів не всі протягом п'яти днів.
Стюі Гріффін

Дуже хороша. Ви можете поголити кілька байтів із each_consпідходом. Спробуйте в Інтернеті!
benj2240

3

Лушпиння , 19 байт

Vo≥3#≥30fo≥5Lġ(±≥25

Спробуйте в Інтернеті!

Використання filter ( f) - на один байт коротше, ніж використання логічної перевірки та ( &) , також було б дуже непогано позбутися ±- вартість 2 байти :(

Пояснення

V(≥3#≥30)f(≥5L)ġ(±≥25)  -- example input: [12,25,26,27,28,29,18,24,32]
               ġ(    )  -- group by
                ( ≥25)  -- | greater or equal to 25: [0,1,2,3,4,5,6,0,0,8]
                (±   )  -- | sign: [0,1,1,1,1,1,1,0,0,1]
                        -- : [[12],[25,26,27,28,29,30],[18,24],[32]]
         f(   )         -- filter by
          (  L)         -- | length: [1,6,2,1]
          (≥5 )         -- | greater or equal to 5: [0,2,0,0]
                        -- : [[25,26,27,28,29,30]]
V(      )               -- does any element satisfy
 (  #   )               -- | count occurences where
 (   ≥30)               -- | | elements greater or equal to 30
 (      )               -- | : [1]
 (≥3    )               -- | greater or equal to 3: [0]
                        -- : 0


3

R , 111 93 71 67 66 байт

!Reduce(function(i,j)"if"(j<25,!!i,(i*(2+4*!j<30))%%864),scan(),1)

Спробуйте в Інтернеті!

Shameless порт Roland Schmitz в відповідях . -4 байти завдяки Роланду і -1 завдяки Джузеппе.

TIO посилання на функціональну версію.

Попередня версія витягувала днів поспіль> 25, використовуючи rleта врятував колосальні 18 байт завдяки Джузеппе!


якщо ви використовуєте Fзамість цього T, ви можете зробити, F=F|"if"(cond,(expr),0)а потім повернутися, Fщоб зберегти 6-ish байти. У вас також є непотрібна пара дужок навколо, (1-z[i]):0але я думаю, що це може бути 1-z[i]:1все одно, щоб зберегти ще пару байтів ...
Джузеппе

^ Я збирався подати вищезазначений коментар, коли мені виникла інша ідея, і мені вдалося знайти рішення, що відповідає суб-100 байт! Це function(x,z=rle(x>24)$l){for(i in 1:sum(z|1))F=F|z[i]>4&sum(x[sum(z[1:i])+1-z[i]:1]>29)>2;F}лише обережне вставлення з PPCG у TIO, бо іноді недруковані матеріали повзають у ...
Джузеппе

Це фантастично! Можливо, є ще коротший спосіб використання математики Джонатана Аллана ...
JayCe

Приємно, ви можете навіть зберегти ще кілька байтів, якщо спростити внутрішню частину від (i * 2 * (1+ (2 * (j> 29)))) до (i * (2 + 4 * (j> 29) ))
Роланд Шмітц

@RolandSchmitz дуже правда!
JayCe

3

Швидкий 4 , 50 байт

{$0.reduce(1){$0>0&&$1<25 ?1:$0*($1<30 ?2:6)%864}}

Спробуйте в Інтернеті!

Вираз закриття повертає 0 для теплової хвилі або> 0 іншого.

Створений у співпраці з Роландом Шмітцем і Матісом.

Як це робити? Кожна послідовність чисел повторюється операцією зменшення, починаючи зі значення зменшення 1. Якщо видно число> = 25, зменшення множимо на 2. Якщо бачимо число> = 30, зменшення множимо на 2 і на 3 = 6. Якщо видно число <25, зменшення починається знову з 1. Якщо зменшення ділиться на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то виявляється теплова хвиля, і результат Операція по модулю дорівнює 0, що призводить до зменшення значення 0. Тільки коли буде виявлена ​​теплова хвиля, зменшення може стати 0. Після зменшення значення 0 це буде 0 на всі майбутні зменшення, тобто для кінцевого результату.


3

Python 2 , 66 63 байт

lambda a:reduce(lambda b,c:(b*(6,2)[c<30]%864,1)[b*25>b*c],a,1)

Спробуйте в Інтернеті!

-3 байти завдяки Лінні

Як це робити? Кожна послідовність чисел повторюється операцією зменшення, починаючи зі значення зменшення 1. Якщо видно число> = 25, зменшення множимо на 2. Якщо бачимо число> = 30, зменшення множимо на 2 і на 3 = 6. Якщо видно число <25, зменшення починається знову з 1. Якщо зменшення ділиться на 864 = 2 * 2 * 2 * 2 * 2 * 3 * 3 * 3, то виявляється теплова хвиля, і результат Операція по модулю дорівнює 0, що призводить до зменшення значення 0. Тільки коли буде виявлена ​​теплова хвиля, зменшення може стати 0. Після зменшення значення 0 це буде 0 на всі майбутні зменшення, тобто для кінцевого результату.

Більш прочитана, але довша версія виглядає так:

lambda a:reduce((lambda b,c: 1 if b>0 and c<25 else b*(2 if c<30 else 6)%864), a, 1)

Видалення зайвих пробілів / дужки і заміна x if cond else yна (y,x)[cond]дає

lambda a:reduce(lambda b,c:(b*(6,2)[c<30]%864,1)[b>0and c<25],a,1)

Лінн запропонувала скоротити умову b>0and c<25 :

b>0and c<25-> b*25>0 and b*c<b*25-> b*25>0 and b*25>b*c->b*25>b*c

в результаті чого

lambda a:reduce(lambda b,c:(b*(6,2)[c<30]%864,1)[b*25>b*c],a,1)

Ви також повинні включити заяву про імпорт :)
Мухаммед Салман

1
Вам фактично не потрібно імпортувати зменшення з functools, це вбудований в Python 2 !
Лінн

1
Ви можете перевірити, чи b*25>b*cзбережено 3 байти; це може стосуватися багатьох рішень, що застосовують такий підхід на різних мовах :)
Лінн,

@Lynn Дякую Я відповідно оновив рішення.
Удо Борковський

2

Pyth, 23 байти

f&glT5&>T]25gePPT30SM.:

Спробуйте тут

f&glT5&>T]25gePPT30SM.:
f                  SM.:Q   Get the sorted subsequences of the (implicit) input...
 &qlT5                     ... with at least 5 elements...
      &>T]25               ... all at least 25...
            gePPT30        ... where the third to last is at least 30.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.