это легче решить эту проблему, если вы думаете о 1
как пробельных и 0
и 2
как буквы в словах
import Data.List
words'::[Int]->[[Int]]
words' [] = [[]]
words' x =
case rest of
(1:after) -> first:words' after
_ -> [first]
where (first, rest) = break (== 1) x
fill::[Int]->[Int]
fill x = intercalate [1] $
map (\x -> replicate (length x) (if 2 `elem` x then 2 else 0)) $
words' x
Сначала разделите входящие данные на «слова», а затем просто сопоставьте слова всем 2
, если один из двух слов находится внутри слова.
Это будет работать с O (n) в размере ввода и может обрабатывать бесконечный поток ввода.
примеры
main = do
print $ fill [1,0,0,0]
print $ fill [1,0,0]
print $ fill [0,0,1,0,2,0,1]
print $ fill [0,1,0,0,2,0,0,1,0,1,2,0,1]
print $ fill [0,1,0,0,2,0,0,1,0,0,1,2,0,1]
print $ fill [0,2,1,0,1,2,0,0]
print $ fill [2,0,0,0,1,1,0,1]
print $ fill [0,1,0,0,0,0,0,1]
выход
[1,0,0,0]
[1,0,0]
[0,0,1,2,2,2,1]
[0,1,2,2,2,2,2,1,0,1,2,2,1]
[0,1,2,2,2,2,2,1,0,0,1,2,2,1]
[2,2,1,0,1,2,2,2]
[2,2,2,2,1,1,0,1]
[0,1,0,0,0,0,0,1]
Я не думаю, что это делает то, что предназначено в других случаях. Рассмотрим 'fill2 [0,0,1,0,2,0,1] == [2,2,1,0,2,2,1]', я считаю, что предполагаемый результат: '[0,0,1 , 2,2,2,1] '. –
@ ØrjanJohansen Не могли бы вы объяснить свою логику? На самом деле, я не уверен, что такое предполагаемый вывод. Я следовал описанию '2 должен заполнить список, насколько это возможно, если он не встречает 1', и я предположил, что« заполнение »начнется снова, когда встретится« 2 »на основе« Один пример: [0 , 2,1,0,1,2,0,0] Выход: [2,2,1,0,1,2,2,2] ' – tinlyx
Моя логика заключается в том, что первые два' 0' s не должно заполняться, так как между ними и ближайшим '2' существует' 1', а третий * должен быть заполнен, так как он находится рядом с '2'. В примерах ясно показано, что '2' должны заполнять как левое, так и правое. –