Відображайте слова за допомогою 7-сегментного відображення


13

Моя перша в історії програмування головоломок та коду для гольфу - це семикосовий показ . Ось мій перший виклик, який також базується на 7-сегментному дисплеї.

Окрім цифр, я часто думаю про те, які букви я можу відображати за допомогою простого 7-сегментного дисплея. Виявляється, багато літер можуть бути відображені. Насправді всі, крім букв K, M, V, W, X, можуть відображатися за допомогою одного 7-сегментного дисплея. Це тому, що ви можете відображати або малі, або великі літери. напр

"abcdef" може відображатися як

 _     _     _  _
!_!!_ !   _!!_ !_ 
! !!_!!_ !_!!_ !  

Зауважте, що кожен символ є матрицею 3x3, що складається з !та _.

Звичайно, 7-сегментний дисплей можна використовувати для відображення цифр та символів:

 _     _  _  _           _  _     _    
  ! _ !_ !_ !      _!  !!_ !_!!  !_!!_!
  !    _!!_ !_!   !_!  ! _!!  !_ ! ! _!

Деякі літери можуть мати верхній і нижній регістр:

 _                 _          
!   _ !_!!_   !   ! ! _ ! !   
!_ !_ ! !! !  !  !!_!!_!!_!!_!

Ось повний набір символів:

 _     _  _     _  _  _  _  _                       _
! !  ! _! _!!_!!_ !_   !!_!!_!    _ !_     _     _  _!
!_!  !!_  _!  ! _!!_!  !!_! _!   !_ ! !  !!_!!_!   !  

 _     _     _  _  _                 _  _  _     _           _ 
!_!!_ !   _!!_ !_ !  !_!  !  !!   _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_! _!!_ 

Зверніть увагу, що є пробіл ( ), тире ( -) та знак питання ( ?). У листі I, Oі Zтакі ж , як числа 1, 0і 2відповідно.

У цьому виклику ви напишете програму або функцію для відображення рядка, використовуючи 7-сегментний формат відображення вище.

Правила

  1. Можна написати програму або функцію

  2. Це код-гольф, виграє найкоротший код у байтах

  3. Ваша програма чи функція повинні приймати дані з STDIN або як параметр. І виводить рядок в STDOUT або як рядок у 3 рядках без провідного простору, але закінчується новим рядком. Обробіть верхній / нижній корпус CHIOUналежним чином.

  4. Ви можете додатково друкувати пробіли білого кольору

  5. Ви повинні дотримуватися вищевказаного формату. Використовуючи підкреслення _та знак оклику !для формування вашого 7-сегментного дисплея.

  6. Ви повинні підтримувати пробіл ( ), тире ( -) та знак запитання ( ?)

  7. Якщо рядок містить непідтримуваний символ (k, m, v, w, x), відображається один символ помилки (3 лінія горизонту, див. Приклад). Крім 5 непідтримуваних символів, ви можете припустити, що вхід складається лише з підтримуваного набору символів.

  8. Я вирішив не мати літери для малого L ( l) через плутанини, але якщо ви настільки схильні, ви можете відображати її як 1праворуч чи ліворуч.

Приклади

$./a.out Start
 _     _    
!_ !_ !_! _ !_
 _!!_ ! !!  !_
$./a.out "7-seg dIsplay"
 _     _  _  _           _  _     _ 
  ! _ !_ !_ !      _!  !!_ !_!!  !_!!_!
  !    _!!_ !_!   !_!  ! _!!  !_ ! ! _!
$./a.out "0123456789 chiou-?"
 _     _  _     _  _  _  _  _                       _
! !  ! _! _!!_!!_ !_   !!_!!_!    _ !_     _     _  _!
!_!  !!_  _!  ! _!!_!  !!_! _!   !_ ! !  !!_!!_!   !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
 _     _     _  _  _                 _  _  _     _        _
!_!!_ !   _!!_ !_ !  !_!  !  !!   _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
 _           _  _  _                    _  _     _        _
!_!!_  _  _!!_ !_ !  !_      !!   _  _ !_!!_! _ !_ !_     _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_!!_
$./a.out "Bad Form"
 _
 _
 _
$./a.out "Hello"
    _       
!_!!_ !  !   _
! !!_ !_ !_ !_!
$./a.out "World"
 _
 _
 _

Так, ви можете припустити, що немає непідтримуваних символів. Моя мета - переконатися, що рядки, що містять k, m, v, w, x, не відображаються.
якийсь користувач


Думаю, ви переплутали повернення вагона (CR, \r) із стрічкою лінії (LF, \n). * nix використовує LF, а Windows використовує CRLF. Лише деякі застарілі системи використовують CR самостійно. Більше інформації тут: en.wikipedia.org/wiki/Newline
Вінні

Здається, у вашого персонажа "8" є смужка "|" замість знака оклику «!». Це призначено?
coredump

1
@Winny, ти прав, звичайно. Мені було занадто ледаче це шукати, коли я це писав.
якийсь користувач

Відповіді:


7

CJam, 123 114 112 110 байт

Qq_eu";=KMVWX":T&"@"@?" -chiou"Tereu{i"^A^W^G;^Þ¯     ^Þ^Û9³·^É¿»
^@
^P
^Ü^Ò½7¦^_¶´§=   ^O^V&5^U¯¼¹^T³6/"=i2b9Ue[3/"!_!"f.{S?}.+}/N*

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

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

Qq_eu";=KMVWX":T&"@"@?" -chiou"Tereu{i"AWG{ÞïIÞÛyó÷Éÿû
@
P
ÜÒýwæ_öôç}IOVfuUïüùTóvo"=i448+2b1>3/"!_!"f.{S?}.+}/N*

Цього разу всі символи для друку. Спробуйте його в Інтернеті в інтерпретаторі CJam .

Приклад виконання

$ LANG=en_US
$ xxd -ps -r > 7seg.cjam <<< 51715f6575223b3d4b4d565758223a5426224022403f22202d6368696f752254657265757b69220117073b9eaf099e9b39b3b789bfbb0a000a100a9c92bd37a61fb6b4a73d090f16263515afbcb914b3362f223d6932623955655b332f22215f2122662e7b533f7d2e2b7d2f4e2a
$ wc -c 7seg.cjam 
110 7seg.cjam
$ echo -n '0123456789 chiou-?' | cjam 7seg.cjam; echo
 _     _  _     _  _  _  _  _                       _ 
! !  ! _! _!!_!!_ !_   !!_!!_!    _ !_     _     _  _!
!_!  !!_  _!  ! _!!_!  !!_! _!   !_ ! !  !!_!!_!   !  
$ echo -n 'ABCDEFGHIJLNOPQRSTUYZ' | cjam 7seg.cjam; echo
 _     _     _  _  _                 _  _  _     _           _ 
!_!!_ !   _!!_ !_ !  !_!  !  !!   _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ !  !_!! !  !!_!!_ ! !!_!!    !!   _!!_ !_! _!!_ 
$ echo -n 'World' | cjam 7seg.cjam; echo
 _ 
 _ 
 _

Ідея (версія для друку)

Кожен символ може бути показаний на 9-сегментному дисплеї

!_!
!_!
!_!

шляхом заміни деяких символів символів пробілами.

Ми можемо перетворити конкретний символ у ціле число, замінивши кожен показаний сегмент у природному порядку читання на 1 , кожен не показаний сегмент на 0 та врахувавши отримані двійкові цифри.

Перший та третій відрізки ніколи не відображаються, тому це дасть цілі числа в діапазонах [0,64) та [128,192) .

Ми можемо кодувати ці цілі числа як один байт, але половина з них призведе до недрукувальних символів. Таким чином, ми додаємо 64 до кожного цілого числа перед тим, як подавати символи, що гарантує, що кодові точки знаходяться в діапазонах [64,128) та [192,256) .

Єдиним недрукованим символом у цих двох діапазонах є DEL (кодова точка 127), що відповідає наступній неперевіреній конфігурації екрана:

!_!
!_!

Ми можемо змінити вищезазначене кодування, додавши 448 == 512 - 64 до кожної кодової точки, перетворившись на базу 2 та видаливши першу двійкову цифру.

Все, що залишилося, щоб знайти ефективний спосіб асоціювання цих закодованих сегментів з відповідними символами ASCII.

Якщо ми відображаємо символи " -chiou"символів ";=KMVWX"та перетворюємо весь вхід у великі регістри, ми можемо просто зберігати кодування для всіх символів між 0(кодова точка 48) та Z(кодова точка 90), надаючи діапазон 43.

Індексація масиву є модульною в CJam, тому, якщо Aце рядок довжиною 43 A86=, A43=і A0=всі дають однакові результати. Символ з кодовою точкою 86 є V, тому ми просто зберігаємо закодовані сегменти V - Z та 0 - U , по порядку.

У фактичному коді ми вибираємо знак at як "погана форма", замінюємо весь вхід рядком, "@"якщо він містить заборонену літеру, і перевертаємо кроки зверху.

Код (версія для друку)

Q            e# Push an empty array for posterior concatenation.
q            e# Read from STDIN.
_eu          e# Copy the input and convert is to uppercase.
";=KMVWX":T& e# Intersect the result with with T := ";=KMVWX".
"@"@?        e# Select "@" if truthy and the input if falsy.
" -chiou"Ter e# Perform transliteration.
eu           e# Convert everything to uppercase.
{            e# For each character in the modified input:
  i          e#   Push its code point.
  "…"=       e#   Select the corresponding character from the string.
  i448+      e#   Push that character's code point and add 448.
  2b1>       e#   Convert to base 2 and discard the first digit.
  3/         e#   Group into triplets of digits (rows).
  "!_!"      e#   Push that string.
  f.{        e#   For each group of digits:
    S?       e#     Select the corresponding char of "!_!" for 1 and " " for 0.
  }          e#
  .+         e#   Concatenate along the rows with the previous results.
}/           e#
N*           e# Join, separating by linefeeds.

2

Perl, 475 469 424 390 280 272 байт

$_=<>;die" -
"x3if/[kmvwx]/i;y/chiou/kmvwx/;$_=lc;while(/(.)/g){$z=ord($1=~y/a-z0-9\-\? /{v\x17nWS7z(.F\x16rb?[yBuV> f&|O?(Omxuw)\x7f}@K\0/r);$i.=$z&1?' _ ':$"x3;$m.=($z&16?'!':$").($z&64?'_':$").($z&8?'!':$");$p.=substr("  !  _!_",$z&6,2).($z&32?'!':$")}print"$i
$m
$p
"

багаторядковий з коментарями:

$_=<>;   # accept input
die" -   # check for invalid chars
"x3if/[kmvwx]/i;
y/chiou/kmvwx/;$_=lc;   # substitute invalid chars, convert to lowercase
while(/(.)/g)   # loop over each character
    # lookup character from string using transliteration and convert to
    # number using ord() for bit checking:
    {$z=ord($1=~y/a-z0-9\-\? /{v\x17nWS7z(.F\x16rb?[yBuV> f&|O?(Omxuw)\x7f}@K\0/r);
    $i.=$z&1?' _ ':$"x3;    # first row
    $m.=($z&16?'!':$").($z&64?'_':$").($z&8?'!':$");   # second row
    $p.=substr("  !  _!_",$z&6,2).($z&32?'!':$")}    # third row
# print result:
print"$i
$m
$p
"

Бітові шаблони, що кодують сегменти, зберігаються в рядку (уникаючи 3 недрукованих символів, використовуючи \xта використовуючи \0пробіл) і відображаються на вхідні символи за допомогою оператора транслітерації Perl.

Для 5 із 7 сегментів порозрядне значення використовується разом із потрійним оператором для виведення символу пробілу або сегмента. Для нижнього лівого двох сегментів (закодованих 2 та 4 у бітовому наборі), пошук підрядів у рядку з 8 символів використовується для збереження 2 байтів.

Завдяки Дому Гастінгсу за його поради щодо гольфу Perl.

Стара версія (використовуючи регулярні вирази для кодування шаблонів), 390 байт:

$_=<>;if(/[kmvwx]/i){print" -\n"x3;exit}y/chiou/kmvwx/;$_=lc;while(/(.)/g){$z=$1;$i.=($z=~/[acefgopqsz\?0235-9]/?' _ ':'   ');$m.=($z=~/[abce-hlmopqstuy045689]/?'!':' ').($z=~/[abdefhkmnp-twyz\-\?2-689]/?'_':' ').($z=~/[adhijopquyz\?0-4789]/?'!':' ');$p.=($z=~/[a-hj-prtuwxz\?0268]/?'!':' ').($z=~/[b-egjklostuw-z0235689]/?'_':' ').($z=~/[abdg-jmnoqsu-y013-9]/?'!':' ')}print"$i\n$m\n$p\n"

багаторядковий з коментарями:

$_=<>;   # accept input
if(/[kmvwx]/i){print" -\n"x3;exit}   # check for invalid chars
y/chiou/kmvwx/;$_=lc;   # substitute invalid chars, convert to lowercase
while(/(.)/g)
{$z=$1;$i.=($z=~/[acefgopqsz\?0235-9]/?' _ ':'   '); # first row
$m.=($z=~/[abce-hlmopqstuy045689]/?'!':' ').
($z=~/[abdefhkmnp-twyz\-\?2-689]/?'_':' ').
($z=~/[adhijopquyz\?0-4789]/?'!':' '); # second row
$p.=($z=~/[a-hj-prtuwxz\?0268]/?'!':' ').
($z=~/[b-egjklostuw-z0235689]/?'_':' ').
($z=~/[abdg-jmnoqsu-y013-9]/?'!':' ')} # third row
print"$i\n$m\n$p\n" # print result

Рядок зачитується та перевіряється на недійсні символи за допомогою регулярного вираження, виходячи із наявності, якщо такі знайдені. Тоді дозволені символи малих літер замінюються недійсними символами і вся рядок перетворюється на малі знаки.

Рядки формуються по одному, по 1 відрізку на одну літеру в першому рядку і 3 на двох інших. Для кожного рядка рядок обробляється по одному символу за раз, і символ порівнюється з регулярним виразом для кожного сегмента, щоб перевірити, чи є a! або _ має відображатися. Використання регулярного вираження означає, що для символів, де сегмент не встановлений, для кодування необхідного встановлення потрібен нуль бітів на сегмент на символ, а для тих, де він є, потрібно в середньому трохи менше 8 біт, оскільки діапазон символів регулярного виразів може бути б / в. Таким чином, це наближається до 3 або 4 біт на сегмент на символ у наборі, або приблизно 21-24 біта на символ.

Він не обробляє обертання ліній.


1
Привіт @samgak, рада бачити більше кохання Perl! Я помітив кілька речей, які могли б допомогти вам відголити деякі байти, і хотів ними поділитися! Ви можете використовувати деякі магічні змінні Perl, щоб допомогти зменшити це; ' 'може бути замінено $"і ' 'може бути, $"x3що обрізає кілька відключень, ваші \ns можуть бути буквальними новими рядками, щоб позбутися ще декількох. Ваш ранній вихід також може бути скорочений, використовуючи штампи, так що це if(/[kmvwx]/i){print" -\n"x3;exit}стає die" - "x3if(/[kmvwx]/i). З трохи більше роздумів ви також можете перевпорядкувати цикл, щоб уникнути дужок, і вам не потрібно $zбуде економити ще кілька!
Дом Гастінгс

1
Я сподіваюся, що ви не ображаєтесь, але я подумав над тим, як зменшити більше, gist.github.com/dom111/e651b5de8c7e7fc9a6cf . Вниз до 323!
Дом Гастінгс

@DomHastings взагалі не було ображених, дякую за чудові поради щодо гольфу! У своїй відредагованій відповіді я використав стільки, скільки міг, і змінив на використання бітового кодування замість регулярних виразів для шаблонів сегмента. На жаль, $ z повернувся, і я не можу зрозуміти, як його позбутися. Крім того, $_=lc<>не працює, тому що код не може розмежовувати верхній і нижній регістри CHIOU
samgak

1

Лисп звичайний, 488 416

(lambda(z)(dotimes(r 3)(map()(lambda(c)(do((i 0(+ 17 i))n)((or(and(> i 901)(setf n 146))(=(char-code c)(ldb(byte 8 9)(setf n(ldb(byte 17 i)#36RIL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02)))))(loop for v from(* 3 r)for d across"!_!"do(format t"~:[ ~;~A~]"(logbitp v n)d)))))z)(terpri)))

Приклад

З "abcdefg'hijklnopqrstuz", відбитки:

 _           _  _  _  _           _           _  _     _        _ 
!_!!_  _  _!!_ !_ !   _ !_   !  ! _ !   _  _ !_!!_! _ !_ !_     _!
! !!_!!_ !_!!_ !  !_! _ ! !  !!_! _ !_ ! !!_!!    !!   _!!_ !_!!_ 

Зауваження

Персонажі та їх зображення представлені в цьому номері в базі 36:

IL884OIVFXJY4DCQ0O8DPH8MOMR2DSLPP3O4ESYHS234A9HEQYSV8IBDBZI6Z3C3MCVR77OYD3QN5G6CX2UQWGL4UY5R9PKYI1JQ5Y6DC27MQQGUZSCGI8Q9JCYP9N1L4YYKRWM1ZNMSVTSB4792UUWV6Z3906VSP981WCCBMDNJ02

Двійкове представлення цієї цифри ділиться на групи по 17 біт.

Наприклад, остання група з 17 біт є 110000111101010, яка тут розкладається на дві частини:

  1. 110000, char-код символу 0
  2. 111101010, кодування креслення, найкраще представлене наступним чином:

    010 (bits 0-2)         _ 
    101 (bits 3-5)   =>   ! !
    111 (bits 6-8)        !_!
    

    Біти в першому та останньому "стовпцях" призначені для !символів, а середні - для _символу. За потреби зберігаються як великі, так і великі версії символу.

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


Дякую за участь у виклику. Я помітив, що ваш 'K' відображається як 'L' у вашому виході. Можливо, ви неправильно зрозуміли вимогу, що непідтримуваний символ не може бути надрукований разом з іншим дійсним символом. Також я бачу, що ви додали 'характер, що приємно; однак він відображатиметься поза тим, на що здатний 7-сегментний дисплей. Якщо ви рухаєтеся !вниз на 1 рядок, це було б ідеально.
деякий користувач

Я оновлю 'персонаж і відредагую питання, Kоскільки насправді я поставив Kнеправильне місце у вхідному рядку ("... jlKn ...") ;-) Ви можете побачити потрійні бари (помилка) просто після Л. Дякую, що помітив це.
coredump

1

JavaScript (ES6), 380 352 324 байт

( Примітка. Код використовує позначення карет, оскільки він містить деякі недруковані символи. Щоб отримати оригінальний код, натисніть тут і виберіть вихідні дані. І ні, hце не програма CJam.;)

d=s=>{a=' ',u=n=>r>>n&1?'!':a,v=n=>r>>n&1?'_':a,g='ABCDEFGHIJLNOPQRSTUYZabcdefghijlnopqrstuyz0123456789-? ÿ',h='{vUnWSuz(lTb}[;B7V|>O{vFnWSur lTbf[;B7Vd>O}(O/:7w)^??^BK^0^G',x=y=z='';for(i=0;i<s.length;x+=a+v(0)+a,y+=u(4)+v(1)+u(3),z+=u(6)+v(2)+u(5)){q=g.indexOf(s[i++]);if(q<0)return d`ÿ`;r=h.charCodeAt(q)}return x+`
${y}
`+z}

Називається як d("7-seg display")або подібне. Працює у Firefox 40, але може не бути в інших браузерах. Чомусь фрагмент HTML / JS не зберігає недруковані, але ви можете скопіювати та вставити необроблені дані звідси .

Безголівки:

( Примітка: g і hбули доповнені пробілами , щоб відповідати 8, -, ÿі spaceз їх відповідними значеннями Unicode) .

d = function (s) {
  t = function (n) { return Math.floor(n) % 2; };
  g = 'ABCDEFGHIJLNOPQRSTUYZabcdefghijlnopqrstuyz012345679? 8      -      ÿ      space ';
  h = '{vUnWSuz(lTb}[;B7V|>O{vFnWSur lTbf[;B7Vd>O}(O/:7w)?K \u007f \u0002 \u0007 \u0000';
  x = y = z = '';
  for(var i = 0; i < s.length; i++) {
    q = g.indexOf(s.charAt(i));
    if (q < 0)          // if g does not contain the character
      return d('ÿ');    // ÿ is equivalent to the error character, '\u0007'
    r = h.charCodeAt(q);
    x += ' ' + (r % 2 === 1 ? '_' : ' ') + ' ';
    y += (t(r / 16) === 1 ? '!' : ' ') + (t(r / 2) === 1 ? '_' : ' ') + (t(r / 8) === 1 ? '!' : ' ');
    z += (t(r / 64) === 1 ? '!' : ' ') + (t(r / 4) === 1 ? '_' : ' ') + (t(r / 32) === 1 ? '!' : ' ');
  }
  return x + '\n' + y + '\n' + z;
}

Пояснення:

Я одразу помітив, що 7 сегментів, перетворених у 0/ 1біти, будуть добре поєднуватися з першими 128 символами Unicode. Проблема цієї ідеї полягає в тому, що 1/4 цих символів є недрукованими контрольними символами. Використання їх у своєму коді дозволило б виглядати неймовірно безладним (або неймовірно розумним; я не вирішив, який саме). Щоб вирішити це, зберігаючи решту коду простим, я придумав таку ідею:

За винятком -, простору і помилок , жоден з персонажів НЕ були відсутні обидва нижніх вертикальних сегментів. Таким чином , щоб переконатися , що всі ці персонажі залишилися між 0020і 007f, я просто відобразив 64 і 32 біта для цих сегментів, як так:

     1
    ---
16 |   | 8
  2 ---
64 |   | 32
    ---
     4

Номери інших 5 сегментів не надто важливі; їх можна було організувати будь-яким іншим способом і все ще мати однакові символи "в межах".

Як приклад, ось кодована версія A :

     1
    ---
16 |   | 8
  2 ---
64 |   | 32

Dec: 64 + 32 + 16 + 8 + 2 + 1 = 123
Hex: 40 + 20 + 10 + 8 + 2 + 1 = 7B = u+007B = {

Потім я набила кодовану версію кожного 7-сегрового символу в h. Тим НЕ менше, 8в результаті 007fвидаленням контрольного коду, постійна , незалежно від того , як ці сегменти розташовані), простір не привело 0000нульовому коді, також константа), -в результаті 0002, і помилка привела 0007. Я копіювати-вставити необроблені байти в правильне положення 8, -і помилка ; простору було легко досягти за допомогою \0.

Після всього цього кодування, все, що мені потрібно було зробити, - це використовувати його для розшифровки рядка та виведення його у форматі для читання 7 секунд. Я використовував цикл for і три змінні ( x, yі z, кожна відповідна вихідному рядку), щоб пройти кожен символ у рядку та додати його 7-сегментний еквівалент виводу. Я вибрав ÿдля символу помилки, тому що AFAIK, його немає на будь-якій клавіатурі, і це останній символ у u+0000-u+00ffдіапазоні. Можливо, я міг би бути дотепним і обраним Ξ(грецька літера xi) натомість ....;)

Редагувати 1: Економив купу місця, створивши міні-функції, щоб визначити !, потрібен _чи потрібен.

Редагувати 2: Заощадило купу більше місця за допомогою хитрощів, які я дізнався з моменту останнього відвідування цієї публікації.

Як завжди, пропозиції високо оцінюються!

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