Re[4]: Зачем просят перевернуть строку на интервью?
От: 0xCAFEDEAD  
Дата: 11.10.18 07:39
Оценка:
Здравствуйте, Vlad_SP, Вы писали:

V_S>Здравствуйте, AleksandrN,


AN>>Это типичные задачи для студентов 1-го курса.


V_S>Ты не поверишь! Даже с такими простыми задачами справляются не только лишь все. Даже с заявленным в резюме "опытом работы".


А ты вообще тред читал ?
Re[13]: Зачем просят перевернуть строку на интервью?
От: CreatorCray  
Дата: 11.10.18 08:18
Оценка:
Здравствуйте, 0xCAFEDEAD, Вы писали:

CAF>А какое решение быстрее (я слабо знаком с оптимизациями компиляторов, поэтому любые комменты от опытных тов приветствуются)

Как правило компилятор всё равно преобразует кашу с индексами в адресную арифметику.

Ради интереса скормил код онлайн компилеру https://godbolt.org/ x86-64 gcc (trunk) -O3
1.Nuzhny
Автор: Nuzhny
Дата: 10.10.18
, малость адаптирован чтоб таки скомпилить

#include <algorithm>

void revert(char* first, char* last)
{
    while ((first != last) && (first != --last)) {
        std::iter_swap (first++, last);
    }
}


2.RussianFellow
Автор: RussianFellow
Дата: 10.10.18
, для честности вынес strlen наружу как параметр

#include <stddef.h>

void revert(char* s, size_t n)
{
    for (auto i=0; i<n/2; i++)
    {
        auto c = s[i];
        s[i] = s[n-1-i];
        s[n-1-i] = c;
    }
}


Итого:

1.
revert(char*, char*):
        cmp     rdi, rsi
        jne     .L3
        jmp     .L1
.L6:
        add     rdi, 1
        movzx   edx, BYTE PTR [rsi]
        movzx   eax, BYTE PTR [rdi-1]
        mov     BYTE PTR [rdi-1], dl
        mov     BYTE PTR [rsi], al
        cmp     rsi, rdi
        je      .L1
.L3:
        sub     rsi, 1
        cmp     rsi, rdi
        jne     .L6
.L1:
        ret


2.
revert(char*, unsigned long):
        mov     rdx, rsi
        shr     rdx
        je      .L1
        lea     rax, [rdi-1+rsi]
        lea     rsi, [rdi+rdx]
.L4:
        movzx   ecx, BYTE PTR [rax]
        movzx   edx, BYTE PTR [rdi]
        add     rdi, 1
        sub     rax, 1
        mov     BYTE PTR [rdi-1], cl
        mov     BYTE PTR [rax+1], dl
        cmp     rdi, rsi
        jne     .L4
.L1:
        ret


Забавно что если взять другие компиляторы то 1й вариант меняется незначительно, а вот второй генерит вот такой вот пц:

Clang (trunk) -O3
revert(char*, unsigned long):                           # @revert(char*, unsigned long)
        mov     rcx, rsi
        shr     rcx
        je      .LBB0_6
        mov     r8d, ecx
        and     r8d, 1
        cmp     rcx, 1
        jne     .LBB0_7
        xor     ecx, ecx
        test    r8, r8
        jne     .LBB0_5
        jmp     .LBB0_6
.LBB0_7:
        lea     rdx, [rdi + 1]
        lea     r11, [rdi + rsi]
        add     r11, -1
        mov     r9, r8
        sub     r9, rcx
        xor     ecx, ecx
.LBB0_8:                                # =>This Inner Loop Header: Depth=1
        movzx   r10d, byte ptr [rdx - 1]
        movzx   eax, byte ptr [r11 + rcx]
        mov     byte ptr [rdx - 1], al
        mov     byte ptr [r11 + rcx], r10b
        movzx   r10d, byte ptr [rdx]
        movzx   eax, byte ptr [r11 + rcx - 1]
        mov     byte ptr [rdx], al
        mov     byte ptr [r11 + rcx - 1], r10b
        add     rdx, 2
        add     rcx, -2
        cmp     r9, rcx
        jne     .LBB0_8
        neg     rcx
        test    r8, r8
        je      .LBB0_6
.LBB0_5:
        mov     r8b, byte ptr [rdi + rcx]
        mov     rdx, rcx
        not     rdx
        add     rdx, rsi
        mov     al, byte ptr [rdi + rdx]
        mov     byte ptr [rdi + rcx], al
        mov     byte ptr [rdi + rdx], r8b
.LBB0_6:
        ret


CAF>Ну и конечно на десерт, можно ли еще быстрее?

Тут скорее не про быстрее стоит вести речь а про вменяемее.

CC>>Из моего опыта — любители индексов в массе пишут спагетти код.

CAF>Это мнение субъективное Спорить с таким утверждением бессмысленно.
Ну так там так и написано "Лично я увидев в этой задаче индексы..."
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[4]: Зачем просят перевернуть строку на интервью?
От: CreatorCray  
Дата: 11.10.18 08:31
Оценка: +2 :)))
Здравствуйте, AlexGin, Вы писали:

AG>Считать данные из строки через reverse_iterator

AG>сохранить в новой (временной) строке,
AG>затем заменить имеющуюся на новую.

AG>Что НЕ так ?

Да в общем то всё

"А XML будем парсить regexp-ами" (С)
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[9]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 09:00
Оценка:
Здравствуйте, Тёмчик, Вы писали:

Тё>Там не нужен итератор, это твоя профессиональная деформация от C++ сказывается. Целочисленного индекса по массиву более, чем достаточно.


А если строка в utf8?
Re[2]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 09:06
Оценка: -1
Здравствуйте, RussianFellow, Вы писали:

RF>Так, что ли?


Все бы ничего, но на utf-8 и даже на utf-16 в общем случае этот алгоритм сработает неправильно из-за переменной длины символов.
Re[3]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 09:08
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Любопытным отвечают что по условиям задачи строка ASCII. Задача не про это.


Тогда задача тривиальная и действительно на идиотен-тест похожа.
Re[4]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 09:10
Оценка: +1
Здравствуйте, vsb, Вы писали:

vsb>Кстати интересно перевернуть UTF-8 строку. В принципе решается аналогично словам, но всё же. Заодно и кругозор можно проверить (знает ли человек, как кодируется UTF-8).


Вот попалось бы такое на интервью сказал бы, что примерно знаю как utf-8 кодируется, но без подглядывания в справочник по нему точно не вспомню на ходу, просто не нужно это было обычно.
Re[2]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 09:14
Оценка: +1
Здравствуйте, zverjuga, Вы писали:

Z>и вот зачем это? сразу отметается возможность использования уже готовых решений, встроенных во фрэймворк. к реальной жизни и работе этот тест не имеет никакого отношения, так как никто не будет париться чтобы писать самодельную переворачивалку.


Проверка наличия способности программировать вообще. Именно программировать, а не лепить google-driven код. Тест практически тривиальный, если для ascii только.
Re[5]: Зачем просят перевернуть строку на интервью?
От: vsb Казахстан  
Дата: 11.10.18 09:44
Оценка:
Здравствуйте, Michael7, Вы писали:

vsb>>Кстати интересно перевернуть UTF-8 строку. В принципе решается аналогично словам, но всё же. Заодно и кругозор можно проверить (знает ли человек, как кодируется UTF-8).


M>Вот попалось бы такое на интервью сказал бы, что примерно знаю как utf-8 кодируется, но без подглядывания в справочник по нему точно не вспомню на ходу, просто не нужно это было обычно.


Ну там же простая логичная схема Если в байте старший бит 1, смотрим на второй бит. Если он 1, это начало нового символа, если он 0, значит это продолжение предыдущего символа (если старший бит 0, значит это символ из одного байта). Может это только я всякую ненужную фигню зачем-то запоминаю.
Отредактировано 11.10.2018 9:45 vsb . Предыдущая версия .
Re[3]: Зачем просят перевернуть строку на интервью?
От: Тёмчик Австралия жж
Дата: 11.10.18 09:48
Оценка:
Здравствуйте, Michael7, Вы писали:

RF>>Так, что ли?


M>Все бы ничего, но на utf-8 и даже на utf-16 в общем случае этот алгоритм сработает неправильно из-за переменной длины символов


1) wchar спасёт отца русской демократии. В жаве, кстати, char уже широкий.

2) в случае с переменной длиной, итератор не поможет. Там нужно «менять порядок слов».
Re[6]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 09:55
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Ну там же простая логичная схема Если в байте старший бит 1, смотрим на второй бит. Если он 1, это начало нового символа, если он 0, значит это продолжение предыдущего символа (если старший бит 0, значит это символ из одного байта). Может это только я всякую ненужную фигню зачем-то запоминаю.


Память штука такая. Вот ты сказал, я запомнил. Но могу и забыть точно через какое-то время, какие биты что означают, а вот сам принцип кодирования остается.
Re[4]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 10:00
Оценка:
Здравствуйте, Тёмчик, Вы писали:

M>>Все бы ничего, но на utf-8 и даже на utf-16 в общем случае этот алгоритм сработает неправильно из-за переменной длины символов


Тё>1) wchar спасёт отца русской демократии. В жаве, кстати, char уже широкий.


Не спасет wchar, потому что в юникод есть символы переменной длины, всякие там умляуты, знаки ударения над символами могут формироваться изх двух символов.

Тё>2) в случае с переменной длиной, итератор не поможет. Там нужно «менять порядок слов».


Или использовать высокоуровневые функции, явно выделяющие подстроки, в данном случае из одного символа. В C# Substring, Insert, Remove
Re[5]: Зачем просят перевернуть строку на интервью?
От: Тёмчик Австралия жж
Дата: 11.10.18 10:08
Оценка:
Здравствуйте, Michael7, Вы писали

M>>>Все бы ничего, но на utf-8 и даже на utf-16 в общем случае этот алгоритм сработает неправильно из-за переменной длины символов


Тё>>1) wchar спасёт отца русской демократии. В жаве, кстати, char уже широкий.


M>Не спасет wchar, потому что в юникод есть символы переменной длины, всякие там умляуты, знаки ударения над символами могут формироваться изх двух символов.


Ок не спасёт, так не спасёт. Я был был бы удовлетворён вариантом рашнфелоу на 100%. И задал бы следующий вопрос

Тё>>2) в случае с переменной длиной, итератор не поможет. Там нужно «менять порядок слов».


M>Или использовать высокоуровневые функции, явно выделяющие подстроки, в данном случае из одного символа. В C# Substring, Insert, Remove


Нельзя.
Re[6]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 10:15
Оценка:
Здравствуйте, Тёмчик, Вы писали:

Тё>Ок не спасёт, так не спасёт. Я был был бы удовлетворён вариантом рашнфелоу на 100%. И задал бы следующий вопрос


Для целей проверки кандидата, наверное и в самом деле достаточно.
Кстати, чем действительно еще хорош тест, что такое переворачивание в реальной работе редко встречается (я даже и не помню), так что использовать память не получится, надо немного подумать.
Re[6]: Зачем просят перевернуть строку на интервью?
От: AleksandrN Россия  
Дата: 11.10.18 10:48
Оценка:
Здравствуйте, Тёмчик, Вы писали:

Тё>Ок не спасёт, так не спасёт. Я был был бы удовлетворён вариантом рашнфелоу на 100%. И задал бы следующий вопрос


Какой? Оптимизировать, сделать не указателях, без использования индекса массива или про UTF-8?
Re[7]: Зачем просят перевернуть строку на интервью?
От: Тёмчик Австралия жж
Дата: 11.10.18 10:52
Оценка:
Здравствуйте, AleksandrN, Вы писали:

Тё>>Ок не спасёт, так не спасёт. Я был был бы удовлетворён вариантом рашнфелоу на 100%. И задал бы следующий вопрос


AN>Какой? Оптимизировать, сделать не указателях, без использования индекса массива или про UTF-8?


Там нечего оптимизировать- всё правильно сделано. Ну разве про swap без временной переменной и вообще без индексов.

Что-нибудь про radix sort или развернуть односвязный список.
Re[7]: Зачем просят перевернуть строку на интервью?
От: Тёмчик Австралия жж
Дата: 11.10.18 10:55
Оценка:
Здравствуйте, Michael7, Вы писали:

M>Для целей проверки кандидата, наверное и в самом деле достаточно.

M>Кстати, чем действительно еще хорош тест, что такое переворачивание в реальной работе редко встречается (я даже и не помню), так что использовать память не получится, надо немного подумать.
Встречается. Только не просто переворачивание, а например сдвиг. Кстати сдвиг возможен и за 1(N)- но он более муторный.
Re[5]: Зачем просят перевернуть строку на интервью?
От: Michael7 Россия  
Дата: 11.10.18 11:02
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>"А XML будем парсить regexp-ами" (С)


Я однажды так делал И даже не регэкспами, а просто построчно с поиском подстроки.
Жуткий говнокод, конечно, но требовали так срочно, что "еще вчера" и нужно было просто достать пару значений, а сам xml-файл генерировался тоже чем-то говнокодистым и был не то, что не валиден по схеме или dtd, а даже не well-formed. Ничего, насколько я знаю, уже больше 10 лет ЭТО работает.
Re[5]: Зачем просят перевернуть строку на интервью?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.10.18 11:10
Оценка:
Здравствуйте, Тёмчик, Вы писали:

I>>Забыл, как думать?


Тё>Утверждал в резюме, что знает tensorflow. Надо было по data mining поспрашивать, но я испугался проявить невежество в том вопросе.


Непонятно. Знает tensorflow это как понять ? Это machine learning как основной скилл или второстепенный?
Вообще имеет смысл готовиться к каждому интервью. Если у человека основной профиль такой, то нужен специалист интервьюер. Если второстепенный, то хватит и заранее заготовленых вопросов.
Re: Зачем просят перевернуть строку на интервью?
От: a_g_99 США http://www.hooli.xyz/
Дата: 11.10.18 14:36
Оценка: :)
Здравствуйте, Тёмчик, Вы писали:

Тё>Условие было такое: строка «один два три». Написать функцию на доске, чтобы поменять порядок символов внутри этой строки, не выделяя новой памяти (кроме временных переменных). Принимается ли решение через 15 минут?


Я приму такое решение через 15 мин без всяких проблем. Вообще время это что то малокритичное на собеседовании в пределах получаса.
Те если бы я интервьюировал я бы сделал так —
— для начала обьясните решение на словах. как вы это видите, какая сложность и какие структуры данных вы используете
— давайте напишем псевдокод на доске. забудьте про контроль памяти, лямбды и сборку мусора. покажите мне вашу идею в коде
— давайте сделаем реализацию вашего алгоритма, берите ваш лаптоп, пишите. гуглите если надо. покажите мне рабочую реализацию. если надо давайте подумаем про тесты, подумаем про то как подать строку на вход и вывести результат.

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