- 1
- 2
- 3
Дана строка. Разрежьте ее на две равные части (если длина строки — четная, а если длина строки нечетная, то длина первой части должна быть на один символ больше). Переставьте эти две части местами, результат запишите в новую строку и выведите на экран.
При решении этой задачи не стоит пользоваться инструкцией if.
Эххх. Без LINQ это будет трудно.
"не стоит пользоваться инструкцией if" сразу не заметил, потому звучит не так саркастично как хотелось бы
Ну оно же совсем не оптимально и вообще говно...
Ок, чтобы загладить свою вину добавлю плюсцов: https://ideone.com/rMmRTo
То понятно:)
Но язык для демонстрации алгоритма выбран был неправильно.
> и вообще говно
В лабах, будь там хоть там O(n³) всем глубоко похер.
Вину полностью признаю.
Глядишь, скоро и с младшей школы будут сюда ходить.
http://cdsmith.wordpress.com/2011/08/16/haskell-for-kids-week-1/
Правда нужен instance из Control.Applicative, вместо rotate по вкусу ваш: (uncurry . flip) (++) . splitAt
зы. let вкупе с main немного сбивает)
Есть такое. Одну строку из терминала скопипастил, вторую так дописал.
Только чётные, от кратности 8 не уйдешь.
А так да, на компьютере с 5-тритным чаром не будет работать.
Разбиваем на половинки вдоль так чтобы первая строка получилась на 1 символ (8 бит) длиннее:
abcd ghij mnop stuv
ef kl qr wx
Склеиваем вдоль: efabcdklghijqrmnopwxstuv
но вообще очень остроумный говноспособ .
1) 8+0
3) 5+3, 6+2, 5+3
А для больших чисел подойдет аналог алгоритма Брезенхейма: В результате получаем аккуратный разрез вдоль, причем такой, что первая половина на 1 символ (8 бит) больше второй.
Или это был тест на выпендрёжность решения? Тогда да, сливаюсь.
Вот за это и в бан. Дабы не поважать студентов и учеников.
http://whathaveyoutried.com/
Не считается плохим делом. Однако, автор даже не пытался что-то сделать ("Вообще не разбираюсь в строках"). Блять, ты манул по питону пытался искать? Благодаря всяким интернетам и гуглам у нас есть возможность найти любую информацию за считанные секунды. Леонадро да Винчи, попади он в наше время, охуел бы от количества информации и зачитывался, забыв про еду.
Дай человеку одну рыбу - накормишт его на день, научи человека ловить рыбу - наромишь его на всю жизнь. Но многие идут по пути наменьшего сопротивления и привыкают, что за них все делают(сначала тупые пользователи просят одмина изменить шрифт в ворде, потом считают, что это его обязанность). И фейл тут не только для одмина, которого заебал тупые юзвери, но и для самого юзверя, так он в профессиональном плане нихуя не растет, а требуют, просит, жалуется и нихуя не пытается ловить рыбу.
а зачем в решении этой задачи вообще может быть нужен if?
python:
s = "1234567"
s[int( len(s)/2 )+len(s)%2 :] + s[ :int( len(s)/2 )+len(s)%2 ]
haskell:
let a = "1234567"
let b = ys++xs where (xs,ys) = splitAt ((length a `div` 2) + (length a `mod` 2)) a
int(len(s) / 2 + 0.5) или (len(s)+1) // 2 же
s[len(s)//-2*-1:] + s[:len(s)//-2*-1]
Просто перебор вариантов пойдет дальше, пока они все не закончатся. А откат через "!" сразу же заканчивается фейлом.
Но в данном случае, имхо, решение будет единственным, т.к. тут все 3 варианта взаимоисключающие из-за [_,_|Y], [_] и [].
Но в случае списка из одного элемента выведет его же согласно второму предикату split,
но предложит продолжить поиск (по-крайней мере gprolog): ведь заранее интерпретатор не обязан знать, что 3-ий не подойдет.
P.S. Ну хотя если это кооперативная многозадачность - то придется периодически втыкать в эти вычислительные рутины какой-нибудь yield, чтобы дать другим поработать.
Так это же детали реализации.
А с точки зрения программиста там самая настоящая вытесняющая многозадачность.
Кооперативная многозадачность это нода жс, питонский твистед и прочая асинхронщина встающая колом от любого мало-мальского расчета.
> А с точки зрения программиста там самая настоящая вытесняющая многозадачность.
Нет, это влияет на написание кода программистом. Вот представь себе:
И все. Вся программа висит
Если я это сделаю на ноде жс или твистеде - да, так и будет, потому что там кооперативная многозадачность.
Если же я сделаю это на эрланге: и запущу test:start() десяток раз, то увижу что мой проц загружен на 200% (линух так показывает когда загружены оба ядра) этими вечными циклами, но система остается очень отзывчивой и ничего не висит.
Так какая все-таки многозадачность в эрланге с точки зрения программиста? ;)
P.P.S. А поскольку такой код написать ты не сможешь, многозадачность с точки зрения программиста там все-таки вытесняющая, и абсолютно неважно что там под капотом.
Если заряженное ружьё висит на стене, то оно переодически стреляет, именно поэтому эрланг переодически будет ставить подножку. От этого не уйти, поэтому нужно это учитывать.
> От этого не уйти, поэтому нужно это учитывать.
Как? Не юзать эрланг разве что.
P.S. Кстати воркеры переключают процессы каждые 2000 редукций. Не кажется ли тебе, что это все-таки вытесняющая многозадачность с точки зрения программиста на эрланге?
P.P.S. Да, сишный драйвер там вполне может заклинить, но он и написан не на эрланге.
Я старался.
Идиоматика раз тут:
Не нужны исключения там, где работает хвостовая рекурсия и return.
Опять же обсуждали это с коллегой на работе, вывели термин Pessimistic Programming - по умолчанию все функции считаются зафейлившимися, а успешный результат кидается исключением.
print s[k:]+s[:k]