Задачи от Интервюта


"Стандартните" интервюта за работа като програмист в големи фирми (като Google, Facebook, Microsoft, etc.) най-често включват няколко специфични типа задачи. Поради алгоритмичния си характер те са интересни и за хора, които няма скоро да се явяват на интервю. Тук ще намерите компилация от такива задачи, заедно с приложени примерни решения. Ако пък търсите по-логически-ориентирани задачи можете да погледнете страницата с логически задачи.

В различни интервюта биха тествали различни неща, например:
  • Дали можете да пишете код (и дали кодът, който пишете, е хубав);
  • Дали знаете популярни алгоритми и структури данни;
  • Как бихте подходили към непознат проблем;
  • Дали бихте проявили креативност при решаване на нестандартен проблем;
  • Как бихте design-нали не-твърде-сложна но не и тривиална система;
  • Други.

Най-често добрите въпроси са комбинация на две или повече от тези неща.

Тук сме се опитали да разделим задачите в категории, макар че често една задача би могла да попадне и в повече от една от тях.

Списък със задачите

    Алгоритмични задачи

  1. Сливащи се свързани списъци
  2. Нагоре-надолу
  3. Подинтервал с максимална сума
  4. Има ли цикъл?
  5. Тройка с нулева сума
  6. Повтарящ се елемент в масив
  7. Неповтарящ се елемент в масив
  8. Неповтарящ се елемент в масив 2.0
  9. Точно едно повтарящо се число
  10. Точно едно липсващо число
  11. Произволно разбъркване
  12. Игра на 21
  13. Първо липсващо число
  14. Липсващо число в сортиран масив
  15. Премахване на дубликати
  16. Най-големи числа, срещащи се поне два пъти
  17. Структура данни за медиана
  18. Произведения на останалите числа
  19. Ъгъл между стрелки на часовник
  20. Триминота
  21. Разделяне на твърд диск
  22. Засичащи се мероприятия
  23. Стъпала
  24. Текст и стрингове
  25. Двойки числа в масив
  26. Мажорант
  27. Чупливи крушки
  28. Подстринг, съставен от два символа
  29. Винени бутилки
  30. Скачащи пешки
  31. Произволен елемент от генератор
  32. Рандом генератор с монета
  33. Имплементационни задачи

  34. Точна степен на две
  35. Най-нисък бит
  36. Нула или едно
  37. Умножение по седем
  38. Битови под-маски
  39. Всички пермутации
  40. Ще има ли препълване?
  41. Дълбочина на дърво
  42. Масив в спирала
  43. Бързо степенуване
  44. Палиндром 1.0
  45. Палиндром 2.0
  46. Общи елементи на множества
  47. Дигитален корен
  48. Избор на град според населението му
  49. Rock-Paper-Scissors-Lizard-Spock
  50. Езикови познания

  51. Каст
  52. Стейтмънт и Блок
  53. Метод и Функция
  54. Логически и Бинарни Оператори
  55. Препълване
  56. Програмен Стек
  57. Рекурсия
  58. Числа с Плаваща Запетая
  59. Static (C++)
  60. Inline (C++)
  61. Масиви
  62. Върнати Стойности
  63. Баба Цеца
  64. Обратно Повикване
  65. Копиране при Писане
  66. Странен Бъг
  67. Дизайн въпроси

  68. Автоматично Допълване
  69. Организатор на Игри
  70. Торент Клиент
  71. Текстов Редактор
  72. Тестване на Калкулатор
  73. Съкращаване на URL-та
  74. Нестандартни задачи

  75. Задачата с Голф Топките
  76. Задачата с Бензиностанциите
  77. Задачата с Блендера
  78. Задачата с Шахтите
  79. Въпрос за Живота, Вселената и Всичко Останало

Алгоритмични Задачи

При този тип задачи трябва да измислите алгоритъм или структура данни, която да се справя ефективно с даден проблем. Понякога има "врътка", чието откриване води до решение на задачата чрез стандартен алгоритъм. В повечето интервюта след като измислите как да решите задачата, трябва да напишете и имплементация чрез код или псевдокод.

Сливащи се свързани списъци

Дадени са ви указатели към първите елементи на два ациклични едносвързани списъка. Можете ли с константна памет и линейно време да определите дали в някой елемент единият списък не се "слива" във втория (тоест двата да завършват в един и същ елемент)? Ако да, можете ли да намерите кой е първият им общ елемент? Опишете алгоритъма си.

Нагоре-надолу

По случаен начин е избрано цяло число num между 1 и 1000. Имате функция guess(x), която връща 0, ако num == x, -1 ако x < num, и +1 ако x > num. Изградете алгоритъм, който, познава числото num с минимален брой викания на функцията guess(x). Определете броя извиквания при най-лошия избор на num за вашия алгоритъм.

Под-интервал с максимална сума

Даден е масив с N числа. Изградете алгоритъм, който намира негов подинтервал с максимална сума. Под-интервал е поредица от последователни негови елементи.

Има ли цикъл?

Даден е указател към първия елемент на (потенциално много много дълъг) едносвързан списък, чиито брой елементи не знаем. Възможно е той да се зацикля (тоест връзката на някой от елементите му да сочи към предходен такъв). Можете ли да измислите начин за проверка с константна памет и линейно време дали списъкът се зацикля или не? Нямаме право да променяме елементите на списъка по какъвто и да било начин.

Тройка с нулева сума

Даден ви е масив с N цели числа (всяко от тях положително, отрицателно или нула). Изградете алгоритъм, който намира дали съществува тройка негови числа със сума нула. Разгледайте решения със сложности O(N3), O(N2log(N)), O(N2). Можете ли да модифицирате алгоритъма си така, че да брои колко различни такива тройки има?

Повтарящ се елемент в масив

Даден е масив с N цели числа, като всяко от тях е между 1 и N, включително. Измислете алгоритъм, който проверява дали има повтарящо се число. Имате право да променяте елементите на масива. Каква най-добра сложност по време и по памет можете да направите?

Неповтарящ се елемент в масив

Даден е масив с N (нечетен брой) цели числа. Всяко число се среща по два пъти с изключение на едно, което е уникално. Намерете това число.

Неповтарящ се елемент в масив 2.0

Даден е масив с N (четен брой) цели числа. Всяко число се среща по два пъти с изключение на две, които са уникални и различни помежду си. Намерете тези числа.

Точно едно повтарящо се число

Дадени са ви N числа между 1 и N-1, включително. Всички числа са различни, с изключение на едно, което се повтаря. Намерете кое е то.

Точно едно липсващо число

Дадени са ви N числа между 1 и N+1, включително. Всички числа са различни, като едно липсва. Намерете кое е то.

Произволно разбъркване

Напишете алгоритъм, който разбърква по произволен начин елементите на дадено множество с N елемента. Покажете, че всяко разбъркване е възможно да се случи и докажете защо всеки от възможните изходи е с равен шанс (ако допуснете, че функцията rand() връща произволна стойност). Нямате право да ползвате вградената функция random_shuffle().

Игра на 21

Играта 21 е известна игра, която се играе от двама души. В началото пред тях има купчинка с 21 монети. Играчите се редуват, започвайки от единия. Играчът, който е на ход, има право да махне 1, 2 или 3 монети от купчината, стига да има толкова останали в нея. Играчът, който не може да направи ход (тоест не са останали монети) губи. Има ли стратегия, при която първият може да спечели, независимо от ходовете на втория? Опишете я.

Първо липсващо число

Даден ви е масив с N естествени числа, които потенциално могат да бъдат много големи. Пита се кое е първото естествено число, което не фигурира в масива. За тази задача приемете, че естествените числа са целите, положителни числа.

Липсващо число в сортиран масив

Даден ви е сортиран масив с N числа между 0 и N, включително, без повтарящи се числа, сортирани в нарастващ ред. Как бихте намерили липсващото число?

Премахване на дубликати

Дадено ви е мултимножество от числа. Върнете множеството от същите числа, но без повторения. Разгледайте случая, в който началното множество е сортирано.

Най-големи числа, срещащи се поне два пъти

Дадена ви е редица от числа. Намерете двете най-големи от тях, които се срещат поне 2 пъти.

Структура данни за медиана

Опишете структура данни, която поддържа бързо добавяне на число и бързо питане за медианата на досега добавените.

Произведения на останалите числа

Имате масив с N числа и искате да върнете нов масив, в който на i-та позиция е записано произведението на всички числа от входния масив, с изключение на i-тото. Как бихте решили задачата, ако нямахте деление (примерно трябва да върнете числата по някакъв модул)?

Ъгъл между стрелки на часовник

По даден час и минути определете какъв е (по-малкият) ъгъл между стрелките на аналогов часовник.

Триминота

Даден е квадрат със страна 2N, разделен на малки квадратчета със страна 1. Едно от тях е оцветено в черно, всички останали в бяло. На всеки ход можем да поставим trimino, успоредно на страните на квадрата, стига то да попадне само върху бели плочки. Trimino е плочка от три квадратчета под формата на Г (тоест квадрат 2 на 2, на който липсва една от плочките). След поставянето му, трите бели плочки, върху които го слагаме, стават черни. Възможно ли е да се оцвети целият квадрат в черно с поставяне на trimino-та? Как?

Разделяне на твърд диск

Купили сте си нов твърд диск с размер 1 ≤ N ≤ 4,000 гигабайта. Сега искате да го разделите на различни партишъни (C:, D:, ...), като имате изискването всеки от тях да е поне M гигабайта. По колко различни начина може да стане това?

Считаме, че N и M са цели положителни числа. Също така считаме, че редът на размерите има значение - например разделянията (3, 4) и (4, 3) са различни, тъй като в единия случай C:\ би бил 3 гигабайта, а в другия - 4.

Засичащи се мероприятия

Зададено е множество от събития, зададени чрез тяхното начално време и крайно време. Изберете максимално (по брой) тяхно подмножество, така че никои две събития да не се застъпват (но може да се "докосват", тоест едното да почва точно когато свършва предходното).

Стъпала

Човек изкачва стълбище с N стъпала. На всяка стъпка той или се качва на следващото стъпало, или изкачва две наведнъж (прескача едно). По колко различни начина може да изкачи стълбището? А ако броят на стъпалата е много голям (1,000,000,000)?

Текст и стрингове

Имате (потенциално много дълъг) текст и три стринга S1, S2, и S3. Намерете най-късия откъс от текста, съдържащ и трите стринга. Редът на стринговете няма значение.

Двойки числа в масив

Даден ви е масив A[] с N елемента и число T. Намерете колко на брой различни индекса (i, j) съществуват, така че Ai+Aj ≤ T. Можете ли да се справите по-добре, ако ви питаха колко такива двойки индекси има, за които Ai+Aj == T? За простота можете да считате, че (i, j) е насочена двойка, тоест ако (2, 4) е отговор, то трябва да преброите и (4, 2).

Мажорант

Даден ви е масив с числа. Едно от тях се среща над половината пъти (тоест > 50%). Напишете програма, която намира това число.

Чупливи Крушки

Имате 20 електрически крушки, които се чупят ако паднат от над определена височина. Също така имате 100 етажна сграда. Как ще намерите от кой етаж се чупят крушките с минимален брой опити?

Подстринг, съставен от два символа

Даден ви е стринг с дължина N. Намерете най-дългия негов подстринг, съдържащ най-много два различни символа.

Например в стринга "aababbaacacaacacccaabad", един възможен подстринг, съдържащ най-много два различни символа е "aababbaa", започващ от началото на входния стринг. Най-дългият такъв подстринг, обаче, е "aacacaacacccaa", започващ от позиция 6 (индексирано от 0).

Винени бутилки

Ели е наследила от баба си (Нора) винарска изба. В нея има N бутилки вино, наредени в редица. За простота ще ги номерираме с числата от 0 до N-1, включително. Техните начални цени са неотрицателни цели числа, които са ни дадени в масива P[]. Цената на i-тата бутилка е дадена в Pi. Колкото повече отлежават бутилките, толкова по-скъпи стават те. Ако бутилка k е отлежала Х години, нейната цена ще бъде X*Pk.

В завещанието си бабата на Ели е поискала всяка година внучка ѝ да продава по една от тях, като избира или най-лявата или най-дясната останала. Каква е максималната сума пари, която Ели може да спечели, ако продава бутилките в най-добрия за нея ред? Считаме, че бутилките са отлежавали 1 година, когато бива продадена първата от тях.

Например ако имаме 4 бутилки с цени {P0 = 1, P1 = 4, P2 = 2, P3 = 3}, оптималното решение би било да продаде бутилките в реда {0, 3, 2, 1} за печалба 1*1 + 2*3 + 3*2 + 4*4 = 29.

Скачащи пешки

В някои от клетките на правоъгълна дъска с N реда и M колони са разположени пешки. Във всяка клетка има най-много по една пешка. Пешките могат да бъдат движени по следните правила:
  1. С една клетка надолу или една клетка надясно. Този ход е възможен, ако:
    • така пешката не излиза от дъската;
    • клетката, където отива, е празна.
  2. "Прескачайки" две пешки надолу или две пешки надясно. Този ход е възможен, ако:
    • така пешката не излиза от дъската;
    • клетката, където отива, е празна;
    • биват прескочени точно две клетки;
    • и двете прескочени клетки съдържат пешки.
В момента, в който пешка попадне в долния десен ъгъл (клетката на последния ред и последна колона), тя изчезва. Гарантирано е, че в началото там няма пешка.

Ели и Крис се редуват да правят ходове с пешките, докато все още има пешки на дъската. Момичето, което не може да направи ход, губи. По зададена текуща позиция на дъската, можете ли да напишете програма, която определя кой ще победи ако момичетата играят оптимално?

Произволен Елемент от Генератор

Даден ви е безкраен генератор на числа. При всяко негово викане той връща произволно число в интервала [-263, 263 - 1]. Казано ви е, че известно време ще бъдат теглени числа от генератора, а по някое време ще спре генерирането и вие трябва да върнете случаен елемент от вече изтеглените. Иска се изтегленият елемент да е перфектно случаен, тоест ако са изтеглени N елемента и елемент със стойност X се е паднал K пъти, той да бъде върнат с шанс точно X/N. Можете ли да измислите как да направите това, ползвайки само константна допълнителна памет?

Можете да си представите генератора като списък с неизвестен брой елементи, които не можете да индексирате. Когато генерирането на елементи (слагането им в списъка) спре, трябва да върнете стойността на равно-вероятно избран елемент от списъка.

Нека разгледаме следния пример: "3, 1, 5, 1, 5, 2, 7, 5, стоп". Трябва да върнем произволен елемент измежду {3, 1, 5, 1, 5, 2, 7, 5}. Трябва да изберем 2, 3 и 7 с шанс 1/8 (тъй като се срещат по веднъж), 1 - с шанс 1/4 (тъй като се среща два пъти), и 5 - с шанс 3/8 (тъй като се среща три пъти).

Рандом Генератор чрез Монета

Имате монета. Как бихте могли да генерирате случайни числа в интервала [0, 1] с нея? Докажете, че генерираните числа са равномерно-разпределени.

Имплементационни Задачи

Тези задачи обикновено имат минимално мислене и по-скоро се изисква добро познание от програмните езици и писането на код като цяло. Изисква се писане на код, като почти цялата оценка за задачата зависи от него.

Точна степен на две

Дадено ви е естествено число X. От вас се иска да напишете възможно най-прост if() (с възможно най-малко операции в него), с който да проверите дали числото е точна степен на 2 или не. Не са разрешени цикли или по-сложни конструкции.
Примерна реализация би била if (!(X ^ 1) || !(X ^ 2) || !(X ^ 4) || !(X ^ 8) || ...), но тя е много по-дълга от оптималната, а също така зависи колко битов е типа на X.

Най-нисък бит

Дадено ви е положително цяло число X. Намерете неговия най-нисък ненулев бит (lowest bit) или по-точно числото, което представя той (ако индексът е 3, то върнете 23 = 8).
Примери: за числото 42 (101010) трябва да върнете 2, докато за 88 (1011000) трябва да върнете 8. Най-ниските битове са най-надясно в двоичния запис на числото.

Нула или едно

?Побитови оператори са {~, |, &, ^, !, <<, >>}.
Дадено ви е цяло число X. Съставете израз, съдържащ само X, побитови оператори, и скоби, който се евалюира до true, ако X е нула или едно, и до false в противен случай.

Умножение по седем

Покажете начин за целочислено умножение по 7 използвайки само операторите {+, -, ~, |, &, ^, !, <<, >>}.

Битови под-маски

?За да записваме подмножества на някакво множество със сравнително малък брой елементи (до 32 или до 64) понякога е по-удобно (по-бързо и по-икономично откъм памет) вместо да записваме елементите в масив, да ги запазваме в едно единствено 32 (или 64) битово число. Ако i-тият елемент присъства в подмножеството, то числото ще има 1-ца на i-та позиция в двоичния си запис и обратно - ако не присъства ще има 0 на съответната позиция. Този метод се нарича ползване на битова маска (тъй като маската от битовете на числото определя кои елементи присъстват и кои - не).
Ето и пример за това. Да кажем в един учебен клас има 25 ученика. Учителят може да записва отсъстващите ученици в даден ден в един единствен int. Например 1050784, чието двоично записване е 100000000100010100000, би означавало, че 6-ти, 8-ми, 12-ти и 21-ви номер са отсъствали в дадения ден.
Понякога се налага да изброим (итерираме) всички подмножества на дадено множество. Подмножество на дадено множество е множеството от някои (потенциално всички или нито един) от елементите на първоначалното множеството. Напишете функция, която генерира всички подмножества на дадено множество, зададено чрез битова маска.

Всички пермутации

Напишете функция, която печата всички пермутации на зададен string.

Ще има ли препълване?

Имате две unsigned числа A и B. Как бихте проверили дали ще се получи ли препълване (overflow) ако ги съберем?

Дълбочина на дърво

Напишете функция, която намира дълбочината на дърво.

Масив в спирала

Напишете функция, която отпечатва елементите на двумерен масив в спираловиден ред.

Бързо степенуване

Напишете функция, която вдига число A на степен P. Има ли по-бързо от линейно решение?

Палиндром 1.0

Напишете функция, която проверява дали стринг е палиндром.

Палиндром 2.0

Напишете функция, която превръща стринг в палиндром с минимален брой променени символи. От всички възможности, изберете лексикографски най-малката.

Общи елементи на множества

Дадени са ви два сортирани масива. Напишете функция, която отпечатва по веднъж всички елементи, които се срещат и в двата масива. Как бихте решили задачата, ако масивите не бяха сортирани?

Дигитален корен

Имате число X0. Ако числото е по-голямо или равно на 10, съберете цифрите му да получите ново число X1. Ако X1 е по-голямо или равно на 10 съберете цифрите му получавайки ново число X2. Продължете тази процедура докато получите едноцифрено число. Това число се нарича "дигитален корен" (digital root) на X0. Напишете функция int digitalRoot(int X), която намира дигиталния корен на дадено число X.
Бонус: Можете ли да намерите по-бърз начин, по който да го изчислявате?

Избор на град според населението му

Напишете функция, която по дадено множество от градове и тяхната популация, избира някой от тях, като шансът даден град да бъде избран е пропорционален на броя жители в него. Например ако градовете са София (1,263,328 жители), Стара Загора (150,081 жители), Варна (350,064 жители) би избрала София с шанс 71.638%, Стара Загора с шанс 8.511% и Варна с шанс 19.851%.

Rock-Paper-Scissors-Lizard-Spock

Rock-Paper-Scissors-Lizard-Spock е интересна модификация на играта "Камък-Ножица-Хартия", в която са добавени гущер и Спок.

Гущерът отравя Спок и изяжда хартията, но бива смачкан от камъка и обезглавен от ножицата. Спок счупва ножицата и прави на пара камъка с бластера си, но бива отровен от гущера и опроверган от хартията.

Представете си, че имплементирате програма, която симулира горната игра. Как бихте направили проверката кой побеждава в дадена битка с най-малко код?

Езикови познания

Това са по-скоро въпроси, които могат да ви зададат по време на интервю. В тях рядко се изисква писане, но трябва добре да познавате езика за програмиране и като цяло различни програмни термини и идиоми.

Каст

За какво се ползва термина "cast"? Защо бихме ползвали cast?

Стейтмънт и Блок

Каква е разликата между "statement" и "block"?

Метод и Функция

Каква е разликата между "method" и "function"?

Логически и Бинарни Оператори

Каква е разликата между & и &&, както и между | и ||? Дайте пример, в който те не са взаимно-заменяеми.

Препълване

Какво e "overflow"? Дайте пример. Как можем да го избегнем? Как да проверим дали ще се получи препълване при събиране? А при умножение?

Програмен Стек

Какво е "program stack"? Кои данни попадат там? Дайте пример за проблем, свързан с програмния стек, който често възниква в практиката.

Рекурсия

Какво е "recursion"? Дайте пример. За какво се ползва? Какъв проблем се среща при рекурсия с много нива? Можете ли да обясните и дадете пример какво е "опашкова рекурсия" (tail call optimization)?

Числа с Плаваща Запетая

Какво са "floats" или "floating point numbers" (числа с плаваща запетая)? Колко големи числа могат да съхраняват те? Какви чести проблеми възникват при тях и защо?

Бонус точки: как се представят вътрешно и как точно работят те?

Static (C++)

За какво служи запазената дума "static" в езика C++? Дайте пример за какво бихте я ползвали.

Inline (C++)

За какво служи запазената дума "inline" в езика C++? Дайте пример за какво бихте я ползвали.

Масиви

Какво е "array" (масив)? Как е реализиран той в езика, който ползвате? Как работи индексацията на определена клетка от масив? А от многомерен масив?

Върнати Стойности

Посочете различни начини, по които бихте могли да върнете две или повече променливи от функция/метод.

Баба Цеца

Обяснете ползите от BABA CECA (или в английския вариант - DEAD BEEF (мъртво говеждо)) в програмирането.

Обратно Повикване

Какво е "callback" (обратно повикване)? За какво се ползва?

Копиране при Писане

Какво е "copy on write" (копиране при писане)? За какво помага то? Как бихте го имплементирали?

Странен бъг

?Ако този код случайно не крашва при вас, увеличете броя генерирани числа в началото на main() функцията.
Следният относително простичък код имплементира строене на двоично дърво за търсене (и печатането му в ред ляво-корен-дясно).
Имплементацията е вярна... ако изключим това, че crash-ва. Още по-фрапантното е, че ако разкоментираме tree.reserve(values.size()); кодът магически спира да има проблем. Можете ли да откриете какъв е проблемът?


Дизайн Въпроси

Този тип задачи тества колко добър дизайн бихте предложили в разработката на средно-голям проект. Допълнително, интервюиращите виждат дали сте били достатъчно любопитни да се запитате как работят някои от нещата, които ползвате всеки ден. Не се изисква писането на код, но може да се рисува/чертае модел на интеракция между различни части от проекта. Няма да даваме примерни решения, тъй като тук има много поле за изява (а и самите решения се очаква да са в рамките на 30-40 минутна дискусия с интервюиращия), но все пак ето няколко примерни въпроса.

Автоматично Допълване

Как бихте направили система, която предлага автоматично допълване на това, което потребителят въвежда?

Организатор на Игри

Как бихте направили система, която приема заявки за игра на тенис на маса от работници в голяма фирма и сформира четворки за игра? Хората могат да се записват и отказват по всяко време през работния ден. Какви потенциални проблеми могат да възникнат?

Торент Клиент

Как бихте направили Торент Клиент?

Текстов Редактор

Как бихте направили текстов редактор? Какви неща биха били полезни в него? Какви проблеми може да има?

Тестване на Калкулатор

Как бихте тествали калкулатор?

Съкращаване на URL-та

Как бихте направили сайт за съкращаване на URL-та (URL-shortener)? Пример за такъв туул е goo.gl.

Нестандартни задачи

Това са малко по-различни логически задачи, които тестват как разсъждавате и колко добре бихте апроксимирали нещо, за което нямате много информация, само изхождайки от логика и частични факти. От няколко години вече не се задават по повечето интервюта, тъй като са твърде нестандартни и често пропускат добри кандидати.

Задачата с Голф Топките

Колко топки за голф могат да се съберат в автобус?

Задачата с Бензиностанциите

Колко бензиностанции има в България?

Задачата с Блендера

Смалени сте до размерите на монета от 20 стотинки. Попаднали сте в блендер, който след 60 секунди ще започне да се върти. Как ще се спасите?

Задачата с Шахтите

Защо капаците на уличните шахти са кръгли?

Въпрос за Живота, Вселената и Всичко Останало

Какъв е отговорът на въпроса за живота, вселената и всичко останало?

Референции

  1. Careercup - сайт за подготовка за интервюта
  2. InterviewStreet - сайт за подготовка за интервюта
  3. Glassdoor - сайт за подготовка за интервюта
  4. How We Hire (Google) - насоки
  5. Get that job at Google - още насоки

Страницата е посетена 44100 пъти.

Предложете корекция

Selected text (if you see this, there is something wrong)

(Незадължително) E-mail за обратна връзка: