Построить конкретный список строк из строки в Haskell - PullRequest
0 голосов
/ 06 мая 2018

Я начинаю изучать haskell, и я застрял в проблеме.

Я читаю со стандартного ввода строку типа "1234" или "azer" и я хочу сделать список вроде ["123", "234", "341", "412"] или ["aze", "zer", "era", "raz"].

Я, вероятно, должен использовать map, но я не знаю, как поступить. Кто-то может помочь мне сделать это? Спасибо

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

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

Эта функция позволяет указать размер чанка, а также список.

cychnks n ls = [take n.drop x$ls2|(x,y) <-zip [0..] ls]
                where ls2 = ls++ls

cychnks 5 "abcde"

[ "ABCDE", "bcdea", "cdeab", "deabc", "eabcd"]

cychnks 3 "abcde"

[ "ABC", "BCD", "CDE", "DEA", "EAB"]

0 голосов
/ 06 мая 2018

Начнем со списка, [1..4]. Давайте повторим это для вечности:

>>> cycle [1..4]
[1,2,3,4,1,2,3,4,1,2,3,4,...

Теперь давайте возьмем его, скажем, второй индекс:

>>> take 4 $ drop (2-1) $ cycle [1..4]
[2,3,4,1]

Мы можем обобщить это, назвав функцию:

slice n = take 4 $ drop n $ cycle [1..4]

Чтобы получить все возможные циклические перестановки, нам нужно только выбрать n от 1 до 4:

>>> map slice [1..4]
[[2,3,4,1],[3,4,1,2],[4,1,2,3],[1,2,3,4]]

Теперь, как мы можем заставить эту работу работать с произвольной строкой? Давайте переопределим фрагмент, чтобы принять строку:

slice s n = take (length s) $ drop n $ cycle s

И поэтому наша функция циклических перестановок может быть определена следующим образом:

cyclicPerms s = map (slice s) [1..(length s)]

Тестирование:

>>> cyclicPerms "abcde"
["bcdea","cdeab","deabc","eabcd","abcde"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...